cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefano Mazzocchi <stef...@apache.org>
Subject Closer to get XSLTC working with Cocoon
Date Wed, 10 Apr 2002 00:19:26 GMT
Hi, 

I'm getting closer to have XSLTC running with Cocoon.

First of all, Cocoon had a couple of problems with its internals that I
fixed. These had nothing to do with Xalan at all but might have
prevented smooth operation under some circumstances.

Second, Cocoon TraxTransformer wasn't calling setSystemId() on the
Templates, resulting in XSLTC associating the default translet name
'GregorSamsa' to all of its templates.

This was probably the reason of all those VerifyErrors that we were
getting, expecially on pipelines with multiple cascaded stylesheets.

This was fixed by adding the setSystemId() call to the TraxTransformer.
Xalan operation wasn't disturbed by this (ASAIK)

At this point, I was able to run XSLTC inside Cocoon pipelines (the
Cocoon internals were left to Xalan since XSLTC has problems with XSLT
extensions but we don't really care to support XSLTC for Cocoon
internals, mainly XSP code generation which is not a runtime critical
operation)

A few problems started to appear:

1) in XSLTC.java, the setClassname() method adapts the SystemID to a
valid classname. Later on, in TemplatesImpl.java, the classname is
checked to see if the Templates name matches the classname, but the
string is not java-adapted anymore.

So, if you have a stylesheet called "file:///blah.xsl", the classname
becomes "blah", but the template name becomes "blah.xsl" resulting in an
exception being thrown since the templates can't find the translet for
this name collision.

My fix was to change line 136 of TemplatesHandlerImpl.java from

 if (_systemId != null) transletName = Util.basename(_systemId);

to

 if (_systemId != null) transletName = Util.toJavaName(_systemId);

[I'm sure there are more elegant ways to solve the issues here, but I'm
just concerned on getting it to run at this moment]

This solved the previous issue but created another one:

2) shown by this partial stacktrace

java.lang.NullPointerException
	at
org.apache.xalan.transformer.SerializerSwitcher.switchSerializerIfHTML(SerializerSwitcher.java:193)
	at
org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:988)
	at
org.apache.cocoon.xml.AbstractXMLPipe.startElement(AbstractXMLPipe.java:130)
	at
org.apache.cocoon.serialization.AbstractTextSerializer$NamespaceAsAttributes.startElement(AbstractTextSerializer.java:469)
	at
org.apache.cocoon.xml.AbstractXMLPipe.startElement(AbstractXMLPipe.java:130)
	at
org.apache.xalan.xsltc.runtime.TextOutput.closeStartTag(TextOutput.java:268)
	at
org.apache.xalan.xsltc.runtime.TextOutput.startElement(TextOutput.java:468)
	at
file__C__Apache_Tomcat_webapps_cocoon_stylesheets_simple_samples2html_xsl.applyTemplates()
	at
file__C__Apache_Tomcat_webapps_cocoon_stylesheets_simple_samples2html_xsl.transform()
	at
org.apache.xalan.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:535)
....

looking into the NPE-generating code below:

    if (((null == ns) || (ns.length() == 0))
            && localName.equalsIgnoreCase("html"))

it seems that a SAX event with a null "localName" was passed thru the
pipeline. Since the problem goes away if Xalan is used, I think this
might be a problem in the  "apply-templates" implementation of the
Translets.

Interesting enough, this doesn't happen in the main Cocoon page, but
only in the /welcome page so XSLTC is partially working.

But this is not enough, errors start to become *really* creative:

3) if I move on to the /documents/ section of the Cocoon samples I get:

java.lang.VerifyError: (class:
file__C__Apache_Tomcat_webapps_cocoon_documentation_stylesheets_book2menu_xsl,
method: applyTemplates signature:
(Lorg/apache/xalan/xsltc/DOM;Lorg/apache/xalan/xsltc/NodeIterator;Lorg/apache/xalan/xsltc/TransletOutputHandler;)V)
Unable to pop opera ,@	èÞR	P1@	?1@	D5@	Üí

	at java.lang.Class.newInstance0(Native Method)
	at java.lang.Class.newInstance(Class.java:237)
	at
org.apache.xalan.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:234)
	at
org.apache.xalan.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:259)
	at
org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTransformerHandler(TransformerFactoryImpl.java:579)
	at
org.apache.cocoon.components.xslt.XSLTProcessorImpl.getTransformerHandler(XSLTProcessorImpl.java:248)

Sounds like Gregor Samsa wants to sing or something :)

Don't ask me what the heck this means, but it still seems to be related
to the ApplyTemplates part of the translet.

Anyway, enough for now.

Please help :)

-- 
Stefano Mazzocchi      One must still have chaos in oneself to be
                          able to give birth to a dancing star.
<stefano@apache.org>                             Friedrich Nietzsche
--------------------------------------------------------------------


---------------------------------------------------------------------
To unsubscribe, e-mail: cocoon-dev-unsubscribe@xml.apache.org
For additional commands, email: cocoon-dev-help@xml.apache.org


Mime
View raw message