use of org.osgi.service.repository.AndExpression in project bnd by bndtools.
the class BaseRepository method dispatch.
private void dispatch(RequirementExpression expression, Set<Resource> providers) {
if (expression instanceof IdentityExpression) {
Map<Requirement, Collection<Capability>> capabilities = findProviders(Collections.singleton(((IdentityExpression) expression).getRequirement()));
for (Collection<Capability> caps : capabilities.values()) {
for (Capability c : caps) providers.add(c.getResource());
}
} else if (expression instanceof OrExpression) {
for (RequirementExpression re : ((OrExpression) expression).getRequirementExpressions()) dispatch(re, providers);
} else if (expression instanceof AndExpression) {
List<RequirementExpression> requirementExpressions = ((AndExpression) expression).getRequirementExpressions();
if (requirementExpressions.isEmpty())
return;
if (requirementExpressions.size() == 1) {
dispatch(requirementExpressions.get(0), providers);
return;
}
Set<Resource> subset = new HashSet<>();
dispatch(requirementExpressions.get(0), subset);
for (int i = 1; i < requirementExpressions.size(); i++) {
for (Iterator<Resource> it = subset.iterator(); it.hasNext(); ) {
Resource resource = it.next();
RequirementExpression re = requirementExpressions.get(i);
if (!matches(re, resource)) {
it.remove();
if (subset.isEmpty())
return;
}
}
}
providers.addAll(subset);
} else if (expression instanceof NotExpression) {
Set<Resource> allSet = new HashSet<>();
dispatch(all, allSet);
RequirementExpression re = ((NotExpression) expression).getRequirementExpression();
for (Iterator<Resource> it = allSet.iterator(); it.hasNext(); ) {
Resource resource = it.next();
if (matches(re, resource)) {
it.remove();
if (allSet.isEmpty())
return;
}
}
providers.addAll(allSet);
} else
throw new UnsupportedOperationException("Unknown expression type " + expression.getClass());
}
Aggregations