org.apache.xalan.xsltc.trax
Class TransformerFactoryImpl

java.lang.Object
  extended by javax.xml.transform.TransformerFactory
      extended by javax.xml.transform.sax.SAXTransformerFactory
          extended by org.apache.xalan.xsltc.trax.TransformerFactoryImpl
All Implemented Interfaces:
javax.xml.transform.ErrorListener, SourceLoader

public class TransformerFactoryImpl
extends javax.xml.transform.sax.SAXTransformerFactory
implements SourceLoader, javax.xml.transform.ErrorListener

Implementation of a JAXP1.1 TransformerFactory for Translets.


Nested Class Summary
private static class TransformerFactoryImpl.PIParamWrapper
          The above hashtable stores objects of this class.
 
Field Summary
private  boolean _autoTranslet
          If this is set to true, we attempt to use translet classes for transformation if possible without compiling the stylesheet.
private  boolean _debug
          Set to true when debugging is enabled.
private  java.lang.String _destinationDirectory
          The destination directory for the translet
private  boolean _enableInlining
          Set to true when templates are inlined.
private  javax.xml.transform.ErrorListener _errorListener
          This error listener is used only for this factory and is not passed to the Templates or Transformer objects that we create.
private  boolean _generateTranslet
          Set to true when we want to generate translet classes from the stylesheet.
private  int _indentNumber
          Number of indent spaces when indentation is turned on.
private  boolean _isSecureProcessing
          State of secure processing feature.
private  java.lang.String _jarFileName
          The jar file name which the translet classes are packaged into
private  java.lang.String _packageName
          The package name prefix for all generated translet classes
private  java.util.Hashtable _piParams
          This Hashtable is used to store parameters for locating processing instructions in XML docs.
private  java.lang.String _transletName
          The class name of the translet
private  javax.xml.transform.URIResolver _uriResolver
          This URIResolver is passed to all created Templates and Transformers
private  boolean _useClasspath
          If this is set to true, we attempt to load the translet from the CLASSPATH.
static java.lang.String AUTO_TRANSLET
           
static java.lang.String DEBUG
           
protected static java.lang.String DEFAULT_TRANSLET_NAME
          As Gregor Samsa awoke one morning from uneasy dreams he found himself transformed in his bed into a gigantic insect.
static java.lang.String DESTINATION_DIRECTORY
           
static java.lang.String ENABLE_INLINING
           
static java.lang.String GENERATE_TRANSLET
           
static java.lang.String INDENT_NUMBER
           
static java.lang.String JAR_NAME
           
private  java.lang.Class m_DTMManagerClass
          The provider of the XSLTC DTM Manager service.
static java.lang.String PACKAGE_NAME
           
static java.lang.String TRANSLET_NAME
           
static java.lang.String USE_CLASSPATH
           
 
Fields inherited from class javax.xml.transform.sax.SAXTransformerFactory
FEATURE, FEATURE_XMLFILTER
 
Constructor Summary
TransformerFactoryImpl()
          javax.xml.transform.sax.TransformerFactory implementation.
 
Method Summary
 void error(javax.xml.transform.TransformerException e)
          Receive notification of a recoverable error.
 void fatalError(javax.xml.transform.TransformerException e)
          Receive notification of a non-recoverable error.
 javax.xml.transform.Source getAssociatedStylesheet(javax.xml.transform.Source source, java.lang.String media, java.lang.String title, java.lang.String charset)
          javax.xml.transform.sax.TransformerFactory implementation.
 java.lang.Object getAttribute(java.lang.String name)
          javax.xml.transform.sax.TransformerFactory implementation.
private  byte[][] getBytecodesFromClasses(javax.xml.transform.Source source, java.lang.String fullClassName)
          Load the translet classes from local .class files and return the bytecode array.
private  byte[][] getBytecodesFromJar(javax.xml.transform.Source source, java.lang.String fullClassName)
          Load the translet classes from the jar file and return the bytecode.
