Author: pauls
Date: Tue Oct 24 10:17:19 2017
New Revision: 1813157

URL: http://svn.apache.org/viewvc?rev=1813157&view=rev
Log:
FELIX-1974: provide a way to extend the framework to support boot class path 
extsion bundles.

Modified:
    
felix/trunk/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
    felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java

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=1813157&r1=1813156&r2=1813157&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
 Tue Oct 24 10:17:19 2017
@@ -93,10 +93,12 @@ import java.util.Set;
 class ExtensionManager implements Content
 {
     static final ClassPathExtenderFactory.ClassPathExtender 
m_extenderFramework;
+    static final ClassPathExtenderFactory.ClassPathExtender m_extenderBoot;
 
     static
     {
         ClassPathExtenderFactory.ClassPathExtender extenderFramework = null;
+        ClassPathExtenderFactory.ClassPathExtender extenderBoot = null;
 
         if 
(!"true".equalsIgnoreCase(Felix.m_secureAction.getSystemProperty(FelixConstants.FELIX_EXTENSIONS_DISABLE,
 "false")))
         {
@@ -104,11 +106,35 @@ class ExtensionManager implements Conten
                     ExtensionManager.class.getClassLoader());
 
 
-            for (Iterator<ClassPathExtenderFactory> iter = loader.iterator(); 
iter.hasNext() && extenderFramework == null; )
+            for (Iterator<ClassPathExtenderFactory> iter = loader.iterator();
+                 iter.hasNext() && (extenderFramework == null || extenderBoot 
== null); )
             {
                 try
                 {
-                    extenderFramework = 
iter.next().getExtender(ExtensionManager.class.getClassLoader());
+                    ClassPathExtenderFactory factory = iter.next();
+
+                    if (extenderFramework == null)
+                    {
+                        try
+                        {
+                            extenderFramework = 
factory.getExtender(ExtensionManager.class.getClassLoader());
+                        }
+                        catch (Throwable t)
+                        {
+                            // Ignore
+                        }
+                    }
+                    if (extenderBoot == null)
+                    {
+                        try
+                        {
+                            extenderBoot = factory.getExtender(null);
+                        }
+                        catch (Throwable t)
+                        {
+                            // Ignore
+                        }
+                    }
                 }
                 catch (Throwable t)
                 {
@@ -130,6 +156,7 @@ class ExtensionManager implements Conten
         }
 
         m_extenderFramework = extenderFramework;
+        m_extenderBoot = extenderBoot;
     }
 
     private final Logger m_logger;
@@ -390,15 +417,20 @@ class ExtensionManager implements Conten
             ((BundleRevisionImpl) bundle.adapt(BundleRevision.class))
                 .getHeaders().get(Constants.FRAGMENT_HOST));
 
+        final ClassPathExtenderFactory.ClassPathExtender extender;
+
+        if (m_extenderBoot != null && 
Constants.EXTENSION_BOOTCLASSPATH.equals(directive))
+        {
+            extender = m_extenderBoot;
+        }
         // We only support classpath extensions (not bootclasspath).
-        if (!Constants.EXTENSION_FRAMEWORK.equals(directive))
+        else if (!Constants.EXTENSION_FRAMEWORK.equals(directive))
         {
            throw new BundleException("Unsupported Extension Bundle type: " +
                     directive, new UnsupportedOperationException(
                     "Unsupported Extension Bundle type!"));
         }
-
-        if (m_extenderFramework == null)
+        else if (m_extenderFramework == null)
         {
             // We don't support extensions
             m_logger.log(bundle, Logger.LOG_WARNING,
@@ -407,6 +439,10 @@ class ExtensionManager implements Conten
             throw new UnsupportedOperationException(
                     "Unable to add extension bundle.");
         }
+        else
+        {
+            extender = m_extenderFramework;
+        }
 
         Content content = bundle.adapt(BundleRevisionImpl.class).getContent();
         final File file;
@@ -433,36 +469,41 @@ class ExtensionManager implements Conten
         }
         try
         {
+            // Merge the exported packages with the exported packages of the 
systembundle.
+            List<BundleCapability> exports = null;
+            if (Constants.EXTENSION_FRAMEWORK.equals(directive))
+            {
+                try
+                {
+                    exports = ManifestParser.parseExportHeader(
+                            m_logger, m_systemBundleRevision,
+                            (String) 
bundle.adapt(BundleRevisionImpl.class).getHeaders().get(Constants.EXPORT_PACKAGE),
+                            m_systemBundleRevision.getSymbolicName(), 
m_systemBundleRevision.getVersion());
+                    exports = aliasSymbolicName(exports);
+                }
+                catch (Exception ex)
+                {
+                    m_logger.log(
+                            bundle,
+                            Logger.LOG_ERROR,
+                            "Error parsing extension bundle export statement: "
+                                    + 
bundle.adapt(BundleRevisionImpl.class).getHeaders().get(Constants.EXPORT_PACKAGE),
 ex);
+                    return;
+                }
+            }
             AccessController.doPrivileged(new PrivilegedExceptionAction<Void>()
             {
                 @Override
                 public Void run() throws Exception
                 {
-                    m_extenderFramework.add(file);
+                    extender.add(file);
                     return null;
                 }
             });
-
-            // Merge the exported packages with the exported packages of the 
systembundle.
-            List<BundleCapability> exports = null;
-            try
-            {
-                exports = ManifestParser.parseExportHeader(
-                        m_logger, m_systemBundleRevision,
-                        (String) 
bundle.adapt(BundleRevisionImpl.class).getHeaders().get(Constants.EXPORT_PACKAGE),
-                        m_systemBundleRevision.getSymbolicName(), 
m_systemBundleRevision.getVersion());
-                exports = aliasSymbolicName(exports);
-            }
-            catch (Exception ex)
+            if (exports != null)
             {
-                m_logger.log(
-                        bundle,
-                        Logger.LOG_ERROR,
-                        "Error parsing extension bundle export statement: "
-                                + 
bundle.adapt(BundleRevisionImpl.class).getHeaders().get(Constants.EXPORT_PACKAGE),
 ex);
-                return;
+                appendCapabilities(exports);
             }
-            appendCapabilities(exports);
         }
         catch (Exception ex)
         {

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=1813157&r1=1813156&r2=1813157&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 
Tue Oct 24 10:17:19 2017
@@ -4613,7 +4613,7 @@ public class Felix extends BundleImpl im
             System.getProperty("user.language"));
         m_configMutableMap.put(
             FelixConstants.SUPPORTS_FRAMEWORK_EXTENSION,
-            "true");
+            ExtensionManager.m_extenderFramework != null ? "true" : "false");
         m_configMutableMap.put(
             FelixConstants.SUPPORTS_FRAMEWORK_FRAGMENT,
             "true");
@@ -4622,7 +4622,7 @@ public class Felix extends BundleImpl im
             "true");
         m_configMutableMap.put(
             FelixConstants.SUPPORTS_BOOTCLASSPATH_EXTENSION,
-            "false");
+            ExtensionManager.m_extenderBoot != null ? "true" : "false");
 
         String s = null;
         s = NativeLibraryClause.normalizeOSName(System.getProperty("os.name"));


Reply via email to