ilene       2003/02/03 07:52:50

  Modified:    java/src/org/apache/xalan/trace PrintTraceListener.java
  Log:
  Committing patch for bugzilla #16222.  Thanks to Elson Jiang ([EMAIL 
PROTECTED])
  for identifying the problem and isolating the cause.
  
  Revision  Changes    Path
  1.17      +108 -91   
xml-xalan/java/src/org/apache/xalan/trace/PrintTraceListener.java
  
  Index: PrintTraceListener.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/trace/PrintTraceListener.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- PrintTraceListener.java   30 Jan 2003 18:45:54 -0000      1.16
  +++ PrintTraceListener.java   3 Feb 2003 15:52:50 -0000       1.17
  @@ -211,102 +211,119 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public void selected(SelectionEvent ev) throws 
javax.xml.transform.TransformerException
  -  {
  +public void selected(SelectionEvent ev)
  +    throws javax.xml.transform.TransformerException {
   
  -    if (m_traceSelection)
  -    {
  -      ElemTemplateElement ete = (ElemTemplateElement) ev.m_styleNode;
  -      Node sourceNode = ev.m_sourceNode;
  -      
  -      SourceLocator locator = null;
  -      if (sourceNode instanceof DTMNodeProxy)
  -      {
  -        int nodeHandler = ((DTMNodeProxy)sourceNode).getDTMNodeNumber();     
 
  -        locator = 
((DTMNodeProxy)sourceNode).getDTM().getSourceLocatorFor(nodeHandler);
  -      }
  -
  -      if (locator != null)      
  -        m_pw.println("Selected source node '" + sourceNode.getNodeName()
  -                 + "', at " + locator);
  -      else
  -        m_pw.println("Selected source node '" + sourceNode.getNodeName() 
+"'");
  -
  -      if (ev.m_styleNode.getLineNumber() == 0)
  -      {
  -
  -        // You may not have line numbers if the selection is occuring from a
  -        // default template.
  -        ElemTemplateElement parent =
  -          (ElemTemplateElement) ete.getParentElem();
  -
  -        if (parent == ete.getStylesheetRoot().getDefaultRootRule())
  -        {
  -          m_pw.print("(default root rule) ");
  +    if (m_traceSelection) {
  +        ElemTemplateElement ete = (ElemTemplateElement) ev.m_styleNode;
  +        Node sourceNode = ev.m_sourceNode;
  +
  +        SourceLocator locator = null;
  +        if (sourceNode instanceof DTMNodeProxy) {
  +            int nodeHandler = ((DTMNodeProxy) sourceNode).getDTMNodeNumber();
  +            locator =
  +                ((DTMNodeProxy) sourceNode).getDTM().getSourceLocatorFor(
  +                    nodeHandler);
           }
  -        else if (parent == ete.getStylesheetRoot().getDefaultTextRule())
  -        {
  -          m_pw.print("(default text rule) ");
  -        }
  -        else if (parent == ete.getStylesheetRoot().getDefaultRule())
  -        {
  -          m_pw.print("(default rule) ");
  +
  +        if (locator != null)
  +            m_pw.println(
  +                "Selected source node '"
  +                    + sourceNode.getNodeName()
  +                    + "', at "
  +                    + locator);
  +        else
  +            m_pw.println(
  +                "Selected source node '" + sourceNode.getNodeName() + "'");
  +
  +        if (ev.m_styleNode.getLineNumber() == 0) {
  +
  +            // You may not have line numbers if the selection is occuring 
from a
  +            // default template.
  +            ElemTemplateElement parent =
  +                (ElemTemplateElement) ete.getParentElem();
  +
  +            if (parent == ete.getStylesheetRoot().getDefaultRootRule()) {
  +                m_pw.print("(default root rule) ");
  +            } else if (
  +                parent == ete.getStylesheetRoot().getDefaultTextRule()) {
  +                m_pw.print("(default text rule) ");
  +            } else if (parent == ete.getStylesheetRoot().getDefaultRule()) {
  +                m_pw.print("(default rule) ");
  +            }
  +
  +            m_pw.print(
  +                ete.getNodeName()
  +                    + ", "
  +                    + ev.m_attributeName
  +                    + "='"
  +                    + ev.m_xpath.getPatternString()
  +                    + "': ");
  +        } else {
  +            m_pw.print(
  +                ev.m_styleNode.getSystemId()
  +                    + " Line #"
  +                    + ev.m_styleNode.getLineNumber()
  +                    + ", "
  +                    + "Column #"
  +                    + ev.m_styleNode.getColumnNumber()
  +                    + ": "
  +                    + ete.getNodeName()
  +                    + ", "
  +                    + ev.m_attributeName
  +                    + "='"
  +                    + ev.m_xpath.getPatternString()
  +                    + "': ");
           }
   
  -        m_pw.print(ete.getNodeName() + ", " + ev.m_attributeName + "='"
  -                   + ev.m_xpath.getPatternString() + "': ");
  -      }
  -      else
  -      {
  -        m_pw.print(ev.m_styleNode.getSystemId()+ " Line #" + 
ev.m_styleNode.getLineNumber() + ", "
  -                   + "Column #" + ev.m_styleNode.getColumnNumber() + ": "
  -                   + ete.getNodeName() + ", " + ev.m_attributeName + "='"
  -                   + ev.m_xpath.getPatternString() + "': ");
  -      }
  -
  -                        if (ev.m_selection.getType() == 
ev.m_selection.CLASS_NODESET)
  -                        {
  -                                m_pw.println();
  -                                
  -                                org.apache.xml.dtm.DTMIterator nl = 
ev.m_selection.iter();
  -
  -                                try
  -                                {
  -                                        nl = nl.cloneWithReset();
  -                                }
  -                                catch(CloneNotSupportedException cnse)
  -                                {
  -                                        m_pw.println("     [Can't trace 
nodelist because it it threw a CloneNotSupportedException]");
  -                                        return;
  -                                }
  -                                int pos = nl.nextNode();
  -
  -                                if (DTM.NULL == pos)
  -                                {
  -                                        m_pw.println("     [empty node 
list]");
  -                                }
  -                                else
  -                                {
  -                                        while (DTM.NULL != pos)
  -                                        {
  -                                                // m_pw.println("     " + 
ev.m_processor.getXPathContext().getDTM(pos).getNode(pos));
  -                                                DTM dtm = 
ev.m_processor.getXPathContext().getDTM(pos);
  -                                                m_pw.print("     ");
  -                                                
m_pw.print(Integer.toHexString(pos));
  -                                                m_pw.print(": ");
  -                                                
m_pw.println(dtm.getNodeName(pos));
  -
  -                                                pos = nl.nextNode();
  -                                        }
  -                                }        
  -                        }
  -      else
  -      {
  -        m_pw.println(ev.m_selection.str());
  -      }
  +        if (ev.m_selection.getType() == ev.m_selection.CLASS_NODESET) {
  +            m_pw.println();
  +
  +            org.apache.xml.dtm.DTMIterator nl = ev.m_selection.iter();
  +            
  +            // The following lines are added to fix bug#16222.
  +            // The main cause is that the following loop change the state of 
iterator, which is shared
  +            // with the transformer. The fix is that we record the initial 
state before looping, then 
  +            // restore the state when we finish it, which is done in the 
following lines added.
  +            int currentPos = DTM.NULL;
  +            currentPos = nl.getCurrentPos();
  +            nl.setShouldCacheNodes(true); // This MUST be done before we 
clone the iterator!
  +            org.apache.xml.dtm.DTMIterator clone = null;
  +            // End of block
  +            
  +            try {
  +                clone = nl.cloneWithReset();
  +            } catch (CloneNotSupportedException cnse) {
  +                m_pw.println(
  +                    "     [Can't trace nodelist because it it threw a 
CloneNotSupportedException]");
  +                return;
  +            }
  +            int pos = clone.nextNode();
  +
  +            if (DTM.NULL == pos) {
  +                m_pw.println("     [empty node list]");
  +            } else {
  +                while (DTM.NULL != pos) {
  +                    // m_pw.println("     " + 
ev.m_processor.getXPathContext().getDTM(pos).getNode(pos));
  +                    DTM dtm = ev.m_processor.getXPathContext().getDTM(pos);
  +                    m_pw.print("     ");
  +                    m_pw.print(Integer.toHexString(pos));
  +                    m_pw.print(": ");
  +                    m_pw.println(dtm.getNodeName(pos));
  +                    pos = clone.nextNode();
  +                }
  +            }
  +                     
  +            // Restore the initial state of the iterator, part of fix for 
bug#16222.
  +            nl.runTo(-1);
  +            nl.setCurrentPos(currentPos);
  +             // End of fix for bug#16222
  +                     
  +        } else {
  +            m_pw.println(ev.m_selection.str());
  +        }
       }
  -  }
  -  
  +}
     /**
      * Method that is called after an xsl:apply-templates or xsl:for-each 
      * selection occurs.
  
  
  

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

Reply via email to