use of org.osgi.resource.Wire in project karaf by apache.
the class FeaturesDependenciesTest method dumpWiring.
private void dumpWiring(SubsystemResolver resolver) {
System.out.println("Wiring");
Map<Resource, List<Wire>> wiring = resolver.getWiring();
List<Resource> resources = new ArrayList<>(wiring.keySet());
resources.sort(Comparator.comparing(this::getName));
for (Resource resource : resources) {
System.out.println(" " + getName(resource));
for (Wire wire : wiring.get(resource)) {
System.out.println(" " + wire);
}
}
}
use of org.osgi.resource.Wire in project bnd by bndtools.
the class WireImpl method equals.
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj instanceof Wire) {
Wire w = (Wire) obj;
if (capability.equals(w.getCapability()) && requirement.equals(w.getRequirement())) {
Resource provider = getProvider();
Resource requirer = getRequirer();
return (provider == null ? w.getProvider() == null : provider.equals(w.getProvider())) && (requirer == null ? w.getRequirer() == null : requirer.equals(w.getRequirer()));
}
}
return false;
}
use of org.osgi.resource.Wire in project bnd by bndtools.
the class ResolveProcessTest method checkOptionalResource.
private void checkOptionalResource(ResolveProcess process, Resource resource, String bsn, Version version, String packageName, String... morePackages) {
Collection<Wire> reasons;
Map<String, Object> idAttrs;
idAttrs = resource.getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes();
assertEquals(bsn, idAttrs.get(IDENTITY_NAMESPACE));
assertEquals(version, idAttrs.get(CAPABILITY_VERSION_ATTRIBUTE));
reasons = process.getOptionalReasons(resource);
assertEquals(1 + morePackages.length, reasons.size());
Iterator<Wire> iterator = reasons.iterator();
Wire wire = iterator.next();
assertEquals("org.apache.felix.scr", wire.getRequirer().getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes().get(IDENTITY_NAMESPACE));
assertTrue(wire.getRequirement().toString(), wire.getRequirement().getDirectives().get(REQUIREMENT_FILTER_DIRECTIVE).contains(packageName));
for (String pkg : morePackages) {
wire = iterator.next();
assertEquals("org.apache.felix.scr", wire.getRequirer().getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes().get(IDENTITY_NAMESPACE));
assertTrue(wire.getRequirement().toString(), wire.getRequirement().getDirectives().get(REQUIREMENT_FILTER_DIRECTIVE).contains(pkg));
}
}
use of org.osgi.resource.Wire in project bnd by bndtools.
the class ResolveProcess method tidyUpOptional.
private static Map<Resource, List<Wire>> tidyUpOptional(Map<Resource, List<Wire>> required, Map<Resource, List<Wire>> discoveredOptional, LogService log) {
Map<Resource, List<Wire>> toReturn = new HashMap<Resource, List<Wire>>();
Set<Capability> requiredIdentities = new HashSet<Capability>();
for (Resource r : required.keySet()) {
Capability normalisedIdentity = toPureIdentity(r, log);
if (normalisedIdentity != null) {
requiredIdentities.add(normalisedIdentity);
}
}
Set<Capability> acceptedIdentities = new HashSet<>();
for (Entry<Resource, List<Wire>> entry : discoveredOptional.entrySet()) {
// If we're required we are not also optional
Resource optionalResource = entry.getKey();
if (required.containsKey(optionalResource)) {
continue;
}
// If another resource with the same identity is required
// then we defer to it, otherwise we will get the an optional
// resource showing up from a different repository
Capability optionalIdentity = toPureIdentity(optionalResource, log);
if (requiredIdentities.contains(optionalIdentity)) {
continue;
}
// Only wires to required resources should kept
List<Wire> validWires = new ArrayList<Wire>();
optional: for (Wire optionalWire : entry.getValue()) {
Resource requirer = optionalWire.getRequirer();
Capability requirerIdentity = toPureIdentity(requirer, log);
if (required.containsKey(requirer)) {
Requirement req = optionalWire.getRequirement();
// Somebody does require this - do they have a match
// already?
List<Wire> requiredWires = required.get(requirer);
for (Wire requiredWire : requiredWires) {
if (req.equals(requiredWire.getRequirement())) {
continue optional;
}
}
validWires.add(optionalWire);
}
}
// This can happen if the same resource is in multiple repos
if (!validWires.isEmpty()) {
if (acceptedIdentities.add(optionalIdentity)) {
toReturn.put(optionalResource, validWires);
} else {
log.log(LogService.LOG_INFO, "Discarding the optional resource " + optionalResource + " because another optional resource with the identity " + optionalIdentity + " has already been selected. This usually happens when the same bundle is present in multiple repositories.");
}
}
}
return toReturn;
}
use of org.osgi.resource.Wire in project bnd by bndtools.
the class DebugReporter method resource.
private void resource(Resource r) {
IdentityCapability id = ResourceUtils.getIdentityCapability(r);
String resolveError = null;
if (!context.isSystemResource(r) && level >= 3 && id != null)
try {
String v = id.version() == null ? null : id.version().toString();
Requirement req = CapReqBuilder.createBundleRequirement(id.osgi_identity(), v).buildSyntheticRequirement();
context.setInputRequirements(req);
Resolver resolver = new BndResolver(new ResolverLogger(4));
Map<Resource, List<Wire>> resolved = resolver.resolve(context);
} catch (Exception e) {
resolveError = e.toString();
}
String s = resolveError == null ? " " : "!";
if (id == null)
out.printf("%s %s%n", s, r);
else
out.printf("%s %-50s %-20s %s%n", s, id.osgi_identity(), noNull(id.version()), id.description(""));
if (level >= 2) {
for (Capability c : r.getCapabilities(null)) {
capability(" ", c);
}
for (Requirement rq : r.getRequirements(null)) {
requirement(" ", rq);
}
}
}
Aggregations