morten      01/10/03 02:53:31

  Modified:    java/src/org/apache/xalan/xsltc/trax TransformerImpl.java
  Added:       java/src/org/apache/xalan/xsltc/trax XSLTCSource.java
  Log:
  Adding support for XSLTC-specific DOM caching in JAXP. The XSLTCSource
  class implements JAXP's Source interface, and it encapsulates XSLTC's
  internal DOM so that it can cached be passed to a Transformer multiple
  times without having to re-parse the source document.
  PR:           n/a
  Obtained from:        n/a
  Submitted by: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.18      +54 -21    
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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- TransformerImpl.java      2001/10/02 16:54:53     1.17
  +++ TransformerImpl.java      2001/10/03 09:53:31     1.18
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TransformerImpl.java,v 1.17 2001/10/02 16:54:53 tmiller Exp $
  + * @(#)$Id: TransformerImpl.java,v 1.18 2001/10/03 09:53:31 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -139,6 +139,9 @@
       private static final String OUTPUT_RESULT_EMPTY =
        "The Result object passed to transform() is invalid.";
   
  +    private final static String LEXICAL_HANDLER_PROPERTY =
  +     "http://xml.org/sax/properties/lexical-handler";;
  +
       /**
        * Implements JAXP's Transformer constructor
        * Our Transformer objects always need a translet to do the actual work
  @@ -282,14 +285,9 @@
                _dom = null; // use only once, so reset to 'null'
                return(dom);
            }
  -
  -         // Create an internal DOM (not W3C) and get SAX2 input handler
  -         final DOMImpl dom = new DOMImpl();
  -         DOMBuilder builder = dom.getBuilder();
  -         String prop = "http://xml.org/sax/properties/lexical-handler";;
   
  -         // Create a DTDMonitor that will trace all unparsed entity URIs
  -         final DTDMonitor dtdMonitor = new DTDMonitor();
  +         DOMImpl dom = null;
  +         DTDMonitor dtd = null;
   
            // Handle SAXSource input
            if (source instanceof SAXSource) {
  @@ -298,14 +296,24 @@
                final XMLReader   reader = sax.getXMLReader();
                final InputSource input  = sax.getInputSource();
                final String      systemId = sax.getSystemId();
  -             dtdMonitor.handleDTD(reader);
  +
  +             // Create a DTD monitor to trap all DTD/declarative events
  +             dtd = new DTDMonitor();
  +             dtd.handleDTD(reader);
  +
  +             // Create a new internal DOM and set up its builder to trap
  +             // all content/lexical events
  +             dom = new DOMImpl();
  +             final DOMBuilder builder = dom.getBuilder();
                reader.setContentHandler(builder);
                try {
  -                 reader.setProperty(prop, builder);
  +                 reader.setProperty(LEXICAL_HANDLER_PROPERTY, builder);
                }
                catch (SAXException e) {
                    // quitely ignored
                }
  +
  +             // Parse the input and build the internal DOM
                reader.parse(input);
                dom.setDocumentURI(systemId);
            }
  @@ -316,32 +324,50 @@
                final DOM2SAX     dom2sax = new DOM2SAX(tree);
                final InputSource input = null; 
                final String      systemId = domsrc.getSystemId(); 
  -             dtdMonitor.handleDTD(dom2sax);
  +
  +             // Create a DTD monitor to trap all DTD/declarative events
  +             dtd = new DTDMonitor();
  +             dtd.handleDTD(dom2sax);
  +
  +             // Create a new internal DOM and set up its builder to trap
  +             // all content/lexical events
  +             dom = new DOMImpl();
  +             final DOMBuilder builder = dom.getBuilder();
                dom2sax.setContentHandler(builder);
  +
  +             // Parse the input and build the internal DOM
                dom2sax.parse(input); // need this parameter?
                dom.setDocumentURI(systemId);
            }
            // Handle StreamSource input
            else if (source instanceof StreamSource) {
  -             // With a StreamSource we need to create our own parser
  -             final SAXParserFactory factory = SAXParserFactory.newInstance();
  -             final SAXParser parser = factory.newSAXParser();
  -             final XMLReader reader = parser.getXMLReader();
  -             dtdMonitor.handleDTD(reader);
  -
                // Get all info from the input StreamSource object
                final StreamSource stream = (StreamSource)source;
                final InputStream  streamInput = stream.getInputStream();
                final Reader streamReader = stream.getReader();
                final String systemId = stream.getSystemId();
   
  +             // With a StreamSource we need to create our own parser
  +             final SAXParserFactory factory = SAXParserFactory.newInstance();
  +             final SAXParser parser = factory.newSAXParser();
  +             final XMLReader reader = parser.getXMLReader();
  +
  +             // Create a DTD monitor to trap all DTD/declarative events
  +             dtd = new DTDMonitor();
  +             dtd.handleDTD(reader);
  +
  +             // Create a new internal DOM and set up its builder to trap
  +             // all content/lexical events
  +             dom = new DOMImpl();
  +             final DOMBuilder builder = dom.getBuilder();
                reader.setContentHandler(builder);
                try {
  -                 reader.setProperty(prop, builder);
  +                 reader.setProperty(LEXICAL_HANDLER_PROPERTY, builder);
                }
                catch (SAXException e) {
                    // quitely ignored
                }
  +
                InputSource input;
                if (streamInput != null)
                    input = new InputSource(streamInput);
  @@ -351,20 +377,27 @@
                    input = new InputSource(systemId);
                else
                    throw new TransformerException(INPUT_SOURCE_EMPTY);
  +
  +             // Parse the input and build the internal DOM
                reader.parse(input);
                dom.setDocumentURI(systemId);
            }
  +         // Handle XSLTC-internal Source input
  +         else if (source instanceof XSLTCSource) {
  +             final XSLTCSource xsltcsrc = (XSLTCSource)source;
  +             dtd = xsltcsrc.getDTD();
  +             dom = xsltcsrc.getDOM();
  +         }
            else {
                return null;
            }
  -            builder = null;
   
            // Set size of key/id indices
            _translet.setIndexSize(dom.getSize());
            // If there are any elements with ID attributes, build an index
  -         dtdMonitor.buildIdIndex(dom, mask, _translet);
  +         dtd.buildIdIndex(dom, mask, _translet);
            // Pass unparsed entity URIs to the translet
  -         _translet.setDTDMonitor(dtdMonitor);
  +         _translet.setDTDMonitor(dtd);
            return dom;
        }
        catch (FileNotFoundException e) {
  
  
  
  1.1                  xml-xalan/java/src/org/apache/xalan/xsltc/trax/XSLTCSource.java
  
  Index: XSLTCSource.java
  ===================================================================
  /*
   * @(#)$Id: XSLTCSource.java,v 1.1 2001/10/03 09:53:31 morten Exp $
   *
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Xalan" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, Sun
   * Microsystems., http://www.sun.com.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * @author Morten Jorgensen
   *
   */
  
  package org.apache.xalan.xsltc.trax;
  
  import java.io.File;
  import java.io.IOException;
  
  import org.xml.sax.XMLReader;
  import org.xml.sax.ContentHandler;
  import org.xml.sax.SAXException;
  import org.xml.sax.InputSource;
  import org.xml.sax.ext.LexicalHandler;
  
  import javax.xml.parsers.SAXParser;
  import javax.xml.parsers.SAXParserFactory;
  import javax.xml.parsers.ParserConfigurationException;
  
  import javax.xml.transform.Source;
  
  import org.apache.xalan.xsltc.*;
  import org.apache.xalan.xsltc.dom.DOMImpl;
  import org.apache.xalan.xsltc.dom.DOMBuilder;
  import org.apache.xalan.xsltc.dom.DTDMonitor;
  
  public final class XSLTCSource implements Source {
  
      private String     _systemId = null;
      private DOMImpl    _dom      = null;
      private DTDMonitor _dtd      = null;
  
      private final static String LEXICAL_HANDLER_PROPERTY =
        "http://xml.org/sax/properties/lexical-handler";;
  
      private final static String NO_SYSTEM_ID_ERR =
        "build() called before setSystemId(String systemId)";
  
      /**
       * Create a new XSLTC-specific DOM source
       * @param size The estimated node-count for this DOM. A good guess here
       * speeds up the DOM build process.
       */
      public XSLTCSource(int size) {
        _dom = new DOMImpl(size);
        _dtd = new DTDMonitor();
      }
  
      /**
       * Create a new XSLTC-specific DOM source
       */
      public XSLTCSource() {
        _dom = new DOMImpl();
        _dtd = new DTDMonitor();
      }
  
      /**
       * Implements javax.xml.transform.Source.setSystemId()
       * Set the system identifier for this Source. 
       * This Source can get its input either directly from a file (in this case
       * it will instanciate and use a JAXP parser) or it can receive it through
       * ContentHandler/LexicalHandler interfaces.
       * @param systemId The system Id for this Source
       */
      public void setSystemId(String systemId) {
        if ((new File(systemId)).exists())
            _systemId = "file:"+systemId;
        else
            _systemId = systemId;
        _dom.setDocumentURI(_systemId);
      }
  
      /**
       * Implements javax.xml.transform.Source.getSystemId()
       * Get the system identifier that was set with setSystemId.
       * @return The system identifier that was set with setSystemId,
       *         or null if setSystemId was not called.
       */
      public String getSystemId() {
        return(_systemId);
      }
  
      /**
       * Build the internal XSLTC-specific DOM.
       * @param reader An XMLReader that will pass the XML contents to the DOM
       * @param systemId Specifies the input file
       * @throws SAXException
       */
      public void build(XMLReader reader, String systemId) throws SAXException {
        try {
            // Make sure that the system id is set before proceding
            if (systemId == null) throw new SAXException(NO_SYSTEM_ID_ERR);
  
            // Create an input source for the parser first, just in case the
            // systemId is invalid. We don't want to waste time creating a SAX
            // parser before we know that we actually have some valid input.
            InputSource input = new InputSource(systemId);
  
            // Set out DTD monitor up to receive all DTD and declarative
            // events from the SAX parser. This is necessary to properly
            // build the index used for the id() function
            _dtd.handleDTD(reader);
  
            DOMBuilder builder = _dom.getBuilder();
  
            // Set the DOM builder up to receive content and lexical events
            reader.setContentHandler(builder);
            try {
                reader.setProperty(LEXICAL_HANDLER_PROPERTY, builder);
            }
            catch (SAXException e) {
                // quitely ignored
            }
  
            // Now, finally - parse the input document
            reader.parse(input);
        }
        catch (IOException e) {
            throw new SAXException(e);
        }
      }
  
      /**
       * Build the internal XSLTC-specific DOM.
       * @param systemId Specifies the input file
       * @throws SAXException
       */
      public void build(String systemId) throws SAXException {
        try {
            // Create an XMLReader (SAX parser) for processing the input
            final SAXParserFactory factory = SAXParserFactory.newInstance();
            final SAXParser parser = factory.newSAXParser();
            final XMLReader reader = parser.getXMLReader();
            build(reader, systemId);
        }
        catch (ParserConfigurationException e) {
            throw new SAXException(e);
        }
      }
  
      /**
       * Build the internal XSLTC-specific DOM.
       * @param reader An XMLReader that will pass the XML contents to the DOM
       * @throws SAXException
       */
      public void build(XMLReader reader) throws SAXException {
        build(reader, _systemId);
      }
  
      /**
       * Build the internal XSLTC-specific DOM.
       * The setSystemId() must be called prior to this method.
       * @throws SAXException
       */
      public void build() throws SAXException {
        build(_systemId);
      }    
  
      /**
       * Returns the internal DOM that is encapsulated in this Source
       */
      protected DOMImpl getDOM() {
        return(_dom);
      }
  
      /**
       * Returns the internal DTD that is encapsulated in this Source
       */
      protected DTDMonitor getDTD() {
        return(_dtd);
      }
  
  }
  
  
  

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

Reply via email to