public ItemHolder getPrefilteredItems()

in rest-api/src/jetbrains/buildServer/server/rest/data/finder/impl/VcsRootInstanceFinder.java [346:435]


  public ItemHolder<VcsRootInstance> getPrefilteredItems(@NotNull Locator locator) {
    setLocatorDefaults(locator);
    Boolean versionedSettingsUsagesOnly = locator.getSingleDimensionValueAsBoolean(HAS_VERSIONED_SETTINGS_ONLY);  // should check it not in Filter as it considers current scope

    final String build = locator.getSingleDimensionValue(BUILD);
    if (build != null) {
      Stream<VcsRootInstance> vcsRootInstancesByBuilds = getVcsRootInstancesByBuilds(build);
      if (BooleanUtils.isTrue(versionedSettingsUsagesOnly)) {
        vcsRootInstancesByBuilds = vcsRootInstancesByBuilds.filter(vcsRootInstance -> vcsRootInstance.equals(myVersionedSettingsManager.getVersionedSettingsVcsRootInstance(vcsRootInstance.getParent().getProject())));
      } else if (BooleanUtils.isFalse(versionedSettingsUsagesOnly)) {
        vcsRootInstancesByBuilds = vcsRootInstancesByBuilds.filter(vcsRootInstance -> !vcsRootInstance.equals(myVersionedSettingsManager.getVersionedSettingsVcsRootInstance(vcsRootInstance.getParent().getProject())));
      }
      return ItemHolder.of(vcsRootInstancesByBuilds);
    }

    final String vcsRootLocator = locator.getSingleDimensionValue(VCS_ROOT_DIMENSION);
    if (vcsRootLocator != null) {
      final List<SVcsRoot> vcsRoots = myVcsRootFinder.getItemsNotEmpty(vcsRootLocator).getEntries();
      final Set<VcsRootInstance> result = new TreeSet<>(VCS_ROOT_INSTANCE_COMPARATOR);

      final String buildTypesLocator = locator.getSingleDimensionValue(BUILD_TYPE);
      Predicate<SBuildType> filter;
      Set<SProject> projects;
      if (buildTypesLocator != null) {
        if (versionedSettingsUsagesOnly == null || !versionedSettingsUsagesOnly) {  //is used below in the same condition
          ItemFilter<BuildTypeOrTemplate> buildTypeFilter = myBuildTypeFinder.getFilter(buildTypesLocator);
          filter = sBuildType -> buildTypeFilter.isIncluded(new BuildTypeOrTemplate(sBuildType));
        } else {
          filter = (a) -> true;
        }

        if (versionedSettingsUsagesOnly == null || versionedSettingsUsagesOnly) { //is used below in the same condition
          projects = myBuildTypeFinder.getItemsNotEmpty(buildTypesLocator).getEntries().stream().map(BuildTypeOrTemplate::getProject).collect(Collectors.toSet());
        } else {
          projects = null;
        }
      } else {
        filter = (a) -> true;
        projects = null;
      }

      filterOutUnrelatedWithoutParameterResolution(locator, vcsRoots);

      for (SVcsRoot vcsRoot : vcsRoots) {
        if (!canViewSettingsFor(vcsRoot)) {
          continue;
        }

        if (versionedSettingsUsagesOnly == null || !versionedSettingsUsagesOnly) {
          vcsRoot.getUsagesInConfigurations().stream()
                 .filter(filter)
                 .map(buildType -> buildType.getVcsRootInstanceForParent(vcsRoot))
                 .forEach(result::add);
        }

        if (versionedSettingsUsagesOnly == null || versionedSettingsUsagesOnly) {
          Set<SProject> projectsBySettingsRoot = myVersionedSettingsManager.getProjectsBySettingsRoot(vcsRoot);
          result.addAll(getSettingsRootInstances(projects == null ? projectsBySettingsRoot : CollectionsUtil.intersect(projectsBySettingsRoot, projects)));
        }
      }
      return ItemHolder.of(result);
    }

    final String buildTypesLocator = locator.getSingleDimensionValue(BUILD_TYPE);
    if (buildTypesLocator != null) {
      return ItemHolder.of(getInstances(buildTypesLocator, versionedSettingsUsagesOnly));
    }

    final String projectLocator = locator.getSingleDimensionValue(AFFECTED_PROJECT); //todo: support multiple here for "from all not archived projects" case
    if (projectLocator != null) {
      return ItemHolder.of(getVcsRootInstancesUnderProject(myProjectFinder.getItem(projectLocator), versionedSettingsUsagesOnly));
    }

    //todo: (TeamCity) open API is there a better way to do this?
    //if reworked, can use checkPermission(Permission.VIEW_BUILD_CONFIGURATION_SETTINGS, item);
    // when implemented, can also add to jetbrains.buildServer.usageStatistics.impl.providers.StaticServerUsageStatisticsProvider.publishNumberOfVcsRoots()
    final Set<VcsRootInstance> result = new TreeSet<>(VCS_ROOT_INSTANCE_COMPARATOR);

    if (versionedSettingsUsagesOnly == null || !versionedSettingsUsagesOnly) {
      for (SBuildType buildType : myProjectManager.getAllBuildTypes()) {
        if (myPermissionChecker.isPermissionGranted(Permission.VIEW_BUILD_CONFIGURATION_SETTINGS, buildType.getProjectId())) {
          result.addAll(buildType.getVcsRootInstances());
        }
      }
    }
    if (versionedSettingsUsagesOnly == null || versionedSettingsUsagesOnly) {
      result.addAll(getSettingsRootInstances(myProjectManager.getProjects()));
    }
    return ItemHolder.of(result);
  }