sboag 01/06/02 20:09:25
Modified: java/src/org/apache/xpath/axes Tag: DTM_EXP
AttributeIterator.java ChildIterator.java
ChildTestIterator.java DescendantIterator.java
FilterExprWalker.java LocPathIterator.java
MatchPatternIterator.java OneStepIterator.java
OneStepIteratorForward.java PredicatedNodeTest.java
ReverseAxesWalker.java SelfIteratorNoPredicate.java
UnionPathIterator.java WalkerFactory.java
WalkingIterator.java WalkingIteratorSorted.java
Added: java/src/org/apache/xpath/axes Tag: DTM_EXP
IteratorPool.java
Log:
Added self pooling for iterators. Instead of cloning all the time,
the asNodeIterator can return an iterator from the pool. This is
a major performance improvement. For the moment this is just
used from the ElemForEach#traverse method, but it will be extended
to be used universally. Must be applied against the threading tests,
since the pools themselves are kept in the static structure.
Revision Changes Path
No revision
No revision
1.7.2.3 +1 -1
xml-xalan/java/src/org/apache/xpath/axes/AttributeIterator.java
Index: AttributeIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/AttributeIterator.java,v
retrieving revision 1.7.2.2
retrieving revision 1.7.2.3
diff -u -r1.7.2.2 -r1.7.2.3
--- AttributeIterator.java 2001/05/27 02:28:47 1.7.2.2
+++ AttributeIterator.java 2001/06/03 03:09:23 1.7.2.3
@@ -85,7 +85,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public AttributeIterator(Compiler compiler, int opPos, int analysis)
+ AttributeIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
super(compiler, opPos, analysis);
1.6.2.5 +4 -4
xml-xalan/java/src/org/apache/xpath/axes/ChildIterator.java
Index: ChildIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/ChildIterator.java,v
retrieving revision 1.6.2.4
retrieving revision 1.6.2.5
diff -u -r1.6.2.4 -r1.6.2.5
--- ChildIterator.java 2001/05/29 14:31:37 1.6.2.4
+++ ChildIterator.java 2001/06/03 03:09:23 1.6.2.5
@@ -66,6 +66,7 @@
//import org.w3c.dom.Node;
//import org.w3c.dom.DOMException;
import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
/**
* <meta name="usage" content="advanced"/>
@@ -87,7 +88,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public ChildIterator(Compiler compiler, int opPos, int analysis)
+ ChildIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
super(compiler, opPos, analysis, false);
@@ -141,11 +142,10 @@
return DTM.NULL;
int next;
- DTM dtm = m_cdtm;
m_lastFetched = next = (DTM.NULL == m_lastFetched)
- ? dtm.getFirstChild(m_context)
- : dtm.getNextSibling(m_lastFetched);
+ ? m_cdtm.getFirstChild(m_context)
+ : m_cdtm.getNextSibling(m_lastFetched);
// m_lastFetched = next;
if (DTM.NULL != next)
1.8.2.4 +1 -1
xml-xalan/java/src/org/apache/xpath/axes/ChildTestIterator.java
Index: ChildTestIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/ChildTestIterator.java,v
retrieving revision 1.8.2.3
retrieving revision 1.8.2.4
diff -u -r1.8.2.3 -r1.8.2.4
--- ChildTestIterator.java 2001/05/27 02:28:48 1.8.2.3
+++ ChildTestIterator.java 2001/06/03 03:09:23 1.8.2.4
@@ -88,7 +88,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public ChildTestIterator(Compiler compiler, int opPos, int analysis)
+ ChildTestIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
1.8.2.10 +20 -4
xml-xalan/java/src/org/apache/xpath/axes/DescendantIterator.java
Index: DescendantIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/DescendantIterator.java,v
retrieving revision 1.8.2.9
retrieving revision 1.8.2.10
diff -u -r1.8.2.9 -r1.8.2.10
--- DescendantIterator.java 2001/05/29 14:31:37 1.8.2.9
+++ DescendantIterator.java 2001/06/03 03:09:23 1.8.2.10
@@ -87,7 +87,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public DescendantIterator(Compiler compiler, int opPos, int analysis)
+ DescendantIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
@@ -292,9 +292,9 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext)
+ public void setRoot(int context, Object environment)
{
- super.initContext(execContext);
+ super.setRoot(context, environment);
m_traverser = m_cdtm.getAxisTraverser(m_axis);
String localName = getLocalName();
@@ -354,6 +354,22 @@
return traverser.first(current, extendedType);
}
}
+
+ /**
+ * Detaches the iterator from the set which it iterated over, releasing
+ * any computational resources and placing the iterator in the INVALID
+ * state. After<code>detach</code> has been invoked, calls to
+ * <code>nextNode</code> or<code>previousNode</code> will raise the
+ * exception INVALID_STATE_ERR.
+ */
+ public void detach()
+ {
+ m_traverser = null;
+ m_extendedTypeID = 0;
+
+ // Always call the superclass detach last!
+ super.detach();
+ }
/** The traverser to use to navigate over the descendants. */
@@ -362,7 +378,7 @@
/** The axis that we are traversing. */
protected int m_axis;
- /** The extended type ID, not set until initContext. */
+ /** The extended type ID, not set until setRoot. */
protected int m_extendedTypeID;
}
1.14.2.7 +1 -1
xml-xalan/java/src/org/apache/xpath/axes/FilterExprWalker.java
Index: FilterExprWalker.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/FilterExprWalker.java,v
retrieving revision 1.14.2.6
retrieving revision 1.14.2.7
diff -u -r1.14.2.6 -r1.14.2.7
--- FilterExprWalker.java 2001/05/28 04:07:39 1.14.2.6
+++ FilterExprWalker.java 2001/06/03 03:09:23 1.14.2.7
@@ -87,7 +87,7 @@
*
* @param locPathIterator non-null reference to the parent iterator.
*/
- public FilterExprWalker(WalkingIterator locPathIterator)
+ FilterExprWalker(WalkingIterator locPathIterator)
{
super(locPathIterator, Axis.FILTEREDLIST);
}
1.24.2.10 +78 -78
xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java
Index: LocPathIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java,v
retrieving revision 1.24.2.9
retrieving revision 1.24.2.10
diff -u -r1.24.2.9 -r1.24.2.10
--- LocPathIterator.java 2001/05/29 14:31:38 1.24.2.9
+++ LocPathIterator.java 2001/06/03 03:09:23 1.24.2.10
@@ -105,7 +105,7 @@
* @param nscontext The namespace context for this iterator,
* should be OK if null.
*/
- public LocPathIterator(PrefixResolver nscontext)
+ protected LocPathIterator(PrefixResolver nscontext)
{
setLocPathIterator(this);
@@ -125,7 +125,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public LocPathIterator(Compiler compiler, int opPos, int analysis)
+ protected LocPathIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
this(compiler, opPos, analysis, true);
@@ -146,7 +146,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public LocPathIterator(
+ protected LocPathIterator(
Compiler compiler, int opPos, int analysis, boolean
shouldLoadWalkers)
throws javax.xml.transform.TransformerException
{
@@ -221,7 +221,8 @@
// if (null == clone)
LocPathIterator clone = (LocPathIterator) this.clone();
- clone.initContext(xctxt);
+ int current = xctxt.getCurrentNode();
+ clone.setRoot(current, xctxt);
return new XNodeSet(clone);
}
@@ -232,6 +233,31 @@
}
/**
+ * <meta name="usage" content="experimental"/>
+ * Given an select expression and a context, evaluate the XPath
+ * and return the resulting iterator.
+ *
+ * @param xctxt The execution context.
+ * @param contextNode The node that "." expresses.
+ * @param namespaceContext The context in which namespaces in the
+ * XPath are supposed to be expanded.
+ *
+ * @throws TransformerException thrown if the active ProblemListener
decides
+ * the error condition is severe enough to halt processing.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public DTMIterator asIterator(
+ XPathContext xctxt, int contextNode)
+ throws javax.xml.transform.TransformerException
+ {
+ LocPathIterator clone = (LocPathIterator)m_clones.getInstance();
+ clone.setRoot(contextNode, xctxt);
+ return clone;
+ }
+
+
+ /**
* Tell if the expression is a nodeset expression. In other words, tell
* if you can execute [EMAIL PROTECTED] asNode() asNode} without an
exception.
* @return true if the expression can be represented as a nodeset.
@@ -252,21 +278,15 @@
public int asNode(XPathContext xctxt)
throws javax.xml.transform.TransformerException
{
- try
- {
+ LocPathIterator iter = (LocPathIterator)m_clones.getInstance();
- // LocPathIterator clone = (LocPathIterator)
m_pool.getInstanceIfFree();
- // if (null == clone)
- LocPathIterator clone = (LocPathIterator) this.clone();
-
- clone.initContext(xctxt);
-
- return clone.nextNode();
- }
- catch (CloneNotSupportedException ncse)
- {
- throw new javax.xml.transform.TransformerException(ncse);
- }
+ int current = xctxt.getCurrentNode();
+
+ iter.setRoot(current, xctxt);
+
+ int next = iter.nextNode();
+ m_clones.freeInstance(iter);
+ return next;
}
/**
@@ -294,31 +314,6 @@
{
return m_isTopLevel;
}
-
- /**
- * Initialize the context values for this expression
- * after it is cloned.
- *
- * @param execContext The XPath runtime context for this
- * transformation.
- */
- public void initContext(XPathContext execContext)
- {
-
- this.m_context = execContext.getCurrentNode();
- m_cdtm = execContext.getDTM(m_context);
- this.m_currentContextNode = execContext.getCurrentExpressionNode();
- this.m_execContext = execContext;
- this.m_prefixResolver = execContext.getNamespaceContext();
-
- if (m_isTopLevel)
- {
- VariableStack vars = execContext.getVarStack();
-
- this.m_varStackPos = vars.getSearchStartOrTop();
- this.m_varStackContext = vars.getContextPos();
- }
- }
/**
* Initialize the context values for this expression
@@ -327,22 +322,30 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext, int context)
+ public void setRoot(int context, Object environment)
{
- this.m_context = context;
- m_cdtm = execContext.getDTM(m_context);
- this.m_currentContextNode = context;
- this.m_execContext = execContext;
- this.m_prefixResolver = execContext.getNamespaceContext();
+ m_context = context;
+ XPathContext xctxt = (XPathContext)environment;
+ m_execContext = xctxt;
+ m_cdtm = xctxt.getDTM(context);
+ m_currentContextNode = context;
+ m_prefixResolver = xctxt.getNamespaceContext();
+
+// m_lastFetched = DTM.NULL;
+// m_currentContextNode = DTM.NULL;
+// m_foundLast = false;
+// m_last = 0;
+// m_next = 0;
if (m_isTopLevel)
{
- VariableStack vars = execContext.getVarStack();
+ VariableStack vars = xctxt.getVarStack();
this.m_varStackPos = vars.getSearchStartOrTop();
this.m_varStackContext = vars.getContextPos();
}
+ reset();
}
/**
@@ -628,16 +631,13 @@
* exception INVALID_STATE_ERR.
*/
public void detach()
- {
-
- this.m_context = DTM.NULL;
+ {
+ m_cachedNodes = null;
+ m_execContext = null;
+ m_prefixResolver = null;
m_cdtm = null;
- this.m_execContext = null;
- this.m_prefixResolver = null;
- this.m_varStackPos = -1;
- this.m_varStackContext = 0;
-
- // m_pool.freeInstance(this);
+
+ m_clones.freeInstance(this);
}
/**
@@ -778,7 +778,7 @@
* The XPath execution context we are operating on.
*
* @return XPath execution context this iterator is operating on,
- * or null if initContext has not been called.
+ * or null if setRoot has not been called.
*/
public final XPathContext getXPathContext()
{
@@ -816,17 +816,16 @@
m_currentContextNode = n;
}
- /**
- * Set the current context node for this iterator.
- *
- * @param n Must be a non-null reference to the node context.
- */
- public void setRoot(int n)
- {
- m_context = n;
- m_cdtm = m_execContext.getDTM(n);
- }
-
+// /**
+// * Set the current context node for this iterator.
+// *
+// * @param n Must be a non-null reference to the node context.
+// */
+// public void setRoot(int n)
+// {
+// m_context = n;
+// m_cdtm = m_execContext.getDTM(n);
+// }
/**
* Return the saved reference to the prefix resolver that
@@ -924,6 +923,13 @@
//============= State Data =============
/**
+ * The pool for cloned iterators. Iterators need to be cloned
+ * because the hold running state, and thus the original iterator
+ * expression from the stylesheet pool can not be used.
+ */
+ protected IteratorPool m_clones = new IteratorPool(this);
+
+ /**
* The dtm of the context node. Careful about using this... it may not
* be the dtm of the current node.
*/
@@ -954,12 +960,6 @@
/** The index of the last node in the iteration. */
transient private int m_last = 0;
- /* The pool for cloned iterators. Iterators need to be cloned
- * because the hold running state, and thus the original iterator
- * expression from the stylesheet pool can not be used. */
-
- // ObjectPool m_pool = new ObjectPool(this.getClass());
-
/** The last node that was fetched, usually by nextNode. */
transient public int m_lastFetched = DTM.NULL;
@@ -1004,7 +1004,7 @@
* is a cached iterator, and is being used as random access
* NodeList.
*/
- transient protected int m_next = 0;
+ transient protected int m_next;
// /**
// * The analysis pattern built by the WalkerFactory.
1.1.2.4 +5 -7
xml-xalan/java/src/org/apache/xpath/axes/Attic/MatchPatternIterator.java
Index: MatchPatternIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/MatchPatternIterator.java,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -r1.1.2.3 -r1.1.2.4
--- MatchPatternIterator.java 2001/05/27 02:28:49 1.1.2.3
+++ MatchPatternIterator.java 2001/06/03 03:09:23 1.1.2.4
@@ -114,7 +114,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public MatchPatternIterator(Compiler compiler, int opPos, int analysis)
+ MatchPatternIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
@@ -199,9 +199,9 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext)
+ public void setRoot(int context, Object environment)
{
- super.initContext(execContext);
+ super.setRoot(context, environment);
m_traverser = m_cdtm.getAxisTraverser(m_superAxis);
}
@@ -277,7 +277,7 @@
if (DTM.NULL != next)
{
- if(DTMIterator.FILTER_ACCEPT == acceptNode(next))
+ if(DTMIterator.FILTER_ACCEPT == acceptNode(next, m_execContext))
break;
else
continue;
@@ -329,10 +329,8 @@
* @return a constant to determine whether the node is accepted,
* rejected, or skipped, as defined above .
*/
- public short acceptNode(int n)
+ public short acceptNode(int n, XPathContext xctxt)
{
-
- XPathContext xctxt = m_lpi.getXPathContext();
try
{
1.1.2.3 +10 -8
xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIterator.java
Index: OneStepIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIterator.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- OneStepIterator.java 2001/05/28 04:07:39 1.1.2.2
+++ OneStepIterator.java 2001/06/03 03:09:23 1.1.2.3
@@ -36,7 +36,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public OneStepIterator(Compiler compiler, int opPos, int analysis)
+ OneStepIterator(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
super(compiler, opPos, analysis);
@@ -53,9 +53,9 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext)
+ public void setRoot(int context, Object environment)
{
- super.initContext(execContext);
+ super.setRoot(context, environment);
m_iterator = m_cdtm.getAxisIterator(m_axis);
m_iterator.setStartNode(m_context);
}
@@ -127,10 +127,11 @@
try
{
OneStepIterator clone = (OneStepIterator) this.clone();
+
+ int root = getRoot();
+ xctxt.pushCurrentNode(root);
+ clone.setRoot(root, xctxt);
- xctxt.pushCurrentNode(getRoot());
- clone.initContext(xctxt);
-
clone.setPredicateCount(predicateIndex);
// Count 'em all
@@ -191,8 +192,9 @@
{
OneStepIterator clone = (OneStepIterator) this.clone();
- xctxt.pushCurrentNode(getRoot());
- clone.initContext(xctxt);
+ int root = getRoot();
+ xctxt.pushCurrentNode(root);
+ clone.setRoot(root, xctxt);
clone.setPredicateCount(this.getPredicateCount() - 1);
1.1.2.3 +3 -3
xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIteratorForward.java
Index: OneStepIteratorForward.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIteratorForward.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- OneStepIteratorForward.java 2001/05/29 14:31:40 1.1.2.2
+++ OneStepIteratorForward.java 2001/06/03 03:09:23 1.1.2.3
@@ -38,7 +38,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public OneStepIteratorForward(Compiler compiler, int opPos, int analysis)
+ OneStepIteratorForward(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
super(compiler, opPos, analysis);
@@ -57,9 +57,9 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext)
+ public void setRoot(int context, Object environment)
{
- super.initContext(execContext);
+ super.setRoot(context, environment);
m_traverser = m_cdtm.getAxisTraverser(m_axis);
}
1.3.2.5 +2 -2
xml-xalan/java/src/org/apache/xpath/axes/PredicatedNodeTest.java
Index: PredicatedNodeTest.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/PredicatedNodeTest.java,v
retrieving revision 1.3.2.4
retrieving revision 1.3.2.5
diff -u -r1.3.2.4 -r1.3.2.5
--- PredicatedNodeTest.java 2001/05/28 04:07:40 1.3.2.4
+++ PredicatedNodeTest.java 2001/06/03 03:09:23 1.3.2.5
@@ -23,7 +23,7 @@
*
* @param locPathIterator non-null reference to the parent iterator.
*/
- public PredicatedNodeTest(LocPathIterator locPathIterator)
+ PredicatedNodeTest(LocPathIterator locPathIterator)
{
m_lpi = locPathIterator;
}
@@ -32,7 +32,7 @@
* Construct an AxesWalker. The location path iterator will have to be set
* before use.
*/
- public PredicatedNodeTest()
+ PredicatedNodeTest()
{
}
1.6.2.5 +1 -1
xml-xalan/java/src/org/apache/xpath/axes/ReverseAxesWalker.java
Index: ReverseAxesWalker.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/ReverseAxesWalker.java,v
retrieving revision 1.6.2.4
retrieving revision 1.6.2.5
diff -u -r1.6.2.4 -r1.6.2.5
--- ReverseAxesWalker.java 2001/05/28 04:07:40 1.6.2.4
+++ ReverseAxesWalker.java 2001/06/03 03:09:23 1.6.2.5
@@ -83,7 +83,7 @@
*
* @param locPathIterator The location path iterator that 'owns' this
walker.
*/
- public ReverseAxesWalker(LocPathIterator locPathIterator, int axis)
+ ReverseAxesWalker(LocPathIterator locPathIterator, int axis)
{
super(locPathIterator, axis);
}
1.1.2.3 +15 -1
xml-xalan/java/src/org/apache/xpath/axes/Attic/SelfIteratorNoPredicate.java
Index: SelfIteratorNoPredicate.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/SelfIteratorNoPredicate.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- SelfIteratorNoPredicate.java 2001/05/29 14:31:41 1.1.2.2
+++ SelfIteratorNoPredicate.java 2001/06/03 03:09:23 1.1.2.3
@@ -30,7 +30,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public SelfIteratorNoPredicate(Compiler compiler, int opPos, int analysis)
+ SelfIteratorNoPredicate(Compiler compiler, int opPos, int analysis)
throws javax.xml.transform.TransformerException
{
super(compiler, opPos, analysis, false);
@@ -103,5 +103,19 @@
{
return xctxt.getCurrentNode();
}
+
+ /**
+ * Get the index of the last node that can be itterated to.
+ * This probably will need to be overridded by derived classes.
+ *
+ * @param xctxt XPath runtime context.
+ *
+ * @return the index of the last node that can be itterated to.
+ */
+ public int getLastPos(XPathContext xctxt)
+ {
+ return 1;
+ }
+
}
1.15.2.8 +14 -14
xml-xalan/java/src/org/apache/xpath/axes/UnionPathIterator.java
Index: UnionPathIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/UnionPathIterator.java,v
retrieving revision 1.15.2.7
retrieving revision 1.15.2.8
diff -u -r1.15.2.7 -r1.15.2.8
--- UnionPathIterator.java 2001/05/27 02:28:50 1.15.2.7
+++ UnionPathIterator.java 2001/06/03 03:09:23 1.15.2.8
@@ -67,6 +67,7 @@
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.dtm.DTMFilter;
import org.apache.xml.dtm.DTMManager;
+import org.apache.xml.dtm.DTMIterator;
// Xalan Imports
import org.apache.xpath.NodeSet;
@@ -110,20 +111,19 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext)
+ public void setRoot(int context, Object environment)
{
+ this.m_execContext = (XPathContext)environment;
+ this.m_currentContextNode = context;
+ this.m_context = context;
- this.m_execContext = execContext;
- this.m_currentContextNode = execContext.getCurrentExpressionNode();
- this.m_context = execContext.getCurrentNode();
-
if (null != m_iterators)
{
int n = m_iterators.length;
for (int i = 0; i < n; i++)
{
- m_iterators[i].initContext(execContext);
+ m_iterators[i].setRoot(context, environment);
m_iterators[i].nextNode();
}
}
@@ -179,7 +179,8 @@
if (null == clone)
clone = (UnionPathIterator) this.clone();
- clone.initContext(xctxt);
+ int current = xctxt.getCurrentNode();
+ clone.setRoot(current, xctxt);
return new XNodeSet(clone);
}
@@ -352,7 +353,7 @@
}
else
{
- LocPathIterator[] iters = m_iterators;
+ DTMIterator[] iters = m_iterators;
int len = m_iterators.length;
m_iterators = new LocPathIterator[len + 1];
@@ -471,7 +472,7 @@
{
loadLocationPaths(compiler, compiler.getNextOpPos(opPos), count + 1);
- m_iterators[count] = createLocPathIterator(compiler, opPos);
+ m_iterators[count] = createDTMIterator(compiler, opPos);
}
else
{
@@ -515,12 +516,11 @@
*
* @throws javax.xml.transform.TransformerException
*/
- protected LocPathIterator createLocPathIterator(
+ protected DTMIterator createDTMIterator(
Compiler compiler, int opPos) throws
javax.xml.transform.TransformerException
{
- LocPathIterator lpi = WalkerFactory.newLocPathIterator(compiler, opPos);
- if(compiler.getLocationPathDepth() <= 0)
- lpi.setIsTopLevel(true);
+ DTMIterator lpi = WalkerFactory.newDTMIterator(compiler, opPos,
+ (compiler.getLocationPathDepth() <=
0));
return lpi;
}
@@ -808,7 +808,7 @@
* path</a> contained in the union expression.
* @serial
*/
- protected LocPathIterator[] m_iterators;
+ protected DTMIterator[] m_iterators;
/**
* The last index in the list.
1.13.2.8 +18 -11
xml-xalan/java/src/org/apache/xpath/axes/WalkerFactory.java
Index: WalkerFactory.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/WalkerFactory.java,v
retrieving revision 1.13.2.7
retrieving revision 1.13.2.8
diff -u -r1.13.2.7 -r1.13.2.8
--- WalkerFactory.java 2001/05/30 20:31:18 1.13.2.7
+++ WalkerFactory.java 2001/06/03 03:09:23 1.13.2.8
@@ -67,6 +67,7 @@
import org.apache.xpath.objects.XNumber;
import org.apache.xml.dtm.DTMFilter;
+import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.dtm.Axis;
/**
@@ -193,14 +194,16 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public static LocPathIterator newLocPathIterator(
- Compiler compiler, int opPos)
+ public static DTMIterator newDTMIterator(
+ Compiler compiler, int opPos,
+ boolean isTopLevel)
throws javax.xml.transform.TransformerException
{
int firstStepPos = compiler.getFirstChildPos(opPos);
int analysis = analyze(compiler, firstStepPos, 0);
boolean isOneStep = isOneStep(analysis);
+ DTMIterator iter;
// Is the iteration a one-step attribute pattern (i.e. select="@foo")?
if (isOneStep && walksSelfOnly(analysis) &&
@@ -211,7 +214,7 @@
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
- return new SelfIteratorNoPredicate(compiler, opPos, analysis);
+ iter = new SelfIteratorNoPredicate(compiler, opPos, analysis);
}
// Is the iteration exactly one child step?
else if (walksChildrenOnly(analysis) && isOneStep)
@@ -224,7 +227,7 @@
diagnoseIterator("ChildIterator", analysis, compiler);
// Use simple child iteration without any test.
- return new ChildIterator(compiler, opPos, analysis);
+ iter = new ChildIterator(compiler, opPos, analysis);
}
else
{
@@ -232,7 +235,7 @@
diagnoseIterator("ChildTestIterator", analysis, compiler);
// Else use simple node test iteration with predicate test.
- return new ChildTestIterator(compiler, opPos, analysis);
+ iter = new ChildTestIterator(compiler, opPos, analysis);
}
}
// Is the iteration a one-step attribute pattern (i.e. select="@foo")?
@@ -243,7 +246,7 @@
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
- return new AttributeIterator(compiler, opPos, analysis);
+ iter = new AttributeIterator(compiler, opPos, analysis);
}
else if(isOneStep && !walksFilteredList(analysis))
{
@@ -255,7 +258,7 @@
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
- return new OneStepIteratorForward(compiler, opPos, analysis);
+ iter = new OneStepIteratorForward(compiler, opPos, analysis);
}
else
{
@@ -264,7 +267,7 @@
// Then use a simple iteration of the attributes, with node test
// and predicate testing.
- return new OneStepIterator(compiler, opPos, analysis);
+ iter = new OneStepIterator(compiler, opPos, analysis);
}
}
@@ -288,7 +291,7 @@
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("DescendantIterator", analysis, compiler);
- return new DescendantIterator(compiler, opPos, analysis);
+ iter = new DescendantIterator(compiler, opPos, analysis);
}
else
{
@@ -302,7 +305,7 @@
if (DEBUG_ITERATOR_CREATION)
diagnoseIterator("WalkingIteratorSorted", analysis, compiler);
- return new WalkingIteratorSorted(compiler, opPos, analysis, true);
+ iter = new WalkingIteratorSorted(compiler, opPos, analysis, true);
}
@@ -313,9 +316,13 @@
diagnoseIterator("WalkingIterator", analysis, compiler);
}
- return new WalkingIterator(compiler, opPos, analysis, true);
+ iter = new WalkingIterator(compiler, opPos, analysis, true);
}
}
+ if(iter instanceof LocPathIterator)
+ ((LocPathIterator)iter).setIsTopLevel(isTopLevel);
+
+ return iter;
}
/**
1.1.2.3 +25 -3
xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIterator.java
Index: WalkingIterator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIterator.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- WalkingIterator.java 2001/05/30 20:31:19 1.1.2.2
+++ WalkingIterator.java 2001/06/03 03:09:23 1.1.2.3
@@ -44,7 +44,7 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public WalkingIterator(
+ WalkingIterator(
Compiler compiler, int opPos, int analysis, boolean
shouldLoadWalkers)
throws javax.xml.transform.TransformerException
{
@@ -65,7 +65,7 @@
* @param nscontext The namespace context for this iterator,
* should be OK if null.
*/
- public WalkingIterator(PrefixResolver nscontext)
+ protected WalkingIterator(PrefixResolver nscontext)
{
super(nscontext);
@@ -109,6 +109,13 @@
m_firstWalker.setRoot(m_context);
}
+ if (null != m_firstWalker)
+ {
+ m_lastUsedWalker = m_firstWalker;
+
+ m_firstWalker.setRoot(m_context);
+ }
+
}
/**
@@ -147,7 +154,7 @@
// expression need to reset the variable stack, while iterators
// in predicates do not need to, and should not, since their execution
// may be much later than top-level iterators.
- // m_varStackPos is set in initContext, which is called
+ // m_varStackPos is set in setRoot, which is called
// from the execute method.
if (-1 == m_varStackPos)
{
@@ -221,6 +228,21 @@
public final AxesWalker getLastUsedWalker()
{
return m_lastUsedWalker;
+ }
+
+ /**
+ * Detaches the iterator from the set which it iterated over, releasing
+ * any computational resources and placing the iterator in the INVALID
+ * state. After<code>detach</code> has been invoked, calls to
+ * <code>nextNode</code> or<code>previousNode</code> will raise the
+ * exception INVALID_STATE_ERR.
+ */
+ public void detach()
+ {
+ m_lastUsedWalker = null;
+
+ // Always call the superclass detach last!
+ super.detach();
}
1.1.2.2 +30 -12
xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIteratorSorted.java
Index: WalkingIteratorSorted.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIteratorSorted.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- WalkingIteratorSorted.java 2001/05/30 20:31:20 1.1.2.1
+++ WalkingIteratorSorted.java 2001/06/03 03:09:23 1.1.2.2
@@ -18,7 +18,6 @@
{
super(nscontext);
- this.setShouldCacheNodes(true);
}
/**
@@ -49,17 +48,24 @@
* @param execContext The XPath runtime context for this
* transformation.
*/
- public void initContext(XPathContext execContext)
+ public void setRoot(int context, Object environment)
{
- super.initContext(execContext);
+ super.setRoot(context, environment);
+ this.setShouldCacheNodes(true);
+
setNextPosition(0);
- m_firstWalker.setRoot(m_context);
+ m_firstWalker.setRoot(context);
m_lastUsedWalker = m_firstWalker;
int nextNode = DTM.NULL;
AxesWalker walker = getLastUsedWalker();
+ XPathContext execContext = (XPathContext)environment;
+ execContext.pushCurrentNodeAndExpression(context, context);
+
+ try
+ {
do
{
@@ -111,14 +117,13 @@
walker = getLastUsedWalker();
}
}
-
- // Not sure what is going on here, but we were loosing
- // the next node in the nodeset because it's coming from a
- // different document.
- while (
- (DTM.NULL != nextNode) /* && (DTM.NULL != m_prevReturned) */
- /* && getDTM(nextNode).getDocument() ==
getDTM(m_prevReturned).getDocument() */
- /* && getDTM(nextNode).isNodeAfter(nextNode, m_prevReturned) */);
+ while (DTM.NULL != nextNode);
+
+ }
+ finally
+ {
+ execContext.popCurrentNodeAndExpression();
+ }
// m_prevReturned = nextNode;
setNextPosition(0);
@@ -127,6 +132,11 @@
m_foundLast = true;
}
+ public int nextNode()
+ {
+ return super.nextNode();
+ }
+
/**
* Reset the iterator.
*/
@@ -138,6 +148,14 @@
m_lastFetched = DTM.NULL;
m_next = 0;
// m_last = 0;
+
+ if (null != m_firstWalker)
+ {
+ m_lastUsedWalker = m_firstWalker;
+
+ m_firstWalker.setRoot(m_context);
+ }
+
}
No revision
No revision
1.1.2.1 +76 -0
xml-xalan/java/src/org/apache/xpath/axes/Attic/IteratorPool.java
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]