protected  java.lang.Class getDTMManagerClass()
          Returns the Class object the provides the XSLTC DTM Manager service.
 javax.xml.transform.ErrorListener getErrorListener()
          javax.xml.transform.sax.TransformerFactory implementation.
 boolean getFeature(java.lang.String name)
          javax.xml.transform.sax.TransformerFactory implementation.
private  java.lang.String getStylesheetFileName(javax.xml.transform.Source source)
          Return the local file name from the systemId of the Source object
private  java.lang.String getTransletBaseName(javax.xml.transform.Source source)
          Return the base class name of the translet.
 javax.xml.transform.URIResolver getURIResolver()
          javax.xml.transform.sax.TransformerFactory implementation.
 org.xml.sax.InputSource loadSource(java.lang.String href, java.lang.String context, XSLTC xsltc)
          This method implements XSLTC's SourceLoader interface.
 javax.xml.transform.Templates newTemplates(javax.xml.transform.Source source)
          javax.xml.transform.sax.TransformerFactory implementation.
 javax.xml.transform.sax.TemplatesHandler newTemplatesHandler()
          javax.xml.transform.sax.SAXTransformerFactory implementation.
 javax.xml.transform.Transformer newTransformer()
          javax.xml.transform.sax.TransformerFactory implementation.
 javax.xml.transform.Transformer newTransformer(javax.xml.transform.Source source)
          javax.xml.transform.sax.TransformerFactory implementation.
 javax.xml.transform.sax.TransformerHandler newTransformerHandler()
          javax.xml.transform.sax.SAXTransformerFactory implementation.
 javax.xml.transform.sax.TransformerHandler newTransformerHandler(javax.xml.transform.Source src)
          javax.xml.transform.sax.SAXTransformerFactory implementation.
 javax.xml.transform.sax.TransformerHandler newTransformerHandler(javax.xml.transform.Templates templates)
          javax.xml.transform.sax.SAXTransformerFactory implementation.
 org.xml.sax.XMLFilter newXMLFilter(javax.xml.transform.Source src)
          javax.xml.transform.sax.SAXTransformerFactory implementation.
 org.xml.sax.XMLFilter newXMLFilter(javax.xml.transform.Templates templates)
          javax.xml.transform.sax.SAXTransformerFactory implementation.
private  void passErrorsToListener(java.util.Vector messages)
          Pass error messages from the compiler to the error listener
private  void passWarningsToListener(java.util.Vector messages)
          Pass warning messages from the compiler to the error listener
private  void readFromInputStream(byte[] bytes, java.io.InputStream input, int size)
          Read a given number of bytes from the InputStream into a byte array.
private  void resetTransientAttributes()
          Reset the per-session attributes to their default values
 void setAttribute(java.lang.String name, java.lang.Object value)
          javax.xml.transform.sax.TransformerFactory implementation.
 void setErrorListener(javax.xml.transform.ErrorListener listener)
          javax.xml.transform.sax.TransformerFactory implementation.
 void setFeature(java.lang.String name, boolean value)
          Set a feature for this TransformerFactory and Transformers or Templates created by this factory.
 void setURIResolver(javax.xml.transform.URIResolver resolver)
          javax.xml.transform.sax.TransformerFactory implementation.
 void warning(javax.xml.transform.TransformerException e)
          Receive notification of a warning.
 
Methods inherited from class javax.xml.transform.TransformerFactory
newInstance
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

TRANSLET_NAME

public static final java.lang.String TRANSLET_NAME
See Also:
Constant Field Values

DESTINATION_DIRECTORY

public static final java.lang.String DESTINATION_DIRECTORY
See Also:
Constant Field Values

PACKAGE_NAME

public static final java.lang.String PACKAGE_NAME
See Also:
Constant Field Values

JAR_NAME

public static final java.lang.String JAR_NAME
See Also:
Constant Field Values

GENERATE_TRANSLET

public static final java.lang.String GENERATE_TRANSLET
See Also:
Constant Field Values

AUTO_TRANSLET

public static final java.lang.String AUTO_TRANSLET
See Also:
Constant Field Values

USE_CLASSPATH

public static final java.lang.String USE_CLASSPATH
See Also:
Constant Field Values

DEBUG

