public SortResult sort( List<Library> libraries, File outFile, Condition<String> isExternal, boolean returnDefinitionMap) throws IOException { final THashMap<CharSequence, Definition> definitionMap = new THashMap<>(libraries.size() * 128, AbcTranscoder.HASHING_STRATEGY); final List<LibrarySetItem> unsortedItems = collectItems(libraries, definitionMap, isExternal); final AbcMerger abcMerger = new AbcMerger(definitionMap, outFile, definitionProcessor); try { final ArrayList<Library> resourceOrStyleHolders = new ArrayList<>(unsortedItems.size()); for (LibrarySetItem item : unsortedItems) { if (!item.hasDefinitions()) { if (item.library.hasResourceBundles()) { resourceOrStyleHolders.add(item.library); } continue; } if (item.library.hasResourceBundles() || item.library.isStyleOwner()) { resourceOrStyleHolders.add(item.library); } abcMerger.process(item.library); } if (definitionMapProcessor != null) { definitionMapProcessor.process(definitionMap, abcMerger); } final List<Decoder> decoders = new ArrayList<>(definitionMap.size()); final String[] singleStringArray = new String[1]; definitionMap.forEachValue( new TObjectProcedure<Definition>() { @Override public boolean execute(Definition definition) { if (definition.doAbcData != null && (definition.resolved == ResolvedState.YES || (definition.resolved == ResolvedState.UNKNOWN && processDependencies( decoders, definition, definitionMap, singleStringArray)))) { decoders.add(createDecoder(definition)); } return true; } }); abcMerger.end(decoders, new Encoder()); return new SortResult(returnDefinitionMap ? definitionMap : null, resourceOrStyleHolders); } finally { abcMerger.close(); } }
private static List<LibrarySetItem> collectItems( final List<Library> libraries, Map<CharSequence, Definition> definitionMap, Condition<String> isExternal) throws IOException { final List<LibrarySetItem> items = new ArrayList<>(libraries.size()); final CatalogXmlBuilder catalogXmlBuilder = new CatalogXmlBuilder(definitionMap, isExternal); for (Library library : libraries) { LibrarySetItem item = new LibrarySetItem(library); catalogXmlBuilder.setLibrary(item); IOUtil.parseXml(library.getCatalogFile(), catalogXmlBuilder); if (item.hasDefinitions() || library.hasResourceBundles()) { items.add(item); } } return items; }