You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/12/13 01:16:34 UTC
svn commit: r486424 -
/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
Author: awhite
Date: Tue Dec 12 16:16:33 2006
New Revision: 486424
URL: http://svn.apache.org/viewvc?view=rev&rev=486424
Log:
Use most derived available classloader when loading plugins so that we can
load application classes when the application uses a derived loader.
Modified:
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java?view=diff&rev=486424&r1=486423&r2=486424
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java Tue Dec 12 16:16:33 2006
@@ -127,12 +127,10 @@
ClassLoader loader, boolean fatal) {
if (StringUtils.isEmpty(clsName))
return null;
- if (loader == null && conf != null)
- loader = conf.getClass().getClassLoader();
Class cls = null;
try {
- cls = Strings.toClass(clsName, loader);
+ cls = Strings.toClass(clsName, findDerivedLoader(conf, loader));
} catch (RuntimeException re) {
if (val != null)
re = getCreateException(clsName, val, re);
@@ -156,6 +154,40 @@
log.error(_loc.get("plugin-creation-exception", val), re);
return null;
}
+ }
+
+ /**
+ * Attempt to find a derived loader that delegates to our target loader.
+ * This allows application loaders that delegate appropriately for known
+ * classes first crack at class names.
+ */
+ private static ClassLoader findDerivedLoader(Configuration conf,
+ ClassLoader loader) {
+ // we always prefer the thread loader, because it's the only thing we
+ // can access that isn't bound to the OpenJPA classloader, unless
+ // the conf object is of a custom class
+ ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
+ if (loader == null) {
+ if (ctxLoader != null)
+ return ctxLoader;
+ if (conf != null)
+ return conf.getClass().getClassLoader();
+ return Configurations.class.getClassLoader();
+ }
+
+ for (ClassLoader parent = ctxLoader; parent != null;
+ parent = parent.getParent()) {
+ if (parent == loader)
+ return ctxLoader;
+ }
+ if (conf != null) {
+ for (ClassLoader parent = conf.getClass().getClassLoader();
+ parent != null; parent = parent.getParent()) {
+ if (parent == loader)
+ return conf.getClass().getClassLoader();
+ }
+ }
+ return loader;
}
/**