public static final java.lang.String DEBUG
See Also:
Constant Field Values

ENABLE_INLINING

public static final java.lang.String ENABLE_INLINING
See Also:
Constant Field Values

INDENT_NUMBER

public static final java.lang.String INDENT_NUMBER
See Also:
Constant Field Values

_errorListener

private javax.xml.transform.ErrorListener _errorListener
This error listener is used only for this factory and is not passed to the Templates or Transformer objects that we create.


_uriResolver

private javax.xml.transform.URIResolver _uriResolver
This URIResolver is passed to all created Templates and Transformers


DEFAULT_TRANSLET_NAME

protected static final java.lang.String DEFAULT_TRANSLET_NAME
As Gregor Samsa awoke one morning from uneasy dreams he found himself transformed in his bed into a gigantic insect. He was lying on his hard, as it were armour plated, back, and if he lifted his head a little he could see his big, brown belly divided into stiff, arched segments, on top of which the bed quilt could hardly keep in position and was about to slide off completely. His numerous legs, which were pitifully thin compared to the rest of his bulk, waved helplessly before his eyes. "What has happened to me?", he thought. It was no dream....

See Also:
Constant Field Values

_transletName

private java.lang.String _transletName
The class name of the translet


_destinationDirectory

private java.lang.String _destinationDirectory
The destination directory for the translet


_packageName

private java.lang.String _packageName
The package name prefix for all generated translet classes


_jarFileName

private java.lang.String _jarFileName
The jar file name which the translet classes are packaged into


_piParams

private java.util.Hashtable _piParams
This Hashtable is used to store parameters for locating processing instructions in XML docs.


_debug

private boolean _debug
Set to true when debugging is enabled.


_enableInlining

private boolean _enableInlining
Set to true when templates are inlined.


_generateTranslet

private boolean _generateTranslet
Set to true when we want to generate translet classes from the stylesheet.


_autoTranslet

private boolean _autoTranslet
If this is set to true, we attempt to use translet classes for transformation if possible without compiling the stylesheet. The translet class is only used if its timestamp is newer than the timestamp of the stylesheet.


_useClasspath

private boolean _useClasspath
If this is set to true, we attempt to load the translet from the CLASSPATH.


_indentNumber

private int _indentNumber
Number of indent spaces when indentation is turned on.


m_DTMManagerClass

private java.lang.Class m_DTMManagerClass
The provider of the XSLTC DTM Manager service. This is fixed for any instance of this class. In order to change service providers, a new XSLTC TransformerFactory must be instantiated.

See Also:
XSLTCDTMManager.getDTMManagerClass()

_isSecureProcessing

private boolean _isSecureProcessing

State of secure processing feature.

Constructor Detail

TransformerFactoryImpl

public TransformerFactoryImpl()
javax.xml.transform.sax.TransformerFactory implementation.

Method Detail

setErrorListener

public void setErrorListener(javax.xml.transform.ErrorListener listener)
                      throws java.lang.IllegalArgumentException
javax.xml.transform.sax.TransformerFactory implementation. Set the error event listener for the TransformerFactory, which is used for the processing of transformation instructions, and not for the transformation itself.

Specified by:
setErrorListener in class javax.xml.transform.TransformerFactory
Parameters:
listener - The error listener to use with the TransformerFactory
Throws:
java.lang.IllegalArgumentException

getErrorListener

public javax.xml.transform.ErrorListener getErrorListener()
javax.xml.transform.sax.TransformerFactory implementation. Get the error event handler for the TransformerFactory.

Specified by:
getErrorListener in class javax.xml.transform.TransformerFactory
Returns:
The error listener used with the TransformerFactory

getAttribute

public java.lang.Object getAttribute(java.lang.String name)
                              throws java.lang.IllegalArgumentException
javax.xml.transform.sax.TransformerFactory implementation. Returns the value set for a TransformerFactory attribute

Specified by:
getAttribute in class javax.xml.transform.TransformerFactory
Parameters:
name - The attribute name
Returns:
An object representing the attribute value
Throws:
java.lang.IllegalArgumentException

