You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mm...@locus.apache.org on 2000/12/08 02:21:51 UTC

cvs commit: xml-xalan/java/src/org/apache/xpath DOMHelper.java

mmidy       00/12/07 17:21:50

  Modified:    java/src/org/apache/xalan/stree SourceTreeHandler.java
                        StreeDOMBuilder.java
               java/src/org/apache/xalan/transformer TransformerImpl.java
               java/src/org/apache/xpath DOMHelper.java
  Log:
  Use Stree for resultTreeFragments if the source node is an Stree node.
  
  Revision  Changes    Path
  1.22      +12 -1     xml-xalan/java/src/org/apache/xalan/stree/SourceTreeHandler.java
  
  Index: SourceTreeHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/stree/SourceTreeHandler.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- SourceTreeHandler.java	2000/11/23 04:57:38	1.21
  +++ SourceTreeHandler.java	2000/12/08 01:21:45	1.22
  @@ -72,6 +72,7 @@
   import org.apache.xalan.templates.WhiteSpaceInfo;
   
   import org.w3c.dom.Document;
  +import org.w3c.dom.DocumentFragment;
   
   import org.xml.sax.Attributes;
   import org.xml.sax.ext.LexicalHandler;
  @@ -156,6 +157,13 @@
   
     /** Flag indicating whether we should check whitespaces          */
     boolean m_shouldCheckWhitespace = false;
  +  
  +  boolean m_shouldTransformAtEnd = true;
  +  
  +  public void setShouldTransformAtEnd(boolean b)
  +  {
  +    m_shouldTransformAtEnd = b;
  +  }
   
     /**
      * Get the root document of tree that is being or will be created.
  @@ -300,6 +308,9 @@
         ((DocumentImpl) m_root).setLevel(new Integer(1).shortValue());
         ((DocumentImpl) m_root).setUseMultiThreading(getUseMultiThreading());
   
  +      if (m_root.getNodeType() == Node.DOCUMENT_FRAGMENT_NODE)
  +        m_sourceTreeHandler = new StreeDOMBuilder(m_root, (DocumentFragment)m_root);
  +      else
         m_sourceTreeHandler = new StreeDOMBuilder(m_root);
   
         pushShouldStripWhitespace(false);
  @@ -349,7 +360,7 @@
         m_sourceTreeHandler.endDocument();
         popShouldStripWhitespace();
   
  -      if (!m_useMultiThreading && (null != m_transformer))
  +      if (!m_useMultiThreading && (null != m_transformer) && m_shouldTransformAtEnd)
         {
           try
           {
  
  
  
  1.9       +17 -2     xml-xalan/java/src/org/apache/xalan/stree/StreeDOMBuilder.java
  
  Index: StreeDOMBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/stree/StreeDOMBuilder.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- StreeDOMBuilder.java	2000/11/30 16:26:48	1.8
  +++ StreeDOMBuilder.java	2000/12/08 01:21:45	1.9
  @@ -322,12 +322,27 @@
      *
      */
     void appendAccumulatedText(Node currentNode, char ch[], int start, int length)
  +    throws org.xml.sax.SAXException
     {
       // Get the text node. It should be the last node that was 
       // added to the current node. (Text nodes are never made to be
       // the currentNode).
  -    TextImpl textNode = (TextImpl)((Parent)currentNode).m_last;
  -    textNode.appendText(ch, start, length);
  +    // Note that we are checking for a null current node, because
  +    // if this is document fragment, the current node could be null.
  +    if (null == currentNode)
  +    {
  +      currentNode =  m_docFrag;    
  +    }
  +    if (null != currentNode)
  +    {  
  +      TextImpl textNode = (TextImpl)((Parent)currentNode).m_last;
  +      textNode.appendText(ch, start, length);
  +    }
  +    else
  +    {
  +      append(new TextImpl(m_docImpl, ch, start, length));
  +      setPreviousIsText(true);
  +    }
     }
     
   }
  
  
  
  1.58      +42 -24    xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java
  
  Index: TransformerImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/transformer/TransformerImpl.java,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- TransformerImpl.java	2000/12/07 18:36:56	1.57
  +++ TransformerImpl.java	2000/12/08 01:21:47	1.58
  @@ -70,6 +70,7 @@
   // Xalan imports
   import org.apache.xalan.res.XSLTErrorResources;
   import org.apache.xalan.stree.SourceTreeHandler;
  +import org.apache.xalan.stree.DocumentImpl;
   import org.apache.xalan.templates.Constants;
   import org.apache.xalan.templates.ElemAttributeSet;
   import org.apache.xalan.templates.ElemTemplateElement;
  @@ -1564,7 +1565,6 @@
      * <meta name="usage" content="advanced"/>
      * Given a stylesheet element, create a result tree fragment from it's
      * contents.
  -   * @param stylesheetTree The stylesheet object that holds the fragment.
      * @param templateParent The template element that holds the fragment.
      * @param sourceNode The current source context node.
      * @param mode The mode under which the template is operating.
  @@ -1579,35 +1579,50 @@
   
       // XPathContext xctxt = getXPathContext();
       // Document docFactory = xctxt.getDOMHelper().getDOMFactory();
  -    if (null == m_docBuilder)
  +    ContentHandler rtfHandler;
  +    DocumentFragment resultFragment;
  +    
  +    // If this is an Stree instance, handle it with SourceTreeHandler
  +    // and bypass the whole DOM process.
  +    if (sourceNode instanceof org.apache.xalan.stree.Child)
  +    {      
  +      rtfHandler = new SourceTreeHandler(this);
  +      ((SourceTreeHandler)rtfHandler).setUseMultiThreading(false);
  +      ((SourceTreeHandler)rtfHandler).setShouldTransformAtEnd(false);
  +      // Create a ResultTreeFrag object.
  +      DocumentImpl doc = (DocumentImpl)((SourceTreeHandler)rtfHandler).getRoot();
  +      resultFragment = doc.createDocumentFragment();      
  +      ((SourceTreeHandler)rtfHandler).setRoot((Document)resultFragment);
  +    }     
  +    else
       {
  -      try
  +      if (null == m_docBuilder)
         {
  -        DocumentBuilderFactory dfactory =
  -          DocumentBuilderFactory.newInstance();
  +        try
  +        {
  +          DocumentBuilderFactory dfactory =
  +                                 DocumentBuilderFactory.newInstance();
   
  -        dfactory.setNamespaceAware(true);
  -        dfactory.setValidating(true);
  +          dfactory.setNamespaceAware(true);
  +          dfactory.setValidating(true);
   
  -        m_docBuilder = dfactory.newDocumentBuilder();
  -      }
  -      catch (ParserConfigurationException pce)
  -      {
  -        throw new TransformerException(pce);  //"createDocument() not supported in XPathContext!");
  +          m_docBuilder = dfactory.newDocumentBuilder();
  +        }
  +        catch (ParserConfigurationException pce)
  +        {
  +          throw new TransformerException(pce);  //"createDocument() not supported in XPathContext!");
   
  -        // return null;
  -      }
  +          // return null;
  +        }
  +      }     
  +      Document docFactory = m_docBuilder.newDocument();
  +      // Create a ResultTreeFrag object.
  +      resultFragment = docFactory.createDocumentFragment();           
  +      // Create a DOMBuilder object that will handle the SAX events 
  +      // and build the ResultTreeFrag nodes.
  +      rtfHandler = new DOMBuilder(docFactory, resultFragment);
       }
   
  -    Document docFactory = m_docBuilder.newDocument();
  -
  -    // Create a ResultTreeFrag object.
  -    DocumentFragment resultFragment = docFactory.createDocumentFragment();
  -
  -    // Create a DOMBuilder object that will handle the SAX events 
  -    // and build the ResultTreeFrag nodes.
  -    ContentHandler rtfHandler = new DOMBuilder(docFactory, resultFragment);
  -
       // Save the current result tree handler.
       ResultTreeHandler savedRTreeHandler = this.m_resultTreeHandler;
   
  @@ -1627,9 +1642,12 @@
         throw new TransformerException(se);
       }
   
  +    finally
  +    {
       // Restore the previous result tree handler.
       this.m_resultTreeHandler = savedRTreeHandler;
  -
  +    }
  +    
       return resultFragment;
     }
   
  
  
  
  1.13      +1 -1      xml-xalan/java/src/org/apache/xpath/DOMHelper.java
  
  Index: DOMHelper.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/DOMHelper.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- DOMHelper.java	2000/12/07 19:58:27	1.12
  +++ DOMHelper.java	2000/12/08 01:21:49	1.13
  @@ -86,7 +86,7 @@
      * Used as a helper for handling DOM issues.  May be subclassed to take advantage
      * of specific DOM implementations.
      *
  -   * NEEDSDOC ($objectName$) @return
  +   * @return The DOM Document object to build a DOM tree with.
      */
     public Document createDocument()
     {