예제 #1
0
  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();
    }
  }
예제 #2
0
  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;
  }