private Map getInvalidLocks()

in server/src/jetbrains/buildServer/sharedResources/server/ConfigurationInspector.java [142:184]


  private Map<Lock, String> getInvalidLocks(@NotNull final SProject project,
                                            @NotNull final Collection<SharedResourcesFeature> features) {
    final Map<Lock, String> result = new HashMap<>();
    final Map<String, Lock> locks = new HashMap<>();
    features.stream().map(SharedResourcesFeature::getLockedResources).forEach(locks::putAll);
    if (locks.isEmpty()) {
      return result;
    }
    final List<SProject> path = project.getProjectPath();
    final ListIterator<SProject> iterator = path.listIterator(path.size());
    while (iterator.hasPrevious() && !locks.isEmpty()) {
      SProject p = iterator.previous();
      // try to resolve against current project.
      // 1) if any of unresolved locks hit duplicates - add error
      Set<String> duplicates = new HashSet<>(getOwnDuplicateNames(p));
      if (!duplicates.isEmpty()) {
        // intersect
        duplicates.retainAll(locks.keySet());
        if (!duplicates.isEmpty()) {
          duplicates.forEach(dup -> {
            Lock lock = locks.remove(dup);
            if (lock != null) {
              result.put(lock, "Resource '" + lock.getName() + "' cannot be resolved due to duplicate name");
            }
          });
        }
      }
      if (locks.isEmpty()) {
        break;
      }
      // 2) resolve rest of the locks
      Map<String, String> resolutionResult = resolveStep(myResources.getOwnResources(p), locks);
      resolutionResult.forEach((name, res) -> {
        Lock lock = locks.remove(name);
        if (!OK.equals(res) && lock != null) { // we have error.
          result.put(lock, res);
        }
      });
    }
    // 3) after all iterations, only locks left are those without resources
    locks.values().forEach(lock -> result.put(lock, "Resource '" + lock.getName() + "' does not exist"));
    return result;
  }