Author: rickhall
Date: Tue Sep 21 21:05:19 2010
New Revision: 999642
URL: http://svn.apache.org/viewvc?rev=999642&view=rev
Log:
Create another class loader for Java5 which overrides getResources() and
use the correct class loader depending on our platform. (FELIX-2569)
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
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=999642&r1=999641&r2=999642&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
Tue Sep 21 21:05:19 2010
@@ -155,6 +155,9 @@ public class ModuleImpl implements Modul
// Thread local to keep track of deferred activation.
private static final ThreadLocal m_deferredActivation = new ThreadLocal();
+ // Flag indicating whether we are on an old JVM or not.
+ private volatile static boolean m_isPreJava5 = false;
+
/**
* This constructor is used by the extension manager, since it needs
* a constructor that does not throw an exception.
@@ -1282,26 +1285,43 @@ public class ModuleImpl implements Modul
{
if (m_classLoader == null)
{
- if (System.getSecurityManager() != null)
+ // Determine which class loader to use based on which
+ // Java platform we are running on.
+ Class clazz;
+ if (m_isPreJava5)
+ {
+ clazz = ModuleClassLoader.class;
+ }
+ else
{
try
{
- Constructor ctor = (Constructor)
m_secureAction.getConstructor(
- ModuleClassLoader.class,
- new Class[] { ModuleImpl.class, ClassLoader.class });
- m_classLoader = (ModuleClassLoader)
- m_secureAction.invoke(ctor,
- new Object[] { this, determineParentClassLoader() });
+ clazz = ModuleClassLoaderJava5.class;
}
- catch (Exception ex)
+ catch (Throwable th)
{
- throw new RuntimeException("Unable to create module class
loader: "
- + ex.getMessage() + " [" + ex.getClass().getName() +
"]");
+ // If we are on pre-Java5 then we will get a verify error
+ // here since we try to override a getResources() which is
+ // a final method in pre-Java5.
+ m_isPreJava5 = true;
+ clazz = ModuleClassLoader.class;
}
}
- else
+
+ // Use SecureAction to create the class loader if security is
+ // enabled; otherwise, create it directly.
+ try
+ {
+ Constructor ctor = (Constructor) m_secureAction.getConstructor(
+ clazz, new Class[] { ModuleImpl.class, ClassLoader.class
});
+ m_classLoader = (ModuleClassLoader)
+ m_secureAction.invoke(ctor,
+ new Object[] { this, determineParentClassLoader() });
+ }
+ catch (Exception ex)
{
- m_classLoader = new
ModuleClassLoader(determineParentClassLoader());
+ throw new RuntimeException("Unable to create module class
loader: "
+ + ex.getMessage() + " [" + ex.getClass().getName() + "]");
}
}
return m_classLoader;
@@ -1654,6 +1674,24 @@ public class ModuleImpl implements Modul
m_dexFileClassLoadClass = dexFileClassLoadClass;
}
+ public class ModuleClassLoaderJava5 extends ModuleClassLoader
+ {
+ public ModuleClassLoaderJava5(ClassLoader parent)
+ {
+ super(parent);
+ }
+
+ public Enumeration getResources(String name)
+ {
+ return ModuleImpl.this.getResourcesByDelegation(name);
+ }
+
+ protected Enumeration findResources(String name)
+ {
+ return getResourcesLocal(name);
+ }
+ }
+
public class ModuleClassLoader extends SecureClassLoader implements
BundleReference
{
private final Map m_jarContentToDexFile;
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
URL:
http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java?rev=999642&r1=999641&r2=999642&view=diff
==============================================================================
---
felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
(original)
+++
felix/trunk/framework/src/main/java/org/apache/felix/framework/URLHandlers.java
Tue Sep 21 21:05:19 2010
@@ -605,8 +605,8 @@ class URLHandlers implements URLStreamHa
if (stack[i].getClassLoader() != null)
{
String name = stack[i].getClassLoader().getClass().getName();
- if
("org.apache.felix.framework.ModuleImpl$ModuleClassLoader".equals(name)
- ||
"org.apache.felix.framework.searchpolicy.ContentClassLoader".equals(name))
+ if
(name.startsWith("org.apache.felix.framework.ModuleImpl$ModuleClassLoader")
+ ||
name.equals("org.apache.felix.framework.searchpolicy.ContentClassLoader"))
{
targetClass = stack[i];
break;