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"));