cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tobia Conforto <tobia.confo...@linux.it>
Subject Re: Compiled XSLT
Date Tue, 23 Oct 2007 16:30:26 GMT
Ard Schrijvers wrote:
> > > I'm wondering if there is a way to pre-compile XSLT into Java
> > > classes, using the command-line xsltc compiler, put those classes
> > > somewhere in Cocoon's classpath and use them as transformers.
> >
> > Actually, since Cocoon can already run the cached compiled
> > stylesheets it shouldn't be that hard to get it to use them in the
> > first place.
>
> Yes. You can take a look at the excalibur xmlutil in
> org.apache.excalibur.xml.xslt.XSLTProcessorImpl and write your own
> that for example first looks at compiled version at some place.

Thank you for your suggestion.

I was able to understand how XSLTProcessor, TraxProcessor, and
TraxTransformer relate to one another and I could write my own
xslt-processor-role that loads pre-compiled stylesheets from the
classpath.

Here it is, if anybody is interested or wants to take it from here.
Suggestions are welcome.


Tobia


=== cocoon.xconf =======================================================

    <component class="ClassLoadingTraxProcessor" logger="core.xslt" role="org.apache.excalibur.xml.xslt.XSLTProcessor/clxsltc">
	<parameter name="use-store" value="true"/>
	<parameter name="transformer-factory" value="org.apache.xalan.xsltc.trax.TransformerFactoryImpl"/>
    </component>

=== sitemap.xmap =======================================================

    <transformer name="clxsltc" src="org.apache.cocoon.transformation.TraxTransformer">
	<xslt-processor-role>clxsltc</xslt-processor-role>
    </transformer>

    ...

    <transform src="test.class" type="clxsltc"/>

=== Java patch =========================================================

--- cocoon-2.1.10/src/java/org/apache/cocoon/components/xslt/TraxProcessor.java	2006-12-19
12:03:37.000000000 +0100
+++ ClassLoadingTraxProcessor.java	2007-10-23 18:03:34.000000000 +0200
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.cocoon.components.xslt;
+import org.apache.cocoon.components.xslt.*;

 import java.io.File;
 import java.io.IOException;
@@ -72,6 +72,14 @@

-public class TraxProcessor extends AbstractLogEnabled implements XSLTProcessor, Serviceable,
Initializable, Disposable, Parameterizable,
+public class ClassLoadingTraxProcessor extends AbstractLogEnabled implements XSLTProcessor,
Serviceable, Initializable, Disposable, Parameterizable,
         Recyclable, URIResolver {
+
+	private class SourceWrapper implements javax.xml.transform.Source {
+		private String id;
+		public SourceWrapper(String id) { this.id = id; }
+		public String getSystemId() { return id; }
+		public void setSystemId(String id) {}
+	}
+
     /** The store service instance */
     protected Store m_store;

@@ -208,6 +216,36 @@

         TraxErrorListener errorListener = new TraxErrorListener(getLogger(), stylesheet.getURI());
         try{
+
+			if (m_factory instanceof org.apache.xalan.xsltc.trax.TransformerFactoryImpl
+					&& id.endsWith(".class")) {
+
+				// custom code to load pre-compiled translet from the classpath
+
+				if(getLogger().isDebugEnabled())
+					getLogger().debug("Loading Templates from classpath " + id);
+
+				m_factory.setAttribute("use-classpath", Boolean.TRUE);
+
+				final Templates template = m_factory.newTemplates(new SourceWrapper(id));
+
+				putTemplates(template, stylesheet, id);
+
+				final TransformerHandler handler = m_factory.newTransformerHandler(template);
+				handler.getTransformer().setErrorListener(errorListener);
+				handler.getTransformer().setURIResolver(this);
+
+				m_factory.setAttribute("use-classpath", Boolean.FALSE);
+
+				final SourceValidity alwaysValid = new SourceValidity() {
+					public int isValid() { return 1; }
+					public int isValid(SourceValidity newValidity) { return 1; }
+				};
+
+				return new MyTransformerHandlerAndValidity(handler, alwaysValid);
+				// end custom code
+			}
+
             if (getLogger().isDebugEnabled()) {
                 getLogger().debug("Creating new Templates for " + id);
             }


Mime
View raw message