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