RE: Still have XML loading problems

2001-03-25 Thread Kevin Jones

 The Jasper page compiler needs to have access to all of the bean classes
 that you might have placed in WEB-INF/classes and WEB-INF/lib.  This could
 be "faked" by setting up yet another class loader that simulates the
 "real" webapp class loader (in terms of what repositories it gives you
 visibility to), or by making the special Jasper class loader a sibling of
 the webapp class loader (rather than a child), and adding the WEB-INF
 repositories to it as well.

 This will work as long as you don't create an object in the Jasper class
 loader and then expect it to be visible in the webapp class loader (or
 vice versa) -- you get class cast exceptions at that point.

Craig, can we do this for now - it will solve these problems in the short
term and we can then think about re-writing Jasper?

Kevin Jones
DevelopMentor
www.develop.com





RE: Still have XML loading problems

2001-03-24 Thread Kevin Jones

 I'm interested in seeing if we can gather enough folks to start a "Jasper
 2.0" effort, on a completely fresh slate.  The design of this would take
 into account the two input syntaxes and everything we've learned, and the
 implementation could implement many obvious optimizations that would speed
 up the runtime code as well.

 What do you think?

I think this is a great idea - I'd certainly be interested,

Kevin Jones
DevelopMentor
www.develop.com






Re: Still have XML loading problems

2001-03-23 Thread Craig R. McClanahan

