You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pa...@apache.org on 2018/07/16 23:26:00 UTC

svn commit: r1836072 - in /felix/trunk/framework/src/main/java/org/apache/felix/framework: BundleRevisionImpl.java ExtensionManager.java util/manifestparser/ManifestParser.java

Author: pauls
Date: Mon Jul 16 23:26:00 2018
New Revision: 1836072

URL: http://svn.apache.org/viewvc?rev=1836072&view=rev
Log:
FELIX-5889: make extension bundle capabilities be indexed by the resolver.

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java?rev=1836072&r1=1836071&r2=1836072&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java Mon Jul 16 23:26:00 2018
@@ -62,7 +62,6 @@ public class BundleRevisionImpl implemen
     private final Version m_version;
 
     private final List<BundleCapability> m_declaredCaps;
-    private final List<BundleCapability> m_declaredExtensionCaps;
     private final List<BundleRequirement> m_declaredReqs;
     private final List<NativeLibrary> m_declaredNativeLibs;
     private final int m_declaredActivationPolicy;
@@ -98,7 +97,6 @@ public class BundleRevisionImpl implemen
         m_isFragment = false;
         m_version = null;
         m_declaredCaps = Collections.emptyList();
-        m_declaredExtensionCaps = Collections.emptyList();
         m_declaredReqs = Collections.emptyList();
         m_declaredNativeLibs = null;
         m_declaredActivationPolicy = EAGER_ACTIVATION;
@@ -129,8 +127,6 @@ public class BundleRevisionImpl implemen
         m_manifestVersion = mp.getManifestVersion();
         m_version = mp.getBundleVersion();
         m_declaredCaps = mp.getCapabilities();
-        m_declaredExtensionCaps = m_isExtension ? ManifestParser.aliasSymbolicName(mp.getExtensionCapabilites(),
-            bundle.getFramework().adapt(BundleRevisionImpl.class)) : Collections.EMPTY_LIST;
         m_declaredReqs = mp.getRequirements();
         m_declaredNativeLibs = mp.getLibraries();
         m_declaredActivationPolicy = mp.getActivationPolicy();
@@ -217,23 +213,6 @@ public class BundleRevisionImpl implemen
             {
                 if (cap.getNamespace().equals(namespace))
                 {
-                    result.add(cap);
-                }
-            }
-        }
-        return result;
-    }
-
-    public List<BundleCapability> getDeclaredExtensionCapabilities(String namespace)
-    {
-        List<BundleCapability> result = m_declaredExtensionCaps;
-        if (namespace != null)
-        {
-            result = new ArrayList<BundleCapability>();
-            for (BundleCapability cap : m_declaredExtensionCaps)
-            {
-                if (cap.getNamespace().equals(namespace))
-                {
                     result.add(cap);
                 }
             }

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=1836072&r1=1836071&r2=1836072&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 Mon Jul 16 23:26:00 2018
@@ -41,7 +41,10 @@ import org.osgi.framework.BundleExceptio
 import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.Version;
+import org.osgi.framework.namespace.BundleNamespace;
 import org.osgi.framework.namespace.ExecutionEnvironmentNamespace;
+import org.osgi.framework.namespace.HostNamespace;
+import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.namespace.NativeNamespace;
 import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleRequirement;
@@ -91,6 +94,10 @@ class ExtensionManager implements Conten
 {
     static final ClassPathExtenderFactory.ClassPathExtender m_extenderFramework;
     static final ClassPathExtenderFactory.ClassPathExtender m_extenderBoot;
+    private static final Set<String> IDENTITY = new HashSet<String>(Arrays.asList(
+        BundleNamespace.BUNDLE_NAMESPACE,
+        HostNamespace.HOST_NAMESPACE,
+        IdentityNamespace.IDENTITY_NAMESPACE));
 
     static
     {
@@ -527,7 +534,15 @@ class ExtensionManager implements Conten
 
             felix.getDependencies().addDependent(wire);
 
-            m_systemBundleRevision.appendCapabilities(entry.getKey().getDeclaredExtensionCapabilities(null));
+            List<BundleCapability> caps = new ArrayList<BundleCapability>();
+            for (BundleCapability cap : entry.getKey().getDeclaredCapabilities(null))
+            {
+                if (!IDENTITY.contains(cap.getNamespace()))
+                {
+                    caps.add(cap);
+                }
+            }
+            m_systemBundleRevision.appendCapabilities(caps);
             for (BundleWire w : entry.getValue())
             {
                 if (!w.getRequirement().getNamespace().equals(BundleRevision.HOST_NAMESPACE) &&
@@ -573,11 +588,6 @@ class ExtensionManager implements Conten
         m_failedExtensions.addAll(m_unresolvedExtensions);
         m_unresolvedExtensions.clear();
 
-        if (!wirings.isEmpty())
-        {
-            felix.getResolver().addRevision(getRevision());
-        }
-
         return result;
     }
 
@@ -749,14 +759,16 @@ class ExtensionManager implements Conten
                 // now loop through the other extensions
                 for (BundleRevisionImpl extension : extensions)
                 {
-                    // check the caps that will be lifted to the system bundle
-                    for (BundleCapability cap : extension.getDeclaredExtensionCapabilities(req.getNamespace()))
+                    for (BundleCapability cap : extension.getDeclaredCapabilities(req.getNamespace()))
                     {
                         if (req.matches(cap))
                         {
                             // we can use a yet unresolved extension (resolved one are implicitly checked by the
                             // system bundle loop above as they would be attached.
-                            wi.add(new BundleWireImpl(m_systemBundleRevision, req, m_systemBundleRevision, cap));
+                            wi.add(new BundleWireImpl(m_systemBundleRevision, req,
+                                // lift identity
+                                IDENTITY.contains(cap.getNamespace()) ?
+                                extension : m_systemBundleRevision, cap));
                             continue outer;
                         }
                     }
@@ -875,7 +887,6 @@ class ExtensionManager implements Conten
         private volatile Map m_configMap;
         private final Map m_headerMap = new StringMap();
         private volatile List<BundleCapability> m_capabilities = Collections.EMPTY_LIST;
-        private volatile Set<String> m_exportNames = Collections.EMPTY_SET;
         private volatile Version m_version;
         private volatile BundleWiring m_wiring;
 
@@ -912,6 +923,7 @@ class ExtensionManager implements Conten
                 List<BundleCapability> caps = ManifestParser.aliasSymbolicName(mp.getCapabilities(), this);
                 caps.add(buildNativeCapabilites(this, m_configMap));
                 appendCapabilities(caps);
+                m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(caps));
             }
             catch (Exception ex)
             {
@@ -967,6 +979,7 @@ class ExtensionManager implements Conten
                 caps.add(buildNativeCapabilites(this, m_configMap));
                 m_capabilities = Collections.EMPTY_LIST;
                 appendCapabilities(caps);
+                m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(caps));
             }
             catch (Exception ex)
             {
@@ -983,13 +996,11 @@ class ExtensionManager implements Conten
             newCaps.addAll(m_capabilities);
             newCaps.addAll(caps);
             m_capabilities = Util.newImmutableList(newCaps);
-            m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(newCaps));
         }
 
         private String convertCapabilitiesToHeaders(List<BundleCapability> caps)
         {
             StringBuffer exportSB = new StringBuffer("");
-            Set<String> exportNames = new HashSet<String>();
 
             for (BundleCapability cap : caps)
             {
@@ -1024,15 +1035,9 @@ class ExtensionManager implements Conten
                             exportSB.append("\"");
                         }
                     }
-
-                    // Remember exported packages.
-                    exportNames.add(
-                        (String) cap.getAttributes().get(BundleRevision.PACKAGE_NAMESPACE));
                 }
             }
 
