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/05/12 19:52:50 UTC
svn commit: r943597 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework:
ExtensionManager.java Felix.java ModuleImpl.java
Author: rickhall
Date: Wed May 12 17:52:49 2010
New Revision: 943597
URL: http://svn.apache.org/viewvc?rev=943597&view=rev
Log:
Bundle.loadClass() for the system bundle should obey boot delegation. (FELIX-2335)
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
felix/trunk/framework/src/main/java/org/apache/felix/framework/ModuleImpl.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=943597&r1=943596&r2=943597&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 May 12 17:52:49 2010
@@ -652,7 +652,7 @@ class ExtensionManager extends URLStream
private final Version m_version;
ExtensionManagerModule(Felix felix)
{
- super(m_logger, felix, "0",
+ super(m_logger, felix.getConfig(), felix, "0",
felix.getBootPackages(), felix.getBootPackageWildcards());
m_version = new Version((String)
felix.getConfig().get(FelixConstants.FELIX_VERSION_PROPERTY));
@@ -686,15 +686,45 @@ class ExtensionManager extends URLStream
public Class getClassByDelegation(String name) throws ClassNotFoundException
{
- synchronized (ExtensionManager.this)
+ Class clazz = null;
+ String pkgName = Util.getClassPackage(name);
+ if (shouldBootDelegate(pkgName))
{
- if (!m_exportNames.contains(Util.getClassPackage(name)))
+ 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)
{
- throw new ClassNotFoundException(name);
+ // 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)
+ {
+ synchronized (ExtensionManager.this)
+ {
+ if (!m_exportNames.contains(Util.getClassPackage(name)))
+ {
+ throw new ClassNotFoundException(name);
+ }
+ }
- return getClass().getClassLoader().loadClass(name);
+ clazz = getClass().getClassLoader().loadClass(name);
+ }
+ return clazz;
}
public URL getResourceByDelegation(String name)
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=943597&r1=943596&r2=943597&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 May 12 17:52:49 2010
@@ -329,6 +329,25 @@ public class Felix extends BundleImpl im
// Initialize framework properties.
initializeFrameworkProperties();
+ // Read the boot delegation property and parse it.
+ String s = (m_configMap == null)
+ ? null
+ : (String) m_configMap.get(Constants.FRAMEWORK_BOOTDELEGATION);
+ s = (s == null) ? "java.*" : s + ",java.*";
+ StringTokenizer st = new StringTokenizer(s, " ,");
+ m_bootPkgs = new String[st.countTokens()];
+ m_bootPkgWildcards = new boolean[m_bootPkgs.length];
+ for (int i = 0; i < m_bootPkgs.length; i++)
+ {
+ s = st.nextToken();
+ if (s.equals("*") || s.endsWith(".*"))
+ {
+ m_bootPkgWildcards[i] = true;
+ s = s.substring(0, s.length() - 1);
+ }
+ m_bootPkgs[i] = s;
+ }
+
// Create default bundle stream handler.
m_bundleStreamHandler = new URLHandlersBundleStreamHandler(this);
@@ -351,25 +370,6 @@ public class Felix extends BundleImpl im
// a runtime exception.
throw new RuntimeException(ex.getMessage());
}
-
- // Read the boot delegation property and parse it.
- String s = (m_configMap == null)
- ? null
- : (String) m_configMap.get(Constants.FRAMEWORK_BOOTDELEGATION);
- s = (s == null) ? "java.*" : s + ",java.*";
- StringTokenizer st = new StringTokenizer(s, " ,");
- m_bootPkgs = new String[st.countTokens()];
- m_bootPkgWildcards = new boolean[m_bootPkgs.length];
- for (int i = 0; i < m_bootPkgs.length; i++)
- {
- s = st.nextToken();
- if (s.equals("*") || s.endsWith(".*"))
- {
- m_bootPkgWildcards[i] = true;
- s = s.substring(0, s.length() - 1);
- }
- m_bootPkgs[i] = s;
- }
}
Logger getLogger()
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java?rev=943597&r1=943596&r2=943597&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java Wed May 12 17:52:49 2010
@@ -163,11 +163,11 @@ public class ModuleImpl implements Modul
* @throws org.osgi.framework.BundleException
*/
public ModuleImpl(
- Logger logger, Bundle bundle, String id,
+ Logger logger, Map configMap, Bundle bundle, String id,
String[] bootPkgs, boolean[] bootPkgWildcards)
{
m_logger = logger;
- m_configMap = null;
+ m_configMap = configMap;
m_resolver = null;
m_bundle = bundle;
m_id = id;
@@ -680,12 +680,10 @@ public class ModuleImpl implements Modul
try
{
// Get the appropriate class loader for delegation.
- ClassLoader parent = (m_classLoader == null)
- ? determineParentClassLoader() : m_classLoader.getParent();
- parent = (parent == null) ? m_bootClassLoader : parent;
+ ClassLoader bdcl = getBootDelegationClassLoader();
result = (isClass)
- ? (Object) parent.loadClass(name)
- : (Object) parent.getResource(name);
+ ? (Object) bdcl.loadClass(name)
+ : (Object) bdcl.getResource(name);
// If this is a java.* package, then always terminate the
// search; otherwise, continue to look locally if not found.
if (pkgName.startsWith("java.") || (result != null))
@@ -865,10 +863,8 @@ public class ModuleImpl implements Modul
try
{
// Get the appropriate class loader for delegation.
- ClassLoader parent = (m_classLoader == null)
- ? determineParentClassLoader() : m_classLoader.getParent();
- parent = (parent == null) ? m_bootClassLoader : parent;
- urls = parent.getResources(name);
+ ClassLoader bdcl = getBootDelegationClassLoader();
+ urls = bdcl.getResources(name);
}
catch (IOException ex)
{
@@ -1511,7 +1507,7 @@ public class ModuleImpl implements Modul
return clazz;
}
- private boolean shouldBootDelegate(String pkgName)
+ boolean shouldBootDelegate(String pkgName)
{
// Always boot delegate if the bundle has a configured
// boot class loader.
@@ -1548,6 +1544,14 @@ public class ModuleImpl implements Modul
return result;
}
+ ClassLoader getBootDelegationClassLoader()
+ {
+ // Get the appropriate class loader for delegation.
+ ClassLoader parent = (m_classLoader == null)
+ ? determineParentClassLoader() : m_classLoader.getParent();
+ return (parent == null) ? m_bootClassLoader : parent;
+ }
+
private static final Constructor m_dexFileClassConstructor;
private static final Method m_dexFileClassLoadDex;
private static final Method m_dexFileClassLoadClass;