public ItemHolder getPrefilteredItems()

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


  public ItemHolder<ArtifactTreeElement> getPrefilteredItems(@NotNull final Locator locator) {
    setLocatorDefaults(locator);

    Boolean includeHidden = locator.getSingleDimensionValueAsBoolean(HIDDEN_DIMENSION_NAME);
    if (isWithinHidden(myBaseElement)) {
      includeHidden = null;
    }

    List<String> rules = new ArrayList<>();
    final String filePatterns = locator.getSingleDimensionValue(DIMENSION_PATTERNS);
    if (filePatterns != null) {
      final String[] splittedPatterns = filePatterns.split(","); //might consider smarter splitting later
      if (splittedPatterns.length > 0) {
        rules.addAll(Arrays.asList(splittedPatterns));
      }
    } else {
      rules.add("+:**");
    }

    long childrenNestingLevel = 1;
    final String recursive = locator.getSingleDimensionValue(DIMENSION_RECURSIVE);
    if (recursive != null) {
      final Boolean parsedBoolean = LocatorUtil.getStrictBoolean(recursive);
      if (parsedBoolean != null) {
        if (parsedBoolean) {
          childrenNestingLevel = -1;
        } else {
          childrenNestingLevel = 1;
        }
      } else {
        //treat as nesting number
        try {
          childrenNestingLevel = Long.parseLong(recursive);
        } catch (NumberFormatException e) {
          throw new BadRequestException("Cannot parse value '" + recursive + "' for dimension '" + DIMENSION_RECURSIVE + "': should be boolean or nesting level number");
        }
      }
    }

    long archiveChildrenNestingLevel = 0;
    final String listArchives = locator.getSingleDimensionValue(ARCHIVES_DIMENSION_NAME);
    if (listArchives != null) {
      final Boolean parsedBoolean = LocatorUtil.getStrictBoolean(listArchives);
      if (parsedBoolean != null) {
        if (parsedBoolean) {
          archiveChildrenNestingLevel = 1;
        } else {
          archiveChildrenNestingLevel = 0;
        }
      } else {
        //treat as nesting number
        try {
          archiveChildrenNestingLevel = Long.parseLong(listArchives);
        } catch (NumberFormatException e) {
          throw new BadRequestException("Cannot parse value '" + listArchives + "' for dimension '" + ARCHIVES_DIMENSION_NAME + "': should be boolean or nesting level number");
        }
      }
    }

    Boolean includeDirectories = locator.getSingleDimensionValueAsBoolean(DIRECTORY_DIMENSION_NAME);

    final List<ArtifactTreeElement> result = new ArrayList<>();
    AntPatternTreeMatcher.ScanOption[] options = {};
    if (includeDirectories != null && !includeDirectories) {
      options = new AntPatternTreeMatcher.ScanOption[]{AntPatternTreeMatcher.ScanOption.LEAFS_ONLY};  // does not seem to have any effect, see TW-41662
    }

    final Node rootNode = new Node(myBaseElement, childrenNestingLevel, archiveChildrenNestingLevel, includeHidden, true);
    final Collection<Node> rawResult = AntPatternTreeMatcher.scan(rootNode, rules, options);
    final Boolean finalIncludeDirectories = includeDirectories;
    result.addAll(CollectionsUtil.filterAndConvertCollection(rawResult, Node::getElement, data -> {
      if (rootNode.equals(data)) {
        return false; //TeamCity API issue: should support not returning the first node in API
      }
      //noinspection RedundantIfStatement
      if (!FilterUtil.isIncludedByBooleanFilter(finalIncludeDirectories, !data.getElement().isLeaf())) {
        return false;
      }
      return true;
    }));

    try {
      Collections.sort(result, ARTIFACT_COMPARATOR);
    } catch (Exception e) {
      LOG.error("Error sorting results: " + result.stream().map(Element::getFullName).collect(Collectors.joining(", ", "{", "}")), e);
    }
    return ItemHolder.of(result);
  }