Hi Carsten,

On Thu, 2002-06-06 at 07:31, Carsten Ziegeler wrote:
> Hi David,
> 
> 
> I don't now the problem, but as far as I can tell, the init-classloader
> param is evaluated. In CocoonServlet, line 306 (current CVS):
>         this.addClassDirs = "true".equalsIgnoreCase(value) ||
> "yes".equalsIgnoreCase(value);
> 
> and this boolean is used at several places throughout the servlet class.
> 
> So, what does your patch change?
> 
> Carsten
> 

This parameter is evaluated, but it is only used when the servlet is
checking to see if it should "build its own classpath" (something I
don't think it should be doing anyway).  Regardless of what the
init-classloader parameter is set to, user-level code will always be
executed with the RepositoryClassLoader, which breaks JNDI in Tomcat. 
Take a look at line 936 of CocoonServlet.java (the latest CVS revision):


/* HACK for reducing class loader
problems.                                     */
/* example: xalan extensions fail if someone adds xalan jars in
tomcat3.2.1/lib */
try {
    Thread.currentThread().setContextClassLoader(classLoader);
} catch (Exception e){}

The ContextClassLoader is set, regardless of the init-classloader
parameter.  My patch (attached) simply adds checks for this parameter,
here and a few other needed places -- although I would like to emphasize
that I think this should be considered a temporary solution, because
(just to reiterate :-), the Java API docs imply that it is a Thread's
creator's responsbility to set the ContextClassLoader (which Tomcat does
appropriatley), and the J2EE spec also states that this is the
container's responsibility (which again would be Tomcat) -- so
certainly, although RepositoryClassLoader is obviously needed for
internal purposes, it should never be there when user-level code is
being executed.  But apparently there were/are some very strange class
loading issues that prompted this "HACK"... does anyone know what they
are?

Thanks,

David
Index: CocoonServlet.java
===================================================================
RCS file: /home/cvspublic/xml-cocoon2/src/java/org/apache/cocoon/servlet/CocoonServlet.java,v
retrieving revision 1.25
diff -u -r1.25 CocoonServlet.java
--- CocoonServlet.java	1 Jun 2002 14:44:42 -0000	1.25
+++ CocoonServlet.java	6 Jun 2002 18:35:04 -0000
@@ -207,9 +207,12 @@
 
         // Force context classloader so that JAXP can work correctly
         // (see javax.xml.parsers.FactoryFinder.findClassLoader())
-        try {
-            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
-        } catch (Exception e){}
+	// Only force if not already set
+	if( Thread.currentThread().getContextClassLoader() == null ) {
+	    try {
+                Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+            } catch (Exception e){}
+	}
 
         String value;
 
@@ -441,9 +444,11 @@
      */
     public void destroy()
     {
-        try {
-            Thread.currentThread().setContextClassLoader(classLoader);
-        } catch (Exception e){}
+        if( this.addClassDirs ) {
+	    try {
+                Thread.currentThread().setContextClassLoader(classLoader);
+            } catch (Exception e){}
+	}
 
         if (this.cocoon != null)
         {
@@ -935,9 +940,11 @@
 
         /* HACK for reducing class loader problems.                                     */
         /* example: xalan extensions fail if someone adds xalan jars in tomcat3.2.1/lib */
-        try {
-            Thread.currentThread().setContextClassLoader(classLoader);
-        } catch (Exception e){}
+	if( this.addClassDirs ) {
+            try {
+                Thread.currentThread().setContextClassLoader(classLoader);
+            } catch (Exception e){}
+	}
 
         // This is more scalable
         long start = System.currentTimeMillis();
@@ -1242,9 +1249,11 @@
 
         /* HACK for reducing class loader problems.                                     */
         /* example: xalan extensions fail if someone adds xalan jars in tomcat3.2.1/lib */
-        try {
-            Thread.currentThread().setContextClassLoader(this.classLoader);
-        } catch (Exception e){}
+	if( this.addClassDirs ) {
+	    try {
+                Thread.currentThread().setContextClassLoader(this.classLoader);
+            } catch (Exception e){}
+	}
 
         this.updateEnvironment();
         this.forceLoad();
@@ -1289,7 +1298,7 @@
      * of this class (eg. Cocoon Context).
      */
     protected void updateEnvironment() throws ServletException {
-        this.appContext.put(Constants.CONTEXT_CLASS_LOADER, classLoader);
+        this.appContext.put(Constants.CONTEXT_CLASS_LOADER, Thread.currentThread().getContextClassLoader());
         this.appContext.put(Constants.CONTEXT_CLASSPATH, getClassPath());
      }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to