jaxp/src/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/SmartTransformerFactoryImpl.java
--- /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;
+ }
+ }
+}