Make the resolver slightly more generic so that we can reuse it in OBR more easily (FELIX-2035)

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@949051 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java b/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java
index 53af752..500a66b 100644
--- a/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java
+++ b/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java
@@ -47,39 +47,37 @@
     private final Logger m_logger;
     // List of all modules.
     private final List<Module> m_modules;
-    // Capability set for modules.
-    private final CapabilitySet m_modCapSet;
-    // Capability set for packages.
-    private final CapabilitySet m_pkgCapSet;
-    // Capability set for hosts.
-    private final CapabilitySet m_hostCapSet;
+    // Capability sets.
+    private final Map<String, CapabilitySet> m_capSets;
     // Maps fragment symbolic names to list of fragment modules sorted by version.
     private final Map<String, List<Module>> m_fragmentMap = new HashMap<String, List<Module>>();
     // Maps singleton symbolic names to list of modules sorted by version.
     private final Map<String, List<Module>> m_singletons = new HashMap<String, List<Module>>();
     // Execution environment.
     private final String m_fwkExecEnvStr;
-    private final Set m_fwkExecEnvSet;
+    // Parsed framework environments
+    private final Set<String> m_fwkExecEnvSet;
 
     public FelixResolverState(Logger logger, String fwkExecEnvStr)
     {
         m_logger = logger;
         m_modules = new ArrayList<Module>();
+        m_capSets = new HashMap<String, CapabilitySet>();
 
         m_fwkExecEnvStr = (fwkExecEnvStr != null) ? fwkExecEnvStr.trim() : null;
         m_fwkExecEnvSet = parseExecutionEnvironments(fwkExecEnvStr);
 
         List<String> indices = new ArrayList<String>();
         indices.add(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE);
-        m_modCapSet = new CapabilitySet(indices);
+        m_capSets.put( Capability.MODULE_NAMESPACE,  new CapabilitySet(indices) );
 
         indices = new ArrayList<String>();
         indices.add(Capability.PACKAGE_ATTR);
-        m_pkgCapSet = new CapabilitySet(indices);
+        m_capSets.put( Capability.PACKAGE_NAMESPACE,  new CapabilitySet(indices) );
 
         indices = new ArrayList<String>();
         indices.add(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE);
-        m_hostCapSet = new CapabilitySet(indices);
+        m_capSets.put( Capability.HOST_NAMESPACE,  new CapabilitySet(indices) );
     }
 
     public synchronized void addModule(Module module)
@@ -379,14 +377,13 @@
         {
             for (Capability cap : caps)
             {
-                if (cap.getNamespace().equals(Capability.MODULE_NAMESPACE))
+                CapabilitySet capSet = m_capSets.get( cap.getNamespace() );
+                if (capSet == null)
                 {
-                    m_modCapSet.addCapability(cap);
+                    capSet = new CapabilitySet(null);
+                    m_capSets.put(cap.getNamespace(), capSet);
                 }
-                else if (cap.getNamespace().equals(Capability.PACKAGE_NAMESPACE))
-                {
-                    m_pkgCapSet.addCapability(cap);
-                }
+                capSet.addCapability(cap);
             }
         }
     }
@@ -397,13 +394,10 @@
         {
             for (Capability cap : caps)
             {
-                if (cap.getNamespace().equals(Capability.MODULE_NAMESPACE))
+                CapabilitySet capSet = m_capSets.get( cap.getNamespace() );
+                if (capSet != null)
                 {
-                    m_modCapSet.removeCapability(cap);
-                }
-                else if (cap.getNamespace().equals(Capability.PACKAGE_NAMESPACE))
-                {
-                    m_pkgCapSet.removeCapability(cap);
+                    capSet.removeCapability(cap);
                 }
             }
         }
@@ -435,7 +429,7 @@
             }
         }
 
-        Set<Capability> hostCaps = m_hostCapSet.match(hostReq.getFilter(), true);
+        Set<Capability> hostCaps = m_capSets.get(Capability.HOST_NAMESPACE).match(hostReq.getFilter(), true);
 
         for (Iterator<Capability> it = hostCaps.iterator(); it.hasNext(); )
         {
@@ -475,7 +469,7 @@
         List<Capability> caps = Util.getCapabilityByNamespace(host, Capability.HOST_NAMESPACE);
         if (caps.size() > 0)
         {
-            m_hostCapSet.addCapability(caps.get(0));
+            m_capSets.get(Capability.HOST_NAMESPACE).addCapability(caps.get(0));
         }
 
         //
@@ -527,7 +521,7 @@
         List<Capability> caps = Util.getCapabilityByNamespace(host, Capability.HOST_NAMESPACE);
         if (caps.size() > 0)
         {
-            m_hostCapSet.removeCapability(caps.get(0));
+            m_capSets.get(Capability.HOST_NAMESPACE).removeCapability(caps.get(0));
         }
 
         // Remove exports from package maps.
@@ -706,7 +700,7 @@
                             && wire.getCapability().getAttribute(Capability.PACKAGE_ATTR).getValue()
                                 .equals(caps.get(capIdx).getAttribute(Capability.PACKAGE_ATTR).getValue()))
                         {
-                            m_pkgCapSet.removeCapability(caps.get(capIdx));
+                            m_capSets.get(Capability.PACKAGE_NAMESPACE).removeCapability(caps.get(capIdx));
                             break;
                         }
                     }
@@ -719,13 +713,10 @@
     {
         Set<Capability> result = new TreeSet<Capability>(new CandidateComparator());
 
-        if (req.getNamespace().equals(Capability.MODULE_NAMESPACE))
+        CapabilitySet capSet = m_capSets.get(req.getNamespace());
+        if (capSet != null)
         {
-            result.addAll(m_modCapSet.match(req.getFilter(), obeyMandatory));
-        }
-        else if (req.getNamespace().equals(Capability.PACKAGE_NAMESPACE))
-        {
-            result.addAll(m_pkgCapSet.match(req.getFilter(), obeyMandatory));
+            result.addAll(capSet.match(req.getFilter(), obeyMandatory));
         }
 
         return result;