Search in sources :

Example 31 with Wire

use of org.osgi.resource.Wire in project bnd by bndtools.

the class ResolveProcess method invertWirings.

/**
	 * Inverts the wiring map from the resolver. Whereas the resolver returns a
	 * map of resources and the list of wirings FROM each resource, we want to
	 * know the list of wirings TO that resource. This is in order to show the
	 * user the reasons for each resource being present in the result.
	 */
private static Map<Resource, List<Wire>> invertWirings(Map<Resource, ? extends Collection<Wire>> wirings, AbstractResolveContext rc) {
    Map<Resource, List<Wire>> inverted = new HashMap<Resource, List<Wire>>();
    for (Entry<Resource, ? extends Collection<Wire>> entry : wirings.entrySet()) {
        Resource requirer = entry.getKey();
        for (Wire wire : entry.getValue()) {
            Resource provider = findResolvedProvider(wire, wirings.keySet(), rc);
            // same
            if (provider == requirer)
                continue;
            List<Wire> incoming = inverted.get(provider);
            if (incoming == null) {
                incoming = new LinkedList<Wire>();
                inverted.put(provider, incoming);
            }
            incoming.add(wire);
        }
    }
    return inverted;
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Resource(org.osgi.resource.Resource) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) Wire(org.osgi.resource.Wire)

Example 32 with Wire

use of org.osgi.resource.Wire in project bnd by bndtools.

the class ResolveProcess method resolveRequired.

public Map<Resource, List<Wire>> resolveRequired(Processor properties, Project project, Registry plugins, Resolver resolver, Collection<ResolutionCallback> callbacks, LogService log) throws ResolutionException {
    required = new HashMap<Resource, List<Wire>>();
    optional = new HashMap<Resource, List<Wire>>();
    BndrunResolveContext rc = new BndrunResolveContext(properties, project, plugins, log);
    rc.addCallbacks(callbacks);
    // 1. Resolve initial requirements
    Map<Resource, List<Wire>> wirings;
    try {
        wirings = resolver.resolve(rc);
    } catch (ResolutionException re) {
        throw augment(rc, re);
    }
    // 2. Save initial requirement resolution
    Pair<Resource, List<Wire>> initialRequirement = null;
    for (Map.Entry<Resource, List<Wire>> wiring : wirings.entrySet()) {
        if (rc.getInputResource() == wiring.getKey()) {
            initialRequirement = new Pair<Resource, List<Wire>>(wiring.getKey(), wiring.getValue());
            break;
        }
    }
    // 3. Save the resolved root resources
    final List<Resource> resources = new ArrayList<Resource>();
    for (Resource r : rc.getMandatoryResources()) {
        reqs: for (Requirement req : r.getRequirements(null)) {
            for (Resource found : wirings.keySet()) {
                String filterStr = req.getDirectives().get(Namespace.REQUIREMENT_FILTER_DIRECTIVE);
                try {
                    org.osgi.framework.Filter filter = filterStr != null ? org.osgi.framework.FrameworkUtil.createFilter(filterStr) : null;
                    for (Capability c : found.getCapabilities(req.getNamespace())) {
                        if (filter != null && filter.matches(c.getAttributes())) {
                            resources.add(found);
                            continue reqs;
                        }
                    }
                } catch (InvalidSyntaxException e) {
                }
            }
        }
    }
    // 4. Add any 'osgi.wiring.bundle' requirements
    List<Resource> wiredBundles = new ArrayList<Resource>();
    for (Resource resource : resources) {
        addWiredBundle(wirings, resource, wiredBundles);
    }
    for (Resource resource : wiredBundles) {
        if (!resources.contains(resource)) {
            resources.add(resource);
        }
    }
    final Map<Resource, List<Wire>> discoveredOptional = new LinkedHashMap<Resource, List<Wire>>();
    // 5. Resolve the rest
    BndrunResolveContext rc2 = new BndrunResolveContext(properties, project, plugins, log) {

        @Override
        public Collection<Resource> getMandatoryResources() {
            return resources;
        }

        @Override
        public boolean isInputResource(Resource resource) {
            for (Resource r : resources) {
                if (GenericResolveContext.resourceIdentityEquals(r, resource)) {
                    return true;
                }
            }
            return false;
        }

        @Override
        public List<Capability> findProviders(Requirement requirement) {
            List<Capability> toReturn = super.findProviders(requirement);
            if (toReturn.isEmpty() && isEffective(requirement) && RESOLUTION_OPTIONAL.equals(requirement.getDirectives().get(REQUIREMENT_RESOLUTION_DIRECTIVE))) {
                for (Capability cap : findProvidersFromRepositories(requirement, new LinkedHashSet<Capability>())) {
                    Resource optionalRes = cap.getResource();
                    List<Wire> list = discoveredOptional.get(optionalRes);
                    if (list == null) {
                        list = new ArrayList<>();
                        discoveredOptional.put(optionalRes, list);
                    }
                    WireImpl candidateWire = new WireImpl(cap, requirement);
                    if (!list.contains(candidateWire))
                        list.add(candidateWire);
                }
            }
            return toReturn;
        }
    };
    rc2.addCallbacks(callbacks);
    try {
        wirings = resolver.resolve(rc2);
    } catch (ResolutionException re) {
        throw augment(rc2, re);
    }
    if (initialRequirement != null) {
        wirings.put(initialRequirement.getFirst(), initialRequirement.getSecond());
    }
    Map<Resource, List<Wire>> result = invertWirings(wirings, rc2);
    removeFrameworkAndInputResources(result, rc2);
    required.putAll(result);
    optional = tidyUpOptional(wirings, discoveredOptional, log);
    return result;
}
Also used : Capability(org.osgi.resource.Capability) Resource(org.osgi.resource.Resource) ArrayList(java.util.ArrayList) WireImpl(aQute.bnd.osgi.resource.WireImpl) Wire(org.osgi.resource.Wire) LinkedHashMap(java.util.LinkedHashMap) ResolutionException(org.osgi.service.resolver.ResolutionException) Requirement(org.osgi.resource.Requirement) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) InvalidSyntaxException(org.osgi.framework.InvalidSyntaxException) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map)

