Пример #1
0
  /**
   * This method was simply:
   *
   * <p>for(String line:StringUtils.iterLines(fileContents)){ line = line.trim(); List<String> split
   * = StringUtils.split(line, '|'); handleLineParts(modulesManager, intToString, split); }
   *
   * <p>and was changed to be faster (as this was one of the slow things in startup).
   */
  /*default*/ @SuppressWarnings("rawtypes")
  static void handleFileContents(
      ModulesManager modulesManager, String fileContents, HashMap<Integer, String> intToString) {
    String string = fileContents;
    int len = string.length();

    final ArrayList<ModulesKey> lst = new ArrayList<ModulesKey>();

    char c;
    int start = 0;
    int i = 0;

    String[] parts = new String[4];
    int partsFound = 0;

    for (; i < len; i++) {
      c = string.charAt(i);

      if (c == '\r') {
        String trimmed = string.substring(start, i).trim();
        if (trimmed.length() > 0) {
          parts[partsFound] = trimmed;
          partsFound++;
        }
        handleLineParts(modulesManager, intToString, parts, partsFound, lst);
        partsFound = 0;

        if (i < len - 1 && string.charAt(i + 1) == '\n') {
          i++;
        }
        start = i + 1;

      } else if (c == '\n') {
        String trimmed = string.substring(start, i).trim();
        if (trimmed.length() > 0) {
          parts[partsFound] = trimmed;
          partsFound++;
        }
        handleLineParts(modulesManager, intToString, parts, partsFound, lst);
        partsFound = 0;

        start = i + 1;

      } else if (c == '|') {
        String trimmed = string.substring(start, i).trim();
        if (trimmed.length() > 0) {
          parts[partsFound] = trimmed;
          partsFound++;
        }
        start = i + 1;
      }
    }

    if (start < len && start != i) {
      String trimmed = string.substring(start, i).trim();
      if (trimmed.length() > 0) {
        parts[partsFound] = trimmed;
        partsFound++;
      }
      handleLineParts(modulesManager, intToString, parts, partsFound, lst);
    }

    try {
      final int size = lst.size();
      // As we saved in sorted order, we can build in sorted order too (which is MUCH faster than
      // adding items one
      // by one).
      modulesManager.modulesKeys.buildFromSorted(
          size,
          new Iterator() {

            private int i = 0;

            public boolean hasNext() {
              return i < size;
            }

            public Object next() {
              final ModulesKey next = lst.get(i);
              i++;
              return new Map.Entry() {

                public Object getKey() {
                  return next;
                }

                public Object getValue() {
                  return next;
                }

                public Object setValue(Object value) {
                  throw new UnsupportedOperationException();
                }
              };
            }

            public void remove() {
              throw new UnsupportedOperationException();
            }
          },
          null,
          null);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }