[xmlc] Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Issues with XMLC 2.3.2

Sasa Bojanic <[email protected]> Mon, 28 Mar 2011 22:28:59 +0200
Newsgroups gmane.comp.java.enhydra.xmlc
Message-ID <[email protected]>
This is a multi-part message in MIME format...

------------=_1301344147-30467-16073
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

My mistake about the "general" problem...now I see that generated XMLC 
Java classes have non-default constructor taking DocumentLoader object 
as an initialization parameter...sorry.

I still hesitate to contact Tomcat guys since I'm not deep into our 
MultiClassLoader code...so I don't know if there is a bug in-there.

Regarding DOM problem, yes, I tried both XERCES/XML-APIS from XMLC2.3-1 
and XMLC2.3-2, and the result is the same.

"projectManagement" application and ALL other applications from the ZIP 
file: 
https://docs.google.com/leaf?id=0B9ZAe6ftekYJMGVmYjdmZDMtMjY5YS00MDU4LWIzNWEtYzhiMjBlMzZjYTZj&sort=name&layout=list&pid=0B9ZAe6ftekYJNWQ0ZDRmNjMtN2M2MS00NDIyLWJmZmUtYWE0Y2Y4MDFiMDUw&cindex=18

are prepared for Stand-alone Tomcat deployment...

Greetings,
Sasa.

