jaxp/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SmartTransformerFactoryImpl.java
changeset 6 7f561c08de6b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SmartTransformerFactoryImpl.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,454 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * $Id: SmartTransformerFactoryImpl.java,v 1.2.4.1 2005/09/14 09:57:13 pvedula Exp $
+ */
+
+
+package com.sun.org.apache.xalan.internal.xsltc.trax;
+
+import javax.xml.XMLConstants;
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TemplatesHandler;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
+import org.xml.sax.XMLFilter;
+
+/**
+ * Implementation of a transformer factory that uses an XSLTC
+ * transformer factory for the creation of Templates objects
+ * and uses the Xalan processor transformer factory for the
+ * creation of Transformer objects.
+ * @author G. Todd Miller
+ */
+public class SmartTransformerFactoryImpl extends SAXTransformerFactory
+{
+    /**
+     * <p>Name of class as a constant to use for debugging.</p>
+     */
+    private static final String CLASS_NAME = "SmartTransformerFactoryImpl";
+
+    private SAXTransformerFactory _xsltcFactory = null;
+    private SAXTransformerFactory _xalanFactory = null;
+    private SAXTransformerFactory _currFactory = null;
+    private ErrorListener      _errorlistener = null;
+    private URIResolver        _uriresolver = null;
+
+    /**
+     * <p>State of secure processing feature.</p>
+     */
+    private boolean featureSecureProcessing = false;
+
+    /**
+     * implementation of the SmartTransformerFactory. This factory
+     * uses com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory
+     * to return Templates objects; and uses
+     * com.sun.org.apache.xalan.internal.processor.TransformerFactory
+     * to return Transformer objects.
+     */
+    public SmartTransformerFactoryImpl() { }
+
+    private void createXSLTCTransformerFactory() {
+        _xsltcFactory = new TransformerFactoryImpl();
+        _currFactory = _xsltcFactory;
+    }
+
+    private void createXalanTransformerFactory() {
+        final String xalanMessage =
+            "com.sun.org.apache.xalan.internal.xsltc.trax.SmartTransformerFactoryImpl "+
+            "could not create an "+
+            "com.sun.org.apache.xalan.internal.processor.TransformerFactoryImpl.";
+        // try to create instance of Xalan factory...
+        try {
+            Class xalanFactClass = ObjectFactory.findProviderClass(
+                "com.sun.org.apache.xalan.internal.processor.TransformerFactoryImpl",
+                ObjectFactory.findClassLoader(), true);
+            _xalanFactory = (SAXTransformerFactory)
+                xalanFactClass.newInstance();
+        }
+        catch (ClassNotFoundException e) {
+            System.err.println(xalanMessage);
+        }
+        catch (InstantiationException e) {
+            System.err.println(xalanMessage);
+        }
+        catch (IllegalAccessException e) {
+            System.err.println(xalanMessage);
+        }
+        _currFactory = _xalanFactory;
+    }
+
+    public void setErrorListener(ErrorListener listener)
+        throws IllegalArgumentException
+    {
+        _errorlistener = listener;
+    }
+
+    public ErrorListener getErrorListener() {
+        return _errorlistener;
+    }
+
+    public Object getAttribute(String name)
+        throws IllegalArgumentException
+    {
+        // GTM: NB: 'debug' should change to something more unique...
+        if ((name.equals("translet-name")) || (name.equals("debug"))) {
+            if (_xsltcFactory == null) {
+                createXSLTCTransformerFactory();
+            }
+            return _xsltcFactory.getAttribute(name);
+        }
+        else {
+            if (_xalanFactory == null) {
+                createXalanTransformerFactory();
+            }
+            return _xalanFactory.getAttribute(name);
+        }
+    }
+
+    public void setAttribute(String name, Object value)
+        throws IllegalArgumentException {
+        // GTM: NB: 'debug' should change to something more unique...
+        if ((name.equals("translet-name")) || (name.equals("debug"))) {
+            if (_xsltcFactory == null) {
+                createXSLTCTransformerFactory();
+            }
+            _xsltcFactory.setAttribute(name, value);
+        }
+        else {
+            if (_xalanFactory == null) {
+                createXalanTransformerFactory();
+            }
+            _xalanFactory.setAttribute(name, value);
+        }
+    }
+
+    /**
+     * <p>Set a feature for this <code>SmartTransformerFactory</code> and <code>Transformer</code>s
+     * or <code>Template</code>s created by this factory.</p>
+     *
+     * <p>
+     * Feature names are fully qualified {@link java.net.URI}s.
+     * Implementations may define their own features.
+     * An {@link TransformerConfigurationException} is thrown if this <code>TransformerFactory</code> or the
+     * <code>Transformer</code>s or <code>Template</code>s it creates cannot support the feature.
+     * It is possible for an <code>TransformerFactory</code> to expose a feature value but be unable to change its state.
+     * </p>
+     *
+     * <p>See {@link javax.xml.transform.TransformerFactory} for full documentation of specific features.</p>
+     *
+     * @param name Feature name.
+     * @param value Is feature state <code>true</code> or <code>false</code>.
+     *
+     * @throws TransformerConfigurationException if this <code>TransformerFactory</code>
+     *   or the <code>Transformer</code>s or <code>Template</code>s it creates cannot support this feature.
+     * @throws NullPointerException If the <code>name</code> parameter is null.
+     */
+    public void setFeature(String name, boolean value)
+        throws TransformerConfigurationException {
+
+        // feature name cannot be null
+        if (name == null) {
+            ErrorMsg err = new ErrorMsg(ErrorMsg.JAXP_SET_FEATURE_NULL_NAME);
+            throw new NullPointerException(err.toString());
+        }
+        // secure processing?
+        else if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) {
+            featureSecureProcessing = value;
+            // all done processing feature
+            return;
+        }
+        else {
+            // unknown feature
+            ErrorMsg err = new ErrorMsg(ErrorMsg.JAXP_UNSUPPORTED_FEATURE, name);
+            throw new TransformerConfigurationException(err.toString());
+        }
+    }
+
+    /**
+     * javax.xml.transform.sax.TransformerFactory implementation.
+     * Look up the value of a feature (to see if it is supported).
+     * This method must be updated as the various methods and features of this
+     * class are implemented.
+     *
+     * @param name The feature name
+     * @return 'true' if feature is supported, 'false' if not
+     */
+    public boolean getFeature(String name) {
+        // All supported features should be listed here
+        String[] features = {
+            DOMSource.FEATURE,
+            DOMResult.FEATURE,
+            SAXSource.FEATURE,
+            SAXResult.FEATURE,
+            StreamSource.FEATURE,
+            StreamResult.FEATURE
+        };
+
+        // feature name cannot be null
+        if (name == null) {
+            ErrorMsg err = new ErrorMsg(ErrorMsg.JAXP_GET_FEATURE_NULL_NAME);
+            throw new NullPointerException(err.toString());
+        }
+
+        // Inefficient, but it really does not matter in a function like this
+        for (int i = 0; i < features.length; i++) {
+            if (name.equals(features[i]))
+                return true;
+        }
+
+        // secure processing?
+        if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) {
+            return featureSecureProcessing;
+        }
+
+        // unknown feature
+        return false;
+    }
+
+    public URIResolver getURIResolver() {
+        return _uriresolver;
+    }
+
+    public void setURIResolver(URIResolver resolver) {
+        _uriresolver = resolver;
+    }
+
+    public Source getAssociatedStylesheet(Source source, String media,
+                                          String title, String charset)
+        throws TransformerConfigurationException
+    {
+        if (_currFactory == null) {
+            createXSLTCTransformerFactory();
+        }
+        return _currFactory.getAssociatedStylesheet(source, media,
+                title, charset);
+    }
+
+    /**
+     * Create a Transformer object that copies the input document to the
+     * result. Uses the com.sun.org.apache.xalan.internal.processor.TransformerFactory.
+     * @return A Transformer object.
+     */
+    public Transformer newTransformer()
+        throws TransformerConfigurationException
+    {
+        if (_xalanFactory == null) {
+            createXalanTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xalanFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xalanFactory.setURIResolver(_uriresolver);
+        }
+        _currFactory = _xalanFactory;
+        return _currFactory.newTransformer();
+    }
+
+    /**
+     * Create a Transformer object that from the input stylesheet
+     * Uses the com.sun.org.apache.xalan.internal.processor.TransformerFactory.
+     * @param source the stylesheet.
+     * @return A Transformer object.
+     */
+    public Transformer newTransformer(Source source) throws
+        TransformerConfigurationException
+    {
+        if (_xalanFactory == null) {
+            createXalanTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xalanFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xalanFactory.setURIResolver(_uriresolver);
+        }
+        _currFactory = _xalanFactory;
+        return _currFactory.newTransformer(source);
+    }
+
+    /**
+     * Create a Templates object that from the input stylesheet
+     * Uses the com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory.
+     * @param source the stylesheet.
+     * @return A Templates object.
+     */
+    public Templates newTemplates(Source source)
+        throws TransformerConfigurationException
+    {
+        if (_xsltcFactory == null) {
+            createXSLTCTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xsltcFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xsltcFactory.setURIResolver(_uriresolver);
+        }
+        _currFactory = _xsltcFactory;
+        return _currFactory.newTemplates(source);
+    }
+
+    /**
+     * Get a TemplatesHandler object that can process SAX ContentHandler
+     * events into a Templates object. Uses the
+     * com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory.
+     */
+    public TemplatesHandler newTemplatesHandler()
+        throws TransformerConfigurationException
+    {
+        if (_xsltcFactory == null) {
+            createXSLTCTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xsltcFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xsltcFactory.setURIResolver(_uriresolver);
+        }
+        return _xsltcFactory.newTemplatesHandler();
+    }
+
+    /**
+     * Get a TransformerHandler object that can process SAX ContentHandler
+     * events based on a copy transformer.
+     * Uses com.sun.org.apache.xalan.internal.processor.TransformerFactory.
+     */
+    public TransformerHandler newTransformerHandler()
+        throws TransformerConfigurationException
+    {
+        if (_xalanFactory == null) {
+            createXalanTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xalanFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xalanFactory.setURIResolver(_uriresolver);
+        }
+        return _xalanFactory.newTransformerHandler();
+    }
+
+    /**
+     * Get a TransformerHandler object that can process SAX ContentHandler
+     * events based on a transformer specified by the stylesheet Source.
+     * Uses com.sun.org.apache.xalan.internal.processor.TransformerFactory.
+     */
+    public TransformerHandler newTransformerHandler(Source src)
+        throws TransformerConfigurationException
+    {
+        if (_xalanFactory == null) {
+            createXalanTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xalanFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xalanFactory.setURIResolver(_uriresolver);
+        }
+        return _xalanFactory.newTransformerHandler(src);
+    }
+
+
+    /**
+     * Get a TransformerHandler object that can process SAX ContentHandler
+     * events based on a transformer specified by the stylesheet Source.
+     * Uses com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory.
+     */
+    public TransformerHandler newTransformerHandler(Templates templates)
+        throws TransformerConfigurationException
+    {
+        if (_xsltcFactory == null) {
+            createXSLTCTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xsltcFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xsltcFactory.setURIResolver(_uriresolver);
+        }
+        return _xsltcFactory.newTransformerHandler(templates);
+    }
+
+
+    /**
+     * Create an XMLFilter that uses the given source as the
+     * transformation instructions. Uses
+     * com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory.
+     */
+    public XMLFilter newXMLFilter(Source src)
+        throws TransformerConfigurationException {
+        if (_xsltcFactory == null) {
+            createXSLTCTransformerFactory();
+        }
+        if (_errorlistener != null) {
+            _xsltcFactory.setErrorListener(_errorlistener);
+        }
+        if (_uriresolver != null) {
+            _xsltcFactory.setURIResolver(_uriresolver);
+        }
+        Templates templates = _xsltcFactory.newTemplates(src);
+        if (templates == null ) return null;
+        return newXMLFilter(templates);
+    }
+
+    /*
+     * Create an XMLFilter that uses the given source as the
+     * transformation instructions. Uses
+     * com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory.
+     */
+    public XMLFilter newXMLFilter(Templates templates)
+        throws TransformerConfigurationException {
+        try {
+            return new com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter(templates);
+        }
+        catch(TransformerConfigurationException e1) {
+            if (_xsltcFactory == null) {
+                createXSLTCTransformerFactory();
+            }
+            ErrorListener errorListener = _xsltcFactory.getErrorListener();
+            if(errorListener != null) {
+                try {
+                    errorListener.fatalError(e1);
+                    return null;
+                }
+                catch( TransformerException e2) {
+                    new TransformerConfigurationException(e2);
+                }
+            }
+            throw e1;
+        }
+    }
+}