Class ResolverImpl

  • All Implemented Interfaces:
    Resolver

    public class ResolverImpl
    extends java.lang.Object
    implements Resolver
    • Field Detail

      • m_acc

        private final java.security.AccessControlContext m_acc
      • m_logger

        private final Logger m_logger
      • m_parallelism

        private final int m_parallelism
      • m_executor

        private final java.util.concurrent.Executor m_executor
    • Constructor Detail

      • ResolverImpl

        public ResolverImpl​(Logger logger)
      • ResolverImpl

        public ResolverImpl​(Logger logger,
                            int parallelism)
      • ResolverImpl

        public ResolverImpl​(Logger logger,
                            java.util.concurrent.Executor executor)
    • Method Detail

      • resolve

        public java.util.Map<org.osgi.resource.Resource,​java.util.List<org.osgi.resource.Wire>> resolve​(ResolveContext rc)
                                                                                                       throws ResolutionException
        Description copied from interface: Resolver
        Resolve the specified resolve context and return any new resources and wires to the caller.

        The resolver considers two groups of resources:

        • Mandatory - any resource in the mandatory group must be resolved. A failure to satisfy any mandatory requirement for these resources will result in throwing a ResolutionException
        • Optional - any resource in the optional group may be resolved. A failure to satisfy a mandatory requirement for a resource in this group will not fail the overall resolution but no resources or wires will be returned for that resource.

        The resolve method returns the delta between the start state defined by ResolveContext.getWirings() and the end resolved state. That is, only new resources and wires are included.

        The behavior of the resolver is not defined if the specified resolve context supplies inconsistent information.

        Specified by:
        resolve in interface Resolver
        Parameters:
        rc - The resolve context for the resolve operation. Must not be null.
        Returns:
        The new resources and wires required to satisfy the specified resolve context. The returned map is the property of the caller and can be modified by the caller.
        Throws:
        ResolutionException - If the resolution cannot be satisfied.
      • checkConsistency

        private ResolutionError checkConsistency​(java.util.concurrent.Executor executor,
                                                 ResolverImpl.ResolveSession session,
                                                 java.util.List<Candidates> usesPermutations,
                                                 java.util.List<Candidates> importPermutations,
                                                 Candidates allCandidates,
                                                 java.util.Map<org.osgi.resource.Resource,​ResolutionError> currentFaultyResources,
                                                 java.util.Map<org.osgi.resource.Resource,​org.osgi.resource.Resource> hosts,
                                                 boolean dynamic)
      • resolve

        public java.util.Map<org.osgi.resource.Resource,​java.util.List<org.osgi.resource.Wire>> resolve​(ResolveContext rc,
                                                                                                              org.osgi.resource.Resource host,
                                                                                                              org.osgi.resource.Requirement dynamicReq,
                                                                                                              java.util.List<org.osgi.resource.Capability> matches)
                                                                                                       throws ResolutionException
        Resolves a dynamic requirement for the specified host resource using the specified ResolveContext. The dynamic requirement may contain wild cards in its filter for the package name. The matching candidates are used to resolve the requirement and the resolve context is not asked to find providers for the dynamic requirement. The host resource is expected to not be a fragment, to already be resolved and have an existing wiring provided by the resolve context.

        This operation may resolve additional resources in order to resolve the dynamic requirement. The returned map will contain entries for each resource that got resolved in addition to the specified host resource. The wire list for the host resource will only contain a single wire which is for the dynamic requirement.

        Parameters:
        rc - the resolve context
        host - the hosting resource
        dynamicReq - the dynamic requirement
        matches - a list of matching capabilities
        Returns:
        The new resources and wires required to satisfy the specified dynamic requirement. The returned map is the property of the caller and can be modified by the caller.
        Throws:
        ResolutionException
      • mergeCandidatePackages

        private static void mergeCandidatePackages​(ResolverImpl.ResolveSession session,
                                                   java.util.Map<org.osgi.resource.Resource,​ResolverImpl.Packages> resourcePkgMap,
                                                   Candidates allCandidates,
                                                   ResolverImpl.Packages packages,
                                                   org.osgi.resource.Requirement currentReq,
                                                   org.osgi.resource.Capability candCap,
                                                   java.util.Set<org.osgi.resource.Capability> capabilityCycles,
                                                   java.util.Set<org.osgi.resource.Resource> visitedRequiredBundles)
      • mergeCandidatePackage

        private static void mergeCandidatePackage​(OpenHashMap<java.lang.String,​java.util.List<ResolverImpl.Blame>> packages,
                                                  org.osgi.resource.Requirement currentReq,
                                                  org.osgi.resource.Capability candCap)
      • mergeUses

        private static void mergeUses​(ResolverImpl.ResolveSession session,
                                      org.osgi.resource.Resource current,
                                      ResolverImpl.Packages currentPkgs,
                                      org.osgi.resource.Capability mergeCap,
                                      java.util.List<org.osgi.resource.Requirement> blameReqs,
                                      org.osgi.resource.Capability matchingCap,
                                      java.util.Map<org.osgi.resource.Resource,​ResolverImpl.Packages> resourcePkgMap,
                                      java.util.Set<org.osgi.resource.Capability> cycleMap)
      • calculatePackageSpaces

        private static java.util.Map<org.osgi.resource.Resource,​ResolverImpl.Packages> calculatePackageSpaces​(java.util.concurrent.Executor innerExecutor,
                                                                                                                    ResolverImpl.ResolveSession session,
                                                                                                                    Candidates allCandidates,
                                                                                                                    java.util.Collection<org.osgi.resource.Resource> hosts)
      • parseUses

        private static java.util.List<java.lang.String> parseUses​(java.lang.String s)
      • addUsedBlame

        private static void addUsedBlame​(ArrayMap<org.osgi.resource.Capability,​ResolverImpl.UsedBlames> usedBlames,
                                         org.osgi.resource.Capability usedCap,
                                         java.util.List<org.osgi.resource.Requirement> blameReqs,
                                         org.osgi.resource.Capability matchingCap)
      • isCompatible

        private static boolean isCompatible​(ResolverImpl.Blame currentBlame,
                                            org.osgi.resource.Capability candCap,
                                            java.util.Map<org.osgi.resource.Resource,​ResolverImpl.Packages> resourcePkgMap)
      • isCompatible

        private static boolean isCompatible​(java.util.List<ResolverImpl.Blame> currentBlames,
                                            org.osgi.resource.Capability candCap,
                                            java.util.Map<org.osgi.resource.Resource,​ResolverImpl.Packages> resourcePkgMap)
      • getPackageSources

        private static java.util.Set<org.osgi.resource.Capability> getPackageSources​(org.osgi.resource.Capability cap,
                                                                                     java.util.Map<org.osgi.resource.Resource,​ResolverImpl.Packages> resourcePkgMap)
      • getDeclaredResource

        private static org.osgi.resource.Resource getDeclaredResource​(org.osgi.resource.Resource resource)
      • getDeclaredCapability

        private static org.osgi.resource.Capability getDeclaredCapability​(org.osgi.resource.Capability c)
      • getDeclaredRequirement

        private static org.osgi.resource.Requirement getDeclaredRequirement​(org.osgi.resource.Requirement r)
      • populateWireMap

        private static java.util.Map<org.osgi.resource.Resource,​java.util.List<org.osgi.resource.Wire>> populateWireMap​(ResolveContext rc,
                                                                                                                              org.osgi.resource.Resource resource,
                                                                                                                              java.util.Map<org.osgi.resource.Resource,​java.util.List<org.osgi.resource.Wire>> wireMap,
                                                                                                                              Candidates allCandidates)
      • createWire

        private static org.osgi.resource.Wire createWire​(org.osgi.resource.Requirement requirement,
                                                         Candidates allCandidates)
      • isPayload

        private static boolean isPayload​(org.osgi.resource.Requirement fragmentReq)
      • populateDynamicWireMap

        private static java.util.Map<org.osgi.resource.Resource,​java.util.List<org.osgi.resource.Wire>> populateDynamicWireMap​(ResolveContext rc,
                                                                                                                                     org.osgi.resource.Resource resource,
                                                                                                                                     org.osgi.resource.Requirement dynReq,
                                                                                                                                     java.util.Map<org.osgi.resource.Resource,​java.util.List<org.osgi.resource.Wire>> wireMap,
                                                                                                                                     Candidates allCandidates)