in server/src/jetbrains/buildServer/sharedResources/server/analysis/ResourceUsageAnalyzer.java [40:74]
public FindUsagesResult findUsages(@NotNull final SProject project,
@NotNull final Resource resource) { // <- here we look at a single resource.
// start at project, go down the tree, look for overrides
final Map<SBuildType, List<Lock>> buildTypes = new HashMap<>();
final Map<BuildTypeTemplate, List<Lock>> templates = new HashMap<>();
final Map<String, Map<String, Resource>> treeResources = new HashMap<>();
final List<BuildTypeSettings> lookupScope = getLookupScope(project);
for (BuildTypeSettings btSettings: lookupScope) {
Map<String, Resource> currentBtResources = treeResources.computeIfAbsent(btSettings.getProject().getProjectId(), myResources::getResourcesMap);
// check that resource available for buildType
if (currentBtResources.containsValue(resource)) {
// if it is -> search for usages
final Collection<SharedResourcesFeature> features = myFeatures.searchForFeatures(btSettings);
for (SharedResourcesFeature feature: features) {
// for each feature
// get locked resources
final Map<String, Lock> lockedResources = feature.getLockedResources();
// collect usages of current resource
if (!lockedResources.isEmpty() && lockedResources.containsKey(resource.getName())) { // <- for now assume single feature has _single_ lock on resource
List<Lock> storedUsages;
if (btSettings instanceof SBuildType) {
storedUsages = buildTypes.computeIfAbsent((SBuildType)btSettings, k -> new ArrayList<>());
} else {
storedUsages = templates.computeIfAbsent((BuildTypeTemplate)btSettings, k-> new ArrayList<>());
}
storedUsages.add(lockedResources.get(resource.getName()));
}
}
}
}
return new FindUsagesResult(buildTypes, templates);
}