public int compare()

in rest-api/src/jetbrains/buildServer/server/rest/data/finder/impl/BuildArtifactsFinder.java [633:697]


    public int compare(@NotNull String s1, final boolean isFile1, @NotNull String s2, final boolean isFile2) {
      int n1 = s1.length();
      int n2 = s2.length();
      int min = Math.min(n1, n2);
      int characterComparisonResult = n1 - n2;
      boolean shouldStopOnFirstDiff = false;
      boolean shouldStopOnFirstDiffSet = false;
      int i;
      for (i = 0; i < min; i++) {
        char c1 = s1.charAt(i);
        char c2 = s2.charAt(i);
        if (c1 != c2) {
          if (PS == c1) return -1;
          if (PS == c2) return 1;
          //logic like in standard String.CASE_INSENSITIVE_ORDER
          c1 = Character.toUpperCase(c1);
          c2 = Character.toUpperCase(c2);
          if (c1 != c2) {
            c1 = Character.toLowerCase(c1);
            c2 = Character.toLowerCase(c2);
            if (c1 != c2) {
              characterComparisonResult = c1 - c2;
              break;
            }
          }
          // same char in different case
          if (!shouldStopOnFirstDiffSet) {
            shouldStopOnFirstDiff = !isFile1 || !isFile2 || s1.indexOf(PS, i) != -1 || s2.indexOf(PS, i) != -1;
            shouldStopOnFirstDiffSet = true;
          }
          characterComparisonResult = s2.charAt(i) - s1.charAt(i); //order is reversed to make lowercase characters appear before upper case ones
          if (shouldStopOnFirstDiff) {
            break;
          }
        }
      }

      if (i == min && n1 == n2 && characterComparisonResult != 0) { // characterComparisonResult holds firstDiff
        return characterComparisonResult; //define order for non-directories different only in case
      }

      //should go back and forth to scan a full digit
      if (i < min && (Character.isDigit(s1.charAt(i)) || Character.isDigit(s2.charAt(i)))) {
        long number1 = extractNumber(s1, i);
        long number2 = extractNumber(s2, i);
        if (number1 != -1 && number2 != -1 && number1 != number2) {
          characterComparisonResult = number1 - number2 < 0 ? -1 : 1;
        }
      }

      //noinspection SimplifiableConditionalExpression
      boolean containsNested1 = i < n1 ? s1.indexOf(PS, i) != -1 : false;
      //noinspection SimplifiableConditionalExpression
      boolean containsNested2 = i < n2 ? s2.indexOf(PS, i) != -1 : false;
      if (containsNested1 != containsNested2) {
        if (!containsNested1) return isFile1 ? 1 : characterComparisonResult;
        return isFile2 ? -1 : characterComparisonResult;
      } else {
        if (!containsNested1 && isFile1 != isFile2) {
          return isFile1 ? 1 : -1;
        } else {
          return characterComparisonResult;
        }
      }
    }