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;
     }