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);
}