On 28-Mar-11 22:04, Jacob Kjome wrote:
> See comments inline below...
>
> On Mon, 28 Mar 2011 14:35:27 +0200
>  Sasa Bojanic <[email protected]> wrote:
>> Jake, first of all, thanks a lot for your effort!
>>
>
> No problem.  I any changes I made are breaking applications, I want to 
> make sure they get corrected, or at least explained, properly.
>
>> ...here is the followup:
>>
>> 1) I think there is a general problem in XMLC when implementing 
>> CustomDocumentLoader/CustomResourceLoader.
>> Hence, the JAVA classes generated based on HTML template always use 
>> StandardDocumentLoader.
>
> I'm not sure I understand how this is a "general problem" with 
> document/resource loaders.  Keep in mind, they are resource location 
> generic, i.e., they are meant to make resource loading plugable, 
> allowing loading from contexts not possible prior to XMLC 2.3.2, such 
> as the servlet context... or even a database.  Loading from a class 
> loader is merely one option, albeit a built-in default one as it has 
> been available (along with loading from configured resource 
> directories) since the original XMLC 2.2 release.  The custom one I 
> created for you is a minimal implementation that simply overrides the 
> way URLs are obtained from the class loader in the default resource 
> loader implementation.
>
> In my view, this is clearly a class loader bug.  If the class loader 
> can actually see the resource and provide a URL, then that URL ought 
> to be a valid one.  That Tomcat's StandardClassLoader is returning an 
> invalid URL is absolutely a bug that should be reported to, and 
> corrected by, the Tomcat team.  Supplying the thread context class 
> loader to the XMLCDeferredParsingFactory constructor is the obvious 
> workaround.  But it is a workaround only made necessary by a class 
> loader bug.
>
> That said, I recommend using the thread context class loader 
> regardless of this particular class loader bug, as it provides the 
> added benefit of allowing XMLC libraries in the server lib to be able 
> to see classes and resources in a child classloader (e.g, the 
> WebappClassLoader).
>
>> Don't know if this can be somehow configured to specify the custom 
>> one? options.xmlc?
>>
>
> I really view this as outside the scope of XMLC configuration.  That 
> configuration is focused on template configuration, not how they are 
> loaded.  Besides, the resource loader is used to load options.xmlc.  
> It's a chicken/egg problem.  Application code has complete control 
> over how the XMLCDeferredParsingFactory is instantiated, so it is 
> application code where this should be addressed.
>
> XMLCContext, if you so choose to use it, provides for various servlet 
> context parameters that you can configure in web.xml to specify 
> various things, including document loaders.  And it **ALWAYS** 
> instantiates the XMLCDeferredParsingFactory using the thread context 
> class loader.  See....
>
> http://websvn.ow2.org/filedetails.php?repname=xmlc&path=%2Ftrunk%2Fxmlc%2Fexamples%2Ftomcat%2Fres%2Fwebapps%2Fxmlc%2FWEB-INF%2Fweb.xml.in 
>
>
> http://websvn.ow2.org/filedetails.php?repname=xmlc&path=%2Ftrunk%2Fxmlc%2Fexamples%2Ftomcat%2Fsrc%2Fxmlc%2Fdemo%2FPreview.java 
>
>
>
> All you need to do to access it is...
>
> XMLCContext context = XMLCContext.getContext(servletObj);
> ...or...
> XMLCContext context = XMLCContext.getContext(servletContextObj);
>
> ...and then...
> XMLCDeferredParsingFactory dpFactory = 
> context.getXMLCDeferredParsingFactory();
>
>
> If you use this, your applications will be more configurable and never 
> run into invalid URLs again.
>
>
>> 2) Maybe it makes sense to implement the following patch to XMLC's 
>> ResourceLoaderImpl:
>>
>>      protected URL getPathURLFromClasspath(final String candidatePath) {
>>         URL url = 
>> Thread.currentThread().getContextClassLoader().getResource(candidatePath);
>>         if (url==null) {
>>            url = fFactory.getPathURLFromClasspath(candidatePath);
>>         }
>>         return url;
>>     }
>>
>
> Actually, it would be the thread context classloader that might be 
> null, in the case that the code is not running under a JEE server that 
> sets it.  That said, it's an option to consider, e.g.,....
>
>     protected URL getPathURLFromClasspath(final String candidatePath) {
>         ClassLoader loader = 
> Thread.currentThread().getContextClassLoader();
>         if (loader != null) {
>             return loader..getResource(candidatePath);
>         }
>         return fFactory.getPathURLFromClasspath(candidatePath);
>     }
>
> But while this might transparently resolve your issue, it takes away 
> the ability of the user to determine the class loader to use, which 
> they can currently specify by supplying their class loader of choice 
> to the XMLCDeferredParsingFactory constructor.  For this reason, I 
> hesitate to implement this option.
>
>
>> 3) I found the place where we can patch Enhydra's MultiClassLoader 
>> (similar way as the patch provided for XMLCDeferredParsingFactory), 
>> so that it returns the "right" resource path in the case of JAR 
>> files, so actually from our side, there is no need for the 
>> modification mentioned above.
>
> I take it your class loader wraps Tomcat's StandardClassLoader (when 
> running under Tomcat, that is)?  Maybe you should have it wrap the 
> thread context class loader instead?  That way, you avoid the 
> StandardClassLoader's buggyness.  In any case, there's no good reason 
> for any class loader to return invalid URLs.  Again, I urge you to 
> report this issue to the Tomcat developers so this issue can be 
> properly fixed for everyone using Tomcat's StandardClassLoader.
>
>>
>> 4) When implementing either the modification on ResourceLoaderImpl or 
>> changing MultiClassLoader, calculator and discRack applications are 
>> working normally. However, the projectManagement application is 
>> working only "partially"...maybe it is a completely new problem 
>> there, or this is the similar one but somehow hidden and not so 
>> obvious to determine (just to mention that application works normally 
>> under EXACTLY THE SAME conditions under XMLC2.3-1).
>> The start page of projectManagement applications is generated 
>> smoothly, when you log in as admin/enhydra, the next page is also OK.
>> However, when you click on the link "Employee" or "Customer", the 
>> following exception is thrown:
>>
>
> This is a completely distinct problem.  This is either an issue with 
> the LazyDOM or, possibly with Xerces itself.  Did you try downgrading 
> to the version of xercesImpl and xml-apis that came with XMLC-2.3.1?  
> Please try that first.  If you still get an error, let me know.  I 
> think there was a change to the lazydom for XMLC 2.3.2 (some bug 
> fix).  I can't recall exactly what it was, though.  It's possible I 
> introduced a regression.  Only more testing will tell.
>
> BTW, is the "projectManagement" application runnable under 
> Tomcat-Standalone or does it require Enhydra server?
>
>> org.w3c.dom.DOMException: NOT_FOUND_ERR: An attempt is made to 
>> reference a node in a context where it does not exist.
>>          at 
>> org.apache.xerces.dom.ParentNode.internalRemoveChild(Unknown Source)
>>          at org.apache.xerces.dom.ParentNode.removeChild(Unknown Source)
>>          at 
>> org.enhydra.xml.lazydom.LazyElementNoNS.removeChild(LazyElementNoNS.java:338)
>>          at 
>> projectmanagement.presentation.employees.Administering.handleDefault(Administering.java:80)
>>          at 
>> projectmanagement.presentation.BasePO.handleEvent(BasePO.java:282)
>>          at projectmanagement.presentation.BasePO.run(BasePO.java:156)
>>          at 
>> com.lutris.appserver.server.httpPresentation.HttpPresentationManager.runPresentationObj(Unknown 
>> Source)
>>          at 
>> com.lutris.appserver.server.httpPresentation.HttpPresentationManager.Run(Unknown 
>> Source)
>>          at 
>> com.lutris.appserver.server.httpPresentation.servlet.HttpPresentationServlet.serviceDirect(HttpPresentationServlet.java:697)
>>          at 
>> com.lutris.appserver.server.httpPresentation.servlet.HttpPresentationServlet.service(HttpPresentationServlet.java:822)
>>          at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
>>          at 
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>>          at 
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>>          at 
>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>>          at 
>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>>          at 
>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>>          at 
>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>>          at 
>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>>          at 
>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
>>          at 
>> org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
>>          at 
>> org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
>>          at 
>> org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
>>          at java.lang.Thread.run(Thread.java:662)
>>
>>
>> (I just modified a little bit original sources to print the stack 
>> trace of the exception).
>>
>>        table.removeChild(page.getElementTemplateRow());
>>
>> The strange is that such exception does not happen when accessing 
>> Project/Pay Rate/Worksheet links, and the code for this pages is 
>> similar...removal of table template row happens.
>>
>> Can you give me some leads here?
>>
>
> See above for answers.
>
>> Greetings,
>> Sasa.
>>
>
>
> Jake
>
>>
>> On 28-Mar-11 07:11, Jacob Kjome wrote:
>>> I tried out your calculator.war example and was able to replicate 
>>> the problem.
>>> I've also tracked down the cause.  It turns out that while XMLC 
>>> 2.3.1 and 2.3.2
>>> still do essentially the same thing, there's a nuance in how source 
>>> file URLs are
>>> created.  In XMLC 2.3.1, the classloader used to obtain the URL is 
>>> the same one
>>> that loaded the XMLC class file.  In XMLC 2.3.2, it's the one 
>>> provided to the
>>> XMLCDeferredParsingFactory constructor.
>>>
>>> Now, in the Tomcat demo application, this turns out to be the same 
>>> classloader, as
>>> XMLCContext provides 
>>> "Thread.currentThread().getContextClassLoader()" to the
>>> XMLCDeferredParsingFactory constructor and, of course, this ends up 
>>> being the
>>> WebappClassLoader as it's a thread from the current application that 
>>> is loading
>>> all the classes and the server sets this as the thread context class 
>>> loader for us.
>>>
>>> As it turns out, when URLs are created from the WebappClassLoader,
>>> loader.toString(), or loader.toExternalForm(), produces a valid JAR 
>>> URL, such as...
>>>
>>> jar:file:/E:/Java/Apache/apache-tomcat-7.0.11/webapps/calculator/WEB-INF/lib/calculator.jar!/calculator/presentation/Calculator.html 
>>>
>>>
>>> However, in the calculator application, the classloader provided to the
>>> XMLCDeferredParsingFactory constructor is actually the parent 
>>> classloder of the
>>> WebappClassLoader and, under Tomcat Standalone, an instance of
>>> "org.apache.catalina.loader.StandardClassLoader".
>>>
>>> As it turns out, when URLs are created from the StandardClassLoader,
>>> loader.toString(), or loader.toExternalForm(), produces an invalid 
>>> JAR URL, such as...
>>>
>>> file:/E:/Java/Apache/apache-tomcat-7.0.11/webapps/calculator/WEB-INF/lib/calculator.jarcalculator/presentation/Calculator.html 
>>>
>>>
>>>
>>> This subtle change in behavior was unforeseen and you are the first 
>>> to report it.
>>>    I never encountered it in my testing because, as mentioned 
>>> previously, I always
>>> use the thread context class loader.  Personally, I think it's a bug 
>>> in Tomcat, as
>>> it shouldn't matter what kind of class loader it is.  All class 
>>> loaders ought to
>>> be able to generate valid jar URLs.  I encourage you to report this 
>>> to the Tomcat
>>> development team!
>>>
>>> At this point, there's no going back to the way XMLC 2.3.1 loaded 
>>> URLs because of
>>> significant design changes.  The point at which URLs are now loaded 
>>> provides no
>>> access to the XMLC class file and, therefore, no way to obtain the 
>>> classloader
>>> that loaded the XMLC class file... that is, unless XMLC always uses 
>>> the thread
>>> context classloader to load resources (more on that below).  Anyway, 
>>> here are the
>>> obvious fixes in my order of preference...
>>>
>>> 1.  Always pass "Thread.currentThread().getContextClassLoader()" to the
>>> XMLCDeferredParsingFactory constructor.  This resolves all issues, 
>>> end of story.
>>>
>>> 2.  If #1 is not possible/desirable, then you can implement your own 
>>> custom
>>> document/resource loader, similar to what I attached to my last 
>>> email (see the new
>>> version attached to this email); the only difference being the 
>>> method to override
>>> now looks like...
>>>
>>>       protected URL getPathURLFromClasspath(final String 
>>> candidatePath) {
>>>           return
>>> Thread.currentThread().getContextClassLoader().getResource(candidatePath); 
>>>
>>>       }
>>>
>>> 3.  Change XMLC's 
>>> XMLCDeferredParsingFactory.getPathURLFromClasspath(String)
>>> method to use the thread context classloader.  While this is an 
>>> option, it's not a
>>> very good one because the thread context class loader may not always 
>>> be the right
>>> choice.  While it generally is the right choice 99.99999% of the 
>>> time in a JEE
>>> environment, XMLC is not always used in a server environment.  And 
>>> there's always
>>> going to be that edge case where, even in a server environment it's 
>>> not desirable.
>>>    And, of course, that's where option #1 really shines.  You get to 
>>> choose which
>>> classloader to use so XMLC doesn't have to guess.
>>>
>>> 4.  If you can think of a better idea, let me know.  I'm highly 
>>> resistant to #3.
>>> I realize the change in behavior is inconvenient (and most likely a 
>>> Tomcat bug
>>> anyway), but it's a simple change on the user's part and can be done 
>>> as part of
>>> the upgrade from 2.3.1 to 2.3.2.  Besides, the design changes that 
>>> introduced this
>>> [easily-worked-around] situation make XMLC far more flexible in 
>>> regard to resource
>>> loading than it was before.  I think the benefits outweigh the costs.
>>>
>>>
>>> Thoughts?
>>>
>>> Jake
>>>
>>> On 3/27/2011 3:56 PM, Sasa Bojanic wrote:
>>>> OK, as I said, I will try to look at our classloader. But I can 
>>>> confirm
>>>> that the problem that occurs with XMLC 2.3-2 does NOT occur with XMLC
>>>> 2.3-1 under EXACTLY the SAME conditions.
>>>> As a sample, this time I used the simplest "calculator" application 
>>>> from
>>>> Enhydra Demos package. This sample uses only XMLC and Enhydra 
>>>> Framework
>>>> classes (no database where we use our product DODS, and then JOTM and
>>>> other JTA support libraries).
>>>>
>>>> I deployed "calculator" application under pure Tomcat 6.0-29, JDK
>>>> 1.6.0_23 x64, Win7 x64.
>>>> It works normally. Then I first replaced xercesImpl, xml-apis and
>>>> nekohtml JAR files with the newer versions from XMLC 2.3-2. It still
>>>> worked normally.
>>>> After I finally replaced xmlc.jar (2.3-1) with xmlc-all-runtime.jar,
>>>> removed gnu-regexp.jar and introduced jregex.jar, I get the 1st
>>>> described problem with not being able to find the resource from the 
>>>> JAR
>>>> file:
>>>>
>>>> java.io.FileNotFoundException:
>>>> d:\apache-tomcat-6.0.29\webapps\calculator\WEB-INF\lib\calculator.jarcalculator\presentation\CalculatorHTML.xmlc 
>>>>
>>>> (The system cannot find the path specified)
>>>>
>>>> You can download a set of Enhydra Demo applications (version 8.4-1) 
>>>> for
>>>> pure Tomcat from:
>>>>
>>>> https://docs.google.com/leaf?id=0B9ZAe6ftekYJMGVmYjdmZDMtMjY5YS00MDU4LWIzNWEtYzhiMjBlMzZjYTZj&sort=name&layout=list&pid=0B9ZAe6ftekYJNWQ0ZDRmNjMtN2M2MS00NDIyLWJmZmUtYWE0Y2Y4MDFiMDUw&cindex=18 
>>>>
>>>>
>>>>
>>>> (If necessary, you can find the source code of Enhydra Demos (TDA),
>>>> Enhydra Framework (TAF), Enhydra DODS (TRO) at:
>>>> https://docs.google.com/leaf?id=0B9ZAe6ftekYJNTc0OWM2NzctNzM3MS00YmNjLTkyMTctZjg0ZWUxZWI2YWQw&;hl=en 
>>>>
>>>>
>>>> but to reproduce the problem, downloading the 1st link is enough)
>>>>
>>>> There are many applications based on XMLC included in the ZIP file 
>>>> from
>>>> the 1st link above, ready to be deployed on pure Tomcat.
>>>> As the simplest one for testing you can take "calculator.war" I used
>>>> this time.
>>>>
>>>> After I provide a "patch/workaround" for this problem of finding
>>>> resource in the JAR file, the problem disappears.
>>>>
>>>> When I moved all the JAR files except the application JAR file
>>>> (calculator.jar) to the common/shared class-loader (Tomcat's lib
>>>> folder), this time I do NOT have the 2nd problem I described...so that
>>>> might be my mistake during previous tests. The 2nd problem also 
>>>> does NOT
>>>> appear with "discRack" application either. So I assume the
>>>> "patch/workaround" somehow solves all the problems.
>>>>
>>>> Since the ONLY difference with the deployment of this sample
>>>> XMLC/Enhydra Framework/DODS applications is the version of XMLC, 
>>>> can you
>>>> please look at that samples yourself, and confirm the issue.
>>>>
>>>> Greetings,
>>>> Sasa.
>>>>
>>>>
>>>> On 26-Mar-11 20:14, Jacob Kjome wrote:
>>>>> The thing is, XMLC doesn't create the URL object that provides the
>>>>> path to the
>>>>> resource; the classloader does.  That goes for both XMLC 2.3.1 and
>>>>> 2.3.2.  I can't
>>>>> explain why behavior would be different for you between the two
>>>>> versions?  Of
>>>>> course, I can't replicate your findings in the first place, so I'm at
>>>>> a loss.
>>>>>
>>>>> One thing that is a red flag for me is the path you provided...
>>>>>
>>>>> "d:\apache-tomcat-6.0.29\webapps\discRack\WEB-INF\lib\*discRack.jardiscRack*\presentation\ErrorHTML.xmlc" 
>>>>>
>>>>>
>>>>>
>>>>> That isn't even a valid URL.  There's no "file:/" and all the 
>>>>> slashes are
>>>>> backward.  This looks to me like a custom classloader bug.  Again,
>>>>> XMLC doesn't
>>>>> generate the URL, the classloader does.
>>>>>
>>>>> When you say that "it works under 2.3.1", are you sure you tested
>>>>> 2.3.1 with the
>>>>> same version of the server you are using to test 2.3.2?  That is, 
>>>>> when
>>>>> you tested
>>>>> 2.3.1, was the server an older version than what you are using with
>>>>> 2.3.2?  If so,
>>>>> please reduce the number of extraneous variables by testing with the
>>>>> older server
>>>>> version (the one known to work) and just switching out the 2.3.1
>>>>> libraries with
>>>>> the 2.3.2 libraries.  Do you get better results?
>>>>>
>>>>> If you can send me a minimal webapp (able to run under Tomcat
>>>>> standalone) with
>>>>> explicit instructions on how to replicate the problem, then I'll test
>>>>> it myself
>>>>> and let you know the results.
>>>>>
>>>>> BTW, here's how XMLCContext loads up the deferred parsing factory...
>>>>>
>>>>> XMLCDeferredParsingFactory newFactory
>>>>>           = new XMLCDeferredParsingFactory(loader,
>>>>> Thread.currentThread().getContextClassLoader(), logger);
>>>>>
>>>>>
>>>>> First, notice that the classloader is set up as the thread context
>>>>> class loader of
>>>>> the application.  This is the reason why the XMLC Tomcat demo 
>>>>> works no
>>>>> matter
>>>>> where the XMLC libraries are located in relation to the jar 
>>>>> containing
>>>>> the
>>>>> templates.  When templates are in the parent classloader, the webapp
>>>>> (child)
>>>>> classloader can always see that, so they load just fine.  And when 
>>>>> the
>>>>> templates
>>>>> are in the webapp classloader while the XMLC libraries are in the
>>>>> parent, XMLC can
>>>>> see down to the child classloader because it has a reference to 
>>>>> the child
>>>>> classloader via the thread context classloader.
>>>>>
>>>>> Clearly the "(MultiClassLoader)
>>>>> presentationManager.getAppClassLoader()" doesn't
>>>>> have a reference to the thread context classloader, otherwise you
>>>>> would not run
>>>>> into the issues you have of not finding the templates in certain
>>>>> situations.
>>>>>
>>>>>
>>>>> Second, you can customize the loading of resources by using a custom
>>>>> DocumentLoader/ResourceLoader combo.  See the 
>>>>> ValidatingDocumentLoader
>>>>> example in
>>>>> the Tomcat demo....
>>>>>
>>>>> http://websvn.ow2.org/filedetails.php?repname=xmlc&path=%2Ftags%2FXMLC_2_3_2%2Fxmlc%2Fexamples%2Ftomcat%2Fsrc%2Fxmlc%2Fdemo%2FValidatingDocumentLoader.java 
>>>>>
>>>>>
>>>>>
>>>>> This one extends ServletDocumentLoaderImpl, but if you don't care
>>>>> about loading
>>>>> resources from the servlet context, then you can just extend
>>>>> DocumentLoaderImpl.
>>>>> Attached is a sample you can use.  Instead of using
>>>>> StandardDocumentLoader.getInstance() in the following...
>>>>>
>>>>> xmlcFactory = new
>>>>> XMLCDeferredParsingFactory(StandardDocumentLoader.getInstance(),
>>>>>
>>>>> (MultiClassLoader)presentationManager.getAppClassLoader(),
>>>>>                                new EnhydraXMLCLogger(logChannel));
>>>>>
>>>>> ...use...
>>>>>
>>>>> xmlcFactory = new XMLCDeferredParsingFactory(new 
>>>>> CustomDocumentLoader(),
>>>>>
>>>>> (MultiClassLoader)presentationManager.getAppClassLoader(),
>>>>>                                new EnhydraXMLCLogger(logChannel));
>>>>>
>>>>> ...and if you want to be able to load resources no matter where they
>>>>> exist in the
>>>>> classloader hierarchy relative to where XMLC libraries exist in the
>>>>> hierarchy use...
>>>>>
>>>>> xmlcFactory = new XMLCDeferredParsingFactory(new 
>>>>> CustomDocumentLoader(),
>>>>>
>>>>> Thread.currentThread().getContextClassLoader(),
>>>>>                     new EnhydraXMLCLogger(logChannel));
>>>>>
>>>>> With the custom document/resource loader, you can change the behavior
>>>>> of resource
>>>>> loading without modifying the internals of XMLC at all.  This feature
>>>>> is new to
>>>>> XMLC-2.3.2.  However, remember that besides the added plugability
>>>>> provided by
>>>>> XMLC-2.3.2, ultimately, XMLC 2.3.1 and 2.3.2 don't do anything
>>>>> different to load
>>>>> resources from the classloader.  They both use
>>>>> classLoader.getResource("some/path/to/resoruce.html").  If that
>>>>> provides a URL
>>>>> producing an invalid path, that's a bug in the classloader, not XMLC.
>>>>>
>>>>>
>>>>> Jake
>>>>>
>>>>> On 3/25/2011 9:14 AM, Sasa Bojanic wrote:
>>>>>> Hi,
>>>>>>
>>>>>> yes, I'm of course also using 64-bit Java.
>>>>>>
>>>>>> I will check about our MultiClassLoader, but the point is EVERYTHING
>>>>>> WORKS PERFECTLY with XMLC 2.3-1. We don't have a problem with 
>>>>>> resource
>>>>>> lookup within the JAR file, and do not have a problem with scenario
>>>>>> where XMLC is not in the application's classloader.
>>>>>>
>>>>>> We are trying to find the reason why we can't switch to XMLC 2.3-2
>>>>>> seamlessly...and since everything works with XMLC2.3-1 we think 
>>>>>> it is a
>>>>>> XMLC issue?
>>>>>>
>>>>>> Regards,
>>>>>> Sasa.
>>>>>>
>>>>>> On 25-Mar-11 16:03, Jacob Kjome wrote:
>>>>>>> In this particular case, XMLC can certainly find the file (as 
>>>>>>> opposed
>>>>>>> to the other case where it can't when XMLC libs are in the 
>>>>>>> server lib,
>>>>>>> at least on your system), but the path is messed up.  But this is
>>>>>>> really not XMLC's fault.  The classloader's getResource() method is
>>>>>>> returning an invalid path.  Other than tweaking it with your
>>>>>>> workaround, there's nothing XMLC can (nor should) do about that
>>>>>>> (though there is a way you can work around this without messing 
>>>>>>> with
>>>>>>> XMLC's core, which I will send in a separate email later 
>>>>>>> today).  As I
>>>>>>> mentioned, it works perfectly well on my system.
>>>>>>>
>>>>>>> You have, potentially, at least 3 platform differences.  The 
>>>>>>> first is
>>>>>>> Win7 x64, where I've only tested on WinXP x32.  You may also be 
>>>>>>> using
>>>>>>> 64 bit Java, though you'd have to verify that.  And you are running
>>>>>>> under Enhydra, with some "MultiClassLoader" classloader
>>>>>>> implementation.  Somewhere in these differences lies a bug that 
>>>>>>> is not
>>>>>>> the fault of XMLC.
>>>>>>>
>>>>>>> I would start first with the "MultiClasLoader" and see whether 
>>>>>>> there
>>>>>>> is a bug in its getResource() method that returns URL's with 
>>>>>>> invalid
>>>>>>> paths when resources are looked up in jar files.  Second, I'd 
>>>>>>> check if
>>>>>>> there's a bug in the JDK you are using (maybe the 64 bit version 
>>>>>>> has a
>>>>>>> bug where the 32 bit version I use does not?).  Third, I guess 
>>>>>>> could
>>>>>>> be a bug in Win7, though I would think the Java platform would be
>>>>>>> responsible for working around that given the supposed "platform
>>>>>>> independence" and all.
>>>>>>>
>>>>>>> Expect another email describing a workaround you can use, without
>>>>>>> messing with XMLC's core, a bit later when I have access to my
>>>>>>> development machine.
>>>>>>>
>>>>>>> Jake
>>>>>>>
>>>>>>>
>>>>>>> On Thu, 24 Mar 2011 22:41:23 +0100
>>>>>>>     Sasa Bojanic<[email protected]>   wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> from what I can see in Enhydra code, XMLCDeferredParsingFactory is
>>>>>>>> obtained by calling its constructor:
>>>>>>>>
>>>>>>>>           xmlcFactory = new
>>>>>>>> XMLCDeferredParsingFactory(StandardDocumentLoader.getInstance(),
>>>>>>>>
>>>>>>>> (MultiClassLoader) presentationManager.getAppClassLoader(),
>>>>>>>>                                                        new
>>>>>>>> EnhydraXMLCLogger(logChannel));
>>>>>>>>
>>>>>>>> First of all let me show you an error that occurs when XMLC is 
>>>>>>>> in the
>>>>>>>> application classloader. The error is in the attached document...
>>>>>>>>
>>>>>>>> I use Tomcat 6.0.29, Java 1.6_23, Win7 x64, and all the JARs 
>>>>>>>> you've
>>>>>>>> mentioned are in this case in the application's WEB-INF\lib 
>>>>>>>> folder.
>>>>>>>>
>>>>>>>> If you notice, the XMLC is reporting to search for:
>>>>>>>>
>>>>>>>> d:\apache-tomcat-6.0.29\webapps\discRack\WEB-INF\lib\*discRack.jardiscRack*\presentation\ErrorHTML.xmlc 
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> When I "patch" XMLC as described before, this scenario works well.
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Sasa.
>>>>>>>>
>>>>>>>> On 21-Mar-11 00:34, Jacob Kjome wrote:
>>>>>>>>> Hi Sasa,
>>>>>>>>>
>>>>>>>>> I finally made some time to look into the issues you reported.
>>>>>>>>> Interestingly, I'm
>>>>>>>>> not able to reproduce either issue.  I used Tomcat-6.0.29
>>>>>>>>> standalone, as that's
>>>>>>>>> the version you used (note that I did not try Enhydra).
>>>>>>>>>
>>>>>>>>> To test issue #1, I jar'ed up the classes and markup files and 
>>>>>>>>> made
>>>>>>>>> sure to rename
>>>>>>>>> the resource dirs so files located there could not be 
>>>>>>>>> found.  I also
>>>>>>>>> renamed the
>>>>>>>>> WEB-INF/xmlc directory in the demo app to ensure templates 
>>>>>>>>> could not
>>>>>>>>> be loaded via
>>>>>>>>> the servlet context (allowed for by the custom
>>>>>>>>> ValidatingDocumentLoader.ValidatingResourceLoader class used 
>>>>>>>>> in the
>>>>>>>>> xmlc tomcat
>>>>>>>>> demo), thus could only be loaded via the classloader.  I 
>>>>>>>>> placed the
>>>>>>>>> templates jar
>>>>>>>>> in WEB-INF/lib and ran tomcat.  First I tried loading the
>>>>>>>>> Welcome.html page
>>>>>>>>> (french locale, because that's what I had selected in the tomcat
>>>>>>>>> demo), which came
>>>>>>>>> up fine.  I took a look at the log to see how the file was 
>>>>>>>>> loaded...
>>>>>>>>>
>>>>>>>>> INFO:>>>Parsing DOM for $$XMLC_GENERATED$$.xmlc.demo.Welcome.html
>>>>>>>>> from source URL
>>>>>>>>> jar:file:/D:/dev/XMLC_FORGE_SVN/tags/XMLC_2_3_2/xmlc/examples/tomcat/build/webapps/xmlc/WEB-INF/lib/xmlc-templates.jar!/demo/Welcome_fr.html 
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ...so, clearly it is being loaded via the classloader... and 
>>>>>>>>> working
>>>>>>>>> fine for me.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> To test issue #2, I copied the following jars into
>>>>>>>>> ${catalina.base}/shared...
>>>>>>>>>
>>>>>>>>> jregex.jar
>>>>>>>>> nekohtml.jar
>>>>>>>>> resolver.jar
>>>>>>>>> xercesImpl.jar
>>>>>>>>> xml-apis.jar
>>>>>>>>> xmlc-all-runtime.jar
>>>>>>>>>
>>>>>>>>> Note that the Tomcat demo has a modified
>>>>>>>>> ${catalina.base}/conf/catalina.properties, which places the
>>>>>>>>> ${catalina.base}/shared directory, as well as contained jars, 
>>>>>>>>> in the
>>>>>>>>> common
>>>>>>>>> loader.  It looks like...
>>>>>>>>>
>>>>>>>>> common.loader=${catalina.base}/shared,${catalina.base}/shared/*.jar,${catalina.home}/shared,${catalina.home}/shared/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar 
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> This would be no different than putting the jars in
>>>>>>>>> ${catalina.home}/lib, but
>>>>>>>>> avoids having to muck with the contents of the stock Tomcat
>>>>>>>>> installation.
>>>>>>>>>
>>>>>>>>> Anyway, I left my jar file containing the XMLC classes and
>>>>>>>>> templates in
>>>>>>>>> WEB-INF/lib.  Again I tried loading the Welcome.html page and,
>>>>>>>>> again, it came up
>>>>>>>>> fine.  I looked at the log and the INFO message was the same as
>>>>>>>>> above.  I then
>>>>>>>>> moved the templates jar file to the ${catalina.base}/shared
>>>>>>>>> directory and tried it
>>>>>>>>> again.  The page came up fine and the INFO message looked like...
>>>>>>>>>
>>>>>>>>> INFO:>>>Parsing DOM for $$XMLC_GENERATED$$.xmlc.demo.Welcome.html
>>>>>>>>> from source URL
>>>>>>>>> jar:file:/D:/dev/XMLC_FORGE_SVN/tags/XMLC_2_3_2/xmlc/examples/tomcat/build/shared/xmlc-templates.jar!/demo/Welcome_fr.html 
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'm not sure what to tell you?  It all works fine for me.  Note
>>>>>>>>> that my
>>>>>>>>> environment consists of...
>>>>>>>>>
>>>>>>>>> Windows XP sp3
>>>>>>>>> Java 1.6.0_24
>>>>>>>>> Tomcat-6.0.29 (standalone run from the command line)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Note that I use XMLCContext to obtain the 
>>>>>>>>> XMLCDeferredParsingFactory.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> At this point, I can only say that it works for me.  Maybe the 
>>>>>>>>> it's
>>>>>>>>> platform
>>>>>>>>> differences that are causing issues?  What OS and version of 
>>>>>>>>> Java do
>>>>>>>>> you use?
>>>>>>>>> What does the original "jar:" URL look like when you run it 
>>>>>>>>> (prior
>>>>>>>>> to having to
>>>>>>>>> muck with it to get it to work in your environment)?  And 
>>>>>>>>> please let
>>>>>>>>> me know how
>>>>>>>>> you obtain the XMLCDeferredParsingFactory.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Jake
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 3/7/2011 1:46 PM, Sasa Bojanic wrote:
>>>>>>>>>> Well, it is not really a patch, but something that made my 
>>>>>>>>>> use case
>>>>>>>>>> one
>>>>>>>>>> working...I agree nowdays it would be reasonable to move XMLC to
>>>>>>>>>> JDK1.5
>>>>>>>>>> or even 1.6...
>>>>>>>>>>
>>>>>>>>>> Thanks a lot for the quick response!
>>>>>>>>>>
>>>>>>>>>> Sasa.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 07-Mar-11 17:13, Jacob Kjome wrote:
>>>>>>>>>>> I can look into using your patch for #1 (or something like 
>>>>>>>>>>> it) for
>>>>>>>>>>> the
>>>>>>>>>>> next XML release.  I think the primary issue here is that we've
>>>>>>>>>>> maintained a dependency on JDK1.3, which does not have
>>>>>>>>>>> java.net.URI.
>>>>>>>>>>> I've tried to maintain this minimum dependency as long as 
>>>>>>>>>>> Xerces
>>>>>>>>>>> does
>>>>>>>>>>> so.  Plus it makes for easy testing because JDK1.3 doesn't add
>>>>>>>>>>> any of
>>>>>>>>>>> its own XML libraries.  It's easy to dictate the version 
>>>>>>>>>>> without
>>>>>>>>>>> getting buggy JDK1.4 XML behavior.  But I think most of the
>>>>>>>>>>> world has
>>>>>>>>>>> moved on to JDK1.5+, so maybe XMLC should too at some point?
>>>>>>>>>>>
>>>>>>>>>>> I'll have to test #2.  Not sure how quickly I'll be able to 
>>>>>>>>>>> get to
>>>>>>>>>>> this, though.  But I'll try and spend some time this week on 
>>>>>>>>>>> it.
>>>>>>>>>>>
>>>>>>>>>>> Jake
>>>>>>>>>>>
>>>>>>>>>>> On Mon, 07 Mar 2011 13:56:15 +0100
>>>>>>>>>>>       Sasa Bojanic<[email protected]>    wrote:
>>>>>>>>>>>> Hi,
>>>>>>>>>>>>
>>>>>>>>>>>> I'm trying to upgrade our applications that use XMLC 2.3.1 
>>>>>>>>>>>> to the
>>>>>>>>>>>> newest XMLC version.
>>>>>>>>>>>> Our applications are deployed both under the Tomcat 6.0.29
>>>>>>>>>>>> application server and Enhydra application server (based on 
>>>>>>>>>>>> Tomcat
>>>>>>>>>>>> 6.0.29).
>>>>>>>>>>>>
>>>>>>>>>>>> There are two issues I faced:
>>>>>>>>>>>>
>>>>>>>>>>>> 1) when deploying under the Tomcat, XMLC JAR files are placed
>>>>>>>>>>>> together with the application JAR files into application's
>>>>>>>>>>>> WEB-INF\lib folder (so application classloader is used to load
>>>>>>>>>>>> them).
>>>>>>>>>>>> In this case, XMLC can't load resources (*.html and *.xmlc 
>>>>>>>>>>>> files)
>>>>>>>>>>>> from JAR file. When resources are not in the JAR file but 
>>>>>>>>>>>> unpacked
>>>>>>>>>>>> into WEB-INF\classes folder everything works.
>>>>>>>>>>>>
>>>>>>>>>>>> After "patching" the method getPathURLFromClasspath() from
>>>>>>>>>>>> XMLCDeferredParsingFactory to add:
>>>>>>>>>>>>
>>>>>>>>>>>>             if (srcURL != null&&
>>>>>>>>>>>> srcURL.toString().indexOf(".jar")>= 0) {
>>>>>>>>>>>>                   try {
>>>>>>>>>>>>                      String mdurl = srcURL.toString();
>>>>>>>>>>>>                      srcURL = new URL("jar:"
>>>>>>>>>>>>                                       + mdurl.substring(0,
>>>>>>>>>>>> mdurl.indexOf(".jar")) + ".jar!/"
>>>>>>>>>>>>                                       +
>>>>>>>>>>>> mdurl.substring(mdurl.indexOf(".jar") + 4));
>>>>>>>>>>>>                   } catch (Exception ex) {
>>>>>>>>>>>>                }
>>>>>>>>>>>>             }
>>>>>>>>>>>>
>>>>>>>>>>>> after the line:
>>>>>>>>>>>>
>>>>>>>>>>>>             URL srcURL = 
>>>>>>>>>>>> fDynamicClassLoader.getResource(path);
>>>>>>>>>>>>
>>>>>>>>>>>> it works fine.
>>>>>>>>>>>>
>>>>>>>>>>>> 2) when deploying under Enhydra application server or under
>>>>>>>>>>>> Tomcat,
>>>>>>>>>>>> but instead of putting XMLC JAR files into application's
>>>>>>>>>>>> WEB-INF\lib,
>>>>>>>>>>>> we put it into Tomcat's lib folder, XMLC can't find 
>>>>>>>>>>>> resources no
>>>>>>>>>>>> matter if resources are inside JAR file or unpacked, and it 
>>>>>>>>>>>> can't
>>>>>>>>>>>> find it even in the case I put application's JAR file into
>>>>>>>>>>>> Tomcat's
>>>>>>>>>>>> lib folder.
>>>>>>>>>>>>
>>>>>>>>>>>> Is it a bug in XMLC? Can somebody help?
>>>>>>>>>>>>
>>>>>>>>>>>> Regards,
>>>>>>>>>>>> Sasa.
>>>>>>>>>>>>
>>
>


------------=_1301344147-30467-16073
Content-Type: text/plain; charset="UTF-8"; name="message-footer.txt"
Content-Disposition: inline; filename="message-footer.txt"
Content-Transfer-Encoding: quoted-printable


--
You receive this message as a subscriber of the [email protected] mailing list=
.
To unsubscribe: mailto:[email protected]
For general help: mailto:[email protected]?subject=3Dhelp
OW2 mailing lists service home page: http://www.ow2.org/wws

------------=_1301344147-30467-16073--