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 2017/10/24 10:17:20 UTC
svn commit: r1813157 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework:
ExtensionManager.java Felix.java
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"));