in subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/CapabilitySet.java [191:266]
private Set<Capability> match(Set<Capability> caps, final SimpleFilter sf)
{
Set<Capability> matches = Collections.newSetFromMap(new ConcurrentHashMap<Capability, Boolean>());
if (sf.getOperation() == SimpleFilter.MATCH_ALL)
{
matches.addAll(caps);
}
else if (sf.getOperation() == SimpleFilter.AND)
{
// Evaluate each subfilter against the remaining capabilities.
// For AND we calculate the intersection of each subfilter.
// We can short-circuit the AND operation if there are no
// remaining capabilities.
final List<SimpleFilter> sfs = (List<SimpleFilter>) sf.getValue();
for (int i = 0; (caps.size() > 0) && (i < sfs.size()); i++)
{
matches = match(caps, sfs.get(i));
caps = matches;
}
}
else if (sf.getOperation() == SimpleFilter.OR)
{
// Evaluate each subfilter against the remaining capabilities.
// For OR we calculate the union of each subfilter.
List<SimpleFilter> sfs = (List<SimpleFilter>) sf.getValue();
for (int i = 0; i < sfs.size(); i++)
{
matches.addAll(match(caps, sfs.get(i)));
}
}
else if (sf.getOperation() == SimpleFilter.NOT)
{
// Evaluate each subfilter against the remaining capabilities.
// For OR we calculate the union of each subfilter.
matches.addAll(caps);
List<SimpleFilter> sfs = (List<SimpleFilter>) sf.getValue();
for (int i = 0; i < sfs.size(); i++)
{
matches.removeAll(match(caps, sfs.get(i)));
}
}
else
{
Map<Object, Set<Capability>> index = m_indices.get(sf.getName());
if ((sf.getOperation() == SimpleFilter.EQ) && (index != null))
{
Set<Capability> existingCaps = index.get(sf.getValue());
if (existingCaps != null)
{
matches.addAll(existingCaps);
if (caps != m_capSet)
{
matches.retainAll(caps);
}
}
}
else
{
for (Iterator<Capability> it = caps.iterator(); it.hasNext(); )
{
Capability cap = it.next();
Object lhs = cap.getAttributes().get(sf.getName());
if (lhs != null)
{
if (compare(lhs, sf.getValue(), sf.getOperation()))
{
matches.add(cap);
}
}
}
}
}
return matches;
}