cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Robby Pelssers <Robby.Pelss...@nxp.com>
Subject RE: using both Xalan and Saxon with C3
Date Wed, 05 Dec 2012 10:21:08 GMT
I did some investigation into this matter and the problem is in
org.apache.cocoon.sax.component.XSLTTransformer

It has two constructor methods:

    public XSLTTransformer(final URL source) {
        this(source, null);
    }

And

    public XSLTTransformer(final URL source, final Map<String, Object> attributes) {
        super();
        this.loadXSLT(source, attributes);
    }

So we can set attributes for the transformerfactory but not choose the implementation. First
of all I see something in the code that makes no sense to me:

    /**
     * A generic transformer factory to parse XSLTs.
     */
    private static final SAXTransformerFactory TRAX_FACTORY = createNewSAXTransformerFactory();

this always falls back to  

    private static SAXTransformerFactory createNewSAXTransformerFactory() {
        return (SAXTransformerFactory) TransformerFactory.newInstance();
    }


But on lines 148 to 157 I see following code.  If the attributes are not null and not empty
we STILL use createNewSAXTransformerFactory.  So the else block seems like a complete waste
here?!


            // XSLT has to be parsed
            SAXTransformerFactory transformerFactory;
            if (attributes != null && !attributes.isEmpty()) {
                transformerFactory = createNewSAXTransformerFactory();
                for (Entry<String, Object> attribute : attributes.entrySet()) {
                    transformerFactory.setAttribute(attribute.getKey(), attribute.getValue());
                }
            } else {
                transformerFactory = TRAX_FACTORY;
            }

Ideally I would like to see a third constructor method which would allow us to set  the factoryClassName
of the 
Javax.xml.transform.TransformerFactory

And default use:

public static TransformerFactory newInstance(String factoryClassName, ClassLoader classLoader)
 throws TransformerFactoryConfigurationError

We could from Cocoon side default set this to be "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"
if the factoryClassName is null or empty.

Just thinking out loud here... 

Robby


-----Original Message-----
From: Robby Pelssers [mailto:Robby.Pelssers@nxp.com] 
Sent: Tuesday, December 04, 2012 2:21 PM
To: dev@cocoon.apache.org; users@cocoon.apache.org
Subject: using both Xalan and Saxon with C3

Hi guys,

Just wondering how I would configure a C3 project so I could use both Xalan and Saxon from
my sitemap and java

I currently took the approach to just create a file META-INF/services/javax.xml.transform.TransformerFactory
With following content:
net.sf.saxon.TransformerFactoryImpl

But I guess that restricts me to always use Saxon by default?

Robby
Mime
View raw message