use of org.osgi.resource.Requirement in project bnd by bndtools.
the class AugmentRepository method findProviders.
@Override
public Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements) {
Map<Requirement, Collection<Capability>> fromRepos = repository.findProviders(requirements);
for (Requirement requirement : requirements) {
List<Capability> provided = new ArrayList<>();
boolean replaced = false;
for (Capability originalCapability : fromRepos.get(requirement)) {
if (isValid(originalCapability)) {
Capability wrappedCapability = wrapped.get(originalCapability);
if (wrappedCapability != null) {
provided.add(wrappedCapability);
replaced = true;
} else
provided.add(originalCapability);
}
}
Collection<Capability> additional = ResourceUtils.findProviders(requirement, augmentedCapabilities);
replaced |= provided.addAll(additional);
if (replaced)
fromRepos.put(requirement, provided);
}
return fromRepos;
}
use of org.osgi.resource.Requirement 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());
}
use of org.osgi.resource.Requirement in project bnd by bndtools.
the class BridgeRepository method index.
private void index() throws Exception {
Map<Requirement, Collection<Capability>> all = repository.findProviders(Collections.singleton(allRq));
for (Capability capability : all.get(allRq)) {
Resource r = capability.getResource();
index(r);
}
}
use of org.osgi.resource.Requirement in project bnd by bndtools.
the class ResourcesRepository method findProviders.
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements) {
MultiMap<Requirement, Capability> result = new MultiMap<>();
for (Requirement requirement : requirements) {
List<Capability> capabilities = findProvider(requirement);
result.put(requirement, capabilities);
}
return (Map) result;
}
use of org.osgi.resource.Requirement in project bnd by bndtools.
the class XMLResourceGenerator method repository.
public XMLResourceGenerator repository(Repository repository) throws Exception {
Requirement wildcard = ResourceUtils.createWildcardRequirement();
Map<Requirement, Collection<Capability>> findProviders = repository.findProviders(Collections.singleton(wildcard));
for (Capability capability : findProviders.get(wildcard)) {
resource(capability.getResource());
}
return this;
}
Aggregations