/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.aries.subsystem.core.internal;
import java.util.Collection;
import java.util.HashSet;
import org.eclipse.equinox.region.Region;
import org.eclipse.equinox.region.RegionDigraphVisitor;
import org.eclipse.equinox.region.RegionFilter;
import org.osgi.framework.wiring.BundleCapability;
import org.osgi.namespace.service.ServiceNamespace;
import org.osgi.resource.Capability;
public class SharingPolicyValidator {
private static class Visitor implements RegionDigraphVisitor {
private final Capability capability;
private final Collection<Region> visited;
public Visitor(Capability capability) {
this.capability = capability;
visited = new HashSet<Region>();
}
public boolean contains(Region region) {
return visited.contains(region);
}
@Override
public void postEdgeTraverse(RegionFilter filter) {
// noop
}
@Override
public boolean preEdgeTraverse(RegionFilter filter) {
if (filter
.isAllowed(
// The osgi.service namespace must be translated into the
// org.eclipse.equinox.allow.service namespace in order to validate
// service sharing policies.
ServiceNamespace.SERVICE_NAMESPACE
.equals(capability.getNamespace()) ? RegionFilter.VISIBLE_SERVICE_NAMESPACE
: capability.getNamespace(), capability
.getAttributes()))
return true;
if (capability instanceof BundleCapability)
return filter.isAllowed(((BundleCapability) capability).getRevision());
return false;
}
@Override
public boolean visit(Region region) {
visited.add(region);
return true;
}
}
private final Region from;
private final Region to;
public SharingPolicyValidator(Region from, Region to) {
this.from = from;
this.to = to;
}
public boolean isValid(Capability capability) {
Visitor visitor = new Visitor(capability);
to.visitSubgraph(visitor);
return visitor.contains(from);
}
}