setAttribute

public void setAttribute(java.lang.String name,
                         java.lang.Object value)
                  throws java.lang.IllegalArgumentException
javax.xml.transform.sax.TransformerFactory implementation. Sets the value for a TransformerFactory attribute.

Specified by:
setAttribute in class javax.xml.transform.TransformerFactory
Parameters:
name - The attribute name
value - An object representing the attribute value
Throws:
java.lang.IllegalArgumentException

setFeature

public void setFeature(java.lang.String name,
                       boolean value)
                throws javax.xml.transform.TransformerConfigurationException

Set a feature for this TransformerFactory and Transformers or Templates created by this factory.

Feature names are fully qualified URIs. Implementations may define their own features. An TransformerConfigurationException is thrown if this TransformerFactory or the Transformers or Templates it creates cannot support the feature. It is possible for an TransformerFactory to expose a feature value but be unable to change its state.

See TransformerFactory for full documentation of specific features.

Specified by:
setFeature in class javax.xml.transform.TransformerFactory
Parameters:
name - Feature name.
value - Is feature state true or false.
Throws:
javax.xml.transform.TransformerConfigurationException - if this TransformerFactory or the Transformers or Templates it creates cannot support this feature.
java.lang.NullPointerException - If the name parameter is null.

getFeature

public boolean getFeature(java.lang.String name)
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.

Specified by:
getFeature in class javax.xml.transform.TransformerFactory
Parameters:
name - The feature name
Returns:
'true' if feature is supported, 'false' if not

getURIResolver

public javax.xml.transform.URIResolver getURIResolver()
javax.xml.transform.sax.TransformerFactory implementation. Get the object that is used by default during the transformation to resolve URIs used in document(), xsl:import, or xsl:include.

Specified by:
getURIResolver in class javax.xml.transform.TransformerFactory
Returns:
The URLResolver used for this TransformerFactory and all Templates and Transformer objects created using this factory

setURIResolver

public void setURIResolver(javax.xml.transform.URIResolver resolver)
javax.xml.transform.sax.TransformerFactory implementation. Set the object that is used by default during the transformation to resolve URIs used in document(), xsl:import, or xsl:include. Note that this does not affect Templates and Transformers that are already created with this factory.

Specified by:
setURIResolver in class javax.xml.transform.TransformerFactory
Parameters:
resolver - The URLResolver used for this TransformerFactory and all Templates and Transformer objects created using this factory

getAssociatedStylesheet

