Author: remm
Date: Thu Feb 16 06:19:13 2006
New Revision: 378251
URL: http://svn.apache.org/viewcvs?rev=378251&view=rev
Log:
- Null instances loaded by WCL only.
- Submitted by Matt Jensen.
Modified:
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java
Modified:
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java
URL:
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java?rev=378251&r1=378250&r2=378251&view=diff
==============================================================================
---
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java
(original)
+++
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java
Thu Feb 16 06:19:13 2006
@@ -1543,10 +1543,10 @@
> (lastJarAccessed + 90000))) {
for (int i = 0; i < jarFiles.length; i++) {
try {
- if (jarFiles[i] != null) {
- jarFiles[i].close();
- jarFiles[i] = null;
- }
+ if (jarFiles[i] != null) {
+ jarFiles[i].close();
+ jarFiles[i] = null;
+ }
} catch (IOException e) {
if (log.isDebugEnabled()) {
log.debug("Failed to close JAR", e);
@@ -1657,10 +1657,25 @@
// Doing something recursively is too risky
continue;
} else {
- field.set(instance, null);
- if (log.isDebugEnabled()) {
- log.debug("Set field " + field.getName()
- + " to null in class " +
instance.getClass().getName());
+ Object value = field.get(instance);
+ if (null != value) {
+ Class valueClass = value.getClass();
+ if (!loadedByThisOrChild(valueClass)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Not setting field " +
field.getName() +
+ " to null in object of class " +
+ instance.getClass().getName() +
+ " because the referenced object was of
type " +
+ valueClass.getName() +
+ " which was not loaded by this
WebappClassLoader.");
+ }
+ } else {
+ field.set(instance, null);
+ if (log.isDebugEnabled()) {
+ log.debug("Set field " + field.getName()
+ + " to null in class " +
instance.getClass().getName());
+ }
+ }
}
}
} catch (Throwable t) {
@@ -1672,7 +1687,25 @@
}
}
}
-
+
+
+ /**
+ * Determine whether a class was loaded by this class loader or one of
+ * its child class loaders.
+ */
+ protected boolean loadedByThisOrChild(Class clazz)
+ {
+ boolean result = false;
+ for (ClassLoader classLoader = clazz.getClassLoader();
+ null != classLoader; classLoader = classLoader.getParent()) {
+ if (classLoader.equals(this)) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
/**
* Used to periodically signal to the classloader to release JAR resources.
@@ -1682,14 +1715,14 @@
lastJarAccessed = System.currentTimeMillis();
if (jarFiles[0] == null) {
for (int i = 0; i < jarFiles.length; i++) {
- try {
+ try {
jarFiles[i] = new JarFile(jarRealFiles[i]);
- } catch (IOException e) {
+ } catch (IOException e) {
if (log.isDebugEnabled()) {
log.debug("Failed to open JAR", e);
}
return false;
- }
+ }
}
}
}
@@ -1869,6 +1902,7 @@
entry.lastModified = attributes.getLastModified();
if (resource != null) {
+
try {
binaryStream = resource.streamContent();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]