Kevin Jones wrote:

 Craig,

 I'm playing with the 22nd March drop of Catalina, and I've come across a
 scenario where the new classloading architecture doesn't quite work.

 I'm using Xerces and Xalan (although Xalan is irrelevant to this). If I
 access a servlet that uses XML and I don't put Xerces in my
 web-app/myapp/lib my code fails (exactly what I'd expect). If I put
 Xerces.jar into web-app/myapp/lib it works, again what I'd expect.

 However, if I put my XML code into an application listener then Jasper fails
 to load - I get a Security Exception, sealing violation, while it's load the
 'jsp' servlet. It seems that what's happening is that my listener loads,
 loads Xerces and executes OK. The jsp Servlet then tries to load
 crimson/JAXP and *bang* sealing violation.


I will bet you're using a JDK 1.3 platform, right?  It turns out that all the
changes we made are very effective for JDK 1.2, but the 1.3 version of
URLClassLoader still doesn't like it.  :-(


 Sorry about this - the XML stuff had been going so well until then!


I think the only workaround for this is to ship our own copy of the JAXP JAR
files, with the "sealed" attribute removed.  I'm also going to be talking with
the JAXP folks about removing that in their next release.



 Kevin Jones
 DevelopMentor
 www.develop.com

Craig





RE: Still have XML loading problems

2001-03-23 Thread Kevin Jones

Yep 1.3

 I think the only workaround for this is to ship our own copy of
 the JAXP JAR
 files, with the "sealed" attribute removed.  I'm also going to be
 talking with
 the JAXP folks about removing that in their next release.

:-(

What would happen if you made a special case of the JSP servlet and loaded
it early?
Could you preload jasper somewhere else?

Kevin Jones
DevelopMentor
www.develop.com

 -Original Message-
 From: Craig R. McClanahan [mailto:[EMAIL PROTECTED]]
 Sent: 23 March 2001 19:05
 To: Kevin Jones
 Cc: Tomcat-Dev
 Subject: Re: Still have XML loading problems


 Kevin Jones wrote:

  Craig,
 
  I'm playing with the 22nd March drop of Catalina, and I've come across a
  scenario where the new classloading architecture doesn't quite work.
 
  I'm using Xerces and Xalan (although Xalan is irrelevant to this). If I
  access a servlet that uses XML and I don't put Xerces in my
  web-app/myapp/lib my code fails (exactly what I'd expect). If I put
  Xerces.jar into web-app/myapp/lib it works, again what I'd expect.
 
  However, if I put my XML code into an application listener then
 Jasper fails
  to load - I get a Security Exception, sealing violation, while
 it's load the
  'jsp' servlet. It seems that what's happening is that my listener loads,
  loads Xerces and executes OK. The jsp Servlet then tries to load
  crimson/JAXP and *bang* sealing violation.
 

 I will bet you're using a JDK 1.3 platform, right?  It turns out
 that all the
 changes we made are very effective for JDK 1.2, but the 1.3 version of
 URLClassLoader still doesn't like it.  :-(

 
  Sorry about this - the XML stuff had been going so well until then!
 

 I think the only workaround for this is to ship our own copy of
 the JAXP JAR
 files, with the "sealed" attribute removed.  I'm also going to be
 talking with
 the JAXP folks about removing that in their next release.


 
  Kevin Jones
  DevelopMentor
  www.develop.com

 Craig





Re: Still have XML loading problems

2001-03-23 Thread Craig R. McClanahan

Kevin Jones wrote:

 Yep 1.3

  I think the only workaround for this is to ship our own copy of
  the JAXP JAR
  files, with the "sealed" attribute removed.  I'm also going to be
  talking with
  the JAXP folks about removing that in their next release.

 :-(

 What would happen if you made a special case of the JSP servlet and loaded
 it early?
 Could you preload jasper somewhere else?


It (the JSP servlet) is loaded early already.

It (and its XML parser) are now loaded by another classloader (not sure
that was
true on the 22nd -- if your Tomcat 4.0 has "jasper-compiler.jar" and
"jasper-runtime.jar" separated, then it is for you).

The problem is the following scenario:

* JSP servlet loads early, parses TLDs from the web.xml file (which
  causes some JAXP parser classes to be loaded).

* You do something with Xerces that causes Xerces classes to
  be loaded, from your webapps class loader (parent of the one
  used by the JSP servlet).

* You do something with a JSP page that causes more parser
  classes to be loaded (from the JSP servlet's classloader), including
  a class with the same fully qualified name as one of the Xerces
  classes you just loaded.

* Under 1.2 this worked.  Under 1.3 it gives sealing violation errors

The only other possible workaround I can think if is to exhaustively
load every
single class file out of jaxp.jar and crimson.jar at startup time.  That
seems
horrendously wasteful of memory (especially when you consider that this
has to
be done for each web app).


 Kevin Jones
 DevelopMentor
 www.develop.com

Craig



RE: Still have XML loading problems

2001-03-23 Thread Kevin Jones

 It (the JSP servlet) is loaded early already.

 It (and its XML parser) are now loaded by another classloader (not sure
 that was
 true on the 22nd -- if your Tomcat 4.0 has "jasper-compiler.jar" and
 "jasper-runtime.jar" separated, then it is for you).

I have jasper-compiler.jar in 'jasper' and jasper-runtime.jar in 'lib'

 The problem is the following scenario:

 * JSP servlet loads early, parses TLDs from the web.xml file (which
   causes some JAXP parser classes to be loaded).

 * You do something with Xerces that causes Xerces classes to
   be loaded, from your webapps class loader (parent of the one
   used by the JSP servlet).

 * You do something with a JSP page that causes more parser
   classes to be loaded (from the JSP servlet's classloader), including
   a class with the same fully qualified name as one of the Xerces
   classes you just loaded.

 * Under 1.2 this worked.  Under 1.3 it gives sealing violation errors


I'm not seeing this sequence (I don't think)

* I'm loading Xerces in my listener (in fact all I'm doing is using the
DocumentBuilder and DocumentBuilderFactory), in the contextInitialized
method, this is getting loaded first.

* JSP servlet is trying to load - in it's init() method I get the exception

No TLDs but I see a call to TldLocationsCache.init

This is part of the trace I'm seeing

ContextConfig[/KRJ]: Added certificates - request attribute Valve
xmlSetupListener: enter contextInitialized
xmlSetupListener: leave contextInitialized
StandardWrapper[/KRJ:default]: Loading container servlet default
default: init
StandardWrapper[/KRJ:invoker]: Loading container servlet invoker
invoker: init
StandardWrapper[/KRJ:jsp]: Using Jasper classloader for servlet jsp
jsp: init
StandardContext[/KRJ]: Servlet /KRJ threw load() exception
javax.servlet.ServletException: Servlet.init() for servlet jsp threw
exception
at
org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:791)
at
org.apache.catalina.core.StandardContext.start(StandardContext.java:3135)

... lines omitted for brevity ...

- Root Cause -
java.lang.SecurityException: sealing violation
at java.net.URLClassLoader.defineClass(URLClassLoader.java:234)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at
org.apache.catalina.loader.StandardClassLoader.findClass(StandardClassLoader
.java:646)
at
org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader
.java:1013)
at
org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader
.java:912)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
at
org.apache.jasper.compiler.TldLocationsCache.processWebDotXml(TldLocationsCa
che.java:161)


 The only other possible workaround I can think if is to exhaustively
 load every
 single class file out of jaxp.jar and crimson.jar at startup time.  That
 seems
 horrendously wasteful of memory (especially when you consider that this
 has to
 be done for each web app).


Agreed

Kevin Jones
DevelopMentor
www.develop.com





Re: Still have XML loading problems

2001-03-23 Thread Craig R. McClanahan

Kevin Jones wrote:

  It (the JSP servlet) is loaded early already.
 
  It (and its XML parser) are now loaded by another classloader (not sure
  that was
  true on the 22nd -- if your Tomcat 4.0 has "jasper-compiler.jar" and
  "jasper-runtime.jar" separated, then it is for you).

 I have jasper-compiler.jar in 'jasper' and jasper-runtime.jar in 'lib'


If I had looked at my calendar I would have figured that one out ...


 
  The problem is the following scenario:
 
  * JSP servlet loads early, parses TLDs from the web.xml file (which
causes some JAXP parser classes to be loaded).
 
  * You do something with Xerces that causes Xerces classes to
be loaded, from your webapps class loader (parent of the one
used by the JSP servlet).
 
  * You do something with a JSP page that causes more parser
classes to be loaded (from the JSP servlet's classloader), including
a class with the same fully qualified name as one of the Xerces
classes you just loaded.
 
  * Under 1.2 this worked.  Under 1.3 it gives sealing violation errors
 

 I'm not seeing this sequence (I don't think)

 * I'm loading Xerces in my listener (in fact all I'm doing is using the
 DocumentBuilder and DocumentBuilderFactory), in the contextInitialized
 method, this is getting loaded first.


