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]