You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2010/03/03 16:09:48 UTC

svn commit: r918505 [1/2] - in /felix/trunk/framework: ./ src/main/java/org/apache/felix/framework/ src/main/java/org/apache/felix/framework/cache/ src/main/java/org/apache/felix/framework/util/ src/main/java/org/apache/felix/moduleloader/ src/test/jav...

Author: rickhall
Date: Wed Mar  3 15:09:47 2010
New Revision: 918505

URL: http://svn.apache.org/viewvc?rev=918505&view=rev
Log:
More changes due to abstraction changes for the new resolver implementation.
(FELIX-2036, FELIX-2037, FELIX-2035)

Removed:
    felix/trunk/framework/src/main/java/org/apache/felix/moduleloader/
Modified:
    felix/trunk/framework/pom.xml
    felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/VersionRange.java
    felix/trunk/framework/src/test/java/org/apache/felix/framework/util/UtilTest.java

Modified: felix/trunk/framework/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/framework/pom.xml?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/pom.xml (original)
+++ felix/trunk/framework/pom.xml Wed Mar  3 15:09:47 2010
@@ -46,6 +46,15 @@
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <target>jsr14</target>
+          <source>1.5</source>
+        </configuration>
+      </plugin>
+
+      <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
         <version>1.4.3</version>

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleImpl.java Wed Mar  3 15:09:47 2010
@@ -25,9 +25,9 @@
 import java.util.*;
 
 import org.apache.felix.framework.cache.BundleArchive;
+import org.apache.felix.framework.resolver.Module;
 import org.apache.felix.framework.ext.SecurityProvider;
 import org.apache.felix.framework.util.StringMap;
-import org.apache.felix.moduleloader.IModule;
 import org.osgi.framework.*;
 
 class BundleImpl implements Bundle
@@ -36,7 +36,7 @@
     private final Felix __m_felix;
 
     private final BundleArchive m_archive;
-    private IModule[] m_modules = new IModule[0];
+    private final List<Module> m_modules = new ArrayList<Module>(0);
     private volatile int m_state;
     private boolean m_useDeclaredActivationPolicy;
     private BundleActivator m_activator = null;
@@ -76,7 +76,7 @@
         m_activator = null;
         m_context = null;
 
-        IModule module = createModule();
+        Module module = createModule();
         addModule(module);
     }
 
@@ -127,10 +127,10 @@
     {
         // Remove the bundle's associated modules from the resolver state
         // and close them.
-        for (int i = 0; i < m_modules.length; i++)
+        for (int i = 0; i < m_modules.size(); i++)
         {
-            getFramework().getResolverState().removeModule(m_modules[i]);
-            ((ModuleImpl) m_modules[i]).close();
+            getFramework().getResolverState().removeModule(m_modules.get(i));
+            ((ModuleImpl) m_modules.get(i)).close();
         }
     }
 
@@ -143,9 +143,9 @@
      */
     synchronized void cleanAfterUninstall()
     {
-        for (int i = 0; i < m_modules.length; i++)
+        for (int i = 0; i < m_modules.size(); i++)
         {
-            getFramework().getResolverState().unmergeFragment(m_modules[i]);
+            getFramework().getResolverState().unmergeFragment(m_modules.get(i));
         }
     }
 
@@ -166,8 +166,8 @@
 
             // Lastly, we want to reset our bundle be reinitializing our state
             // and recreating a module for the newest revision.
-            m_modules = new IModule[0];
-            final IModule module = createModule();
+            m_modules.clear();
+            final Module module = createModule();
             addModule(module);
             m_state = Bundle.INSTALLED;
             m_stale = false;
