public static List analyzePackageAndWrite()

in src/main/java/com/netflix/imflibrary/app/IMPFixer.java [190:285]


    public static List<ErrorLogger.ErrorObject> analyzePackageAndWrite(File rootFile, File targetFile, String versionCPLSchema, Boolean copyTrackfile, Boolean generateHash) throws
            IOException, ParserConfigurationException, SAXException, JAXBException, URISyntaxException, NoSuchAlgorithmException {
        IMFErrorLogger imfErrorLogger = new IMFErrorLoggerImpl();
        List<PayloadRecord> headerPartitionPayloadRecords = new ArrayList<>();
        BasicMapProfileV2MappedFileSet mapProfileV2MappedFileSet = new BasicMapProfileV2MappedFileSet(rootFile);
        AssetMap assetMap = new AssetMap(new File(mapProfileV2MappedFileSet.getAbsoluteAssetMapURI()));
        for (AssetMap.Asset packingListAsset : assetMap.getPackingListAssets()) {
            PackingList packingList = new PackingList(new File(rootFile, packingListAsset.getPath().toString()));
            Map<UUID, IMPBuilder.IMFTrackFileMetadata> imfTrackFileMetadataMap = new HashMap<>();

            for (PackingList.Asset asset : packingList.getAssets()) {
                File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString());
                ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile);

                if (asset.getType().equals(PackingList.Asset.APPLICATION_MXF_TYPE)) {
                    PayloadRecord headerPartitionPayloadRecord = getHeaderPartitionPayloadRecord(resourceByteRangeProvider, new IMFErrorLoggerImpl());
                    headerPartitionPayloadRecords.add(headerPartitionPayloadRecord);
                    byte[] bytes = headerPartitionPayloadRecord.getPayload();
                    byte[] hash = asset.getHash();
                    if( generateHash) {
                        hash = IMFUtils.generateSHA1Hash(resourceByteRangeProvider);
                    }
                    imfTrackFileMetadataMap.put(getTrackFileId(headerPartitionPayloadRecord),
                            new IMPBuilder.IMFTrackFileMetadata(bytes,
                                    hash,
                                    CompositionPlaylistBuilder_2016.defaultHashAlgorithm,
                                    assetFile.getName(),
                                    resourceByteRangeProvider.getResourceSize())
                    );
                    if(copyTrackfile) {
                        File outputFile = new File(targetFile.toString() + File.separator + assetFile.getName());
                        Files.copy(assetFile.toPath(), outputFile.toPath(), REPLACE_EXISTING);
                    }
                }
            }

            Map<UUID, PayloadRecord> trackFileIDToHeaderPartitionPayLoadMap =
                    getTrackFileIdToHeaderPartitionPayLoadMap(headerPartitionPayloadRecords);


            for (PackingList.Asset asset : packingList.getAssets()) {
                File assetFile = new File(rootFile, assetMap.getPath(asset.getUUID()).toString());
                ResourceByteRangeProvider resourceByteRangeProvider = new FileByteRangeProvider(assetFile);
                if (asset.getType().equals(PackingList.Asset.TEXT_XML_TYPE) && ApplicationComposition.isCompositionPlaylist(resourceByteRangeProvider)) {
                    ApplicationComposition applicationComposition = ApplicationCompositionFactory.getApplicationComposition(resourceByteRangeProvider, new IMFErrorLoggerImpl());
                    if(applicationComposition == null){
                        continue;
                    }
                    Set<UUID> trackFileIDsSet = trackFileIDToHeaderPartitionPayLoadMap.keySet();
                        if(versionCPLSchema.equals(""))
                        {
                            String coreConstraintsSchema = applicationComposition.getCoreConstraintsSchema();
                            if (coreConstraintsSchema.equals(CoreConstraints.NAMESPACE_IMF_2013)) {
                                versionCPLSchema = "2013";
                            }
                            else if (coreConstraintsSchema.equals(CoreConstraints.NAMESPACE_IMF_2016)
                                    || coreConstraintsSchema.equals(CoreConstraints.NAMESPACE_IMF_2020)) {
                                versionCPLSchema = "2016";
                            }
                            else {
                                imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR,
                                        IMFErrorLogger.IMFErrors.ErrorLevels.FATAL,
                                        String.format("Input package CoreConstraints Schema %s not supported", applicationComposition.getCoreConstraintsSchema()));
                            }
                        }

                        if(versionCPLSchema.equals("2016"))
                        {
                            imfErrorLogger.addAllErrors(IMPBuilder.buildIMP_2016("IMP",
                                    "Netflix",
                                    applicationComposition.getEssenceVirtualTracks(),
                                    applicationComposition.getEditRate(),
                                    "http://www.smpte-ra.org/schemas/2067-21/2016",
                                    imfTrackFileMetadataMap,
                                    targetFile));

                        }
                        else if(versionCPLSchema.equals("2013")) {
                            imfErrorLogger.addAllErrors(IMPBuilder.buildIMP_2013("IMP",
                                    "Netflix",
                                    applicationComposition.getEssenceVirtualTracks(),
                                    applicationComposition.getEditRate(),
                                    "http://www.smpte-ra.org/schemas/2067-21/2016",
                                    imfTrackFileMetadataMap,
                                    targetFile));
                        }
                        else {
                            imfErrorLogger.addError(IMFErrorLogger.IMFErrors.ErrorCodes.IMF_CORE_CONSTRAINTS_ERROR,
                                    IMFErrorLogger.IMFErrors.ErrorLevels.FATAL,
                                    String.format("Invalid CPL schema %s for output", versionCPLSchema.equals("2013")));
                        }
                    }
                }
            }
        return imfErrorLogger.getErrors();
    }