Example 33 with Wire

use of org.osgi.resource.Wire in project bnd by bndtools.

the class ResolveProcess method addWiredBundle.

private void addWiredBundle(Map<Resource, List<Wire>> wirings, Resource resource, List<Resource> result) {
    List<Requirement> reqs = resource.getRequirements(BUNDLE_NAMESPACE);
    for (Requirement req : reqs) {
        List<Wire> wrs = wirings.get(resource);
        for (Wire w : wrs) {
            if (w.getRequirement().equals(req)) {
                Resource res = w.getProvider();
                if (res != null) {
                    if (!result.contains(res)) {
                        result.add(res);
                        addWiredBundle(wirings, res, result);
                    }
                }
            }
        }
    }
}
Also used : Requirement(org.osgi.resource.Requirement) Resource(org.osgi.resource.Resource) Wire(org.osgi.resource.Wire)

Example 34 with Wire

use of org.osgi.resource.Wire in project felix by apache.

the class ResolveContextImpl method getSubstitutionWires.

@Override
public List<Wire> getSubstitutionWires(Wiring wiring) {
    // TODO: this is calculating information that probably has been calculated
    // already or at least could be calculated quicker taking into account the
    // current state. We need to revisit this.
    Set<String> exportNames = new HashSet<String>();
    for (Capability cap : wiring.getResource().getCapabilities(null)) {
        if (PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace())) {
            exportNames.add((String) cap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE));
        }
    }
    // Add fragment exports
    for (Wire wire : wiring.getProvidedResourceWires(null)) {
        if (HostNamespace.HOST_NAMESPACE.equals(wire.getCapability().getNamespace())) {
            for (Capability cap : wire.getRequirement().getResource().getCapabilities(null)) {
                if (PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace())) {
                    exportNames.add((String) cap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE));
                }
            }
        }
    }
    List<Wire> substitutionWires = new ArrayList<Wire>();
    for (Wire wire : wiring.getRequiredResourceWires(null)) {
        if (PackageNamespace.PACKAGE_NAMESPACE.equals(wire.getCapability().getNamespace())) {
            if (exportNames.contains(wire.getCapability().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE))) {
                substitutionWires.add(wire);
            }
        }
    }
    return substitutionWires;
}
Also used : HostedCapability(org.osgi.service.resolver.HostedCapability) BundleCapability(org.osgi.framework.wiring.BundleCapability) Capability(org.osgi.resource.Capability) ArrayList(java.util.ArrayList) Wire(org.osgi.resource.Wire) HashSet(java.util.HashSet)

Example 35 with Wire

use of org.osgi.resource.Wire in project felix by apache.

the class StatefulResolver method fireResolvedEvents.

private void fireResolvedEvents(Map<Resource, List<Wire>> wireMap) {
    if (wireMap != null) {
        Iterator<Entry<Resource, List<Wire>>> iter = wireMap.entrySet().iterator();
        // Iterate over the map to fire necessary RESOLVED events.
        while (iter.hasNext()) {
            Entry<Resource, List<Wire>> entry = iter.next();
            Resource resource = entry.getKey();
            if (!(resource instanceof BundleRevision))
                continue;
            BundleRevision revision = (BundleRevision) resource;
            // Fire RESOLVED events for all fragments.
            List<BundleRevision> fragments = Util.getFragments(revision.getWiring());
            for (int i = 0; i < fragments.size(); i++) {
                m_felix.fireBundleEvent(BundleEvent.RESOLVED, fragments.get(i).getBundle());
            }
            m_felix.fireBundleEvent(BundleEvent.RESOLVED, revision.getBundle());
        }
    }
}
Also used : Entry(java.util.Map.Entry) Resource(org.osgi.resource.Resource) BundleRevision(org.osgi.framework.wiring.BundleRevision) List(java.util.List) ArrayList(java.util.ArrayList) Wire(org.osgi.resource.Wire) BundleWire(org.osgi.framework.wiring.BundleWire)

Aggregations

Wire (org.osgi.resource.Wire)58 Resource (org.osgi.resource.Resource)49 ArrayList (java.util.ArrayList)38 List (java.util.List)36 HashMap (java.util.HashMap)35 Requirement (org.osgi.resource.Requirement)31 Capability (org.osgi.resource.Capability)29 Wiring (org.osgi.resource.Wiring)18 BundleCapability (org.apache.felix.resolver.test.util.BundleCapability)15 BundleRequirement (org.apache.felix.resolver.test.util.BundleRequirement)15 GenericCapability (org.apache.felix.resolver.test.util.GenericCapability)15 GenericRequirement (org.apache.felix.resolver.test.util.GenericRequirement)15 PackageCapability (org.apache.felix.resolver.test.util.PackageCapability)15 PackageRequirement (org.apache.felix.resolver.test.util.PackageRequirement)15 ResolverImpl (org.apache.felix.resolver.ResolverImpl)14 ResolveContextImpl (org.apache.felix.resolver.test.util.ResolveContextImpl)14 Logger (org.apache.felix.resolver.Logger)13 Test (org.junit.Test)13 Resolver (org.osgi.service.resolver.Resolver)12 Map (java.util.Map)11