-            m_exportNames = exportNames;
-
             return exportSB.toString();
         }
 
@@ -1166,42 +1171,7 @@ class ExtensionManager implements Conten
         @Override
         public Class getClassByDelegation(String name) throws ClassNotFoundException
         {
-            Class clazz = null;
-            String pkgName = Util.getClassPackage(name);
-            if (shouldBootDelegate(pkgName))
-            {
-                try
-                {
-                    // Get the appropriate class loader for delegation.
-                    ClassLoader bdcl = getBootDelegationClassLoader();
-                    clazz = bdcl.loadClass(name);
-                    // If this is a java.* package, then always terminate the
-                    // search; otherwise, continue to look locally if not found.
-                    if (pkgName.startsWith("java.") || (clazz != null))
-                    {
-                        return clazz;
-                    }
-                }
-                catch (ClassNotFoundException ex)
-                {
-                    // If this is a java.* package, then always terminate the
-                    // search; otherwise, continue to look locally if not found.
-                    if (pkgName.startsWith("java."))
-                    {
-                        throw ex;
-                    }
-                }
-            }
-            if (clazz == null)
-            {
-                if (!m_systemBundleRevision.m_exportNames.contains(Util.getClassPackage(name)))
-                {
-                    throw new ClassNotFoundException(name);
-                }
-
-                clazz = getClass().getClassLoader().loadClass(name);
-            }
-            return clazz;
+            return getClass().getClassLoader().loadClass(name);
         }
 
         @Override

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java?rev=1836072&r1=1836071&r2=1836072&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java Mon Jul 16 23:26:00 2018
@@ -60,7 +60,6 @@ public class ManifestParser
     private volatile String m_bundleSymbolicName;
     private volatile Version m_bundleVersion;
     private volatile List<BundleCapability> m_capabilities;
-    private volatile List<BundleCapability> m_extensionCapabilities;
     private volatile List<BundleRequirement> m_requirements;
     private volatile List<NativeLibraryClause> m_libraryClauses;
     private volatile boolean m_libraryHeadersOptional = false;
@@ -284,19 +283,8 @@ public class ManifestParser
         m_capabilities = new ArrayList<BundleCapability>(
              capList.size() + exportCaps.size() + provideCaps.size());
         m_capabilities.addAll(capList);
-
-        if (m_isExtension)
-        {
-            m_extensionCapabilities = new ArrayList<BundleCapability>();
-            m_extensionCapabilities.addAll(exportCaps);
-            m_extensionCapabilities.addAll(provideCaps);
-        }
-        else
-        {
-            m_extensionCapabilities = Collections.EMPTY_LIST;
-            m_capabilities.addAll(exportCaps);
-            m_capabilities.addAll(provideCaps);
-        }
+        m_capabilities.addAll(exportCaps);
+        m_capabilities.addAll(provideCaps);
 
         //
         // Parse activation policy.
@@ -2201,9 +2189,4 @@ public class ManifestParser
 
         return aliasCaps;
     }
-
-    public List<BundleCapability> getExtensionCapabilites()
-    {
-        return m_extensionCapabilities;
-    }
 }