@@ -398,7 +398,7 @@
                 {
                     for (Iterator it = resourceList.iterator(); it.hasNext(); )
                     {
-                        URL temp = ((IModule) moduleList.get(modIdx)).getEntry(
+                        URL temp = ((Module) moduleList.get(modIdx)).getEntry(
                             it.next() + ".properties");
                         if (temp != null)
                         {
@@ -469,15 +469,15 @@
         // version instead of the fragment itself. If there are
         // no hosts, but the module is a fragment, then just
         // search the module itself.
-        IModule[] hosts = module.getDependentHosts();
-        if ((hosts != null) && (hosts.length > 0))
+        List<Module> hosts = module.getDependentHosts();
+        if ((hosts != null) && (hosts.size() > 0))
         {
-            module = (ModuleImpl) hosts[0];
-            for (int hostIdx = 1; hostIdx < hosts.length; hostIdx++)
+            module = (ModuleImpl) hosts.get(0);
+            for (int hostIdx = 1; hostIdx < hosts.size(); hostIdx++)
             {
-                if (module.getVersion().compareTo(hosts[hostIdx].getVersion()) < 0)
+                if (module.getVersion().compareTo(hosts.get(hostIdx).getVersion()) < 0)
                 {
-                    module = (ModuleImpl) hosts[hostIdx];
+                    module = (ModuleImpl) hosts.get(hostIdx);
                 }
             }
         }
@@ -485,10 +485,10 @@
         // Create a list of the module and any attached fragments.
         List result = new ArrayList();
         result.add(module);
-        IModule[] fragments = module.getFragments();
-        for (int i = 0; (fragments != null) && (i < fragments.length); i++)
+        List<Module> fragments = module.getFragments();
+        if (fragments != null)
         {
-            result.add(fragments[i]);
+            result.addAll(fragments);
         }
         return result;
     }
@@ -831,9 +831,9 @@
 
     synchronized boolean isExtension()
     {
-        for (int i = (m_modules.length - 1); i > -1; i--)
+        for (int i = (m_modules.size() - 1); i > -1; i--)
         {
-            if (m_modules[i].isExtension())
+            if (m_modules.get(i).isExtension())
             {
                 return true;
             }
@@ -977,7 +977,7 @@
 
     synchronized boolean isRemovalPending()
     {
-        return (m_state == Bundle.UNINSTALLED) || (m_modules.length > 1)  || m_stale;
+        return (m_state == Bundle.UNINSTALLED) || (m_modules.size() > 1)  || m_stale;
     }
 
     //
@@ -996,7 +996,7 @@
      * no limit on the potential number of bundle JAR file revisions.
      * @return array of modules corresponding to the bundle JAR file revisions.
     **/
-    synchronized IModule[] getModules()
+    synchronized List<Module> getModules()
     {
         return m_modules;
     }
@@ -1007,11 +1007,11 @@
      * @return <tt>true</tt> if the specified module is in the array of modules
      *         associated with this bundle, <tt>false</tt> otherwise.
     **/
-    synchronized boolean hasModule(IModule module)
+    synchronized boolean hasModule(Module module)
     {
-        for (int i = 0; i < m_modules.length; i++)
+        for (int i = 0; i < m_modules.size(); i++)
         {
-            if (m_modules[i] == module)
+            if (m_modules.get(i) == module)
             {
                 return true;
             }
@@ -1024,20 +1024,20 @@
      * in the module array.
      * @return the newest module.
     **/
-    synchronized IModule getCurrentModule()
+    synchronized Module getCurrentModule()
     {
-        return m_modules[m_modules.length - 1];
+        return m_modules.get(m_modules.size() - 1);
     }
 
     synchronized boolean isUsed()
     {
         boolean used = false;
-        for (int i = 0; !used && (i < m_modules.length); i++)
+        for (int i = 0; !used && (i < m_modules.size()); i++)
         {
-            IModule[] dependents = ((ModuleImpl) m_modules[i]).getDependents();
-            for (int j = 0; (dependents != null) && (j < dependents.length) && !used; j++)
+            List<Module> dependents = ((ModuleImpl) m_modules.get(i)).getDependents();
+            for (int j = 0; (dependents != null) && (j < dependents.size()) && !used; j++)
             {
-                if (dependents[j] != m_modules[i])
+                if (dependents.get(j) != m_modules.get(i))
                 {
                     used = true;
                 }
@@ -1053,7 +1053,7 @@
         m_archive.revise(location, is);
         try
         {
-            IModule module = createModule();
+            Module module = createModule();
             addModule(module);
         }
         catch (Exception ex)
@@ -1072,13 +1072,9 @@
     // system bundle needs to add its module directly to the bundle,
     // since it doesn't have an archive from which the module will
     // be created, which is the normal case.
-    synchronized void addModule(IModule module) throws Exception
+    synchronized void addModule(Module module) throws Exception
     {
-        IModule[] backup = m_modules;
-        IModule[] dest = new IModule[m_modules.length + 1];
-        System.arraycopy(m_modules, 0, dest, 0, m_modules.length);
-        dest[m_modules.length] = module;
-        m_modules = dest;
+        m_modules.add(module);
 
         // Set protection domain after adding the module to the bundle,
         // since this requires that the bundle has a module.
@@ -1093,7 +1089,7 @@
             }
             catch (Exception ex) 
             {
-                m_modules = backup;
+                m_modules.remove(m_modules.size() - 1);
                 throw ex;
             }
         }
@@ -1109,7 +1105,7 @@
         }
     }
 
-    private IModule createModule() throws Exception
+    private Module createModule() throws Exception
     {
         // Get and parse the manifest from the most recent revision to
         // create an associated module for it.
@@ -1161,9 +1157,9 @@
     {
         ProtectionDomain pd = null;
 
-        for (int i = m_modules.length - 1; (i >= 0) && (pd == null); i--)
+        for (int i = m_modules.size() - 1; (i >= 0) && (pd == null); i--)
         {
-            pd = (ProtectionDomain) m_modules[i].getSecurityContext();
+            pd = (ProtectionDomain) m_modules.get(i).getSecurityContext();
         }
 
         return pd;

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleProtectionDomain.java Wed Mar  3 15:09:47 2010
@@ -20,13 +20,12 @@
 
 import java.lang.ref.WeakReference;
 import java.net.MalformedURLException;
-import java.net.URL;
 import java.security.CodeSource;
 import java.security.Permission;
 import java.security.ProtectionDomain;
 import java.security.cert.Certificate;
 
-import org.apache.felix.moduleloader.IModule;
+import org.apache.felix.framework.resolver.Module;
 
 public class BundleProtectionDomain extends ProtectionDomain
 {
@@ -56,9 +55,9 @@
         m_toString = "[" + bundle + "]";
     }
 
-    IModule getModule() 
+    Module getModule() 
     {
-        return (IModule) m_module.get();
+        return (Module) m_module.get();
     }
 
     public boolean implies(Permission permission)

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/ExportedPackageImpl.java Wed Mar  3 15:09:47 2010
@@ -18,8 +18,9 @@
  */
 package org.apache.felix.framework;
 
-import org.apache.felix.framework.util.manifestparser.Capability;
-import org.apache.felix.moduleloader.IModule;
+import java.util.List;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.resolver.Module;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Version;
 import org.osgi.service.packageadmin.ExportedPackage;
@@ -28,18 +29,22 @@
 {
     private final Felix m_felix;
     private final BundleImpl m_exportingBundle;
-    private final IModule m_exportingModule;
+    private final Module m_exportingModule;
     private final Capability m_export;
-    private volatile String m_toString = null;
-    private volatile String m_versionString = null;
+    private final String m_pkgName;
+    private final Version m_version;
 
     public ExportedPackageImpl(
-        Felix felix, BundleImpl exporter, IModule module, Capability export)
+        Felix felix, BundleImpl exporter, Module module, Capability export)
     {
         m_felix = felix;
         m_exportingBundle = exporter;
         m_exportingModule = module;
         m_export = export;
+        m_pkgName = (String) m_export.getAttribute(Capability.PACKAGE_ATTR).getValue();
+        m_version = (m_export.getAttribute(Capability.VERSION_ATTR) == null)
+            ? Version.emptyVersion
+            : (Version) m_export.getAttribute(Capability.VERSION_ATTR).getValue();
     }
 
     public Bundle getExportingBundle()
@@ -59,30 +64,23 @@
         {
             return null;
         }
-        return m_felix.getImportingBundles(this);
+        List<Bundle> list = m_felix.getImportingBundles(this);
+        return list.toArray(new Bundle[list.size()]);
     }
 
     public String getName()
     {
-        return m_export.getPackageName();
+        return m_pkgName;
     }
 
     public String getSpecificationVersion()
     {
-        if (m_versionString == null)
-        {
-            m_versionString = (m_export.getPackageVersion() == null)
-                ? Version.emptyVersion.toString()
-                : m_export.getPackageVersion().toString();
-        }
-        return m_versionString;
+        return m_version.toString();
     }
 
     public Version getVersion()
     {
-        return (m_export.getPackageVersion() == null)
-            ? Version.emptyVersion
-            : m_export.getPackageVersion();
+        return m_version;
     }
 
     public boolean isRemovalPending()
@@ -92,11 +90,6 @@
 
     public String toString()
     {
-        if (m_toString == null)
-        {
-            m_toString = m_export.getPackageName()
-                + "; version=" + getSpecificationVersion();
-        }
-        return m_toString;
+        return m_pkgName + "; version=" + m_version;
     }
 }
\ No newline at end of file

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java Wed Mar  3 15:09:47 2010
@@ -38,17 +38,16 @@
 import java.util.Set;
 
 import org.apache.felix.framework.Felix.FelixResolver;
-import org.apache.felix.framework.ModuleImpl;
+import org.apache.felix.framework.capabilityset.Attribute;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.capabilityset.Directive;
+import org.apache.felix.framework.resolver.Module;
 import org.apache.felix.framework.util.FelixConstants;
 import org.apache.felix.framework.util.StringMap;
 import org.apache.felix.framework.util.Util;
-import org.apache.felix.framework.util.manifestparser.Capability;
+import org.apache.felix.framework.util.manifestparser.CapabilityImpl;
 import org.apache.felix.framework.util.manifestparser.ManifestParser;
-import org.apache.felix.framework.util.manifestparser.R4Attribute;
-import org.apache.felix.framework.util.manifestparser.R4Directive;
-import org.apache.felix.moduleloader.ICapability;
-import org.apache.felix.moduleloader.IContent;
-import org.apache.felix.moduleloader.IModule;
+import org.apache.felix.framework.resolver.Content;
 import org.osgi.framework.AdminPermission;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleActivator;
@@ -80,7 +79,7 @@
 // with the parent classloader and one instance per framework instance that
 // keeps track of extension bundles and systembundle exports for that framework
 // instance.
-class ExtensionManager extends URLStreamHandler implements IContent
+class ExtensionManager extends URLStreamHandler implements Content
 {
     // The private instance that is added to Felix.class.getClassLoader() -
     // will be null if extension bundles are not supported (i.e., we are not
@@ -119,8 +118,8 @@
 
     private final Logger m_logger;
     private final Map m_headerMap = new StringMap(false);
-    private final IModule m_systemBundleModule;
-    private ICapability[] m_capabilities = null;
+    private final Module m_systemBundleModule;
+    private List<Capability> m_capabilities = null;
     private Set m_exportNames = null;
     private Object m_securityContext = null;
     private final List m_extensions;
@@ -188,12 +187,12 @@
         {
             ManifestParser mp = new ManifestParser(
                 m_logger, felix.getConfig(), m_systemBundleModule, m_headerMap);
-            ICapability[] caps = aliasSymbolicName(mp.getCapabilities());
+            List<Capability> caps = aliasSymbolicName(mp.getCapabilities());
             setCapabilities(caps);
         }
         catch (Exception ex)
         {
-            m_capabilities = new ICapability[0];
+            m_capabilities = new ArrayList<Capability>(0);
             m_logger.log(
                 Logger.LOG_ERROR,
                 "Error parsing system bundle export statement: "
@@ -201,39 +200,39 @@
         }
     }
 
-    private static ICapability[] aliasSymbolicName(ICapability[] caps)
+    private static List<Capability> aliasSymbolicName(List<Capability> caps)
     {
         if (caps == null)
         {
-            return new ICapability[0];
+            return new ArrayList<Capability>(0);
         }
 
-        ICapability[] aliasCaps = new ICapability[caps.length];
-        System.arraycopy(caps, 0, aliasCaps, 0, caps.length);
+        List<Capability> aliasCaps = new ArrayList<Capability>(caps);
 
-        for (int capIdx = 0; capIdx < aliasCaps.length; capIdx++)
+        for (int capIdx = 0; capIdx < aliasCaps.size(); capIdx++)
         {
             // Get the attributes and search for bundle symbolic name.
-            R4Attribute[] attrs = ((Capability) aliasCaps[capIdx]).getAttributes();
-            for (int i = 0; i < attrs.length; i++)
+            List<Attribute> attrs = aliasCaps.get(capIdx).getAttributes();
+            for (int i = 0; i < attrs.size(); i++)
             {
                 // If there is a bundle symbolic name attribute, add the
                 // standard alias as a value.
-                if (attrs[i].getName().equalsIgnoreCase(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE))
+                if (attrs.get(i).getName().equalsIgnoreCase(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE))
                 {
                     // Make a copy of the attribute array.
-                    R4Attribute[] aliasAttrs = new R4Attribute[attrs.length];
-                    System.arraycopy(attrs, 0, aliasAttrs, 0, attrs.length);
+                    List<Attribute> aliasAttrs = new ArrayList<Attribute>(attrs);
                     // Add the aliased value.
-                    aliasAttrs[i] = new R4Attribute(
+                    aliasAttrs.set(i, new Attribute(
                         Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE,
-                        new String[] { (String) attrs[i].getValue(), Constants.SYSTEM_BUNDLE_SYMBOLICNAME }, false);
+                        new String[] {
+                            (String) attrs.get(i).getValue(), Constants.SYSTEM_BUNDLE_SYMBOLICNAME},
+                        false));
                     // Create the aliased capability to replace the old capability.
-                    aliasCaps[capIdx] = new Capability(
-                        caps[capIdx].getModule(),
-                        caps[capIdx].getNamespace(),
-                        ((Capability) caps[capIdx]).getDirectives(),
-                        aliasAttrs);
+                    aliasCaps.set(capIdx, new CapabilityImpl(
+                        caps.get(capIdx).getModule(),
+                        caps.get(capIdx).getNamespace(),
+                        caps.get(capIdx).getDirectives(),
+                        aliasAttrs));
                     // Continue with the next capability.
                     break;
                 }
@@ -243,7 +242,7 @@
         return aliasCaps;
     }
 
-    public IModule getModule()
+    public Module getModule()
     {
         return m_systemBundleModule;
     }
@@ -295,7 +294,7 @@
             throw new SecurityException("Extension Bundles must have AllPermission");
         }
 
-        R4Directive dir = ManifestParser.parseExtensionBundleHeader((String)
+        Directive dir = ManifestParser.parseExtensionBundleHeader((String)
             bundle.getCurrentModule().getHeaders().get(Constants.FRAGMENT_HOST));
 
         // We only support classpath extensions (not bootclasspath).
@@ -312,11 +311,11 @@
 //            bundle.setExtension(true);
 
             // Merge the exported packages with the exported packages of the systembundle.
-            ICapability[] exports = null;
+            List<Capability> exports = null;
             try
             {
                 exports = ManifestParser.parseExportHeader(
-                    m_systemBundleModule,
+                    m_logger, m_systemBundleModule,
                     (String) bundle.getCurrentModule().getHeaders().get(Constants.EXPORT_PACKAGE),
                     m_systemBundleModule.getSymbolicName(), m_systemBundleModule.getVersion());
                 exports = aliasSymbolicName(exports);
@@ -344,9 +343,9 @@
                 throw new UnsupportedOperationException(
                     "Unable to add extension bundle to FrameworkClassLoader - Maybe not an URLClassLoader?");
             }
-            ICapability[] temp = new ICapability[m_capabilities.length + exports.length];
-            System.arraycopy(m_capabilities, 0, temp, 0, m_capabilities.length);
-            System.arraycopy(exports, 0, temp, m_capabilities.length, exports.length);
+            List<Capability> temp = new ArrayList<Capability>(m_capabilities.size() + exports.size());
+            temp.addAll(m_capabilities);
+            temp.addAll(exports);
             setCapabilities(temp);
         }
         catch (Exception ex)
@@ -415,7 +414,7 @@
         }
     }
 
-    private void setCapabilities(ICapability[] capabilities)
+    private void setCapabilities(List<Capability> capabilities)
     {
         m_capabilities = capabilities;
         m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(m_headerMap));
@@ -426,9 +425,9 @@
         StringBuffer exportSB = new StringBuffer("");
         Set exportNames = new HashSet();
 
-        for (int i = 0; (m_capabilities != null) && (i < m_capabilities.length); i++)
+        for (int i = 0; (m_capabilities != null) && (i < m_capabilities.size()); i++)
         {
-            if (m_capabilities[i].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
+            if (m_capabilities.get(i).getNamespace().equals(Capability.PACKAGE_NAMESPACE))
             {
                 // Add a comma separate if there is an existing package.
                 if (exportSB.length() > 0)
@@ -437,13 +436,13 @@
                 }
 
                 // Append exported package information.
-                exportSB.append(((Capability) m_capabilities[i]).getPackageName());
+                exportSB.append(m_capabilities.get(i).getAttribute(Capability.PACKAGE_ATTR).getValue());
                 exportSB.append("; version=\"");
-                exportSB.append(((Capability) m_capabilities[i]).getPackageVersion().toString());
+                exportSB.append(m_capabilities.get(i).getAttribute(Capability.VERSION_ATTR).getValue());
                 exportSB.append("\"");
 
                 // Remember exported packages.
-                exportNames.add(((Capability) m_capabilities[i]).getPackageName());
+                exportNames.add(m_capabilities.get(i).getAttribute(Capability.PACKAGE_ATTR).getValue());
             }
         }
 
@@ -568,7 +567,7 @@
         return null;
     }
 
-    public IContent getEntryAsContent(String name)
+    public Content getEntryAsContent(String name)
     {
         return null;
     }
@@ -651,7 +650,7 @@
             }
         }
 
-        public ICapability[] getCapabilities()
+        public List<Capability> getCapabilities()
         {
             synchronized (ExtensionManager.this)
             {
@@ -714,7 +713,7 @@
             return null;
         }
 
-        public void attachFragmentContents(IContent[] fragmentContents)
+        public void attachFragmentContents(Content[] fragmentContents)
             throws Exception
         {
             throw new UnsupportedOperationException("Should not be used!");
@@ -725,7 +724,7 @@
             // Nothing needed here.
         }
 
-        public IContent getContent()
+        public Content getContent()
         {
             return ExtensionManager.this;
         }

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java Wed Mar  3 15:09:47 2010
@@ -23,16 +23,56 @@
 import java.net.*;
 import java.security.*;
 import java.util.*;
-
-import org.apache.felix.framework.cache.*;
-import org.apache.felix.framework.ext.SecurityProvider;
-import org.apache.felix.framework.searchpolicy.*;
+import java.util.Map.Entry;
+import org.apache.felix.framework.ModuleImpl.FragmentRequirement;
 import org.apache.felix.framework.ServiceRegistry.ServiceRegistryCallbacks;
-import org.apache.felix.framework.util.*;
-import org.apache.felix.framework.util.manifestparser.*;
-import org.apache.felix.moduleloader.*;
-import org.osgi.framework.*;
-import org.osgi.framework.hooks.service.*;
+import org.apache.felix.framework.cache.BundleArchive;
+import org.apache.felix.framework.cache.BundleCache;
+import org.apache.felix.framework.capabilityset.Attribute;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.capabilityset.CapabilitySet;
+import org.apache.felix.framework.capabilityset.Directive;
+import org.apache.felix.framework.resolver.Module;
+import org.apache.felix.framework.capabilityset.Requirement;
+import org.apache.felix.framework.resolver.Wire;
+import org.apache.felix.framework.ext.SecurityProvider;
+import org.apache.felix.framework.resolver.ResolveException;
+import org.apache.felix.framework.resolver.Resolver;
+import org.apache.felix.framework.resolver.ResolverImpl;
+import org.apache.felix.framework.util.EventDispatcher;
+import org.apache.felix.framework.util.FelixConstants;
+import org.apache.felix.framework.util.ListenerHookInfoImpl;
+import org.apache.felix.framework.util.MapToDictionary;
+import org.apache.felix.framework.util.SecureAction;
+import org.apache.felix.framework.util.ShrinkableCollection;
+import org.apache.felix.framework.util.StringMap;
+import org.apache.felix.framework.util.ThreadGate;
+import org.apache.felix.framework.util.Util;
+import org.apache.felix.framework.util.manifestparser.R4LibraryClause;
+import org.apache.felix.framework.util.manifestparser.RequirementImpl;
+import org.osgi.framework.AdminPermission;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceException;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServicePermission;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.hooks.service.FindHook;
+import org.osgi.framework.hooks.service.ListenerHook;
 import org.osgi.service.packageadmin.ExportedPackage;
 import org.osgi.service.startlevel.StartLevel;
 
@@ -294,7 +334,7 @@
         // Create a resolver and its state.
         m_resolverState = new FelixResolverState(m_logger);
         m_felixResolver = new FelixResolver(
-            new Resolver(m_logger,
+            new ResolverImpl(m_logger,
                 (String) m_configMap.get(Constants.FRAMEWORK_EXECUTIONENVIRONMENT)),
             m_resolverState);
 
@@ -1579,7 +1619,7 @@
 
         // Record whether the bundle is using its declared activation policy.
         boolean wasDeferred = bundle.isDeclaredActivationPolicyUsed()
-            && (bundle.getCurrentModule().getDeclaredActivationPolicy() == IModule.LAZY_ACTIVATION);
+            && (bundle.getCurrentModule().getDeclaredActivationPolicy() == Module.LAZY_ACTIVATION);
         bundle.setDeclaredActivationPolicyUsed(
             (options & Bundle.START_ACTIVATION_POLICY) != 0);
 
@@ -1667,7 +1707,7 @@
             // If the bundle's activation policy is eager or activation has already
             // been triggered, then activate the bundle immediately.
             if (!bundle.isDeclaredActivationPolicyUsed()
-                || (bundle.getCurrentModule().getDeclaredActivationPolicy() != IModule.LAZY_ACTIVATION)
+                || (bundle.getCurrentModule().getDeclaredActivationPolicy() != Module.LAZY_ACTIVATION)
                 || ((ModuleImpl) bundle.getCurrentModule()).isActivationTriggered())
             {
                 // Record the event type for the final event and activate.
@@ -2090,7 +2130,7 @@
                     throw new IllegalStateException("Cannot stop an uninstalled bundle.");
                 case Bundle.STARTING:
                     if (bundle.isDeclaredActivationPolicyUsed()
-                        && bundle.getCurrentModule().getDeclaredActivationPolicy() != IModule.LAZY_ACTIVATION)
+                        && bundle.getCurrentModule().getDeclaredActivationPolicy() != Module.LAZY_ACTIVATION)
                     {
                         throw new BundleException(
                             "Stopping a starting or stopping bundle is currently not supported.");
@@ -2469,7 +2509,6 @@
                             "Could not remove from cache.", ex1);
                     }
                 }
-
                 if (ex instanceof BundleException)
                 {
                     throw (BundleException) ex;
@@ -2990,26 +3029,29 @@
     ExportedPackage[] getExportedPackages(String pkgName)
     {
         // First, get all exporters of the package.
-        List exports =
-            m_resolverState.getResolvedCandidates(
-                new Requirement(
-                    ICapability.PACKAGE_NAMESPACE,
-                    null,
-                    new R4Attribute[] { new R4Attribute(ICapability.PACKAGE_PROPERTY, pkgName, false) }), null);
+        List<Directive> dirs = new ArrayList<Directive>(0);
+        List<Attribute> attrs = new ArrayList<Attribute>(1);
+        attrs.add(new Attribute(Capability.PACKAGE_ATTR, pkgName, false));
+        Requirement req = new RequirementImpl(Capability.PACKAGE_NAMESPACE, dirs, attrs);
+        Set<Capability> exports = m_resolverState.getCandidates(null, req, false);
+
+        // We only want resolved capabilities.
+        for (Iterator<Capability> it = exports.iterator(); it.hasNext(); )
+        {
+            if (!it.next().getModule().isResolved())
+            {
+                it.remove();
+            }
+        }
 
         if (exports != null)
         {
             List pkgs = new ArrayList();
 
-            Requirement req = new Requirement(ICapability.PACKAGE_NAMESPACE,
-                null,
-                new R4Attribute[] { new R4Attribute(ICapability.PACKAGE_PROPERTY, pkgName, false) });
-
-            for (int pkgIdx = 0; pkgIdx < exports.size(); pkgIdx++)
+            for (Iterator<Capability> it = exports.iterator(); it.hasNext(); )
             {
                 // Get the bundle associated with the current exporting module.
-                BundleImpl bundle = (BundleImpl)
-                    ((ICapability) exports.get(pkgIdx)).getModule().getBundle();
+                BundleImpl bundle = (BundleImpl) it.next().getModule().getBundle();
 
                 // We need to find the version of the exported package, but this
                 // is tricky since there may be multiple versions of the package
@@ -3021,16 +3063,18 @@
                 // that the first module found to be exporting the package is the
                 // provider of the package, which makes sense since it must have
                 // been resolved first.
-                IModule[] modules = bundle.getModules();
-                for (int modIdx = 0; modIdx < modules.length; modIdx++)
+                List<Module> modules = bundle.getModules();
+                for (int modIdx = 0; modIdx < modules.size(); modIdx++)
                 {
-                    ICapability[] ec = modules[modIdx].getCapabilities();
-                    for (int i = 0; (ec != null) && (i < ec.length); i++)
+                    List<Capability> ec = modules.get(modIdx).getCapabilities();
+                    for (int i = 0; (ec != null) && (i < ec.size()); i++)
                     {
-                        if (ec[i].getNamespace().equals(req.getNamespace()) &&
-                            req.isSatisfied(ec[i]))
+                        if (ec.get(i).getNamespace().equals(req.getNamespace())
+                            && CapabilitySet.matches(ec.get(i), req.getFilter()))
                         {
-                            pkgs.add(new ExportedPackageImpl(this, bundle, modules[modIdx], (Capability) ec[i]));
+                            pkgs.add(
+                                new ExportedPackageImpl(
+                                    this, bundle, modules.get(modIdx), ec.get(i)));
                         }
                     }
                 }
@@ -3111,31 +3155,43 @@
         // Since a bundle may have many modules associated with it,
         // one for each revision in the cache, search each module
         // for each revision to get all exports.
-        IModule[] modules = bundle.getModules();
-        for (int modIdx = 0; modIdx < modules.length; modIdx++)
+        List<Module> modules = bundle.getModules();
+        for (int modIdx = 0; modIdx < modules.size(); modIdx++)
         {
-            ICapability[] caps = modules[modIdx].getCapabilities();
-            if ((caps != null) && (caps.length > 0))
+            List<Capability> caps = modules.get(modIdx).getCapabilities();
+            if ((caps != null) && (caps.size() > 0))
             {
-                for (int capIdx = 0; capIdx < caps.length; capIdx++)
+                for (int capIdx = 0; capIdx < caps.size(); capIdx++)
                 {
                     // See if the target bundle's module is one of the
                     // resolved exporters of the package.
-                    if (caps[capIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
+                    if (caps.get(capIdx).getNamespace().equals(Capability.PACKAGE_NAMESPACE))
                     {
-                        List resolvedCaps = m_resolverState.getResolvedCandidates(
-                            new Requirement(
-                                ICapability.PACKAGE_NAMESPACE,
-                                null,
-                                new R4Attribute[] { new R4Attribute(ICapability.PACKAGE_PROPERTY, ((Capability) caps[capIdx]).getPackageName(), false) }), null);
+                        String pkgName = (String)
+                            caps.get(capIdx).getAttribute(Capability.PACKAGE_ATTR).getValue();
+                        List<Directive> dirs = new ArrayList<Directive>(0);
+                        List<Attribute> attrs = new ArrayList<Attribute>(1);
+                        attrs.add(new Attribute(Capability.PACKAGE_ATTR, pkgName, false));
+                        Requirement req =
+                            new RequirementImpl(Capability.PACKAGE_NAMESPACE, dirs, attrs);
+                        Set<Capability> exports = m_resolverState.getCandidates(null, req, false);
+                        // We only want resolved capabilities.
+                        for (Iterator<Capability> it = exports.iterator(); it.hasNext(); )
+                        {
+                            if (!it.next().getModule().isResolved())
+                            {
+                                it.remove();
+                            }
+                        }
+
 
                         // Search through the current providers to find the target module.
-                        for (int i = 0; (resolvedCaps != null) && (i < resolvedCaps.size()); i++)
+                        for (Capability cap : exports)
                         {
-                            if ((ICapability) resolvedCaps.get(i) == caps[capIdx])
+                            if (cap == caps.get(capIdx))
                             {
                                 list.add(new ExportedPackageImpl(
-                                    this, bundle, modules[modIdx], (Capability) caps[capIdx]));
+                                    this, bundle, modules.get(modIdx), caps.get(capIdx)));
                             }
                         }
                     }
@@ -3144,70 +3200,64 @@
         }
     }
 
-    Bundle[] getDependentBundles(BundleImpl exporter)
+    List<Bundle> getDependentBundles(BundleImpl exporter)
     {
         // Create list for storing importing bundles.
-        List list = new ArrayList();
+        List<Bundle> list = new ArrayList();
 
         // Get all dependent modules from all exporter module revisions.
-        IModule[] modules = exporter.getModules();
-        for (int modIdx = 0; modIdx < modules.length; modIdx++)
+        List<Module> modules = exporter.getModules();
+        for (int modIdx = 0; modIdx < modules.size(); modIdx++)
         {
-            IModule[] dependents = ((ModuleImpl) modules[modIdx]).getDependents();
+            List<Module> dependents = ((ModuleImpl) modules.get(modIdx)).getDependents();
             for (int depIdx = 0;
-                (dependents != null) && (depIdx < dependents.length);
+                (dependents != null) && (depIdx < dependents.size());
                 depIdx++)
             {
-                list.add(dependents[depIdx].getBundle());
+                list.add(dependents.get(depIdx).getBundle());
             }
         }
 
-        // Return the results.
-        if (list.size() > 0)
-        {
-            return (Bundle[]) list.toArray(new Bundle[list.size()]);
-        }
-
-        return null;
+        return list;
     }
 
-    Bundle[] getImportingBundles(ExportedPackage ep)
+    List<Bundle> getImportingBundles(ExportedPackage ep)
     {
         // Create list for storing importing bundles.
-        List list = new ArrayList();
+        List<Bundle> list = new ArrayList();
 
         // Get exporting bundle information.
         BundleImpl exporter = (BundleImpl) ep.getExportingBundle();
 
         // Get all importers and requirers for all revisions of the bundle.
         // The spec says that require-bundle should be returned with importers.
-        IModule[] expModules = exporter.getModules();
-        for (int expIdx = 0; (expModules != null) && (expIdx < expModules.length); expIdx++)
+        List<Module> expModules = exporter.getModules();
+        for (int expIdx = 0; (expModules != null) && (expIdx < expModules.size()); expIdx++)
         {
             // Include any importers that have wires to the specific
             // exported package.
-            IModule[] dependents = ((ModuleImpl) expModules[expIdx]).getDependentImporters();
-            for (int depIdx = 0; (dependents != null) && (depIdx < dependents.length); depIdx++)
+            List<Module> dependents = ((ModuleImpl) expModules.get(expIdx)).getDependentImporters();
+            for (int depIdx = 0; (dependents != null) && (depIdx < dependents.size()); depIdx++)
             {
-                IWire[] wires = dependents[depIdx].getWires();
-                for (int wireIdx = 0; (wires != null) && (wireIdx < wires.length); wireIdx++)
+                List<Wire> wires = dependents.get(depIdx).getWires();
+                for (int wireIdx = 0; (wires != null) && (wireIdx < wires.size()); wireIdx++)
                 {
-                    if ((wires[wireIdx].getExporter() == expModules[expIdx])
-                        && (wires[wireIdx].hasPackage(ep.getName())))
+                    if ((wires.get(wireIdx).getExporter() == expModules.get(expIdx))
+                        && (wires.get(wireIdx).hasPackage(ep.getName())))
                     {
-                        list.add(dependents[depIdx].getBundle());
+                        list.add(dependents.get(depIdx).getBundle());
                     }
                 }
             }
-            dependents = ((ModuleImpl) expModules[expIdx]).getDependentRequirers();
-            for (int depIdx = 0; (dependents != null) && (depIdx < dependents.length); depIdx++)
+            dependents = ((ModuleImpl) expModules.get(expIdx)).getDependentRequirers();
+            for (int depIdx = 0; (dependents != null) && (depIdx < dependents.size()); depIdx++)
             {
-                list.add(dependents[depIdx].getBundle());
+                list.add(dependents.get(depIdx).getBundle());
             }
         }
 
         // Return the results.
-        return (Bundle[]) list.toArray(new Bundle[list.size()]);
+        return list;
     }
 
     boolean resolveBundles(Bundle[] targets)
@@ -3473,20 +3523,20 @@
     private void populateDependentGraph(BundleImpl exporter, Map map)
     {
         // Get all dependent bundles of this bundle.
-        Bundle[] dependents = getDependentBundles(exporter);
+        List<Bundle> dependents = getDependentBundles(exporter);
 
         for (int depIdx = 0;
-            (dependents != null) && (depIdx < dependents.length);
+            (dependents != null) && (depIdx < dependents.size());
             depIdx++)
         {
             // Avoid cycles if the bundle is already in map.
-            if (!map.containsKey(dependents[depIdx]))
+            if (!map.containsKey(dependents.get(depIdx)))
             {
                 // Add each importing bundle to map.
-                map.put(dependents[depIdx], dependents[depIdx]);
+                map.put(dependents.get(depIdx), dependents.get(depIdx));
                 // Now recurse into each bundle to get its importers.
                 populateDependentGraph(
-                    (BundleImpl) dependents[depIdx], map);
+                    (BundleImpl) dependents.get(depIdx), map);
             }
         }
     }
@@ -3819,7 +3869,7 @@
             m_resolverState = resolverState;
         }
 
-        public void resolve(IModule rootModule) throws ResolveException
+        public void resolve(Module rootModule) throws ResolveException
         {
             // Although there is a race condition to check the bundle state
             // then lock it, we do this because we don't want to acquire the
@@ -3850,14 +3900,44 @@
                     // must find a host to attach it to and resolve the host
                     // instead, since the underlying resolver doesn't know
                     // how to deal with fragments.
-                    IModule newRootModule = m_resolverState.findHost(rootModule);
+                    Module newRootModule = m_resolverState.findHost(rootModule);
                     if (!Util.isFragment(newRootModule))
                     {
-                        // Resolve the module.
-                        Map resolvedModuleWireMap = m_resolver.resolve(m_resolverState, newRootModule);
+                        // Check singleton status.
+                        m_resolverState.checkSingleton(newRootModule);
 
-                        // Mark all modules as resolved.
-                        markResolvedModules(resolvedModuleWireMap);
+                        boolean repeat;
+                        do
+                        {
+                            repeat = false;
+                            try
+                            {
+                                // Resolve the module.
+                                Map<Module, List<Wire>> wireMap =
+                                    m_resolver.resolve(m_resolverState, newRootModule);
+
+                                // Mark all modules as resolved.
+                                markResolvedModules(wireMap);
+                            }
+                            catch (ResolveException ex)
+                            {
+                                if ((ex.getRequirement() != null)
+                                    && (ex.getRequirement() instanceof FragmentRequirement)
+                                    && (rootModule !=
+                                        ((FragmentRequirement) ex.getRequirement()).getFragment()))
+                                {
+                                    m_resolverState.detachFragment(
+                                        newRootModule,
+                                        ((FragmentRequirement) ex.getRequirement()).getFragment());
+                                    repeat = true;
+                                }
+                                else
+                                {
+                                    throw ex;
+                                }
+                            }
+                        }
+                        while (repeat);
                     }
                 }
                 finally
@@ -3868,24 +3948,23 @@
             }
         }
 
-        public IWire resolveDynamicImport(IModule importer, String pkgName) throws ResolveException
+        public Wire resolve(Module module, String pkgName) throws ResolveException
         {
-            IWire candidateWire = null;
-
-            // We cannot dynamically import if the module is already resolved or
-            // if it is not allowed, so check that first. Note: We check if the
+            Wire candidateWire = null;
+            // We cannot dynamically import if the module is not already resolved
+            // or if it is not allowed, so check that first. Note: We check if the
             // dynamic import is allowed without holding any locks, but this is
             // okay since the resolver will double check later after we have
             // acquired the global lock below.
-            if (importer.isResolved()
-                && (Resolver.findAllowedDynamicImport(importer, pkgName) != null))
+            if (module.isResolved()
+                && (ResolverImpl.isAllowedDynamicImport(m_resolverState, module, pkgName, new HashMap())))
             {
                 // Acquire global lock.
                 boolean locked = acquireGlobalLock();
                 if (!locked)
                 {
                     throw new ResolveException(
-                        "Unable to acquire global lock for resolve.", importer, null);
+                        "Unable to acquire global lock for resolve.", module, null);
                 }
 
                 try
@@ -3894,42 +3973,34 @@
                     // dynamically importing the package, which can happen if two
                     // threads are racing to do so. If we have an existing wire,
                     // then just return it instead.
-                    IWire[] wires = importer.getWires();
-                    for (int i = 0; (wires != null) && (i < wires.length); i++)
+                    List<Wire> wires = module.getWires();
+                    for (int i = 0; (wires != null) && (i < wires.size()); i++)
                     {
-                        if (wires[i].hasPackage(pkgName))
+                        if (wires.get(i).hasPackage(pkgName))
                         {
-                            return wires[i];
+                            return wires.get(i);
                         }
                     }
 
-                    Object[] result = m_resolver.resolveDynamicImport(m_resolverState, importer, pkgName);
-                    if (result != null)
+                    Map<Module, List<Wire>> wireMap =
+                        m_resolver.resolve(m_resolverState, module, pkgName);
+
+                    if ((wireMap != null) && wireMap.containsKey(module))
                     {
-                        candidateWire = (IWire) result[0];
-                        Map resolvedModuleWireMap = (Map) result[1];
+                        List<Wire> dynamicWires = wireMap.remove(module);
+                        candidateWire = dynamicWires.get(0);
 
                         // Mark all modules as resolved.
-                        markResolvedModules(resolvedModuleWireMap);
+                        markResolvedModules(wireMap);
 
                         // Dynamically add new wire to importing module.
                         if (candidateWire != null)
                         {
-                            wires = importer.getWires();
-                            IWire[] newWires = null;
-                            if (wires == null)
-                            {
-                                newWires = new IWire[1];
-                            }
-                            else
-                            {
-                                newWires = new IWire[wires.length + 1];
-                                System.arraycopy(wires, 0, newWires, 0, wires.length);
-                            }
-
-                            newWires[newWires.length - 1] = candidateWire;
-                            ((ModuleImpl) importer).setWires(newWires);
-m_logger.log(Logger.LOG_DEBUG, "DYNAMIC WIRE: " + newWires[newWires.length - 1]);
+                            wires = new ArrayList(wires.size() + 1);
+                            wires.addAll(module.getWires());
+                            wires.add(candidateWire);
+                            ((ModuleImpl) module).setWires(wires);
+m_logger.log(Logger.LOG_DEBUG, "DYNAMIC WIRE: " + wires.get(wires.size() - 1));
                         }
                     }
                 }
@@ -3943,58 +4014,45 @@
             return candidateWire;
         }
 
-        public synchronized List getResolvedCandidates(IRequirement req, IModule reqModule)
-        {
-            return m_resolverState.getResolvedCandidates(req, reqModule);
-        }
-
-        public synchronized List getUnresolvedCandidates(IRequirement req, IModule reqModule)
+        public synchronized Set<Capability> getCandidates(
+            Module reqModule, Requirement req, boolean obeyMandatory)
         {
-            return m_resolverState.getUnresolvedCandidates(req, reqModule);
+            return m_resolverState.getCandidates(reqModule, req, obeyMandatory);
         }
 
-        private void markResolvedModules(Map resolvedModuleWireMap)
+        private void markResolvedModules(Map<Module, List<Wire>> wireMap)
         {
-            if (resolvedModuleWireMap != null)
+            if (wireMap != null)
             {
-                Iterator iter = resolvedModuleWireMap.entrySet().iterator();
+                Iterator<Entry<Module, List<Wire>>> iter = wireMap.entrySet().iterator();
                 // Iterate over the map to mark the modules as resolved and
                 // update our resolver data structures.
-                List wireList = new ArrayList();
                 while (iter.hasNext())
                 {
-                    wireList.clear();
-
-                    Map.Entry entry = (Map.Entry) iter.next();
-                    IModule module = (IModule) entry.getKey();
-                    IWire[] wires = (IWire[]) entry.getValue();
+                    Entry<Module, List<Wire>> entry = iter.next();
+                    Module module = entry.getKey();
+                    List<Wire> wires = entry.getValue();
 
                     // Only add wires attribute if some exist; export
                     // only modules may not have wires.
-// TODO: RESOLVER - Seems stupid that we package these up as wires to tear them apart.
-                    if (wires.length > 0)
+                    for (int wireIdx = 0; wireIdx < wires.size(); wireIdx++)
                     {
-                        for (int wireIdx = 0; wireIdx < wires.length; wireIdx++)
-                        {
-                            wireList.add(wires[wireIdx]);
-                            m_logger.log(
-                                Logger.LOG_DEBUG,
-                                "WIRE: " + wires[wireIdx]);
-                        }
-                        wires = (IWire[]) wireList.toArray(new IWire[wireList.size()]);
-                        ((ModuleImpl) module).setWires(wires);
+                        m_logger.log(
+                            Logger.LOG_DEBUG,
+                            "WIRE: " + wires.get(wireIdx));
                     }
+                    ((ModuleImpl) module).setWires(wires);
 
                     // Resolve all attached fragments.
-                    IModule[] fragments = ((ModuleImpl) module).getFragments();
-                    for (int i = 0; (fragments != null) && (i < fragments.length); i++)
+                    List<Module> fragments = ((ModuleImpl) module).getFragments();
+                    for (int i = 0; (fragments != null) && (i < fragments.size()); i++)
                     {
-                        ((ModuleImpl) fragments[i]).setResolved();
+                        ((ModuleImpl) fragments.get(i)).setResolved();
                         // Update the state of the module's bundle to resolved as well.
-                        markBundleResolved(fragments[i]);
+                        markBundleResolved(fragments.get(i));
                         m_logger.log(
                             Logger.LOG_DEBUG,
-                            "FRAGMENT WIRE: " + fragments[i] + " -> hosted by -> " + module);
+                            "FRAGMENT WIRE: " + fragments.get(i) + " -> hosted by -> " + module);
                     }
                     // Update the resolver state to show the module as resolved.
                     ((ModuleImpl) module).setResolved();
@@ -4005,7 +4063,7 @@
             }
         }
 
-        private void markBundleResolved(IModule module)
+        private void markBundleResolved(Module module)
         {
             // Update the bundle's state to resolved when the
             // current module is resolved; just ignore resolve

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/FindEntriesEnumeration.java Wed Mar  3 15:09:47 2010
@@ -19,18 +19,18 @@
 package org.apache.felix.framework;
 
 import java.util.*;
+import org.apache.felix.framework.resolver.Module;
 
 import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IModule;
 
 class FindEntriesEnumeration implements Enumeration
 {
     private final BundleImpl m_bundle;
-    private final Enumeration[] m_enumerations;
-    private final IModule[] m_modules;
+    private final List<Enumeration> m_enumerations;
+    private final List<Module> m_modules;
     private int m_moduleIndex = 0;
     private final String m_path;
-    private final String[] m_filePattern;
+    private final List<String> m_filePattern;
     private final boolean m_recurse;
     private Object m_next = null;
 
@@ -38,23 +38,20 @@
         BundleImpl bundle, String path, String filePattern, boolean recurse)
     {
         m_bundle = bundle;
-        IModule bundleModule = m_bundle.getCurrentModule();
-        IModule[] fragmentModules = ((ModuleImpl) bundleModule).getFragments();
+        Module bundleModule = m_bundle.getCurrentModule();
+        List<Module> fragmentModules = ((ModuleImpl) bundleModule).getFragments();
         if (fragmentModules == null)
         {
-            fragmentModules = new IModule[0];
+            fragmentModules = new ArrayList<Module>(0);
         }
-        m_modules = new IModule[fragmentModules.length + 1];
-        m_modules[0] = bundleModule;
-        for (int i = 0; i < fragmentModules.length; i++)
+        m_modules = new ArrayList<Module>(fragmentModules.size() + 1);
+        m_modules.add(bundleModule);
+        m_modules.addAll(fragmentModules);
+        m_enumerations = new ArrayList<Enumeration>(m_modules.size());
+        for (int i = 0; i < m_modules.size(); i++)
         {
-            m_modules[i + 1] = fragmentModules[i];
-        }
-        m_enumerations = new Enumeration[m_modules.length];
-        for (int i = 0; i < m_modules.length; i++)
-        {
-            m_enumerations[i] = m_modules[i].getContent() != null ?
-                m_modules[i].getContent().getEntries() : null;
+            m_enumerations.add(m_modules.get(i).getContent() != null ?
+                m_modules.get(i).getContent().getEntries() : null);
         }
         m_recurse = recurse;
 
@@ -109,13 +106,13 @@
         {
             return null;
         }
-        while (m_moduleIndex < m_enumerations.length)
+        while (m_moduleIndex < m_enumerations.size())
         {
-            while (m_enumerations[m_moduleIndex] != null
-                &&  m_enumerations[m_moduleIndex].hasMoreElements())
+            while (m_enumerations.get(m_moduleIndex) != null
+                &&  m_enumerations.get(m_moduleIndex).hasMoreElements())
             {
                 // Get the next entry name.
-                String entryName = (String) m_enumerations[m_moduleIndex].nextElement();
+                String entryName = (String) m_enumerations.get(m_moduleIndex).nextElement();
                 // Check to see if it is a descendent of the specified path.
                 if (!entryName.equals(m_path) && entryName.startsWith(m_path))
                 {
@@ -141,7 +138,7 @@
                         if (Util.checkSubstring(m_filePattern, lastElement))
                         {
                             // Convert entry name into an entry URL.
-                            return m_modules[m_moduleIndex].getEntry(entryName);
+                            return m_modules.get(m_moduleIndex).getEntry(entryName);
                         }
                     }
                 }

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/PackageAdminImpl.java Wed Mar  3 15:09:47 2010
@@ -19,13 +19,16 @@
 package org.apache.felix.framework;
 
 import java.util.*;
-
-import org.apache.felix.framework.ModuleImpl;
-import org.apache.felix.framework.util.Util;
+import org.apache.felix.framework.resolver.Module;
 import org.apache.felix.framework.util.VersionRange;
-import org.apache.felix.moduleloader.IModule;
-import org.osgi.framework.*;
-import org.osgi.service.packageadmin.*;
+import org.osgi.framework.AdminPermission;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.service.packageadmin.RequiredBundle;
+
 
 class PackageAdminImpl implements PackageAdmin, Runnable
 {
@@ -191,14 +194,14 @@
         if ((getBundleType(bundle) & BUNDLE_TYPE_FRAGMENT) == 0)
         {
             // Get attached fragments.
-            IModule[] modules =
+            List<Module> modules =
                 ((ModuleImpl)
                     ((BundleImpl) bundle).getCurrentModule()).getFragments();
             // Convert fragment modules to bundles.
             List list = new ArrayList();
-            for (int i = 0; (modules != null) && (i < modules.length); i++)
+            for (int i = 0; (modules != null) && (i < modules.size()); i++)
             {
-                Bundle b = modules[i].getBundle();
+                Bundle b = modules.get(i).getBundle();
                 if (b != null)
                 {
                     list.add(b);
@@ -216,7 +219,11 @@
     {
         if (getBundleType(bundle) == BUNDLE_TYPE_FRAGMENT)
         {
-            return m_felix.getDependentBundles((BundleImpl) bundle);
+            List<Bundle> hosts = m_felix.getDependentBundles((BundleImpl) bundle);
+            if (hosts != null)
+            {
+                return hosts.toArray(new Bundle[hosts.size()]);
+            }
         }
         return null;
     }
@@ -347,4 +354,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/RequiredBundleImpl.java Wed Mar  3 15:09:47 2010
@@ -18,16 +18,11 @@
  */
 package org.apache.felix.framework;
 
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.apache.felix.framework.ModuleImpl;
-import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.ICapability;
-import org.apache.felix.moduleloader.IModule;
+import org.apache.felix.framework.resolver.Module;
 import org.osgi.framework.Bundle;
-import org.osgi.framework.Constants;
 import org.osgi.framework.Version;
 import org.osgi.service.packageadmin.RequiredBundle;
 
@@ -67,17 +62,17 @@
         // of the dependent modules.
         Set bundleSet = new HashSet();
         // Loop through all of this bundle's modules.
-        IModule[] modules = m_bundle.getModules();
-        for (int modIdx = 0; (modules != null) && (modIdx < modules.length); modIdx++)
+        List<Module> modules = m_bundle.getModules();
+        for (int modIdx = 0; (modules != null) && (modIdx < modules.size()); modIdx++)
         {
             // For each of this bundle's modules, loop through all of the
             // modules that require it and add them to the module list.
-            IModule[] dependents = ((ModuleImpl) modules[modIdx]).getDependentRequirers();
-            for (int depIdx = 0; (dependents != null) && (depIdx < dependents.length); depIdx++)
+            List<Module> dependents = ((ModuleImpl) modules.get(modIdx)).getDependentRequirers();
+            for (int depIdx = 0; (dependents != null) && (depIdx < dependents.size()); depIdx++)
             {
-                if (dependents[depIdx].getBundle() != null)
+                if (dependents.get(depIdx).getBundle() != null)
                 {
-                    bundleSet.add(dependents[depIdx].getBundle());
+                    bundleSet.add(dependents.get(depIdx).getBundle());
                 }
             }
         }

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java Wed Mar  3 15:09:47 2010
@@ -22,12 +22,12 @@
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 import java.util.*;
+import org.apache.felix.framework.resolver.Module;
+import org.apache.felix.framework.resolver.Wire;
 
 import org.apache.felix.framework.util.MapToDictionary;
 import org.apache.felix.framework.util.StringMap;
 import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IModule;
-import org.apache.felix.moduleloader.IWire;
 import org.osgi.framework.*;
 import org.osgi.framework.BundleReference;
 
@@ -434,12 +434,12 @@
             // Get the package.
             String pkgName =
                 Util.getClassPackage(className);
-            IModule requesterModule = ((BundleImpl) requester).getCurrentModule();
+            Module requesterModule = ((BundleImpl) requester).getCurrentModule();
             // Get package wiring from service requester.
-            IWire requesterWire = Util.getWire(requesterModule, pkgName);
+            Wire requesterWire = Util.getWire(requesterModule, pkgName);
             // Get package wiring from service provider.
-            IModule providerModule = ((BundleImpl) m_bundle).getCurrentModule();
-            IWire providerWire = Util.getWire(providerModule, pkgName);
+            Module providerModule = ((BundleImpl) m_bundle).getCurrentModule();
+            Wire providerWire = Util.getWire(providerModule, pkgName);
 
             // There are four situations that may occur here:
             //   1. Neither the requester, nor provider have wires for the package.

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlersBundleURLConnection.java Wed Mar  3 15:09:47 2010
@@ -23,14 +23,15 @@
 import java.net.URL;
 import java.net.URLConnection;
 import java.security.Permission;
+import java.util.List;
+import org.apache.felix.framework.resolver.Module;
 
 import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IModule;
 
 class URLHandlersBundleURLConnection extends URLConnection
 {
     private Felix m_framework;
-    private IModule m_targetModule;
+    private Module m_targetModule;
     private int m_classPathIdx = -1;
     private int m_contentLength;
     private long m_contentTime;
@@ -77,8 +78,8 @@
         m_contentTime = bundle.getLastModified();
 
         int revision = Util.getModuleRevisionFromModuleId(url.getHost());
-        IModule[] modules = bundle.getModules();
-        if ((modules == null) || (revision >= modules.length))
+        List<Module> modules = bundle.getModules();
+        if ((modules == null) || (revision >= modules.size()))
         {
             throw new IOException("Resource does not exist: " + url);
         }
@@ -86,7 +87,7 @@
         // If the revision is not specified, check the latest
         if (revision < 0)
         {
-            revision = modules.length - 1;
+            revision = modules.size() - 1;
         }
 
         // If the resource cannot be found at the current class path index,
@@ -96,15 +97,15 @@
         // Of course, this approach won't work in cases where there are multiple
         // resources with the same path, since it will always find the first
         // one on the class path.
-        m_targetModule = modules[revision];
+        m_targetModule = modules.get(revision);
         m_classPathIdx = url.getPort();
         if (m_classPathIdx < 0)
         {
             m_classPathIdx = 0;
         }
-        if (!modules[revision].hasInputStream(m_classPathIdx, url.getPath()))
+        if (!modules.get(revision).hasInputStream(m_classPathIdx, url.getPath()))
         {
-            URL newurl = modules[revision].getResourceByDelegation(url.getPath());
+            URL newurl = modules.get(revision).getResourceByDelegation(url.getPath());
             if (newurl == null)
             {
                 throw new IOException("Resource does not exist: " + url);

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/BundleRevision.java Wed Mar  3 15:09:47 2010
@@ -22,7 +22,7 @@
 import java.util.Map;
 
 import org.apache.felix.framework.Logger;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
 
 /**
  * <p>
@@ -128,7 +128,7 @@
     **/
     public abstract Map getManifestHeader() throws Exception;
 
-    public abstract IContent getContent() throws Exception;
+    public abstract Content getContent() throws Exception;
 
     /**
      * <p>

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java Wed Mar  3 15:09:47 2010
@@ -18,18 +18,18 @@
  */
 package org.apache.felix.framework.cache;
 
-import org.apache.felix.moduleloader.*;
+import org.apache.felix.framework.resolver.Content;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Enumeration;
 import java.util.NoSuchElementException;
 
-public class ContentDirectoryContent implements IContent
+public class ContentDirectoryContent implements Content
 {
-    private IContent m_content = null;
+    private Content m_content = null;
     private String m_rootPath = null;
 
-    public ContentDirectoryContent(IContent content, String path)
+    public ContentDirectoryContent(Content content, String path)
     {
         m_content = content;
         // Add a '/' to the end if not present.
@@ -82,7 +82,7 @@
         return m_content.getEntryAsStream(m_rootPath + name);
     }
 
-    public IContent getEntryAsContent(String name)
+    public Content getEntryAsContent(String name)
     {
         if ((name.length() > 0) && (name.charAt(0) == '/'))
         {

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java Wed Mar  3 15:09:47 2010
@@ -18,7 +18,7 @@
  */
 package org.apache.felix.framework.cache;
 
-import org.apache.felix.moduleloader.*;
+import org.apache.felix.framework.resolver.Content;
 import java.io.*;
 import java.util.*;
 import org.apache.felix.framework.Logger;
@@ -26,7 +26,7 @@
 import org.apache.felix.framework.util.Util;
 import org.osgi.framework.Constants;
 
-public class DirectoryContent implements IContent
+public class DirectoryContent implements Content
 {
     private static final int BUFSIZE = 4096;
     private static final transient String EMBEDDED_DIRECTORY = "-embedded";
@@ -131,7 +131,7 @@
         return new FileInputStream(new File(m_dir, name));
     }
 
-    public synchronized IContent getEntryAsContent(String entryName)
+    public synchronized Content getEntryAsContent(String entryName)
     {
         // If the entry name refers to the content itself, then
         // just return it immediately.

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/DirectoryRevision.java Wed Mar  3 15:09:47 2010
@@ -26,7 +26,7 @@
 
 import org.apache.felix.framework.Logger;
 import org.apache.felix.framework.util.StringMap;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
 
 /**
  * <p>
@@ -94,7 +94,7 @@
         }
     }
 
-    public synchronized IContent getContent() throws Exception
+    public synchronized Content getContent() throws Exception
     {
         return new DirectoryContent(getLogger(), getConfig(), this, getRevisionRootDir(), m_refDir);
     }

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java Wed Mar  3 15:09:47 2010
@@ -32,10 +32,10 @@
 import org.apache.felix.framework.util.FelixConstants;
 import org.apache.felix.framework.util.JarFileX;
 import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
 import org.osgi.framework.Constants;
 
-public class JarContent implements IContent
+public class JarContent implements Content
 {
     private static final int BUFSIZE = 4096;
     private static final transient String EMBEDDED_DIRECTORY = "-embedded";
@@ -190,7 +190,7 @@
         return is;
     }
 
-    public IContent getEntryAsContent(String entryName)
+    public Content getEntryAsContent(String entryName)
     {
         // If the entry name refers to the content itself, then
         // just return it immediately.

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/cache/JarRevision.java Wed Mar  3 15:09:47 2010
@@ -30,7 +30,7 @@
 import org.apache.felix.framework.util.JarFileX;
 import org.apache.felix.framework.util.StringMap;
 import org.apache.felix.framework.util.Util;
-import org.apache.felix.moduleloader.IContent;
+import org.apache.felix.framework.resolver.Content;
 
 /**
  * <p>
@@ -107,7 +107,7 @@
         return new StringMap(mf.getMainAttributes(), false);
     }
 
-    public synchronized IContent getContent() throws Exception
+    public synchronized Content getContent() throws Exception
     {
         return new JarContent(getLogger(), getConfig(), this, getRevisionRootDir(),
             m_bundleFile, m_jarFile);

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java?rev=918505&r1=918504&r2=918505&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/Util.java Wed Mar  3 15:09:47 2010
@@ -25,9 +25,12 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import org.apache.felix.framework.capabilityset.Capability;
+import org.apache.felix.framework.capabilityset.CapabilitySet;
+import org.apache.felix.framework.resolver.Module;
+import org.apache.felix.framework.capabilityset.Requirement;
+import org.apache.felix.framework.resolver.Wire;
 
-import org.apache.felix.framework.util.manifestparser.Capability;
-import org.apache.felix.moduleloader.*;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -229,15 +232,15 @@
         return allow;
     }
 
-    public static ICapability getSatisfyingCapability(IModule m, IRequirement req)
+    public static Capability getSatisfyingCapability(Module m, Requirement req)
     {
-        ICapability[] caps = m.getCapabilities();
-        for (int i = 0; (caps != null) && (i < caps.length); i++)
+        List<Capability> caps = m.getCapabilities();
+        for (int i = 0; (caps != null) && (i < caps.size()); i++)
         {
-            if (caps[i].getNamespace().equals(req.getNamespace()) &&
-                req.isSatisfied(caps[i]))
+            if (caps.get(i).getNamespace().equals(req.getNamespace())
+                && CapabilitySet.matches(caps.get(i), req.getFilter()))
             {
-                return caps[i];
+                return caps.get(i);
             }
         }
         return null;
@@ -250,29 +253,29 @@
      * @param namespace capability namespace
      * @return array of matching capabilities or empty if none found
      */
-    public static ICapability[] getCapabilityByNamespace(IModule module, String namespace)
+    public static List<Capability> getCapabilityByNamespace(Module module, String namespace)
     {
-        final List matching = new ArrayList();
-        final ICapability[] caps = module.getCapabilities();
-        for (int capIdx = 0; (caps != null) && (capIdx < caps.length); capIdx++)
+        final List<Capability> matching = new ArrayList();
+        final List<Capability> caps = module.getCapabilities();
+        for (int capIdx = 0; (caps != null) && (capIdx < caps.size()); capIdx++)
         {
-            if (caps[capIdx].getNamespace().equals(namespace))
+            if (caps.get(capIdx).getNamespace().equals(namespace))
             {
-                matching.add(caps[capIdx]);
+                matching.add(caps.get(capIdx));
             }
         }
-        return (ICapability[]) matching.toArray(new ICapability[matching.size()]);
+        return matching;
     }
 
-    public static IWire getWire(IModule m, String name)
+    public static Wire getWire(Module m, String name)
     {
-        IWire[] wires = m.getWires();
-        for (int i = 0; (wires != null) && (i < wires.length); i++)
+        List<Wire> wires = m.getWires();
+        for (int i = 0; (wires != null) && (i < wires.size()); i++)
         {
-            if (wires[i].getCapability().getNamespace().equals(ICapability.PACKAGE_NAMESPACE) &&
-                ((Capability) wires[i].getCapability()).getPackageName().equals(name))
+            if (wires.get(i).getCapability().getNamespace().equals(Capability.PACKAGE_NAMESPACE) &&
+                wires.get(i).getCapability().getAttribute(Capability.PACKAGE_ATTR).getValue().equals(name))
             {
-                return wires[i];
+                return wires.get(i);
             }
         }
         return null;
@@ -522,21 +525,20 @@
      * @return <code>true</code> if the module declares a fragment host, <code>false</code>
      *      otherwise.
      */
-    public static boolean isFragment(IModule module)
+    public static boolean isFragment(Module module)
     {
         Map headerMap = module.getHeaders();
         return headerMap.containsKey(Constants.FRAGMENT_HOST);
     }
 
-
     //
     // The following substring-related code was lifted and modified
     // from the LDAP parser code.
     //
 
-    public static String[] parseSubstring(String target)
+    public static List<String> parseSubstring(String target)
     {
-        List pieces = new ArrayList();
+        ArrayList pieces = new ArrayList();
         StringBuffer ss = new StringBuffer();
         // int kind = SIMPLE; // assume until proven otherwise
         boolean wasStar = false; // indicates last piece was a star
@@ -608,10 +610,11 @@
                 pieces.add(0, "");
             }
         }
-        return (String[]) pieces.toArray(new String[pieces.size()]);
+        pieces.trimToSize();
+        return pieces;
     }
 
-    public static boolean checkSubstring(String[] pieces, String s)
+    public static boolean checkSubstring(List<String> pieces, String s)
     {
         // Walk the pieces to match the string
         // There are implicit stars between each piece,
@@ -620,13 +623,13 @@
         // minimal case is <string>*<string>
 
         boolean result = true;
-        int len = pieces.length;
+        int len = pieces.size();
 
         int index = 0;
 
 loop:   for (int i = 0; i < len; i++)
         {
-            String piece = pieces[i];
+            String piece = pieces.get(i);
 
             // If this is the first piece, then make sure the
             // string starts with it.
@@ -672,4 +675,4 @@
 
         return result;
     }
-}
+}
\ No newline at end of file