sboag       00/12/31 01:54:04

  Modified:    java/src/org/apache/xalan/stree SourceTreeHandler.java
  Log:
  Add lots of debugging code which can be turned on by setting
  the DEBUG variable to true.  Move the setComplete and notify to
  AFTER the the endDocument event is called (duh).  This was probably
  the cause for the still variable results that JK was seeing.
  
  Revision  Changes    Path
  1.27      +120 -18   
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.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- SourceTreeHandler.java    2000/12/27 22:21:10     1.26
  +++ SourceTreeHandler.java    2000/12/31 09:54:04     1.27
  @@ -57,6 +57,8 @@
   package org.apache.xalan.stree;
   
   import java.util.Stack;
  +import java.util.Properties;
  +import java.util.Enumeration;
   
   import org.w3c.dom.Node;
   
  @@ -100,7 +102,7 @@
   {
     static int m_idCount = 0;
     int m_id;
  -
  +  
     /**
      * Create a SourceTreeHandler that will start a transformation as
      * soon as a startDocument occurs.
  @@ -110,17 +112,34 @@
      */
     public SourceTreeHandler(TransformerImpl transformer)
     {
  +    this(transformer, false);
  +  }
  +
  +  /**
  +   * Create a SourceTreeHandler that will start a transformation as
  +   * soon as a startDocument occurs.
  +   *
  +   * @param transformer The transformer this will use to transform a
  +   * source tree into a result tree.
  +   */
  +  public SourceTreeHandler(TransformerImpl transformer, boolean doFragment)
  +  {
       m_id = m_idCount++;
       m_transformer = transformer;
   
       XPathContext xctxt = ((TransformerImpl) transformer).getXPathContext();
   
       xctxt.setDOMHelper(new StreeDOMHelper());
  -
  -    // if (indexedLookup)
  -    //  m_root = new IndexedDocImpl();
  -    // else
  -    m_root = new DocumentImpl(this);
  +    
  +    if(doFragment)
  +    {
  +      m_root = new DocumentFragmentImpl();
  +      m_docFrag = (DocumentFragmentImpl)m_root;
  +    }
  +    else
  +    {
  +      m_root = new DocumentImpl(this);
  +    }
   
       m_initedRoot = false;
       m_shouldCheckWhitespace =
  @@ -150,8 +169,11 @@
     private DOMBuilder m_sourceTreeHandler;
   
     /** The root of the source document          */
  -  private DocImpl m_root;  // Normally a Document but may be a 
DocumentFragment
  +  private DocImpl m_root;
   
  +  /** If this is non-null, the fragment where the nodes will be added. */
  +  private DocumentFragment m_docFrag;
  +
     /** No longer used??          */
     private boolean m_initedRoot;
   
  @@ -255,6 +277,9 @@
     {
       return m_useMultiThreading;
     }
  +  
  +  /** Indicate whether running in Debug mode        */
  +  private static final boolean DEBUG = false;
   
     /** Flag indicating whether indexed lookup is being used to search the 
source tree          */
     private boolean indexedLookup = false;  // for now 
  @@ -310,8 +335,13 @@
         m_root.setLevel(new Integer(1).shortValue());
         m_root.setUseMultiThreading(getUseMultiThreading());
   
  -      if (m_root.getNodeType() == Node.DOCUMENT_FRAGMENT_NODE)
  +      if(null != m_docFrag)
  +      {
           m_sourceTreeHandler =
  +                new StreeDOMBuilder(m_root, m_docFrag);
  +      }
  +      else if (m_root.getNodeType() == Node.DOCUMENT_FRAGMENT_NODE)
  +        m_sourceTreeHandler =
                   new StreeDOMBuilder(m_root.getOwnerDocument(), 
(DocumentFragment) m_root);
         else
           m_sourceTreeHandler = new StreeDOMBuilder((Document) m_root);
  @@ -324,7 +354,44 @@
       {
         if (m_transformer.isParserEventsOnMain())
         {
  -        m_transformer.setSourceTreeDocForThread(m_root);
  +        // We may need to pass our output properties to the next 
  +        // transformer.  There is a question as to whether or not this 
should 
  +        // be done.
  +        ContentHandler resultContentHandler = 
m_transformer.getContentHandler();
  +        if(null != resultContentHandler)
  +        {
  +          if(resultContentHandler instanceof SourceTreeHandler)
  +          {
  +            // myProps is a clone of the transformer's output properties.
  +            Properties myProps = m_transformer.getOutputProperties();
  +            
  +            // Now copy the result content handler keys on top of our keys.
  +            SourceTreeHandler resultHandler = (SourceTreeHandler) 
resultContentHandler;
  +            Transformer resultTransformer = resultHandler.getTransformer();
  +            Properties resultProps = resultTransformer.getOutputProperties();
  +            Enumeration myKeys = myProps.keys();
  +            while(myKeys.hasMoreElements())
  +            {
  +              Object key = myKeys.nextElement();
  +                            
  +              // Only add it if it has not been explicitly set.
  +              if(null == resultProps.get(key))
  +              {
  +                // System.out.println("key: "+key+", value: 
"+myProps.get(key));
  +                // System.out.println("resultProps.get(key): 
"+resultProps.get(key));
  +                resultProps.put(key, myProps.get(key));
  +              }
  +            }
  +            
  +            resultTransformer.setOutputProperties(resultProps);
  +            
  +          }
  +        } 
  +        
  +        if(null != m_docFrag)
  +          m_transformer.setSourceTreeDocForThread(m_docFrag);
  +        else
  +          m_transformer.setSourceTreeDocForThread(m_root);
   
           Thread t = new Thread(m_transformer);
   
  @@ -349,18 +416,20 @@
      */
     public void endDocument() throws org.xml.sax.SAXException
     {
  -    // System.out.println("endDocument: "+m_id);
  -    m_root.setComplete(true);
  -
       m_eventsCount = m_maxEventsToNotify;
   
  -    notifyWaiters();
  +    // notifyWaiters();
   
       Object synchObj = m_root;
   
       synchronized (synchObj)
       {
         m_sourceTreeHandler.endDocument();
  +      
  +      // System.out.println("endDocument: "+m_id);
  +      m_root.setComplete(true);
  +      notifyWaiters();
  +
         popShouldStripWhitespace();
   
         if (!m_useMultiThreading && (null != m_transformer) && 
m_shouldTransformAtEnd)
  @@ -434,7 +503,20 @@
             String ns, String localName, String name, Attributes atts)
               throws org.xml.sax.SAXException
     {
  -    // System.out.println("startElement: "+ns+", "+localName);
  +    if(DEBUG)
  +    {
  +      System.out.println("SourceTreeHandler - startElement: "+ns+", 
"+localName+", "+m_root);
  +      int n = atts.getLength();
  +      for (int i = 0; i < n; i++) 
  +      {
  +        System.out.println("atts["+i+"]: "+atts.getQName(i)+" = 
"+atts.getValue(i));
  +      }
  +      if(null == ns)
  +      {
  +        (new RuntimeException(localName+" has a null 
namespace!")).printStackTrace();
  +      }
  +    }
  +    
       synchronized (m_root)
       {
         m_shouldStripWhitespaceStack.push(m_shouldStripWS);
  @@ -456,12 +538,16 @@
     public void endElement(String ns, String localName, String name)
             throws org.xml.sax.SAXException
     {
  -    // System.out.println("endElement: "+ns+", "+localName);
  +    if(DEBUG)
  +    {
  +      System.out.println("SourceTreeHandler - endElement: "+ns+", 
"+localName);
  +    }
   
       synchronized (m_root)
       {
         ((Parent) m_sourceTreeHandler.getCurrentNode()).setComplete(true);
  -      m_sourceTreeHandler.endElement(ns, localName, name);
  +      
  +      m_sourceTreeHandler.endElement(ns, localName, name);     
   
         m_shouldStripWS = m_shouldStripWhitespaceStack.popAndTop();
       }
  @@ -509,6 +595,19 @@
      */
     public void characters(char ch[], int start, int length) throws 
org.xml.sax.SAXException
     {
  +    if(DEBUG)
  +    {
  +      System.out.print("SourceTreeHandler#characters: ");
  +      int n = start+length;
  +      for (int i = start; i < n; i++) 
  +      {
  +        if(Character.isWhitespace(ch[i]))
  +          System.out.print("\\"+((int)ch[i]));
  +        else
  +          System.out.print(ch[i]);
  +      }    
  +      System.out.println("");  
  +    }
   
       synchronized (m_root)
       {
  @@ -733,13 +832,13 @@
     public void startPrefixMapping(String prefix, String uri)
             throws org.xml.sax.SAXException
     {
  +    if(DEBUG)
  +      System.out.println("SourceTreeHandler - startPrefixMapping("+prefix+", 
"+uri+");");
   
       synchronized (m_root)
       {
         m_sourceTreeHandler.startPrefixMapping(prefix, uri);
       }
  -
  -    // System.out.println("DOMBuilder.startPrefixMapping("+prefix+", 
"+uri+");");
     }
   
     /**
  @@ -760,6 +859,9 @@
      */
     public void endPrefixMapping(String prefix) throws org.xml.sax.SAXException
     {
  +    if(DEBUG)
  +      System.out.println("SourceTreeHandler - 
endPrefixMapping("+prefix+");");
  +
       m_sourceTreeHandler.endPrefixMapping(prefix);
     }
   
  
  
  

Reply via email to