public javax.xml.transform.Source getAssociatedStylesheet(javax.xml.transform.Source source,
                                                          java.lang.String media,
                                                          java.lang.String title,
                                                          java.lang.String charset)
                                                   throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.TransformerFactory implementation. Get the stylesheet specification(s) associated via the xml-stylesheet processing instruction (see http://www.w3.org/TR/xml-stylesheet/) with the document document specified in the source parameter, and that match the given criteria.

Specified by:
getAssociatedStylesheet in class javax.xml.transform.TransformerFactory
Parameters:
source - The XML source document.
media - The media attribute to be matched. May be null, in which case the prefered templates will be used (i.e. alternate = no).
title - The value of the title attribute to match. May be null.
charset - The value of the charset attribute to match. May be null.
Returns:
A Source object suitable for passing to the TransformerFactory.
Throws:
javax.xml.transform.TransformerConfigurationException

newTransformer

public javax.xml.transform.Transformer newTransformer()
                                               throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.TransformerFactory implementation. Create a Transformer object that copies the input document to the result.

Specified by:
newTransformer in class javax.xml.transform.TransformerFactory
Returns:
A Transformer object that simply copies the source to the result.
Throws:
javax.xml.transform.TransformerConfigurationException

newTransformer

public javax.xml.transform.Transformer newTransformer(javax.xml.transform.Source source)
                                               throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.TransformerFactory implementation. Process the Source into a Templates object, which is a a compiled representation of the source. Note that this method should not be used with XSLTC, as the time-consuming compilation is done for each and every transformation.

Specified by:
newTransformer in class javax.xml.transform.TransformerFactory
Returns:
A Templates object that can be used to create Transformers.
Throws:
javax.xml.transform.TransformerConfigurationException

passWarningsToListener

private void passWarningsToListener(java.util.Vector messages)
                             throws javax.xml.transform.TransformerException
Pass warning messages from the compiler to the error listener

Throws:
javax.xml.transform.TransformerException

passErrorsToListener

private void passErrorsToListener(java.util.Vector messages)
Pass error messages from the compiler to the error listener


newTemplates

public javax.xml.transform.Templates newTemplates(javax.xml.transform.Source source)
                                           throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.TransformerFactory implementation. Process the Source into a Templates object, which is a a compiled representation of the source.

Specified by:
newTemplates in class javax.xml.transform.TransformerFactory
Parameters:
source - The input stylesheet - DOMSource not supported!!!
Returns:
A Templates object that can be used to create Transformers.
Throws:
javax.xml.transform.TransformerConfigurationException

newTemplatesHandler

public javax.xml.transform.sax.TemplatesHandler newTemplatesHandler()
                                                             throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.SAXTransformerFactory implementation. Get a TemplatesHandler object that can process SAX ContentHandler events into a Templates object.

Specified by:
newTemplatesHandler in class javax.xml.transform.sax.SAXTransformerFactory
Returns:
A TemplatesHandler object that can handle SAX events
Throws:
javax.xml.transform.TransformerConfigurationException

newTransformerHandler

public javax.xml.transform.sax.TransformerHandler newTransformerHandler()
                                                                 throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.SAXTransformerFactory implementation. Get a TransformerHandler object that can process SAX ContentHandler events into a Result. This method will return a pure copy transformer.

Specified by:
newTransformerHandler in class javax.xml.transform.sax.SAXTransformerFactory
Returns:
A TransformerHandler object that can handle SAX events
Throws:
javax.xml.transform.TransformerConfigurationException

newTransformerHandler

public javax.xml.transform.sax.TransformerHandler newTransformerHandler(javax.xml.transform.Source src)
                                                                 throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.SAXTransformerFactory implementation. Get a TransformerHandler object that can process SAX ContentHandler events into a Result, based on the transformation instructions specified by the argument.

Specified by:
newTransformerHandler in class javax.xml.transform.sax.SAXTransformerFactory
Parameters:
src - The source of the transformation instructions.
Returns:
A TransformerHandler object that can handle SAX events
Throws:
javax.xml.transform.TransformerConfigurationException

newTransformerHandler

public javax.xml.transform.sax.TransformerHandler newTransformerHandler(javax.xml.transform.Templates templates)
                                                                 throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.SAXTransformerFactory implementation. Get a TransformerHandler object that can process SAX ContentHandler events into a Result, based on the transformation instructions specified by the argument.

Specified by:
newTransformerHandler in class javax.xml.transform.sax.SAXTransformerFactory
Parameters:
templates - Represents a pre-processed stylesheet
Returns:
A TransformerHandler object that can handle SAX events
Throws:
javax.xml.transform.TransformerConfigurationException

newXMLFilter

public org.xml.sax.XMLFilter newXMLFilter(javax.xml.transform.Source src)
                                   throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.SAXTransformerFactory implementation. Create an XMLFilter that uses the given source as the transformation instructions.

Specified by:
newXMLFilter in class javax.xml.transform.sax.SAXTransformerFactory
Parameters:
src - The source of the transformation instructions.
Returns:
An XMLFilter object, or null if this feature is not supported.
Throws:
javax.xml.transform.TransformerConfigurationException

newXMLFilter

public org.xml.sax.XMLFilter newXMLFilter(javax.xml.transform.Templates templates)
                                   throws javax.xml.transform.TransformerConfigurationException
javax.xml.transform.sax.SAXTransformerFactory implementation. Create an XMLFilter that uses the given source as the transformation instructions.

Specified by:
newXMLFilter in class javax.xml.transform.sax.SAXTransformerFactory
Parameters:
templates - The source of the transformation instructions.
Returns:
An XMLFilter object, or null if this feature is not supported.
Throws:
javax.xml.transform.TransformerConfigurationException

error

public void error(javax.xml.transform.TransformerException e)
           throws javax.xml.transform.TransformerException
Receive notification of a recoverable error. The transformer must continue to provide normal parsing events after invoking this method. It should still be possible for the application to process the document through to the end.

Specified by:
error in interface javax.xml.transform.ErrorListener
Parameters:
e - The warning information encapsulated in a transformer exception.
Throws:
javax.xml.transform.TransformerException - if the application chooses to discontinue the transformation (always does in our case).

fatalError

public void fatalError(javax.xml.transform.TransformerException e)
                throws javax.xml.transform.TransformerException
Receive notification of a non-recoverable error. The application must assume that the transformation cannot continue after the Transformer has invoked this method, and should continue (if at all) only to collect addition error messages. In fact, Transformers are free to stop reporting events once this method has been invoked.

Specified by:
fatalError in interface javax.xml.transform.ErrorListener
Parameters:
e - warning information encapsulated in a transformer exception.
Throws:
javax.xml.transform.TransformerException - if the application chooses to discontinue the transformation (always does in our case).

warning

public void warning(javax.xml.transform.TransformerException e)
             throws javax.xml.transform.TransformerException
Receive notification of a warning. Transformers can use this method to report conditions that are not errors or fatal errors. The default behaviour is to take no action. After invoking this method, the Transformer must continue with the transformation. It should still be possible for the application to process the document through to the end.

Specified by:
warning in interface javax.xml.transform.ErrorListener
Parameters:
e - The warning information encapsulated in a transformer exception.
Throws:
javax.xml.transform.TransformerException - if the application chooses to discontinue the transformation (never does in our case).

loadSource

public org.xml.sax.InputSource loadSource(java.lang.String href,
                                          java.lang.String context,
                                          XSLTC xsltc)
This method implements XSLTC's SourceLoader interface. It is used to glue a TrAX URIResolver to the XSLTC compiler's Input and Import classes.

Specified by:
loadSource in interface SourceLoader
Parameters:
href - The URI of the document to load
context - The URI of the currently loaded document
xsltc - The compiler that resuests the document
Returns:
An InputSource with the loaded document

resetTransientAttributes

private void resetTransientAttributes()
Reset the per-session attributes to their default values


getBytecodesFromClasses

private byte[][] getBytecodesFromClasses(javax.xml.transform.Source source,
                                         java.lang.String fullClassName)
Load the translet classes from local .class files and return the bytecode array.

Parameters:
source - The xsl source
fullClassName - The full name of the translet
Returns:
The bytecode array

getBytecodesFromJar

private byte[][] getBytecodesFromJar(javax.xml.transform.Source source,
                                     java.lang.String fullClassName)
Load the translet classes from the jar file and return the bytecode.

Parameters:
source - The xsl source
fullClassName - The full name of the translet
Returns:
The bytecode array

readFromInputStream

private void readFromInputStream(byte[] bytes,
                                 java.io.InputStream input,
                                 int size)
                          throws java.io.IOException
Read a given number of bytes from the InputStream into a byte array.

Parameters:
bytes - The byte array to store the input content.
input - The input stream.
size - The number of bytes to read.
Throws:
java.io.IOException

getTransletBaseName

private java.lang.String getTransletBaseName(javax.xml.transform.Source source)
Return the base class name of the translet. The translet name is resolved using the following rules: 1. if the _transletName attribute is set and its value is not "GregorSamsa", then _transletName is returned. 2. otherwise get the translet name from the base name of the system ID 3. return "GregorSamsa" if the result from step 2 is null.

Parameters:
source - The input Source
Returns:
The name of the translet class

getStylesheetFileName

private java.lang.String getStylesheetFileName(javax.xml.transform.Source source)
Return the local file name from the systemId of the Source object

Parameters:
source - The Source
Returns:
The file name in the local filesystem, or null if the systemId does not represent a local file.

getDTMManagerClass

protected java.lang.Class getDTMManagerClass()
Returns the Class object the provides the XSLTC DTM Manager service.