Yep, Listeners (and Filters) get initialized before any load-on-startup
servlets do.


 * JSP servlet is trying to load - in it's init() method I get the exception

 No TLDs but I see a call to TldLocationsCache.init


The constructor calls processWebDotXml(), which scans web.xml looking for
taglib directives (using an XML parse, of course).

You're seeing the same symptom from operations in a different order, but the
cause is identical -- when a JAXP class is loaded *after* a Xerces class (even
though the Xerces class is loaded from a parent class loader), you get the error
on a 1.3 JVM.

 Kevin Jones


Craig





RE: Still have XML loading problems

2001-03-23 Thread Kevin Jones

Craig,

bear with my ignorance of how Catalina works at this point.
I'm assuming that the JSP servlet compiles the 'raw' JSP-XML-Java and then
compiles this to a .class file.

Why does the Jasper class-loader delegate to the web-apps classloader, isn't
the Jasper step entirely independent. If so, couldn't the JSP servlet create
its own CL that doesn't delegate to the webapps loader, but delegates
straight to the shared classloader. In fact we could take tools.jar off-of
the classpath and make it available to this classloader only.

So the Jasper CL would pick up tools.jar, crimson.jar and jaxp.jar and
everything from my webapp lib and classes, but doesn't delegate to the
webapp CL. This should have the effect of making Jasper independent of my
webapp CL.

The other CLs would work the same.

It makes the CL architecture slightly more complicated (but it already is
complicated).

Will this work?

Another thought. If Jasper is a two step process (.jsp-XML, XML-Java) as
step 1, java-.class as step 2, only the first step needs an XML parser, can
we isolate that first step with a separate CL?

Kevin (waiting to be shot down in flames) Jones