sboag 00/11/08 09:15:46
Modified: java/src/org/apache/xalan/processor ProcessorLRE.java
StylesheetHandler.java
java/src/org/apache/xalan/utils SAXSourceLocator.java
java/src/org/apache/xpath Expression.java VariableStack.java
java/src/org/apache/xpath/axes FilterExprWalker.java
LocPathIterator.java
java/src/org/apache/xpath/compiler Compiler.java
Log:
Fixes for variable resolution.
Revision Changes Path
1.11 +11 -1
xml-xalan/java/src/org/apache/xalan/processor/ProcessorLRE.java
Index: ProcessorLRE.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/processor/ProcessorLRE.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ProcessorLRE.java 2000/11/03 23:28:03 1.10
+++ ProcessorLRE.java 2000/11/08 17:13:59 1.11
@@ -67,6 +67,7 @@
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
import org.xml.sax.helpers.AttributesImpl;
import javax.xml.transform.TransformerConfigurationException;
@@ -127,7 +128,16 @@
// stylesheet.setDOMBackPointer(handler.getOriginatingNode());
// ***** Note that we're assigning an empty locator. Is this
necessary?
- stylesheet.setLocaterInfo(new SAXSourceLocator());
+ SAXSourceLocator slocator = new SAXSourceLocator();
+ Locator locator = handler.getLocator();
+ if(null != locator)
+ {
+ slocator.setLineNumber(locator.getLineNumber());
+ slocator.setColumnNumber(locator.getColumnNumber());
+ slocator.setPublicId(locator.getPublicId());
+ slocator.setSystemId(locator.getSystemId());
+ }
+ stylesheet.setLocaterInfo(slocator);
stylesheet.setPrefixes(handler.getNamespaceSupport());
handler.pushStylesheet(stylesheet);
1.16 +2 -1
xml-xalan/java/src/org/apache/xalan/processor/StylesheetHandler.java
Index: StylesheetHandler.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/processor/StylesheetHandler.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- StylesheetHandler.java 2000/11/03 23:28:03 1.15
+++ StylesheetHandler.java 2000/11/08 17:14:07 1.16
@@ -1254,7 +1254,8 @@
SAXSourceLocator locator = new SAXSourceLocator();
locator.setSystemId(this.getStylesheetProcessor().getDOMsystemID());
- m_stylesheetLocatorStack.push(locator);
+ return locator;
+ // m_stylesheetLocatorStack.push(locator);
}
return ((SAXSourceLocator) m_stylesheetLocatorStack.peek());
1.2 +77 -1
xml-xalan/java/src/org/apache/xalan/utils/SAXSourceLocator.java
Index: SAXSourceLocator.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/utils/SAXSourceLocator.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SAXSourceLocator.java 2000/11/03 23:28:13 1.1
+++ SAXSourceLocator.java 2000/11/08 17:14:30 1.2
@@ -71,6 +71,7 @@
public class SAXSourceLocator extends LocatorImpl
implements SourceLocator, Serializable
{
+ Locator m_locator;
/**
* Constructor SAXSourceLocator
@@ -86,10 +87,85 @@
*/
public SAXSourceLocator(Locator locator)
{
-
+ m_locator = locator;
this.setColumnNumber(locator.getColumnNumber());
this.setLineNumber(locator.getLineNumber());
this.setPublicId(locator.getPublicId());
this.setSystemId(locator.getSystemId());
+ }
+
+ /**
+ * Return the public identifier for the current document event.
+ *
+ * <p>The return value is the public identifier of the document
+ * entity or of the external parsed entity in which the markup
+ * triggering the event appears.</p>
+ *
+ * @return A string containing the public identifier, or
+ * null if none is available.
+ * @see #getSystemId
+ */
+ public String getPublicId()
+ {
+ return (null == m_locator) ? super.getPublicId() :
m_locator.getPublicId();
+ }
+
+ /**
+ * Return the system identifier for the current document event.
+ *
+ * <p>The return value is the system identifier of the document
+ * entity or of the external parsed entity in which the markup
+ * triggering the event appears.</p>
+ *
+ * <p>If the system identifier is a URL, the parser must resolve it
+ * fully before passing it to the application.</p>
+ *
+ * @return A string containing the system identifier, or null
+ * if none is available.
+ * @see #getPublicId
+ */
+ public String getSystemId()
+ {
+ return (null == m_locator) ? super.getSystemId() :
m_locator.getSystemId();
+ }
+
+ /**
+ * Return the line number where the current document event ends.
+ *
+ * <p><strong>Warning:</strong> The return value from the method
+ * is intended only as an approximation for the sake of error
+ * reporting; it is not intended to provide sufficient information
+ * to edit the character content of the original XML document.</p>
+ *
+ * <p>The return value is an approximation of the line number
+ * in the document entity or external parsed entity where the
+ * markup triggering the event appears.</p>
+ *
+ * @return The line number, or -1 if none is available.
+ * @see #getColumnNumber
+ */
+ public int getLineNumber()
+ {
+ return (null == m_locator) ? super.getLineNumber() :
m_locator.getLineNumber();
+ }
+
+ /**
+ * Return the column number where the current document event ends.
+ *
+ * <p><strong>Warning:</strong> The return value from the method
+ * is intended only as an approximation for the sake of error
+ * reporting; it is not intended to provide sufficient information
+ * to edit the character content of the original XML document.</p>
+ *
+ * <p>The return value is an approximation of the column number
+ * in the document entity or external parsed entity where the
+ * markup triggering the event appears.</p>
+ *
+ * @return The column number, or -1 if none is available.
+ * @see #getLineNumber
+ */
+ public int getColumnNumber()
+ {
+ return (null == m_locator) ? super.getColumnNumber() :
m_locator.getColumnNumber();
}
}
1.8 +11 -6 xml-xalan/java/src/org/apache/xpath/Expression.java
Index: Expression.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/Expression.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Expression.java 2000/11/06 19:27:32 1.7
+++ Expression.java 2000/11/08 17:14:48 1.8
@@ -79,7 +79,12 @@
{
/** NEEDSDOC Field m_xpath */
- protected XPath m_xpath;
+ protected SourceLocator m_slocator;
+
+ public void setSourceLocator(SourceLocator locator)
+ {
+ m_slocator = locator;
+ }
/**
* NEEDSDOC Method execute
@@ -120,9 +125,9 @@
else
{
// Where to send diagnostics in this case?
- if(null != m_xpath)
+ if(null != m_slocator)
{
- SourceLocator slocator = m_xpath.getLocator();
+ SourceLocator slocator = m_slocator;
System.out.println(fmsg + "; file " + slocator.getSystemId()
+ "; line " + slocator.getLineNumber() + ";
column "
+ slocator.getColumnNumber());
@@ -178,14 +183,14 @@
ErrorHandler eh = reader.getErrorHandler();
SAXParseException te = new SAXParseException(fmsg,
-
(SAXSourceLocator)m_xpath.getLocator());
+
(SAXSourceLocator)m_slocator);
eh.fatalError(te);
}
else
{
- if(null != m_xpath)
+ if(null != m_slocator)
{
- SourceLocator slocator = m_xpath.getLocator();
+ SourceLocator slocator = m_slocator;
System.out.println(fmsg + "; file " + slocator.getSystemId()
+ "; line " + slocator.getLineNumber() + ";
column "
+ slocator.getColumnNumber());
1.8 +9 -1 xml-xalan/java/src/org/apache/xpath/VariableStack.java
Index: VariableStack.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/VariableStack.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- VariableStack.java 2000/11/06 20:55:46 1.7
+++ VariableStack.java 2000/11/08 17:14:52 1.8
@@ -121,9 +121,17 @@
/**
* NEEDSDOC
*/
- public int getSearchStart()
+ public int getSearchStartOrTop()
{
return (-1 == m_searchStart) ? this.size() : m_searchStart;
+ }
+
+ /**
+ * NEEDSDOC
+ */
+ public int getSearchStart()
+ {
+ return m_searchStart;
}
/**
1.6 +2 -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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- FilterExprWalker.java 2000/10/30 18:58:49 1.5
+++ FilterExprWalker.java 2000/11/08 17:15:13 1.6
@@ -139,9 +139,10 @@
// System.out.println("calling
m_expr.execute(m_lpi.getXPathContext())");
XObject obj = m_expr.execute(m_lpi.getXPathContext());
-
+
// System.out.println("Back from
m_expr.execute(m_lpi.getXPathContext()): "+obj);
m_nodeSet = (null != obj) ? obj.nodeset() : null;
+
m_peek = null;
}
catch (org.xml.sax.SAXException se)
1.10 +57 -21
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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- LocPathIterator.java 2000/11/06 20:57:20 1.9
+++ LocPathIterator.java 2000/11/08 17:15:18 1.10
@@ -222,11 +222,26 @@
}
/** NEEDSDOC Method initContext **/
- private int m_varStackPos;
+ int m_varStackPos = -1;
/** NEEDSDOC Method initContext **/
- private int m_varStackContext;
-
+ int m_varStackContext;
+
+ /**
+ * Value determined at compile time.
+ */
+ private boolean m_isTopLevel = false;
+
+ /**
+ * <meta name="usage" content="internal"/>
+ * Set if this is an iterator at the upper level of
+ * the XPath.
+ */
+ public void setIsTopLevel(boolean b)
+ {
+ m_isTopLevel = b;
+ }
+
/**
* NEEDSDOC Method initContext
*
@@ -241,9 +256,12 @@
this.m_execContext = execContext;
this.m_prefixResolver = execContext.getNamespaceContext();
this.m_dhelper = execContext.getDOMHelper();
- VariableStack vars = execContext.getVarStack();
- this.m_varStackPos = vars.getSearchStart();
- this.m_varStackContext = vars.getContextPos();
+ if(m_isTopLevel)
+ {
+ VariableStack vars = execContext.getVarStack();
+ this.m_varStackPos = vars.getSearchStartOrTop();
+ this.m_varStackContext = vars.getContextPos();
+ }
}
/**
@@ -477,6 +495,8 @@
this.m_execContext = null;
this.m_prefixResolver = null;
this.m_dhelper = null;
+ this.m_varStackPos = -1;
+ this.m_varStackContext = 0;
m_pool.freeInstance(this);
}
@@ -509,6 +529,8 @@
{
LocPathIterator clone = (LocPathIterator) super.clone();
+ clone.m_varStackPos = this.m_varStackPos;
+ clone.m_varStackContext = this.m_varStackContext;
if (null != m_firstWalker)
{
@@ -588,26 +610,40 @@
return next;
}
-
- VariableStack vars = m_execContext.getVarStack();
- int savedStart = vars.getSearchStart();
- vars.setSearchStart(m_varStackPos);
- vars.pushContextPosition(m_varStackContext);
- if (null == m_firstWalker.getRoot())
+ if(-1 == m_varStackPos)
{
- this.setNextPosition(0);
- m_firstWalker.setRoot(m_context);
+ if (null == m_firstWalker.getRoot())
+ {
+ this.setNextPosition(0);
+ m_firstWalker.setRoot(m_context);
- m_lastUsedWalker = m_firstWalker;
+ m_lastUsedWalker = m_firstWalker;
+ }
+ return returnNextNode(m_firstWalker.nextNode());
}
-
- Node n = returnNextNode(m_firstWalker.nextNode());
-
- vars.setSearchStart(savedStart);
- vars.popContextPosition();
+ else
+ {
+ VariableStack vars = m_execContext.getVarStack();
+ int savedStart = vars.getSearchStart();
+ vars.setSearchStart(m_varStackPos);
+ vars.pushContextPosition(m_varStackContext);
+
+ if (null == m_firstWalker.getRoot())
+ {
+ this.setNextPosition(0);
+ m_firstWalker.setRoot(m_context);
+
+ m_lastUsedWalker = m_firstWalker;
+ }
- return n;
+ Node n = returnNextNode(m_firstWalker.nextNode());
+
+ vars.setSearchStart(savedStart);
+ vars.popContextPosition();
+
+ return n;
+ }
}
/**
1.11 +52 -34
xml-xalan/java/src/org/apache/xpath/compiler/Compiler.java
Index: Compiler.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xpath/compiler/Compiler.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Compiler.java 2000/11/03 23:28:16 1.10
+++ Compiler.java 2000/11/08 17:15:36 1.11
@@ -114,7 +114,15 @@
public Compiler(ErrorHandler errorHandler, SourceLocator locator)
{
m_errorHandler = errorHandler;
- m_locator = locator;
+ if(null != locator)
+ {
+ SAXSourceLocator ssl = new SAXSourceLocator();
+ ssl.setColumnNumber(locator.getColumnNumber());
+ ssl.setLineNumber(locator.getLineNumber());
+ ssl.setPublicId(locator.getPublicId());
+ ssl.setSystemId(locator.getSystemId());
+ m_locator = ssl;
+ }
}
/**
@@ -144,77 +152,80 @@
int op = m_opMap[opPos];
+ Expression expr = null;
// System.out.println(getPatternString()+"op: "+op);
switch (op)
{
case OpCodes.OP_XPATH :
- return compile(opPos + 2);
+ expr = compile(opPos + 2); break;
case OpCodes.OP_OR :
- return or(opPos);
+ expr = or(opPos); break;
case OpCodes.OP_AND :
- return and(opPos);
+ expr = and(opPos); break;
case OpCodes.OP_NOTEQUALS :
- return notequals(opPos);
+ expr = notequals(opPos); break;
case OpCodes.OP_EQUALS :
- return equals(opPos);
+ expr = equals(opPos); break;
case OpCodes.OP_LTE :
- return lte(opPos);
+ expr = lte(opPos); break;
case OpCodes.OP_LT :
- return lt(opPos);
+ expr = lt(opPos); break;
case OpCodes.OP_GTE :
- return gte(opPos);
+ expr = gte(opPos); break;
case OpCodes.OP_GT :
- return gt(opPos);
+ expr = gt(opPos); break;
case OpCodes.OP_PLUS :
- return plus(opPos);
+ expr = plus(opPos); break;
case OpCodes.OP_MINUS :
- return minus(opPos);
+ expr = minus(opPos); break;
case OpCodes.OP_MULT :
- return mult(opPos);
+ expr = mult(opPos); break;
case OpCodes.OP_DIV :
- return div(opPos);
+ expr = div(opPos); break;
case OpCodes.OP_MOD :
- return mod(opPos);
+ expr = mod(opPos); break;
case OpCodes.OP_QUO :
- return quo(opPos);
+ expr = quo(opPos); break;
case OpCodes.OP_NEG :
- return neg(opPos);
+ expr = neg(opPos); break;
case OpCodes.OP_STRING :
- return string(opPos);
+ expr = string(opPos); break;
case OpCodes.OP_BOOL :
- return bool(opPos);
+ expr = bool(opPos); break;
case OpCodes.OP_NUMBER :
- return number(opPos);
+ expr = number(opPos); break;
case OpCodes.OP_UNION :
- return union(opPos);
+ expr = union(opPos); break;
case OpCodes.OP_LITERAL :
- return literal(opPos);
+ expr = literal(opPos); break;
case OpCodes.OP_VARIABLE :
- return variable(opPos);
+ expr = variable(opPos); break;
case OpCodes.OP_GROUP :
- return group(opPos);
+ expr = group(opPos); break;
case OpCodes.OP_NUMBERLIT :
- return numberlit(opPos);
+ expr = numberlit(opPos); break;
case OpCodes.OP_ARGUMENT :
- return arg(opPos);
+ expr = arg(opPos); break;
case OpCodes.OP_EXTFUNCTION :
- return compileExtension(opPos);
+ expr = compileExtension(opPos); break;
case OpCodes.OP_FUNCTION :
- return compileFunction(opPos);
+ expr = compileFunction(opPos); break;
case OpCodes.OP_LOCATIONPATH :
- return locationPath(opPos);
+ expr = locationPath(opPos); break;
case OpCodes.OP_PREDICATE :
- return null; // should never hit this here.
+ expr = null; break; // should never hit this here.
case OpCodes.OP_MATCHPATTERN :
- return matchPattern(opPos + 2);
+ expr = matchPattern(opPos + 2); break;
case OpCodes.OP_LOCATIONPATHPATTERN :
- return locationPathPattern(opPos);
+ expr = locationPathPattern(opPos); break;
default :
error(XPATHErrorResources.ER_UNKNOWN_OPCODE,
new Object[]{ Integer.toString(m_opMap[opPos]) }); //"ERROR!
Unknown op code: "+m_opMap[opPos]);
}
+ if(null != expr)
+ expr.setSourceLocator(m_locator);
- return null;
+ return expr;
}
/**
@@ -639,6 +650,8 @@
{
return new UnionPathIterator(this, opPos);
}
+
+ private int locPathDepth = -1;
/**
* <meta name="usage" content="advanced"/>
@@ -655,7 +668,12 @@
*/
public Expression locationPath(int opPos) throws org.xml.sax.SAXException
{
- return WalkerFactory.newLocPathIterator(this, opPos);
+ locPathDepth++;
+ LocPathIterator iter = WalkerFactory.newLocPathIterator(this, opPos);
+ if(locPathDepth == 0)
+ iter.setIsTopLevel(true);
+ locPathDepth--;
+ return iter;
}
/**