You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2015/02/03 11:06:23 UTC
tomee git commit: dont try to be clever just be brutal with ear
classloaders
Repository: tomee
Updated Branches:
refs/heads/develop ad6bdb23c -> 17b81654f
dont try to be clever just be brutal with ear classloaders
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/17b81654
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/17b81654
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/17b81654
Branch: refs/heads/develop
Commit: 17b81654ff36b93dbebf2b67d9046ee750d7b4a2
Parents: ad6bdb2
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Tue Feb 3 11:05:43 2015 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Tue Feb 3 11:05:43 2015 +0100
----------------------------------------------------------------------
.../util/classloader/URLClassLoaderFirst.java | 6 +-
.../tomee/catalina/TomEEWebappClassLoader.java | 58 ++++++++------------
2 files changed, 29 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/17b81654/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java b/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
index 58dbe49..8da406b 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
@@ -173,7 +173,11 @@ public class URLClassLoaderFirst extends URLClassLoader {
return null;
}
- private Class<?> loadInternal(final String name, final boolean resolve) {
+ public Class<?> findAlreadyLoadedClass(final String name) {
+ return super.findLoadedClass(name);
+ }
+
+ public Class<?> loadInternal(final String name, final boolean resolve) {
try {
final Class<?> clazz = findClass(name);
if (clazz != null) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/17b81654/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
index bd212d2..4f29dff 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
@@ -133,7 +133,7 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader {
}
@Override
- public Class<?> loadClass(final String name) throws ClassNotFoundException {
+ public Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
if ("org.apache.openejb.hibernate.OpenEJBJtaPlatform".equals(name)
|| "org.apache.openejb.jpa.integration.hibernate.PrefixNamingStrategy".equals(name)
|| "org.apache.openejb.jpa.integration.eclipselink.PrefixSessionCustomizer".equals(name)
@@ -145,7 +145,7 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader {
setJavaseClassLoader(NoClassClassLoader.INSTANCE);
delegate = false;
try {
- return super.loadClass(name);
+ return super.loadClass(name, resolve);
} finally {
setJavaseClassLoader(old);
setDelegate(originalDelegate);
@@ -158,15 +158,19 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader {
try {
return OpenEJB.class.getClassLoader().loadClass(name); // we could use containerClassLoader but this is server loader so cut it even more
} catch (final ClassNotFoundException e) {
- return super.loadClass(name);
+ synchronized (this) {
+ return super.loadClass(name, resolve);
+ }
} catch (final NoClassDefFoundError ncdfe) {
- return super.loadClass(name);
+ synchronized (this) {
+ return super.loadClass(name, resolve);
+ }
}
} else if (name.startsWith("javax.faces.") || name.startsWith("org.apache.webbeans.jsf.")) {
synchronized (this) {
delegate = false;
try {
- return super.loadClass(name);
+ return super.loadClass(name, resolve);
} finally {
setDelegate(originalDelegate);
}
@@ -177,48 +181,34 @@ public class TomEEWebappClassLoader extends ParallelWebappClassLoader {
final boolean filter = filter(name);
filterTempCache.put(name, filter); // will be called again by super.loadClass() so cache it
if (!filter) {
- if (isTheSame(name, getParent(), containerClassLoader, false, false)) {
- return loadWithDelegate(false, name);
- } else if (isTheSame(name, getParent(), this, true, originalDelegate)) {
- return loadWithDelegate(true, name);
+ if (URLClassLoaderFirst.class.isInstance(getParent())) { // true
+ final URLClassLoaderFirst urlClassLoaderFirst = URLClassLoaderFirst.class.cast(getParent());
+ Class<?> c = urlClassLoaderFirst.findAlreadyLoadedClass(name);
+ if (c != null) {
+ return c;
+ }
+ c = urlClassLoaderFirst.loadInternal(name, resolve);
+ if (c != null) {
+ return c;
+ }
}
+ return loadWithDelegate(getResource(name.replace('.', '/') + CLASS_EXTENSION) == null, resolve, name);
}
}
- return super.loadClass(name);
+ return super.loadClass(name, resolve);
}
}
- private Class<?> loadWithDelegate(final boolean delegate, final String name) throws ClassNotFoundException {
+
+ private Class<?> loadWithDelegate(final boolean delegate, final boolean resolve, final String name) throws ClassNotFoundException {
setDelegate(delegate);
try {
- return super.loadClass(name);
+ return super.loadClass(name, resolve);
} finally {
filterTempCache.remove(name); // no more needed since class is loaded, avoid to waste mem
setDelegate(originalDelegate);
}
}
- // NOTE: valueIfExistingInBoth should be removed but we need to work really more to make it a reality
- private boolean isTheSame(final String name, final ClassLoader c1, final ClassLoader c2, final Boolean valueIfExistingInBoth, final boolean defaultValue) {
- final String resource = name.replace('.', '/') + CLASS_EXTENSION;
-
- final URL u1 = c1.getResource(resource);
- if (u1 == null) {
- return defaultValue;
- }
- final URL u2 = c2.getResource(resource);
- if (u2 == null) {
- return defaultValue;
- }
- if (valueIfExistingInBoth != null) {
- return valueIfExistingInBoth;
- }
- try {
- return URLs.toFile(u2).getCanonicalPath().equalsIgnoreCase(URLs.toFile(u1).getCanonicalPath());
- } catch (final IOException e) {
- return defaultValue;
- }
- }
-
@Override
public void setResources(final WebResourceRoot resources) {
this.resources = resources;