Class ResolverImpl

java.lang.Object
org.apache.felix.resolver.ResolverImpl
All Implemented Interfaces:
Resolver

public class ResolverImpl extends Object implements Resolver
  • Field Details

    • m_acc

      private final AccessControlContext m_acc
    • m_logger

      private final Logger m_logger
    • m_parallelism

      private final int m_parallelism
    • m_executor

      private final Executor m_executor
  • Constructor Details

    • ResolverImpl

      public ResolverImpl(Logger logger)
    • ResolverImpl

      public ResolverImpl(Logger logger, int parallelism)
    • ResolverImpl

      public ResolverImpl(Logger logger, Executor executor)
  • Method Details

    • resolve

      public Map<org.osgi.resource.Resource,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.
    • resolve

      public Map<org.osgi.resource.Resource,List<org.osgi.resource.Wire>> resolve(ResolveContext rc, Executor executor) throws ResolutionException
      Throws:
      ResolutionException
    • doResolve

      private Map<org.osgi.resource.Resource,List<org.osgi.resource.Wire>> doResolve(ResolverImpl.ResolveSession session) throws ResolutionException
      Throws:
      ResolutionException
    • getInitialCandidates

      private void getInitialCandidates(ResolverImpl.ResolveSession session)
    • findValidCandidates

      private Candidates findValidCandidates(ResolverImpl.ResolveSession session, Map<org.osgi.resource.Resource,ResolutionError> faultyResources)
    • checkConsistency

      private ResolutionError checkConsistency(ResolverImpl.ResolveSession session, Candidates allCandidates, Map<org.osgi.resource.Resource,ResolutionError> currentFaultyResources)
    • resolveDynamic

      public Map<org.osgi.resource.Resource,List<org.osgi.resource.Wire>> resolveDynamic(ResolveContext context, org.osgi.resource.Wiring hostWiring, org.osgi.resource.Requirement dynamicRequirement) throws ResolutionException
      Description copied from interface: Resolver
      Resolves a given requirement dynamically for the given host wiring using the given resolve context and return any new resources and wires to the caller.

      The requirement must be a requirement of the wiring and must use the package namespace with a resolution of type dynamic.

      The resolve context is not asked for mandatory resources or for optional resources. The resolve context is asked to find providers for the given requirement. The matching package capabilities returned by the resolve context must not have a osgi.wiring.package attribute equal to a package capability already wired to by the wiring or equal a package capability provided by the wiring. The resolve context may be requested to find providers for other requirements in order to resolve the resources that provide the matching capabilities to the given requirement.

      If the requirement cardinality is not multiple then no new wire must be created if the wires of the wiring already contain a wire that uses the requirement

      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 wiring resource. The wire list for the wiring resource will only contain one wire which is for the dynamic requirement.

      Specified by:
      resolveDynamic in interface Resolver
      Parameters:
      context - The resolve context for the resolve operation. Must not be null.
      hostWiring - The wiring with the dynamic requirement. Must not be null.
      dynamicRequirement - The dynamic requirement. Must not be null.
      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. If no new wires were created then a ResolutionException is thrown.
      Throws:
      ResolutionException - if the dynamic requirement cannot be resolved
    • getWireCandidates

      private static List<ResolverImpl.WireCandidate> getWireCandidates(ResolverImpl.ResolveSession session, Candidates allCandidates, org.osgi.resource.Resource resource)
    • getPackages

      private static ResolverImpl.Packages getPackages(ResolverImpl.ResolveSession session, Candidates allCandidates, Map<org.osgi.resource.Resource,List<ResolverImpl.WireCandidate>> allWireCandidates, Map<org.osgi.resource.Resource,ResolverImpl.Packages> allPackages, org.osgi.resource.Resource resource, ResolverImpl.Packages resourcePkgs)
    • computeUses

      private void computeUses(ResolverImpl.ResolveSession session, Map<org.osgi.resource.Resource,List<ResolverImpl.WireCandidate>> allWireCandidates, Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, org.osgi.resource.Resource resource)
    • mergeCandidatePackages

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

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

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

      private Map<org.osgi.resource.Resource,ResolverImpl.Packages> calculatePackageSpaces(ResolverImpl.ResolveSession session, Candidates allCandidates, Collection<org.osgi.resource.Resource> hosts)
    • parseUses

      private static List<String> parseUses(String s)
    • addUsedBlames

      private void addUsedBlames(ArrayMap<Set<org.osgi.resource.Capability>,ResolverImpl.UsedBlames> usedBlames, Collection<ResolverImpl.Blame> blames, org.osgi.resource.Capability matchingCap, Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap)
    • checkPackageSpaceConsistency

      private ResolutionError checkPackageSpaceConsistency(ResolverImpl.ResolveSession session, org.osgi.resource.Resource resource, Candidates allCandidates, boolean dynamic, Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, Map<org.osgi.resource.Resource,Object> resultCache)
    • permuteUsedBlames

      private ResolutionError permuteUsedBlames(ResolverImpl.ResolveSession session, ResolutionError rethrow, Candidates allCandidates, org.osgi.resource.Resource resource, String pkgName, ResolverImpl.Blame requirementBlame, ResolverImpl.UsedBlames usedBlames, AtomicReference<Candidates> permRef1, AtomicReference<Candidates> permRef2, Set<org.osgi.resource.Requirement> mutated)
    • permuteUsedBlameRequirement

      private boolean permuteUsedBlameRequirement(org.osgi.resource.Requirement req, Set<org.osgi.resource.Requirement> mutated, Candidates permutation)
    • calculateExportedPackages

      private static OpenHashMap<String,ResolverImpl.Blame> calculateExportedPackages(ResolverImpl.ResolveSession session, Candidates allCandidates, org.osgi.resource.Resource resource, OpenHashMap<String,ResolverImpl.Blame> exports, OpenHashMap<String,ResolverImpl.Blame> substitutes)
    • isCompatible

      private static boolean isCompatible(ResolverImpl.Blame currentBlame, Set<org.osgi.resource.Capability> candSources, Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap)
    • isCompatible

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

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

      private static void getPackageSourcesInternal(ResolverImpl.ResolveSession session, Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, org.osgi.resource.Resource resource, ResolverImpl.Packages packages)
    • 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 Map<org.osgi.resource.Resource,List<org.osgi.resource.Wire>> populateWireMap(ResolverImpl.ResolveSession session, org.osgi.resource.Resource resource, Map<org.osgi.resource.Resource,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 Map<org.osgi.resource.Resource,List<org.osgi.resource.Wire>> populateDynamicWireMap(ResolverImpl.ResolveSession session, Map<org.osgi.resource.Resource,List<org.osgi.resource.Wire>> wireMap, Candidates allCandidates)
    • dumpResourcePkgMap

      private static void dumpResourcePkgMap(ResolveContext rc, Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap)
    • dumpResourcePkgs

      private static void dumpResourcePkgs(ResolveContext rc, org.osgi.resource.Resource resource, ResolverImpl.Packages packages)