Avoid filtering unknown namespace in generic caps/reqs and also pay
attention to effective time of caps/reqs. (FELIX-2973)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1141672 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
index e55b990..30c6a96 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
@@ -195,13 +195,11 @@
(caps != null) && (capIdx < caps.size());
capIdx++)
{
- if (caps.get(capIdx).getNamespace().equals(
- BundleRevision.PACKAGE_NAMESPACE))
- {
- capList.add(
- new HostedCapability(
- m_revision, (BundleCapabilityImpl) caps.get(capIdx)));
- }
+// TODO: OSGi R4.4 - OSGi R4.4 may introduce an identity capability, if so
+// that will need to be excluded from here.
+ capList.add(
+ new HostedCapability(
+ m_revision, (BundleCapabilityImpl) caps.get(capIdx)));
}
}
m_resolvedCaps = Collections.unmodifiableList(capList);
@@ -218,10 +216,7 @@
(reqs != null) && (reqIdx < reqs.size());
reqIdx++)
{
- if (reqs.get(reqIdx).getNamespace().equals(
- BundleRevision.PACKAGE_NAMESPACE)
- || reqs.get(reqIdx).getNamespace().equals(
- BundleRevision.BUNDLE_NAMESPACE))
+ if (!reqs.get(reqIdx).getNamespace().equals(BundleRevision.HOST_NAMESPACE))
{
reqList.add(
new HostedRequirement(
diff --git a/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java b/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
index af42594..9d7a04d 100644
--- a/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
+++ b/framework/src/main/java/org/apache/felix/framework/StatefulResolver.java
@@ -32,6 +32,7 @@
import java.util.StringTokenizer;
import java.util.TreeSet;
import org.apache.felix.framework.capabilityset.CapabilitySet;
+import org.apache.felix.framework.capabilityset.SimpleFilter;
import org.apache.felix.framework.resolver.CandidateComparator;
import org.apache.felix.framework.resolver.ResolveException;
import org.apache.felix.framework.resolver.Resolver;
@@ -1169,8 +1170,14 @@
// ResolverState methods.
//
+ public boolean isEffective(BundleRequirement req)
+ {
+ String effective = req.getDirectives().get(Constants.EFFECTIVE_DIRECTIVE);
+ return ((effective == null) || effective.equals(Constants.EFFECTIVE_RESOLVE));
+ }
+
public synchronized SortedSet<BundleCapability> getCandidates(
- BundleRequirementImpl req, boolean obeyMandatory)
+ BundleRequirement req, boolean obeyMandatory)
{
BundleRevisionImpl reqRevision = (BundleRevisionImpl) req.getRevision();
SortedSet<BundleCapability> result =
@@ -1179,7 +1186,29 @@
CapabilitySet capSet = m_capSets.get(req.getNamespace());
if (capSet != null)
{
- Set<BundleCapability> matches = capSet.match(req.getFilter(), obeyMandatory);
+ // Get the requirement's filter; if this is our own impl we
+ // have a shortcut to get the already parsed filter, otherwise
+ // we must parse it from the directive.
+ SimpleFilter sf = null;
+ if (req instanceof BundleRequirementImpl)
+ {
+ sf = ((BundleRequirementImpl) req).getFilter();
+ }
+ else
+ {
+ String filter = req.getDirectives().get(Constants.FILTER_DIRECTIVE);
+ if (filter == null)
+ {
+ sf = new SimpleFilter(null, null, SimpleFilter.MATCH_ALL);
+ }
+ else
+ {
+ sf = SimpleFilter.parse(filter);
+ }
+ }
+
+ // Find the matching candidates.
+ Set<BundleCapability> matches = capSet.match(sf, obeyMandatory);
for (BundleCapability cap : matches)
{
if (System.getSecurityManager() != null)
diff --git a/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java b/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java
index bdcf0b3..7475ed6 100644
--- a/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java
+++ b/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java
@@ -194,10 +194,11 @@
{
BundleRequirement req = remainingReqs.remove(0);
- // Ignore dynamic requirements.
+ // Ignore non-effective and dynamic requirements.
String resolution = req.getDirectives().get(Constants.RESOLUTION_DIRECTIVE);
+ if (!state.isEffective(req)
// TODO: OSGi R4.3 - Use proper "dynamic" constant.
- if ((resolution != null) && resolution.equals("dynamic"))
+ || ((resolution != null) && resolution.equals("dynamic")))
{
continue;
}
diff --git a/framework/src/main/java/org/apache/felix/framework/resolver/HostBundleRevision.java b/framework/src/main/java/org/apache/felix/framework/resolver/HostBundleRevision.java
index ec47d5a..3f052bb 100644
--- a/framework/src/main/java/org/apache/felix/framework/resolver/HostBundleRevision.java
+++ b/framework/src/main/java/org/apache/felix/framework/resolver/HostBundleRevision.java
@@ -82,10 +82,9 @@
{
for (BundleCapability cap : fragment.getDeclaredCapabilities(null))
{
- if (cap.getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE))
- {
- caps.add(new HostedCapability(this, (BundleCapabilityImpl) cap));
- }
+// TODO: OSGi R4.4 - OSGi R4.4 may introduce an identity capability, if so
+// that will need to be excluded from here.
+ caps.add(new HostedCapability(this, (BundleCapabilityImpl) cap));
}
}
}
@@ -113,8 +112,7 @@
{
for (BundleRequirement req : fragment.getDeclaredRequirements(null))
{
- if (req.getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE)
- || req.getNamespace().equals(BundleRevision.BUNDLE_NAMESPACE))
+ if (!req.getNamespace().equals(BundleRevision.HOST_NAMESPACE))
{
reqs.add(new HostedRequirement(this, (BundleRequirementImpl) req));
}
diff --git a/framework/src/main/java/org/apache/felix/framework/resolver/Resolver.java b/framework/src/main/java/org/apache/felix/framework/resolver/Resolver.java
index c2f12b7..4791991 100644
--- a/framework/src/main/java/org/apache/felix/framework/resolver/Resolver.java
+++ b/framework/src/main/java/org/apache/felix/framework/resolver/Resolver.java
@@ -22,8 +22,8 @@
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
-import org.apache.felix.framework.wiring.BundleRequirementImpl;
import org.osgi.framework.wiring.BundleCapability;
+import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleRevision;
public interface Resolver
@@ -38,8 +38,9 @@
public static interface ResolverState
{
+ boolean isEffective(BundleRequirement req);
SortedSet<BundleCapability> getCandidates(
- BundleRequirementImpl req, boolean obeyMandatory);
+ BundleRequirement req, boolean obeyMandatory);
void checkExecutionEnvironment(BundleRevision revision) throws ResolveException;
void checkNativeLibraries(BundleRevision revision) throws ResolveException;
}