morten      01/07/17 08:34:22

  Modified:    java/src/org/apache/xalan/xsltc/dom DOMImpl.java
               java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
                        TransformerFactoryImpl.java TransformerImpl.java
  Log:
  Added some javadoc comments to our trax stuff. Added preliminary support
  for getting/setting output properties, and for getting/setting URL resolvers.
  PR:           n/a
  Obtained from:        n/a
  Submitted by: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.12      +11 -8     xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java
  
  Index: DOMImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DOMImpl.java      2001/06/12 13:22:05     1.11
  +++ DOMImpl.java      2001/07/17 15:34:00     1.12
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: DOMImpl.java,v 1.11 2001/06/12 13:22:05 morten Exp $
  + * @(#)$Id: DOMImpl.java,v 1.12 2001/07/17 15:34:00 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -2282,12 +2282,17 @@
        throws TransletException {
        final char[] text = _text;
        final int start = _offsetOrChild[node];
  -     int i = start + 1;
  -     while (text[i] != ' ') ++i;
  -
        final int length = _lengthOrAttr[node];
  -     handler.processingInstruction(new String(text, start, i - start),
  -                                   new String(text, i + 1, length - i));
  +
  +     // Target and Value are separated by a whitespace - find it!
  +     int i = start;
  +     while (text[i] != ' ') i++;
  +
  +     final int len = i - start;
  +     final String target = new String(text, start, len);
  +     final String value  = new String(text, i + 1, length - len);
  +
  +     handler.processingInstruction(target, value);
       }
   
       /**
  @@ -2845,8 +2850,6 @@
            final int node = nextNode();
            _type[node] = PROCESSING_INSTRUCTION;
            linkChildren(node);
  -         // This is really stupid - do NOT create String object here!!!
  -         //characters(target + ' ' + data);
            characters(target);
            characters(" ");
            characters(data);
  
  
  
  1.4       +17 -10    
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TemplatesImpl.java
  
  Index: TemplatesImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TemplatesImpl.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TemplatesImpl.java        2001/07/13 10:32:20     1.3
  +++ TemplatesImpl.java        2001/07/17 15:34:10     1.4
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TemplatesImpl.java,v 1.3 2001/07/13 10:32:20 morten Exp $
  + * @(#)$Id: TemplatesImpl.java,v 1.4 2001/07/17 15:34:10 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -188,10 +188,12 @@
       }
   
       /**
  -     * JAXP interface implementation
  +     * Implements JAXP's Templates.newTransformer()
  +     *
  +     * @throws TransformerConfigurationException
        */
  -    public Transformer newTransformer() throws 
  -     TransformerConfigurationException {
  +    public Transformer newTransformer()
  +     throws TransformerConfigurationException {
        Translet translet = getTransletInstance();
        if (translet == null)
            throw new TransformerConfigurationException(TRANSLET_ERR_MSG);
  @@ -200,14 +202,19 @@
       }
   
       /**
  -     * JAXP interface implementation - UNFINISHED!!!
  +     * Implements JAXP's Templates.getOutputProperties()
        */
       public Properties getOutputProperties() { 
  -     // TODO - this method should extract the output properties stored in
  -     // a translet instance. This could prove to be pretty tricky as this
  -     // class has a reference to a translet class only and not to an
  -     // actual instance of a translet
  -     return new Properties(); 
  +     // We need to instanciate a translet to get the output settings, so
  +     // we might as well just instanciate a Transformer and use its
  +     // implementation of this method
  +     try {
  +         Transformer transformer = newTransformer();
  +         return transformer.getOutputProperties();
  +     }
  +     catch (TransformerConfigurationException e) {
  +         return null;
  +     }
       }
   
   }
  
  
  
  1.7       +316 -163  
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
  
  Index: TransformerFactoryImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TransformerFactoryImpl.java       2001/07/13 10:32:23     1.6
  +++ TransformerFactoryImpl.java       2001/07/17 15:34:13     1.7
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TransformerFactoryImpl.java,v 1.6 2001/07/13 10:32:23 morten Exp $
  + * @(#)$Id: TransformerFactoryImpl.java,v 1.7 2001/07/17 15:34:13 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -88,6 +88,7 @@
   
   import java.io.File;
   import java.io.InputStream;
  +import java.io.ByteArrayInputStream;
   import java.net.URL;
   import java.net.MalformedURLException;
   
  @@ -95,164 +96,208 @@
   /**
    * Implementation of a JAXP1.1 SAXTransformerFactory for Translets.
    */
  -public class TransformerFactoryImpl extends TransformerFactory {
  -    public TransformerFactoryImpl() { /* nothing yet */ }
  +public class TransformerFactoryImpl extends SAXTransformerFactory {
   
  -    ////////////////////////////////////////////////////// 
  -    // SAXTransformerFactory (subclass of TransformerFactory)
  -    //
  -    public TemplatesHandler newTemplatesHandler() 
  -     throws TransformerConfigurationException 
  -    { 
  -     /*TBD*/
  -     throw new TransformerConfigurationException(
  -         "TransformerFactoryImpl:newTemplatesHandler() " +
  -         "not implemented yet."); 
  -     //return null; 
  -    }
  -    public TransformerHandler newTransformerHandler() 
  -     throws TransformerConfigurationException 
  -    {
  -     /*TBD*/ 
  -        throw new TransformerConfigurationException(
  -            "TransformerFactoryImpl:newTransformerHandler() " +
  -            "not implemented yet."); 
  -     // return null; 
  -    }
  -    public TransformerHandler newTransformerHandler(Source src) 
  -     throws TransformerConfigurationException 
  -    { 
  -        /*TBD*/ 
  -        throw new TransformerConfigurationException(
  -            "TransformerFactoryImpl:newTransformerHandler(Source) " +
  -            "not implemented yet."); 
  -     // return null; 
  -    }
  -    public TransformerHandler newTransformerHandler(Templates templates) 
  -     throws TransformerConfigurationException 
  -    { 
  -        /*TBD*/ 
  -        throw new TransformerConfigurationException(
  -            "TransformerFactoryImpl:newTransformerHandler(Templates) " +
  -            "not implemented yet."); 
  -     //return null; 
  -    }
  +    // This constant should be removed once all abstract methods are impl'ed.
  +    private static final String NYI = "Not yet implemented";
   
  +    // This error listener is used only for this factory and is not passed to
  +    // the Templates or Transformer objects that we create!!!
  +    private ErrorListener _errorListener = null; 
   
  -  /**
  -   * Create an XMLFilter that uses the given source as the
  -   * transformation instructions.
  -   *
  -   * @param src The source of the transformation instructions.
  -   *
  -   * @return An XMLFilter object, or null if this feature is not supported.
  -   *
  -   * @throws TransformerConfigurationException
  -   */
  -    public XMLFilter newXMLFilter(Source src) 
  -     throws TransformerConfigurationException 
  -    {
  -     Templates templates = newTemplates(src);
  -     if (templates == null ) {
  -         return null; 
  -     }
  -     return newXMLFilter(templates);
  -    }
  +    // This URIResolver is passed to all created Templates and Transformers
  +    private URIResolver _uriResolver = null;
   
  -    public XMLFilter newXMLFilter(Templates templates) 
  -     throws TransformerConfigurationException 
  -    {
  -     try {
  -                 return new org.apache.xalan.xsltc.trax.TrAXFilter(templates);
  -     } catch( TransformerConfigurationException ex ) {
  -                 if( _errorListener != null) {
  -                try {
  -                 _errorListener.fatalError( ex );
  -                 return null;
  -             } catch( TransformerException ex1 ) {
  -                 new TransformerConfigurationException(ex1);
  -             }
  -                 }
  -                 throw ex;
  -     }
  -    }
  -    //
  -    // End SAXTransformerFactory methods 
  -    ////////////////////////////////////////////////////// 
  -
  -    ////////////////////////////////////////////////////// 
  -    // TransformerFactory
  -    //
  -    public ErrorListener getErrorListener() { 
  -     return _errorListener;
  +    // Cache for the newTransformer() method - see method for details
  +    private Transformer _copyTransformer = null;
  +    private static final String COPY_TRANSLET_NAME = "GregorSamsa";
  +    private static final String COPY_TRANSLET_CODE =
  +     "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\";>"+
  +     "<xsl:template match=\"/\"><xsl:copy-of select=\".\"/></xsl:template>"+
  +     "</xsl:stylesheet>";
  +
  +    // All used error messages should be listed here
  +    private static final String ERROR_LISTENER_NULL =
  +     "Attempting to set ErrorListener for TransformerFactory to null";
  +    private static final String SOURCE_NOT_SUPPORTED =
  +     "Only StreamSource is supported by XSLTC";
  +    private static final String STREAM_SOURCE_ERROR =
  +     "StreamSource must have a system id or be an InputStream";
  +    private static final String COMPILATION_ERROR =
  +     "Could not compile stylesheet";
  +
  +
  +    /**
  +     * javax.xml.transform.sax.TransformerFactory implementation.
  +     * Contains nothing yet
  +     */
  +    public TransformerFactoryImpl() {
  +     // Don't need anything here so far...
       }
   
  +    /**
  +     * 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.
  +     *
  +     * @param listener The error listener to use with the TransformerFactory
  +     * @throws IllegalArgumentException
  +     */
       public void setErrorListener(ErrorListener listener) 
  -     throws IllegalArgumentException
  -    {
  -     if (listener == null) {
  -            throw new IllegalArgumentException(
  -               "Error: setErrorListener() call where ErrorListener is null");
  -     }
  +     throws IllegalArgumentException {
  +     if (listener == null)
  +            throw new IllegalArgumentException(ERROR_LISTENER_NULL);
        _errorListener = listener;
       }
   
  +    /**
  +     * javax.xml.transform.sax.TransformerFactory implementation.
  +     * Get the error event handler for the TransformerFactory.
  +     *
  +     * @return The error listener used with the TransformerFactory
  +     */
  +    public ErrorListener getErrorListener() { 
  +     return _errorListener;
  +    }
  +
  +    /**
  +     * javax.xml.transform.sax.TransformerFactory implementation.
  +     * Returns the value set for a TransformerFactory attribute
  +     * We are currently not using any attributes with XSLTC. We should try to
  +     * avoid using attributes as this can make us less flexible.
  +     *
  +     * @param name The attribute name
  +     * @return An object representing the attribute value
  +     * @throws IllegalArgumentException
  +     */
       public Object getAttribute(String name) 
  -     throws IllegalArgumentException
  -    { 
  -     /*TBD*/ 
  -        throw new IllegalArgumentException(
  -            "TransformerFactoryImpl:getAttribute(String) " +
  -            "not implemented yet.");
  -     //return null; 
  +     throws IllegalArgumentException { 
  +        throw new IllegalArgumentException(NYI);
       }
  +
  +    /**
  +     * javax.xml.transform.sax.TransformerFactory implementation.
  +     * Returns the value set for a TransformerFactory attribute
  +     * We are currently not using any attributes with XSLTC. We should try to
  +     * avoid using attributes as this can make us less flexible.
  +     *
  +     * @param name The attribute name
  +     * @param value An object representing the attribute value
  +     * @throws IllegalArgumentException
  +     */
       public void setAttribute(String name, Object value) 
  -     throws IllegalArgumentException
  -    { 
  -     /*TBD*/  
  -        throw new IllegalArgumentException(
  -            "TransformerFactoryImpl:getAttribute(String) " +
  -            "not implemented yet.");
  +     throws IllegalArgumentException { 
  +        throw new IllegalArgumentException(NYI);
       }
  +
  +    /**
  +     * 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) { 
  -     if ((StreamSource.FEATURE == name) ||
  -         (StreamResult.FEATURE == name) ||
  -         (SAXTransformerFactory.FEATURE == name)) {
  +     if (name.equals(StreamSource.FEATURE) ||
  +         name.equals(StreamResult.FEATURE) ||
  +         name.equals(SAXTransformerFactory.FEATURE)) {
            return true;
  -     } else if ((StreamSource.FEATURE.equals(name))
  -             || (StreamResult.FEATURE.equals(name))
  -             || (SAXTransformerFactory.FEATURE.equals(name))) {
  -         return true;
  -     } else {
  -         return false; 
        }
  +     return false;
  +    }
  +
  +    /**
  +     * 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.
  +     *
  +     * @return The URLResolver used for this TransformerFactory and all
  +     * Templates and Transformer objects created using this factory
  +     */    
  +    public URIResolver getURIResolver() {
  +     return(_uriResolver);
       } 
  -    public URIResolver getURIResolver() { /*TBD*/ return null; } 
  -    public void setURIResolver(URIResolver resolver) {/*TBD*/   } 
  -    public Source getAssociatedStylesheet(Source src, String media,
  -     String title, String charset)  throws TransformerConfigurationException
  -    { 
  -     /*TBD*/ 
  -        throw new TransformerConfigurationException(
  -            "TransformerFactoryImpl:getAssociatedStylesheet(Source,String," +
  -            "String, String) not implemented yet.");
  -     //return null; 
  -    }
  -    public Transformer newTransformer() throws
  -     TransformerConfigurationException 
  -    { 
  -     /*TBD*/ 
  -        throw new TransformerConfigurationException(
  -            "TransformerFactoryImpl:newTransformer() " +
  -            " not implemented yet.");
  -     //return null; 
  -    }
  -    //
  -    // End TransformerFactory methods 
  -    ////////////////////////////////////////////////////// 
   
       /**
  +     * 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.
  +     *
  +     * @param resolver The URLResolver used for this TransformerFactory and all
  +     * Templates and Transformer objects created using this factory
  +     */    
  +    public void setURIResolver(URIResolver resolver) {
  +     _uriResolver = resolver;
  +    }
  +
  +    /**
  +     * 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.
  +     *
  +     * @param source The XML source document.
  +     * @param media The media attribute to be matched. May be null, in which
  +     * case the prefered templates will be used (i.e. alternate = no).
  +     * @param title The value of the title attribute to match. May be null.
  +     * @param charset The value of the charset attribute to match. May be null.
  +     * @return A Source object suitable for passing to the TransformerFactory.
  +     * @throws TransformerConfigurationException
  +     */
  +    public Source getAssociatedStylesheet(Source source, String media,
  +                                       String title, String charset)
  +     throws TransformerConfigurationException {
  +        throw new TransformerConfigurationException(NYI);
  +    }
  +
  +    /**
  +     * javax.xml.transform.sax.TransformerFactory implementation.
  +     * Create a Transformer object that copies the input document to the result.
  +     *
  +     * @return A Transformer object that simply copies the source to the result.
  +     * @throws TransformerConfigurationException
  +     */    
  +    public Transformer newTransformer()
  +     throws TransformerConfigurationException { 
  +
  +     if (_copyTransformer != null) return _copyTransformer;
  +
  +     byte[][] bytecodes = null; // The translet classes go in here
  +
  +     XSLTC xsltc = new XSLTC();
  +     xsltc.init();
  +
  +     // Compile the default copy-stylesheet
  +     byte[] bytes = COPY_TRANSLET_CODE.getBytes();
  +     ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
  +     bytecodes = xsltc.compile(inputStream, COPY_TRANSLET_NAME, 77);
  +
  +     // Check that the transformation went well before returning
  +     if (bytecodes == null) {
  +         throw new TransformerConfigurationException(COMPILATION_ERROR);
  +     }
  +
  +     // Create a Transformer object and store for other calls
  +     Templates templates = new TemplatesImpl(bytecodes, COPY_TRANSLET_NAME);
  +     _copyTransformer = templates.newTransformer();
  +     return(_copyTransformer);
  +    }
  +
  +    /**
  +     * 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.
        *
  +     * @return A Templates object that can be used to create Transformers.
  +     * @throws TransformerConfigurationException
        */
       public Transformer newTransformer(Source source) throws
        TransformerConfigurationException {
  @@ -261,29 +306,28 @@
       }
   
       /**
  +     * javax.xml.transform.sax.TransformerFactory implementation.
  +     * Process the Source into a Templates object, which is a a compiled
  +     * representation of the source.
        *
  +     * @param stylesheet The input stylesheet. Only StreamSource is suported
  +     * for now (otherwise the Source URI must be set using the setSystemId()
  +     * method). This methods needs more work!!!
  +     * @return A Templates object that can be used to create Transformers.
  +     * @throws TransformerConfigurationException
        */
  -    public Templates newTemplates(Source stylesheet) throws
  -     TransformerConfigurationException {
  +    public Templates newTemplates(Source stylesheet)
  +     throws TransformerConfigurationException {
  +
  +     byte[][] bytecodes = null; // The translet classes go in here
   
        XSLTC xsltc = new XSLTC();
        xsltc.init();
  -
  -     // Check if destination has been set with system property
  -     // TODO: We probably have to change this.
  -     //       Xalan might already have a property defined for this
  -     String transletDestDir = System.getProperty("transletPool");
  -     if (transletDestDir != null) {
  -         xsltc.setDestDirectory(transletDestDir);
  -     }
  -
  -        // Get down to business: Compile the stylesheet
  -        InputStream inputStream = ((StreamSource)stylesheet).getInputStream();
  -        String stylesheetName = stylesheet.getSystemId();
  -     URL url = null;
   
  -     // Attempt to get a decent name for the translet...
  +     // Attempt using the URL returned by the Source's getSystemId() method
  +        final String stylesheetName = stylesheet.getSystemId();
           String transletName = "undefined";
  +     URL url = null;
        if (stylesheetName != null) {
            final String base  = Util.baseName(stylesheetName);
            final String noext = Util.noExtName(base);
  @@ -297,19 +341,128 @@
            }
            catch (MalformedURLException e) { url = null; }
        }
  -
  -     byte[][] bytecodes = null;
   
  -     if (url != null)
  +     // Now do the actual compilation - store results in the bytecodes array
  +     if (url != null) {
            bytecodes = xsltc.compile(url, transletName);
  -     else if (inputStream != null)
  -         bytecodes = xsltc.compile(inputStream, transletName, 77);
  -     else
  -         throw new TransformerConfigurationException(
  -             "Stylesheet must have a system id or be an InputStream.");
  +     }
  +     else if (stylesheet instanceof StreamSource) {
  +         StreamSource streamSource = (StreamSource)stylesheet;
  +         InputStream inputStream = streamSource.getInputStream();
  +         if (inputStream != null)
  +             bytecodes = xsltc.compile(inputStream, transletName, 77);
  +     }
  +     else {
  +         throw new TransformerConfigurationException(STREAM_SOURCE_ERROR);
  +     }
  +
  +     // Check that the transformation went well before returning
  +     if (bytecodes == null) {
  +         throw new TransformerConfigurationException(COMPILATION_ERROR);
  +     }
   
        return(new TemplatesImpl(bytecodes, transletName));
       }
   
  -    private ErrorListener _errorListener = null; 
  +    /**
  +     * javax.xml.transform.sax.SAXTransformerFactory implementation.
  +     * Get a TemplatesHandler object that can process SAX ContentHandler
  +     * events into a Templates object.
  +     *
  +     * @return A TemplatesHandler object that can handle SAX events
  +     * @throws TransformerConfigurationException
  +     */
  +    public TemplatesHandler newTemplatesHandler() 
  +     throws TransformerConfigurationException { 
  +     throw new TransformerConfigurationException(NYI);
  +    }
  +
  +    /**
  +     * javax.xml.transform.sax.SAXTransformerFactory implementation.
  +     * Get a TransformerHandler object that can process SAX ContentHandler
  +     * events into a Result.
  +     *
  +     * @return A TransformerHandler object that can handle SAX events
  +     * @throws TransformerConfigurationException
  +     */
  +    public TransformerHandler newTransformerHandler() 
  +     throws TransformerConfigurationException {
  +     throw new TransformerConfigurationException(NYI);
  +    }
  +
  +    /**
  +     * 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.
  +     *
  +     * @param src The source of the transformation instructions.
  +     * @return A TransformerHandler object that can handle SAX events
  +     * @throws TransformerConfigurationException
  +     */
  +    public TransformerHandler newTransformerHandler(Source src) 
  +     throws TransformerConfigurationException { 
  +        throw new TransformerConfigurationException(NYI);
  +    }
  +
  +    /**
  +     * 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.
  +     *
  +     * @param templates Represents a pre-processed stylesheet
  +     * @return A TransformerHandler object that can handle SAX events
  +     * @throws TransformerConfigurationException
  +     */    
  +    public TransformerHandler newTransformerHandler(Templates templates) 
  +     throws TransformerConfigurationException  { 
  +        throw new TransformerConfigurationException(NYI);
  +    }
  +
  +
  +    /**
  +     * javax.xml.transform.sax.SAXTransformerFactory implementation.
  +     * Create an XMLFilter that uses the given source as the
  +     * transformation instructions.
  +     *
  +     * @param src The source of the transformation instructions.
  +     * @return An XMLFilter object, or null if this feature is not supported.
  +     * @throws TransformerConfigurationException
  +     */
  +    public XMLFilter newXMLFilter(Source src) 
  +     throws TransformerConfigurationException {
  +     Templates templates = newTemplates(src);
  +     if (templates == null ) return null; 
  +     return newXMLFilter(templates);
  +    }
  +
  +    /**
  +     * javax.xml.transform.sax.SAXTransformerFactory implementation.
  +     * Create an XMLFilter that uses the given source as the
  +     * transformation instructions.
  +     *
  +     * @param src The source of the transformation instructions.
  +     * @return An XMLFilter object, or null if this feature is not supported.
  +     * @throws TransformerConfigurationException
  +     */
  +    public XMLFilter newXMLFilter(Templates templates) 
  +     throws TransformerConfigurationException {
  +     try {
  +                 return new org.apache.xalan.xsltc.trax.TrAXFilter(templates);
  +     }
  +     catch(TransformerConfigurationException e1) {
  +                 if(_errorListener != null) {
  +                try {
  +                 _errorListener.fatalError(e1);
  +                 return null;
  +             }
  +             catch( TransformerException e2) {
  +                 new TransformerConfigurationException(e2);
  +             }
  +                 }
  +                 throw e1;
  +     }
  +    }
  +
   }
  
  
  
  1.4       +187 -51   
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java
  
  Index: TransformerImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TransformerImpl.java      2001/07/13 10:32:25     1.3
  +++ TransformerImpl.java      2001/07/17 15:34:14     1.4
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TransformerImpl.java,v 1.3 2001/07/13 10:32:25 morten Exp $
  + * @(#)$Id: TransformerImpl.java,v 1.4 2001/07/17 15:34:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -65,20 +65,24 @@
   
   import java.io.File;
   import java.io.Writer;
  +import java.io.InputStream;
   import java.io.OutputStream;
   import java.io.FileOutputStream;
   import java.io.FileNotFoundException;
   import java.net.MalformedURLException;
   import java.net.UnknownHostException;
   import java.lang.IllegalArgumentException;
  +import java.util.Enumeration;
   
   import org.xml.sax.XMLReader;
   import org.xml.sax.ContentHandler;
  +import org.xml.sax.InputSource;
   
   import javax.xml.parsers.SAXParser;
   import javax.xml.parsers.SAXParserFactory;
   import javax.xml.transform.*;
   import javax.xml.transform.stream.StreamResult;
  +import javax.xml.transform.stream.StreamSource;
   
   import org.apache.xalan.xsltc.Translet;
   import org.apache.xalan.xsltc.TransletException;
  @@ -94,12 +98,26 @@
       private String           _encoding = null;
       private ContentHandler   _handler = null;
   
  +    private ErrorListener _errorListener = null;
  +    private URIResolver   _uriResolver = null;
  +    private Properties    _properties = null;
  +
  +    // Used for default output property settings
  +    private final static String EMPTY_STRING = "";
  +    private final static String NO_STRING    = "no";
  +    private final static String YES_STRING   = "yes";
  +    private final static String XML_STRING   = "xml";
  +    
  +    // List all error messages here
       private final static String TRANSLET_ERR_MSG = 
        "The transformer has no encapsulated translet object.";
       private final static String HANDLER_ERR_MSG = 
        "No defined output handler for transformation result.";
  +    private static final String ERROR_LISTENER_NULL =
  +     "Attempting to set ErrorListener for Transformer to null";
   
       /**
  +     * Implements JAXP's Transformer constructor
        * Our Transformer objects always need a translet to do the actual work
        */
       public TransformerImpl(Translet translet) {
  @@ -107,7 +125,11 @@
       }
   
       /**
  -     * JAXP interface implementation
  +     * Implements JAXP's Transformer.transform()
  +     *
  +     * @param source Contains the input XML document
  +     * @param result Will contain the output from the transformation
  +     * @throws TransformerException
        */
       public void transform(Source source, Result result)
        throws TransformerException {
  @@ -118,7 +140,7 @@
        if (_handler == null) throw new TransformerException(HANDLER_ERR_MSG);
        
        // Run the transformation
  -     transform(source.getSystemId(), _handler, _encoding);
  +     transform(source, _handler, _encoding);
       }
   
       /**
  @@ -165,7 +187,7 @@
       /**
        * Internal transformation method - uses the internal APIs of XSLTC
        */
  -    private void transform(String source,
  +    private void transform(Source source,
                           ContentHandler handler,
                           String encoding) throws TransformerException {
        try {
  @@ -181,20 +203,34 @@
            final DTDMonitor dtdMonitor = new DTDMonitor();
            dtdMonitor.handleDTD(reader);
    
  -         dom.setDocumentURI(source);
  -         if (source.startsWith("file:/")) {   
  -             reader.parse(source);
  -         } else {                                
  -             reader.parse("file:"+(new File(source).getAbsolutePath()));
  +         String url = source.getSystemId();
  +         if (url != null) {
  +             dom.setDocumentURI(url);
  +             if (url.startsWith("file:/")) {   
  +                 reader.parse(url);
  +             } else {                                
  +                 reader.parse("file:"+(new File(url).getAbsolutePath()));
  +             }
            }
  -
  +         else if (source instanceof StreamSource) {
  +             InputStream stream = ((StreamSource)source).getInputStream();
  +             InputSource input = new InputSource(stream);
  +             reader.parse(input);
  +         }
  +         else {
  +             throw new TransformerException("Unsupported input.");
  +         }
  +         
            // Set size of key/id indices
            _translet.setIndexSize(dom.getSize());
            // If there are any elements with ID attributes, build an index
            dtdMonitor.buildIdIndex(dom, 0, _translet);
            // Pass unparsed entity URIs to the translet
            _translet.setDTDMonitor(dtdMonitor);
  - 
  +
  +         // Pass output properties to the translet
  +         setOutputProperties(_translet, _properties);
  +
            // Transform the document
            TextOutput textOutput = new TextOutput(handler, _encoding);
            _translet.transform(dom, textOutput);
  @@ -231,95 +267,183 @@
        }
       }
   
  -    // TrAX support methods, get/setErrorListener
  -    private ErrorListener _errorListener = null;
  -
       /**
  -     * Get the TrAX error listener
  +     * Implements JAXP's Transformer.getErrorListener()
  +     * Get the error event handler in effect for the transformation.
  +     *
  +     * @return The error event handler currently in effect
        */
       public ErrorListener getErrorListener() {  
        return _errorListener; 
       }
   
       /**
  -     * Set the TrAX error listener
  +     * Implements JAXP's Transformer.setErrorListener()
  +     * Set the error event listener in effect for the transformation.
  +     *
  +     * @param listener The error event listener to use
  +     * @throws IllegalArgumentException
        */
       public void setErrorListener(ErrorListener listener)
        throws IllegalArgumentException {
  -        if (listener == null) {
  -            throw new IllegalArgumentException(
  -            "Error: setErrorListener() call where ErrorListener is null");
  -        }
  +        if (listener == null)
  +            throw new IllegalArgumentException(ERROR_LISTENER_NULL);
           _errorListener = listener;
       }
   
       /**
        * Inform TrAX error listener of an error
        */
  -    private void postErrorToListener(String msg) {
  +    private void postErrorToListener(String message) {
           try {
  -            _errorListener.error(new TransformerException(
  -               "Translet Error: " + msg));
  -        } catch (TransformerException e) {
  -            // TBD
  +            _errorListener.error(new TransformerException(message));
  +     }
  +     catch (TransformerException e) {
  +            // ignored - transformation cannot be continued
           }
       }
   
       /**
        * Inform TrAX error listener of a warning
        */
  -    private void postWarningToListener(String msg) {
  +    private void postWarningToListener(String message) {
           try {
  -            _errorListener.warning(new TransformerException(
  -                 "Translet Warning: " + msg));
  -        } catch (TransformerException e) {
  -            // TBD
  +            _errorListener.warning(new TransformerException(message));
           }
  +     catch (TransformerException e) {
  +            // ignored - transformation cannot be continued
  +        }
       }
   
       /**
        * Implements JAXP's Transformer.getOutputProperties().
  -     * Returns a copy of the output properties for the transformation.
  +     * Returns a copy of the output properties for the transformation. Note that
  +     * this method will only return properties that were set in this class.
  +     * The output settings defined in the stylesheet's <xsl:output> element
  +     * and default XSLT output settings will not be returned by this method.
  +     *
  +     * @return Properties explicitly set for this Transformer
        */
  -    public Properties getOutputProperties() throws IllegalArgumentException { 
  -     // TODO
  -     return(null);
  +    public Properties getOutputProperties() {
  +     return(_properties);
       }
   
       /**
        * Implements JAXP's Transformer.getOutputProperty().
  -     * Set an output property that will be in effect for the transformation.
  +     * Get an output property that is in effect for the transformation. The
  +     * property specified may be a property that was set with setOutputProperty,
  +     * or it may be a property specified in the stylesheet.
  +     *
  +     * @param name A non-null string that contains the name of the property
  +     * @throws IllegalArgumentException if the property name is not known
        */
       public String getOutputProperty(String name)
  -     throws IllegalArgumentException { 
  -     // TODO
  -     return(null);
  +     throws IllegalArgumentException {
  +
  +     // First check if the property is overridden in this Transformer
  +     if (_properties != null) {
  +         String value = _properties.getProperty(name);
  +         if (value != null) return value;
  +     }
  +
  +     // Then check if it is set in the translet
  +     if (_translet != null) {
  +         // TODO: get propertie value from translet
  +         if (name.equals(OutputKeys.ENCODING)) {
  +             return _encoding;
  +         }
  +         else if (name.equals(OutputKeys.METHOD)) {
  +
  +         }
  +         
  +     }
  +
  +     // Then return the default values
  +     if (name.equals(OutputKeys.ENCODING))
  +         return _encoding;
  +     else if (name.equals(OutputKeys.METHOD))
  +         return XML_STRING;
  +     else if (name.equals(OutputKeys.INDENT))
  +         return NO_STRING;
  +     else if (name.equals(OutputKeys.DOCTYPE_PUBLIC))
  +         return EMPTY_STRING;
  +     else if (name.equals(OutputKeys.DOCTYPE_SYSTEM))
  +         return EMPTY_STRING;
  +     else if (name.equals(OutputKeys.CDATA_SECTION_ELEMENTS))
  +         return EMPTY_STRING;
  +     else if (name.equals(OutputKeys.MEDIA_TYPE))
  +         return "text/xml";
  +     else if (name.equals(OutputKeys.OMIT_XML_DECLARATION))
  +         return NO_STRING;
  +     else if (name.equals(OutputKeys.STANDALONE))
  +         return NO_STRING;
  +     else if (name.equals(OutputKeys.VERSION))
  +         return "1.0";
  +
  +
  +     return null;
       }
   
       /**
        * Implements JAXP's Transformer.setOutputProperties().
        * Set the output properties for the transformation. These properties
        * will override properties set in the Templates with xsl:output.
  +     * Unrecognised properties will be quitely ignored.
  +     *
  +     * @param properties The properties to use for the Transformer
  +     * @throws IllegalArgumentException Never, errors are ignored
        */
  -    public void setOutputProperties(Properties props)
  +    public void setOutputProperties(Properties properties)
        throws IllegalArgumentException {
  -     // TODO
  +     _properties = properties;
       }
   
       /**
        * Implements JAXP's Transformer.setOutputProperty().
        * Get an output property that is in effect for the transformation. The
  -     * property specified may be a property that was set with
  +     * property specified may be a property that was set with 
        * setOutputProperty(), or it may be a property specified in the stylesheet.
  +     *
  +     * @param name The name of the property to set
  +     * @param value The value to assign to the property
  +     * @throws IllegalArgumentException Never, errors are ignored
        */
       public void setOutputProperty(String name, String value)
  -     throws  IllegalArgumentException  {
  -     // TODO
  +     throws IllegalArgumentException {
  +     if (_properties == null) _properties = new Properties();
  +     _properties.setProperty(name, value);
  +    }
  +
  +    /**
  +     * Internal method to pass any properties to the translet prior to
  +     * initiating the transformation
  +     */
  +    private void setOutputProperties(AbstractTranslet translet,
  +                                  Properties properties) {
  +     // TODO - pass properties to the translet
  +     Enumeration names = properties.propertyNames();
  +     while (names.hasMoreElements()) {
  +         String name = (String)names.nextElement();
  +         if (name.equals(OutputKeys.ENCODING)) {
  +             _encoding = (String)properties.getProperty(name);
  +         }
  +         else if (name.equals(OutputKeys.CDATA_SECTION_ELEMENTS)) {
  +             // ignored - too late now, translet is already compiled
  +         }
  +         else if (name.equals(OutputKeys.METHOD)) {
  +
  +         }
  +     }
       }
   
       /**
        * Implements JAXP's Transformer.setParameter()
  -     * Add a parameter for the transformation.
  +     * Add a parameter for the transformation. The parameter is simply passed
  +     * on to the translet - no validation is performed - so any unused
  +     * parameters are quitely ignored by the translet.
  +     *
  +     * @param name The name of the parameter
  +     * @param value The value to assign to the parameter
        */
       public void setParameter(String name, Object value) { 
        _translet.addParameter(name, value, false);
  @@ -327,7 +451,8 @@
   
       /**
        * Implements JAXP's Transformer.clearParameters()
  -     * Clears the parameter stack.
  +     * Clear all parameters set with setParameter. Clears the translet's
  +     * parameter stack.
        */
       public void clearParameters() {  
        _translet.clearParameters();
  @@ -335,23 +460,34 @@
   
       /**
        * Implements JAXP's Transformer.getParameter()
  -     * Returns the value of a given parameter
  +     * Returns the value of a given parameter. Note that the translet will not
  +     * keep values for parameters that were not defined in the stylesheet.
  +     *
  +     * @param name The name of the parameter
  +     * @return An object that contains the value assigned to the parameter
        */
       public final Object getParameter(String name) {
        return(_translet.getParameter(name));
       }
   
       /**
  -     * These two methods need to pass the URI resolver to the dom/LoadDocument
  -     * class, which again must use the URI resolver if present.
  +     * Implements JAXP's Transformer.getURIResolver()
  +     * Set the object currently used to resolve URIs used in document().
  +     *
  +     * @returns The URLResolver object currently in use
        */
       public URIResolver getURIResolver() {
  -     // TODO
  -     return null;
  +     return _uriResolver;
       }
   
  +    /**
  +     * Implements JAXP's Transformer.setURIResolver()
  +     * Set an object that will be used to resolve URIs used in document().
  +     *
  +     * @param resolver The URIResolver to use in document()
  +     */
       public void setURIResolver(URIResolver resolver) { 
  -     // TODO
  +     _uriResolver = resolver;
       }
   
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to