public static List analyzeApplicationCompositions()

in src/main/java/com/netflix/imflibrary/app/IMPAnalyzer.java [428:521]


    public static List<ApplicationComposition> analyzeApplicationCompositions( File rootFile,
                                                  AssetMap assetMap,
                                                  PackingList packingList,
                                                  List<PayloadRecord> headerPartitionPayloadRecords,
                                                  IMFErrorLogger packingListErrorLogger,
                                                  Map<String, List<ErrorLogger.ErrorObject>> errorMap,
                                                  Map<UUID, PayloadRecord> trackFileIDToHeaderPartitionPayLoadMap) throws IOException {
        List<ApplicationComposition> applicationCompositionList = new ArrayList<>();
        
        for (PackingList.Asset asset : packingList.getAssets()) {
            if (asset.getType().equals(PackingList.Asset.TEXT_XML_TYPE)) {
                URI path = assetMap.getPath(asset.getUUID());
                if (path == null) {
                    packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR,
                            IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("Failed to get path for Asset with ID = %s", asset.getUUID().toString()));
                    continue;
                }
                File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString());

                if (!assetFile.exists()) {
                    packingListErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_PKL_ERROR,
                            IMFErrorLogger.IMFErrors.ErrorLevels.FATAL, String.format("Cannot find asset with path %s ID = %s", assetFile.getAbsolutePath(), asset.getUUID().toString()));
                    continue;
                }

                ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile);
                if (ApplicationComposition.isCompositionPlaylist(resourceByteRangeProvider)) {
                    IMFErrorLogger compositionErrorLogger = new IMFErrorLoggerImpl();
                    IMFErrorLogger compositionConformanceErrorLogger = new IMFErrorLoggerImpl();
                    PayloadRecord cplPayloadRecord = new PayloadRecord(resourceByteRangeProvider.getByteRangeAsBytes(0, resourceByteRangeProvider.getResourceSize() - 1),
                            PayloadRecord.PayloadAssetType.CompositionPlaylist, 0L, resourceByteRangeProvider.getResourceSize());

                    try {
                        ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(resourceByteRangeProvider, compositionErrorLogger);
                        if (applicationComposition == null) {
                            continue;
                        }
                        if (!applicationComposition.getUUID().equals(asset.getUUID())) {
                            // ST 2067-2:2016   7.3.1: The value of the Id element shall be extracted from the asset as specified in Table 19 for the CPL asset
                            compositionErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CPL_ERROR,
                                    IMFErrorLogger.IMFErrors.ErrorLevels.NON_FATAL, String.format("UUID %s in the CPL is not same as UUID %s of the CPL in the AssetMap", applicationComposition.getUUID().toString(), asset.getUUID().toString()));
                        }
                        applicationCompositionList.add(applicationComposition);
                        Set<UUID> trackFileIDsSet = trackFileIDToHeaderPartitionPayLoadMap
                                .keySet();

                        // ST 2067-203 MGASADMVirtualTrackParameterSet checks
                        List<ErrorLogger.ErrorObject> errors = IMFMGASADMConstraintsChecker.checkMGASADMVirtualTrackParameterSet(applicationComposition);
                        // Report MGASADMVirtualTrackParameterSet as both CPL and Virtual Track errors
                        compositionConformanceErrorLogger.addAllErrors(errors);
                        compositionErrorLogger.addAllErrors(errors);

                        try {
                            if (!isCompositionComplete(applicationComposition, trackFileIDsSet, compositionConformanceErrorLogger)) {
                                for (IMFEssenceComponentVirtualTrack virtualTrack : applicationComposition.getEssenceVirtualTracks()) {
                                    Set<UUID> trackFileIds = virtualTrack.getTrackResourceIds();
                                    List<PayloadRecord> trackHeaderPartitionPayloads = new ArrayList<>();
                                    for (UUID trackFileId : trackFileIds) {
                                        if (trackFileIDToHeaderPartitionPayLoadMap.containsKey(trackFileId))
                                            trackHeaderPartitionPayloads.add
                                                    (trackFileIDToHeaderPartitionPayLoadMap.get(trackFileId));
                                    }

                                    if (isVirtualTrackComplete(virtualTrack, trackFileIDsSet)) {
                                        compositionConformanceErrorLogger.addAllErrors(IMPValidator.isVirtualTrackInCPLConformed(cplPayloadRecord, virtualTrack, trackHeaderPartitionPayloads));
                                    } else if (trackHeaderPartitionPayloads.size() != 0) {
                                        compositionConformanceErrorLogger.addAllErrors(IMPValidator.conformVirtualTracksInCPL(cplPayloadRecord, trackHeaderPartitionPayloads, false));
                                    }
                                }
                            } else {
                                List<PayloadRecord> cplHeaderPartitionPayloads = applicationComposition.getEssenceVirtualTracks()
                                        .stream()
                                        .map(IMFEssenceComponentVirtualTrack::getTrackResourceIds)
                                        .flatMap(Set::stream)
                                        .map(e -> trackFileIDToHeaderPartitionPayLoadMap.get(e))
                                        .collect(Collectors.toList());
                                compositionConformanceErrorLogger.addAllErrors(IMPValidator.areAllVirtualTracksInCPLConformed(cplPayloadRecord, cplHeaderPartitionPayloads));
                            }
                        } catch (IMFException e) {
                            compositionConformanceErrorLogger.addAllErrors(e.getErrors());
                        } finally {
                            errorMap.put(assetFile.getName() + " " + CONFORMANCE_LOGGER_PREFIX, compositionConformanceErrorLogger.getErrors());
                        }
                    } catch (IMFException e) {
                        compositionErrorLogger.addAllErrors(e.getErrors());
                    } finally {
                        errorMap.put(assetFile.getName(), compositionErrorLogger.getErrors());
                    }
                }
            }
        }

        return applicationCompositionList;
    }