in rest-api/src/jetbrains/buildServer/server/rest/data/finder/impl/AgentFinder.java [169:278]
public ItemFilter<SBuildAgent> getFilter(@NotNull final Locator locator) {
final MultiCheckerFilter<SBuildAgent> result = new MultiCheckerFilter<SBuildAgent>();
Long id = locator.getSingleDimensionValueAsLong(DIMENSION_ID);
if (id != null) {
result.add(item -> id == item.getId());
}
String name = locator.getSingleDimensionValue(NAME);
if (name != null) {
result.add(item -> name.equals(item.getName()));
}
final Boolean authorizedDimension = locator.getSingleDimensionValueAsBoolean(AUTHORIZED);
if (authorizedDimension != null) {
result.add(item -> FilterUtil.isIncludedByBooleanFilter(authorizedDimension, item.isAuthorized()));
}
final Boolean enabledDimension = locator.getSingleDimensionValueAsBoolean(ENABLED);
if (enabledDimension != null) {
result.add(item -> FilterUtil.isIncludedByBooleanFilter(enabledDimension, item.isEnabled()));
}
final Boolean connectedDimension = locator.getSingleDimensionValueAsBoolean(CONNECTED);
if (connectedDimension != null) {
result.add(item -> FilterUtil.isIncludedByBooleanFilter(connectedDimension, item.isRegistered()));
}
final String poolDimension = locator.getSingleDimensionValue(POOL); //see also AgentPoolsFinder.getPoolAgents()
if (poolDimension != null) {
AgentPoolFinder agentPoolFinder = myServiceLocator.getSingletonService(AgentPoolFinder.class);
final AgentPool agentPool = agentPoolFinder.getItem(poolDimension); //get id here to support not existing pools?
result.add(item -> ((BuildAgentEx)item).getAgentType().getAgentPoolId() == agentPool.getAgentPoolId()); //TeamCity API issue: cast
}
if (locator.isUnused(BUILD)) {
final String buildDimension = locator.getSingleDimensionValue(BUILD);
if (buildDimension != null) {
Set<SBuildAgent> agents = getBuildRelatedAgents(buildDimension);
result.add(item -> agents.contains(item));
}
}
if (locator.isUnused(AGENT_TYPE_ID)) {
final String agentTypeLocator = locator.getSingleDimensionValue(AGENT_TYPE_ID);
if (agentTypeLocator != null) {
int agentTypeId = getAgentType(agentTypeLocator, myServiceLocator.getSingletonService(AgentTypeFinder.class)).getAgentTypeId();
result.add(item -> agentTypeId == item.getAgentTypeId());
}
}
final String ipDimension = locator.getSingleDimensionValue(IP);
if (ipDimension != null) {
result.add(item -> ipDimension.equals(Agent.getFieldValue(item, "ip", myServiceLocator))); //name of the field, not locator dimension
}
final String protocolDimension = locator.getSingleDimensionValue(PROTOCOL);
if (protocolDimension != null) {
result.add(item -> protocolDimension.equals(Agent.getFieldValue(item, "protocol", myServiceLocator))); //name of the field, not locator dimension
}
final String parameterDimension = locator.getSingleDimensionValue(PARAMETER);
if (parameterDimension != null) {
final ParameterCondition parameterCondition = ParameterCondition.create(parameterDimension);
result.add(item -> parameterCondition.matches(new MapParametersProviderImpl(item.getAvailableParameters())));
}
if (locator.isUnused(CLOUD_INSTANCE)) {
final String cloudInstanceLocator = locator.getSingleDimensionValue(CLOUD_INSTANCE);
if (cloudInstanceLocator != null) {
List<CloudInstance> instances = myServiceLocator.getSingletonService(CloudInstanceFinder.class)
.getItems(cloudInstanceLocator).getEntries().stream().map(CloudInstanceData::getInstance).collect(Collectors.toList());
result.add(a -> instances.stream().anyMatch(i -> i.containsAgent(a)));
/* CloudInstance might not have equals/hashcode, if it does, it would be better to use in a set like below
Set<CloudInstance> instances = myServiceLocator.getSingletonService(CloudInstanceFinder.class).getItems(cloudInstanceLocator).myEntries.stream().map(i -> i.getInstance()).collect(
Collectors.toSet());
CloudManager cloudManager = myServiceLocator.getSingletonService(CloudManager.class);
result.add(a -> Util.resolveNull(cloudManager.findInstanceByAgent(a), pair -> instances.contains(pair.getSecond()), false));
*/
}
}
if (locator.isUnused(COMPATIBLE)) {
final String compatible = locator.getSingleDimensionValue(COMPATIBLE); //compatible with at least with one of the buildTypes
if (compatible != null) {
final CompatibleLocatorParseResult compatibleData = getBuildTypesFromCompatibleDimension(compatible);
if (compatibleData.buildTypes != null) {
result.add(item -> isCompatibleWithAny(item, compatibleData.buildTypes));
} else {
assert compatibleData.buildPromotions != null;
result.add(item -> isCompatibleWithAnyBuild(item, compatibleData.buildPromotions));
}
}
}
final String incompatible = locator.getSingleDimensionValue(INCOMPATIBLE); //incompatible with at least with one of the buildTypes
if (incompatible != null) {
final CompatibleLocatorParseResult compatibleData = getBuildTypesFromCompatibleDimension(incompatible);
if (compatibleData.buildTypes != null) {
result.add(item -> !isCompatibleWithAll(item, compatibleData.buildTypes));
} else {
result.add(item -> {
assert compatibleData.buildPromotions != null;
return !isCompatibleWithAllBuild(item, compatibleData.buildPromotions);
});
}
}
return result.toItemFilter();
}