in src/main/java/com/netflix/imflibrary/st2067_2/AbstractApplicationComposition.java [966:1050]
private List<IMFErrorLogger.ErrorObject> conformEssenceDescriptors(Map<UUID, List<DOMNodeObjectModel>> essenceDescriptorsMap, Map<UUID, DOMNodeObjectModel> eDLMap) {
IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
/**
* An exhaustive compare of the eDLMap and essenceDescriptorsMap is required to ensure that the essence descriptors
* in the EssenceDescriptorList and the EssenceDescriptors in the physical essence files corresponding to the
* same source encoding element as indicated in the TrackFileResource and EDL are a good match.
*/
/**
* The Maps passed in have the DOMObjectModel for every EssenceDescriptor in the EssenceDescriptorList in the CPL and
* the essence descriptor in each of the essences referenced from every track file resource within each virtual track.
*/
/**
* The following check ensures that we do not have a Track Resource that does not have a corresponding EssenceDescriptor element in the CPL's EDL
*/
Iterator<Map.Entry<UUID, List<DOMNodeObjectModel>>> essenceDescriptorsMapIterator = essenceDescriptorsMap.entrySet().iterator();
while (essenceDescriptorsMapIterator.hasNext()) {
UUID sourceEncodingElement = essenceDescriptorsMapIterator.next().getKey();
if (!eDLMap.keySet().contains(sourceEncodingElement)) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("EssenceDescriptor with Source Encoding " +
"Element %s in a track does not have a corresponding entry in the CPL's EDL.", sourceEncodingElement.toString()));
}
}
Set<String> ignoreSet = new HashSet<String>();
//ignoreSet.add("InstanceUID");
//ignoreSet.add("InstanceID");
//ignoreSet.add("EssenceLength");
//ignoreSet.add("AlternativeCenterCuts");
//ignoreSet.add("GroupOfSoundfieldGroupsLinkID");
// PHDRMetadataTrackSubDescriptor is not present in SMPTE registries and cannot be serialized
ignoreSet.add("PHDRMetadataTrackSubDescriptor");
/**
* The following check ensures that we have atleast one EssenceDescriptor in a TrackFile that equals the corresponding EssenceDescriptor element in the CPL's EDL
*/
Iterator<Map.Entry<UUID, List<DOMNodeObjectModel>>> iterator = essenceDescriptorsMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, List<DOMNodeObjectModel>> entry = (Map.Entry<UUID, List<DOMNodeObjectModel>>) iterator.next();
List<DOMNodeObjectModel> domNodeObjectModels = entry.getValue();
DOMNodeObjectModel referenceDOMNodeObjectModel = eDLMap.get(entry.getKey());
if (referenceDOMNodeObjectModel == null) {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("EssenceDescriptor with Source Encoding " +
"Element %s in a track does not have a corresponding entry in the CPL's Essence Descriptor List.", entry.getKey().toString()));
}
else {
referenceDOMNodeObjectModel = DOMNodeObjectModel.createDOMNodeObjectModelIgnoreSet(eDLMap.get(entry.getKey()), ignoreSet);
boolean intermediateResult = false;
List<DOMNodeObjectModel> domNodeObjectModelsIgnoreSet = new ArrayList<>();
for (DOMNodeObjectModel domNodeObjectModel : domNodeObjectModels) {
domNodeObjectModel = DOMNodeObjectModel.createDOMNodeObjectModelIgnoreSet(domNodeObjectModel, ignoreSet);
domNodeObjectModelsIgnoreSet.add(domNodeObjectModel);
intermediateResult |= referenceDOMNodeObjectModel.equals(domNodeObjectModel);
}
if (!intermediateResult) {
DOMNodeObjectModel matchingDOMNodeObjectModel = DOMNodeObjectModel.getMatchingDOMNodeObjectModel(referenceDOMNodeObjectModel, domNodeObjectModelsIgnoreSet);
imfErrorLogger.addAllErrors(DOMNodeObjectModel.getNamespaceURIMismatchErrors(referenceDOMNodeObjectModel, matchingDOMNodeObjectModel));
String domNodeName = referenceDOMNodeObjectModel.getLocalName();
List<DOMNodeObjectModel> domNodeObjectModelList = domNodeObjectModelsIgnoreSet.stream().filter( e -> e.getLocalName().equals(domNodeName)).collect(Collectors.toList());
if(domNodeObjectModelList.size() != 0)
{
DOMNodeObjectModel diffCPLEssenceDescriptor = referenceDOMNodeObjectModel.removeNodes(domNodeObjectModelList.get(0));
DOMNodeObjectModel diffTrackFileEssenceDescriptor = domNodeObjectModelList.get(0).removeNodes(referenceDOMNodeObjectModel);
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("EssenceDescriptor with Id %s in the CPL's " +
"EssenceDescriptorList doesn't match any EssenceDescriptors within the IMFTrackFile resource that references it, " +
"%n%n EssenceDescriptor in CPL EssenceDescriptorList with mismatching fields is as follows %n%s, %n%nEssenceDescriptor found in the " +
"TrackFile resource with mismatching fields is as follows %n%s%n%n",
entry.getKey().toString(), diffCPLEssenceDescriptor.toString(), diffTrackFileEssenceDescriptor.toString()));
}
else {
imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR, IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("EssenceDescriptor with Id %s in the CPL's " +
"EssenceDescriptorList doesn't match any EssenceDescriptors within the IMFTrackFile resource that references it, " +
"%n%n EssenceDescriptor in CPL EssenceDescriptorList is as follows %n%s, %n%nEssenceDescriptors found in the TrackFile resource %n%s%n%n",
entry.getKey().toString(), referenceDOMNodeObjectModel.toString(), Utilities.serializeObjectCollectionToString(domNodeObjectModelsIgnoreSet)));
}
}
}
}
return imfErrorLogger.getErrors();
}