Package org.apache.felix.resolver
Class ResolverImpl
- java.lang.Object
-
- org.apache.felix.resolver.ResolverImpl
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
ResolverImpl.Blame
(package private) static class
ResolverImpl.DumbExecutor
private static class
ResolverImpl.EnhancedExecutor
static class
ResolverImpl.Packages
(package private) class
ResolverImpl.ResolveSession
private static class
ResolverImpl.UseConstraintError
private static class
ResolverImpl.UsedBlames
private static class
ResolverImpl.WireCandidate
-
Field Summary
Fields Modifier and Type Field Description private java.security.AccessControlContext
m_acc
private java.util.concurrent.Executor
m_executor
private Logger
m_logger
private int
m_parallelism
-
Constructor Summary
Constructors Constructor Description ResolverImpl(Logger logger)
ResolverImpl(Logger logger, int parallelism)
ResolverImpl(Logger logger, java.util.concurrent.Executor executor)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description 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)
private static OpenHashMap<java.lang.String,ResolverImpl.Blame>
calculateExportedPackages(ResolverImpl.ResolveSession session, Candidates allCandidates, org.osgi.resource.Resource resource, OpenHashMap<java.lang.String,ResolverImpl.Blame> exports)
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)
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)
private boolean
checkMultiple(ResolverImpl.ResolveSession session, ResolverImpl.UsedBlames usedBlames, ResolverImpl.Blame usedBlame, Candidates permutation)
private ResolutionError
checkPackageSpaceConsistency(ResolverImpl.ResolveSession session, java.util.List<Candidates> usesPermutations, java.util.List<Candidates> importPermutations, org.osgi.resource.Resource resource, Candidates allCandidates, boolean dynamic, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, java.util.Map<org.osgi.resource.Resource,java.lang.Object> resultCache)
private static void
computeUses(ResolverImpl.ResolveSession session, java.util.Map<org.osgi.resource.Resource,java.util.List<ResolverImpl.WireCandidate>> allWireCandidates, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, org.osgi.resource.Resource resource)
private static org.osgi.resource.Wire
createWire(org.osgi.resource.Requirement requirement, Candidates allCandidates)
private static void
dumpResourcePkgMap(ResolveContext rc, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap)
private static void
dumpResourcePkgs(ResolveContext rc, org.osgi.resource.Resource resource, ResolverImpl.Packages packages)
private static org.osgi.resource.Capability
getDeclaredCapability(org.osgi.resource.Capability c)
private static org.osgi.resource.Requirement
getDeclaredRequirement(org.osgi.resource.Requirement r)
private static org.osgi.resource.Resource
getDeclaredResource(org.osgi.resource.Resource resource)
private static ResolverImpl.Packages
getPackages(ResolverImpl.ResolveSession session, Candidates allCandidates, java.util.Map<org.osgi.resource.Resource,java.util.List<ResolverImpl.WireCandidate>> allWireCandidates, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> allPackages, org.osgi.resource.Resource resource, ResolverImpl.Packages resourcePkgs)
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)
private static void
getPackageSourcesInternal(ResolverImpl.ResolveSession session, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, org.osgi.resource.Resource resource, ResolverImpl.Packages packages)
private static java.util.List<ResolverImpl.WireCandidate>
getWireCandidates(ResolverImpl.ResolveSession session, Candidates allCandidates, org.osgi.resource.Resource resource)
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)
private static boolean
isCompatible(ResolverImpl.Blame currentBlame, org.osgi.resource.Capability candCap, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap)
private static boolean
isPayload(org.osgi.resource.Requirement fragmentReq)
private static void
mergeCandidatePackage(OpenHashMap<java.lang.String,java.util.List<ResolverImpl.Blame>> packages, org.osgi.resource.Requirement currentReq, org.osgi.resource.Capability candCap)
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)
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)
private static java.util.List<java.lang.String>
parseUses(java.lang.String s)
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)
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)
java.util.Map<org.osgi.resource.Resource,java.util.List<org.osgi.resource.Wire>>
resolve(ResolveContext rc)
Resolve the specified resolve context and return any new resources and wires to the caller.java.util.Map<org.osgi.resource.Resource,java.util.List<org.osgi.resource.Wire>>
resolve(ResolveContext rc, java.util.concurrent.Executor executor)
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)
Resolves a dynamic requirement for the specified host resource using the specifiedResolveContext
.
-
-
-
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
-
-
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 aResolutionException
- 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 interfaceResolver
- Parameters:
rc
- The resolve context for the resolve operation. Must not benull
.- 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.
- Mandatory - any resource in the
-
resolve
public java.util.Map<org.osgi.resource.Resource,java.util.List<org.osgi.resource.Wire>> resolve(ResolveContext rc, java.util.concurrent.Executor executor) throws ResolutionException
- Throws:
ResolutionException
-
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 specifiedResolveContext
. 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 contexthost
- the hosting resourcedynamicReq
- the dynamic requirementmatches
- 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
-
getWireCandidates
private static java.util.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, java.util.Map<org.osgi.resource.Resource,java.util.List<ResolverImpl.WireCandidate>> allWireCandidates, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> allPackages, org.osgi.resource.Resource resource, ResolverImpl.Packages resourcePkgs)
-
computeUses
private static void computeUses(ResolverImpl.ResolveSession session, java.util.Map<org.osgi.resource.Resource,java.util.List<ResolverImpl.WireCandidate>> allWireCandidates, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, org.osgi.resource.Resource resource)
-
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)
-
checkPackageSpaceConsistency
private ResolutionError checkPackageSpaceConsistency(ResolverImpl.ResolveSession session, java.util.List<Candidates> usesPermutations, java.util.List<Candidates> importPermutations, org.osgi.resource.Resource resource, Candidates allCandidates, boolean dynamic, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap, java.util.Map<org.osgi.resource.Resource,java.lang.Object> resultCache)
-
checkMultiple
private boolean checkMultiple(ResolverImpl.ResolveSession session, ResolverImpl.UsedBlames usedBlames, ResolverImpl.Blame usedBlame, Candidates permutation)
-
calculateExportedPackages
private static OpenHashMap<java.lang.String,ResolverImpl.Blame> calculateExportedPackages(ResolverImpl.ResolveSession session, Candidates allCandidates, org.osgi.resource.Resource resource, OpenHashMap<java.lang.String,ResolverImpl.Blame> exports)
-
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)
-
getPackageSourcesInternal
private static void getPackageSourcesInternal(ResolverImpl.ResolveSession session, java.util.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 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)
-
dumpResourcePkgMap
private static void dumpResourcePkgMap(ResolveContext rc, java.util.Map<org.osgi.resource.Resource,ResolverImpl.Packages> resourcePkgMap)
-
dumpResourcePkgs
private static void dumpResourcePkgs(ResolveContext rc, org.osgi.resource.Resource resource, ResolverImpl.Packages packages)
-
-