Xalan3 specific additions and updates
git-svn-id: https://svn.apache.org/repos/asf/xalan/java/branches/xalan3@336638 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/xpath/CachedXPathAPI.java b/src/org/apache/xpath/CachedXPathAPI.java
index 7946f50..f477ca5 100644
--- a/src/org/apache/xpath/CachedXPathAPI.java
+++ b/src/org/apache/xpath/CachedXPathAPI.java
@@ -65,7 +65,6 @@
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPath;
-import org.apache.xpath.compiler.XPathParser;
import org.apache.xpath.XPathContext;
import org.apache.xml.utils.PrefixResolverDefault;
import org.apache.xml.utils.PrefixResolver;
@@ -319,7 +318,7 @@
? ((Document) namespaceNode).getDocumentElement() : namespaceNode);
// Create the XPath object.
- XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null);
+ XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null, 1.0);
// Execute the XPath, and have it return the result
// return xpath.execute(xpathSupport, contextNode, prefixResolver);
@@ -361,7 +360,7 @@
// because XPathContext is weak in a number of areas... perhaps
// XPathContext should be done away with.)
// Create the XPath object.
- XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null);
+ XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null, 1.0);
// Execute the XPath, and have it return the result
XPathContext xpathSupport = new XPathContext();
diff --git a/src/org/apache/xpath/Expression.java b/src/org/apache/xpath/Expression.java
index 778a3ce..7383881 100644
--- a/src/org/apache/xpath/Expression.java
+++ b/src/org/apache/xpath/Expression.java
@@ -57,25 +57,21 @@
package org.apache.xpath;
//import org.w3c.dom.Node;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNodeSet;
-import org.apache.xpath.res.XPATHErrorResources;
-import org.apache.xalan.res.XSLMessages;
+import java.io.Serializable;
+import java.util.Vector;
-import org.xml.sax.XMLReader;
-import org.xml.sax.ContentHandler;
-
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-
-import org.apache.xml.utils.SAXSourceLocator;
-import org.apache.xml.utils.PrefixResolver;
-import org.apache.xml.utils.XMLString;
-import org.apache.xml.dtm.DTMIterator;
-import org.apache.xml.dtm.DTM;
-
-import javax.xml.transform.SourceLocator;
import javax.xml.transform.ErrorListener;
+import javax.xml.transform.TransformerException;
+import org.apache.xalan.res.XSLMessages;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.utils.XMLString;
+import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.SimpleNode;
+import org.apache.xpath.res.XPATHErrorResources;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
/**
* This abstract class serves as the base for all expression objects. An
@@ -86,8 +82,15 @@
* and walkers, which must be cloned in order to be used -- the original must
* still be immutable.
*/
-public abstract class Expression implements java.io.Serializable, ExpressionNode, XPathVisitable
+public abstract class Expression extends SimpleNode
+ implements java.io.Serializable, ExpressionNode, XPathVisitable
{
+
+ public Expression()
+ {
+ super();
+ }
+
/**
* The location where this expression was built from. Need for diagnostic
@@ -291,7 +294,8 @@
try
{
- xctxt.pushCurrentNodeAndExpression(contextNode, contextNode);
+ xctxt.pushCurrentNode(contextNode);
+ xctxt.pushCurrentExpressionNode(contextNode);
return execute(xctxt).iter();
}
@@ -322,7 +326,8 @@
try
{
- xctxt.pushCurrentNodeAndExpression(contextNode, contextNode);
+ xctxt.pushCurrentNode(contextNode);
+ xctxt.pushCurrentExpressionNode(contextNode);
XNodeSet nodeset = (XNodeSet)execute(xctxt);
return nodeset.iterRaw();
@@ -374,17 +379,10 @@
}
/**
- * This function is used to fixup variables from QNames to stack frame
- * indexes at stylesheet build time.
- * @param vars List of QNames that correspond to variables. This list
- * should be searched backwards for the first qualified name that
- * corresponds to the variable reference qname. The position of the
- * QName in the vector from the start of the vector will be its position
- * in the stack frame (but variables above the globalsTop value will need
- * to be offset to the current stack frame).
- * NEEDSDOC @param globalsSize
+ * Fix up variables from QNames to stack frame
+ * @param vcs Interface to variable stack composition interface.
*/
- public abstract void fixupVariables(java.util.Vector vars, int globalsSize);
+ public abstract void fixupVariables(VariableComposeState vcs);
/**
* Compare this object with another object and see
@@ -464,7 +462,9 @@
XPATHErrorResources.ER_INCORRECT_PROGRAMMER_ASSERTION,
new Object[]{ msg });
- throw new RuntimeException(fMsg);
+ RuntimeException a = new RuntimeException(fMsg);
+ a.printStackTrace();
+ throw a;
}
}
@@ -531,6 +531,7 @@
public void exprAddChild(ExpressionNode n, int i)
{
assertion(false, "exprAddChild method not implemented!");
+
}
/** This method returns a child node. The children are numbered
@@ -630,4 +631,17 @@
return 0;
return m_parent.getColumnNumber();
}
+
+ /**
+ * Clone this object, but make certian it is deep. This is useful
+ * for derived classes that may want the default clone to be
+ * light weight, but then want to deep clone in some special cases.
+ * @see java.lang.Object#clone()
+ */
+ public Object cloneDeep() throws CloneNotSupportedException
+ {
+ XNodeSet xns = (XNodeSet)clone();
+ return xns;
+ }
+
}
diff --git a/src/org/apache/xpath/ExpressionOwner.java b/src/org/apache/xpath/ExpressionOwner.java
index 2b4322a..87b9df3 100644
--- a/src/org/apache/xpath/ExpressionOwner.java
+++ b/src/org/apache/xpath/ExpressionOwner.java
@@ -19,7 +19,6 @@
* @param exp the raw Expression object, which should not normally be null.
*/
public void setExpression(Expression exp);
-
-
+
}
diff --git a/src/org/apache/xpath/NodeSet.java b/src/org/apache/xpath/NodeSet.java
index 1747e1e..ddfdc1a 100644
--- a/src/org/apache/xpath/NodeSet.java
+++ b/src/org/apache/xpath/NodeSet.java
@@ -307,7 +307,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_ITERATE, null)); //"This NodeSet can not iterate to a previous node!");
+ "This NodeSet can not iterate to a previous node!");
if ((m_next - 1) > 0)
{
@@ -362,7 +362,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_INDEX, null)); //"This NodeSet can not do indexing or counting functions!");
+ "This NodeSet can not do indexing or counting functions!");
if ((index >= 0) && (m_next < m_firstFree))
m_next = index;
@@ -785,7 +785,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_INDEX, null)); //"This NodeSet can not do indexing or counting functions!");
+ "This NodeSet can not do indexing or counting functions!");
m_next = i;
}
@@ -802,7 +802,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESET_CANNOT_INDEX, null)); //"This NodeSet can not do indexing or counting functions!");
+ "This NodeSet can not do indexing or counting functions!");
int saved = m_next;
Node n = (m_next < m_firstFree) ? elementAt(m_next) : null;
@@ -839,12 +839,12 @@
* request caching after we've already begun stepping through the
* nodes in this set.
*/
- public void setShouldCacheNodes(boolean b)
+ public void setShouldCache(boolean b)
{
if (!isFresh())
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_CALL_SETSHOULDCACHENODE, null)); //"Can not call setShouldCacheNodes after nextNode has been called!");
+ "Can not call setShouldCacheNodes after nextNode has been called!");
m_cacheNodes = b;
m_mutable = true;
diff --git a/src/org/apache/xpath/NodeSetDTM.java b/src/org/apache/xpath/NodeSetDTM.java
index 8d74775..7e25e52 100644
--- a/src/org/apache/xpath/NodeSetDTM.java
+++ b/src/org/apache/xpath/NodeSetDTM.java
@@ -455,7 +455,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESETDTM_CANNOT_ITERATE, null)); //"This NodeSetDTM can not iterate to a previous node!");
+ "This NodeSetDTM can not iterate to a previous node!");
if ((m_next - 1) > 0)
{
@@ -522,7 +522,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESETDTM_CANNOT_INDEX, null)); //"This NodeSetDTM can not do indexing or counting functions!");
+ "This NodeSetDTM can not do indexing or counting functions!");
if ((index >= 0) && (m_next < m_firstFree))
m_next = index;
@@ -1174,7 +1174,7 @@
if (!m_cacheNodes)
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESETDTM_CANNOT_INDEX, null)); //"This NodeSetDTM can not do indexing or counting functions!");
+ "This NodeSetDTM can not do indexing or counting functions!");
m_next = i;
}
@@ -1235,12 +1235,12 @@
* request caching after we've already begun stepping through the
* nodes in this set.
*/
- public void setShouldCacheNodes(boolean b)
+ public void setShouldCache(boolean b)
{
if (!isFresh())
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_CALL_SETSHOULDCACHENODE, null)); //"Can not call setShouldCacheNodes after nextNode has been called!");
+ "Can not call setShouldCacheNodes after nextNode has been called!");
m_cacheNodes = b;
m_mutable = true;
diff --git a/src/org/apache/xpath/VariableComposeState.java b/src/org/apache/xpath/VariableComposeState.java
new file mode 100644
index 0000000..32693fb
--- /dev/null
+++ b/src/org/apache/xpath/VariableComposeState.java
@@ -0,0 +1,141 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath;
+
+import org.apache.xml.utils.QName;
+
+/**
+ * This is a rather low lever interface that is passed to the
+ * fixupVariables method on expressions.
+ *
+ * Created Jul 19, 2002
+ * @author sboag
+ */
+public interface VariableComposeState
+{
+ /**
+ * Given a qualified name, return an integer ID that can be
+ * quickly compared.
+ *
+ * @param qname a qualified name object, must not be null.
+ *
+ * @return the expanded-name id of the qualified name.
+ */
+ public int getQNameID(QName qname);
+
+ /**
+ * Add the name of a qualified name within the template. The position in
+ * the vector is its ID.
+ * @param qname A qualified name of a param or variable, should be non-null.
+ * @return the index where the variable was added.
+ */
+ int addVariableName(final org.apache.xml.utils.QName qname);
+
+ /**
+ * Reset the stack frame size to zero.
+ */
+ void resetStackFrameSize();
+
+ /**
+ * Get the current size of the stack frame.
+ * @return int The size of the stack frame.
+ */
+ int getFrameSize();
+
+ /**
+ * Get the current size of the stack frame. Use this to record the position
+ * in a template element at startElement, so that it can be popped
+ * at endElement.
+ */
+ int getCurrentStackFrameSize();
+
+ /**
+ * Set the current size of the stack frame.
+ */
+ void setCurrentStackFrameSize(int sz);
+
+ /**
+ * Get the size of the globals area.
+ * @return int
+ */
+ int getGlobalsSize();
+
+ /**
+ * Push a "mark" on the stack that will delimit a scope.
+ */
+ void pushStackMark();
+
+ /**
+ * Pop the variable scope to the last mark pushed.
+ */
+ void popStackMark();
+
+ /**
+ * Get the a of QNames that correspond to variables. This list
+ * should be searched backwards for the first qualified name that
+ * corresponds to the variable reference qname. The position of the
+ * QName in the vector from the start of the vector will be its position
+ * in the stack frame (but variables above the globalsTop value will need
+ * to be offset to the current stack frame).
+ *
+ * @return A reference to the vector of variable names. The reference
+ * returned is owned by the implementor of this interface,
+ * and so should not really be mutated, or stored anywhere.
+ */
+ java.util.Vector getVariableNames();
+
+}
diff --git a/src/org/apache/xpath/XPath.java b/src/org/apache/xpath/XPath.java
index 6f2e884..43089cb 100644
--- a/src/org/apache/xpath/XPath.java
+++ b/src/org/apache/xpath/XPath.java
@@ -57,21 +57,24 @@
package org.apache.xpath;
import java.io.Serializable;
+import java.io.StringReader;
import java.util.Vector;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
+
+import org.apache.xalan.processor.StylesheetHandler;
import org.apache.xalan.res.XSLMessages;
import org.apache.xml.dtm.DTM;
import org.apache.xml.utils.PrefixResolver;
+import org.apache.xml.utils.QName;
import org.apache.xml.utils.SAXSourceLocator;
import org.apache.xml.utils.WrappedRuntimeException;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.compiler.FunctionTable;
-import org.apache.xpath.compiler.XPathParser;
import org.apache.xpath.functions.Function;
+import org.apache.xpath.objects.XNodeSequenceSingleton;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.ParseException;
import org.apache.xpath.res.XPATHErrorResources;
import org.w3c.dom.Node;
@@ -108,9 +111,9 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- m_mainExp.fixupVariables(vars, globalsSize);
+ m_mainExp.fixupVariables(vcs);
}
/**
@@ -171,11 +174,13 @@
/** Represents a match type expression. */
public static final int MATCH = 1;
+ public static boolean DEBUG_DUMP_EXPRS = false;
+ public static boolean DEBUG_CHECK_TREE_INTEGRITY = true; // leave as true for a while...
+
/**
- * Construct an XPath object.
- *
- * (Needs review -sc) This method initializes an XPathParser/
+ * Construct an XPath object. This method initializes an XPathParser/
* Compiler and compiles the expression.
+ *
* @param exprString The XPath expression.
* @param locator The location of the expression, may be null.
* @param prefixResolver A prefix resolver to use to resolve prefixes to
@@ -183,11 +188,12 @@
* @param type one of {@link #SELECT} or {@link #MATCH}.
* @param errorListener The error listener, or null if default should be used.
*
+ * @param version The version of XPath being used.
* @throws javax.xml.transform.TransformerException if syntax or other error.
*/
public XPath(
String exprString, SourceLocator locator, PrefixResolver prefixResolver, int type,
- ErrorListener errorListener)
+ ErrorListener errorListener, double version)
throws javax.xml.transform.TransformerException
{
if(null == errorListener)
@@ -195,18 +201,53 @@
m_patternString = exprString;
- XPathParser parser = new XPathParser(errorListener, locator);
- Compiler compiler = new Compiler(errorListener, locator);
-
- if (SELECT == type)
- parser.initXPath(compiler, exprString, prefixResolver);
- else if (MATCH == type)
- parser.initMatchPattern(compiler, exprString, prefixResolver);
- else
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_DEAL_XPATH_TYPE, new Object[]{Integer.toString(type)})); //"Can not deal with XPath type: " + type);
-
- // System.out.println("----------------");
- Expression expr = compiler.compile(0);
+ // TBD: Figure out what to do with errorListener and locator in new world.
+ // errorListener, locator
+ if(DEBUG_DUMP_EXPRS)
+ System.out.println("expr: "+exprString);
+
+ StringReader exprReader = new StringReader(exprString);
+
+ org.apache.xpath.parser.XPath parser = new org.apache.xpath.parser.XPath(exprReader);
+
+ if(DEBUG_CHECK_TREE_INTEGRITY)
+ {
+ assertion(null != prefixResolver,
+ " prefixResolver can not be null!");
+ assertion(!(prefixResolver instanceof StylesheetHandler),
+ " prefixResolver can not be a StylesheetHandler!");
+ }
+ parser.setPrefixResolver(prefixResolver);
+ parser.setVersion(version);
+ Expression rootOfRoot;
+ try
+ {
+ if (SELECT == type)
+ rootOfRoot = (Expression)parser.XPath2();
+ else if (MATCH == type)
+ rootOfRoot = (Expression)parser.MatchPattern();
+ else
+ throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_DEAL_XPATH_TYPE, new Object[]{Integer.toString(type)})); //"Can not deal with XPath type: " + type);
+ }
+ catch(org.apache.xpath.parser.ParseException pe)
+ {
+ TransformerException te = new TransformerException(pe);
+ te.setLocator(locator);
+ throw te;
+ }
+ Expression expr = (Expression)rootOfRoot.jjtGetChild(0);
+
+ if(DEBUG_CHECK_TREE_INTEGRITY)
+ {
+ if(false == expr.checkTreeIntegrity())
+ {
+ System.err.println("Expression is NOT OK: "+m_patternString);
+ expr.dump("| ");
+ }
+ }
+
+ if(DEBUG_DUMP_EXPRS)
+ expr.dump("| ");
// System.out.println("expr: "+expr);
this.setExpression(expr);
@@ -218,25 +259,25 @@
}
- /**
- * Construct an XPath object.
- *
- * (Needs review -sc) This method initializes an XPathParser/
- * Compiler and compiles the expression.
- * @param exprString The XPath expression.
- * @param locator The location of the expression, may be null.
- * @param prefixResolver A prefix resolver to use to resolve prefixes to
- * namespace URIs.
- * @param type one of {@link #SELECT} or {@link #MATCH}.
- *
- * @throws javax.xml.transform.TransformerException if syntax or other error.
- */
- public XPath(
- String exprString, SourceLocator locator, PrefixResolver prefixResolver, int type)
- throws javax.xml.transform.TransformerException
- {
- this(exprString, locator, prefixResolver, type, null);
- }
+// /**
+// * Construct an XPath object.
+// *
+// * (Needs review -sc) This method initializes an XPathParser/
+// * Compiler and compiles the expression.
+// * @param exprString The XPath expression.
+// * @param locator The location of the expression, may be null.
+// * @param prefixResolver A prefix resolver to use to resolve prefixes to
+// * namespace URIs.
+// * @param type one of {@link #SELECT} or {@link #MATCH}.
+// *
+// * @throws javax.xml.transform.TransformerException if syntax or other error.
+// */
+// public XPath(
+// String exprString, SourceLocator locator, PrefixResolver prefixResolver, int type)
+// throws javax.xml.transform.TransformerException
+// {
+// this(exprString, locator, prefixResolver, type, null);
+// }
/**
* Construct an XPath object.
@@ -276,7 +317,6 @@
namespaceContext);
}
-
/**
* <meta name="usage" content="experimental"/>
* Given an expression and a context, evaluate the XPath
@@ -296,10 +336,109 @@
XPathContext xctxt, int contextNode, PrefixResolver namespaceContext)
throws javax.xml.transform.TransformerException
{
+ xctxt.pushNamespaceContext(namespaceContext);
+ xctxt.pushCurrentNode(contextNode);
+ xctxt.pushCurrentExpressionNode(contextNode);
+ try
+ {
+ return execute(xctxt, namespaceContext);
+ }
+ finally
+ {
+ xctxt.popNamespaceContext();
+
+ xctxt.popCurrentNodeAndExpression();
+ }
+
+ }
+
+
+ /**
+ * <meta name="usage" content="experimental"/>
+ * Given an expression, evaluate the XPath
+ * and return the result. The method does not push the current context node!
+ *
+ * @param xctxt The execution context.
+ * @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 XObject execute(
+ XPathContext xctxt, PrefixResolver namespaceContext)
+ throws javax.xml.transform.TransformerException
+ {
+ XObject xobj = null;
+
+ try
+ {
+ xobj = m_mainExp.execute(xctxt);
+ }
+ catch (TransformerException te)
+ {
+ te.setLocator(this.getLocator());
+ ErrorListener el = xctxt.getErrorListener();
+ if(null != el) // defensive, should never happen.
+ {
+ el.error(te);
+ }
+ else
+ throw te;
+ }
+ catch (Exception e)
+ {
+ while (e instanceof org.apache.xml.utils.WrappedRuntimeException)
+ {
+ e = ((org.apache.xml.utils.WrappedRuntimeException) e).getException();
+ }
+ // e.printStackTrace();
+
+ String msg = e.getMessage();
+ msg = (msg == null || msg.length()== 0)? "Unknown error in XPath" : msg;
+ TransformerException te = new TransformerException(msg,
+ getLocator(), e);
+ ErrorListener el = xctxt.getErrorListener();
+ // te.printStackTrace();
+ if(null != el) // defensive, should never happen.
+ {
+ el.fatalError(te);
+ }
+ else
+ throw te;
+ }
+
+ return xobj;
+ }
+
+ /**
+ * <meta name="usage" content="experimental"/>
+ * Given an expression and a context, evaluate the XPath
+ * and return the result.
+ *
+ * @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 XObject execute(
+ XPathContext xctxt, XObject contextItem, PrefixResolver namespaceContext)
+ throws javax.xml.transform.TransformerException
+ {
xctxt.pushNamespaceContext(namespaceContext);
- xctxt.pushCurrentNodeAndExpression(contextNode, contextNode);
+ xctxt.pushCurrentItem(contextItem);
+ int node = contextItem.getNodeHandle();
+ if(DTM.NULL != node)
+ xctxt.pushCurrentExpressionNode(node);
XObject xobj = null;
@@ -343,11 +482,14 @@
{
xctxt.popNamespaceContext();
- xctxt.popCurrentNodeAndExpression();
+ xctxt.popCurrentItem();
+ if(DTM.NULL != node)
+ xctxt.popCurrentExpressionNode();
}
return xobj;
}
+
/**
* <meta name="usage" content="experimental"/>
@@ -371,8 +513,9 @@
xctxt.pushNamespaceContext(namespaceContext);
- xctxt.pushCurrentNodeAndExpression(contextNode, contextNode);
-
+ xctxt.pushCurrentNode(contextNode);
+ xctxt.pushCurrentExpressionNode(contextNode);
+
try
{
return m_mainExp.bool(xctxt);
@@ -453,6 +596,9 @@
+ dtm.getNodeName(context) + " for xpath "
+ this.getPatternString());
}
+
+ if(null == score)
+ throw new RuntimeException("What??");
return score.num();
}
@@ -474,8 +620,25 @@
*/
public void installFunction(String name, int funcIndex, Function func)
{
- FunctionTable.installFunction(func, funcIndex);
+ // TBD: Figure out proper construction of qname from name.
+ QName qname = new QName(name);
+ org.apache.xpath.parser.SimpleNode.m_builtInFunctions.put(name, func);
+ // FunctionTable.installFunction(func, funcIndex);
}
+
+ /**
+ * Install a built-in function.
+ * @param name The unqualified name of the function; not currently used.
+ * @param funcIndex The index of the function in the table.
+ * @param func An Implementation of an XPath Function object.
+ * @return the position of the function in the internal index.
+ */
+ public void installFunction(QName qname, Function func)
+ {
+ org.apache.xpath.parser.SimpleNode.m_builtInFunctions.put(qname, func);
+ // FunctionTable.installFunction(func, funcIndex);
+ }
+
/**
* Warn the user of an problem.
diff --git a/src/org/apache/xpath/XPathAPI.java b/src/org/apache/xpath/XPathAPI.java
index d6f0bda..be2b57b 100644
--- a/src/org/apache/xpath/XPathAPI.java
+++ b/src/org/apache/xpath/XPathAPI.java
@@ -65,7 +65,6 @@
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPath;
-import org.apache.xpath.compiler.XPathParser;
import org.apache.xpath.XPathContext;
import org.apache.xml.utils.PrefixResolverDefault;
import org.apache.xml.utils.PrefixResolver;
@@ -276,7 +275,7 @@
? ((Document) namespaceNode).getDocumentElement() : namespaceNode);
// Create the XPath object.
- XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null);
+ XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null, 1.0);
// Execute the XPath, and have it return the result
// return xpath.execute(xpathSupport, contextNode, prefixResolver);
@@ -318,7 +317,7 @@
// because XPathContext is weak in a number of areas... perhaps
// XPathContext should be done away with.)
// Create the XPath object.
- XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null);
+ XPath xpath = new XPath(str, null, prefixResolver, XPath.SELECT, null, 1.0);
// Execute the XPath, and have it return the result
XPathContext xpathSupport = new XPathContext();
diff --git a/src/org/apache/xpath/XPathContext.java b/src/org/apache/xpath/XPathContext.java
index df47a05..306d4a3 100644
--- a/src/org/apache/xpath/XPathContext.java
+++ b/src/org/apache/xpath/XPathContext.java
@@ -71,17 +71,21 @@
import org.apache.xml.utils.PrefixResolver;
import org.apache.xml.utils.QName;
import org.apache.xml.utils.NodeVector;
+import org.apache.xml.utils.WrappedRuntimeException;
import org.apache.xalan.res.XSLMessages;
import org.apache.xpath.res.XPATHErrorResources;
import org.apache.xpath.axes.ContextNodeList;
import org.apache.xpath.axes.SubContextList;
+import org.apache.xpath.objects.XNodeSequenceSingleton;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XSequence;
import org.apache.xpath.objects.XString;
import org.apache.xalan.extensions.ExpressionContext;
// SAX2 imports
+import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
// import org.xml.sax.Locator;
@@ -112,13 +116,19 @@
import org.apache.xpath.axes.DescendantIterator;
// For handling.
-import org.apache.xml.dtm.ref.sax2dtm.SAX2RTFDTM;
+import org.apache.xml.dtm.ref.sax2dtm.SAX2DTM;
/**
* <meta name="usage" content="advanced"/>
* Default class for the runtime execution context for XPath.
*
- * <p>This class extends DTMManager but does not directly implement it.</p>
+ * <p>XPathContext has been enhanced to carry the proposed "static context"
+ * information for XPath 2.0. This sketch was initially based on
+ * http://www.w3.org/TR/2002/WD-xpath20-2002043
+ * </p>
+ *
+ * <p>This class extends DTMManager but does not directly implement it;
+ * instead, it operates as proxy for an actual DTMManager.</p>
*/
public class XPathContext extends DTMManager // implements ExpressionContext
{
@@ -141,7 +151,7 @@
* Most recent "reusable" DTM for Global Result Tree Fragments. No stack is
* required since we're never going to pop these.
*/
- private SAX2RTFDTM m_global_rtfdtm=null;
+ private SAX2DTM m_global_rtfdtm=null;
/**
@@ -342,8 +352,8 @@
public XPathContext()
{
m_prefixResolvers[m_prefixResolversTop++] = null;
- m_currentNodes[m_currentNodesFirstFree++] = DTM.NULL;
- m_currentNodes[m_currentExpressionNodesFirstFree++] = DTM.NULL;
+ m_currentItems[m_currentNodesFirstFree++] = XSequence.EMPTY;
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = DTM.NULL;
m_saxLocations[m_saxLocationsTop++] = null;
}
@@ -360,8 +370,8 @@
}
catch (NoSuchMethodException nsme) {}
m_prefixResolvers[m_prefixResolversTop++] = null;
- m_currentNodes[m_currentNodesFirstFree++] = DTM.NULL;
- m_currentNodes[m_currentExpressionNodesFirstFree++] = DTM.NULL;
+ m_currentItems[m_currentNodesFirstFree++] = XSequence.EMPTY;
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = DTM.NULL;
m_saxLocations[m_saxLocationsTop++] = null;
}
@@ -392,7 +402,7 @@
m_contextNodeLists = new Stack();
m_currentExpressionNodes = new int[RECURSIONLIMIT];
m_currentExpressionNodesFirstFree = 0;
- m_currentNodes = new int[RECURSIONLIMIT];
+ m_currentItems = new XObject[RECURSIONLIMIT];
m_currentNodesFirstFree = 0;
m_iteratorRoots = new NodeVector();
m_predicatePos = new IntStack();
@@ -401,8 +411,8 @@
int m_prefixResolversTop = 0;
m_prefixResolvers[m_prefixResolversTop++] = null;
- m_currentNodes[m_currentNodesFirstFree++] = DTM.NULL;
- m_currentNodes[m_currentExpressionNodesFirstFree++] = DTM.NULL;
+ m_currentItems[m_currentNodesFirstFree++] = XSequence.EMPTY;
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = DTM.NULL;
m_saxLocations[m_saxLocationsTop++] = null;
}
@@ -690,14 +700,51 @@
* @return the <a href="http://www.w3.org/TR/xslt#dt-current-node-list">current node list</a>,
* also refered to here as a <term>context node list</term>.
*/
- public final DTMIterator getContextNodeList()
+ public final XSequence getContextSequence()
{
if (m_contextNodeLists.size() > 0)
- return (DTMIterator) m_contextNodeLists.peek();
+ return (XSequence) m_contextNodeLists.peek();
else
return null;
}
+
+ /**
+ * Get the current context node list.
+ *
+ * @return the <a href="http://www.w3.org/TR/xslt#dt-current-node-list">current node list</a>,
+ * also refered to here as a <term>context node list</term>.
+ */
+ public final DTMIterator getContextNodeList()
+ {
+
+ try
+ {
+ if (m_contextNodeLists.size() > 0)
+ {
+ Object contextSequence = m_contextNodeLists.peek();
+ if (contextSequence instanceof DTMIterator)
+ {
+ return (DTMIterator) contextSequence;
+ }
+ else
+ if (contextSequence instanceof XObject)
+ {
+ return ((XObject) contextSequence).iter();
+ }
+ else
+ {
+ return null; // or error
+ }
+ }
+ else
+ return null;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
/**
* <meta name="usage" content="internal"/>
@@ -706,9 +753,40 @@
* @param nl the <a href="http://www.w3.org/TR/xslt#dt-current-node-list">current node list</a>,
* also refered to here as a <term>context node list</term>.
*/
- public final void pushContextNodeList(DTMIterator nl)
+ public final void pushContextSequence(XSequence xseq)
{
- m_contextNodeLists.push(nl);
+ m_contextNodeLists.push(xseq);
+ }
+
+ /**
+ * <meta name="usage" content="internal"/>
+ * Pop the current context node list.
+ */
+ public final void popContextSequence()
+ {
+ if(m_contextNodeLists.isEmpty())
+ System.err.println("Warning: popContextNodeList when stack is empty!");
+ else
+ m_contextNodeLists.pop();
+ }
+
+/**
+ * <meta name="usage" content="internal"/>
+ * Set the current context node list.
+ *
+ * @param nl the <a href="http://www.w3.org/TR/xslt#dt-current-node-list">current node list</a>,
+ * also refered to here as a <term>context node list</term>.
+ */
+ public final void pushContextNodeList(DTMIterator iterator)
+ {
+ if(iterator instanceof XSequence)
+ m_contextNodeLists.push((XSequence)iterator);
+ else
+ {
+ XNodeSet nodeset = new XNodeSet(iterator);
+ nodeset.setCurrentPos(iterator.getCurrentPos());
+ m_contextNodeLists.push(nodeset);
+ }
}
/**
@@ -717,12 +795,13 @@
*/
public final void popContextNodeList()
{
- if(m_contextNodeLists.isEmpty())
- System.err.println("Warning: popContextNodeList when stack is empty!");
- else
+ if(m_contextNodeLists.isEmpty())
+ System.err.println("Warning: popContextNodeList when stack is empty!");
+ else
m_contextNodeLists.pop();
}
+
/**
* The ammount to use for stacks that record information during the
* recursive execution.
@@ -733,13 +812,14 @@
* Not to be confused with the current node list. %REVIEW% Note that there
* are no bounds check and resize for this stack, so if it is blown, it's all
* over. */
- private int m_currentNodes[] = new int[RECURSIONLIMIT];
+ private XObject m_currentItems[] = new XObject[RECURSIONLIMIT];
+
protected int m_currentNodesFirstFree = 0;
// private NodeVector m_currentNodes = new NodeVector();
- public int[] getCurrentNodeStack() {return m_currentNodes; }
- public void setCurrentNodeStack(int[] nv) { m_currentNodes = nv; }
+// public XObject[] getCurrentItemStack() {return m_currentItems; }
+ public void setCurrentNodeStack(XObject[] nv) { m_currentItems = nv; }
/**
* Get the current context node.
@@ -748,21 +828,88 @@
*/
public final int getCurrentNode()
{
- return m_currentNodes[m_currentNodesFirstFree-1];
+ XObject current = m_currentItems[m_currentNodesFirstFree - 1];
+ if (current instanceof XNodeSequenceSingleton)
+ return ((XNodeSequenceSingleton) current).getNodeHandle();
+// else if (current instanceof DTMIterator)
+// return ((DTMIterator) current).getCurrentNode();
+ else
+ return DTM.NULL;
}
/**
+ * Get the current context node.
+ *
+ * @return the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ */
+ public final XObject getCurrentItem()
+ {
+ return m_currentItems[m_currentNodesFirstFree - 1];
+ }
+
+ /**
+ * Set the current context node.
+ *
+ * @param cn the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ */
+ public final void setCurrentItem(XObject cn)
+ {
+ m_currentItems[m_currentNodesFirstFree - 1] = cn;
+ }
+
+
+ /**
+ * Set the current context node.
+ *
+ * @param cn the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ */
+ public final void setCurrentNode(int cn)
+ {
+ DTM dtm = m_dtmManager.getDTM(cn);
+ m_currentItems[m_currentNodesFirstFree - 1] = new XNodeSequenceSingleton(cn, dtm);
+ }
+
+
+ /**
* Set the current context node and expression node.
*
* @param cn the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
* @param en the sub-expression context node.
*/
+ public final void pushCurrentItemAndExpression(XObject cn, int en)
+ {
+ m_currentItems[m_currentNodesFirstFree++] = cn;
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = en;
+ }
+
+ /**
+ * Set the current context node and expression node.
+ *
+ * @param cn the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ * @param en the sub-expression context node.
+ * @deprecated
+ */
+ public final void pushCurrentItemAndExpression(int cn, int en)
+ {
+ pushCurrentNode(cn);
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = en;
+ }
+
+ /**
+ * Set the current context node and expression node.
+ *
+ * @param cn the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ * @param en the sub-expression context node.
+ * @deprecated
+ */
public final void pushCurrentNodeAndExpression(int cn, int en)
{
- m_currentNodes[m_currentNodesFirstFree++] = cn;
- m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = cn;
+ pushCurrentNode(cn);
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = en;
}
+
+
/**
* Set the current context node.
*/
@@ -779,14 +926,30 @@
* @param en the sub-expression context node.
* @param nc the namespace context (prefix resolver.
*/
- public final void pushExpressionState(int cn, int en, PrefixResolver nc)
+ public final void pushExpressionState(XObject cn, int en, PrefixResolver nc)
{
- m_currentNodes[m_currentNodesFirstFree++] = cn;
- m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = cn;
+ m_currentItems[m_currentNodesFirstFree++] = cn;
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = en;
m_prefixResolvers[m_prefixResolversTop++] = nc;
}
/**
+ * Push the current context node, expression node, and prefix resolver.
+ *
+ * @param cn the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ * @param en the sub-expression context node.
+ * @param nc the namespace context (prefix resolver.
+ * @deprecated
+ */
+ public final void pushExpressionState(int cn, int en, PrefixResolver nc)
+ {
+ pushCurrentNode(cn);
+ m_currentExpressionNodes[m_currentExpressionNodesFirstFree++] = en;
+ m_prefixResolvers[m_prefixResolversTop++] = nc;
+ }
+
+
+ /**
* Pop the current context node, expression node, and prefix resolver.
*/
public final void popExpressionState()
@@ -796,29 +959,77 @@
m_prefixResolversTop--;
}
-
+ /**
+ * Set the current context node.
+ *
+ * @param n the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
+ * @deprecated
+ */
+ public final void pushCurrentNode(int nodeHandle)
+ {
+ DTM dtm = getDTM(nodeHandle);
+ XNodeSequenceSingleton xseq = new XNodeSequenceSingleton(nodeHandle, dtm);
+ // xseq.next(); // so get current will work. Is this right? -sb
+ m_currentItems[m_currentNodesFirstFree++] = xseq;
+ }
+
+ /**
+ * Pop the current context node.
+ * @deprecated
+ */
+ public final void popCurrentNode()
+ {
+ m_currentNodesFirstFree--;
+ }
/**
* Set the current context node.
*
* @param n the <a href="http://www.w3.org/TR/xslt#dt-current-node">current node</a>.
*/
- public final void pushCurrentNode(int n)
+ public final void pushCurrentItem(XObject xobj)
{
- m_currentNodes[m_currentNodesFirstFree++] = n;
+ m_currentItems[m_currentNodesFirstFree++] = xobj;
+ }
+
+ /**
+ * Pop the current context node.
+ */
+ public final void popCurrentItem()
+ {
+ m_currentNodesFirstFree--;
}
public int getCurrentNodeFirstFree()
{
return m_currentNodesFirstFree;
- }
-
- /**
- * Pop the current context node.
+ }
+ /**
+ * The current group.
+ * The current group will only be non-empty when an
+ * xsl-for-each-group instruction is being evaluated.
*/
- public final void popCurrentNode()
+ private XSequence m_currentGroup ;
+
+ /**
+ * Return the current group or and empty NodeSet
+ * if one is not found.
+ */
+ public XSequence getCurrentGroup()
{
- m_currentNodesFirstFree--;
+ if (m_currentGroup == null)
+ m_currentGroup = XSequence.EMPTY;
+ return m_currentGroup;
+ }
+
+ /**
+ * Set the current group.
+ * The current group will only be non-empty when an
+ * xsl-for-each-group instruction is being evaluated.
+ */
+ public void setCurrentGroup(XSequence currentGroup)
+ {
+ m_currentGroup = currentGroup;
}
/**
@@ -1071,15 +1282,19 @@
* @return An iterator for the current context list, as
* defined in XSLT.
*/
- public final DTMIterator getContextNodes()
+ public final XSequence getContextNodes()
{
try
{
- DTMIterator cnl = getContextNodeList();
+ XSequence cnl = getContextSequence();
if (null != cnl)
- return cnl.cloneWithReset();
+ {
+ cnl = (XSequence)cnl.clone();
+ cnl.reset();
+ return cnl;
+ }
else
return null; // for now... this might ought to be an empty iterator.
}
@@ -1144,6 +1359,7 @@
*/
public org.w3c.dom.traversal.NodeIterator getContextNodes()
{
+ DTMIterator iterator = getContextNodeList();
return new org.apache.xml.dtm.ref.DTMNodeIterator(getContextNodeList());
}
@@ -1223,7 +1439,7 @@
// the latter will ever arise, but I'd rather be just a bit paranoid..
if( m_global_rtfdtm==null || m_global_rtfdtm.isTreeIncomplete() )
{
- m_global_rtfdtm=(SAX2RTFDTM)m_dtmManager.getDTM(null,true,null,false,false);
+ m_global_rtfdtm=(SAX2DTM)m_dtmManager.getDTM(null,true,null,false,false);
}
return m_global_rtfdtm;
}
@@ -1242,7 +1458,7 @@
*/
public DTM getRTFDTM()
{
- SAX2RTFDTM rtfdtm;
+ SAX2DTM rtfdtm;
// We probably should _NOT_ be applying whitespace filtering at this stage!
//
@@ -1257,17 +1473,17 @@
if(m_rtfdtm_stack==null)
{
m_rtfdtm_stack=new Vector();
- rtfdtm=(SAX2RTFDTM)m_dtmManager.getDTM(null,true,null,false,false);
+ rtfdtm=(SAX2DTM)m_dtmManager.getDTM(null,true,null,false,false);
m_rtfdtm_stack.addElement(rtfdtm);
++m_which_rtfdtm;
}
else if(m_which_rtfdtm<0)
{
- rtfdtm=(SAX2RTFDTM)m_rtfdtm_stack.elementAt(++m_which_rtfdtm);
+ rtfdtm=(SAX2DTM)m_rtfdtm_stack.elementAt(++m_which_rtfdtm);
}
else
{
- rtfdtm=(SAX2RTFDTM)m_rtfdtm_stack.elementAt(m_which_rtfdtm);
+ rtfdtm=(SAX2DTM)m_rtfdtm_stack.elementAt(m_which_rtfdtm);
// It might already be under construction -- the classic example would be
// an xsl:variable which uses xsl:call-template as part of its value. To
@@ -1278,10 +1494,10 @@
if(rtfdtm.isTreeIncomplete())
{
if(++m_which_rtfdtm < m_rtfdtm_stack.size())
- rtfdtm=(SAX2RTFDTM)m_rtfdtm_stack.elementAt(m_which_rtfdtm);
+ rtfdtm=(SAX2DTM)m_rtfdtm_stack.elementAt(m_which_rtfdtm);
else
{
- rtfdtm=(SAX2RTFDTM)m_dtmManager.getDTM(null,true,null,false,false);
+ rtfdtm=(SAX2DTM)m_dtmManager.getDTM(null,true,null,false,false);
m_rtfdtm_stack.addElement(rtfdtm);
}
}
@@ -1298,7 +1514,7 @@
{
m_last_pushed_rtfdtm.push(m_which_rtfdtm);
if(null!=m_rtfdtm_stack)
- ((SAX2RTFDTM)(getRTFDTM())).pushRewindMark();
+ ((SAX2DTM)(getRTFDTM())).pushRewindMark();
}
/** Pop the RTFDTM's context mark. This discards any RTFs added after the last
@@ -1325,7 +1541,7 @@
{
if(previous>=0) // guard against none-active
{
- boolean isEmpty=((SAX2RTFDTM)(m_rtfdtm_stack.elementAt(previous))).popRewindMark();
+ boolean isEmpty=((SAX2DTM)(m_rtfdtm_stack.elementAt(previous))).popRewindMark();
}
}
else while(m_which_rtfdtm!=previous)
@@ -1333,8 +1549,181 @@
// Empty each DTM before popping, so it's ready for reuse
// _DON'T_ pop the previous, since it's still open (which is why we
// stacked up more of these) and did not receive a mark.
- boolean isEmpty=((SAX2RTFDTM)(m_rtfdtm_stack.elementAt(m_which_rtfdtm))).popRewindMark();
+ boolean isEmpty=((SAX2DTM)(m_rtfdtm_stack.elementAt(m_which_rtfdtm))).popRewindMark();
--m_which_rtfdtm;
}
}
+
+
+ //================================================================
+ // XPath 2.0 PRELIMINARY: Static Context
+
+ /** XPATH2: Type Exception Policy: If "strict", type compatability errors
+ * should be reported as such. If "flexible", "fallback conversions" will
+ * be invoked and only if they fail will an error be reported.
+ * */
+ private boolean m2_typeExceptionPolicyStrict=true;
+
+ /** XPATH2: Type Exception Policy: If _strict_, type compatability errors
+ * should be reported as such. If _flexible_, "fallback conversions" will
+ * be invoked and only if they fail will an error be reported.
+ *
+ * @param strict True for strict type checking, false for flexible
+ * interpretation (attempt fallback).
+ * */
+ public void setTypeExceptionPolicyStrict(boolean strict)
+ {
+ m2_typeExceptionPolicyStrict=strict;
+ }
+
+ /** XPATH2: Type Exception Policy: If _strict_, type compatability errors
+ * should be reported as such. If _flexible_, "fallback conversions" will
+ * be invoked and only if they fail will an error be reported.
+ *
+ * @returns True for strict type checking, false for flexible
+ * interpretation (attempt fallback).
+ * */
+ public boolean isTypeExceptionPolicyStrict()
+ {
+ return m2_typeExceptionPolicyStrict;
+ }
+
+ /* XPATH2: In-Scope Namespaces: See setNamespaceContext. */
+
+ /** XPATH2: Default Namespace: Namespace URI to be presumed for
+ * any unprefixed QName appearing where an element or type name is
+ * expected. If null, the default is "no namespace".
+ *
+ * %REVIEW% What about attr names?
+ * */
+ private String m2_defaultNamespaceURI=null;
+
+ /** XPATH2: Default Namespace: Namespace URI to be presumed for
+ * any unprefixed QName appearing where an element or type name is
+ * expected.
+ *
+ * %REVIEW% What about attr names?
+ *
+ * @param uri URI to be use. If null, the default is "no namespace".
+ * Empty string is currently treated as a real but poorly formed URI;
+ * we can quibble about that...
+ * */
+ public void setDefaultNamespaceURI(String uri)
+ {
+ m2_defaultNamespaceURI=uri;
+ }
+
+ /** XPATH2: Default Namespace: Namespace URI to be presumed for
+ * any unprefixed QName appearing where an element or type name is
+ * expected.
+ *
+ * %REVIEW% What about attr names?
+ *
+ * @returns uri URI to be use. If null, the default is "no namespace".
+ * Empty string is currently treated as a real but poorly formed URI;
+ * we can quibble about that...
+ * */
+ public String getDefaultNamespaceURI()
+ {
+ return m2_defaultNamespaceURI;
+ }
+
+ /** XPATH2: Default Function Namespace: Namespace URI to be presumed for
+ * any unprefixed QName appearing where a function name is
+ * expected. If null, the default is "no namespace".
+ * */
+ private String m2_defaultFunctionNamespaceURI=null;
+
+ /** XPATH2: Default Function Namespace: Namespace URI to be presumed for
+ * any unprefixed QName appearing where a function name is
+ * expected. If null, the default is "no namespace".
+ *
+ * @param uri URI to be use. If null, the default is "no namespace".
+ * Empty string is currently treated as a real but poorly formed URI;
+ * we can quibble about that...
+ * */
+ public void setDefaultFunctionNamespaceURI(String uri)
+ {
+ m2_defaultFunctionNamespaceURI=uri;
+ }
+
+ /** XPATH2: Default Function Namespace: Namespace URI to be presumed for
+ * any unprefixed QName appearing where a function name is
+ * expected. If null, the default is "no namespace".
+ *
+ * @returns uri URI to be use. If null, the default is "no namespace".
+ * Empty string is currently treated as a real but poorly formed URI;
+ * we can quibble about that...
+ * */
+ public String getDefaultFunctionNamespaceURI()
+ {
+ return m2_defaultFunctionNamespaceURI;
+ }
+
+ /* XPATH2: In-Scope Variables: See getVarStack, getVariableOrParam....
+ %REVIEW% In XPath2 variables have type, and static variables have
+ static type; make sure it's retrievable.
+ */
+
+ /** XPATH2: In-Scope Schema Definitions: Set of (QName,type definition)
+ pairs, defining the types available for reference in the expression.
+ Includes the built-in schema types, all globally-declared types in
+ explicitly imported schemas -- but, significantly, does NOT necessarily
+ include the types referenced by any given instance document!
+
+ %ISSUE% Xerces dependencies are very roughly encapsulated, but
+ this is EXTREMELY ugly architecturally.
+ */
+ private org.apache.xml.dtm.ref.xni2dtm.AbstractSchema m2_issd=null;
+
+ public void addInScopeSchemaDefinitions(String publicID, String systemID)
+ {
+ if(m2_issd == null)
+ m2_issd=new org.apache.xml.dtm.ref.xni2dtm.AbstractSchema();
+
+ m2_issd.appendSchema(publicID, systemID, getBaseURI());
+ }
+
+ public org.apache.xml.dtm.ref.xni2dtm.AbstractSchema getInScopeSchemaDefinitions()
+ {
+ return m2_issd;
+ }
+
+ /** XPATH2: Base URI. Should be used by the document() function. Seems
+ * to be needed by other operations as well, though XPath doesn't make this
+ * clear -- eg, resolving import-schema URI references.
+ *
+ * The definition here is swiped from FuncDocument, and _should_ yield the
+ * base URI of the stylesheet node currently being executed. I'm not 110%
+ * sure it works in all cases. %REVIEW%
+ * */
+ public String getBaseURI()
+ {
+ return getNamespaceContext().getBaseIdentifier();
+ }
+
+ /** XPATH2 support: We need a central place to ask which version we're
+ * currently trying to support, since some behaviors may change.
+ *
+ * We know where to look if called from a stylesheet.
+ *
+ * I'm not sure where to look if we're using the XPath API; we
+ * may need to define an API for that purpose.
+ *
+ * @return String containing "1.0", "2.0", etc. If someone wants to
+ * compare sub-fields of this string... we don't currently help them.
+ * */
+ public String getXPathVersion()
+ {
+ try
+ {
+ return ((org.apache.xalan.transformer.TransformerImpl)m_owner).getStylesheet().getVersion();
+ }
+ catch(Exception e)
+ {
+ // %REVIEW% %TODO% Where does a bare XPath get this info?
+ return "1.0";
+ }
+
+ }
}
diff --git a/src/org/apache/xpath/XPathVisitor.java b/src/org/apache/xpath/XPathVisitor.java
index db73d51..4d8cc6d 100644
--- a/src/org/apache/xpath/XPathVisitor.java
+++ b/src/org/apache/xpath/XPathVisitor.java
@@ -57,6 +57,7 @@
package org.apache.xpath;
import org.apache.xpath.patterns.NodeTest;
+import org.apache.xpath.types.InstanceofExpr;
import org.apache.xpath.axes.LocPathIterator;
import org.apache.xpath.axes.UnionPathIterator;
import org.apache.xpath.functions.Function;
@@ -233,6 +234,19 @@
{
return true;
}
+
+ /**
+ * Visit a number literal.
+ * @param owner The owner of the expression, to which the expression can
+ * be reset if rewriting takes place.
+ * @param num The number literal object.
+ * @return true if the sub expressions should be traversed.
+ */
+ public boolean visitInstanceOf(ExpressionOwner owner, InstanceofExpr num)
+ {
+ return true;
+ }
+
}
diff --git a/src/org/apache/xpath/axes/AttributeIterator.java b/src/org/apache/xpath/axes/AttributeIterator.java
index f31fb6e..311e999 100644
--- a/src/org/apache/xpath/axes/AttributeIterator.java
+++ b/src/org/apache/xpath/axes/AttributeIterator.java
@@ -57,15 +57,9 @@
package org.apache.xpath.axes;
import javax.xml.transform.TransformerException;
-
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.patterns.NodeTest;
-import org.apache.xpath.objects.XObject;
-
+import org.apache.xml.dtm.Axis;
import org.apache.xml.dtm.DTM;
-import org.apache.xml.dtm.DTMIterator;
-import org.apache.xml.dtm.DTMFilter;
+import org.apache.xpath.parser.StepExpr;
/**
* <meta name="usage" content="advanced"/>
@@ -79,16 +73,15 @@
/**
* Create a AttributeIterator object.
*
- * @param compiler A reference to the Compiler that contains the op map.
- * @param opPos The position within the op map, which contains the
- * location path expression for this itterator.
+ * @param stepExpr The step expression from the parser.
+ * @param analysis The analysis bits for the total path expression.
*
* @throws javax.xml.transform.TransformerException
*/
- AttributeIterator(Compiler compiler, int opPos, int analysis)
+ AttributeIterator(StepExpr stepExpr, int analysis)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis);
+ super(stepExpr, analysis);
}
/**
diff --git a/src/org/apache/xpath/axes/AxesWalker.java b/src/org/apache/xpath/axes/AxesWalker.java
index e2da9dd..02dc2b2 100644
--- a/src/org/apache/xpath/axes/AxesWalker.java
+++ b/src/org/apache/xpath/axes/AxesWalker.java
@@ -66,11 +66,8 @@
import org.apache.xpath.ExpressionOwner;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.patterns.NodeTest;
-
-import org.apache.xpath.res.XPATHErrorResources;
-import org.apache.xalan.res.XSLMessages;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.StepExpr;
/**
* Serves as common interface for axes Walkers, and stores common
@@ -106,13 +103,11 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public void init(Compiler compiler, int opPos, int stepType)
+ public void init(org.apache.xpath.parser.StepExpr stepExpr)
throws javax.xml.transform.TransformerException
{
- initPredicateInfo(compiler, opPos);
-
- // int testType = compiler.getOp(nodeTestOpPos);
+ initPredicateInfo(stepExpr);
}
/**
@@ -264,7 +259,7 @@
if (DTM.NULL == root)
{
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_SETTING_WALKER_ROOT_TO_NULL, null)); //"\n !!!! Error! Setting the root of a walker to null!!!");
+ "\n !!!! Error! Setting the root of a walker to null!!!");
}
resetProximityPositions();
@@ -624,4 +619,61 @@
/** The DTM inner traversal class, that corresponds to the super axis. */
protected DTMAxisTraverser m_traverser;
+
+ public Node jjtGetChild(int i)
+ {
+ if((null != m_nextWalker) && i == 0)
+ return m_nextWalker;
+ else
+ return null;
+ }
+
+ public int jjtGetNumChildren()
+ {
+
+ return ((null == m_nextWalker) ? 0 : 1);
+ }
+
+ public String toString()
+ {
+ String namespace = getNamespace();
+ String localname = getLocalName();
+ return org.apache.xml.dtm.Axis.names[m_axis]+"::"+
+ ((null != namespace) ? (namespace+":") : "")+
+ ((null != localname) ? localname : "node()")+
+ " "+super.toString();
+ }
+
}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/org/apache/xpath/axes/BasicTestIterator.java b/src/org/apache/xpath/axes/BasicTestIterator.java
index 7f822b7..ed047cb 100644
--- a/src/org/apache/xpath/axes/BasicTestIterator.java
+++ b/src/org/apache/xpath/axes/BasicTestIterator.java
@@ -6,7 +6,7 @@
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.VariableStack;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.parser.StepExpr;
/**
* Base for iterators that handle predicates. Does the basic next
@@ -50,13 +50,12 @@
*
* @throws javax.xml.transform.TransformerException
*/
- protected BasicTestIterator(Compiler compiler, int opPos, int analysis)
+ protected BasicTestIterator(StepExpr stepExpr, int analysis)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis, false);
+ super(stepExpr.getParser().getPrefixResolver());
- int firstStepPos = compiler.getFirstChildPos(opPos);
- int whatToShow = compiler.getWhatToShow(firstStepPos);
+ int whatToShow = stepExpr.getWhatToShow();
if ((0 == (whatToShow
& (DTMFilter.SHOW_ATTRIBUTE
@@ -67,34 +66,11 @@
initNodeTest(whatToShow);
else
{
- initNodeTest(whatToShow, compiler.getStepNS(firstStepPos),
- compiler.getStepLocalName(firstStepPos));
+ initNodeTest(whatToShow, stepExpr.getNamespaceURI(),
+ stepExpr.getLocalName());
}
- initPredicateInfo(compiler, firstStepPos);
+ initPredicateInfo(stepExpr);
}
-
- /**
- * Create a LocPathIterator object, including creation
- * of step walkers from the opcode list, and call back
- * into the Compiler to create predicate expressions.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- * @param shouldLoadWalkers True if walkers should be
- * loaded, or false if this is a derived iterator and
- * it doesn't wish to load child walkers.
- *
- * @throws javax.xml.transform.TransformerException
- */
- protected BasicTestIterator(
- Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
- throws javax.xml.transform.TransformerException
- {
- super(compiler, opPos, analysis, shouldLoadWalkers);
- }
-
/**
* Get the next node via getNextXXX. Bottlenecked for derived class override.
@@ -197,6 +173,7 @@
return clone;
}
+
}
diff --git a/src/org/apache/xpath/axes/ChildIterator.java b/src/org/apache/xpath/axes/ChildIterator.java
index e5e39e2..41a2d1b 100644
--- a/src/org/apache/xpath/axes/ChildIterator.java
+++ b/src/org/apache/xpath/axes/ChildIterator.java
@@ -57,16 +57,10 @@
package org.apache.xpath.axes;
import javax.xml.transform.TransformerException;
-
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.patterns.NodeTest;
-import org.apache.xpath.XPathContext;
-import org.apache.xml.utils.PrefixResolver;
-
-//import org.w3c.dom.Node;
-//import org.w3c.dom.DOMException;
+import org.apache.xml.dtm.Axis;
import org.apache.xml.dtm.DTM;
-import org.apache.xml.dtm.DTMIterator;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.parser.StepExpr;
/**
* <meta name="usage" content="advanced"/>
@@ -77,22 +71,35 @@
*/
public class ChildIterator extends LocPathIterator
{
-
/**
* Create a ChildIterator object.
*
- * @param compiler A reference to the Compiler that contains the op map.
- * @param opPos The position within the op map, which contains the
- * location path expression for this itterator.
- * @param analysis Analysis bits of the entire pattern.
+ * @param stepExpr The step expression from the parser.
+ * @param analysis The analysis bits for the total path expression.
*
* @throws javax.xml.transform.TransformerException
*/
- ChildIterator(Compiler compiler, int opPos, int analysis)
+ ChildIterator(StepExpr stepExpr, int analysis)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis, false);
}
+
+
+// /**
+// * Create a ChildIterator object.
+// *
+// * @param compiler A reference to the Compiler that contains the op map.
+// * @param opPos The position within the op map, which contains the
+// * location path expression for this itterator.
+// * @param analysis Analysis bits of the entire pattern.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// ChildIterator(Compiler compiler, int opPos, int analysis)
+// throws javax.xml.transform.TransformerException
+// {
+// super(compiler, opPos, analysis, false);
+// }
/**
* Return the first node out of the nodeset, if this expression is
diff --git a/src/org/apache/xpath/axes/ChildTestIterator.java b/src/org/apache/xpath/axes/ChildTestIterator.java
index 9515a1f..695af5e 100644
--- a/src/org/apache/xpath/axes/ChildTestIterator.java
+++ b/src/org/apache/xpath/axes/ChildTestIterator.java
@@ -57,16 +57,11 @@
package org.apache.xpath.axes;
import javax.xml.transform.TransformerException;
-
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.patterns.NodeTest;
-import org.apache.xpath.objects.XObject;
-
-import org.apache.xml.dtm.DTM;
-import org.apache.xml.dtm.DTMIterator;
-import org.apache.xml.dtm.DTMFilter;
-import org.apache.xml.dtm.DTMAxisTraverser;
import org.apache.xml.dtm.Axis;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMAxisTraverser;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xpath.parser.StepExpr;
/**
* <meta name="usage" content="advanced"/>
@@ -86,17 +81,30 @@
/**
* Create a ChildTestIterator object.
*
- * @param compiler A reference to the Compiler that contains the op map.
- * @param opPos The position within the op map, which contains the
- * location path expression for this itterator.
+ * @param stepExpr The step expression from the parser.
+ * @param analysis The analysis bits for the total path expression.
*
* @throws javax.xml.transform.TransformerException
*/
- ChildTestIterator(Compiler compiler, int opPos, int analysis)
+ ChildTestIterator(StepExpr stepExpr, int analysis)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis);
+ super(stepExpr, analysis);
}
+
+ /**
+ * Create a ChildTestIterator object.
+ *
+ * @param traverser Traverser that tells how the KeyIterator is to be handled.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public ChildTestIterator()
+ {
+
+ super();
+ }
+
/**
* Create a ChildTestIterator object.
diff --git a/src/org/apache/xpath/axes/ContextNodeList.java b/src/org/apache/xpath/axes/ContextNodeList.java
index 00e94a3..1e97ae6 100644
--- a/src/org/apache/xpath/axes/ContextNodeList.java
+++ b/src/org/apache/xpath/axes/ContextNodeList.java
@@ -99,7 +99,7 @@
*
* @param b true if the nodes should be cached.
*/
- public void setShouldCacheNodes(boolean b);
+ public void setShouldCache(boolean b);
/**
* If an index is requested, NodeSetDTM will call this method
diff --git a/src/org/apache/xpath/axes/DescendantIterator.java b/src/org/apache/xpath/axes/DescendantIterator.java
index b336033..d678788 100644
--- a/src/org/apache/xpath/axes/DescendantIterator.java
+++ b/src/org/apache/xpath/axes/DescendantIterator.java
@@ -65,8 +65,7 @@
import org.apache.xpath.Expression;
import org.apache.xpath.VariableStack;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.compiler.OpCodes;
+import org.apache.xpath.parser.StepExpr;
import org.apache.xpath.patterns.NodeTest;
/**
@@ -86,68 +85,14 @@
*
* @throws javax.xml.transform.TransformerException
*/
- DescendantIterator(Compiler compiler, int opPos, int analysis)
+ DescendantIterator(StepExpr stepExpr)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis, false);
-
- int ops[] = compiler.getOpMap();
- int firstStepPos = compiler.getFirstChildPos(opPos);
- int stepType = ops[firstStepPos];
-
- boolean orSelf = (OpCodes.FROM_DESCENDANTS_OR_SELF == stepType);
- boolean fromRoot = false;
- if (OpCodes.FROM_SELF == stepType)
- {
- orSelf = true;
- // firstStepPos += 8;
- }
- else if(OpCodes.FROM_ROOT == stepType)
- {
- fromRoot = true;
- // Ugly code... will go away when AST work is done.
- int nextStepPos = compiler.getNextStepPos(firstStepPos);
- if(ops[nextStepPos] == OpCodes.FROM_DESCENDANTS_OR_SELF)
- orSelf = true;
- // firstStepPos += 8;
- }
-
- // Find the position of the last step.
- int nextStepPos = firstStepPos;
- while(true)
- {
- nextStepPos = compiler.getNextStepPos(nextStepPos);
- if(nextStepPos > 0)
- {
- int stepOp = compiler.getOp(nextStepPos);
- if(OpCodes.ENDOP != stepOp)
- firstStepPos = nextStepPos;
- else
- break;
- }
- else
- break;
+ super();
+ m_axis = stepExpr.getAxis();
- }
-
- // Fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=1336
- if((analysis & WalkerFactory.BIT_CHILD) != 0)
- orSelf = false;
-
- if(fromRoot)
- {
- if(orSelf)
- m_axis = Axis.DESCENDANTSORSELFFROMROOT;
- else
- m_axis = Axis.DESCENDANTSFROMROOT;
- }
- else if(orSelf)
- m_axis = Axis.DESCENDANTORSELF;
- else
- m_axis = Axis.DESCENDANT;
-
- int whatToShow = compiler.getWhatToShow(firstStepPos);
+ int whatToShow = stepExpr.getWhatToShow();
if ((0 == (whatToShow
& (DTMFilter.SHOW_ATTRIBUTE | DTMFilter.SHOW_ELEMENT
@@ -156,10 +101,9 @@
initNodeTest(whatToShow);
else
{
- initNodeTest(whatToShow, compiler.getStepNS(firstStepPos),
- compiler.getStepLocalName(firstStepPos));
+ initNodeTest(whatToShow, stepExpr.getNamespaceURI(), stepExpr.getLocalName());
}
- initPredicateInfo(compiler, firstStepPos);
+ initPredicateInfo(stepExpr);
}
/**
diff --git a/src/org/apache/xpath/axes/FilterExprIterator.java b/src/org/apache/xpath/axes/FilterExprIterator.java
index eaca9e4..aaa92b9 100644
--- a/src/org/apache/xpath/axes/FilterExprIterator.java
+++ b/src/org/apache/xpath/axes/FilterExprIterator.java
@@ -1,12 +1,18 @@
package org.apache.xpath.axes;
+import java.io.PrintStream;
import java.util.Vector;
import org.apache.xml.dtm.DTM;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.objects.XSequenceSingleton;
+import org.apache.xpath.parser.Node;
public class FilterExprIterator extends BasicTestIterator
{
@@ -15,7 +21,7 @@
private Expression m_expr;
/** The result of executing m_expr. Needs to be deep cloned on clone op. */
- transient private XNodeSet m_exprObj;
+ transient private XSequence m_exprObj;
private boolean m_mustHardReset = false;
private boolean m_canDetachNodeset = true;
@@ -70,7 +76,11 @@
{
if (null != m_exprObj)
{
- m_lastFetched = m_exprObj.nextNode();
+ XObject item = m_exprObj.next();
+ if(item != null && item != XSequence.EMPTY)
+ m_lastFetched = item.getNodeHandle();
+ else
+ m_lastFetched = DTM.NULL;
}
else
m_lastFetched = DTM.NULL;
@@ -100,10 +110,10 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
- m_expr.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
+ m_expr.fixupVariables(vcs);
}
/**
@@ -145,7 +155,12 @@
*/
public boolean isDocOrdered()
{
- return m_exprObj.isDocOrdered();
+ if(m_exprObj instanceof XNodeSet)
+ return ((XNodeSet)m_exprObj).isDocOrdered();
+ else if(m_exprObj instanceof XSequenceSingleton)
+ return true;
+ else
+ return false;
}
class filterExprOwner implements ExpressionOwner
@@ -199,5 +214,29 @@
return true;
}
+
+// /**
+// * @see org.apache.xpath.parser.Node#jjtGetChild(int)
+// */
+// public Node jjtGetChild(int i)
+// {
+// return (0 == i) ? m_expr : null;
+// }
+//
+// /**
+// * @see org.apache.xpath.parser.Node#jjtGetNumChildren()
+// */
+// public int jjtGetNumChildren()
+// {
+// return (null != m_expr) ? 1 : 0;
+// }
+//
+// /**
+// * @see org.apache.xpath.parser.SimpleNode#dump(String, PrintStream)
+// */
+// public void dump(String prefix, PrintStream ps)
+// {
+// super.dump(prefix, ps);
+// }
}
\ No newline at end of file
diff --git a/src/org/apache/xpath/axes/FilterExprIteratorSimple.java b/src/org/apache/xpath/axes/FilterExprIteratorSimple.java
index 55c7b87..e4ccfe4 100644
--- a/src/org/apache/xpath/axes/FilterExprIteratorSimple.java
+++ b/src/org/apache/xpath/axes/FilterExprIteratorSimple.java
@@ -1,17 +1,21 @@
package org.apache.xpath.axes;
-import java.util.Vector;
-
import javax.xml.transform.TransformerException;
+
import org.apache.xml.dtm.Axis;
import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.VariableStack;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.objects.XSequenceSingleton;
/**
* Class to use for one-step iteration that doesn't have a predicate, and
@@ -24,7 +28,7 @@
private Expression m_expr;
/** The result of executing m_expr. Needs to be deep cloned on clone op. */
- transient private XNodeSet m_exprObj;
+ transient private XSequence m_exprObj;
private boolean m_mustHardReset = false;
private boolean m_canDetachNodeset = true;
@@ -72,7 +76,7 @@
* Execute the expression. Meant for reuse by other FilterExpr iterators
* that are not derived from this object.
*/
- public static XNodeSet executeFilterExpr(int context, XPathContext xctxt,
+ public static XSequence executeFilterExpr(int context, XPathContext xctxt,
PrefixResolver prefixResolver,
boolean isTopLevel,
int stackFrame,
@@ -80,7 +84,7 @@
throws org.apache.xml.utils.WrappedRuntimeException
{
PrefixResolver savedResolver = xctxt.getNamespaceContext();
- XNodeSet result = null;
+ XSequence result = null;
try
{
@@ -101,14 +105,26 @@
int savedStart = vars.getStackFrame();
vars.setStackFrame(stackFrame);
- result = (org.apache.xpath.objects.XNodeSet) expr.execute(xctxt);
- result.setShouldCacheNodes(true);
+ result = (XSequence) expr.execute(xctxt);
+ result.setShouldCache(true);
// These two statements need to be combined into one operation.
vars.setStackFrame(savedStart);
}
else
- result = (org.apache.xpath.objects.XNodeSet) expr.execute(xctxt);
+ result = (XNodeSet) expr.execute(xctxt);
+
+ /* %REVIEW% %OPT%
+ Unfortunately, not all variables can be statically resolved into either
+ definitely RTF or definitely not RTF.
+
+ %REVIEW% FIX: Should be using standardized error strings.
+ */
+ if(result instanceof org.apache.xpath.objects.XRTreeFrag
+ && "1.0".equals(xctxt.getXPathVersion())
+ )
+ xctxt.getErrorListener().error(new TransformerException(
+ "Result Tree Fragments/Temporary Trees are not Nodesets in XSLT 1.0. Switch version to 2.0 or use the nodeset() extension"));
}
catch (javax.xml.transform.TransformerException se)
@@ -142,7 +158,11 @@
if (null != m_exprObj)
{
- m_lastFetched = next = m_exprObj.nextNode();
+ XObject item = m_exprObj.next();
+ if(item != null && item != XSequence.EMPTY)
+ m_lastFetched = next = item.getNodeHandle();
+ else
+ m_lastFetched = next = DTM.NULL;
}
else
m_lastFetched = next = DTM.NULL;
@@ -186,10 +206,10 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
- m_expr.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
+ m_expr.fixupVariables(vcs);
}
/**
@@ -231,7 +251,12 @@
*/
public boolean isDocOrdered()
{
- return m_exprObj.isDocOrdered();
+ if(m_exprObj instanceof XNodeSet)
+ return ((XNodeSet)m_exprObj).isDocOrdered();
+ else if(m_exprObj instanceof XSequenceSingleton)
+ return true;
+ else
+ return false;
}
class filterExprOwner implements ExpressionOwner
@@ -294,8 +319,8 @@
*/
public int getAxis()
{
- if(null != m_exprObj)
- return m_exprObj.getAxis();
+ if(null != m_exprObj && m_exprObj instanceof XNodeSet)
+ return ((XNodeSet)m_exprObj).getAxis();
else
return Axis.FILTEREDLIST;
}
diff --git a/src/org/apache/xpath/axes/FilterExprWalker.java b/src/org/apache/xpath/axes/FilterExprWalker.java
index 3af0a17..b18c3aa 100644
--- a/src/org/apache/xpath/axes/FilterExprWalker.java
+++ b/src/org/apache/xpath/axes/FilterExprWalker.java
@@ -56,22 +56,21 @@
*/
package org.apache.xpath.axes;
-import java.util.Vector;
-
-import javax.xml.transform.TransformerException;
-import org.apache.xalan.templates.FuncKey;
import org.apache.xml.dtm.Axis;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
-import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
-import org.apache.xpath.VariableStack;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.compiler.OpCodes;
+import org.apache.xpath.functions.Function;
import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.objects.XSequenceSingleton;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.PathExpr;
/**
* Walker for the OP_VARIABLE, or OP_EXTFUNCTION, or OP_FUNCTION, or OP_GROUP,
@@ -94,64 +93,93 @@
/**
* Init a FilterExprWalker.
*
- * @param compiler non-null reference to the Compiler that is constructing.
- * @param opPos positive opcode position for this step.
- * @param stepType The type of step.
+ * @param stepExpr The FilterExpr's expression.
*
* @throws javax.xml.transform.TransformerException
*/
- public void init(Compiler compiler, int opPos, int stepType)
- throws javax.xml.transform.TransformerException
+ public void init(org.apache.xpath.parser.StepExpr stepExpr)
+ throws javax.xml.transform.TransformerException
{
+ int childCount = stepExpr.jjtGetNumChildren();
+ if (childCount > 0)
+ {
+ Node child = stepExpr.jjtGetChild(0);
+ m_expr = (Expression) child;
+ // Not sure if this is still needed. Probably not. -sb
+ if (m_expr instanceof WalkingIterator)
+ {
+ WalkingIterator wi = (WalkingIterator) m_expr;
+ if (wi.getFirstWalker() instanceof FilterExprWalker)
+ {
+ FilterExprWalker fw = (FilterExprWalker) wi.getFirstWalker();
+ if (null == fw.getNextWalker())
+ {
+ m_expr = fw.m_expr;
+ m_expr.exprSetParent(this);
+ }
+ }
- super.init(compiler, opPos, stepType);
+ }
+ if (m_expr instanceof Function)
+ {
+ m_mustHardReset = true;
+ }
+ if (m_expr instanceof org.apache.xalan.templates.FuncKey)
+ {
+ // hack/temp workaround
+ m_canDetachNodeset = false;
+ }
+ m_expr.exprSetParent(this);
+
+ }
+ super.init(stepExpr);
// Smooth over an anomily in the opcode map...
- switch (stepType)
- {
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_EXTFUNCTION :
- m_mustHardReset = true;
- case OpCodes.OP_GROUP :
- case OpCodes.OP_VARIABLE :
- m_expr = compiler.compile(opPos);
- m_expr.exprSetParent(this);
- if((OpCodes.OP_FUNCTION == stepType) && (m_expr instanceof org.apache.xalan.templates.FuncKey))
- {
- // hack/temp workaround
- m_canDetachNodeset = false;
- }
- break;
- default :
- m_expr = compiler.compile(opPos + 2);
- m_expr.exprSetParent(this);
- }
-// if(m_expr instanceof WalkingIterator)
-// {
-// WalkingIterator wi = (WalkingIterator)m_expr;
-// if(wi.getFirstWalker() instanceof FilterExprWalker)
-// {
-// FilterExprWalker fw = (FilterExprWalker)wi.getFirstWalker();
-// if(null == fw.getNextWalker())
-// {
-// m_expr = fw.m_expr;
-// m_expr.exprSetParent(this);
-// }
-// }
-//
-// }
+ // switch (stepType)
+ // {
+ // case OpCodes.OP_FUNCTION :
+ // case OpCodes.OP_EXTFUNCTION :
+ // m_mustHardReset = true;
+ // case OpCodes.OP_GROUP :
+ // case OpCodes.OP_VARIABLE :
+ // m_expr = compiler.compile(opPos);
+ // m_expr.exprSetParent(this);
+ // if((OpCodes.OP_FUNCTION == stepType) && (m_expr instanceof org.apache.xalan.templates.FuncKey))
+ // {
+ // // hack/temp workaround
+ // m_canDetachNodeset = false;
+ // }
+ // break;
+ // default :
+ // m_expr = compiler.compile(opPos + 2);
+ // m_expr.exprSetParent(this);
+ // }
+ // if(m_expr instanceof WalkingIterator)
+ // {
+ // WalkingIterator wi = (WalkingIterator)m_expr;
+ // if(wi.getFirstWalker() instanceof FilterExprWalker)
+ // {
+ // FilterExprWalker fw = (FilterExprWalker)wi.getFirstWalker();
+ // if(null == fw.getNextWalker())
+ // {
+ // m_expr = fw.m_expr;
+ // m_expr.exprSetParent(this);
+ // }
+ // }
+ //
+ // }
}
-
+
/**
* Detaches the walker from the set which it iterated over, releasing
* any computational resources and placing the iterator in the INVALID
* state.
*/
public void detach()
- {
- super.detach();
- m_exprObj.detach();
- m_exprObj = null;
+ {
+ super.detach();
+ m_exprObj.detach();
+ m_exprObj = null;
}
/**
@@ -165,9 +193,14 @@
super.setRoot(root);
- m_exprObj = FilterExprIteratorSimple.executeFilterExpr(root,
- m_lpi.getXPathContext(), m_lpi.getPrefixResolver(),
- m_lpi.getIsTopLevel(), m_lpi.m_stackFrame, m_expr);
+ m_exprObj =
+ FilterExprIteratorSimple.executeFilterExpr(
+ root,
+ m_lpi.getXPathContext(),
+ m_lpi.getPrefixResolver(),
+ m_lpi.getIsTopLevel(),
+ m_lpi.m_stackFrame,
+ m_expr);
}
@@ -189,7 +222,7 @@
return clone;
}
-
+
/**
* This method needs to override AxesWalker.acceptNode because FilterExprWalkers
* don't need to, and shouldn't, do a node test.
@@ -232,13 +265,21 @@
if (null != m_exprObj)
{
- int next = m_exprObj.nextNode();
- return next;
+ int next;
+ XObject item = m_exprObj.next();
+ if(item != null && item != XSequence.EMPTY)
+ next = item.getNodeHandle();
+ else
+ {
+ m_exprObj.reset();
+ next = DTM.NULL;
+ }
+ return next;
}
else
return DTM.NULL;
}
-
+
/**
* Get the index of the last node that can be itterated to.
*
@@ -251,14 +292,14 @@
{
return m_exprObj.getLength();
}
-
+
/** The contained expression. Should be non-null.
* @serial */
private Expression m_expr;
/** The result of executing m_expr. Needs to be deep cloned on clone op. */
- transient private XNodeSet m_exprObj;
-
+ transient private XSequence m_exprObj;
+
private boolean m_mustHardReset = false;
private boolean m_canDetachNodeset = true;
@@ -272,43 +313,42 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
- m_expr.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
+ m_expr.fixupVariables(vcs);
}
-
+
/**
* Get the inner contained expression of this filter.
*/
public Expression getInnerExpression()
{
- return m_expr;
+ return m_expr;
}
-
+
/**
* Set the inner contained expression of this filter.
*/
public void setInnerExpression(Expression expr)
{
- expr.exprSetParent(this);
- m_expr = expr;
+ expr.exprSetParent(this);
+ m_expr = expr;
}
-
/**
* Get the analysis bits for this walker, as defined in the WalkerFactory.
* @return One of WalkerFactory#BIT_DESCENDANT, etc.
*/
public int getAnalysisBits()
{
- if (null != m_expr && m_expr instanceof PathComponent)
- {
- return ((PathComponent) m_expr).getAnalysisBits();
- }
- return WalkerFactory.BIT_FILTER;
+ if (null != m_expr && m_expr instanceof PathComponent)
+ {
+ return ((PathComponent) m_expr).getAnalysisBits();
+ }
+ return WalkerFactory.BIT_FILTER;
}
-
+
/**
* Returns true if all the nodes in the iteration well be returned in document
* order.
@@ -318,9 +358,14 @@
*/
public boolean isDocOrdered()
{
- return m_exprObj.isDocOrdered();
+ if(m_exprObj instanceof XNodeSet)
+ return ((XNodeSet)m_exprObj).isDocOrdered();
+ else if(m_exprObj instanceof XSequenceSingleton)
+ return true;
+ else
+ return false;
}
-
+
/**
* Returns the axis being iterated, if it is known.
*
@@ -329,14 +374,17 @@
*/
public int getAxis()
{
- return m_exprObj.getAxis();
+ if(null != m_exprObj && m_exprObj instanceof XNodeSet)
+ return ((XNodeSet)m_exprObj).getAxis();
+ else
+ return Axis.FILTEREDLIST;
}
-
+
class filterExprOwner implements ExpressionOwner
{
- /**
- * @see ExpressionOwner#getExpression()
- */
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
public Expression getExpression()
{
return m_expr;
@@ -347,43 +395,99 @@
*/
public void setExpression(Expression exp)
{
- exp.exprSetParent(FilterExprWalker.this);
- m_expr = exp;
+ exp.exprSetParent(FilterExprWalker.this);
+ m_expr = exp;
}
+
+ }
+
+ /**
+ * This will traverse the heararchy, calling the visitor for
+ * each member. If the called visitor method returns
+ * false, the subtree should not be called.
+ *
+ * @param owner The owner of the visitor, where that path may be
+ * rewritten if needed.
+ * @param visitor The visitor whose appropriate method will be called.
+ */
+ public void callPredicateVisitors(XPathVisitor visitor)
+ {
+ m_expr.callVisitors(new filterExprOwner(), visitor);
+
+ super.callPredicateVisitors(visitor);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ if (!super.deepEquals(expr))
+ return false;
+
+ FilterExprWalker walker = (FilterExprWalker) expr;
+ if (!m_expr.deepEquals(walker.m_expr))
+ return false;
+
+ return true;
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ if (n instanceof AxesWalker)
+ {
+ super.jjtAddChild(n, i);
+ }
+ else // Do we care about i?
+ {
+ n = fixupPrimarys(n);
+ m_expr = (Expression) n;
+ }
+
+ }
+
+ public Node jjtGetChild(int i)
+ {
+ if (i == 0)
+ return m_expr;
+ else
+ if ((null != m_nextWalker) && i == 1)
+ return m_nextWalker;
+ else
+ return null;
+ }
+
+ public int jjtGetNumChildren()
+ {
+ return ((null == m_nextWalker) ? 0 : 1) + ((null == m_expr) ? 0 : 1);
+ }
+
+ /**
+ * This function checks the integrity of the tree, after it has been fully built and
+ * is ready for execution. Derived classes can overload this function to check
+ * their own assumptions.
+ */
+ public boolean checkTreeIntegrity(
+ int levelCount,
+ int childNumber,
+ boolean isOK)
+ {
+ if (null == m_expr)
+ isOK =
+ flagProblem(
+ toString()
+ + " the expression for FilterExpr can not be null at this point!");
+ return super.checkTreeIntegrity(levelCount, childNumber, isOK);
}
- /**
- * This will traverse the heararchy, calling the visitor for
- * each member. If the called visitor method returns
- * false, the subtree should not be called.
- *
- * @param owner The owner of the visitor, where that path may be
- * rewritten if needed.
- * @param visitor The visitor whose appropriate method will be called.
- */
- public void callPredicateVisitors(XPathVisitor visitor)
- {
- m_expr.callVisitors(new filterExprOwner(), visitor);
-
- super.callPredicateVisitors(visitor);
- }
-
-
- /**
- * @see Expression#deepEquals(Expression)
- */
- public boolean deepEquals(Expression expr)
- {
- if (!super.deepEquals(expr))
- return false;
-
- FilterExprWalker walker = (FilterExprWalker)expr;
- if(!m_expr.deepEquals(walker.m_expr))
- return false;
-
- return true;
- }
-
-
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#isPathExpr()
+ */
+ public boolean isPathExpr()
+ {
+ // keep it from reducing if not a nodeset expression.
+ return (m_expr instanceof DTMIterator) ? true :
+ (m_expr instanceof PathExpr) ? true : false;
+ }
}
diff --git a/src/org/apache/xpath/axes/HasPositionalPredChecker.java b/src/org/apache/xpath/axes/HasPositionalPredChecker.java
index 37570d6..32887a4 100644
--- a/src/org/apache/xpath/axes/HasPositionalPredChecker.java
+++ b/src/org/apache/xpath/axes/HasPositionalPredChecker.java
@@ -8,10 +8,10 @@
import org.apache.xpath.functions.Function;
import org.apache.xpath.objects.XNumber;
import org.apache.xpath.operations.Div;
-import org.apache.xpath.operations.Minus;
+import org.apache.xpath.operations.Subtract;
import org.apache.xpath.operations.Mod;
import org.apache.xpath.operations.Mult;
-import org.apache.xpath.operations.Plus;
+import org.apache.xpath.operations.Add;
import org.apache.xpath.operations.Quo;
import org.apache.xpath.operations.Variable;
@@ -81,8 +81,8 @@
if((pred instanceof Variable) ||
(pred instanceof XNumber) ||
(pred instanceof Div) ||
- (pred instanceof Plus) ||
- (pred instanceof Minus) ||
+ (pred instanceof Add) ||
+ (pred instanceof Subtract) ||
(pred instanceof Mod) ||
(pred instanceof Quo) ||
(pred instanceof Mult) ||
diff --git a/src/org/apache/xpath/axes/LocPathIterator.java b/src/org/apache/xpath/axes/LocPathIterator.java
index 5205e3b..c12ae86 100644
--- a/src/org/apache/xpath/axes/LocPathIterator.java
+++ b/src/org/apache/xpath/axes/LocPathIterator.java
@@ -70,11 +70,9 @@
import org.apache.xpath.ExpressionOwner;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
import org.apache.xpath.objects.XNodeSet;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.res.XPATHErrorResources;
-import org.apache.xalan.res.XSLMessages;
+import org.apache.xpath.parser.Node;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
@@ -102,6 +100,7 @@
*/
protected LocPathIterator()
{
+ setLocPathIterator(this);
}
@@ -115,48 +114,10 @@
{
setLocPathIterator(this);
+
m_prefixResolver = nscontext;
}
- /**
- * Create a LocPathIterator object, including creation
- * of step walkers from the opcode list, and call back
- * into the Compiler to create predicate expressions.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- *
- * @throws javax.xml.transform.TransformerException
- */
- protected LocPathIterator(Compiler compiler, int opPos, int analysis)
- throws javax.xml.transform.TransformerException
- {
- this(compiler, opPos, analysis, true);
- }
-
- /**
- * Create a LocPathIterator object, including creation
- * of step walkers from the opcode list, and call back
- * into the Compiler to create predicate expressions.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- * @param shouldLoadWalkers True if walkers should be
- * loaded, or false if this is a derived iterator and
- * it doesn't wish to load child walkers.
- *
- * @throws javax.xml.transform.TransformerException
- */
- protected LocPathIterator(
- Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
- throws javax.xml.transform.TransformerException
- {
- setLocPathIterator(this);
- }
/**
* Get the analysis bits for this walker, as defined in the WalkerFactory.
@@ -233,7 +194,10 @@
*/
public DTMManager getDTMManager()
{
- return m_execContext.getDTMManager();
+ if(null != m_execContext)
+ return m_execContext.getDTMManager();
+ else
+ return null;
}
/**
@@ -253,8 +217,12 @@
{
XNodeSet iter = new XNodeSet((LocPathIterator)m_clones.getInstance());
-
- iter.setRoot(xctxt.getCurrentNode(), xctxt);
+ int nodeHandle = xctxt.getCurrentNode();
+ if(nodeHandle == DTM.NULL)
+ {
+ throw new RuntimeException("Can not execute path expression without a current node being active!");
+ }
+ iter.setRoot(nodeHandle, xctxt);
return iter;
}
@@ -460,10 +428,10 @@
*
* @param b True if this iterator should cache nodes.
*/
- public void setShouldCacheNodes(boolean b)
+ public void setShouldCache(boolean b)
{
- assertion(false, "setShouldCacheNodes not supported by this iterater!");
+ assertion(false, "setShouldCache not supported by this iterater!");
}
/**
@@ -619,7 +587,7 @@
public int previousNode()
{
throw new RuntimeException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NODESETDTM_CANNOT_ITERATE, null)); //"This NodeSetDTM can not iterate to a previous node!");
+ "This NodeSetDTM can not iterate to a previous node!");
}
/**
@@ -1064,4 +1032,25 @@
return getLength();
}
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ String namespace = getNamespace();
+ String localname = getLocalName();
+ if(getAxis() >= 0)
+ {
+ return org.apache.xml.dtm.Axis.names[getAxis()]+"::"+
+ ((null != namespace) ? (namespace+":") : "")+
+ ((null != localname) ? localname : "node()")+
+ " "+super.toString();
+ }
+ else
+ {
+ return super.toString();
+ }
+ }
+
+
}
diff --git a/src/org/apache/xpath/axes/MatchPatternIterator.java b/src/org/apache/xpath/axes/MatchPatternIterator.java
index c577131..7bba77c 100644
--- a/src/org/apache/xpath/axes/MatchPatternIterator.java
+++ b/src/org/apache/xpath/axes/MatchPatternIterator.java
@@ -63,8 +63,6 @@
import org.apache.xpath.XPathContext;
import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.axes.SubContextList;
-import org.apache.xpath.compiler.PsuedoNames;
-import org.apache.xpath.compiler.Compiler;
import org.apache.xpath.patterns.StepPattern;
import org.apache.xpath.VariableStack;
import org.apache.xpath.patterns.NodeTest;
@@ -100,97 +98,97 @@
// protected int m_nsElemBase = DTM.NULL;
- /**
- * Create a LocPathIterator object, including creation
- * of step walkers from the opcode list, and call back
- * into the Compiler to create predicate expressions.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- * @param analysis Analysis bits that give general information about the
- * LocationPath.
- *
- * @throws javax.xml.transform.TransformerException
- */
- MatchPatternIterator(Compiler compiler, int opPos, int analysis)
- throws javax.xml.transform.TransformerException
- {
-
- super(compiler, opPos, analysis, false);
-
- int firstStepPos = compiler.getFirstChildPos(opPos);
-
- m_pattern = WalkerFactory.loadSteps(this, compiler, firstStepPos, 0);
-
- boolean fromRoot = false;
- boolean walkBack = false;
- boolean walkDescendants = false;
- boolean walkAttributes = false;
-
- if (0 != (analysis & (WalkerFactory.BIT_ROOT |
- WalkerFactory.BIT_ANY_DESCENDANT_FROM_ROOT)))
- fromRoot = true;
-
- if (0 != (analysis
- & (WalkerFactory.BIT_ANCESTOR
- | WalkerFactory.BIT_ANCESTOR_OR_SELF
- | WalkerFactory.BIT_PRECEDING
- | WalkerFactory.BIT_PRECEDING_SIBLING
- | WalkerFactory.BIT_FOLLOWING
- | WalkerFactory.BIT_FOLLOWING_SIBLING
- | WalkerFactory.BIT_PARENT | WalkerFactory.BIT_FILTER)))
- walkBack = true;
-
- if (0 != (analysis
- & (WalkerFactory.BIT_DESCENDANT_OR_SELF
- | WalkerFactory.BIT_DESCENDANT
- | WalkerFactory.BIT_CHILD)))
- walkDescendants = true;
-
- if (0 != (analysis
- & (WalkerFactory.BIT_ATTRIBUTE | WalkerFactory.BIT_NAMESPACE)))
- walkAttributes = true;
-
- if(false || DEBUG)
- {
- System.out.print("analysis: "+Integer.toBinaryString(analysis));
- System.out.println(", "+WalkerFactory.getAnalysisString(analysis));
- }
-
- if(fromRoot || walkBack)
- {
- if(walkAttributes)
- {
- m_superAxis = Axis.ALL;
- }
- else
- {
- m_superAxis = Axis.DESCENDANTSFROMROOT;
- }
- }
- else if(walkDescendants)
- {
- if(walkAttributes)
- {
- m_superAxis = Axis.ALLFROMNODE;
- }
- else
- {
- m_superAxis = Axis.DESCENDANTORSELF;
- }
- }
- else
- {
- m_superAxis = Axis.ALL;
- }
- if(false || DEBUG)
- {
- System.out.println("axis: "+Axis.names[m_superAxis]);
- }
-
- }
+// /**
+// * Create a LocPathIterator object, including creation
+// * of step walkers from the opcode list, and call back
+// * into the Compiler to create predicate expressions.
+// *
+// * @param compiler The Compiler which is creating
+// * this expression.
+// * @param opPos The position of this iterator in the
+// * opcode list from the compiler.
+// * @param analysis Analysis bits that give general information about the
+// * LocationPath.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// MatchPatternIterator(Compiler compiler, int opPos, int analysis)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// super(compiler, opPos, analysis, false);
+//
+// int firstStepPos = compiler.getFirstChildPos(opPos);
+//
+// m_pattern = WalkerFactory.loadSteps(this, compiler, firstStepPos, 0);
+//
+// boolean fromRoot = false;
+// boolean walkBack = false;
+// boolean walkDescendants = false;
+// boolean walkAttributes = false;
+//
+// if (0 != (analysis & (WalkerFactory.BIT_ROOT |
+// WalkerFactory.BIT_ANY_DESCENDANT_FROM_ROOT)))
+// fromRoot = true;
+//
+// if (0 != (analysis
+// & (WalkerFactory.BIT_ANCESTOR
+// | WalkerFactory.BIT_ANCESTOR_OR_SELF
+// | WalkerFactory.BIT_PRECEDING
+// | WalkerFactory.BIT_PRECEDING_SIBLING
+// | WalkerFactory.BIT_FOLLOWING
+// | WalkerFactory.BIT_FOLLOWING_SIBLING
+// | WalkerFactory.BIT_PARENT | WalkerFactory.BIT_FILTER)))
+// walkBack = true;
+//
+// if (0 != (analysis
+// & (WalkerFactory.BIT_DESCENDANT_OR_SELF
+// | WalkerFactory.BIT_DESCENDANT
+// | WalkerFactory.BIT_CHILD)))
+// walkDescendants = true;
+//
+// if (0 != (analysis
+// & (WalkerFactory.BIT_ATTRIBUTE | WalkerFactory.BIT_NAMESPACE)))
+// walkAttributes = true;
+//
+// if(false || DEBUG)
+// {
+// System.out.print("analysis: "+Integer.toBinaryString(analysis));
+// System.out.println(", "+WalkerFactory.getAnalysisString(analysis));
+// }
+//
+// if(fromRoot || walkBack)
+// {
+// if(walkAttributes)
+// {
+// m_superAxis = Axis.ALL;
+// }
+// else
+// {
+// m_superAxis = Axis.DESCENDANTSFROMROOT;
+// }
+// }
+// else if(walkDescendants)
+// {
+// if(walkAttributes)
+// {
+// m_superAxis = Axis.ALLFROMNODE;
+// }
+// else
+// {
+// m_superAxis = Axis.DESCENDANTORSELF;
+// }
+// }
+// else
+// {
+// m_superAxis = Axis.ALL;
+// }
+// if(false || DEBUG)
+// {
+// System.out.println("axis: "+Axis.names[m_superAxis]);
+// }
+//
+// }
/**
diff --git a/src/org/apache/xpath/axes/OneStepIterator.java b/src/org/apache/xpath/axes/OneStepIterator.java
index fb9d4ce..eb91e70 100644
--- a/src/org/apache/xpath/axes/OneStepIterator.java
+++ b/src/org/apache/xpath/axes/OneStepIterator.java
@@ -7,7 +7,7 @@
import org.apache.xml.dtm.DTMIterator;
import org.apache.xpath.Expression;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.parser.StepExpr;
/**
* <meta name="usage" content="advanced"/>
@@ -26,19 +26,17 @@
/**
* Create a OneStepIterator object.
*
- * @param compiler A reference to the Compiler that contains the op map.
- * @param opPos The position within the op map, which contains the
- * location path expression for this itterator.
+ * @param stepExpr The step expression from the parser.
+ * @param analysis The analysis bits for the total path expression.
*
* @throws javax.xml.transform.TransformerException
*/
- OneStepIterator(Compiler compiler, int opPos, int analysis)
+ OneStepIterator(StepExpr stepExpr, int analysis)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis);
- int firstStepPos = compiler.getFirstChildPos(opPos);
+ super(stepExpr, analysis);
- m_axis = WalkerFactory.getAxisFromStep(compiler, firstStepPos);
+ m_axis = stepExpr.getAxis();
}
diff --git a/src/org/apache/xpath/axes/OneStepIteratorForward.java b/src/org/apache/xpath/axes/OneStepIteratorForward.java
index fea0ecf..2116379 100644
--- a/src/org/apache/xpath/axes/OneStepIteratorForward.java
+++ b/src/org/apache/xpath/axes/OneStepIteratorForward.java
@@ -4,7 +4,7 @@
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMFilter;
import org.apache.xpath.Expression;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.parser.StepExpr;
/**
* <meta name="usage" content="advanced"/>
@@ -20,21 +20,19 @@
protected int m_axis = -1;
/**
- * Create a OneStepIterator object.
+ * Create a OneStepIteratorForward object.
*
- * @param compiler A reference to the Compiler that contains the op map.
- * @param opPos The position within the op map, which contains the
- * location path expression for this itterator.
+ * @param stepExpr The step expression from the parser.
+ * @param analysis The analysis bits for the total path expression.
*
* @throws javax.xml.transform.TransformerException
*/
- OneStepIteratorForward(Compiler compiler, int opPos, int analysis)
+ OneStepIteratorForward(StepExpr stepExpr, int analysis)
throws javax.xml.transform.TransformerException
{
- super(compiler, opPos, analysis);
- int firstStepPos = compiler.getFirstChildPos(opPos);
+ super(stepExpr, analysis);
- m_axis = WalkerFactory.getAxisFromStep(compiler, firstStepPos);
+ m_axis = stepExpr.getAxis();
}
diff --git a/src/org/apache/xpath/axes/PredicatedNodeTest.java b/src/org/apache/xpath/axes/PredicatedNodeTest.java
index 8655855..c67cbd2 100644
--- a/src/org/apache/xpath/axes/PredicatedNodeTest.java
+++ b/src/org/apache/xpath/axes/PredicatedNodeTest.java
@@ -10,10 +10,13 @@
import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.Predicates;
+import org.apache.xpath.parser.StepExpr;
import org.apache.xpath.patterns.NodeTest;
public abstract class PredicatedNodeTest extends NodeTest implements SubContextList
@@ -140,22 +143,24 @@
*
* @throws javax.xml.transform.TransformerException
*/
- protected void initPredicateInfo(Compiler compiler, int opPos)
+ protected void initPredicateInfo(StepExpr stepExpr)
throws javax.xml.transform.TransformerException
{
-
- int pos = compiler.getFirstPredicateOpPos(opPos);
-
- if(pos > 0)
+ Expression lastChild = (Expression)stepExpr.jjtGetChild(stepExpr.jjtGetNumChildren()-1);
+ if(lastChild instanceof Predicates)
{
- m_predicates = compiler.getCompiledPredicates(pos);
- if(null != m_predicates)
- {
- for(int i = 0; i < m_predicates.length; i++)
- {
- m_predicates[i].exprSetParent(this);
- }
- }
+ Predicates preds = (Predicates)lastChild;
+ int numPreds = preds.jjtGetNumChildren();
+ if(numPreds > 0)
+ {
+ m_predicates = new Expression[numPreds];
+ for(int i = 0; i < m_predicates.length; i++)
+ {
+ Expression pred = (Expression)preds.jjtGetChild(i);
+ m_predicates[i] = pred;
+ pred.exprSetParent(this);
+ }
+ }
}
}
@@ -393,15 +398,15 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
int nPredicates = getPredicateCount();
for (int i = 0; i < nPredicates; i++)
{
- m_predicates[i].fixupVariables(vars, globalsSize);
+ m_predicates[i].fixupVariables(vcs);
}
}
@@ -624,5 +629,63 @@
m_predicates[m_index] = exp;
}
}
-
+
+ public String toString()
+ {
+ int myCount = (null == m_predicates) ? 0 : m_predicates.length;
+ String str = "";
+
+ for(int i = 0; i < myCount; i++)
+ {
+ // java.io.StringWriter sw = new java.io.StringWriter();
+ char buf[] = new char[1024*32];
+ java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
+ java.io.PrintStream ps = new java.io.PrintStream(baos);
+
+ m_predicates[i].dump("", ps);
+ ps.flush();
+ String predString = baos.toString().trim();
+
+ str += "["+predString+"]";
+ }
+ str += " "+super.toString();
+ return str;
+ }
+
+
+// public Node jjtGetChild(int i)
+// {
+// int superclassChildCount = super.jjtGetNumChildren();
+// int myCount = (null == m_predicates) ? 0 : m_predicates.length;
+// if(i < myCount)
+// return m_predicates[i];
+// else
+// return super.jjtGetChild(i-myCount);
+// }
+//
+// public int jjtGetNumChildren()
+// {
+// int myCount = (null == m_predicates) ? 0 : m_predicates.length;
+// return super.jjtGetNumChildren()+myCount;
+// }
+
+ /**
+ * Tell if this node is part of a PathExpr chain. For instance:
+ * <pre>
+ * |UnaryExpr
+ * | PathExpr
+ * | StepExpr
+ * | AxisChild child::
+ * | NodeTest
+ * | NameTest
+ * | QName foo
+ * | Predicates *
+ * </pre><br/>
+ * In this example, UnaryExpr, PathExpr, and StepExpr should all return true.
+ */
+ public boolean isPathExpr()
+ {
+ return true;
+ }
+
}
diff --git a/src/org/apache/xpath/axes/RTFIterator.java b/src/org/apache/xpath/axes/RTFIterator.java
index be1ca70..a53cd69 100644
--- a/src/org/apache/xpath/axes/RTFIterator.java
+++ b/src/org/apache/xpath/axes/RTFIterator.java
@@ -7,17 +7,16 @@
package org.apache.xpath.axes;
import javax.xml.transform.TransformerException;
-import org.apache.xpath.compiler.Compiler;
public class RTFIterator extends OneStepIteratorForward {
- /**
- * Constructor for RTFIterator
- */
- RTFIterator(Compiler compiler, int opPos, int analysis)
- throws TransformerException {
- super(compiler, opPos, analysis);
- }
+// /**
+// * Constructor for RTFIterator
+// */
+// RTFIterator(Compiler compiler, int opPos, int analysis)
+// throws TransformerException {
+// super(compiler, opPos, analysis);
+// }
/**
* Constructor for RTFIterator
diff --git a/src/org/apache/xpath/axes/ReverseAxesWalker.java b/src/org/apache/xpath/axes/ReverseAxesWalker.java
index 9b18536..2a34456 100644
--- a/src/org/apache/xpath/axes/ReverseAxesWalker.java
+++ b/src/org/apache/xpath/axes/ReverseAxesWalker.java
@@ -61,7 +61,6 @@
import org.apache.xpath.axes.LocPathIterator;
import org.apache.xpath.XPath;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.compiler.OpCodes;
import org.apache.xpath.objects.XObject;
import javax.xml.transform.TransformerException;
diff --git a/src/org/apache/xpath/axes/SelfIteratorNoPredicate.java b/src/org/apache/xpath/axes/SelfIteratorNoPredicate.java
index 0f3630c..09a5fcf 100644
--- a/src/org/apache/xpath/axes/SelfIteratorNoPredicate.java
+++ b/src/org/apache/xpath/axes/SelfIteratorNoPredicate.java
@@ -2,7 +2,8 @@
import javax.xml.transform.TransformerException;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
import org.apache.xpath.patterns.NodeTest;
import org.apache.xpath.XPathContext;
import org.apache.xml.utils.PrefixResolver;
@@ -20,21 +21,21 @@
public class SelfIteratorNoPredicate extends LocPathIterator
{
- /**
- * Create a SelfIteratorNoPredicate object.
- *
- * @param compiler A reference to the Compiler that contains the op map.
- * @param opPos The position within the op map, which contains the
- * location path expression for this itterator.
- * @param analysis Analysis bits.
- *
- * @throws javax.xml.transform.TransformerException
- */
- SelfIteratorNoPredicate(Compiler compiler, int opPos, int analysis)
- throws javax.xml.transform.TransformerException
- {
- super(compiler, opPos, analysis, false);
- }
+// /**
+// * Create a SelfIteratorNoPredicate object.
+// *
+// * @param compiler A reference to the Compiler that contains the op map.
+// * @param opPos The position within the op map, which contains the
+// * location path expression for this itterator.
+// * @param analysis Analysis bits.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// SelfIteratorNoPredicate(Compiler compiler, int opPos, int analysis)
+// throws javax.xml.transform.TransformerException
+// {
+// super(compiler, opPos, analysis, false);
+// }
/**
* Create a SelfIteratorNoPredicate object.
@@ -51,6 +52,26 @@
{
super(null);
}
+
+ /**
+ * Execute this iterator, meaning create a clone that can
+ * store state, and initialize it for fast execution from
+ * the current runtime state. When this is called, no actual
+ * query from the current context node is performed.
+ *
+ * @param xctxt The XPath execution context.
+ *
+ * @return An XNodeSet reference that holds this iterator.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+ XObject item = xctxt.getCurrentItem();
+ return item;
+ }
+
/**
diff --git a/src/org/apache/xpath/axes/UnionPathIterator.java b/src/org/apache/xpath/axes/UnionPathIterator.java
index f0d1876..d8fa524 100644
--- a/src/org/apache/xpath/axes/UnionPathIterator.java
+++ b/src/org/apache/xpath/axes/UnionPathIterator.java
@@ -56,20 +56,15 @@
*/
package org.apache.xpath.axes;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.util.Vector;
-
-import javax.xml.transform.TransformerException;
-import org.apache.xml.dtm.Axis;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.compiler.OpCodes;
+import org.apache.xpath.functions.Function;
+import org.apache.xpath.operations.Variable;
+import org.apache.xpath.parser.Node;
/**
* <meta name="usage" content="advanced"/>
@@ -79,8 +74,9 @@
* As each node is iterated via nextNode(), the node is also stored
* in the NodeVector, so that previousNode() can easily be done.
*/
-public class UnionPathIterator extends LocPathIterator
- implements Cloneable, DTMIterator, java.io.Serializable, PathComponent
+public class UnionPathIterator
+ extends LocPathIterator
+ implements Cloneable, DTMIterator, java.io.Serializable, PathComponent
{
/**
@@ -114,7 +110,7 @@
{
int n = m_exprs.length;
DTMIterator newIters[] = new DTMIterator[n];
-
+
for (int i = 0; i < n; i++)
{
DTMIterator iter = m_exprs[i].asIterator(m_execContext, context);
@@ -124,12 +120,12 @@
m_iterators = newIters;
}
}
- catch(Exception e)
+ catch (Exception e)
{
throw new org.apache.xml.utils.WrappedRuntimeException(e);
}
}
-
+
/**
* Add an iterator to the union list.
*
@@ -157,10 +153,10 @@
m_iterators[len] = expr;
}
expr.nextNode();
- if(expr instanceof Expression)
- ((Expression)expr).exprSetParent(this);
+ if (expr instanceof Expression)
+ ((Expression) expr).exprSetParent(this);
}
-
+
/**
* Detaches the iterator from the set which it iterated over, releasing
* any computational resources and placing the iterator in the INVALID
@@ -169,102 +165,85 @@
* exception INVALID_STATE_ERR.
*/
public void detach()
- {
- if(null != m_iterators)
+ {
+ if (null != m_iterators)
{
- int n = m_iterators.length;
- for(int i = 0; i < n; i++)
- {
- m_iterators[i].detach();
- }
- m_iterators = null;
+ int n = m_iterators.length;
+ for (int i = 0; i < n; i++)
+ {
+ m_iterators[i].detach();
+ }
+ m_iterators = null;
}
}
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ if (n instanceof UnionPathIterator)
+ {
+ int nChildren = n.jjtGetNumChildren();
+ for (int j = 0; j < nChildren; j++)
+ {
+ Node child = n.jjtGetChild(j);
+ child.jjtSetParent(this);
+ if (j == 0)
+ jjtAddChild(child, i);
+ else
+ jjtAddChild(child, m_exprs.length); // order doesn't matter!
+ }
+ return;
+ }
+ if (null == m_exprs)
+ {
+ m_exprs = new LocPathIterator[i + 1];
+ }
+ else
+ if (i >= m_exprs.length)
+ {
+
+ // Slow but space conservative.
+ LocPathIterator[] exprs = new LocPathIterator[m_exprs.length + 1];
+
+ System.arraycopy(m_exprs, 0, exprs, 0, m_exprs.length);
+
+ m_exprs = exprs;
+ }
+ n = fixupPrimarys(n);
+
+ // If a function or variable has been reduced from a path
+ // expression, essentially
+ // we need to turn it back into a path expression here! There
+ // might be a way to do this a bit earlier. -sb
+ // if(!(((SimpleNode)n).isPathExpr()))
+ if(n instanceof Variable || n instanceof Function)
+ {
+ FilterExprIteratorSimple feis =
+ new FilterExprIteratorSimple((Expression) n);
+ feis.jjtSetParent(this);
+ n = feis;
+ }
+ m_exprs[i] = (LocPathIterator) n;
+ }
/**
- * Create a UnionPathIterator object, including creation
- * of location path iterators from the opcode list, and call back
- * into the Compiler to create predicate expressions.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- *
- * @throws javax.xml.transform.TransformerException
+ * @see org.apache.xpath.parser.Node#jjtGetChild(int)
*/
- public UnionPathIterator(Compiler compiler, int opPos)
- throws javax.xml.transform.TransformerException
+ public Node jjtGetChild(int i)
{
-
- super();
-
- opPos = compiler.getFirstChildPos(opPos);
-
- loadLocationPaths(compiler, opPos, 0);
+ return m_exprs[i];
}
-
+
/**
- * This will return an iterator capable of handling the union of paths given.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- *
- * @return Object that is derived from LocPathIterator.
- *
- * @throws javax.xml.transform.TransformerException
+ * @see org.apache.xpath.parser.Node#jjtGetNumChildren()
*/
- public static LocPathIterator createUnionIterator(Compiler compiler, int opPos)
- throws javax.xml.transform.TransformerException
+ public int jjtGetNumChildren()
{
- // For the moment, I'm going to first create a full UnionPathIterator, and
- // then see if I can reduce it to a UnionChildIterator. It would obviously
- // be more effecient to just test for the conditions for a UnionChildIterator,
- // and then create that directly.
- UnionPathIterator upi = new UnionPathIterator(compiler, opPos);
- int nPaths = upi.m_exprs.length;
- boolean isAllChildIterators = true;
- for(int i = 0; i < nPaths; i++)
- {
- LocPathIterator lpi = upi.m_exprs[i];
-
- if(lpi.getAxis() != Axis.CHILD)
- {
- isAllChildIterators = false;
- break;
- }
- else
- {
- // check for positional predicates or position function, which won't work.
- if(HasPositionalPredChecker.check(lpi))
- {
- isAllChildIterators = false;
- break;
- }
- }
- }
- if(isAllChildIterators)
- {
- UnionChildIterator uci = new UnionChildIterator();
-
- for(int i = 0; i < nPaths; i++)
- {
- PredicatedNodeTest lpi = upi.m_exprs[i];
- // I could strip the lpi down to a pure PredicatedNodeTest, but
- // I don't think it's worth it. Note that the test can be used
- // as a static object... so it doesn't have to be cloned.
- uci.addNodeTest(lpi);
- }
- return uci;
-
- }
- else
- return upi;
+ return m_exprs.length;
}
-
+
/**
* Get the analysis bits for this walker, as defined in the WalkerFactory.
* @return One of WalkerFactory#BIT_DESCENDANT, etc.
@@ -272,21 +251,21 @@
public int getAnalysisBits()
{
int bits = 0;
-
+
if (m_exprs != null)
{
int n = m_exprs.length;
for (int i = 0; i < n; i++)
{
- int bit = m_exprs[i].getAnalysisBits();
+ int bit = m_exprs[i].getAnalysisBits();
bits |= bit;
}
}
return bits;
}
-
+
/**
* Read the object from a serialization stream.
*
@@ -296,12 +275,12 @@
* @throws javax.xml.transform.TransformerException
*/
private void readObject(java.io.ObjectInputStream stream)
- throws java.io.IOException, javax.xml.transform.TransformerException
+ throws java.io.IOException, javax.xml.transform.TransformerException
{
try
{
stream.defaultReadObject();
- m_clones = new IteratorPool(this);
+ m_clones = new IteratorPool(this);
}
catch (ClassNotFoundException cnfe)
{
@@ -321,109 +300,56 @@
{
UnionPathIterator clone = (UnionPathIterator) super.clone();
-// if (m_iterators != null)
-// {
-// int n = m_iterators.length;
-//
-// clone.m_iterators = new LocPathIterator[n];
-//
-// for (int i = 0; i < n; i++)
-// {
-// clone.m_iterators[i] = (LocPathIterator)m_iterators[i].clone();
-// }
-// }
+ // %REVIEW% Not 100% sure this clone should be done here! -sb
+ if(clone.m_iterators == m_iterators && null != m_iterators)
+ {
+ DTMIterator[] clonedIters = new DTMIterator[m_iterators.length];
+ clone.m_iterators = clonedIters;
+ for (int i = 0; i < m_iterators.length; i++)
+ {
+ clonedIters[i] = (DTMIterator)((Expression)m_iterators[i]).cloneDeep();
+ }
+ }
+
return clone;
}
-
-
- /**
- * Create a new location path iterator.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- *
- * @return New location path iterator.
- *
- * @throws javax.xml.transform.TransformerException
- */
- protected LocPathIterator createDTMIterator(
- Compiler compiler, int opPos) throws javax.xml.transform.TransformerException
- {
- LocPathIterator lpi = (LocPathIterator)WalkerFactory.newDTMIterator(compiler, opPos,
- (compiler.getLocationPathDepth() <= 0));
- return lpi;
- }
/**
- * Initialize the location path iterators. Recursive.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- * @param count The insert position of the iterator.
- *
- * @throws javax.xml.transform.TransformerException
+ * Get a cloned Iterator that is reset to the beginning
+ * of the query.
+ *
+ * @return A cloned NodeIterator set of the start of the query.
+ *
+ * @throws CloneNotSupportedException
*/
- protected void loadLocationPaths(Compiler compiler, int opPos, int count)
- throws javax.xml.transform.TransformerException
+ public DTMIterator cloneWithReset() throws CloneNotSupportedException
{
- // TODO: Handle unwrapped FilterExpr
- int steptype = compiler.getOpMap()[opPos];
+ UnionPathIterator clone = (UnionPathIterator) super.cloneWithReset();
- if (steptype == OpCodes.OP_LOCATIONPATH)
- {
- loadLocationPaths(compiler, compiler.getNextOpPos(opPos), count + 1);
+ clone.resetProximityPositions();
- m_exprs[count] = createDTMIterator(compiler, opPos);
- m_exprs[count].exprSetParent(this);
- }
- else
- {
-
- // Have to check for unwrapped functions, which the LocPathIterator
- // doesn't handle.
- switch (steptype)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- loadLocationPaths(compiler, compiler.getNextOpPos(opPos), count + 1);
-
- WalkingIterator iter =
- new WalkingIterator(compiler.getNamespaceContext());
- iter.exprSetParent(this);
-
- if(compiler.getLocationPathDepth() <= 0)
- iter.setIsTopLevel(true);
-
- iter.m_firstWalker = new org.apache.xpath.axes.FilterExprWalker(iter);
-
- iter.m_firstWalker.init(compiler, opPos, steptype);
-
- m_exprs[count] = iter;
- break;
- default :
- m_exprs = new LocPathIterator[count];
- }
- }
+ return clone;
}
/**
* Returns the next node in the set and advances the position of the
* iterator in the set. After a DTMIterator is created, the first call
* to nextNode() returns the first node in the set.
+ *
* @return The next <code>Node</code> in the set being iterated over, or
* <code>null</code> if there are no more members in that set.
*/
public int nextNode()
{
- if(m_foundLast)
- return DTM.NULL;
+ if (m_foundLast)
+ return DTM.NULL;
+
+ if (DTM.NULL == m_lastFetched)
+ {
+ resetProximityPositions();
+ }
// Loop through the iterators getting the current fetched
// node, and get the earliest occuring in document order
@@ -433,42 +359,70 @@
{
int n = m_iterators.length;
int iteratorUsed = -1;
+ int savedIteratorUsed = -1;
+ int savedEarliestNode = DTM.NULL;
- for (int i = 0; i < n; i++)
+ while (true)
{
- int node = m_iterators[i].getCurrentNode();
-
- if (DTM.NULL == node)
- continue;
- else if (DTM.NULL == earliestNode)
+ for (int i = 0; i < n; i++)
{
- iteratorUsed = i;
- earliestNode = node;
- }
- else
- {
- if (node == earliestNode)
- {
+ int node = m_iterators[i].getCurrentNode();
- // Found a duplicate, so skip past it.
- m_iterators[i].nextNode();
- }
+ if (DTM.NULL == node)
+ continue;
else
- {
- DTM dtm = getDTM(node);
-
- if (dtm.isNodeAfter(node, earliestNode))
+ if (DTM.NULL == earliestNode)
{
iteratorUsed = i;
earliestNode = node;
}
- }
+ else
+ {
+ if (node == earliestNode)
+ {
+
+ // Found a duplicate, so skip past it.
+ // %REVIEW% Make sure this is really what we
+ // want to do for XPath 2.0.
+ m_iterators[i].nextNode();
+ }
+ else
+ {
+ DTM dtm = getDTM(node);
+
+ if (dtm.isNodeAfter(node, earliestNode))
+ {
+ iteratorUsed = i;
+ earliestNode = node;
+ }
+ }
+ }
}
+
+ if (DTM.NULL == earliestNode)
+ break;
+
+ else
+ if (getPredicateCount() == 0)
+ {
+ m_iterators[iteratorUsed].nextNode();
+ break;
+ }
+ else
+ {
+ m_iterators[iteratorUsed].nextNode();
+ int acceptence = acceptNode(earliestNode);
+
+ if (DTMIterator.FILTER_ACCEPT == acceptence)
+ break;
+
+ earliestNode = DTM.NULL;
+ }
}
if (DTM.NULL != earliestNode)
{
- m_iterators[iteratorUsed].nextNode();
+ // m_iterators[iteratorUsed].nextNode();
incrementCurrentPos();
}
@@ -480,10 +434,11 @@
return earliestNode;
}
-
+
/**
* This function is used to fixup variables from QNames to stack frame
* indexes at stylesheet build time.
+ *
* @param vars List of QNames that correspond to variables. This list
* should be searched backwards for the first qualified name that
* corresponds to the variable reference qname. The position of the
@@ -491,15 +446,15 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- for (int i = 0; i < m_exprs.length; i++)
+ for (int i = 0; i < m_exprs.length; i++)
{
- m_exprs[i].fixupVariables(vars, globalsSize);
+ m_exprs[i].fixupVariables(vcs);
}
-
+
}
-
+
/**
* The location path iterators, one for each
* <a href="http://www.w3.org/TR/xpath#NT-LocationPath">location
@@ -508,7 +463,6 @@
*/
protected LocPathIterator[] m_exprs;
-
/**
* The location path iterators, one for each
* <a href="http://www.w3.org/TR/xpath#NT-LocationPath">location
@@ -516,7 +470,7 @@
* @serial
*/
protected DTMIterator[] m_iterators;
-
+
/**
* Returns the axis being iterated, if it is known.
*
@@ -528,16 +482,16 @@
// Could be smarter.
return -1;
}
-
+
class iterOwner implements ExpressionOwner
{
- int m_index;
-
- iterOwner(int index)
- {
- m_index = index;
- }
-
+ int m_index;
+
+ iterOwner(int index)
+ {
+ m_index = index;
+ }
+
/**
* @see ExpressionOwner#getExpression()
*/
@@ -551,23 +505,23 @@
*/
public void setExpression(Expression exp)
{
-
- if(!(exp instanceof LocPathIterator))
- {
- // Yuck. Need FilterExprIter. Or make it so m_exprs can be just
- // plain expressions?
- WalkingIterator wi = new WalkingIterator(getPrefixResolver());
- FilterExprWalker few = new FilterExprWalker(wi);
- wi.setFirstWalker(few);
- few.setInnerExpression(exp);
- wi.exprSetParent(UnionPathIterator.this);
- few.exprSetParent(wi);
- exp.exprSetParent(few);
- exp = wi;
- }
- else
- exp.exprSetParent(UnionPathIterator.this);
- m_exprs[m_index] = (LocPathIterator)exp;
+
+ if (!(exp instanceof LocPathIterator))
+ {
+ // Yuck. Need FilterExprIter. Or make it so m_exprs can be just
+ // plain expressions?
+ WalkingIterator wi = new WalkingIterator(getPrefixResolver());
+ FilterExprWalker few = new FilterExprWalker(wi);
+ wi.setFirstWalker(few);
+ few.setInnerExpression(exp);
+ wi.exprSetParent(UnionPathIterator.this);
+ few.exprSetParent(wi);
+ exp.exprSetParent(few);
+ exp = wi;
+ }
+ else
+ exp.exprSetParent(UnionPathIterator.this);
+ m_exprs[m_index] = (LocPathIterator) exp;
}
}
@@ -577,49 +531,49 @@
*/
public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
{
- if(visitor.visitUnionPath(owner, this))
- {
- if(null != m_exprs)
- {
- int n = m_exprs.length;
- for(int i = 0; i < n; i++)
- {
- m_exprs[i].callVisitors(new iterOwner(i), visitor);
- }
- }
- }
- }
-
- /**
- * @see Expression#deepEquals(Expression)
- */
- public boolean deepEquals(Expression expr)
+ if (visitor.visitUnionPath(owner, this))
{
- if (!super.deepEquals(expr))
- return false;
-
- UnionPathIterator upi = (UnionPathIterator) expr;
-
if (null != m_exprs)
{
int n = m_exprs.length;
-
- if((null == upi.m_exprs) || (upi.m_exprs.length != n))
- return false;
-
for (int i = 0; i < n; i++)
{
- if(!m_exprs[i].deepEquals(upi.m_exprs[i]))
- return false;
+ m_exprs[i].callVisitors(new iterOwner(i), visitor);
}
}
- else if (null != upi.m_exprs)
+ }
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ if (!super.deepEquals(expr))
+ return false;
+
+ UnionPathIterator upi = (UnionPathIterator) expr;
+
+ if (null != m_exprs)
+ {
+ int n = m_exprs.length;
+
+ if ((null == upi.m_exprs) || (upi.m_exprs.length != n))
+ return false;
+
+ for (int i = 0; i < n; i++)
{
+ if (!m_exprs[i].deepEquals(upi.m_exprs[i]))
return false;
}
-
- return true;
}
+ else
+ if (null != upi.m_exprs)
+ {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/src/org/apache/xpath/axes/WalkerFactory.java b/src/org/apache/xpath/axes/WalkerFactory.java
index 8db21c1..c884745 100644
--- a/src/org/apache/xpath/axes/WalkerFactory.java
+++ b/src/org/apache/xpath/axes/WalkerFactory.java
@@ -56,769 +56,85 @@
*/
package org.apache.xpath.axes;
-import org.apache.xpath.compiler.OpCodes;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xpath.compiler.FunctionTable;
-import org.apache.xpath.patterns.NodeTest;
-import org.apache.xpath.patterns.StepPattern;
-import org.apache.xpath.patterns.ContextMatchStepPattern;
-import org.apache.xpath.patterns.FunctionPattern;
-import org.apache.xpath.Expression;
-import org.apache.xpath.objects.XNumber;
+import javax.xml.transform.TransformerException;
import org.apache.xalan.res.XSLMessages;
-import org.apache.xpath.res.XPATHErrorResources;
-
+import org.apache.xml.dtm.Axis;
import org.apache.xml.dtm.DTMFilter;
import org.apache.xml.dtm.DTMIterator;
-import org.apache.xml.dtm.Axis;
+import org.apache.xpath.Expression;
+import org.apache.xpath.functions.FuncLast;
+import org.apache.xpath.functions.FuncPosition;
+import org.apache.xpath.functions.Function;
+import org.apache.xpath.objects.XNumber;
+import org.apache.xpath.operations.Variable;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.NodeTest;
+import org.apache.xpath.parser.PathExpr;
+import org.apache.xpath.parser.PatternAxis;
+import org.apache.xpath.parser.Predicates;
+import org.apache.xpath.parser.StepExpr;
+import org.apache.xpath.res.XPATHErrorResources;
-/**
- * This class is both a factory for XPath location path expressions,
- * which are built from the opcode map output, and an analysis engine
- * for the location path expressions in order to provide optimization hints.
- */
public class WalkerFactory
{
-
- /**
- * <meta name="usage" content="advanced"/>
- * This method is for building an array of possible levels
- * where the target element(s) could be found for a match.
- * @param xpath The xpath that is executing.
- * @param context The current source tree context node.
- *
- * @param lpi The owning location path iterator.
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param stepOpCodePos The opcode position for the step.
- *
- * @return non-null AxesWalker derivative.
- *
- * @throws javax.xml.transform.TransformerException
- */
- static AxesWalker loadOneWalker(
- WalkingIterator lpi, Compiler compiler, int stepOpCodePos)
- throws javax.xml.transform.TransformerException
- {
-
- AxesWalker firstWalker = null;
- int stepType = compiler.getOpMap()[stepOpCodePos];
-
- if (stepType != OpCodes.ENDOP)
- {
-
- // m_axesWalkers = new AxesWalker[1];
- // As we unwind from the recursion, create the iterators.
- firstWalker = createDefaultWalker(compiler, stepType, lpi, 0);
-
- firstWalker.init(compiler, stepOpCodePos, stepType);
- }
-
- return firstWalker;
- }
-
- /**
- * <meta name="usage" content="advanced"/>
- * This method is for building an array of possible levels
- * where the target element(s) could be found for a match.
- * @param xpath The xpath that is executing.
- * @param context The current source tree context node.
- *
- * @param lpi The owning location path iterator object.
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param stepOpCodePos The opcode position for the step.
- * @param stepIndex The top-level step index withing the iterator.
- *
- * @return non-null AxesWalker derivative.
- *
- * @throws javax.xml.transform.TransformerException
- */
- static AxesWalker loadWalkers(
- WalkingIterator lpi, Compiler compiler, int stepOpCodePos, int stepIndex)
- throws javax.xml.transform.TransformerException
- {
-
- int stepType;
- AxesWalker firstWalker = null;
- AxesWalker walker, prevWalker = null;
- int ops[] = compiler.getOpMap();
- int analysis = analyze(compiler, stepOpCodePos, stepIndex);
-
- while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
- {
- walker = createDefaultWalker(compiler, stepOpCodePos, lpi, analysis);
-
- walker.init(compiler, stepOpCodePos, stepType);
- walker.exprSetParent(lpi);
-
- // walker.setAnalysis(analysis);
- if (null == firstWalker)
- {
- firstWalker = walker;
- }
- else
- {
- prevWalker.setNextWalker(walker);
- walker.setPrevWalker(prevWalker);
- }
-
- prevWalker = walker;
- stepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
-
- if (stepOpCodePos < 0)
- break;
- }
-
- return firstWalker;
- }
-
public static boolean isSet(int analysis, int bits)
{
return (0 != (analysis & bits));
}
-
- public static void diagnoseIterator(String name, int analysis, Compiler compiler)
- {
- System.out.println(compiler.toString()+", "+name+", "
- + Integer.toBinaryString(analysis) + ", "
- + getAnalysisString(analysis));
- }
/**
- * Create a new LocPathIterator iterator. The exact type of iterator
- * returned is based on an analysis of the XPath operations.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param opPos The position of the operation code for this itterator.
- *
- * @return non-null reference to a LocPathIterator or derivative.
- *
- * @throws javax.xml.transform.TransformerException
+ * Get a corresponding BIT_XXX from an axis.
+ * @param axis One of Axis.ANCESTOR, etc.
+ * @return One of BIT_ANCESTOR, etc.
*/
- public static DTMIterator newDTMIterator(
- Compiler compiler, int opPos,
- boolean isTopLevel)
- throws javax.xml.transform.TransformerException
+ static public int getAnalysisBitFromAxes(int axis)
{
-
- 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) &&
- isWild(analysis) && !hasPredicate(analysis))
+ switch (axis) // Generate new traverser
{
- if (DEBUG_ITERATOR_CREATION)
- diagnoseIterator("SelfIteratorNoPredicate", analysis, compiler);
-
- // Then use a simple iteration of the attributes, with node test
- // and predicate testing.
- iter = new SelfIteratorNoPredicate(compiler, opPos, analysis);
- }
- // Is the iteration exactly one child step?
- else if (walksChildrenOnly(analysis) && isOneStep)
- {
-
- // Does the pattern specify *any* child with no predicate? (i.e. select="child::node()".
- if (isWild(analysis) && !hasPredicate(analysis))
- {
- if (DEBUG_ITERATOR_CREATION)
- diagnoseIterator("ChildIterator", analysis, compiler);
-
- // Use simple child iteration without any test.
- iter = new ChildIterator(compiler, opPos, analysis);
- }
- else
- {
- if (DEBUG_ITERATOR_CREATION)
- diagnoseIterator("ChildTestIterator", analysis, compiler);
-
- // Else use simple node test iteration with predicate test.
- iter = new ChildTestIterator(compiler, opPos, analysis);
- }
- }
- // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
- else if (isOneStep && walksAttributes(analysis))
- {
- if (DEBUG_ITERATOR_CREATION)
- diagnoseIterator("AttributeIterator", analysis, compiler);
-
- // Then use a simple iteration of the attributes, with node test
- // and predicate testing.
- iter = new AttributeIterator(compiler, opPos, analysis);
- }
- else if(isOneStep && !walksFilteredList(analysis))
- {
- if( !walksNamespaces(analysis)
- && (walksInDocOrder(analysis) || isSet(analysis, BIT_PARENT)))
- {
- if (false || DEBUG_ITERATOR_CREATION)
- diagnoseIterator("OneStepIteratorForward", analysis, compiler);
-
- // Then use a simple iteration of the attributes, with node test
- // and predicate testing.
- iter = new OneStepIteratorForward(compiler, opPos, analysis);
- }
- else
- {
- if (false || DEBUG_ITERATOR_CREATION)
- diagnoseIterator("OneStepIterator", analysis, compiler);
-
- // Then use a simple iteration of the attributes, with node test
- // and predicate testing.
- iter = new OneStepIterator(compiler, opPos, analysis);
- }
- }
-
- // Analysis of "//center":
- // bits: 1001000000001010000000000000011
- // count: 3
- // root
- // child:node()
- // BIT_DESCENDANT_OR_SELF
- // It's highly possible that we should have a seperate bit set for
- // "//foo" patterns.
- // For at least the time being, we can't optimize patterns like
- // "//table[3]", because this has to be analyzed as
- // "/descendant-or-self::node()/table[3]" in order for the indexes
- // to work right.
- else if (isOptimizableForDescendantIterator(compiler, firstStepPos, 0)
- // && getStepCount(analysis) <= 3
- // && walksDescendants(analysis)
- // && walksSubtreeOnlyFromRootOrContext(analysis)
- )
- {
- if (DEBUG_ITERATOR_CREATION)
- diagnoseIterator("DescendantIterator", analysis, compiler);
-
- iter = new DescendantIterator(compiler, opPos, analysis);
- }
- else
- {
- if(isNaturalDocOrder(compiler, firstStepPos, 0, analysis))
- {
- if (false || DEBUG_ITERATOR_CREATION)
- {
- diagnoseIterator("WalkingIterator", analysis, compiler);
- }
-
- iter = new WalkingIterator(compiler, opPos, analysis, true);
- }
- else
- {
-// if (DEBUG_ITERATOR_CREATION)
-// diagnoseIterator("MatchPatternIterator", analysis, compiler);
-//
-// return new MatchPatternIterator(compiler, opPos, analysis);
- if (DEBUG_ITERATOR_CREATION)
- diagnoseIterator("WalkingIteratorSorted", analysis, compiler);
-
- iter = new WalkingIteratorSorted(compiler, opPos, analysis, true);
- }
- }
- if(iter instanceof LocPathIterator)
- ((LocPathIterator)iter).setIsTopLevel(isTopLevel);
-
- return iter;
- }
-
- /**
- * Special purpose function to see if we can optimize the pattern for
- * a DescendantIterator.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param stepOpCodePos The opcode position for the step.
- * @param stepIndex The top-level step index withing the iterator.
- *
- * @return 32 bits as an integer that give information about the location
- * path as a whole.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public static int getAxisFromStep(
- Compiler compiler, int stepOpCodePos)
- throws javax.xml.transform.TransformerException
- {
-
- int ops[] = compiler.getOpMap();
- int stepType = ops[stepOpCodePos];
-
- switch (stepType)
- {
- case OpCodes.FROM_FOLLOWING :
- return Axis.FOLLOWING;
- case OpCodes.FROM_FOLLOWING_SIBLINGS :
- return Axis.FOLLOWINGSIBLING;
- case OpCodes.FROM_PRECEDING :
- return Axis.PRECEDING;
- case OpCodes.FROM_PRECEDING_SIBLINGS :
- return Axis.PRECEDINGSIBLING;
- case OpCodes.FROM_PARENT :
- return Axis.PARENT;
- case OpCodes.FROM_NAMESPACE :
- return Axis.NAMESPACE;
- case OpCodes.FROM_ANCESTORS :
- return Axis.ANCESTOR;
- case OpCodes.FROM_ANCESTORS_OR_SELF :
- return Axis.ANCESTORORSELF;
- case OpCodes.FROM_ATTRIBUTES :
- return Axis.ATTRIBUTE;
- case OpCodes.FROM_ROOT :
- return Axis.ROOT;
- case OpCodes.FROM_CHILDREN :
- return Axis.CHILD;
- case OpCodes.FROM_DESCENDANTS_OR_SELF :
- return Axis.DESCENDANTORSELF;
- case OpCodes.FROM_DESCENDANTS :
- return Axis.DESCENDANT;
- case OpCodes.FROM_SELF :
- return Axis.SELF;
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- case OpCodes.OP_VARIABLE :
- return Axis.FILTEREDLIST;
- }
-
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
- //+ stepType);
- }
-
- /**
- * Get a corresponding BIT_XXX from an axis.
- * @param axis One of Axis.ANCESTOR, etc.
- * @return One of BIT_ANCESTOR, etc.
- */
- static public int getAnalysisBitFromAxes(int axis)
- {
- switch (axis) // Generate new traverser
- {
- case Axis.ANCESTOR :
- return BIT_ANCESTOR;
- case Axis.ANCESTORORSELF :
- return BIT_ANCESTOR_OR_SELF;
- case Axis.ATTRIBUTE :
- return BIT_ATTRIBUTE;
- case Axis.CHILD :
- return BIT_CHILD;
- case Axis.DESCENDANT :
- return BIT_DESCENDANT;
- case Axis.DESCENDANTORSELF :
- return BIT_DESCENDANT_OR_SELF;
- case Axis.FOLLOWING :
- return BIT_FOLLOWING;
- case Axis.FOLLOWINGSIBLING :
- return BIT_FOLLOWING_SIBLING;
- case Axis.NAMESPACE :
- case Axis.NAMESPACEDECLS :
- return BIT_NAMESPACE;
- case Axis.PARENT :
- return BIT_PARENT;
- case Axis.PRECEDING :
- return BIT_PRECEDING;
- case Axis.PRECEDINGSIBLING :
- return BIT_PRECEDING_SIBLING;
- case Axis.SELF :
- return BIT_SELF;
- case Axis.ALLFROMNODE :
- return BIT_DESCENDANT_OR_SELF;
- // case Axis.PRECEDINGANDANCESTOR :
- case Axis.DESCENDANTSFROMROOT :
- case Axis.ALL :
- case Axis.DESCENDANTSORSELFFROMROOT :
- return BIT_ANY_DESCENDANT_FROM_ROOT;
- case Axis.ROOT :
- return BIT_ROOT;
- case Axis.FILTEREDLIST :
- return BIT_FILTER;
- default :
- return BIT_FILTER;
- }
- }
-
- static boolean functionProximateOrContainsProximate(Compiler compiler,
- int opPos)
- {
- int endFunc = opPos + compiler.getOp(opPos + 1) - 1;
- opPos = compiler.getFirstChildPos(opPos);
- int funcID = compiler.getOp(opPos);
- // System.out.println("funcID: "+funcID);
- // System.out.println("opPos: "+opPos);
- // System.out.println("endFunc: "+endFunc);
- switch(funcID)
- {
- case FunctionTable.FUNC_LAST:
- case FunctionTable.FUNC_POSITION:
- return true;
- default:
- opPos++;
- int i = 0;
- for (int p = opPos; p < endFunc; p = compiler.getNextOpPos(p), i++)
- {
- int innerExprOpPos = p+2;
- int argOp = compiler.getOp(innerExprOpPos);
- boolean prox = isProximateInnerExpr(compiler, innerExprOpPos);
- if(prox)
- return true;
- }
-
- }
- return false;
- }
-
- static boolean isProximateInnerExpr(Compiler compiler, int opPos)
- {
- int op = compiler.getOp(opPos);
- int innerExprOpPos = opPos+2;
- switch(op)
- {
- case OpCodes.OP_ARGUMENT:
- if(isProximateInnerExpr(compiler, innerExprOpPos))
- return true;
- break;
- case OpCodes.OP_VARIABLE:
- case OpCodes.OP_NUMBERLIT:
- case OpCodes.OP_LITERAL:
- case OpCodes.OP_LOCATIONPATH:
- break; // OK
- case OpCodes.OP_FUNCTION:
- boolean isProx = functionProximateOrContainsProximate(compiler, opPos);
- if(isProx)
- return true;
- break;
- case OpCodes.OP_GT:
- case OpCodes.OP_GTE:
- case OpCodes.OP_LT:
- case OpCodes.OP_LTE:
- case OpCodes.OP_EQUALS:
- int leftPos = compiler.getFirstChildPos(op);
- int rightPos = compiler.getNextOpPos(leftPos);
- isProx = isProximateInnerExpr(compiler, leftPos);
- if(isProx)
- return true;
- isProx = isProximateInnerExpr(compiler, rightPos);
- if(isProx)
- return true;
- break;
- default:
- return true; // be conservative...
- }
- return false;
- }
-
- /**
- * Tell if the predicates need to have proximity knowledge.
- */
- public static boolean mightBeProximate(Compiler compiler, int opPos, int stepType)
- throws javax.xml.transform.TransformerException
- {
-
- boolean mightBeProximate = false;
- int argLen;
-
- switch (stepType)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- argLen = compiler.getArgLength(opPos);
- break;
- default :
- argLen = compiler.getArgLengthOfStep(opPos);
- }
-
- int predPos = compiler.getFirstPredicateOpPos(opPos);
- int count = 0;
-
- while (OpCodes.OP_PREDICATE == compiler.getOp(predPos))
- {
- count++;
-
- int innerExprOpPos = predPos+2;
- int predOp = compiler.getOp(innerExprOpPos);
-
- switch(predOp)
- {
- case OpCodes.OP_VARIABLE:
- return true; // Would need more smarts to tell if this could be a number or not!
- case OpCodes.OP_LOCATIONPATH:
- // OK.
- break;
- case OpCodes.OP_NUMBER:
- case OpCodes.OP_NUMBERLIT:
- return true; // that's all she wrote!
- case OpCodes.OP_FUNCTION:
- boolean isProx
- = functionProximateOrContainsProximate(compiler, innerExprOpPos);
- if(isProx)
- return true;
- break;
- case OpCodes.OP_GT:
- case OpCodes.OP_GTE:
- case OpCodes.OP_LT:
- case OpCodes.OP_LTE:
- case OpCodes.OP_EQUALS:
- int leftPos = compiler.getFirstChildPos(innerExprOpPos);
- int rightPos = compiler.getNextOpPos(leftPos);
- isProx = isProximateInnerExpr(compiler, leftPos);
- if(isProx)
- return true;
- isProx = isProximateInnerExpr(compiler, rightPos);
- if(isProx)
- return true;
- break;
- default:
- return true; // be conservative...
- }
-
- predPos = compiler.getNextOpPos(predPos);
- }
-
- return mightBeProximate;
- }
-
- /**
- * Special purpose function to see if we can optimize the pattern for
- * a DescendantIterator.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param stepOpCodePos The opcode position for the step.
- * @param stepIndex The top-level step index withing the iterator.
- *
- * @return 32 bits as an integer that give information about the location
- * path as a whole.
- *
- * @throws javax.xml.transform.TransformerException
- */
- private static boolean isOptimizableForDescendantIterator(
- Compiler compiler, int stepOpCodePos, int stepIndex)
- throws javax.xml.transform.TransformerException
- {
-
- int stepType;
- int ops[] = compiler.getOpMap();
- int stepCount = 0;
- boolean foundDorDS = false;
- boolean foundSelf = false;
- boolean foundDS = false;
-
- int nodeTestType = OpCodes.NODETYPE_NODE;
-
- while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
- {
- // The DescendantIterator can only do one node test. If there's more
- // than one, use another iterator.
- if(nodeTestType != OpCodes.NODETYPE_NODE && nodeTestType != OpCodes.NODETYPE_ROOT)
- return false;
-
- stepCount++;
- if(stepCount > 3)
- return false;
-
- boolean mightBeProximate = mightBeProximate(compiler, stepOpCodePos, stepType);
- if(mightBeProximate)
- return false;
-
- switch (stepType)
- {
- case OpCodes.FROM_FOLLOWING :
- case OpCodes.FROM_FOLLOWING_SIBLINGS :
- case OpCodes.FROM_PRECEDING :
- case OpCodes.FROM_PRECEDING_SIBLINGS :
- case OpCodes.FROM_PARENT :
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- case OpCodes.FROM_NAMESPACE :
- case OpCodes.FROM_ANCESTORS :
- case OpCodes.FROM_ANCESTORS_OR_SELF :
- case OpCodes.FROM_ATTRIBUTES :
- case OpCodes.MATCH_ATTRIBUTE :
- case OpCodes.MATCH_ANY_ANCESTOR :
- case OpCodes.MATCH_IMMEDIATE_ANCESTOR :
- return false;
- case OpCodes.FROM_ROOT :
- if(1 != stepCount)
- return false;
- break;
- case OpCodes.FROM_CHILDREN :
- if(!foundDS && !(foundDorDS && foundSelf))
- return false;
- break;
- case OpCodes.FROM_DESCENDANTS_OR_SELF :
- foundDS = true;
- case OpCodes.FROM_DESCENDANTS :
- if(3 == stepCount)
- return false;
- foundDorDS = true;
- break;
- case OpCodes.FROM_SELF :
- if(1 != stepCount)
- return false;
- foundSelf = true;
- break;
+ case Axis.ANCESTOR :
+ return BIT_ANCESTOR;
+ case Axis.ANCESTORORSELF :
+ return BIT_ANCESTOR_OR_SELF;
+ case Axis.ATTRIBUTE :
+ return BIT_ATTRIBUTE;
+ case Axis.CHILD :
+ return BIT_CHILD;
+ case Axis.DESCENDANT :
+ return BIT_DESCENDANT;
+ case Axis.DESCENDANTORSELF :
+ return BIT_DESCENDANT_OR_SELF;
+ case Axis.FOLLOWING :
+ return BIT_FOLLOWING;
+ case Axis.FOLLOWINGSIBLING :
+ return BIT_FOLLOWING_SIBLING;
+ case Axis.NAMESPACE :
+ case Axis.NAMESPACEDECLS :
+ return BIT_NAMESPACE;
+ case Axis.PARENT :
+ return BIT_PARENT;
+ case Axis.PRECEDING :
+ return BIT_PRECEDING;
+ case Axis.PRECEDINGSIBLING :
+ return BIT_PRECEDING_SIBLING;
+ case Axis.SELF :
+ return BIT_SELF;
+ case Axis.ALLFROMNODE :
+ return BIT_DESCENDANT_OR_SELF;
+ // case Axis.PRECEDINGANDANCESTOR :
+ case Axis.DESCENDANTSFROMROOT :
+ case Axis.ALL :
+ case Axis.DESCENDANTSORSELFFROMROOT :
+ return BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF | BIT_ANY_DESCENDANT_FROM_ROOT;
+ case Axis.ROOT :
+ return BIT_ROOT;
+ case Axis.FILTEREDLIST :
+ return BIT_FILTER;
default :
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
- // + stepType);
- }
-
- nodeTestType = compiler.getStepTestType(stepOpCodePos);
-
- int nextStepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
-
- if (nextStepOpCodePos < 0)
- break;
-
- if(OpCodes.ENDOP != ops[nextStepOpCodePos])
- {
- if(compiler.countPredicates(stepOpCodePos) > 0)
- {
- return false;
- }
- }
-
- stepOpCodePos = nextStepOpCodePos;
+ return BIT_FILTER;
}
-
- return true;
}
/**
- * Analyze the location path and return 32 bits that give information about
- * the location path as a whole. See the BIT_XXX constants for meaning about
- * each of the bits.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param stepOpCodePos The opcode position for the step.
- * @param stepIndex The top-level step index withing the iterator.
- *
- * @return 32 bits as an integer that give information about the location
- * path as a whole.
- *
- * @throws javax.xml.transform.TransformerException
- */
- private static int analyze(
- Compiler compiler, int stepOpCodePos, int stepIndex)
- throws javax.xml.transform.TransformerException
- {
-
- int stepType;
- int ops[] = compiler.getOpMap();
- int stepCount = 0;
- int analysisResult = 0x00000000; // 32 bits of analysis
-
- while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
- {
- stepCount++;
-
- // String namespace = compiler.getStepNS(stepOpCodePos);
- // boolean isNSWild = (null != namespace)
- // ? namespace.equals(NodeTest.WILD) : false;
- // String localname = compiler.getStepLocalName(stepOpCodePos);
- // boolean isWild = (null != localname) ? localname.equals(NodeTest.WILD) : false;
- boolean predAnalysis = analyzePredicate(compiler, stepOpCodePos,
- stepType);
-
- if (predAnalysis)
- analysisResult |= BIT_PREDICATE;
-
- switch (stepType)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- analysisResult |= BIT_FILTER;
- break;
- case OpCodes.FROM_ROOT :
- analysisResult |= BIT_ROOT;
- break;
- case OpCodes.FROM_ANCESTORS :
- analysisResult |= BIT_ANCESTOR;
- break;
- case OpCodes.FROM_ANCESTORS_OR_SELF :
- analysisResult |= BIT_ANCESTOR_OR_SELF;
- break;
- case OpCodes.FROM_ATTRIBUTES :
- analysisResult |= BIT_ATTRIBUTE;
- break;
- case OpCodes.FROM_NAMESPACE :
- analysisResult |= BIT_NAMESPACE;
- break;
- case OpCodes.FROM_CHILDREN :
- analysisResult |= BIT_CHILD;
- break;
- case OpCodes.FROM_DESCENDANTS :
- analysisResult |= BIT_DESCENDANT;
- break;
- case OpCodes.FROM_DESCENDANTS_OR_SELF :
-
- // Use a special bit to to make sure we get the right analysis of "//foo".
- if (2 == stepCount && BIT_ROOT == analysisResult)
- {
- analysisResult |= BIT_ANY_DESCENDANT_FROM_ROOT;
- }
-
- analysisResult |= BIT_DESCENDANT_OR_SELF;
- break;
- case OpCodes.FROM_FOLLOWING :
- analysisResult |= BIT_FOLLOWING;
- break;
- case OpCodes.FROM_FOLLOWING_SIBLINGS :
- analysisResult |= BIT_FOLLOWING_SIBLING;
- break;
- case OpCodes.FROM_PRECEDING :
- analysisResult |= BIT_PRECEDING;
- break;
- case OpCodes.FROM_PRECEDING_SIBLINGS :
- analysisResult |= BIT_PRECEDING_SIBLING;
- break;
- case OpCodes.FROM_PARENT :
- analysisResult |= BIT_PARENT;
- break;
- case OpCodes.FROM_SELF :
- analysisResult |= BIT_SELF;
- break;
- case OpCodes.MATCH_ATTRIBUTE :
- analysisResult |= (BIT_MATCH_PATTERN | BIT_ATTRIBUTE);
- break;
- case OpCodes.MATCH_ANY_ANCESTOR :
- analysisResult |= (BIT_MATCH_PATTERN | BIT_ANCESTOR);
- break;
- case OpCodes.MATCH_IMMEDIATE_ANCESTOR :
- analysisResult |= (BIT_MATCH_PATTERN | BIT_PARENT);
- break;
- default :
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
- //+ stepType);
- }
-
- if (OpCodes.NODETYPE_NODE == ops[stepOpCodePos + 3]) // child::node()
- {
- analysisResult |= BIT_NODETEST_ANY;
- }
-
- stepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
-
- if (stepOpCodePos < 0)
- break;
- }
-
- analysisResult |= (stepCount & BITS_COUNT);
-
- return analysisResult;
- }
-
- /**
* Tell if the given axis goes downword. Bogus name, if you can think of
* a better one, please do tell. This really has to do with inverting
* attribute axis.
@@ -828,954 +144,14 @@
*/
public static boolean isDownwardAxisOfMany(int axis)
{
- return ((Axis.DESCENDANTORSELF == axis) ||
- (Axis.DESCENDANT == axis)
- || (Axis.FOLLOWING == axis)
-// || (Axis.FOLLOWINGSIBLING == axis)
- || (Axis.PRECEDING == axis)
-// || (Axis.PRECEDINGSIBLING == axis)
- );
- }
-
- /**
- * Read a <a href="http://www.w3.org/TR/xpath#location-paths">LocationPath</a>
- * as a generalized match pattern. What this means is that the LocationPath
- * is read backwards, as a test on a given node, to see if it matches the
- * criteria of the selection, and ends up at the context node. Essentially,
- * this is a backwards query from a given node, to find the context node.
- * <p>So, the selection "foo/daz[2]" is, in non-abreviated expanded syntax,
- * "self::node()/following-sibling::foo/child::daz[position()=2]".
- * Taking this as a match pattern for a probable node, it works out to
- * "self::daz/parent::foo[child::daz[position()=2 and isPrevStepNode()]
- * precedingSibling::node()[isContextNodeOfLocationPath()]", adding magic
- * isPrevStepNode and isContextNodeOfLocationPath operations. Predicates in
- * the location path have to be executed by the following step,
- * because they have to know the context of their execution.
- *
- * @param mpi The MatchPatternIterator to which the steps will be attached.
- * @param compiler The compiler that holds the syntax tree/op map to
- * construct from.
- * @param stepOpCodePos The current op code position within the opmap.
- * @param stepIndex The top-level step index withing the iterator.
- *
- * @return A StepPattern object, which may contain relative StepPatterns.
- *
- * @throws javax.xml.transform.TransformerException
- */
- static StepPattern loadSteps(
- MatchPatternIterator mpi, Compiler compiler, int stepOpCodePos,
- int stepIndex)
- throws javax.xml.transform.TransformerException
- {
- if (DEBUG_PATTERN_CREATION)
- {
- System.out.println("================");
- System.out.println("loadSteps for: "+compiler.getPatternString());
- }
- int stepType;
- StepPattern step = null;
- StepPattern firstStep = null, prevStep = null;
- int ops[] = compiler.getOpMap();
- int analysis = analyze(compiler, stepOpCodePos, stepIndex);
-
- while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
- {
- step = createDefaultStepPattern(compiler, stepOpCodePos, mpi, analysis,
- firstStep, prevStep);
-
- if (null == firstStep)
- {
- firstStep = step;
- }
- else
- {
-
- //prevStep.setNextWalker(step);
- step.setRelativePathPattern(prevStep);
- }
-
- prevStep = step;
- stepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
-
- if (stepOpCodePos < 0)
- break;
- }
-
- int axis = Axis.SELF;
- int paxis = Axis.SELF;
- StepPattern tail = step;
- for (StepPattern pat = step; null != pat;
- pat = pat.getRelativePathPattern())
- {
- int nextAxis = pat.getAxis();
- //int nextPaxis = pat.getPredicateAxis();
- pat.setAxis(axis);
-
- // The predicate axis can't be moved!!! Test Axes103
- // pat.setPredicateAxis(paxis);
-
- // If we have an attribute or namespace axis that went up, then
- // it won't find the attribute in the inverse, since the select-to-match
- // axes are not invertable (an element is a parent of an attribute, but
- // and attribute is not a child of an element).
- // If we don't do the magic below, then "@*/ancestor-or-self::*" gets
- // inverted for match to "self::*/descendant-or-self::@*/parent::node()",
- // which obviously won't work.
- // So we will rewrite this as:
- // "self::*/descendant-or-self::*/attribute::*/parent::node()"
- // Child has to be rewritten a little differently:
- // select: "@*/parent::*"
- // inverted match: "self::*/child::@*/parent::node()"
- // rewrite: "self::*/attribute::*/parent::node()"
- // Axes that go down in the select, do not have to have special treatment
- // in the rewrite. The following inverted match will still not select
- // anything.
- // select: "@*/child::*"
- // inverted match: "self::*/parent::@*/parent::node()"
- // Lovely business, this.
- // -sb
- int whatToShow = pat.getWhatToShow();
- if(whatToShow == DTMFilter.SHOW_ATTRIBUTE ||
- whatToShow == DTMFilter.SHOW_NAMESPACE)
- {
- int newAxis = (whatToShow == DTMFilter.SHOW_ATTRIBUTE) ?
- Axis.ATTRIBUTE : Axis.NAMESPACE;
- if(isDownwardAxisOfMany(axis))
- {
- StepPattern attrPat = new StepPattern(whatToShow,
- pat.getNamespace(),
- pat.getLocalName(),
- //newAxis, pat.getPredicateAxis);
- newAxis, 0); // don't care about the predicate axis
- XNumber score = pat.getStaticScore();
- pat.setNamespace(null);
- pat.setLocalName(NodeTest.WILD);
- attrPat.setPredicates(pat.getPredicates());
- pat.setPredicates(null);
- pat.setWhatToShow(DTMFilter.SHOW_ELEMENT);
- StepPattern rel = pat.getRelativePathPattern();
- pat.setRelativePathPattern(attrPat);
- attrPat.setRelativePathPattern(rel);
- attrPat.setStaticScore(score);
-
- // This is needed to inverse a following pattern, because of the
- // wacky Xalan rules for following from an attribute. See axes108.
- // By these rules, following from an attribute is not strictly
- // inverseable.
- if(Axis.PRECEDING == pat.getAxis())
- pat.setAxis(Axis.PRECEDINGANDANCESTOR);
-
- else if(Axis.DESCENDANT == pat.getAxis())
- pat.setAxis(Axis.DESCENDANTORSELF);
-
- pat = attrPat;
- }
- else if(Axis.CHILD == pat.getAxis())
- {
- // In this case just change the axis.
- // pat.setWhatToShow(whatToShow);
- pat.setAxis(Axis.ATTRIBUTE);
- }
- }
- axis = nextAxis;
- //paxis = nextPaxis;
- tail = pat;
- }
-
- if(axis < Axis.ALL)
- {
- StepPattern selfPattern = new ContextMatchStepPattern(axis, paxis);
- // We need to keep the new nodetest from affecting the score...
- XNumber score = tail.getStaticScore();
- tail.setRelativePathPattern(selfPattern);
- tail.setStaticScore(score);
- selfPattern.setStaticScore(score);
- }
-
- if (DEBUG_PATTERN_CREATION)
- {
- System.out.println("Done loading steps: "+step.toString());
-
- System.out.println("");
- }
- return step; // start from last pattern?? //firstStep;
- }
-
- /**
- * Create a StepPattern that is contained within a LocationPath.
- *
- *
- * @param compiler The compiler that holds the syntax tree/op map to
- * construct from.
- * @param stepOpCodePos The current op code position within the opmap.
- * @param mpi The MatchPatternIterator to which the steps will be attached.
- * @param analysis 32 bits of analysis, from which the type of AxesWalker
- * may be influenced.
- * @param tail The step that is the first step analyzed, but the last
- * step in the relative match linked list, i.e. the tail.
- * May be null.
- * @param head The step that is the current head of the relative
- * match step linked list.
- * May be null.
- *
- * @return the head of the list.
- *
- * @throws javax.xml.transform.TransformerException
- */
- private static StepPattern createDefaultStepPattern(
- Compiler compiler, int opPos, MatchPatternIterator mpi,
- int analysis, StepPattern tail, StepPattern head)
- throws javax.xml.transform.TransformerException
- {
-
- int stepType = compiler.getOp(opPos);
- boolean simpleInit = false;
- int totalNumberWalkers = (analysis & BITS_COUNT);
- boolean prevIsOneStepDown = true;
- int firstStepPos = compiler.getFirstChildPos(opPos);
-
- int whatToShow = compiler.getWhatToShow(opPos);
- StepPattern ai = null;
- int axis, predicateAxis;
-
- switch (stepType)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- prevIsOneStepDown = false;
-
- Expression expr;
-
- switch (stepType)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- expr = compiler.compile(opPos);
- break;
- default :
- expr = compiler.compile(opPos + 2);
- }
-
- axis = Axis.FILTEREDLIST;
- predicateAxis = Axis.FILTEREDLIST;
- ai = new FunctionPattern(expr, axis, predicateAxis);
- simpleInit = true;
- break;
- case OpCodes.FROM_ROOT :
- whatToShow = DTMFilter.SHOW_DOCUMENT
- | DTMFilter.SHOW_DOCUMENT_FRAGMENT;
-
- axis = Axis.ROOT;
- predicateAxis = Axis.ROOT;
- ai = new StepPattern(DTMFilter.SHOW_DOCUMENT |
- DTMFilter.SHOW_DOCUMENT_FRAGMENT,
- axis, predicateAxis);
- break;
- case OpCodes.FROM_ATTRIBUTES :
- whatToShow = DTMFilter.SHOW_ATTRIBUTE;
- axis = Axis.PARENT;
- predicateAxis = Axis.ATTRIBUTE;
- // ai = new StepPattern(whatToShow, Axis.SELF, Axis.SELF);
- break;
- case OpCodes.FROM_NAMESPACE :
- whatToShow = DTMFilter.SHOW_NAMESPACE;
- axis = Axis.PARENT;
- predicateAxis = Axis.NAMESPACE;
- // ai = new StepPattern(whatToShow, axis, predicateAxis);
- break;
- case OpCodes.FROM_ANCESTORS :
- axis = Axis.DESCENDANT;
- predicateAxis = Axis.ANCESTOR;
- break;
- case OpCodes.FROM_CHILDREN :
- axis = Axis.PARENT;
- predicateAxis = Axis.CHILD;
- break;
- case OpCodes.FROM_ANCESTORS_OR_SELF :
- axis = Axis.DESCENDANTORSELF;
- predicateAxis = Axis.ANCESTORORSELF;
- break;
- case OpCodes.FROM_SELF :
- axis = Axis.SELF;
- predicateAxis = Axis.SELF;
- break;
- case OpCodes.FROM_PARENT :
- axis = Axis.CHILD;
- predicateAxis = Axis.PARENT;
- break;
- case OpCodes.FROM_PRECEDING_SIBLINGS :
- axis = Axis.FOLLOWINGSIBLING;
- predicateAxis = Axis.PRECEDINGSIBLING;
- break;
- case OpCodes.FROM_PRECEDING :
- axis = Axis.FOLLOWING;
- predicateAxis = Axis.PRECEDING;
- break;
- case OpCodes.FROM_FOLLOWING_SIBLINGS :
- axis = Axis.PRECEDINGSIBLING;
- predicateAxis = Axis.FOLLOWINGSIBLING;
- break;
- case OpCodes.FROM_FOLLOWING :
- axis = Axis.PRECEDING;
- predicateAxis = Axis.FOLLOWING;
- break;
- case OpCodes.FROM_DESCENDANTS_OR_SELF :
- axis = Axis.ANCESTORORSELF;
- predicateAxis = Axis.DESCENDANTORSELF;
- break;
- case OpCodes.FROM_DESCENDANTS :
- axis = Axis.ANCESTOR;
- predicateAxis = Axis.DESCENDANT;
- break;
- default :
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
- //+ stepType);
- }
- if(null == ai)
- {
- whatToShow = compiler.getWhatToShow(opPos); // %REVIEW%
- ai = new StepPattern(whatToShow, compiler.getStepNS(opPos),
- compiler.getStepLocalName(opPos),
- axis, predicateAxis);
- }
-
- if (false || DEBUG_PATTERN_CREATION)
- {
- System.out.print("new step: "+ ai);
- System.out.print(", axis: " + Axis.names[ai.getAxis()]);
- System.out.print(", predAxis: " + Axis.names[ai.getAxis()]);
- System.out.print(", what: ");
- System.out.print(" ");
- ai.debugWhatToShow(ai.getWhatToShow());
- }
-
- int argLen = compiler.getFirstPredicateOpPos(opPos);
-
- ai.setPredicates(compiler.getCompiledPredicates(argLen));
-
- return ai;
- }
-
- /**
- * Analyze a step and give information about it's predicates. Right now this
- * just returns true or false if the step has a predicate.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param opPos The opcode position for the step.
- * @param stepType The type of step, one of OP_GROUP, etc.
- *
- * @return true if step has a predicate.
- *
- * @throws javax.xml.transform.TransformerException
- */
- static boolean analyzePredicate(Compiler compiler, int opPos, int stepType)
- throws javax.xml.transform.TransformerException
- {
-
- int argLen;
-
- switch (stepType)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- argLen = compiler.getArgLength(opPos);
- break;
- default :
- argLen = compiler.getArgLengthOfStep(opPos);
- }
-
- int pos = compiler.getFirstPredicateOpPos(opPos);
- int nPredicates = compiler.countPredicates(pos);
-
- return (nPredicates > 0) ? true : false;
- }
-
- /**
- * Create the proper Walker from the axes type.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param opPos The opcode position for the step.
- * @param lpi The owning location path iterator.
- * @param analysis 32 bits of analysis, from which the type of AxesWalker
- * may be influenced.
- *
- * @return non-null reference to AxesWalker derivative.
- * @throws RuntimeException if the input is bad.
- */
- private static AxesWalker createDefaultWalker(Compiler compiler, int opPos,
- WalkingIterator lpi, int analysis)
- {
-
- AxesWalker ai = null;
- int stepType = compiler.getOp(opPos);
-
- /*
- System.out.println("0: "+compiler.getOp(opPos));
- System.out.println("1: "+compiler.getOp(opPos+1));
- System.out.println("2: "+compiler.getOp(opPos+2));
- System.out.println("3: "+compiler.getOp(opPos+3));
- System.out.println("4: "+compiler.getOp(opPos+4));
- System.out.println("5: "+compiler.getOp(opPos+5));
- */
- boolean simpleInit = false;
- int totalNumberWalkers = (analysis & BITS_COUNT);
- boolean prevIsOneStepDown = true;
-
- switch (stepType)
- {
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- prevIsOneStepDown = false;
-
- if (DEBUG_WALKER_CREATION)
- System.out.println("new walker: FilterExprWalker: " + analysis
- + ", " + compiler.toString());
-
- ai = new FilterExprWalker(lpi);
- simpleInit = true;
- break;
- case OpCodes.FROM_ROOT :
- ai = new AxesWalker(lpi, Axis.ROOT);
- break;
- case OpCodes.FROM_ANCESTORS :
- prevIsOneStepDown = false;
- ai = new ReverseAxesWalker(lpi, Axis.ANCESTOR);
- break;
- case OpCodes.FROM_ANCESTORS_OR_SELF :
- prevIsOneStepDown = false;
- ai = new ReverseAxesWalker(lpi, Axis.ANCESTORORSELF);
- break;
- case OpCodes.FROM_ATTRIBUTES :
- ai = new AxesWalker(lpi, Axis.ATTRIBUTE);
- break;
- case OpCodes.FROM_NAMESPACE :
- ai = new AxesWalker(lpi, Axis.NAMESPACE);
- break;
- case OpCodes.FROM_CHILDREN :
- ai = new AxesWalker(lpi, Axis.CHILD);
- break;
- case OpCodes.FROM_DESCENDANTS :
- prevIsOneStepDown = false;
- ai = new AxesWalker(lpi, Axis.DESCENDANT);
- break;
- case OpCodes.FROM_DESCENDANTS_OR_SELF :
- prevIsOneStepDown = false;
- ai = new AxesWalker(lpi, Axis.DESCENDANTORSELF);
- break;
- case OpCodes.FROM_FOLLOWING :
- prevIsOneStepDown = false;
- ai = new AxesWalker(lpi, Axis.FOLLOWING);
- break;
- case OpCodes.FROM_FOLLOWING_SIBLINGS :
- prevIsOneStepDown = false;
- ai = new AxesWalker(lpi, Axis.FOLLOWINGSIBLING);
- break;
- case OpCodes.FROM_PRECEDING :
- prevIsOneStepDown = false;
- ai = new ReverseAxesWalker(lpi, Axis.PRECEDING);
- break;
- case OpCodes.FROM_PRECEDING_SIBLINGS :
- prevIsOneStepDown = false;
- ai = new ReverseAxesWalker(lpi, Axis.PRECEDINGSIBLING);
- break;
- case OpCodes.FROM_PARENT :
- prevIsOneStepDown = false;
- ai = new ReverseAxesWalker(lpi, Axis.PARENT);
- break;
- case OpCodes.FROM_SELF :
- ai = new AxesWalker(lpi, Axis.SELF);
- break;
- default :
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
- //+ stepType);
- }
-
- if (simpleInit)
- {
- ai.initNodeTest(DTMFilter.SHOW_ALL);
- }
- else
- {
- int whatToShow = compiler.getWhatToShow(opPos);
-
- /*
- System.out.print("construct: ");
- NodeTest.debugWhatToShow(whatToShow);
- System.out.println("or stuff: "+(whatToShow & (DTMFilter.SHOW_ATTRIBUTE
- | DTMFilter.SHOW_ELEMENT
- | DTMFilter.SHOW_PROCESSING_INSTRUCTION)));
- */
- if ((0 == (whatToShow
- & (DTMFilter.SHOW_ATTRIBUTE | DTMFilter.SHOW_NAMESPACE | DTMFilter.SHOW_ELEMENT
- | DTMFilter.SHOW_PROCESSING_INSTRUCTION))) || (whatToShow == DTMFilter.SHOW_ALL))
- ai.initNodeTest(whatToShow);
- else
- {
- ai.initNodeTest(whatToShow, compiler.getStepNS(opPos),
- compiler.getStepLocalName(opPos));
- }
- }
-
- return ai;
- }
-
- public static String getAnalysisString(int analysis)
- {
- StringBuffer buf = new StringBuffer();
- buf.append("count: "+getStepCount(analysis)+" ");
- if((analysis & BIT_NODETEST_ANY) != 0)
- {
- buf.append("NTANY|");
- }
- if((analysis & BIT_PREDICATE) != 0)
- {
- buf.append("PRED|");
- }
- if((analysis & BIT_ANCESTOR) != 0)
- {
- buf.append("ANC|");
- }
- if((analysis & BIT_ANCESTOR_OR_SELF) != 0)
- {
- buf.append("ANCOS|");
- }
- if((analysis & BIT_ATTRIBUTE) != 0)
- {
- buf.append("ATTR|");
- }
- if((analysis & BIT_CHILD) != 0)
- {
- buf.append("CH|");
- }
- if((analysis & BIT_DESCENDANT) != 0)
- {
- buf.append("DESC|");
- }
- if((analysis & BIT_DESCENDANT_OR_SELF) != 0)
- {
- buf.append("DESCOS|");
- }
- if((analysis & BIT_FOLLOWING) != 0)
- {
- buf.append("FOL|");
- }
- if((analysis & BIT_FOLLOWING_SIBLING) != 0)
- {
- buf.append("FOLS|");
- }
- if((analysis & BIT_NAMESPACE) != 0)
- {
- buf.append("NS|");
- }
- if((analysis & BIT_PARENT) != 0)
- {
- buf.append("P|");
- }
- if((analysis & BIT_PRECEDING) != 0)
- {
- buf.append("PREC|");
- }
- if((analysis & BIT_PRECEDING_SIBLING) != 0)
- {
- buf.append("PRECS|");
- }
- if((analysis & BIT_SELF) != 0)
- {
- buf.append(".|");
- }
- if((analysis & BIT_FILTER) != 0)
- {
- buf.append("FLT|");
- }
- if((analysis & BIT_ROOT) != 0)
- {
- buf.append("R|");
- }
- return buf.toString();
- }
-
- /** Set to true for diagnostics about walker creation */
- static final boolean DEBUG_PATTERN_CREATION = false;
-
- /** Set to true for diagnostics about walker creation */
- static final boolean DEBUG_WALKER_CREATION = false;
-
- /** Set to true for diagnostics about iterator creation */
- static final boolean DEBUG_ITERATOR_CREATION = false;
-
- public static boolean hasPredicate(int analysis)
- {
- return (0 != (analysis & BIT_PREDICATE));
- }
-
- public static boolean isWild(int analysis)
- {
- return (0 != (analysis & BIT_NODETEST_ANY));
- }
-
- public static boolean walksAncestors(int analysis)
- {
- return isSet(analysis, BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);
- }
-
- public static boolean walksAttributes(int analysis)
- {
- return (0 != (analysis & BIT_ATTRIBUTE));
- }
-
- public static boolean walksNamespaces(int analysis)
- {
- return (0 != (analysis & BIT_NAMESPACE));
- }
-
- public static boolean walksChildren(int analysis)
- {
- return (0 != (analysis & BIT_CHILD));
- }
-
- public static boolean walksDescendants(int analysis)
- {
- return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF);
- }
-
- public static boolean walksSubtree(int analysis)
- {
- return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF | BIT_CHILD);
- }
-
- public static boolean walksSubtreeOnlyMaybeAbsolute(int analysis)
- {
- return walksSubtree(analysis)
- && !walksExtraNodes(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- ;
- }
-
- public static boolean walksSubtreeOnly(int analysis)
- {
- return walksSubtreeOnlyMaybeAbsolute(analysis)
- && !isAbsolute(analysis)
- ;
- }
-
- public static boolean walksFilteredList(int analysis)
- {
- return isSet(analysis, BIT_FILTER);
- }
-
- public static boolean walksSubtreeOnlyFromRootOrContext(int analysis)
- {
- return walksSubtree(analysis)
- && !walksExtraNodes(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && !isSet(analysis, BIT_FILTER)
- ;
- }
-
- public static boolean walksInDocOrder(int analysis)
- {
- return (walksSubtreeOnlyMaybeAbsolute(analysis)
- || walksExtraNodesOnly(analysis)
- || walksFollowingOnlyMaybeAbsolute(analysis))
- && !isSet(analysis, BIT_FILTER)
- ;
- }
-
- public static boolean walksFollowingOnlyMaybeAbsolute(int analysis)
- {
- return isSet(analysis, BIT_SELF | BIT_FOLLOWING_SIBLING | BIT_FOLLOWING)
- && !walksSubtree(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- ;
- }
-
- public static boolean walksUp(int analysis)
- {
- return isSet(analysis, BIT_PARENT | BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);
- }
-
- public static boolean walksSideways(int analysis)
- {
- return isSet(analysis, BIT_FOLLOWING | BIT_FOLLOWING_SIBLING |
- BIT_PRECEDING | BIT_PRECEDING_SIBLING);
- }
-
- public static boolean walksExtraNodes(int analysis)
- {
- return isSet(analysis, BIT_NAMESPACE | BIT_ATTRIBUTE);
- }
-
- public static boolean walksExtraNodesOnly(int analysis)
- {
- return walksExtraNodes(analysis)
- && !isSet(analysis, BIT_SELF)
- && !walksSubtree(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && !isAbsolute(analysis)
- ;
- }
-
- public static boolean isAbsolute(int analysis)
- {
- return isSet(analysis, BIT_ROOT | BIT_FILTER);
- }
-
- public static boolean walksChildrenOnly(int analysis)
- {
- return walksChildren(analysis)
- && !isSet(analysis, BIT_SELF)
- && !walksExtraNodes(analysis)
- && !walksDescendants(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT))
- ;
- }
-
- public static boolean walksChildrenAndExtraAndSelfOnly(int analysis)
- {
- return walksChildren(analysis)
- && !walksDescendants(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT))
- ;
- }
-
- public static boolean walksDescendantsAndExtraAndSelfOnly(int analysis)
- {
- return !walksChildren(analysis)
- && walksDescendants(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT))
- ;
- }
-
- public static boolean walksSelfOnly(int analysis)
- {
- return isSet(analysis, BIT_SELF)
- && !walksSubtree(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && !isAbsolute(analysis)
- ;
- }
-
-
- public static boolean walksUpOnly(int analysis)
- {
- return !walksSubtree(analysis)
- && walksUp(analysis)
- && !walksSideways(analysis)
- && !isAbsolute(analysis)
- ;
- }
-
- public static boolean walksDownOnly(int analysis)
- {
- return walksSubtree(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && !isAbsolute(analysis)
- ;
- }
-
- public static boolean walksDownExtraOnly(int analysis)
- {
- return walksSubtree(analysis) && walksExtraNodes(analysis)
- && !walksUp(analysis)
- && !walksSideways(analysis)
- && !isAbsolute(analysis)
- ;
- }
-
- public static boolean canSkipSubtrees(int analysis)
- {
- return isSet(analysis, BIT_CHILD) | walksSideways(analysis);
- }
-
- public static boolean canCrissCross(int analysis)
- {
- // This could be done faster. Coded for clarity.
- if(walksSelfOnly(analysis))
- return false;
- else if(walksDownOnly(analysis) && !canSkipSubtrees(analysis))
- return false;
- else if(walksChildrenAndExtraAndSelfOnly(analysis))
- return false;
- else if(walksDescendantsAndExtraAndSelfOnly(analysis))
- return false;
- else if(walksUpOnly(analysis))
- return false;
- else if(walksExtraNodesOnly(analysis))
- return false;
- else if(walksSubtree(analysis)
- && (walksSideways(analysis)
- || walksUp(analysis)
- || canSkipSubtrees(analysis)))
- return true;
- else
- return false;
- }
-
- /**
- * Tell if the pattern can be 'walked' with the iteration steps in natural
- * document order, without duplicates.
- *
- * @param analysis The general analysis of the pattern.
- *
- * @return true if the walk can be done in natural order.
- *
- * @throws javax.xml.transform.TransformerException
- */
- static public boolean isNaturalDocOrder(int analysis)
- {
- if(canCrissCross(analysis) || isSet(analysis, BIT_NAMESPACE) ||
- walksFilteredList(analysis))
- return false;
-
- if(walksInDocOrder(analysis))
- return true;
-
- return false;
- }
-
- /**
- * Tell if the pattern can be 'walked' with the iteration steps in natural
- * document order, without duplicates.
- *
- * @param compiler non-null reference to compiler object that has processed
- * the XPath operations into an opcode map.
- * @param stepOpCodePos The opcode position for the step.
- * @param stepIndex The top-level step index withing the iterator.
- * @param analysis The general analysis of the pattern.
- *
- * @return true if the walk can be done in natural order.
- *
- * @throws javax.xml.transform.TransformerException
- */
- private static boolean isNaturalDocOrder(
- Compiler compiler, int stepOpCodePos, int stepIndex, int analysis)
- throws javax.xml.transform.TransformerException
- {
- if(canCrissCross(analysis))
- return false;
-
- // Namespaces can present some problems, so just punt if we're looking for
- // these.
- if(isSet(analysis, BIT_NAMESPACE))
- return false;
-
- // The following, preceding, following-sibling, and preceding sibling can
- // be found in doc order if we get to this point, but if they occur
- // together, they produce
- // duplicates, so it's better for us to eliminate this case so we don't
- // have to check for duplicates during runtime if we're using a
- // WalkingIterator.
- if(isSet(analysis, BIT_FOLLOWING | BIT_FOLLOWING_SIBLING) &&
- isSet(analysis, BIT_PRECEDING | BIT_PRECEDING_SIBLING))
- return false;
-
- // OK, now we have to check for select="@*/axis::*" patterns, which
- // can also cause duplicates to happen. But select="axis*/@::*" patterns
- // are OK, as are select="@foo/axis::*" patterns.
- // Unfortunately, we can't do this just via the analysis bits.
-
- int stepType;
- int ops[] = compiler.getOpMap();
- int stepCount = 0;
- boolean foundWildAttribute = false;
-
- // Steps that can traverse anything other than down a
- // subtree or that can produce duplicates when used in
- // combonation are counted with this variable.
- int potentialDuplicateMakingStepCount = 0;
-
- while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
- {
- stepCount++;
-
- switch (stepType)
- {
- case OpCodes.FROM_ATTRIBUTES :
- case OpCodes.MATCH_ATTRIBUTE :
- if(foundWildAttribute) // Maybe not needed, but be safe.
- return false;
-
- // This doesn't seem to work as a test for wild card. Hmph.
- // int nodeTestType = compiler.getStepTestType(stepOpCodePos);
-
- String localName = compiler.getStepLocalName(stepOpCodePos);
- // System.err.println("localName: "+localName);
- if(localName.equals("*"))
- {
- foundWildAttribute = true;
- }
- break;
- case OpCodes.FROM_FOLLOWING :
- case OpCodes.FROM_FOLLOWING_SIBLINGS :
- case OpCodes.FROM_PRECEDING :
- case OpCodes.FROM_PRECEDING_SIBLINGS :
- case OpCodes.FROM_PARENT :
- case OpCodes.OP_VARIABLE :
- case OpCodes.OP_EXTFUNCTION :
- case OpCodes.OP_FUNCTION :
- case OpCodes.OP_GROUP :
- case OpCodes.FROM_NAMESPACE :
- case OpCodes.FROM_ANCESTORS :
- case OpCodes.FROM_ANCESTORS_OR_SELF :
- case OpCodes.MATCH_ANY_ANCESTOR :
- case OpCodes.MATCH_IMMEDIATE_ANCESTOR :
- case OpCodes.FROM_DESCENDANTS_OR_SELF :
- case OpCodes.FROM_DESCENDANTS :
- if(potentialDuplicateMakingStepCount > 0)
- return false;
- potentialDuplicateMakingStepCount++;
- case OpCodes.FROM_ROOT :
- case OpCodes.FROM_CHILDREN :
- case OpCodes.FROM_SELF :
- if(foundWildAttribute)
- return false;
- break;
- default :
- throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
- // + stepType);
- }
-
- int nextStepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
-
- if (nextStepOpCodePos < 0)
- break;
-
- stepOpCodePos = nextStepOpCodePos;
- }
-
- return true;
- }
-
- public static boolean isOneStep(int analysis)
- {
- return (analysis & BITS_COUNT) == 0x00000001;
- }
-
- public static int getStepCount(int analysis)
- {
- return (analysis & BITS_COUNT);
+ return (
+ (Axis.DESCENDANTORSELF == axis)
+ || (Axis.DESCENDANT == axis)
+ || (Axis.FOLLOWING == axis)
+ // || (Axis.FOLLOWINGSIBLING == axis)
+ || (Axis.PRECEDING == axis)
+ // || (Axis.PRECEDINGSIBLING == axis)
+ );
}
/**
@@ -1842,16 +218,14 @@
* If any of these bits are on, the expression may likely traverse outside
* the given subtree.
*/
- public static final int BITMASK_TRAVERSES_OUTSIDE_SUBTREE = (BIT_NAMESPACE // ??
- | BIT_PRECEDING_SIBLING
- | BIT_PRECEDING
- | BIT_FOLLOWING_SIBLING
- | BIT_FOLLOWING
- | BIT_PARENT // except parent of attrs.
- | BIT_ANCESTOR_OR_SELF
- | BIT_ANCESTOR
- | BIT_FILTER
- | BIT_ROOT);
+ public static final int BITMASK_TRAVERSES_OUTSIDE_SUBTREE =
+ (BIT_NAMESPACE // ??
+ | BIT_PRECEDING_SIBLING
+ | BIT_PRECEDING
+ | BIT_FOLLOWING_SIBLING
+ | BIT_FOLLOWING
+ | BIT_PARENT // except parent of attrs.
+ | BIT_ANCESTOR_OR_SELF | BIT_ANCESTOR | BIT_FILTER | BIT_ROOT);
/**
* Bit is on if any of the walkers can go backwards in document
@@ -1872,4 +246,3042 @@
/** Bit is on if the expression is a match pattern. */
public static final int BIT_MATCH_PATTERN = (0x00001000 << 19);
+
+ /**
+ * Analyze a step and give information about it's predicates. Right now this
+ * just returns true or false if the step has a predicate.
+ *
+ * @param compiler non-null reference to compiler object that has processed
+ * the XPath operations into an opcode map.
+ * @param opPos The opcode position for the step.
+ * @param stepType The type of step, one of OP_GROUP, etc.
+ *
+ * @return true if step has a predicate.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ static boolean analyzePredicate(StepExpr stepExpr)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int childCount = stepExpr.jjtGetNumChildren();
+ Node lastChild = stepExpr.jjtGetChild(childCount - 1);
+ if (lastChild instanceof Predicates)
+ {
+ if (lastChild.jjtGetNumChildren() > 0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Analyze the location path and return 32 bits that give information about
+ * the location path as a whole. See the BIT_XXX constants for meaning about
+ * each of the bits.
+ *
+ * @param compiler non-null reference to compiler object that has processed
+ * the XPath operations into an opcode map.
+ * @param stepOpCodePos The opcode position for the step.
+ * @param stepIndex The top-level step index withing the iterator.
+ *
+ * @return 32 bits as an integer that give information about the location
+ * path as a whole.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ private static int analyze(PathExpr pathExpr, int stepIndex)
+ throws javax.xml.transform.TransformerException
+ {
+ int numSteps = pathExpr.jjtGetNumChildren();
+ int analysisResult = 0x00000000; // 32 bits of analysis
+
+ for (int i = stepIndex; i < numSteps; i++)
+ {
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(i);
+
+ boolean predAnalysis = analyzePredicate(stepExpr);
+
+ if (predAnalysis)
+ analysisResult |= BIT_PREDICATE;
+
+ Node firstChild = stepExpr.jjtGetChild(0);
+ if (firstChild instanceof PatternAxis)
+ {
+ int axis = ((PatternAxis) firstChild).getAxis();
+ switch (axis)
+ {
+ case Axis.ROOT :
+ analysisResult |= BIT_ROOT;
+ break;
+ case Axis.DESCENDANTSORSELFFROMROOT :
+ case Axis.DESCENDANTSFROMROOT :
+ analysisResult |= (BIT_ROOT | BIT_ANY_DESCENDANT_FROM_ROOT);
+ break;
+ case Axis.ANCESTOR :
+ analysisResult |= BIT_ANCESTOR;
+ break;
+ case Axis.ANCESTORORSELF :
+ analysisResult |= BIT_ANCESTOR_OR_SELF;
+ break;
+ case Axis.ATTRIBUTE :
+ analysisResult |= BIT_ATTRIBUTE;
+ break;
+ case Axis.NAMESPACE :
+ analysisResult |= BIT_NAMESPACE;
+ break;
+ case Axis.CHILD :
+ analysisResult |= BIT_CHILD;
+ break;
+ case Axis.DESCENDANT :
+ analysisResult |= BIT_DESCENDANT;
+ break;
+ case Axis.DESCENDANTORSELF :
+ analysisResult |= BIT_DESCENDANT_OR_SELF;
+ break;
+ case Axis.FOLLOWING :
+ analysisResult |= BIT_FOLLOWING;
+ break;
+ case Axis.FOLLOWINGSIBLING :
+ analysisResult |= BIT_FOLLOWING_SIBLING;
+ break;
+ case Axis.PRECEDING :
+ analysisResult |= BIT_PRECEDING;
+ break;
+ case Axis.PRECEDINGSIBLING :
+ analysisResult |= BIT_PRECEDING_SIBLING;
+ break;
+ case Axis.PARENT :
+ analysisResult |= BIT_PARENT;
+ break;
+ case Axis.SELF :
+ analysisResult |= BIT_SELF;
+ break;
+ default :
+ // TBD: Change the wording of this expression.
+ throw new RuntimeException(
+ XSLMessages.createXPATHMessage(
+ XPATHErrorResources.ER_NULL_ERROR_HANDLER,
+ new Object[] { firstChild.getClass().getName()}));
+ //"Programmer's assertion: unknown opcode: "
+ //+ stepType);
+ }
+ Node secondChild = stepExpr.jjtGetChild(1);
+ if (secondChild instanceof org.apache.xpath.parser.NodeTest)
+ {
+ org.apache.xpath.parser.NodeTest nt =
+ (org.apache.xpath.parser.NodeTest) secondChild;
+ if (nt.getWhatToShow() == org.apache.xml.dtm.DTMFilter.SHOW_ALL)
+ {
+ analysisResult |= BIT_NODETEST_ANY;
+ }
+ }
+
+ }
+ else
+ {
+ analysisResult |= BIT_FILTER;
+ }
+
+ }
+
+ analysisResult |= (numSteps & BITS_COUNT);
+
+ return analysisResult;
+ }
+
+ /**
+ * Create a new LocPathIterator iterator. The exact type of iterator
+ * returned is based on an analysis of the XPath operations.
+ *
+ * @param compiler non-null reference to compiler object that has processed
+ * the XPath operations into an opcode map.
+ * @param opPos The position of the operation code for this itterator.
+ *
+ * @return non-null reference to a LocPathIterator or derivative.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public static DTMIterator newDTMIterator(
+ PathExpr pathExpr,
+ boolean isTopLevel)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int analysis = analyze(pathExpr, 0);
+ boolean isOneStep = isOneStep(analysis);
+ DTMIterator iter = getPossibleUnion(pathExpr, isTopLevel, isOneStep);
+
+ if(null != iter)
+ return iter;
+
+ // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
+ if (isOneStep
+ && walksSelfOnly(analysis)
+ && isWild(analysis)
+ && !hasPredicate(analysis))
+ {
+ if (DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("SelfIteratorNoPredicate", analysis, pathExpr);
+
+ // Then use a simple iteration of the attributes, with node test
+ // and predicate testing.
+ iter = new SelfIteratorNoPredicate();
+ }
+ // Is the iteration exactly one child step?
+ else
+ if (walksChildrenOnly(analysis) && isOneStep)
+ {
+
+ // Does the pattern specify *any* child with no predicate? (i.e. select="child::node()".
+ if (isWild(analysis) && !hasPredicate(analysis))
+ {
+ if (DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("ChildIterator", analysis, pathExpr);
+
+ // Use simple child iteration without any test.
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(0);
+ iter = new ChildIterator(stepExpr, analysis);
+ }
+ else
+ {
+ if (DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("ChildTestIterator", analysis, pathExpr);
+
+ // Else use simple node test iteration with predicate test.
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(0);
+ iter = new ChildTestIterator(stepExpr, analysis);
+ }
+ }
+ // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
+ else
+ if (isOneStep && walksAttributes(analysis))
+ {
+ if (DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("AttributeIterator", analysis, pathExpr);
+
+ // Then use a simple iteration of the attributes, with node test
+ // and predicate testing.
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(0);
+ iter = new AttributeIterator(stepExpr, analysis);
+ }
+ else
+ if (isOneStep && !walksFilteredList(analysis))
+ {
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(0);
+ if (!walksNamespaces(analysis)
+ && (walksInDocOrder(analysis) || isSet(analysis, BIT_PARENT)))
+ {
+ if (false || DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("OneStepIteratorForward", analysis, pathExpr);
+
+ // Then use a simple iteration of the attributes, with node test
+ // and predicate testing.
+ iter = new OneStepIteratorForward(stepExpr, analysis);
+ }
+ else
+ {
+ if (false || DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("OneStepIterator", analysis, pathExpr);
+
+ // Then use a simple iteration of the attributes, with node test
+ // and predicate testing.
+ iter = new OneStepIterator(stepExpr, analysis);
+ }
+ }
+
+ // Analysis of "//center":
+ // bits: 1001000000001010000000000000011
+ // count: 3
+ // root
+ // child:node()
+ // BIT_DESCENDANT_OR_SELF
+ // It's highly possible that we should have a seperate bit set for
+ // "//foo" patterns.
+ // For at least the time being, we can't optimize patterns like
+ // "//table[3]", because this has to be analyzed as
+ // "/descendant-or-self::node()/table[3]" in order for the indexes
+ // to work right.
+ else
+ if (isOptimizableForDescendantIterator(pathExpr,
+ 0) // && getStepCount(analysis) <= 3
+ // && walksDescendants(analysis)
+ // && walksSubtreeOnlyFromRootOrContext(analysis)
+ )
+ {
+ if (DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("DescendantIterator", analysis, pathExpr);
+ StepExpr stepExpr;
+ if (pathExpr.jjtGetNumChildren() == 2)
+ {
+ stepExpr = (StepExpr) pathExpr.jjtGetChild(1);
+ PatternAxis axisExpr = stepExpr.getAxisExpr();
+ axisExpr.setAxis(org.apache.xml.dtm.Axis.DESCENDANTSFROMROOT);
+ }
+ else
+ stepExpr = (StepExpr) pathExpr.jjtGetChild(0);
+ iter = new DescendantIterator(stepExpr);
+ }
+ else
+ {
+ if (isNaturalDocOrder(pathExpr, 0, analysis))
+ {
+ if (false || DEBUG_ITERATOR_CREATION)
+ {
+ diagnoseIterator("WalkingIterator", analysis, pathExpr);
+ }
+
+ iter =
+ new WalkingIterator(
+ pathExpr.getParser().getPrefixResolver(),
+ pathExpr);
+ }
+ else
+ {
+ // if (DEBUG_ITERATOR_CREATION)
+ // diagnoseIterator("MatchPatternIterator", analysis, compiler);
+ //
+ // return new MatchPatternIterator(compiler, opPos, analysis);
+ if (DEBUG_ITERATOR_CREATION)
+ diagnoseIterator("WalkingIteratorSorted", analysis, pathExpr);
+
+ iter =
+ new WalkingIteratorSorted(
+ pathExpr.getParser().getPrefixResolver(),
+ pathExpr);
+ }
+ }
+ if (iter instanceof LocPathIterator)
+ ((LocPathIterator) iter).setIsTopLevel(isTopLevel);
+
+ return iter;
+ }
+
+ /**
+ * Check to see if we have a UnionPathIterator contained by a
+ * StepExpr and possibly a predicate, contained in a PathExpr.
+ * If this is the case, we just want the UnionPathIterator and
+ * any predicates it may have.
+ * It's likely that this reduction should be done somewhere else.
+ *
+ * @param pathExpr The path construction node that holds the subtree.
+ * @param isTopLevel True if this expression is at the top-level.
+ * @param isOneStep True if this expression only has one step.
+ * @return DTMIterator The reduced union iterator, or null if not a union.
+ * @throws TransformerException
+ */
+ private static DTMIterator getPossibleUnion(
+ PathExpr pathExpr,
+ boolean isTopLevel,
+ boolean isOneStep)
+ throws TransformerException
+ {
+ Node n;
+ if(isOneStep &&
+ (n = pathExpr.jjtGetChild(0).jjtGetChild(0)) instanceof UnionPathIterator)
+ {
+ UnionPathIterator upi = (UnionPathIterator)n;
+ StepExpr se = (StepExpr)pathExpr.jjtGetChild(0);
+
+ upi.initPredicateInfo(se);
+ upi.setWhatToShow(DTMFilter.SHOW_ALL);
+
+ upi.setIsTopLevel(isTopLevel);
+ return upi;
+ }
+ else
+ return null;
+ }
+
+ public static void diagnoseIterator(
+ String name,
+ int analysis,
+ PathExpr pathExpr)
+ {
+ System.out.println(
+ pathExpr.toString()
+ + ", "
+ + name
+ + ", "
+ + Integer.toBinaryString(analysis)
+ + ", "
+ + getAnalysisString(analysis));
+ }
+
+ public static String getAnalysisString(int analysis)
+ {
+ StringBuffer buf = new StringBuffer();
+ buf.append("count: " + getStepCount(analysis) + " ");
+ if ((analysis & BIT_NODETEST_ANY) != 0)
+ {
+ buf.append("NTANY|");
+ }
+ if ((analysis & BIT_PREDICATE) != 0)
+ {
+ buf.append("PRED|");
+ }
+ if ((analysis & BIT_ANCESTOR) != 0)
+ {
+ buf.append("ANC|");
+ }
+ if ((analysis & BIT_ANCESTOR_OR_SELF) != 0)
+ {
+ buf.append("ANCOS|");
+ }
+ if ((analysis & BIT_ATTRIBUTE) != 0)
+ {
+ buf.append("ATTR|");
+ }
+ if ((analysis & BIT_CHILD) != 0)
+ {
+ buf.append("CH|");
+ }
+ if ((analysis & BIT_DESCENDANT) != 0)
+ {
+ buf.append("DESC|");
+ }
+ if ((analysis & BIT_DESCENDANT_OR_SELF) != 0)
+ {
+ buf.append("DESCOS|");
+ }
+ if ((analysis & BIT_FOLLOWING) != 0)
+ {
+ buf.append("FOL|");
+ }
+ if ((analysis & BIT_FOLLOWING_SIBLING) != 0)
+ {
+ buf.append("FOLS|");
+ }
+ if ((analysis & BIT_NAMESPACE) != 0)
+ {
+ buf.append("NS|");
+ }
+ if ((analysis & BIT_PARENT) != 0)
+ {
+ buf.append("P|");
+ }
+ if ((analysis & BIT_PRECEDING) != 0)
+ {
+ buf.append("PREC|");
+ }
+ if ((analysis & BIT_PRECEDING_SIBLING) != 0)
+ {
+ buf.append("PRECS|");
+ }
+ if ((analysis & BIT_SELF) != 0)
+ {
+ buf.append(".|");
+ }
+ if ((analysis & BIT_FILTER) != 0)
+ {
+ buf.append("FLT|");
+ }
+ if ((analysis & BIT_ROOT) != 0)
+ {
+ buf.append("R|");
+ }
+ return buf.toString();
+ }
+
+ /** Set to true for diagnostics about walker creation */
+ static final boolean DEBUG_PATTERN_CREATION = false;
+
+ /** Set to true for diagnostics about walker creation */
+ static final boolean DEBUG_WALKER_CREATION = false;
+
+ /** Set to true for diagnostics about iterator creation */
+ static final boolean DEBUG_ITERATOR_CREATION = false;
+
+ public static boolean hasPredicate(int analysis)
+ {
+ return (0 != (analysis & BIT_PREDICATE));
+ }
+
+ public static boolean isWild(int analysis)
+ {
+ return (0 != (analysis & BIT_NODETEST_ANY));
+ }
+
+ public static boolean walksAncestors(int analysis)
+ {
+ return isSet(analysis, BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);
+ }
+
+ public static boolean walksAttributes(int analysis)
+ {
+ return (0 != (analysis & BIT_ATTRIBUTE));
+ }
+
+ public static boolean walksNamespaces(int analysis)
+ {
+ return (0 != (analysis & BIT_NAMESPACE));
+ }
+
+ public static boolean walksChildren(int analysis)
+ {
+ return (0 != (analysis & BIT_CHILD));
+ }
+
+ public static boolean walksDescendants(int analysis)
+ {
+ return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF | BIT_ANY_DESCENDANT_FROM_ROOT);
+ }
+
+ public static boolean walksSubtree(int analysis)
+ {
+ return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF | BIT_CHILD);
+ }
+
+ public static boolean walksSubtreeOnlyMaybeAbsolute(int analysis)
+ {
+ return walksSubtree(analysis)
+ && !walksExtraNodes(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis);
+ }
+
+ public static boolean walksSubtreeOnly(int analysis)
+ {
+ return walksSubtreeOnlyMaybeAbsolute(analysis) && !isAbsolute(analysis);
+ }
+
+ public static boolean walksFilteredList(int analysis)
+ {
+ return isSet(analysis, BIT_FILTER);
+ }
+
+ public static boolean walksSubtreeOnlyFromRootOrContext(int analysis)
+ {
+ return walksSubtree(analysis)
+ && !walksExtraNodes(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && !isSet(analysis, BIT_FILTER);
+ }
+
+ public static boolean walksInDocOrder(int analysis)
+ {
+ return (
+ walksSubtreeOnlyMaybeAbsolute(analysis)
+ || walksExtraNodesOnly(analysis)
+ || walksFollowingOnlyMaybeAbsolute(analysis))
+ && !isSet(analysis, BIT_FILTER);
+ }
+
+ public static boolean walksFollowingOnlyMaybeAbsolute(int analysis)
+ {
+ return isSet(analysis, BIT_SELF | BIT_FOLLOWING_SIBLING | BIT_FOLLOWING)
+ && !walksSubtree(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis);
+ }
+
+ public static boolean walksUp(int analysis)
+ {
+ return isSet(analysis, BIT_PARENT | BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);
+ }
+
+ public static boolean walksSideways(int analysis)
+ {
+ return isSet(
+ analysis,
+ BIT_FOLLOWING
+ | BIT_FOLLOWING_SIBLING
+ | BIT_PRECEDING
+ | BIT_PRECEDING_SIBLING);
+ }
+
+ public static boolean walksExtraNodes(int analysis)
+ {
+ return isSet(analysis, BIT_NAMESPACE | BIT_ATTRIBUTE);
+ }
+
+ public static boolean walksExtraNodesOnly(int analysis)
+ {
+ return walksExtraNodes(analysis)
+ && !isSet(analysis, BIT_SELF)
+ && !walksSubtree(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && !isAbsolute(analysis);
+ }
+
+ public static boolean isAbsolute(int analysis)
+ {
+ return isSet(analysis, BIT_ROOT | BIT_FILTER);
+ }
+
+ public static boolean walksChildrenOnly(int analysis)
+ {
+ return walksChildren(analysis)
+ && !isSet(analysis, BIT_SELF)
+ && !walksExtraNodes(analysis)
+ && !walksDescendants(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT));
+ }
+
+ public static boolean walksChildrenAndExtraAndSelfOnly(int analysis)
+ {
+ return walksChildren(analysis)
+ && !walksDescendants(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT));
+ }
+
+ public static boolean walksDescendantsAndExtraAndSelfOnly(int analysis)
+ {
+ return !walksChildren(analysis)
+ && walksDescendants(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT));
+ }
+
+ public static boolean walksSelfOnly(int analysis)
+ {
+ return isSet(analysis, BIT_SELF)
+ && !walksSubtree(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && !isAbsolute(analysis);
+ }
+
+ public static boolean walksUpOnly(int analysis)
+ {
+ return !walksSubtree(analysis)
+ && walksUp(analysis)
+ && !walksSideways(analysis)
+ && !isAbsolute(analysis);
+ }
+
+ public static boolean walksDownOnly(int analysis)
+ {
+ return walksSubtree(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && !isAbsolute(analysis);
+ }
+
+ public static boolean walksDownExtraOnly(int analysis)
+ {
+ return walksSubtree(analysis)
+ && walksExtraNodes(analysis)
+ && !walksUp(analysis)
+ && !walksSideways(analysis)
+ && !isAbsolute(analysis);
+ }
+
+ public static boolean canSkipSubtrees(int analysis)
+ {
+ return isSet(analysis, BIT_CHILD) | walksSideways(analysis);
+ }
+
+ public static boolean canCrissCross(int analysis)
+ {
+ // This could be done faster. Coded for clarity.
+ if (walksSelfOnly(analysis))
+ return false;
+ else
+ if (walksDownOnly(analysis) && !canSkipSubtrees(analysis))
+ return false;
+ else
+ if (walksChildrenAndExtraAndSelfOnly(analysis))
+ return false;
+ else
+ if (walksDescendantsAndExtraAndSelfOnly(analysis))
+ return false;
+ else
+ if (walksUpOnly(analysis))
+ return false;
+ else
+ if (walksExtraNodesOnly(analysis))
+ return false;
+ else
+ if (walksSubtree(analysis)
+ && (walksSideways(analysis)
+ || walksUp(analysis)
+ || canSkipSubtrees(analysis)))
+ return true;
+ else
+ return false;
+ }
+
+ /**
+ * Tell if the pattern can be 'walked' with the iteration steps in natural
+ * document order, without duplicates.
+ *
+ * @param analysis The general analysis of the pattern.
+ *
+ * @return true if the walk can be done in natural order.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ static public boolean isNaturalDocOrder(int analysis)
+ {
+ if (canCrissCross(analysis)
+ || isSet(analysis, BIT_NAMESPACE)
+ || walksFilteredList(analysis))
+ return false;
+
+ if (walksInDocOrder(analysis))
+ return true;
+
+ return false;
+ }
+
+ public static boolean isOneStep(int analysis)
+ {
+ return (analysis & BITS_COUNT) == 0x00000001;
+ }
+
+ public static int getStepCount(int analysis)
+ {
+ return (analysis & BITS_COUNT);
+ }
+
+ /**
+ * Tell if the pattern can be 'walked' with the iteration steps in natural
+ * document order, without duplicates.
+ *
+ * @param pathExpr Root of the path expression being analyzed.
+ * @param stepIndex The top-level step index withing the iterator.
+ * @param analysis The general analysis of the pattern.
+ *
+ * @return true if the walk can be done in natural order.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ private static boolean isNaturalDocOrder(
+ PathExpr pathExpr,
+ int stepIndex,
+ int analysis)
+ throws javax.xml.transform.TransformerException
+ {
+ if (canCrissCross(analysis))
+ return false;
+
+ // Namespaces can present some problems, so just punt if we're looking for
+ // these.
+ if (isSet(analysis, BIT_NAMESPACE))
+ return false;
+
+ // The following, preceding, following-sibling, and preceding sibling can
+ // be found in doc order if we get to this point, but if they occur
+ // together, they produce
+ // duplicates, so it's better for us to eliminate this case so we don't
+ // have to check for duplicates during runtime if we're using a
+ // WalkingIterator.
+ if (isSet(analysis, BIT_FOLLOWING | BIT_FOLLOWING_SIBLING)
+ && isSet(analysis, BIT_PRECEDING | BIT_PRECEDING_SIBLING))
+ return false;
+
+ // OK, now we have to check for select="@*/axis::*" patterns, which
+ // can also cause duplicates to happen. But select="axis*/@::*" patterns
+ // are OK, as are select="@foo/axis::*" patterns.
+ // Unfortunately, we can't do this just via the analysis bits.
+
+ int stepType;
+ boolean foundWildAttribute = false;
+
+ // Steps that can traverse anything other than down a
+ // subtree or that can produce duplicates when used in
+ // combonation are counted with this variable.
+ int potentialDuplicateMakingStepCount = 0;
+
+ int numSteps = pathExpr.jjtGetNumChildren();
+
+ for (int i = 0; i < numSteps; i++)
+ {
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(stepIndex);
+
+ Node firstChild = stepExpr.jjtGetChild(0);
+ if (firstChild instanceof PatternAxis)
+ {
+ Node secondChild = stepExpr.jjtGetChild(1);
+ org.apache.xpath.parser.NodeTest nt;
+ boolean isTotallyWild;
+
+ if (secondChild instanceof org.apache.xpath.parser.NodeTest)
+ {
+ nt = (org.apache.xpath.parser.NodeTest) secondChild;
+ isTotallyWild = nt.isTotallyWild();
+ // Double check.
+ if (0
+ != (nt.getWhatToShow() | org.apache.xml.dtm.DTMFilter.SHOW_ALL))
+ {
+ isTotallyWild = true;
+ }
+ }
+ else
+ {
+ isTotallyWild = false;
+ nt = null;
+ }
+
+ int axis = ((PatternAxis) firstChild).getAxis();
+ switch (axis)
+ {
+ case Axis.NAMESPACE :
+ case Axis.ATTRIBUTE :
+ if (foundWildAttribute) // Maybe not needed, but be safe.
+ return false;
+ if (isTotallyWild)
+ foundWildAttribute = true;
+ break;
+ case Axis.DESCENDANTSFROMROOT :
+ case Axis.DESCENDANTSORSELFFROMROOT :
+ case Axis.ANCESTOR :
+ case Axis.ANCESTORORSELF :
+ case Axis.DESCENDANT :
+ case Axis.DESCENDANTORSELF :
+ case Axis.FOLLOWING :
+ case Axis.FOLLOWINGSIBLING :
+ case Axis.PRECEDING :
+ case Axis.PRECEDINGSIBLING :
+ case Axis.PARENT :
+ if (potentialDuplicateMakingStepCount > 0)
+ return false;
+ potentialDuplicateMakingStepCount++;
+ case Axis.ROOT :
+ case Axis.CHILD :
+ case Axis.SELF :
+ if (foundWildAttribute)
+ return false;
+ break;
+ default :
+ // TBD: Change the wording of this expression.
+ throw new RuntimeException(
+ XSLMessages.createXPATHMessage(
+ XPATHErrorResources.ER_NULL_ERROR_HANDLER,
+ new Object[] { firstChild.getClass().getName()}));
+ //"Programmer's assertion: unknown opcode: "
+ //+ stepType);
+ }
+ }
+ else
+ {
+ // For the moment return false if it is a filter expression.
+ // Ideally, we'd like to follow the analysis into a variable or function.
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Special purpose function to see if we can optimize the pattern for
+ * a DescendantIterator.
+ *
+ * @param pathExpr Root of the path expression being analyzed.
+ * @param stepIndex The top-level step index withing the iterator.
+ *
+ * @return 32 bits as an integer that give information about the location
+ * path as a whole.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ private static boolean isOptimizableForDescendantIterator(
+ PathExpr pathExpr,
+ int stepIndex)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int stepType;
+ boolean foundDESCENDANTSFROMROOT = false;
+
+ int nodeTestType = DTMFilter.SHOW_ALL;
+
+ int numSteps = pathExpr.jjtGetNumChildren();
+
+ if (numSteps > 2)
+ return false;
+
+ for (int i = 0; i < numSteps; i++)
+ {
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(i);
+
+ int axis = stepExpr.getAxis();
+ switch (axis)
+ {
+ case Axis.SELF :
+ case Axis.ATTRIBUTE :
+ case Axis.ROOT :
+ case Axis.ANCESTOR :
+ case Axis.ANCESTORORSELF :
+ case Axis.NAMESPACE :
+ case Axis.DESCENDANT :
+ case Axis.DESCENDANTORSELF :
+ case Axis.FOLLOWING :
+ case Axis.FOLLOWINGSIBLING :
+ case Axis.PRECEDING :
+ case Axis.PRECEDINGSIBLING :
+ case Axis.PARENT :
+ return false;
+ case Axis.DESCENDANTSORSELFFROMROOT :
+ case Axis.DESCENDANTSFROMROOT :
+ if (0 != i)
+ return false;
+ foundDESCENDANTSFROMROOT = true;
+ if (analyzePredicate(stepExpr))
+ {
+ return false;
+ }
+ break;
+ case Axis.CHILD :
+ if (!foundDESCENDANTSFROMROOT || 1 != i)
+ return false;
+ if(mightBeProximate(stepExpr))
+ return false;
+ break;
+ default :
+ return false;
+ // TBD: Change the wording of this expression.
+ // throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{firstChild.getClass().getName()})); //"Programmer's assertion: unknown opcode: "
+ }
+
+ // TBD: I don't think the code will function properly without this.
+ // boolean mightBeProximate = mightBeProximate(compiler, stepOpCodePos, stepType);
+ // if(mightBeProximate)
+ // return false;
+
+ }
+
+ return true;
+ }
+
+ // TBD: Needs to use methods on the expressions instead of instanceof!
+ /**
+ * Tell if the predicates need to have proximity knowledge.
+ */
+ public static boolean mightBeProximate(Expression stepExpr)
+ throws javax.xml.transform.TransformerException
+ {
+
+ boolean mightBeProximate = false;
+ int argLen;
+
+ Node lastChild = stepExpr.jjtGetChild(stepExpr.jjtGetNumChildren() - 1);
+ if (lastChild instanceof Predicates)
+ {
+ Predicates preds = (Predicates) lastChild;
+ int numChildren = preds.jjtGetNumChildren();
+ for (int i = 0; i < numChildren; i++)
+ {
+ Expression expr = (Expression) preds.jjtGetChild(i);
+
+ if (expr instanceof org.apache.xpath.operations.Variable)
+ {
+ return true;
+ // Would need more smarts to tell if this could be a number or not!
+ }
+ else
+ if (expr instanceof org.apache.xpath.objects.XNumber)
+ {
+ return true;
+ }
+ else
+ if (expr instanceof org.apache.xpath.parser.PathExpr
+ || expr instanceof LocPathIterator)
+ {
+ // OK, keep going, we don't want to recurse.
+ }
+ else
+ if (expr instanceof org.apache.xpath.functions.Function)
+ {
+ boolean isProx =
+ functionProximateOrContainsProximate(
+ (org.apache.xpath.functions.Function) expr);
+ if (isProx)
+ return true;
+ break;
+
+ }
+ else
+ {
+ int numChildrenOfExpr = expr.jjtGetNumChildren();
+ for (int j = 0; j < numChildrenOfExpr; j++)
+ {
+ Expression exprChild = (Expression) expr.jjtGetChild(j);
+ boolean prox = isProximateInnerExpr(exprChild);
+ if (prox)
+ return true;
+ }
+ }
+
+ }
+ }
+
+ return mightBeProximate;
+ }
+
+ // TBD: Needs to use methods on the expressions instead of instanceof!
+ static boolean functionProximateOrContainsProximate(
+ org.apache.xpath.functions.Function func)
+ {
+ if (func instanceof org.apache.xpath.functions.FuncLast
+ || func instanceof org.apache.xpath.functions.FuncPosition)
+ {
+ return true;
+ }
+ else
+ {
+ int numChildren = func.jjtGetNumChildren();
+ for (int i = 0; i < numChildren; i++)
+ {
+ Expression expr = (Expression) func.jjtGetChild(i);
+ boolean prox = isProximateInnerExpr(expr);
+ if (prox)
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // TBD: Needs to use methods on the expressions instead of instanceof!
+ static boolean isProximateInnerExpr(Expression expr)
+ {
+ boolean mightBeProximate = false;
+ int argLen;
+
+ if (expr instanceof org.apache.xpath.parser.PathExpr
+ || expr instanceof LocPathIterator)
+ {
+ // OK, we don't want to recurse!
+ }
+ else
+ if (expr instanceof org.apache.xpath.functions.Function)
+ {
+ boolean isProx =
+ functionProximateOrContainsProximate(
+ (org.apache.xpath.functions.Function) expr);
+ if (isProx)
+ return true;
+ }
+ else
+ {
+ int numChildrenOfExpr = expr.jjtGetNumChildren();
+ for (int j = 0; j < numChildrenOfExpr; j++)
+ {
+ Expression exprChild = (Expression) expr.jjtGetChild(j);
+ boolean prox = isProximateInnerExpr(exprChild);
+ if (prox)
+ return true;
+ }
+ }
+ return mightBeProximate;
+ }
+
+ /**
+ * Create the proper Walker from the axes type.
+ *
+ * @param compiler non-null reference to compiler object that has processed
+ * the XPath operations into an opcode map.
+ * @param opPos The opcode position for the step.
+ * @param lpi The owning location path iterator.
+ * @param analysis 32 bits of analysis, from which the type of AxesWalker
+ * may be influenced.
+ *
+ * @return non-null reference to AxesWalker derivative.
+ * @throws RuntimeException if the input is bad.
+ */
+ private static AxesWalker createDefaultWalker(
+ StepExpr stepExpr,
+ WalkingIterator lpi,
+ int analysis)
+ {
+
+ AxesWalker ai = null;
+
+ PatternAxis patternAxis = stepExpr.getAxisExpr();
+ if (null != patternAxis)
+ {
+ boolean isTotallyWild = stepExpr.isTotallyWild();
+
+ int axis = stepExpr.getAxis();
+ switch (axis)
+ {
+ case Axis.ROOT :
+ ai = new AxesWalker(lpi, Axis.ROOT);
+ break;
+ case Axis.DESCENDANTSFROMROOT :
+ ai = new AxesWalker(lpi, Axis.DESCENDANTSFROMROOT);
+ break;
+ case Axis.DESCENDANTSORSELFFROMROOT :
+ ai = new AxesWalker(lpi, Axis.DESCENDANTSORSELFFROMROOT);
+ break;
+ case Axis.ANCESTOR :
+ ai = new ReverseAxesWalker(lpi, Axis.ANCESTOR);
+ break;
+ case Axis.ANCESTORORSELF :
+ ai = new ReverseAxesWalker(lpi, Axis.ANCESTORORSELF);
+ break;
+ case Axis.ATTRIBUTE :
+ ai = new AxesWalker(lpi, Axis.ATTRIBUTE);
+ break;
+ case Axis.NAMESPACE :
+ ai = new AxesWalker(lpi, Axis.NAMESPACE);
+ break;
+ case Axis.CHILD :
+ ai = new AxesWalker(lpi, Axis.CHILD);
+ break;
+ case Axis.DESCENDANT :
+ ai = new AxesWalker(lpi, Axis.DESCENDANT);
+ break;
+ case Axis.DESCENDANTORSELF :
+ ai = new AxesWalker(lpi, Axis.DESCENDANTORSELF);
+ break;
+ case Axis.FOLLOWING :
+ ai = new AxesWalker(lpi, Axis.FOLLOWING);
+ break;
+ case Axis.FOLLOWINGSIBLING :
+ ai = new AxesWalker(lpi, Axis.FOLLOWINGSIBLING);
+ break;
+ case Axis.PRECEDING :
+ ai = new ReverseAxesWalker(lpi, Axis.PRECEDING);
+ break;
+ case Axis.PRECEDINGSIBLING :
+ ai = new ReverseAxesWalker(lpi, Axis.PRECEDINGSIBLING);
+ break;
+ case Axis.PARENT :
+ ai = new ReverseAxesWalker(lpi, Axis.PARENT);
+ break;
+ case Axis.SELF :
+ ai = new AxesWalker(lpi, Axis.SELF);
+ break;
+ default :
+ throw new RuntimeException(
+ XSLMessages.createXPATHMessage(
+ XPATHErrorResources.ER_NULL_ERROR_HANDLER,
+ new Object[] { StepExpr.class.getName()}));
+ //"Programmer's assertion: unknown opcode: "
+ //+ stepType);
+ }
+ int whatToShow = stepExpr.getWhatToShow();
+
+ /*
+ System.out.print("construct: ");
+ NodeTest.debugWhatToShow(whatToShow);
+ System.out.println("or stuff: "+(whatToShow & (DTMFilter.SHOW_ATTRIBUTE
+ | DTMFilter.SHOW_ELEMENT
+ | DTMFilter.SHOW_PROCESSING_INSTRUCTION)));
+ */
+ if ((0
+ == (whatToShow
+ & (DTMFilter.SHOW_ATTRIBUTE
+ | DTMFilter.SHOW_NAMESPACE
+ | DTMFilter.SHOW_ELEMENT
+ | DTMFilter.SHOW_PROCESSING_INSTRUCTION)))
+ || (whatToShow == DTMFilter.SHOW_ALL))
+ ai.initNodeTest(whatToShow);
+ else
+ {
+ ai.initNodeTest(
+ whatToShow,
+ stepExpr.getNamespaceURI(),
+ stepExpr.getLocalName());
+ }
+ }
+ else
+ {
+ // FilterWalker
+ if (DEBUG_WALKER_CREATION)
+ System.out.println(
+ "new walker: FilterExprWalker: "
+ + analysis
+ + ", "
+ + stepExpr.toString());
+
+ ai = new FilterExprWalker(lpi);
+ try
+ {
+ ai.init(stepExpr);
+ }
+ catch (TransformerException te)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(te);
+ }
+ ai.initNodeTest(DTMFilter.SHOW_ALL);
+ }
+
+ return ai;
+ }
+
+ /**
+ * <meta name="usage" content="advanced"/>
+ * This method is for building an array of possible levels
+ * where the target element(s) could be found for a match.
+ * @param xpath The xpath that is executing.
+ * @param context The current source tree context node.
+ *
+ * @param lpi The owning location path iterator object.
+ * @param compiler non-null reference to compiler object that has processed
+ * the XPath operations into an opcode map.
+ * @param stepOpCodePos The opcode position for the step.
+ * @param stepIndex The top-level step index withing the iterator.
+ *
+ * @return non-null AxesWalker derivative.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ static AxesWalker loadWalkers(
+ org.apache.xpath.parser.PathExpr pathExpr,
+ WalkingIterator lpi)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int stepType;
+ AxesWalker firstWalker = null;
+ AxesWalker walker, prevWalker = null;
+ int analysis = analyze(pathExpr, 0);
+ int numSteps = pathExpr.jjtGetNumChildren();
+
+ for (int i = 0; i < numSteps; i++)
+ {
+ StepExpr stepExpr = (StepExpr) pathExpr.jjtGetChild(i);
+
+ walker = createDefaultWalker(stepExpr, lpi, analysis);
+ walker.init(stepExpr);
+
+ // walker.setAnalysis(analysis);
+ if (null == firstWalker)
+ {
+ firstWalker = walker;
+ walker.exprSetParent(lpi);
+ }
+ else
+ {
+ prevWalker.setNextWalker(walker);
+ walker.setPrevWalker(prevWalker);
+ walker.exprSetParent(prevWalker);
+ }
+
+ prevWalker = walker;
+ }
+
+ return firstWalker;
+ }
+
}
+
+//import org.apache.xpath.compiler.OpCodes;
+//import org.apache.xpath.compiler.Compiler;
+//import org.apache.xpath.compiler.FunctionTable;
+//import org.apache.xpath.patterns.NodeTest;
+//import org.apache.xpath.patterns.StepPattern;
+//import org.apache.xpath.patterns.ContextMatchStepPattern;
+//import org.apache.xpath.patterns.FunctionPattern;
+//import org.apache.xpath.Expression;
+//import org.apache.xpath.objects.XNumber;
+//import org.apache.xalan.res.XSLMessages;
+//import org.apache.xpath.res.XPATHErrorResources;
+//
+//import org.apache.xml.dtm.DTMFilter;
+//import org.apache.xml.dtm.DTMIterator;
+//import org.apache.xml.dtm.Axis;
+//
+///**
+// * This class is both a factory for XPath location path expressions,
+// * which are built from the opcode map output, and an analysis engine
+// * for the location path expressions in order to provide optimization hints.
+// */
+//public class WalkerFactory
+//{
+//
+// /**
+// * <meta name="usage" content="advanced"/>
+// * This method is for building an array of possible levels
+// * where the target element(s) could be found for a match.
+// * @param xpath The xpath that is executing.
+// * @param context The current source tree context node.
+// *
+// * @param lpi The owning location path iterator.
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param stepOpCodePos The opcode position for the step.
+// *
+// * @return non-null AxesWalker derivative.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// static AxesWalker loadOneWalker(
+// WalkingIterator lpi, Compiler compiler, int stepOpCodePos)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// AxesWalker firstWalker = null;
+// int stepType = compiler.getOpMap()[stepOpCodePos];
+//
+// if (stepType != OpCodes.ENDOP)
+// {
+//
+// // m_axesWalkers = new AxesWalker[1];
+// // As we unwind from the recursion, create the iterators.
+// firstWalker = createDefaultWalker(compiler, stepType, lpi, 0);
+//
+// firstWalker.init(compiler, stepOpCodePos, stepType);
+// }
+//
+// return firstWalker;
+// }
+//
+// /**
+// * <meta name="usage" content="advanced"/>
+// * This method is for building an array of possible levels
+// * where the target element(s) could be found for a match.
+// * @param xpath The xpath that is executing.
+// * @param context The current source tree context node.
+// *
+// * @param lpi The owning location path iterator object.
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param stepOpCodePos The opcode position for the step.
+// * @param stepIndex The top-level step index withing the iterator.
+// *
+// * @return non-null AxesWalker derivative.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// static AxesWalker loadWalkers(
+// WalkingIterator lpi, Compiler compiler, int stepOpCodePos, int stepIndex)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// int stepType;
+// AxesWalker firstWalker = null;
+// AxesWalker walker, prevWalker = null;
+// int ops[] = compiler.getOpMap();
+// int analysis = analyze(compiler, stepOpCodePos, stepIndex);
+//
+// while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
+// {
+// walker = createDefaultWalker(compiler, stepOpCodePos, lpi, analysis);
+//
+// walker.init(compiler, stepOpCodePos, stepType);
+// walker.exprSetParent(lpi);
+//
+// // walker.setAnalysis(analysis);
+// if (null == firstWalker)
+// {
+// firstWalker = walker;
+// }
+// else
+// {
+// prevWalker.setNextWalker(walker);
+// walker.setPrevWalker(prevWalker);
+// }
+//
+// prevWalker = walker;
+// stepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
+//
+// if (stepOpCodePos < 0)
+// break;
+// }
+//
+// return firstWalker;
+// }
+//
+// public static boolean isSet(int analysis, int bits)
+// {
+// return (0 != (analysis & bits));
+// }
+//
+// public static void diagnoseIterator(String name, int analysis, Compiler compiler)
+// {
+// System.out.println(compiler.toString()+", "+name+", "
+// + Integer.toBinaryString(analysis) + ", "
+// + getAnalysisString(analysis));
+// }
+//
+// /**
+// * Create a new LocPathIterator iterator. The exact type of iterator
+// * returned is based on an analysis of the XPath operations.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param opPos The position of the operation code for this itterator.
+// *
+// * @return non-null reference to a LocPathIterator or derivative.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// 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) &&
+// isWild(analysis) && !hasPredicate(analysis))
+// {
+// if (DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("SelfIteratorNoPredicate", analysis, compiler);
+//
+// // Then use a simple iteration of the attributes, with node test
+// // and predicate testing.
+// iter = new SelfIteratorNoPredicate(compiler, opPos, analysis);
+// }
+// // Is the iteration exactly one child step?
+// else if (walksChildrenOnly(analysis) && isOneStep)
+// {
+//
+// // Does the pattern specify *any* child with no predicate? (i.e. select="child::node()".
+// if (isWild(analysis) && !hasPredicate(analysis))
+// {
+// if (DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("ChildIterator", analysis, compiler);
+//
+// // Use simple child iteration without any test.
+// iter = new ChildIterator(compiler, opPos, analysis);
+// }
+// else
+// {
+// if (DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("ChildTestIterator", analysis, compiler);
+//
+// // Else use simple node test iteration with predicate test.
+// iter = new ChildTestIterator(compiler, opPos, analysis);
+// }
+// }
+// // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
+// else if (isOneStep && walksAttributes(analysis))
+// {
+// if (DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("AttributeIterator", analysis, compiler);
+//
+// // Then use a simple iteration of the attributes, with node test
+// // and predicate testing.
+// iter = new AttributeIterator(compiler, opPos, analysis);
+// }
+// else if(isOneStep && !walksFilteredList(analysis))
+// {
+// if( !walksNamespaces(analysis)
+// && (walksInDocOrder(analysis) || isSet(analysis, BIT_PARENT)))
+// {
+// if (false || DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("OneStepIteratorForward", analysis, compiler);
+//
+// // Then use a simple iteration of the attributes, with node test
+// // and predicate testing.
+// iter = new OneStepIteratorForward(compiler, opPos, analysis);
+// }
+// else
+// {
+// if (false || DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("OneStepIterator", analysis, compiler);
+//
+// // Then use a simple iteration of the attributes, with node test
+// // and predicate testing.
+// iter = new OneStepIterator(compiler, opPos, analysis);
+// }
+// }
+//
+// // Analysis of "//center":
+// // bits: 1001000000001010000000000000011
+// // count: 3
+// // root
+// // child:node()
+// // BIT_DESCENDANT_OR_SELF
+// // It's highly possible that we should have a seperate bit set for
+// // "//foo" patterns.
+// // For at least the time being, we can't optimize patterns like
+// // "//table[3]", because this has to be analyzed as
+// // "/descendant-or-self::node()/table[3]" in order for the indexes
+// // to work right.
+// else if (isOptimizableForDescendantIterator(compiler, firstStepPos, 0)
+// // && getStepCount(analysis) <= 3
+// // && walksDescendants(analysis)
+// // && walksSubtreeOnlyFromRootOrContext(analysis)
+// )
+// {
+// if (DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("DescendantIterator", analysis, compiler);
+//
+// iter = new DescendantIterator(compiler, opPos, analysis);
+// }
+// else
+// {
+// if(isNaturalDocOrder(compiler, firstStepPos, 0, analysis))
+// {
+// if (false || DEBUG_ITERATOR_CREATION)
+// {
+// diagnoseIterator("WalkingIterator", analysis, compiler);
+// }
+//
+// iter = new WalkingIterator(compiler, opPos, analysis, true);
+// }
+// else
+// {
+//// if (DEBUG_ITERATOR_CREATION)
+//// diagnoseIterator("MatchPatternIterator", analysis, compiler);
+////
+//// return new MatchPatternIterator(compiler, opPos, analysis);
+// if (DEBUG_ITERATOR_CREATION)
+// diagnoseIterator("WalkingIteratorSorted", analysis, compiler);
+//
+// iter = new WalkingIteratorSorted(compiler, opPos, analysis, true);
+// }
+// }
+// if(iter instanceof LocPathIterator)
+// ((LocPathIterator)iter).setIsTopLevel(isTopLevel);
+//
+// return iter;
+// }
+//
+// /**
+// * Special purpose function to see if we can optimize the pattern for
+// * a DescendantIterator.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param stepOpCodePos The opcode position for the step.
+// * @param stepIndex The top-level step index withing the iterator.
+// *
+// * @return 32 bits as an integer that give information about the location
+// * path as a whole.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// public static int getAxisFromStep(
+// Compiler compiler, int stepOpCodePos)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// int ops[] = compiler.getOpMap();
+// int stepType = ops[stepOpCodePos];
+//
+// switch (stepType)
+// {
+// case OpCodes.FROM_FOLLOWING :
+// return Axis.FOLLOWING;
+// case OpCodes.FROM_FOLLOWING_SIBLINGS :
+// return Axis.FOLLOWINGSIBLING;
+// case OpCodes.FROM_PRECEDING :
+// return Axis.PRECEDING;
+// case OpCodes.FROM_PRECEDING_SIBLINGS :
+// return Axis.PRECEDINGSIBLING;
+// case OpCodes.FROM_PARENT :
+// return Axis.PARENT;
+// case OpCodes.FROM_NAMESPACE :
+// return Axis.NAMESPACE;
+// case OpCodes.FROM_ANCESTORS :
+// return Axis.ANCESTOR;
+// case OpCodes.FROM_ANCESTORS_OR_SELF :
+// return Axis.ANCESTORORSELF;
+// case OpCodes.FROM_ATTRIBUTES :
+// return Axis.ATTRIBUTE;
+// case OpCodes.FROM_ROOT :
+// return Axis.ROOT;
+// case OpCodes.FROM_CHILDREN :
+// return Axis.CHILD;
+// case OpCodes.FROM_DESCENDANTS_OR_SELF :
+// return Axis.DESCENDANTORSELF;
+// case OpCodes.FROM_DESCENDANTS :
+// return Axis.DESCENDANT;
+// case OpCodes.FROM_SELF :
+// return Axis.SELF;
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// case OpCodes.OP_VARIABLE :
+// return Axis.FILTEREDLIST;
+// }
+//
+// throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
+// //+ stepType);
+// }
+//
+// /**
+// * Get a corresponding BIT_XXX from an axis.
+// * @param axis One of Axis.ANCESTOR, etc.
+// * @return One of BIT_ANCESTOR, etc.
+// */
+// static public int getAnalysisBitFromAxes(int axis)
+// {
+// switch (axis) // Generate new traverser
+// {
+// case Axis.ANCESTOR :
+// return BIT_ANCESTOR;
+// case Axis.ANCESTORORSELF :
+// return BIT_ANCESTOR_OR_SELF;
+// case Axis.ATTRIBUTE :
+// return BIT_ATTRIBUTE;
+// case Axis.CHILD :
+// return BIT_CHILD;
+// case Axis.DESCENDANT :
+// return BIT_DESCENDANT;
+// case Axis.DESCENDANTORSELF :
+// return BIT_DESCENDANT_OR_SELF;
+// case Axis.FOLLOWING :
+// return BIT_FOLLOWING;
+// case Axis.FOLLOWINGSIBLING :
+// return BIT_FOLLOWING_SIBLING;
+// case Axis.NAMESPACE :
+// case Axis.NAMESPACEDECLS :
+// return BIT_NAMESPACE;
+// case Axis.PARENT :
+// return BIT_PARENT;
+// case Axis.PRECEDING :
+// return BIT_PRECEDING;
+// case Axis.PRECEDINGSIBLING :
+// return BIT_PRECEDING_SIBLING;
+// case Axis.SELF :
+// return BIT_SELF;
+// case Axis.ALLFROMNODE :
+// return BIT_DESCENDANT_OR_SELF;
+// // case Axis.PRECEDINGANDANCESTOR :
+// case Axis.DESCENDANTSFROMROOT :
+// case Axis.ALL :
+// case Axis.DESCENDANTSORSELFFROMROOT :
+// return BIT_ANY_DESCENDANT_FROM_ROOT;
+// case Axis.ROOT :
+// return BIT_ROOT;
+// case Axis.FILTEREDLIST :
+// return BIT_FILTER;
+// default :
+// return BIT_FILTER;
+// }
+// }
+//
+// static boolean functionProximateOrContainsProximate(Compiler compiler,
+// int opPos)
+// {
+// int endFunc = opPos + compiler.getOp(opPos + 1) - 1;
+// opPos = compiler.getFirstChildPos(opPos);
+// int funcID = compiler.getOp(opPos);
+// // System.out.println("funcID: "+funcID);
+// // System.out.println("opPos: "+opPos);
+// // System.out.println("endFunc: "+endFunc);
+// switch(funcID)
+// {
+// case FunctionTable.FUNC_LAST:
+// case FunctionTable.FUNC_POSITION:
+// return true;
+// default:
+// opPos++;
+// int i = 0;
+// for (int p = opPos; p < endFunc; p = compiler.getNextOpPos(p), i++)
+// {
+// int innerExprOpPos = p+2;
+// int argOp = compiler.getOp(innerExprOpPos);
+// boolean prox = isProximateInnerExpr(compiler, innerExprOpPos);
+// if(prox)
+// return true;
+// }
+//
+// }
+// return false;
+// }
+//
+// static boolean isProximateInnerExpr(Compiler compiler, int opPos)
+// {
+// int op = compiler.getOp(opPos);
+// int innerExprOpPos = opPos+2;
+// switch(op)
+// {
+// case OpCodes.OP_ARGUMENT:
+// if(isProximateInnerExpr(compiler, innerExprOpPos))
+// return true;
+// break;
+// case OpCodes.OP_VARIABLE:
+// case OpCodes.OP_NUMBERLIT:
+// case OpCodes.OP_LITERAL:
+// case OpCodes.OP_LOCATIONPATH:
+// break; // OK
+// case OpCodes.OP_FUNCTION:
+// boolean isProx = functionProximateOrContainsProximate(compiler, opPos);
+// if(isProx)
+// return true;
+// break;
+// case OpCodes.OP_GT:
+// case OpCodes.OP_GTE:
+// case OpCodes.OP_LT:
+// case OpCodes.OP_LTE:
+// case OpCodes.OP_EQUALS:
+// int leftPos = compiler.getFirstChildPos(op);
+// int rightPos = compiler.getNextOpPos(leftPos);
+// isProx = isProximateInnerExpr(compiler, leftPos);
+// if(isProx)
+// return true;
+// isProx = isProximateInnerExpr(compiler, rightPos);
+// if(isProx)
+// return true;
+// break;
+// default:
+// return true; // be conservative...
+// }
+// return false;
+// }
+//
+// /**
+// * Tell if the predicates need to have proximity knowledge.
+// */
+// public static boolean mightBeProximate(Compiler compiler, int opPos, int stepType)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// boolean mightBeProximate = false;
+// int argLen;
+//
+// switch (stepType)
+// {
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// argLen = compiler.getArgLength(opPos);
+// break;
+// default :
+// argLen = compiler.getArgLengthOfStep(opPos);
+// }
+//
+// int predPos = compiler.getFirstPredicateOpPos(opPos);
+// int count = 0;
+//
+// while (OpCodes.OP_PREDICATE == compiler.getOp(predPos))
+// {
+// count++;
+//
+// int innerExprOpPos = predPos+2;
+// int predOp = compiler.getOp(innerExprOpPos);
+//
+// switch(predOp)
+// {
+// case OpCodes.OP_VARIABLE:
+// return true; // Would need more smarts to tell if this could be a number or not!
+// case OpCodes.OP_LOCATIONPATH:
+// // OK.
+// break;
+// case OpCodes.OP_NUMBER:
+// case OpCodes.OP_NUMBERLIT:
+// return true; // that's all she wrote!
+// case OpCodes.OP_FUNCTION:
+// boolean isProx
+// = functionProximateOrContainsProximate(compiler, innerExprOpPos);
+// if(isProx)
+// return true;
+// break;
+// case OpCodes.OP_GT:
+// case OpCodes.OP_GTE:
+// case OpCodes.OP_LT:
+// case OpCodes.OP_LTE:
+// case OpCodes.OP_EQUALS:
+// int leftPos = compiler.getFirstChildPos(innerExprOpPos);
+// int rightPos = compiler.getNextOpPos(leftPos);
+// isProx = isProximateInnerExpr(compiler, leftPos);
+// if(isProx)
+// return true;
+// isProx = isProximateInnerExpr(compiler, rightPos);
+// if(isProx)
+// return true;
+// break;
+// default:
+// return true; // be conservative...
+// }
+//
+// predPos = compiler.getNextOpPos(predPos);
+// }
+//
+// return mightBeProximate;
+// }
+//
+// /**
+// * Special purpose function to see if we can optimize the pattern for
+// * a DescendantIterator.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param stepOpCodePos The opcode position for the step.
+// * @param stepIndex The top-level step index withing the iterator.
+// *
+// * @return 32 bits as an integer that give information about the location
+// * path as a whole.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// private static boolean isOptimizableForDescendantIterator(
+// Compiler compiler, int stepOpCodePos, int stepIndex)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// int stepType;
+// int ops[] = compiler.getOpMap();
+// int stepCount = 0;
+// boolean foundDorDS = false;
+// boolean foundSelf = false;
+// boolean foundDS = false;
+//
+// int nodeTestType = OpCodes.NODETYPE_NODE;
+//
+// while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
+// {
+// // The DescendantIterator can only do one node test. If there's more
+// // than one, use another iterator.
+// if(nodeTestType != OpCodes.NODETYPE_NODE && nodeTestType != OpCodes.NODETYPE_ROOT)
+// return false;
+//
+// stepCount++;
+// if(stepCount > 3)
+// return false;
+//
+// boolean mightBeProximate = mightBeProximate(compiler, stepOpCodePos, stepType);
+// if(mightBeProximate)
+// return false;
+//
+// switch (stepType)
+// {
+// case OpCodes.FROM_FOLLOWING :
+// case OpCodes.FROM_FOLLOWING_SIBLINGS :
+// case OpCodes.FROM_PRECEDING :
+// case OpCodes.FROM_PRECEDING_SIBLINGS :
+// case OpCodes.FROM_PARENT :
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// case OpCodes.FROM_NAMESPACE :
+// case OpCodes.FROM_ANCESTORS :
+// case OpCodes.FROM_ANCESTORS_OR_SELF :
+// case OpCodes.FROM_ATTRIBUTES :
+// case OpCodes.MATCH_ATTRIBUTE :
+// case OpCodes.MATCH_ANY_ANCESTOR :
+// case OpCodes.MATCH_IMMEDIATE_ANCESTOR :
+// return false;
+// case OpCodes.FROM_ROOT :
+// if(1 != stepCount)
+// return false;
+// break;
+// case OpCodes.FROM_CHILDREN :
+// if(!foundDS && !(foundDorDS && foundSelf))
+// return false;
+// break;
+// case OpCodes.FROM_DESCENDANTS_OR_SELF :
+// foundDS = true;
+// case OpCodes.FROM_DESCENDANTS :
+// if(3 == stepCount)
+// return false;
+// foundDorDS = true;
+// break;
+// case OpCodes.FROM_SELF :
+// if(1 != stepCount)
+// return false;
+// foundSelf = true;
+// break;
+// default :
+// throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
+// // + stepType);
+// }
+//
+// nodeTestType = compiler.getStepTestType(stepOpCodePos);
+//
+// int nextStepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
+//
+// if (nextStepOpCodePos < 0)
+// break;
+//
+// if(OpCodes.ENDOP != ops[nextStepOpCodePos])
+// {
+// if(compiler.countPredicates(stepOpCodePos) > 0)
+// {
+// return false;
+// }
+// }
+//
+// stepOpCodePos = nextStepOpCodePos;
+// }
+//
+// return true;
+// }
+//
+// /**
+// * Analyze the location path and return 32 bits that give information about
+// * the location path as a whole. See the BIT_XXX constants for meaning about
+// * each of the bits.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param stepOpCodePos The opcode position for the step.
+// * @param stepIndex The top-level step index withing the iterator.
+// *
+// * @return 32 bits as an integer that give information about the location
+// * path as a whole.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// private static int analyze(
+// Compiler compiler, int stepOpCodePos, int stepIndex)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// int stepType;
+// int ops[] = compiler.getOpMap();
+// int stepCount = 0;
+// int analysisResult = 0x00000000; // 32 bits of analysis
+//
+// while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
+// {
+// stepCount++;
+//
+// // String namespace = compiler.getStepNS(stepOpCodePos);
+// // boolean isNSWild = (null != namespace)
+// // ? namespace.equals(NodeTest.WILD) : false;
+// // String localname = compiler.getStepLocalName(stepOpCodePos);
+// // boolean isWild = (null != localname) ? localname.equals(NodeTest.WILD) : false;
+// boolean predAnalysis = analyzePredicate(compiler, stepOpCodePos,
+// stepType);
+//
+// if (predAnalysis)
+// analysisResult |= BIT_PREDICATE;
+//
+// switch (stepType)
+// {
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// analysisResult |= BIT_FILTER;
+// break;
+// case OpCodes.FROM_ROOT :
+// analysisResult |= BIT_ROOT;
+// break;
+// case OpCodes.FROM_ANCESTORS :
+// analysisResult |= BIT_ANCESTOR;
+// break;
+// case OpCodes.FROM_ANCESTORS_OR_SELF :
+// analysisResult |= BIT_ANCESTOR_OR_SELF;
+// break;
+// case OpCodes.FROM_ATTRIBUTES :
+// analysisResult |= BIT_ATTRIBUTE;
+// break;
+// case OpCodes.FROM_NAMESPACE :
+// analysisResult |= BIT_NAMESPACE;
+// break;
+// case OpCodes.FROM_CHILDREN :
+// analysisResult |= BIT_CHILD;
+// break;
+// case OpCodes.FROM_DESCENDANTS :
+// analysisResult |= BIT_DESCENDANT;
+// break;
+// case OpCodes.FROM_DESCENDANTS_OR_SELF :
+//
+// // Use a special bit to to make sure we get the right analysis of "//foo".
+// if (2 == stepCount && BIT_ROOT == analysisResult)
+// {
+// analysisResult |= BIT_ANY_DESCENDANT_FROM_ROOT;
+// }
+//
+// analysisResult |= BIT_DESCENDANT_OR_SELF;
+// break;
+// case OpCodes.FROM_FOLLOWING :
+// analysisResult |= BIT_FOLLOWING;
+// break;
+// case OpCodes.FROM_FOLLOWING_SIBLINGS :
+// analysisResult |= BIT_FOLLOWING_SIBLING;
+// break;
+// case OpCodes.FROM_PRECEDING :
+// analysisResult |= BIT_PRECEDING;
+// break;
+// case OpCodes.FROM_PRECEDING_SIBLINGS :
+// analysisResult |= BIT_PRECEDING_SIBLING;
+// break;
+// case OpCodes.FROM_PARENT :
+// analysisResult |= BIT_PARENT;
+// break;
+// case OpCodes.FROM_SELF :
+// analysisResult |= BIT_SELF;
+// break;
+// case OpCodes.MATCH_ATTRIBUTE :
+// analysisResult |= (BIT_MATCH_PATTERN | BIT_ATTRIBUTE);
+// break;
+// case OpCodes.MATCH_ANY_ANCESTOR :
+// analysisResult |= (BIT_MATCH_PATTERN | BIT_ANCESTOR);
+// break;
+// case OpCodes.MATCH_IMMEDIATE_ANCESTOR :
+// analysisResult |= (BIT_MATCH_PATTERN | BIT_PARENT);
+// break;
+// default :
+// throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
+// //+ stepType);
+// }
+//
+// if (OpCodes.NODETYPE_NODE == ops[stepOpCodePos + 3]) // child::node()
+// {
+// analysisResult |= BIT_NODETEST_ANY;
+// }
+//
+// stepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
+//
+// if (stepOpCodePos < 0)
+// break;
+// }
+//
+// analysisResult |= (stepCount & BITS_COUNT);
+//
+// return analysisResult;
+// }
+//
+// /**
+// * Tell if the given axis goes downword. Bogus name, if you can think of
+// * a better one, please do tell. This really has to do with inverting
+// * attribute axis.
+// * @param axis One of Axis.XXX.
+// * @return true if the axis is not a child axis and does not go up from
+// * the axis root.
+// */
+// public static boolean isDownwardAxisOfMany(int axis)
+// {
+// return ((Axis.DESCENDANTORSELF == axis) ||
+// (Axis.DESCENDANT == axis)
+// || (Axis.FOLLOWING == axis)
+//// || (Axis.FOLLOWINGSIBLING == axis)
+// || (Axis.PRECEDING == axis)
+//// || (Axis.PRECEDINGSIBLING == axis)
+// );
+// }
+//
+// /**
+// * Read a <a href="http://www.w3.org/TR/xpath#location-paths">LocationPath</a>
+// * as a generalized match pattern. What this means is that the LocationPath
+// * is read backwards, as a test on a given node, to see if it matches the
+// * criteria of the selection, and ends up at the context node. Essentially,
+// * this is a backwards query from a given node, to find the context node.
+// * <p>So, the selection "foo/daz[2]" is, in non-abreviated expanded syntax,
+// * "self::node()/following-sibling::foo/child::daz[position()=2]".
+// * Taking this as a match pattern for a probable node, it works out to
+// * "self::daz/parent::foo[child::daz[position()=2 and isPrevStepNode()]
+// * precedingSibling::node()[isContextNodeOfLocationPath()]", adding magic
+// * isPrevStepNode and isContextNodeOfLocationPath operations. Predicates in
+// * the location path have to be executed by the following step,
+// * because they have to know the context of their execution.
+// *
+// * @param mpi The MatchPatternIterator to which the steps will be attached.
+// * @param compiler The compiler that holds the syntax tree/op map to
+// * construct from.
+// * @param stepOpCodePos The current op code position within the opmap.
+// * @param stepIndex The top-level step index withing the iterator.
+// *
+// * @return A StepPattern object, which may contain relative StepPatterns.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// static StepPattern loadSteps(
+// MatchPatternIterator mpi, Compiler compiler, int stepOpCodePos,
+// int stepIndex)
+// throws javax.xml.transform.TransformerException
+// {
+// if (DEBUG_PATTERN_CREATION)
+// {
+// System.out.println("================");
+// System.out.println("loadSteps for: "+compiler.getPatternString());
+// }
+// int stepType;
+// StepPattern step = null;
+// StepPattern firstStep = null, prevStep = null;
+// int ops[] = compiler.getOpMap();
+// int analysis = analyze(compiler, stepOpCodePos, stepIndex);
+//
+// while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
+// {
+// step = createDefaultStepPattern(compiler, stepOpCodePos, mpi, analysis,
+// firstStep, prevStep);
+//
+// if (null == firstStep)
+// {
+// firstStep = step;
+// }
+// else
+// {
+//
+// //prevStep.setNextWalker(step);
+// step.setRelativePathPattern(prevStep);
+// }
+//
+// prevStep = step;
+// stepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
+//
+// if (stepOpCodePos < 0)
+// break;
+// }
+//
+// int axis = Axis.SELF;
+// int paxis = Axis.SELF;
+// StepPattern tail = step;
+// for (StepPattern pat = step; null != pat;
+// pat = pat.getRelativePathPattern())
+// {
+// int nextAxis = pat.getAxis();
+// //int nextPaxis = pat.getPredicateAxis();
+// pat.setAxis(axis);
+//
+// // The predicate axis can't be moved!!! Test Axes103
+// // pat.setPredicateAxis(paxis);
+//
+// // If we have an attribute or namespace axis that went up, then
+// // it won't find the attribute in the inverse, since the select-to-match
+// // axes are not invertable (an element is a parent of an attribute, but
+// // and attribute is not a child of an element).
+// // If we don't do the magic below, then "@*/ancestor-or-self::*" gets
+// // inverted for match to "self::*/descendant-or-self::@*/parent::node()",
+// // which obviously won't work.
+// // So we will rewrite this as:
+// // "self::*/descendant-or-self::*/attribute::*/parent::node()"
+// // Child has to be rewritten a little differently:
+// // select: "@*/parent::*"
+// // inverted match: "self::*/child::@*/parent::node()"
+// // rewrite: "self::*/attribute::*/parent::node()"
+// // Axes that go down in the select, do not have to have special treatment
+// // in the rewrite. The following inverted match will still not select
+// // anything.
+// // select: "@*/child::*"
+// // inverted match: "self::*/parent::@*/parent::node()"
+// // Lovely business, this.
+// // -sb
+// int whatToShow = pat.getWhatToShow();
+// if(whatToShow == DTMFilter.SHOW_ATTRIBUTE ||
+// whatToShow == DTMFilter.SHOW_NAMESPACE)
+// {
+// int newAxis = (whatToShow == DTMFilter.SHOW_ATTRIBUTE) ?
+// Axis.ATTRIBUTE : Axis.NAMESPACE;
+// if(isDownwardAxisOfMany(axis))
+// {
+// StepPattern attrPat = new StepPattern(whatToShow,
+// pat.getNamespace(),
+// pat.getLocalName(),
+// //newAxis, pat.getPredicateAxis);
+// newAxis, 0); // don't care about the predicate axis
+// XNumber score = pat.getStaticScore();
+// pat.setNamespace(null);
+// pat.setLocalName(NodeTest.WILD);
+// attrPat.setPredicates(pat.getPredicates());
+// pat.setPredicates(null);
+// pat.setWhatToShow(DTMFilter.SHOW_ELEMENT);
+// StepPattern rel = pat.getRelativePathPattern();
+// pat.setRelativePathPattern(attrPat);
+// attrPat.setRelativePathPattern(rel);
+// attrPat.setStaticScore(score);
+//
+// // This is needed to inverse a following pattern, because of the
+// // wacky Xalan rules for following from an attribute. See axes108.
+// // By these rules, following from an attribute is not strictly
+// // inverseable.
+// if(Axis.PRECEDING == pat.getAxis())
+// pat.setAxis(Axis.PRECEDINGANDANCESTOR);
+//
+// else if(Axis.DESCENDANT == pat.getAxis())
+// pat.setAxis(Axis.DESCENDANTORSELF);
+//
+// pat = attrPat;
+// }
+// else if(Axis.CHILD == pat.getAxis())
+// {
+// // In this case just change the axis.
+// // pat.setWhatToShow(whatToShow);
+// pat.setAxis(Axis.ATTRIBUTE);
+// }
+// }
+// axis = nextAxis;
+// //paxis = nextPaxis;
+// tail = pat;
+// }
+//
+// if(axis < Axis.ALL)
+// {
+// StepPattern selfPattern = new ContextMatchStepPattern(axis, paxis);
+// // We need to keep the new nodetest from affecting the score...
+// XNumber score = tail.getStaticScore();
+// tail.setRelativePathPattern(selfPattern);
+// tail.setStaticScore(score);
+// selfPattern.setStaticScore(score);
+// }
+//
+// if (DEBUG_PATTERN_CREATION)
+// {
+// System.out.println("Done loading steps: "+step.toString());
+//
+// System.out.println("");
+// }
+// return step; // start from last pattern?? //firstStep;
+// }
+//
+// /**
+// * Create a StepPattern that is contained within a LocationPath.
+// *
+// *
+// * @param compiler The compiler that holds the syntax tree/op map to
+// * construct from.
+// * @param stepOpCodePos The current op code position within the opmap.
+// * @param mpi The MatchPatternIterator to which the steps will be attached.
+// * @param analysis 32 bits of analysis, from which the type of AxesWalker
+// * may be influenced.
+// * @param tail The step that is the first step analyzed, but the last
+// * step in the relative match linked list, i.e. the tail.
+// * May be null.
+// * @param head The step that is the current head of the relative
+// * match step linked list.
+// * May be null.
+// *
+// * @return the head of the list.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// private static StepPattern createDefaultStepPattern(
+// Compiler compiler, int opPos, MatchPatternIterator mpi,
+// int analysis, StepPattern tail, StepPattern head)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// int stepType = compiler.getOp(opPos);
+// boolean simpleInit = false;
+// int totalNumberWalkers = (analysis & BITS_COUNT);
+// boolean prevIsOneStepDown = true;
+// int firstStepPos = compiler.getFirstChildPos(opPos);
+//
+// int whatToShow = compiler.getWhatToShow(opPos);
+// StepPattern ai = null;
+// int axis, predicateAxis;
+//
+// switch (stepType)
+// {
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// prevIsOneStepDown = false;
+//
+// Expression expr;
+//
+// switch (stepType)
+// {
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// expr = compiler.compile(opPos);
+// break;
+// default :
+// expr = compiler.compile(opPos + 2);
+// }
+//
+// axis = Axis.FILTEREDLIST;
+// predicateAxis = Axis.FILTEREDLIST;
+// ai = new FunctionPattern(expr, axis, predicateAxis);
+// simpleInit = true;
+// break;
+// case OpCodes.FROM_ROOT :
+// whatToShow = DTMFilter.SHOW_DOCUMENT
+// | DTMFilter.SHOW_DOCUMENT_FRAGMENT;
+//
+// axis = Axis.ROOT;
+// predicateAxis = Axis.ROOT;
+// ai = new StepPattern(DTMFilter.SHOW_DOCUMENT |
+// DTMFilter.SHOW_DOCUMENT_FRAGMENT,
+// axis, predicateAxis);
+// break;
+// case OpCodes.FROM_ATTRIBUTES :
+// whatToShow = DTMFilter.SHOW_ATTRIBUTE;
+// axis = Axis.PARENT;
+// predicateAxis = Axis.ATTRIBUTE;
+// // ai = new StepPattern(whatToShow, Axis.SELF, Axis.SELF);
+// break;
+// case OpCodes.FROM_NAMESPACE :
+// whatToShow = DTMFilter.SHOW_NAMESPACE;
+// axis = Axis.PARENT;
+// predicateAxis = Axis.NAMESPACE;
+// // ai = new StepPattern(whatToShow, axis, predicateAxis);
+// break;
+// case OpCodes.FROM_ANCESTORS :
+// axis = Axis.DESCENDANT;
+// predicateAxis = Axis.ANCESTOR;
+// break;
+// case OpCodes.FROM_CHILDREN :
+// axis = Axis.PARENT;
+// predicateAxis = Axis.CHILD;
+// break;
+// case OpCodes.FROM_ANCESTORS_OR_SELF :
+// axis = Axis.DESCENDANTORSELF;
+// predicateAxis = Axis.ANCESTORORSELF;
+// break;
+// case OpCodes.FROM_SELF :
+// axis = Axis.SELF;
+// predicateAxis = Axis.SELF;
+// break;
+// case OpCodes.FROM_PARENT :
+// axis = Axis.CHILD;
+// predicateAxis = Axis.PARENT;
+// break;
+// case OpCodes.FROM_PRECEDING_SIBLINGS :
+// axis = Axis.FOLLOWINGSIBLING;
+// predicateAxis = Axis.PRECEDINGSIBLING;
+// break;
+// case OpCodes.FROM_PRECEDING :
+// axis = Axis.FOLLOWING;
+// predicateAxis = Axis.PRECEDING;
+// break;
+// case OpCodes.FROM_FOLLOWING_SIBLINGS :
+// axis = Axis.PRECEDINGSIBLING;
+// predicateAxis = Axis.FOLLOWINGSIBLING;
+// break;
+// case OpCodes.FROM_FOLLOWING :
+// axis = Axis.PRECEDING;
+// predicateAxis = Axis.FOLLOWING;
+// break;
+// case OpCodes.FROM_DESCENDANTS_OR_SELF :
+// axis = Axis.ANCESTORORSELF;
+// predicateAxis = Axis.DESCENDANTORSELF;
+// break;
+// case OpCodes.FROM_DESCENDANTS :
+// axis = Axis.ANCESTOR;
+// predicateAxis = Axis.DESCENDANT;
+// break;
+// default :
+// throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
+// //+ stepType);
+// }
+// if(null == ai)
+// {
+// whatToShow = compiler.getWhatToShow(opPos); // %REVIEW%
+// ai = new StepPattern(whatToShow, compiler.getStepNS(opPos),
+// compiler.getStepLocalName(opPos),
+// axis, predicateAxis);
+// }
+//
+// if (false || DEBUG_PATTERN_CREATION)
+// {
+// System.out.print("new step: "+ ai);
+// System.out.print(", axis: " + Axis.names[ai.getAxis()]);
+// System.out.print(", predAxis: " + Axis.names[ai.getAxis()]);
+// System.out.print(", what: ");
+// System.out.print(" ");
+// ai.debugWhatToShow(ai.getWhatToShow());
+// }
+//
+// int argLen = compiler.getFirstPredicateOpPos(opPos);
+//
+// ai.setPredicates(compiler.getCompiledPredicates(argLen));
+//
+// return ai;
+// }
+//
+// /**
+// * Analyze a step and give information about it's predicates. Right now this
+// * just returns true or false if the step has a predicate.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param opPos The opcode position for the step.
+// * @param stepType The type of step, one of OP_GROUP, etc.
+// *
+// * @return true if step has a predicate.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// static boolean analyzePredicate(Compiler compiler, int opPos, int stepType)
+// throws javax.xml.transform.TransformerException
+// {
+//
+// int argLen;
+//
+// switch (stepType)
+// {
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// argLen = compiler.getArgLength(opPos);
+// break;
+// default :
+// argLen = compiler.getArgLengthOfStep(opPos);
+// }
+//
+// int pos = compiler.getFirstPredicateOpPos(opPos);
+// int nPredicates = compiler.countPredicates(pos);
+//
+// return (nPredicates > 0) ? true : false;
+// }
+//
+// /**
+// * Create the proper Walker from the axes type.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param opPos The opcode position for the step.
+// * @param lpi The owning location path iterator.
+// * @param analysis 32 bits of analysis, from which the type of AxesWalker
+// * may be influenced.
+// *
+// * @return non-null reference to AxesWalker derivative.
+// * @throws RuntimeException if the input is bad.
+// */
+// private static AxesWalker createDefaultWalker(Compiler compiler, int opPos,
+// WalkingIterator lpi, int analysis)
+// {
+//
+// AxesWalker ai = null;
+// int stepType = compiler.getOp(opPos);
+//
+// /*
+// System.out.println("0: "+compiler.getOp(opPos));
+// System.out.println("1: "+compiler.getOp(opPos+1));
+// System.out.println("2: "+compiler.getOp(opPos+2));
+// System.out.println("3: "+compiler.getOp(opPos+3));
+// System.out.println("4: "+compiler.getOp(opPos+4));
+// System.out.println("5: "+compiler.getOp(opPos+5));
+// */
+// boolean simpleInit = false;
+// int totalNumberWalkers = (analysis & BITS_COUNT);
+// boolean prevIsOneStepDown = true;
+//
+// switch (stepType)
+// {
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// prevIsOneStepDown = false;
+//
+// if (DEBUG_WALKER_CREATION)
+// System.out.println("new walker: FilterExprWalker: " + analysis
+// + ", " + compiler.toString());
+//
+// ai = new FilterExprWalker(lpi);
+// simpleInit = true;
+// break;
+// case OpCodes.FROM_ROOT :
+// ai = new AxesWalker(lpi, Axis.ROOT);
+// break;
+// case OpCodes.FROM_ANCESTORS :
+// prevIsOneStepDown = false;
+// ai = new ReverseAxesWalker(lpi, Axis.ANCESTOR);
+// break;
+// case OpCodes.FROM_ANCESTORS_OR_SELF :
+// prevIsOneStepDown = false;
+// ai = new ReverseAxesWalker(lpi, Axis.ANCESTORORSELF);
+// break;
+// case OpCodes.FROM_ATTRIBUTES :
+// ai = new AxesWalker(lpi, Axis.ATTRIBUTE);
+// break;
+// case OpCodes.FROM_NAMESPACE :
+// ai = new AxesWalker(lpi, Axis.NAMESPACE);
+// break;
+// case OpCodes.FROM_CHILDREN :
+// ai = new AxesWalker(lpi, Axis.CHILD);
+// break;
+// case OpCodes.FROM_DESCENDANTS :
+// prevIsOneStepDown = false;
+// ai = new AxesWalker(lpi, Axis.DESCENDANT);
+// break;
+// case OpCodes.FROM_DESCENDANTS_OR_SELF :
+// prevIsOneStepDown = false;
+// ai = new AxesWalker(lpi, Axis.DESCENDANTORSELF);
+// break;
+// case OpCodes.FROM_FOLLOWING :
+// prevIsOneStepDown = false;
+// ai = new AxesWalker(lpi, Axis.FOLLOWING);
+// break;
+// case OpCodes.FROM_FOLLOWING_SIBLINGS :
+// prevIsOneStepDown = false;
+// ai = new AxesWalker(lpi, Axis.FOLLOWINGSIBLING);
+// break;
+// case OpCodes.FROM_PRECEDING :
+// prevIsOneStepDown = false;
+// ai = new ReverseAxesWalker(lpi, Axis.PRECEDING);
+// break;
+// case OpCodes.FROM_PRECEDING_SIBLINGS :
+// prevIsOneStepDown = false;
+// ai = new ReverseAxesWalker(lpi, Axis.PRECEDINGSIBLING);
+// break;
+// case OpCodes.FROM_PARENT :
+// prevIsOneStepDown = false;
+// ai = new ReverseAxesWalker(lpi, Axis.PARENT);
+// break;
+// case OpCodes.FROM_SELF :
+// ai = new AxesWalker(lpi, Axis.SELF);
+// break;
+// default :
+// throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
+// //+ stepType);
+// }
+//
+// if (simpleInit)
+// {
+// ai.initNodeTest(DTMFilter.SHOW_ALL);
+// }
+// else
+// {
+// int whatToShow = compiler.getWhatToShow(opPos);
+//
+// /*
+// System.out.print("construct: ");
+// NodeTest.debugWhatToShow(whatToShow);
+// System.out.println("or stuff: "+(whatToShow & (DTMFilter.SHOW_ATTRIBUTE
+// | DTMFilter.SHOW_ELEMENT
+// | DTMFilter.SHOW_PROCESSING_INSTRUCTION)));
+// */
+// if ((0 == (whatToShow
+// & (DTMFilter.SHOW_ATTRIBUTE | DTMFilter.SHOW_NAMESPACE | DTMFilter.SHOW_ELEMENT
+// | DTMFilter.SHOW_PROCESSING_INSTRUCTION))) || (whatToShow == DTMFilter.SHOW_ALL))
+// ai.initNodeTest(whatToShow);
+// else
+// {
+// ai.initNodeTest(whatToShow, compiler.getStepNS(opPos),
+// compiler.getStepLocalName(opPos));
+// }
+// }
+//
+// return ai;
+// }
+//
+// public static String getAnalysisString(int analysis)
+// {
+// StringBuffer buf = new StringBuffer();
+// buf.append("count: "+getStepCount(analysis)+" ");
+// if((analysis & BIT_NODETEST_ANY) != 0)
+// {
+// buf.append("NTANY|");
+// }
+// if((analysis & BIT_PREDICATE) != 0)
+// {
+// buf.append("PRED|");
+// }
+// if((analysis & BIT_ANCESTOR) != 0)
+// {
+// buf.append("ANC|");
+// }
+// if((analysis & BIT_ANCESTOR_OR_SELF) != 0)
+// {
+// buf.append("ANCOS|");
+// }
+// if((analysis & BIT_ATTRIBUTE) != 0)
+// {
+// buf.append("ATTR|");
+// }
+// if((analysis & BIT_CHILD) != 0)
+// {
+// buf.append("CH|");
+// }
+// if((analysis & BIT_DESCENDANT) != 0)
+// {
+// buf.append("DESC|");
+// }
+// if((analysis & BIT_DESCENDANT_OR_SELF) != 0)
+// {
+// buf.append("DESCOS|");
+// }
+// if((analysis & BIT_FOLLOWING) != 0)
+// {
+// buf.append("FOL|");
+// }
+// if((analysis & BIT_FOLLOWING_SIBLING) != 0)
+// {
+// buf.append("FOLS|");
+// }
+// if((analysis & BIT_NAMESPACE) != 0)
+// {
+// buf.append("NS|");
+// }
+// if((analysis & BIT_PARENT) != 0)
+// {
+// buf.append("P|");
+// }
+// if((analysis & BIT_PRECEDING) != 0)
+// {
+// buf.append("PREC|");
+// }
+// if((analysis & BIT_PRECEDING_SIBLING) != 0)
+// {
+// buf.append("PRECS|");
+// }
+// if((analysis & BIT_SELF) != 0)
+// {
+// buf.append(".|");
+// }
+// if((analysis & BIT_FILTER) != 0)
+// {
+// buf.append("FLT|");
+// }
+// if((analysis & BIT_ROOT) != 0)
+// {
+// buf.append("R|");
+// }
+// return buf.toString();
+// }
+//
+// /** Set to true for diagnostics about walker creation */
+// static final boolean DEBUG_PATTERN_CREATION = false;
+//
+// /** Set to true for diagnostics about walker creation */
+// static final boolean DEBUG_WALKER_CREATION = false;
+//
+// /** Set to true for diagnostics about iterator creation */
+// static final boolean DEBUG_ITERATOR_CREATION = false;
+//
+// public static boolean hasPredicate(int analysis)
+// {
+// return (0 != (analysis & BIT_PREDICATE));
+// }
+//
+// public static boolean isWild(int analysis)
+// {
+// return (0 != (analysis & BIT_NODETEST_ANY));
+// }
+//
+// public static boolean walksAncestors(int analysis)
+// {
+// return isSet(analysis, BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);
+// }
+//
+// public static boolean walksAttributes(int analysis)
+// {
+// return (0 != (analysis & BIT_ATTRIBUTE));
+// }
+//
+// public static boolean walksNamespaces(int analysis)
+// {
+// return (0 != (analysis & BIT_NAMESPACE));
+// }
+//
+// public static boolean walksChildren(int analysis)
+// {
+// return (0 != (analysis & BIT_CHILD));
+// }
+//
+// public static boolean walksDescendants(int analysis)
+// {
+// return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF);
+// }
+//
+// public static boolean walksSubtree(int analysis)
+// {
+// return isSet(analysis, BIT_DESCENDANT | BIT_DESCENDANT_OR_SELF | BIT_CHILD);
+// }
+//
+// public static boolean walksSubtreeOnlyMaybeAbsolute(int analysis)
+// {
+// return walksSubtree(analysis)
+// && !walksExtraNodes(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// ;
+// }
+//
+// public static boolean walksSubtreeOnly(int analysis)
+// {
+// return walksSubtreeOnlyMaybeAbsolute(analysis)
+// && !isAbsolute(analysis)
+// ;
+// }
+//
+// public static boolean walksFilteredList(int analysis)
+// {
+// return isSet(analysis, BIT_FILTER);
+// }
+//
+// public static boolean walksSubtreeOnlyFromRootOrContext(int analysis)
+// {
+// return walksSubtree(analysis)
+// && !walksExtraNodes(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && !isSet(analysis, BIT_FILTER)
+// ;
+// }
+//
+// public static boolean walksInDocOrder(int analysis)
+// {
+// return (walksSubtreeOnlyMaybeAbsolute(analysis)
+// || walksExtraNodesOnly(analysis)
+// || walksFollowingOnlyMaybeAbsolute(analysis))
+// && !isSet(analysis, BIT_FILTER)
+// ;
+// }
+//
+// public static boolean walksFollowingOnlyMaybeAbsolute(int analysis)
+// {
+// return isSet(analysis, BIT_SELF | BIT_FOLLOWING_SIBLING | BIT_FOLLOWING)
+// && !walksSubtree(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// ;
+// }
+//
+// public static boolean walksUp(int analysis)
+// {
+// return isSet(analysis, BIT_PARENT | BIT_ANCESTOR | BIT_ANCESTOR_OR_SELF);
+// }
+//
+// public static boolean walksSideways(int analysis)
+// {
+// return isSet(analysis, BIT_FOLLOWING | BIT_FOLLOWING_SIBLING |
+// BIT_PRECEDING | BIT_PRECEDING_SIBLING);
+// }
+//
+// public static boolean walksExtraNodes(int analysis)
+// {
+// return isSet(analysis, BIT_NAMESPACE | BIT_ATTRIBUTE);
+// }
+//
+// public static boolean walksExtraNodesOnly(int analysis)
+// {
+// return walksExtraNodes(analysis)
+// && !isSet(analysis, BIT_SELF)
+// && !walksSubtree(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && !isAbsolute(analysis)
+// ;
+// }
+//
+// public static boolean isAbsolute(int analysis)
+// {
+// return isSet(analysis, BIT_ROOT | BIT_FILTER);
+// }
+//
+// public static boolean walksChildrenOnly(int analysis)
+// {
+// return walksChildren(analysis)
+// && !isSet(analysis, BIT_SELF)
+// && !walksExtraNodes(analysis)
+// && !walksDescendants(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT))
+// ;
+// }
+//
+// public static boolean walksChildrenAndExtraAndSelfOnly(int analysis)
+// {
+// return walksChildren(analysis)
+// && !walksDescendants(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT))
+// ;
+// }
+//
+// public static boolean walksDescendantsAndExtraAndSelfOnly(int analysis)
+// {
+// return !walksChildren(analysis)
+// && walksDescendants(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && (!isAbsolute(analysis) || isSet(analysis, BIT_ROOT))
+// ;
+// }
+//
+// public static boolean walksSelfOnly(int analysis)
+// {
+// return isSet(analysis, BIT_SELF)
+// && !walksSubtree(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && !isAbsolute(analysis)
+// ;
+// }
+//
+//
+// public static boolean walksUpOnly(int analysis)
+// {
+// return !walksSubtree(analysis)
+// && walksUp(analysis)
+// && !walksSideways(analysis)
+// && !isAbsolute(analysis)
+// ;
+// }
+//
+// public static boolean walksDownOnly(int analysis)
+// {
+// return walksSubtree(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && !isAbsolute(analysis)
+// ;
+// }
+//
+// public static boolean walksDownExtraOnly(int analysis)
+// {
+// return walksSubtree(analysis) && walksExtraNodes(analysis)
+// && !walksUp(analysis)
+// && !walksSideways(analysis)
+// && !isAbsolute(analysis)
+// ;
+// }
+//
+// public static boolean canSkipSubtrees(int analysis)
+// {
+// return isSet(analysis, BIT_CHILD) | walksSideways(analysis);
+// }
+//
+// public static boolean canCrissCross(int analysis)
+// {
+// // This could be done faster. Coded for clarity.
+// if(walksSelfOnly(analysis))
+// return false;
+// else if(walksDownOnly(analysis) && !canSkipSubtrees(analysis))
+// return false;
+// else if(walksChildrenAndExtraAndSelfOnly(analysis))
+// return false;
+// else if(walksDescendantsAndExtraAndSelfOnly(analysis))
+// return false;
+// else if(walksUpOnly(analysis))
+// return false;
+// else if(walksExtraNodesOnly(analysis))
+// return false;
+// else if(walksSubtree(analysis)
+// && (walksSideways(analysis)
+// || walksUp(analysis)
+// || canSkipSubtrees(analysis)))
+// return true;
+// else
+// return false;
+// }
+//
+// /**
+// * Tell if the pattern can be 'walked' with the iteration steps in natural
+// * document order, without duplicates.
+// *
+// * @param analysis The general analysis of the pattern.
+// *
+// * @return true if the walk can be done in natural order.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// static public boolean isNaturalDocOrder(int analysis)
+// {
+// if(canCrissCross(analysis) || isSet(analysis, BIT_NAMESPACE) ||
+// walksFilteredList(analysis))
+// return false;
+//
+// if(walksInDocOrder(analysis))
+// return true;
+//
+// return false;
+// }
+//
+// /**
+// * Tell if the pattern can be 'walked' with the iteration steps in natural
+// * document order, without duplicates.
+// *
+// * @param compiler non-null reference to compiler object that has processed
+// * the XPath operations into an opcode map.
+// * @param stepOpCodePos The opcode position for the step.
+// * @param stepIndex The top-level step index withing the iterator.
+// * @param analysis The general analysis of the pattern.
+// *
+// * @return true if the walk can be done in natural order.
+// *
+// * @throws javax.xml.transform.TransformerException
+// */
+// private static boolean isNaturalDocOrder(
+// Compiler compiler, int stepOpCodePos, int stepIndex, int analysis)
+// throws javax.xml.transform.TransformerException
+// {
+// if(canCrissCross(analysis))
+// return false;
+//
+// // Namespaces can present some problems, so just punt if we're looking for
+// // these.
+// if(isSet(analysis, BIT_NAMESPACE))
+// return false;
+//
+// // The following, preceding, following-sibling, and preceding sibling can
+// // be found in doc order if we get to this point, but if they occur
+// // together, they produce
+// // duplicates, so it's better for us to eliminate this case so we don't
+// // have to check for duplicates during runtime if we're using a
+// // WalkingIterator.
+// if(isSet(analysis, BIT_FOLLOWING | BIT_FOLLOWING_SIBLING) &&
+// isSet(analysis, BIT_PRECEDING | BIT_PRECEDING_SIBLING))
+// return false;
+//
+// // OK, now we have to check for select="@*/axis::*" patterns, which
+// // can also cause duplicates to happen. But select="axis*/@::*" patterns
+// // are OK, as are select="@foo/axis::*" patterns.
+// // Unfortunately, we can't do this just via the analysis bits.
+//
+// int stepType;
+// int ops[] = compiler.getOpMap();
+// int stepCount = 0;
+// boolean foundWildAttribute = false;
+//
+// // Steps that can traverse anything other than down a
+// // subtree or that can produce duplicates when used in
+// // combonation are counted with this variable.
+// int potentialDuplicateMakingStepCount = 0;
+//
+// while (OpCodes.ENDOP != (stepType = ops[stepOpCodePos]))
+// {
+// stepCount++;
+//
+// switch (stepType)
+// {
+// case OpCodes.FROM_ATTRIBUTES :
+// case OpCodes.MATCH_ATTRIBUTE :
+// if(foundWildAttribute) // Maybe not needed, but be safe.
+// return false;
+//
+// // This doesn't seem to work as a test for wild card. Hmph.
+// // int nodeTestType = compiler.getStepTestType(stepOpCodePos);
+//
+// String localName = compiler.getStepLocalName(stepOpCodePos);
+// // System.err.println("localName: "+localName);
+// if(localName.equals("*"))
+// {
+// foundWildAttribute = true;
+// }
+// break;
+// case OpCodes.FROM_FOLLOWING :
+// case OpCodes.FROM_FOLLOWING_SIBLINGS :
+// case OpCodes.FROM_PRECEDING :
+// case OpCodes.FROM_PRECEDING_SIBLINGS :
+// case OpCodes.FROM_PARENT :
+// case OpCodes.OP_VARIABLE :
+// case OpCodes.OP_EXTFUNCTION :
+// case OpCodes.OP_FUNCTION :
+// case OpCodes.OP_GROUP :
+// case OpCodes.FROM_NAMESPACE :
+// case OpCodes.FROM_ANCESTORS :
+// case OpCodes.FROM_ANCESTORS_OR_SELF :
+// case OpCodes.MATCH_ANY_ANCESTOR :
+// case OpCodes.MATCH_IMMEDIATE_ANCESTOR :
+// case OpCodes.FROM_DESCENDANTS_OR_SELF :
+// case OpCodes.FROM_DESCENDANTS :
+// if(potentialDuplicateMakingStepCount > 0)
+// return false;
+// potentialDuplicateMakingStepCount++;
+// case OpCodes.FROM_ROOT :
+// case OpCodes.FROM_CHILDREN :
+// case OpCodes.FROM_SELF :
+// if(foundWildAttribute)
+// return false;
+// break;
+// default :
+// throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_NULL_ERROR_HANDLER, new Object[]{Integer.toString(stepType)})); //"Programmer's assertion: unknown opcode: "
+// // + stepType);
+// }
+//
+// int nextStepOpCodePos = compiler.getNextStepPos(stepOpCodePos);
+//
+// if (nextStepOpCodePos < 0)
+// break;
+//
+// stepOpCodePos = nextStepOpCodePos;
+// }
+//
+// return true;
+// }
+//
+// public static boolean isOneStep(int analysis)
+// {
+// return (analysis & BITS_COUNT) == 0x00000001;
+// }
+//
+// public static int getStepCount(int analysis)
+// {
+// return (analysis & BITS_COUNT);
+// }
+//
+// /**
+// * First 8 bits are the number of top-level location steps. Hopefully
+// * there will never be more that 255 location steps!!!
+// */
+// public static final int BITS_COUNT = 0x000000FF;
+//
+// /** 4 bits are reserved for future use. */
+// public static final int BITS_RESERVED = 0x00000F00;
+//
+// /** Bit is on if the expression contains a top-level predicate. */
+// public static final int BIT_PREDICATE = (0x00001000);
+//
+// /** Bit is on if any of the walkers contain an ancestor step. */
+// public static final int BIT_ANCESTOR = (0x00001000 << 1);
+//
+// /** Bit is on if any of the walkers contain an ancestor-or-self step. */
+// public static final int BIT_ANCESTOR_OR_SELF = (0x00001000 << 2);
+//
+// /** Bit is on if any of the walkers contain an attribute step. */
+// public static final int BIT_ATTRIBUTE = (0x00001000 << 3);
+//
+// /** Bit is on if any of the walkers contain a child step. */
+// public static final int BIT_CHILD = (0x00001000 << 4);
+//
+// /** Bit is on if any of the walkers contain a descendant step. */
+// public static final int BIT_DESCENDANT = (0x00001000 << 5);
+//
+// /** Bit is on if any of the walkers contain a descendant-or-self step. */
+// public static final int BIT_DESCENDANT_OR_SELF = (0x00001000 << 6);
+//
+// /** Bit is on if any of the walkers contain a following step. */
+// public static final int BIT_FOLLOWING = (0x00001000 << 7);
+//
+// /** Bit is on if any of the walkers contain a following-sibiling step. */
+// public static final int BIT_FOLLOWING_SIBLING = (0x00001000 << 8);
+//
+// /** Bit is on if any of the walkers contain a namespace step. */
+// public static final int BIT_NAMESPACE = (0x00001000 << 9);
+//
+// /** Bit is on if any of the walkers contain a parent step. */
+// public static final int BIT_PARENT = (0x00001000 << 10);
+//
+// /** Bit is on if any of the walkers contain a preceding step. */
+// public static final int BIT_PRECEDING = (0x00001000 << 11);
+//
+// /** Bit is on if any of the walkers contain a preceding-sibling step. */
+// public static final int BIT_PRECEDING_SIBLING = (0x00001000 << 12);
+//
+// /** Bit is on if any of the walkers contain a self step. */
+// public static final int BIT_SELF = (0x00001000 << 13);
+//
+// /**
+// * Bit is on if any of the walkers contain a filter (i.e. id(), extension
+// * function, etc.) step.
+// */
+// public static final int BIT_FILTER = (0x00001000 << 14);
+//
+// /** Bit is on if any of the walkers contain a root step. */
+// public static final int BIT_ROOT = (0x00001000 << 15);
+//
+// /**
+// * If any of these bits are on, the expression may likely traverse outside
+// * the given subtree.
+// */
+// public static final int BITMASK_TRAVERSES_OUTSIDE_SUBTREE = (BIT_NAMESPACE // ??
+// | BIT_PRECEDING_SIBLING
+// | BIT_PRECEDING
+// | BIT_FOLLOWING_SIBLING
+// | BIT_FOLLOWING
+// | BIT_PARENT // except parent of attrs.
+// | BIT_ANCESTOR_OR_SELF
+// | BIT_ANCESTOR
+// | BIT_FILTER
+// | BIT_ROOT);
+//
+// /**
+// * Bit is on if any of the walkers can go backwards in document
+// * order from the context node.
+// */
+// public static final int BIT_BACKWARDS_SELF = (0x00001000 << 16);
+//
+// /** Found "//foo" pattern */
+// public static final int BIT_ANY_DESCENDANT_FROM_ROOT = (0x00001000 << 17);
+//
+// /**
+// * Bit is on if any of the walkers contain an node() test. This is
+// * really only useful if the count is 1.
+// */
+// public static final int BIT_NODETEST_ANY = (0x00001000 << 18);
+//
+// // can't go higher than 18!
+//
+// /** Bit is on if the expression is a match pattern. */
+// public static final int BIT_MATCH_PATTERN = (0x00001000 << 19);
+//}
diff --git a/src/org/apache/xpath/axes/WalkingIterator.java b/src/org/apache/xpath/axes/WalkingIterator.java
index a25a347..5ce5318 100644
--- a/src/org/apache/xpath/axes/WalkingIterator.java
+++ b/src/org/apache/xpath/axes/WalkingIterator.java
@@ -1,50 +1,45 @@
package org.apache.xpath.axes;
-import java.util.Vector;
-
import javax.xml.transform.TransformerException;
+
import org.apache.xml.dtm.DTM;
import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.VariableStack;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.NonExecutableExpression;
/**
* Location path iterator that uses Walkers.
*/
public class WalkingIterator extends LocPathIterator implements ExpressionOwner
-{
+{
/**
- * Create a WalkingIterator iterator, including creation
- * of step walkers from the opcode list, and call back
- * into the Compiler to create predicate expressions.
+ * Create a WalkingIterator object.
*
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- * @param shouldLoadWalkers True if walkers should be
- * loaded, or false if this is a derived iterator and
- * it doesn't wish to load child walkers.
- *
- * @throws javax.xml.transform.TransformerException
+ * @param nscontext The namespace context for this iterator,
+ * should be OK if null.
*/
- WalkingIterator(
- Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
- throws javax.xml.transform.TransformerException
+ public WalkingIterator(PrefixResolver nscontext, org.apache.xpath.parser.PathExpr path)
{
- super(compiler, opPos, analysis, shouldLoadWalkers);
-
- int firstStepPos = compiler.getFirstChildPos(opPos);
- if (shouldLoadWalkers)
+ super(nscontext);
+
+ try
{
- m_firstWalker = WalkerFactory.loadWalkers(this, compiler, firstStepPos, 0);
- m_lastUsedWalker = m_firstWalker;
+ m_firstWalker = WalkerFactory.loadWalkers(path, this);
+ m_lastUsedWalker = m_firstWalker;
}
+ catch(TransformerException te)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(te);
+ }
+
}
/**
@@ -55,9 +50,9 @@
*/
public WalkingIterator(PrefixResolver nscontext)
{
-
super(nscontext);
}
+
/**
@@ -264,7 +259,7 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
m_predicateIndex = -1;
@@ -272,7 +267,7 @@
while (null != walker)
{
- walker.fixupVariables(vars, globalsSize);
+ walker.fixupVariables(vcs);
walker = walker.getNextWalker();
}
}
@@ -313,6 +308,7 @@
*/
public void setExpression(Expression exp)
{
+ // assertion(null != exp, "Expression owner can not be set to null!");
exp.exprSetParent(this);
m_firstWalker = (AxesWalker)exp;
}
@@ -341,4 +337,51 @@
return true;
}
+ public Node jjtGetChild(int i)
+ {
+ int superclassChildCount = super.jjtGetNumChildren();
+ if((null != m_firstWalker) && i == 0)
+ return m_firstWalker;
+ else
+ return super.jjtGetChild(i-((null == m_firstWalker) ? 0 : 1));
+ }
+
+ public int jjtGetNumChildren()
+ {
+ int superChildCount = super.jjtGetNumChildren();
+ return superChildCount+((null == m_firstWalker) ? 0 : 1);
+ }
+
+
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#checkTreeIntegrity(int, int, boolean)
+ */
+ public boolean checkTreeIntegrity(
+ int levelCount,
+ int childNumber,
+ boolean parentOK)
+ {
+ ExpressionNode expOwner = getExpressionOwner();
+ if(null != expOwner)
+ {
+ if(!(expOwner instanceof Node))
+ parentOK = flagProblem(" Expression owner is not a Node! It's a "+expOwner.getClass().getName());
+ else if(expOwner instanceof NonExecutableExpression)
+ parentOK = flagProblem(" Expression owner is a NonExecutableExpression!");
+ }
+ return super.checkTreeIntegrity(levelCount, childNumber, parentOK);
+
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtClose()
+ */
+ public void jjtClose()
+ {
+ if(null == getExpressionOwner())
+ flagProblem("The expression owner can not be null on jjtClose!");
+ super.jjtClose();
+ }
+
}
\ No newline at end of file
diff --git a/src/org/apache/xpath/axes/WalkingIteratorSorted.java b/src/org/apache/xpath/axes/WalkingIteratorSorted.java
index b056d2c..197c9b2 100644
--- a/src/org/apache/xpath/axes/WalkingIteratorSorted.java
+++ b/src/org/apache/xpath/axes/WalkingIteratorSorted.java
@@ -56,12 +56,9 @@
*/
package org.apache.xpath.axes;
-import org.apache.xpath.XPathContext;
-import org.apache.xml.utils.PrefixResolver;
-import org.apache.xpath.compiler.Compiler;
-import org.apache.xml.dtm.DTM;
-import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.dtm.Axis;
+import org.apache.xml.utils.PrefixResolver;
+import org.apache.xpath.VariableComposeState;
/**
* <meta name="usage" content="internal"/>
@@ -83,31 +80,9 @@
* @param nscontext The namespace context for this iterator,
* should be OK if null.
*/
- public WalkingIteratorSorted(PrefixResolver nscontext)
+ public WalkingIteratorSorted(PrefixResolver nscontext, org.apache.xpath.parser.PathExpr path)
{
- super(nscontext);
- }
-
- /**
- * Create a WalkingIterator iterator, including creation
- * of step walkers from the opcode list, and call back
- * into the Compiler to create predicate expressions.
- *
- * @param compiler The Compiler which is creating
- * this expression.
- * @param opPos The position of this iterator in the
- * opcode list from the compiler.
- * @param shouldLoadWalkers True if walkers should be
- * loaded, or false if this is a derived iterator and
- * it doesn't wish to load child walkers.
- *
- * @throws javax.xml.transform.TransformerException
- */
- WalkingIteratorSorted(
- Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
- throws javax.xml.transform.TransformerException
- {
- super(compiler, opPos, analysis, shouldLoadWalkers);
+ super(nscontext, path);
}
/**
@@ -120,7 +95,6 @@
{
return m_inNaturalOrderStatic;
}
-
/**
* Tell if the nodeset can be walked in doc order, via static analysis.
@@ -231,9 +205,9 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
int analysis = getAnalysisBits();
if(WalkerFactory.isNaturalDocOrder(analysis))
@@ -249,4 +223,12 @@
}
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "(sorted node list) "+super.toString();
+ }
+
}
diff --git a/src/org/apache/xpath/conditional/Else.java b/src/org/apache/xpath/conditional/Else.java
new file mode 100644
index 0000000..6975f4a
--- /dev/null
+++ b/src/org/apache/xpath/conditional/Else.java
@@ -0,0 +1,137 @@
+/* Generated By:JJTree: Do not edit this line. Else.java */
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.xpath.conditional;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+public class Else extends Expression implements ExpressionOwner
+{
+
+ private Expression m_expression;
+
+ public Else() {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ // but don't call this directly!
+ return m_expression.execute(xctxt);
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return m_expression;
+ }
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ m_expression = exp;
+ }
+
+
+}
diff --git a/src/org/apache/xpath/conditional/If.java b/src/org/apache/xpath/conditional/If.java
new file mode 100644
index 0000000..8467d69
--- /dev/null
+++ b/src/org/apache/xpath/conditional/If.java
@@ -0,0 +1,255 @@
+/* Generated By:JJTree: Do not edit this line. IfLpar.java */
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.xpath.conditional;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.IfExpr;
+import org.apache.xpath.parser.Node;
+
+public class If extends Expression implements ExpressionOwner
+{
+
+ public If()
+ {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(
+ org.apache.xpath.parser.XPathVisitor visitor,
+ Object data)
+ {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+
+ XObject test = m_test.execute(xctxt);
+
+ if (test.bool())
+ {
+ // Execute Then expression
+ return m_then.execute(xctxt);
+
+ }
+ else
+ {
+ // execute else expression
+ return m_else.execute(xctxt);
+ }
+ }
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ }
+
+ Expression m_test;
+
+ Expression m_then;
+
+ Expression m_else;
+
+ /**
+ * Returns the e.
+ * @return Expression
+ */
+ public Expression getElse()
+ {
+ return m_else;
+ }
+
+ /**
+ * Returns the test.
+ * @return Expression
+ */
+ public Expression getTest()
+ {
+ return m_test;
+ }
+
+ /**
+ * Returns the then.
+ * @return Expression
+ */
+ public Expression getThen()
+ {
+ return m_then;
+ }
+
+ /**
+ * Sets the e.
+ * @param e The e to set
+ */
+ public void setElse(Expression e)
+ {
+ m_else = e;
+ }
+
+ /**
+ * Sets the test.
+ * @param test The test to set
+ */
+ public void setTest(Expression test)
+ {
+ m_test = test;
+ }
+
+ /**
+ * Sets the then.
+ * @param then The then to set
+ */
+ public void setThen(Expression then)
+ {
+ m_then = then;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ super.jjtSetParent(n);
+ if (n instanceof IfExpr) // don't fix up if we're reducing
+ {
+ IfExpr ifexpr = (IfExpr) n;
+
+ // At this point all children should have been added except this node.
+ // This has a fixed number of children.
+ m_test = (Expression) ifexpr.jjtGetChild(1);
+ m_test.jjtSetParent(this);
+ m_then = (Expression) ifexpr.jjtGetChild(3);
+ m_then.jjtSetParent(this);
+ m_else = (Expression) ifexpr.jjtGetChild(5);
+ m_else.jjtSetParent(this);
+
+ ifexpr.m_exprs.setSize(1);
+ }
+ }
+
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetChild(int)
+ */
+ public Node jjtGetChild(int i)
+ {
+ return (i == 0) ? m_test : (i == 1) ? m_then : (i == 2) ? m_else : null;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetNumChildren()
+ */
+ public int jjtGetNumChildren()
+ {
+ return 3;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#isPathExprReduced()
+ */
+ public boolean isPathExprReduced()
+ {
+ return false; // never reduce.
+ }
+
+}
diff --git a/src/org/apache/xpath/conditional/Then.java b/src/org/apache/xpath/conditional/Then.java
new file mode 100644
index 0000000..1e0edcb
--- /dev/null
+++ b/src/org/apache/xpath/conditional/Then.java
@@ -0,0 +1,137 @@
+/* Generated By:JJTree: Do not edit this line. Then.java */
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.xpath.conditional;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+public class Then extends Expression implements ExpressionOwner
+{
+
+ private Expression m_expression;
+
+ public Then() {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ // but don't call this directly!
+ return m_expression.execute(xctxt);
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return m_expression;
+ }
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ m_expression = exp;
+ }
+
+
+}
diff --git a/src/org/apache/xpath/functions/FuncAddDTDurationToDT.java b/src/org/apache/xpath/functions/FuncAddDTDurationToDT.java
new file mode 100644
index 0000000..feab7c1
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddDTDurationToDT.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddDTDurationToDT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dateTime = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (dateTime == null || duration == null)
+ return new XDateTime();
+ DateTimeObj dt = dateTime.addDTDurationToDateTime(duration);
+ return new XDateTime(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddDTDurationToDate.java b/src/org/apache/xpath/functions/FuncAddDTDurationToDate.java
new file mode 100644
index 0000000..b4af46d
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddDTDurationToDate.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDate;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddDTDurationToDate extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (date == null || duration == null)
+ return new XDate();
+ DateTimeObj dt = date.addDTDurationToDate(duration);
+ return new XDate(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddDTDurationToTime.java b/src/org/apache/xpath/functions/FuncAddDTDurationToTime.java
new file mode 100644
index 0000000..199c1a7
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddDTDurationToTime.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddDTDurationToTime extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj time = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (time == null || duration == null)
+ return new XTime();
+ DateTimeObj dt = time.addDTDurationToTime(duration);
+ return new XTime(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddDayTimeDuration.java b/src/org/apache/xpath/functions/FuncAddDayTimeDuration.java
new file mode 100644
index 0000000..343e8a4
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddDayTimeDuration.java
@@ -0,0 +1,103 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncAddDayTimeDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XDuration();
+ Duration du = duration1.addDTDuration(duration2);
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddDays.java b/src/org/apache/xpath/functions/FuncAddDays.java
new file mode 100644
index 0000000..9a9e119
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddDays.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDate;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddDays extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String dateTime = m_arg0.execute(xctxt).str();
+ DateTimeObj date = DateTimeObj.date(dateTime);
+ if (date == null)
+ return new XDate();
+ DateTimeObj dt = date.addDays(m_arg1.num(xctxt));
+ return new XDate(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddYMDurationToDT.java b/src/org/apache/xpath/functions/FuncAddYMDurationToDT.java
new file mode 100644
index 0000000..b15af7f
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddYMDurationToDT.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddYMDurationToDT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dateTime = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (dateTime == null || duration == null)
+ return new XDateTime();
+ DateTimeObj dt = dateTime.addYMDurationToDateTime(duration);
+ return new XDateTime(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddYMDurationToDate.java b/src/org/apache/xpath/functions/FuncAddYMDurationToDate.java
new file mode 100644
index 0000000..1d46774
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddYMDurationToDate.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDate;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddYMDurationToDate extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (date == null || duration == null)
+ return new XDate();
+ DateTimeObj dt = date.addYMDurationToDate(duration);
+ return new XDate(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncAddYearMonthDuration.java b/src/org/apache/xpath/functions/FuncAddYearMonthDuration.java
new file mode 100644
index 0000000..b83e81a
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncAddYearMonthDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncAddYearMonthDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XDuration();
+ Duration du = duration1.addYMDuration(duration2);
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncCeiling.java b/src/org/apache/xpath/functions/FuncCeiling.java
index 19b2c0d..e8dabd0 100644
--- a/src/org/apache/xpath/functions/FuncCeiling.java
+++ b/src/org/apache/xpath/functions/FuncCeiling.java
@@ -56,16 +56,10 @@
*/
package org.apache.xpath.functions;
-import java.lang.Math;
-
-//import org.w3c.dom.Node;
-
-import java.util.Vector;
-
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
/**
* <meta name="usage" content="advanced"/>
@@ -84,6 +78,6 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- return new XNumber(Math.ceil(m_arg0.execute(xctxt).num()));
+ return new XDouble(Math.ceil(m_arg0.execute(xctxt).num()));
}
}
diff --git a/src/org/apache/xpath/functions/FuncCount.java b/src/org/apache/xpath/functions/FuncCount.java
index 2368fd2..1a81b4a 100644
--- a/src/org/apache/xpath/functions/FuncCount.java
+++ b/src/org/apache/xpath/functions/FuncCount.java
@@ -69,6 +69,7 @@
import org.apache.xpath.XPath;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XNumber;
+import org.apache.xpath.objects.XSequence;
import org.apache.xpath.objects.XString;
/**
@@ -100,10 +101,10 @@
// i++;
// }
// nl.detach();
- DTMIterator nl = m_arg0.asIterator(xctxt, xctxt.getCurrentNode());
+ XSequence nl = m_arg0.execute(xctxt).xseq();
int i = nl.getLength();
nl.detach();
- return new XNumber((double) i);
+ return new org.apache.xpath.objects.XInteger(i);
}
}
diff --git a/src/org/apache/xpath/functions/FuncCurrent.java b/src/org/apache/xpath/functions/FuncCurrent.java
index ea7e2e4..bf628fb 100644
--- a/src/org/apache/xpath/functions/FuncCurrent.java
+++ b/src/org/apache/xpath/functions/FuncCurrent.java
@@ -56,23 +56,14 @@
*/
package org.apache.xpath.functions;
-import org.apache.xpath.res.XPATHErrorResources;
-
-//import org.w3c.dom.Node;
-//import org.w3c.dom.traversal.NodeIterator;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
-
-import java.util.Vector;
-
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNodeSet;
-import org.apache.xpath.axes.PredicatedNodeTest;
import org.apache.xpath.axes.LocPathIterator;
-import org.apache.xpath.axes.ContextNodeList;
-import org.apache.xpath.axes.SubContextList;
+import org.apache.xpath.axes.PredicatedNodeTest;
+import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XObject;
/**
* <meta name="usage" content="advanced"/>
@@ -137,7 +128,7 @@
/**
* No arguments to process, so this does nothing.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
diff --git a/src/org/apache/xpath/functions/FuncCurrentDate.java b/src/org/apache/xpath/functions/FuncCurrentDate.java
new file mode 100644
index 0000000..3c14266
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncCurrentDate.java
@@ -0,0 +1,86 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDate;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncCurrentDate extends FunctionDef1Arg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+
+ return new XDate(DateTimeObj.currentDateTime(DateTimeObj.dt1));
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncCurrentDateTime.java b/src/org/apache/xpath/functions/FuncCurrentDateTime.java
new file mode 100644
index 0000000..9270990
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncCurrentDateTime.java
@@ -0,0 +1,99 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncCurrentDateTime extends FunctionDef1Arg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+
+ return new XDateTime(DateTimeObj.currentDateTime(DateTimeObj.dt1));
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDTDuration.java b/src/org/apache/xpath/functions/FuncDTDuration.java
new file mode 100644
index 0000000..fbef67e
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDTDuration.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDTDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncDTDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String du = m_arg0.execute(xctxt).str();
+ Duration d = Duration.DTDuration(du);
+ if (d == null)
+ return new XDTDuration();
+ else
+ return new XDTDuration(d);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDTDurationEqual.java b/src/org/apache/xpath/functions/FuncDTDurationEqual.java
new file mode 100644
index 0000000..1dbcea4
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDTDurationEqual.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncDTDurationEqual extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = duration1.DTEqual(duration2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDTDurationFromSecs.java b/src/org/apache/xpath/functions/FuncDTDurationFromSecs.java
new file mode 100644
index 0000000..3c0cfca
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDTDurationFromSecs.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncDTDurationFromSecs extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ double secs = m_arg0.execute(xctxt).num();
+ Duration d = Duration.DTDurationFromSecs(secs);
+ if (d == null)
+ return new XDuration();
+ else
+ return new XDuration(d);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDTDurationGT.java b/src/org/apache/xpath/functions/FuncDTDurationGT.java
new file mode 100644
index 0000000..e52bea0
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDTDurationGT.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncDTDurationGT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = duration1.DTGreaterThan(duration2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDTDurationLT.java b/src/org/apache/xpath/functions/FuncDTDurationLT.java
new file mode 100644
index 0000000..41259e0
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDTDurationLT.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncDTDurationLT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = duration1.DTLessThan(duration2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncData.java b/src/org/apache/xpath/functions/FuncData.java
new file mode 100644
index 0000000..b739ed3
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncData.java
@@ -0,0 +1,132 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xalan.res.XSLMessages;
+import org.apache.xalan.res.XSLTErrorResources;
+import org.apache.xml.dtm.DTMSequence;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XJavaObject;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the data() function. Not supported before
+ * XPath/XSLT 2.0.
+ */
+public class FuncData extends FunctionOneArg
+{
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ XObject src=m_arg0.execute(xctxt);
+
+// /* This should have been checked at stylesheet build,
+// * and hence ought to be superfluous.
+// * %REVIEW% %OPT%
+// * */
+// if("1.0".equals(xctxt.getXPathVersion()))
+// {
+// xctxt.getErrorListener().error(
+// new TransformerException(
+// XSLMessages.createMessage(XSLTErrorResources.ER_NOT_SUPPORTED,
+// new Object[]{"XSLT 2.0 data()"}),
+// xctxt.getSAXLocator()));
+// //"Illegal value for xml:space", locator));
+// // If error listener returns...
+// return src;
+// }
+
+ if(src.getType()==src.CLASS_NODESET)
+ {
+ int sourceHandle=src.iter().item(0);
+
+ if(sourceHandle==org.apache.xml.dtm.DTM.NULL)
+ return /*new XJavaObject*/(org.apache.xpath.objects.XSequence.EMPTY);
+
+ org.apache.xml.dtm.DTM sourceDTM=xctxt.getDTM(sourceHandle);
+
+ DTMSequence seq=sourceDTM.getTypedValue(sourceHandle);
+
+ // %TODO% Other kinds of objects?
+ return new org.apache.xpath.objects.XDTMSequence(seq);
+ }
+
+ // %TODO% %REVIEW% See issues 80, 81, 231, ....
+ // There seem to be some conflicts here.
+ //
+ // "Consensus is to define data() on only singleton node and empty sequence"
+ // "Open issue as to whether data() should be defined on node sequences."
+ // "NB: Current definition of data() applied to a text node is the empty sequence."
+ // "data() applied to simple value is identity function (no-op)"
+ //
+ // "xf:data(): decided that it should return the error object when applied to document, PI,
+ // comment and namespace nodes." (What is "the error object"?)
+
+ else return src; // %TODO% Awaiting typed non-nodes...
+ }
+
+}
diff --git a/src/org/apache/xpath/functions/FuncDate.java b/src/org/apache/xpath/functions/FuncDate.java
new file mode 100644
index 0000000..28427a1
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDate.java
@@ -0,0 +1,87 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDate;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncDate extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ return new XDate(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDateTime.java b/src/org/apache/xpath/functions/FuncDateTime.java
new file mode 100644
index 0000000..158a20a
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDateTime.java
@@ -0,0 +1,102 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:dateTime() function.
+ */
+public class FuncDateTime extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (date == null)
+ return new XDateTime();
+ return new XDateTime(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDateTimeEq.java b/src/org/apache/xpath/functions/FuncDateTimeEq.java
new file mode 100644
index 0000000..0f5e0d7
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDateTimeEq.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:dateTime() function.
+ */
+public class FuncDateTimeEq extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date1 = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ DateTimeObj date2 = DateTimeObj.dateTime(m_arg1.execute(xctxt).str());
+ if (date1 == null || date2 == null)
+ return new XBoolean(false);
+ boolean eq = date1.equals(date2);
+ return new XBoolean(eq);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDateTimeGT.java b/src/org/apache/xpath/functions/FuncDateTimeGT.java
new file mode 100644
index 0000000..93591cc
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDateTimeGT.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:dateTime() function.
+ */
+public class FuncDateTimeGT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date1 = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ DateTimeObj date2 = DateTimeObj.dateTime(m_arg1.execute(xctxt).str());
+ if (date1 == null || date2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = date1.greaterThan(date2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDateTimeLT.java b/src/org/apache/xpath/functions/FuncDateTimeLT.java
new file mode 100644
index 0000000..b6b47ab
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDateTimeLT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:dateTime() function.
+ */
+public class FuncDateTimeLT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date1 = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ DateTimeObj date2 = DateTimeObj.dateTime(m_arg1.execute(xctxt).str());
+ if (date1 == null || date2 == null)
+ return new XBoolean(false);
+ boolean eq = date1.lessThan(date2);
+ return new XBoolean(eq);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDivDayTimeDuration.java b/src/org/apache/xpath/functions/FuncDivDayTimeDuration.java
new file mode 100644
index 0000000..4da7422
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDivDayTimeDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:divide-dayTimeDuration() function.
+ */
+public class FuncDivDayTimeDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ if (duration == null)
+ return new XDuration();
+ Duration du = duration.divideDTDuration(m_arg1.num(xctxt));
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDivYearMonthDuration.java b/src/org/apache/xpath/functions/FuncDivYearMonthDuration.java
new file mode 100644
index 0000000..75ba9c5
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDivYearMonthDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:divide-yearMonthDuration() function.
+ */
+public class FuncDivYearMonthDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ if (duration == null)
+ return new XDuration();
+ Duration du = duration.divideYMDuration(m_arg1.num(xctxt));
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDuration.java b/src/org/apache/xpath/functions/FuncDuration.java
new file mode 100644
index 0000000..25fce5d
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDuration.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String du = m_arg0.execute(xctxt).str();
+ Duration d = Duration.duration(new Duration(du));
+ if (d == null)
+ return new XDuration();
+ else
+ return new XDuration(d);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncDurationEqual.java b/src/org/apache/xpath/functions/FuncDurationEqual.java
new file mode 100644
index 0000000..55cc5e4
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncDurationEqual.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncDurationEqual extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.duration(new Duration(m_arg0.execute(xctxt).str()));
+ Duration duration2 = Duration.duration(new Duration(m_arg1.execute(xctxt).str()));
+ if(duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ boolean eq = duration1.equals(duration2);
+ return new XBoolean(eq);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncExtFunction.java b/src/org/apache/xpath/functions/FuncExtFunction.java
index 1d9aba9..a89a610 100644
--- a/src/org/apache/xpath/functions/FuncExtFunction.java
+++ b/src/org/apache/xpath/functions/FuncExtFunction.java
@@ -58,22 +58,14 @@
import java.util.Vector;
-import org.apache.xpath.Expression;
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.ExtensionsProvider;
-import org.apache.xpath.objects.*;
-import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.extensions.ExtensionsTable;
-import org.apache.xml.dtm.DTMIterator;
-
-//import org.w3c.dom.Node;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.traversal.NodeIterator;
-
-import org.apache.xml.dtm.*;
-import org.apache.xpath.axes.*;
-import org.apache.xpath.res.XPATHErrorResources;
import org.apache.xalan.res.XSLMessages;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExtensionsProvider;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XNull;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.res.XPATHErrorResources;
/**
* <meta name="usage" content="advanced"/>
@@ -122,7 +114,7 @@
* to be offset to the current stack frame).
* NEEDSDOC @param globalsSize
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
if (null != m_argVec)
@@ -133,7 +125,7 @@
{
Expression arg = (Expression) m_argVec.elementAt(i);
- arg.fixupVariables(vars, globalsSize);
+ arg.fixupVariables(vcs);
}
}
}
@@ -188,6 +180,12 @@
Expression arg = (Expression) m_argVec.elementAt(i);
XObject xobj = arg.execute(xctxt);
+
+ if(null == xobj)
+ throw new RuntimeException("Arg executed to a null XObject!!! arg: "+arg);
+
+ if(null == xobj.object())
+ throw new RuntimeException("Arg executed to a null object!!! arg: "+arg);
argVec.addElement(xobj);
}
@@ -198,6 +196,7 @@
if (null != val)
{
+ // If val is an XObject, it will just pass through create.
result = XObject.create(val, xctxt);
}
else
@@ -221,7 +220,11 @@
public void setArg(Expression arg, int argNum)
throws WrongNumberArgsException
{
- m_argVec.addElement(arg);
+ // m_argVec.addElement(arg);
+ if(argNum >= m_argVec.size())
+ m_argVec.setSize(argNum+1);
+
+ m_argVec.setElementAt(arg, argNum);
}
/**
diff --git a/src/org/apache/xpath/functions/FuncExtFunctionAvailable.java b/src/org/apache/xpath/functions/FuncExtFunctionAvailable.java
index c71a2e0..3a9261c 100644
--- a/src/org/apache/xpath/functions/FuncExtFunctionAvailable.java
+++ b/src/org/apache/xpath/functions/FuncExtFunctionAvailable.java
@@ -56,21 +56,14 @@
*/
package org.apache.xpath.functions;
-import org.apache.xml.utils.PrefixResolver;
+import javax.xml.transform.TransformerException;
import org.apache.xalan.templates.Constants;
-//import org.apache.xalan.transformer.TransformerImpl;
-//import org.apache.xalan.extensions.ExtensionsTable;
-
-//import org.w3c.dom.Node;
-
-import java.util.Vector;
-
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
+import org.apache.xml.utils.QName;
import org.apache.xpath.ExtensionsProvider;
-import org.apache.xpath.compiler.Keywords;
-import org.apache.xpath.objects.XObject;
+import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.SimpleNode;
/**
* <meta name="usage" content="advanced"/>
@@ -116,7 +109,9 @@
{
try
{
- return Keywords.functionAvailable(methName) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ // TBD: At least properly construct the QName object.
+ Object funcObj = SimpleNode.m_builtInFunctions.get(new QName(methName));
+ return (null != funcObj) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
}
catch (Exception e)
{
diff --git a/src/org/apache/xpath/functions/FuncFalse.java b/src/org/apache/xpath/functions/FuncFalse.java
index 99f0491..4568fa4 100644
--- a/src/org/apache/xpath/functions/FuncFalse.java
+++ b/src/org/apache/xpath/functions/FuncFalse.java
@@ -58,12 +58,10 @@
//import org.w3c.dom.Node;
-import java.util.Vector;
-
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
-import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
/**
* <meta name="usage" content="advanced"/>
@@ -88,7 +86,7 @@
/**
* No arguments to process, so this does nothing.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
diff --git a/src/org/apache/xpath/functions/FuncFloor.java b/src/org/apache/xpath/functions/FuncFloor.java
index d7dc0e1..0f1e9ef 100644
--- a/src/org/apache/xpath/functions/FuncFloor.java
+++ b/src/org/apache/xpath/functions/FuncFloor.java
@@ -58,12 +58,10 @@
//import org.w3c.dom.Node;
-import java.util.Vector;
-
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
/**
* <meta name="usage" content="advanced"/>
@@ -82,6 +80,6 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- return new XNumber(java.lang.Math.floor(m_arg0.execute(xctxt).num()));
+ return new XDouble(java.lang.Math.floor(m_arg0.execute(xctxt).num()));
}
}
diff --git a/src/org/apache/xpath/functions/FuncGDay.java b/src/org/apache/xpath/functions/FuncGDay.java
new file mode 100644
index 0000000..f994d10
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGDay.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XGDay;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncGDay extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.gDay(m_arg0.execute(xctxt).str());
+ return new XGDay(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGMonth.java b/src/org/apache/xpath/functions/FuncGMonth.java
new file mode 100644
index 0000000..674a18c
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGMonth.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XGMonth;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncGMonth extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.gMonth(m_arg0.execute(xctxt).str());
+ return new XGMonth(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGMonthDay.java b/src/org/apache/xpath/functions/FuncGMonthDay.java
new file mode 100644
index 0000000..bebe590
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGMonthDay.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XGMonthDay;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncGMonthDay extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.gMonthDay(m_arg0.execute(xctxt).str());
+ return new XGMonthDay(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGYear.java b/src/org/apache/xpath/functions/FuncGYear.java
new file mode 100644
index 0000000..be57a02
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGYear.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XGYearObj;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncGYear extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.gYear(m_arg0.execute(xctxt).str());
+ return new XGYearObj(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGYearMonth.java b/src/org/apache/xpath/functions/FuncGYearMonth.java
new file mode 100644
index 0000000..588defb
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGYearMonth.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XGYearMonth;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncGYearMonth extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.gYearMonth(m_arg0.execute(xctxt).str());
+ return new XGYearMonth(date);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetDFromDT.java b/src/org/apache/xpath/functions/FuncGetDFromDT.java
new file mode 100644
index 0000000..7156834
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetDFromDT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetDFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getDays());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetDFromDTDuration.java b/src/org/apache/xpath/functions/FuncGetDFromDTDuration.java
new file mode 100644
index 0000000..9e98220
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetDFromDTDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetDFromDTDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration du = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ if (du == null)
+ return new XInteger();
+ else
+ return new XInteger(du.getDays());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetDFromDate.java b/src/org/apache/xpath/functions/FuncGetDFromDate.java
new file mode 100644
index 0000000..b4a5f6a
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetDFromDate.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetDFromDate extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getDays());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetDTDuration.java b/src/org/apache/xpath/functions/FuncGetDTDuration.java
new file mode 100644
index 0000000..e80d70d
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetDTDuration.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:get-yearMonthDuration() function.
+ */
+public class FuncGetDTDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String dt1 = m_arg0.execute(xctxt).str();
+ String dt2 = m_arg1.execute(xctxt).str();
+
+ if (dt1.length() == 0 || dt2.length() == 0)
+ return new XDuration();
+
+ Duration du = (new DateTimeObj(dt1)).getDTDuration(new DateTimeObj(dt2));
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetHFromDT.java b/src/org/apache/xpath/functions/FuncGetHFromDT.java
new file mode 100644
index 0000000..3d60ab2
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetHFromDT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetHFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getHours());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetHFromDTDuration.java b/src/org/apache/xpath/functions/FuncGetHFromDTDuration.java
new file mode 100644
index 0000000..6a353af
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetHFromDTDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetHFromDTDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration du = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ if (du == null)
+ return new XInteger();
+ else
+ return new XInteger(du.getHours());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetHFromTime.java b/src/org/apache/xpath/functions/FuncGetHFromTime.java
new file mode 100644
index 0000000..2091a74
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetHFromTime.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetHFromTime extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getHours());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetMFromDT.java b/src/org/apache/xpath/functions/FuncGetMFromDT.java
new file mode 100644
index 0000000..1b3aa51
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetMFromDT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetMFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getMonths());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetMFromDate.java b/src/org/apache/xpath/functions/FuncGetMFromDate.java
new file mode 100644
index 0000000..46eeda5
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetMFromDate.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetMFromDate extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getMonths());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetMFromYMDuration.java b/src/org/apache/xpath/functions/FuncGetMFromYMDuration.java
new file mode 100644
index 0000000..acd0609
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetMFromYMDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetMFromYMDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration du = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ if (du == null)
+ return new XInteger();
+ else
+ return new XInteger(du.getMonths());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetMnFromDT.java b/src/org/apache/xpath/functions/FuncGetMnFromDT.java
new file mode 100644
index 0000000..a6b0aaf
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetMnFromDT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetMnFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getMinutes());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetMnFromDTDuration.java b/src/org/apache/xpath/functions/FuncGetMnFromDTDuration.java
new file mode 100644
index 0000000..74a7d65
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetMnFromDTDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetMnFromDTDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration du = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ if (du == null)
+ return new XInteger();
+ else
+ return new XInteger(du.getMinutes());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetMnFromTime.java b/src/org/apache/xpath/functions/FuncGetMnFromTime.java
new file mode 100644
index 0000000..7f00d73
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetMnFromTime.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetMnFromTime extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getMinutes());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetSFromDT.java b/src/org/apache/xpath/functions/FuncGetSFromDT.java
new file mode 100644
index 0000000..4ff0f70
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetSFromDT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetSFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XDouble();
+ else
+ return new XDouble(dt.getSeconds());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetSFromDTDuration.java b/src/org/apache/xpath/functions/FuncGetSFromDTDuration.java
new file mode 100644
index 0000000..088db43
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetSFromDTDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetSFromDTDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration du = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ if (du == null)
+ return new XDouble();
+ else
+ return new XDouble(du.getSeconds());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetSFromTime.java b/src/org/apache/xpath/functions/FuncGetSFromTime.java
new file mode 100644
index 0000000..cb810c9
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetSFromTime.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetSFromTime extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XDouble();
+ else
+ return new XDouble(dt.getSeconds());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetTZFromDT.java b/src/org/apache/xpath/functions/FuncGetTZFromDT.java
new file mode 100644
index 0000000..0113cfd
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetTZFromDT.java
@@ -0,0 +1,103 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetTZFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XString("");
+ else
+ return new XString(dt.getZone());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetTZFromDate.java b/src/org/apache/xpath/functions/FuncGetTZFromDate.java
new file mode 100644
index 0000000..558a737
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetTZFromDate.java
@@ -0,0 +1,103 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetTZFromDate extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XString("");
+ else
+ return new XString(dt.getZone());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetTZFromTime.java b/src/org/apache/xpath/functions/FuncGetTZFromTime.java
new file mode 100644
index 0000000..73aa620
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetTZFromTime.java
@@ -0,0 +1,103 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetTZFromTime extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XString("");
+ else
+ return new XString(dt.getZone());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetYFromDT.java b/src/org/apache/xpath/functions/FuncGetYFromDT.java
new file mode 100644
index 0000000..e2cd706
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetYFromDT.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetYFromDT extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getYears());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetYFromDate.java b/src/org/apache/xpath/functions/FuncGetYFromDate.java
new file mode 100644
index 0000000..eb83cf1
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetYFromDate.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetYFromDate extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dt = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ if (dt == null)
+ return new XInteger();
+ else
+ return new XInteger(dt.getYears());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetYFromYMDuration.java b/src/org/apache/xpath/functions/FuncGetYFromYMDuration.java
new file mode 100644
index 0000000..2244724
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetYFromYMDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncGetYFromYMDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration du = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ if (du == null)
+ return new XInteger();
+ else
+ return new XInteger(du.getYears());
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncGetYMDuration.java b/src/org/apache/xpath/functions/FuncGetYMDuration.java
new file mode 100644
index 0000000..f8d0eef
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncGetYMDuration.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:get-yearMonthDuration() function.
+ */
+public class FuncGetYMDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String dt1 = m_arg0.execute(xctxt).str();
+ String dt2 = m_arg1.execute(xctxt).str();
+
+ if (dt1.length() == 0 || dt2.length() == 0)
+ return new XDuration();
+
+ Duration du = (new DateTimeObj(dt1)).getYMDuration(new DateTimeObj(dt2));
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncId.java b/src/org/apache/xpath/functions/FuncId.java
index 1bfa3d1..9e32e52 100644
--- a/src/org/apache/xpath/functions/FuncId.java
+++ b/src/org/apache/xpath/functions/FuncId.java
@@ -69,7 +69,6 @@
import java.util.Vector;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.DOMHelper;
import org.apache.xpath.XPath;
import org.apache.xpath.NodeSetDTM;
import org.apache.xpath.objects.XObject;
diff --git a/src/org/apache/xpath/functions/FuncLast.java b/src/org/apache/xpath/functions/FuncLast.java
index f1627e0..5d45a0d 100644
--- a/src/org/apache/xpath/functions/FuncLast.java
+++ b/src/org/apache/xpath/functions/FuncLast.java
@@ -58,20 +58,14 @@
//import org.w3c.dom.Node;
//import org.w3c.dom.Element;
-import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
-
-import java.util.Vector;
-
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
-import org.apache.xpath.NodeSetDTM;
-import org.apache.xpath.axes.LocPathIterator;
-import org.apache.xpath.axes.ContextNodeList;
import org.apache.xpath.axes.SubContextList;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XNumber;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
/**
@@ -89,7 +83,8 @@
*/
public void postCompileStep(Compiler compiler)
{
- m_isTopLevel = compiler.getLocationPathDepth() == -1;
+ // TBD: Figure out isTopLevel for new parser world.
+ // m_isTopLevel = compiler.getLocationPathDepth() == -1;
}
/**
@@ -113,7 +108,7 @@
if (null != iter)
return iter.getLastPos(xctxt);
- DTMIterator cnl = xctxt.getContextNodeList();
+ XSequence cnl = xctxt.getContextSequence();
int count;
if(null != cnl)
{
@@ -135,7 +130,7 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- XNumber xnum = new XNumber((double) getCountOfContextNodeList(xctxt));
+ XNumber xnum = new XInteger(getCountOfContextNodeList(xctxt));
// System.out.println("last: "+xnum.num());
return xnum;
}
@@ -143,7 +138,7 @@
/**
* No arguments to process, so this does nothing.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
diff --git a/src/org/apache/xpath/functions/FuncMultDayTimeDuration.java b/src/org/apache/xpath/functions/FuncMultDayTimeDuration.java
new file mode 100644
index 0000000..15adf6a
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncMultDayTimeDuration.java
@@ -0,0 +1,103 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncMultDayTimeDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ if (duration == null)
+ return new XDuration();
+ Duration du = duration.multiplyDTDuration(m_arg1.num(xctxt));
+ return new XDuration(du);
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncMultYearMonthDuration.java b/src/org/apache/xpath/functions/FuncMultYearMonthDuration.java
new file mode 100644
index 0000000..4358c31
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncMultYearMonthDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncMultYearMonthDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ if (duration == null)
+ return new XDuration();
+ Duration du = duration.multiplyYMDuration(m_arg1.num(xctxt));
+ return new XDuration(du);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncNumber.java b/src/org/apache/xpath/functions/FuncNumber.java
index dbe9257..8a25d61 100644
--- a/src/org/apache/xpath/functions/FuncNumber.java
+++ b/src/org/apache/xpath/functions/FuncNumber.java
@@ -56,17 +56,10 @@
*/
package org.apache.xpath.functions;
-import org.apache.xpath.res.XPATHErrorResources;
-
-//import org.w3c.dom.Node;
-
-import java.util.Vector;
-
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
-import org.apache.xpath.objects.XNodeSet;
/**
* <meta name="usage" content="advanced"/>
@@ -85,6 +78,6 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- return new XNumber(getArg0AsNumber(xctxt));
+ return new XDouble(getArg0AsNumber(xctxt));
}
}
diff --git a/src/org/apache/xpath/functions/FuncPosition.java b/src/org/apache/xpath/functions/FuncPosition.java
index 40b74d3..b7be86e 100644
--- a/src/org/apache/xpath/functions/FuncPosition.java
+++ b/src/org/apache/xpath/functions/FuncPosition.java
@@ -60,17 +60,12 @@
//import org.w3c.dom.traversal.NodeIterator;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
-
-import java.util.Vector;
-
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
import org.apache.xpath.axes.SubContextList;
-import org.apache.xpath.axes.ContextNodeList;
-import org.apache.xpath.NodeSetDTM;
-import org.apache.xpath.compiler.Compiler;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
/**
* <meta name="usage" content="advanced"/>
@@ -86,8 +81,73 @@
*/
public void postCompileStep(Compiler compiler)
{
- m_isTopLevel = compiler.getLocationPathDepth() == -1;
+ // TBD: Figure out isTopLevel for new parser world.
+ // m_isTopLevel = compiler.getLocationPathDepth() == -1;
}
+
+// /**
+// * Get the position in the current context node list.
+// *
+// * @param xctxt Runtime XPath context.
+// *
+// * @return The current position of the itteration in the context node list,
+// * or -1 if there is no active context node list.
+// */
+// public int getPositionInContextNodeList(XPathContext xctxt)
+// {
+//
+// // System.out.println("FuncPosition- entry");
+// // If we're in a predicate, then this will return non-null.
+// SubContextList iter = m_isTopLevel ? null : xctxt.getSubContextList();
+//
+// if (null != iter)
+// {
+// int prox = iter.getProximityPosition(xctxt);
+//
+// // System.out.println("FuncPosition- prox: "+prox);
+// return prox;
+// }
+//
+// DTMIterator cnl = xctxt.getContextNodeList();
+//
+// if (null != cnl)
+// {
+// int n = cnl.getCurrentNode();
+// if(n == DTM.NULL)
+// {
+// if(cnl.getCurrentPos() == 0)
+// return 0;
+//
+// // Then I think we're in a sort. See sort21.xsl. So the iterator has
+// // already been spent, and is not on the node we're processing.
+// // It's highly possible that this is an issue for other context-list
+// // functions. Shouldn't be a problem for last(), and it shouldn't be
+// // a problem for current().
+// try
+// {
+// cnl = cnl.cloneWithReset();
+// }
+// catch(CloneNotSupportedException cnse)
+// {
+// throw new org.apache.xml.utils.WrappedRuntimeException(cnse);
+// }
+// int currentNode = xctxt.getContextNode();
+// // System.out.println("currentNode: "+currentNode);
+// while(DTM.NULL != (n = cnl.nextNode()))
+// {
+// if(n == currentNode)
+// break;
+// }
+// }
+// // System.out.println("n: "+n);
+// // System.out.println("FuncPosition- cnl.getCurrentPos(): "+cnl.getCurrentPos());
+// return cnl.getCurrentPos();
+// }
+//
+// // System.out.println("FuncPosition - out of guesses: -1");
+// return -1;
+// }
+
/**
* Get the position in the current context node list.
@@ -106,20 +166,21 @@
if (null != iter)
{
- int prox = iter.getProximityPosition(xctxt);
+ int prox = iter.getProximityPosition(xctxt)-1;
// System.out.println("FuncPosition- prox: "+prox);
return prox;
}
- DTMIterator cnl = xctxt.getContextNodeList();
+ XSequence cnl = xctxt.getContextSequence();
if (null != cnl)
{
- int n = cnl.getCurrentNode();
- if(n == DTM.NULL)
+ XObject current = cnl.getCurrent();
+ if(current == null)
{
- if(cnl.getCurrentPos() == 0)
+ int pos = cnl.getCurrentPos();
+ if(pos == 0)
return 0;
// Then I think we're in a sort. See sort21.xsl. So the iterator has
@@ -129,17 +190,19 @@
// a problem for current().
try
{
- cnl = cnl.cloneWithReset();
+ cnl = (XSequence)cnl.clone();
+ cnl.reset();
}
catch(CloneNotSupportedException cnse)
{
throw new org.apache.xml.utils.WrappedRuntimeException(cnse);
}
- int currentNode = xctxt.getContextNode();
+ XObject currentItem = xctxt.getCurrentItem();
+ XObject item;
// System.out.println("currentNode: "+currentNode);
- while(DTM.NULL != (n = cnl.nextNode()))
+ while(null != (item = cnl.next()))
{
- if(n == currentNode)
+ if(item.equals(currentItem))
break;
}
}
@@ -162,15 +225,15 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- double pos = (double) getPositionInContextNodeList(xctxt);
+ int pos = getPositionInContextNodeList(xctxt);
- return new XNumber(pos);
+ return new XInteger(pos+1);
}
/**
* No arguments to process, so this does nothing.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
diff --git a/src/org/apache/xpath/functions/FuncRound.java b/src/org/apache/xpath/functions/FuncRound.java
index d1bb54d..d25f9b8 100644
--- a/src/org/apache/xpath/functions/FuncRound.java
+++ b/src/org/apache/xpath/functions/FuncRound.java
@@ -58,12 +58,10 @@
//import org.w3c.dom.Node;
-import java.util.Vector;
-
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
/**
* <meta name="usage" content="advanced"/>
@@ -82,7 +80,7 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- return new XNumber(java.lang.Math.floor(m_arg0.execute(xctxt).num()
+ return new XDouble(java.lang.Math.floor(m_arg0.execute(xctxt).num()
+ 0.5));
}
}
diff --git a/src/org/apache/xpath/functions/FuncStringLength.java b/src/org/apache/xpath/functions/FuncStringLength.java
index 057c1f2..1e42b25 100644
--- a/src/org/apache/xpath/functions/FuncStringLength.java
+++ b/src/org/apache/xpath/functions/FuncStringLength.java
@@ -56,17 +56,10 @@
*/
package org.apache.xpath.functions;
-import org.apache.xpath.res.XPATHErrorResources;
-
-//import org.w3c.dom.Node;
-
-import java.util.Vector;
-
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XInteger;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
-import org.apache.xpath.objects.XNodeSet;
/**
* <meta name="usage" content="advanced"/>
@@ -85,6 +78,6 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
- return new XNumber(getArg0AsString(xctxt).length());
+ return new XInteger(getArg0AsString(xctxt).length());
}
}
diff --git a/src/org/apache/xpath/functions/FuncSubDayTimeDuration.java b/src/org/apache/xpath/functions/FuncSubDayTimeDuration.java
new file mode 100644
index 0000000..0af397e
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubDayTimeDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncSubDayTimeDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.DTDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XDuration();
+ Duration du = duration1.subtractDTDuration(duration2);
+ return new XDuration(du);
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSubYearMonthDuration.java b/src/org/apache/xpath/functions/FuncSubYearMonthDuration.java
new file mode 100644
index 0000000..f25d4d8
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubYearMonthDuration.java
@@ -0,0 +1,104 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:current-dateTime() function.
+ */
+public class FuncSubYearMonthDuration extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XDuration();
+ Duration du = duration1.subtractYMDuration(duration2);
+ return new XDuration(du);
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSubtractDTDurationFromDT.java b/src/org/apache/xpath/functions/FuncSubtractDTDurationFromDT.java
new file mode 100644
index 0000000..ebaed3e
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubtractDTDurationFromDT.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncSubtractDTDurationFromDT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String dateTime = m_arg0.execute(xctxt).str();
+ Duration duration = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (duration == null)
+ return new XDateTime(new DateTimeObj(dateTime));
+ DateTimeObj dt = (new DateTimeObj(dateTime)).subtractDTDurationFromDateTime(duration);
+ return new XDateTime(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSubtractDTDurationFromDate.java b/src/org/apache/xpath/functions/FuncSubtractDTDurationFromDate.java
new file mode 100644
index 0000000..3a84bbc
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubtractDTDurationFromDate.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDate;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncSubtractDTDurationFromDate extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (date == null || duration == null)
+ return new XDate();
+ DateTimeObj dt = date.subtractDTDurationFromDate(duration);
+ return new XDate(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSubtractDTDurationFromTime.java b/src/org/apache/xpath/functions/FuncSubtractDTDurationFromTime.java
new file mode 100644
index 0000000..43a6b32
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubtractDTDurationFromTime.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncSubtractDTDurationFromTime extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj time = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.DTDuration(m_arg1.execute(xctxt).str());
+ if (time == null || duration == null)
+ return new XTime();
+ DateTimeObj dt = time.subtractDTDurationFromTime(duration);
+ return new XTime(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSubtractYMDurationFromDT.java b/src/org/apache/xpath/functions/FuncSubtractYMDurationFromDT.java
new file mode 100644
index 0000000..537ff20
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubtractYMDurationFromDT.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:subtractYearMonthDurationFromDateTime() function.
+ */
+public class FuncSubtractYMDurationFromDT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String dateTime = m_arg0.execute(xctxt).str();
+ Duration duration = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (duration == null)
+ return new XDateTime(new DateTimeObj(dateTime));
+ DateTimeObj dt = (new DateTimeObj(dateTime)).subtractYMDurationFromDateTime(duration);
+ return new XDateTime(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSubtractYMDurationFromDate.java b/src/org/apache/xpath/functions/FuncSubtractYMDurationFromDate.java
new file mode 100644
index 0000000..32db663
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncSubtractYMDurationFromDate.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDate;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncSubtractYMDurationFromDate extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj date = DateTimeObj.date(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (date == null || duration == null)
+ return new XDate();
+ DateTimeObj dt = date.subtractYMDurationFromDate(duration);
+ return new XDate(dt);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncSum.java b/src/org/apache/xpath/functions/FuncSum.java
index 6ee8615..988853d 100644
--- a/src/org/apache/xpath/functions/FuncSum.java
+++ b/src/org/apache/xpath/functions/FuncSum.java
@@ -56,19 +56,13 @@
*/
package org.apache.xpath.functions;
+import javax.xml.transform.TransformerException;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
-
-import java.util.Vector;
-
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.DOMHelper;
-import org.apache.xpath.XPath;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
-import org.apache.xpath.objects.XString;
-
import org.apache.xml.utils.XMLString;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XObject;
/**
* <meta name="usage" content="advanced"/>
@@ -102,6 +96,6 @@
}
nodes.detach();
- return new XNumber(sum);
+ return new XDouble(sum);
}
}
diff --git a/src/org/apache/xpath/functions/FuncSystemProperty.java b/src/org/apache/xpath/functions/FuncSystemProperty.java
index 05e67cb..263885a 100644
--- a/src/org/apache/xpath/functions/FuncSystemProperty.java
+++ b/src/org/apache/xpath/functions/FuncSystemProperty.java
@@ -61,7 +61,6 @@
import java.io.BufferedInputStream;
import java.io.InputStream;
-import java.lang.ClassLoader;
import org.apache.xml.utils.PrefixResolver;
import org.apache.xpath.res.XPATHErrorResources;
@@ -72,6 +71,7 @@
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XNumber;
import org.apache.xpath.objects.XString;
@@ -194,7 +194,13 @@
try
{
// Needs to return the version number of the spec we conform to.
- return new XNumber(1.0);
+ String verStr = xctxt.getXPathVersion();
+ if(Double.valueOf(verStr).doubleValue() == 2.0)
+ return new XString(verStr);
+ else if(Double.valueOf(verStr).doubleValue() < 1.9)
+ return new XDouble(1.0);
+ else
+ return new XString("2.0");
}
catch (Exception ex)
{
diff --git a/src/org/apache/xpath/functions/FuncTime.java b/src/org/apache/xpath/functions/FuncTime.java
new file mode 100644
index 0000000..c7d035b
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncTime.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XTime;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:time() function.
+ */
+public class FuncTime extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj time = DateTimeObj.time(m_arg0.execute(xctxt).str());
+ return new XTime(time);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncTrue.java b/src/org/apache/xpath/functions/FuncTrue.java
index 2b13449..96a574f 100644
--- a/src/org/apache/xpath/functions/FuncTrue.java
+++ b/src/org/apache/xpath/functions/FuncTrue.java
@@ -58,12 +58,10 @@
//import org.w3c.dom.Node;
-import java.util.Vector;
-
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.XPath;
-import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
/**
* <meta name="usage" content="advanced"/>
@@ -88,7 +86,7 @@
/**
* No arguments to process, so this does nothing.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
diff --git a/src/org/apache/xpath/functions/FuncYMDuration.java b/src/org/apache/xpath/functions/FuncYMDuration.java
new file mode 100644
index 0000000..46d1873
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncYMDuration.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XYMDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncYMDuration extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ String du = m_arg0.execute(xctxt).str();
+ Duration d = Duration.YMDuration(du);
+ if (d == null)
+ return new XYMDuration();
+ else
+ return new XYMDuration(d);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncYMDurationEqual.java b/src/org/apache/xpath/functions/FuncYMDurationEqual.java
new file mode 100644
index 0000000..a96d66b
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncYMDurationEqual.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncYMDurationEqual extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = duration1.YMEqual(duration2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncYMDurationFromDT.java b/src/org/apache/xpath/functions/FuncYMDurationFromDT.java
new file mode 100644
index 0000000..3c65785
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncYMDurationFromDT.java
@@ -0,0 +1,108 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncYMDurationFromDT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ DateTimeObj dateTime = DateTimeObj.dateTime(m_arg0.execute(xctxt).str());
+ Duration duration = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (dateTime == null || duration == null)
+ return new XDateTime();
+ else
+ {
+ DateTimeObj dt = dateTime.subtractYMDurationFromDateTime(duration);
+ return new XDateTime(dt);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncYMDurationFromMonths.java b/src/org/apache/xpath/functions/FuncYMDurationFromMonths.java
new file mode 100644
index 0000000..2e1ec65
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncYMDurationFromMonths.java
@@ -0,0 +1,105 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:duration() function.
+ */
+public class FuncYMDurationFromMonths extends FunctionOneArg
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ int months = new Double(m_arg0.execute(xctxt).num()).intValue();
+ Duration d = Duration.YMDurationFromMonths(months);
+ if (d == null)
+ return new XDuration();
+ else
+ return new XDuration(d);
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncYMDurationGT.java b/src/org/apache/xpath/functions/FuncYMDurationGT.java
new file mode 100644
index 0000000..dc7a225
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncYMDurationGT.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncYMDurationGT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = duration1.YMGreaterThan(duration2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/FuncYMDurationLT.java b/src/org/apache/xpath/functions/FuncYMDurationLT.java
new file mode 100644
index 0000000..8ef98d8
--- /dev/null
+++ b/src/org/apache/xpath/functions/FuncYMDurationLT.java
@@ -0,0 +1,107 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.functions;
+
+//import org.w3c.dom.Node;
+//import org.w3c.dom.traversal.NodeIterator;
+import org.apache.xml.dtm.DTM;
+
+import java.util.Vector;
+
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPath;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xml.utils.Duration;
+
+/**
+ * <meta name="usage" content="advanced"/>
+ * Execute the xs:addYearMonthDuration() function.
+ */
+public class FuncYMDurationLT extends Function2Args
+{
+
+ /**
+ * Execute the function. The function must return
+ * a valid object.
+ * @param xctxt The current execution context.
+ * @return A valid XObject.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
+ {
+ Duration duration1 = Duration.YMDuration(m_arg0.execute(xctxt).str());
+ Duration duration2 = Duration.YMDuration(m_arg1.execute(xctxt).str());
+ if (duration1 == null || duration2 == null)
+ return new XBoolean(false);
+ else
+ {
+ boolean eq = duration1.YMLessThan(duration2);
+ return new XBoolean(eq);
+ }
+
+ }
+}
diff --git a/src/org/apache/xpath/functions/Function.java b/src/org/apache/xpath/functions/Function.java
index b2e22e4..12db741 100644
--- a/src/org/apache/xpath/functions/Function.java
+++ b/src/org/apache/xpath/functions/Function.java
@@ -61,11 +61,13 @@
import javax.xml.transform.TransformerException;
import org.apache.xalan.res.XSLMessages;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.compiler.Compiler;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.PathExpr;
/**
* <meta name="usage" content="advanced"/>
@@ -77,7 +79,7 @@
* the arguments don't have to be added to an array, but causes
* a larger code footprint.
*/
-public abstract class Function extends Expression
+public abstract class Function extends Expression implements Cloneable
{
/**
@@ -96,6 +98,24 @@
// throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("zero", null));
reportWrongNumberArgs();
}
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void jjtAddChild(Node exp, int argNum)
+ {
+ try
+ {
+ exp = fixupPrimarys(exp);
+ setArg((Expression)exp, argNum);
+ }
+ catch(WrongNumberArgsException wnae)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(wnae);
+ }
+ }
+
/**
* Check that the number of arguments passed to this function is correct.
@@ -179,4 +199,32 @@
{
// no default action
}
+
+// public void jjtAddChild(org.apache.xpath.parser.Node n, int i) {
+// // at least for now, just ignore this.
+// }
+
+ /** This method tells the node to add its argument to the node's
+ list of children. */
+ public void exprAddChild(ExpressionNode n, int i)
+ {
+ try
+ {
+ setArg((Expression)n, i);
+ }
+ catch(WrongNumberArgsException wnae)
+ {
+ throw new RuntimeException(wnae.getMessage());
+ }
+ }
+
+ /**
+ * Tell if this node should have it's PathExpr ancestory reduced.
+ */
+ public boolean isPathExprReduced()
+ {
+ Node pathOwner = jjtGetParent().jjtGetParent();
+ return pathOwner.jjtGetNumChildren() == 1 ? true : false;
+ }
+
}
diff --git a/src/org/apache/xpath/functions/Function2Args.java b/src/org/apache/xpath/functions/Function2Args.java
index c99a102..8c54383 100644
--- a/src/org/apache/xpath/functions/Function2Args.java
+++ b/src/org/apache/xpath/functions/Function2Args.java
@@ -56,11 +56,11 @@
*/
package org.apache.xpath.functions;
-import java.util.Vector;
-
import org.apache.xalan.res.XSLMessages;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathVisitor;
/**
@@ -95,11 +95,11 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
if(null != m_arg1)
- m_arg1.fixupVariables(vars, globalsSize);
+ m_arg1.fixupVariables(vcs);
}
@@ -217,5 +217,20 @@
return true;
}
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i <= 1, "Function2Args only allows index one or less to be accessed at this level!");
+ return (1 == i) ? m_arg1 : super.exprGetChild(i);
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ return 2;
+ }
+
}
diff --git a/src/org/apache/xpath/functions/Function3Args.java b/src/org/apache/xpath/functions/Function3Args.java
index ccb63b3..04e09ac 100644
--- a/src/org/apache/xpath/functions/Function3Args.java
+++ b/src/org/apache/xpath/functions/Function3Args.java
@@ -56,11 +56,11 @@
*/
package org.apache.xpath.functions;
-import java.util.Vector;
-
import org.apache.xalan.res.XSLMessages;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathVisitor;
/**
@@ -95,11 +95,11 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
if(null != m_arg2)
- m_arg2.fixupVariables(vars, globalsSize);
+ m_arg2.fixupVariables(vcs);
}
/**
@@ -216,5 +216,18 @@
return true;
}
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i <= 2, "Function2Args only allows index two or less to be accessed at this level!");
+ return (2 == i) ? m_arg2 : super.exprGetChild(i);
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ return 2;
+ }
}
diff --git a/src/org/apache/xpath/functions/FunctionDef1Arg.java b/src/org/apache/xpath/functions/FunctionDef1Arg.java
index 32dab0f..a2111e8 100644
--- a/src/org/apache/xpath/functions/FunctionDef1Arg.java
+++ b/src/org/apache/xpath/functions/FunctionDef1Arg.java
@@ -58,16 +58,14 @@
//import org.w3c.dom.Node;
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.objects.XNodeSet;
-import org.apache.xpath.objects.XNumber;
-import org.apache.xpath.objects.XString;
+import javax.xml.transform.TransformerException;
import org.apache.xalan.res.XSLMessages;
-import org.apache.xpath.res.XPATHErrorResources;
-
-import org.apache.xml.utils.XMLString;
-
import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.XMLString;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.res.XPATHErrorResources;
/**
* <meta name="usage" content="advanced"/>
@@ -205,4 +203,19 @@
{
return (null == m_arg0) ? false : super.canTraverseOutsideSubtree();
}
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i == 0, "FunctionDef1Arg only allows index zero to be accessed at this level!");
+ return m_arg0;
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ return (null == m_arg0) ? 0 : 1;
+ }
+
}
diff --git a/src/org/apache/xpath/functions/FunctionMultiArgs.java b/src/org/apache/xpath/functions/FunctionMultiArgs.java
index 46b299a..7c7b51e 100644
--- a/src/org/apache/xpath/functions/FunctionMultiArgs.java
+++ b/src/org/apache/xpath/functions/FunctionMultiArgs.java
@@ -56,14 +56,13 @@
*/
package org.apache.xpath.functions;
-import java.util.Vector;
-
-import org.apache.xpath.Expression;
-import org.apache.xpath.ExpressionOwner;
-import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.functions.Function3Args.Arg2Owner;
-import org.apache.xpath.res.XPATHErrorResources;
import org.apache.xalan.res.XSLMessages;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.res.XPATHErrorResources;
/**
* <meta name="usage" content="advanced"/>
@@ -95,21 +94,24 @@
super.setArg(arg, argNum);
else
{
+ argNum-=3;
if (null == m_args)
{
- m_args = new Expression[1];
- m_args[0] = arg;
+ m_args = new Expression[argNum+1];
+ m_args[argNum] = arg;
}
else
{
-
// Slow but space conservative.
- Expression[] args = new Expression[m_args.length + 1];
+ if(argNum >= m_args.length)
+ {
+ Expression[] args = new Expression[argNum + 1];
+ System.arraycopy(m_args, 0, args, 0, m_args.length);
+ m_args = args;
+ }
- System.arraycopy(m_args, 0, args, 0, m_args.length);
-
- args[m_args.length] = arg;
- m_args = args;
+ m_args[argNum] = arg;
+
}
arg.exprSetParent(this);
}
@@ -125,14 +127,14 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
if(null != m_args)
{
for (int i = 0; i < m_args.length; i++)
{
- m_args[i].fixupVariables(vars, globalsSize);
+ m_args[i].fixupVariables(vcs);
}
}
}
@@ -261,4 +263,18 @@
return true;
}
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ return (i < 3) ? super.exprGetChild(i) : m_args[i - 3];
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ return ((null != m_args) ? m_args.length : 0)+super.exprGetNumChildren();
+ }
+
}
diff --git a/src/org/apache/xpath/functions/FunctionOneArg.java b/src/org/apache/xpath/functions/FunctionOneArg.java
index 92c5532..6c1d458 100644
--- a/src/org/apache/xpath/functions/FunctionOneArg.java
+++ b/src/org/apache/xpath/functions/FunctionOneArg.java
@@ -56,11 +56,11 @@
*/
package org.apache.xpath.functions;
-import java.util.Vector;
-
import org.apache.xalan.res.XSLMessages;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathVisitor;
/**
@@ -152,10 +152,10 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
if(null != m_arg0)
- m_arg0.fixupVariables(vars, globalsSize);
+ m_arg0.fixupVariables(vcs);
}
/**
@@ -207,5 +207,19 @@
return true;
}
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i == 0, "FunctionOneArg only allows index zero to be accessed!");
+ return m_arg0;
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ return 1;
+ }
+
}
diff --git a/src/org/apache/xpath/objects/NodeSequence.java b/src/org/apache/xpath/objects/NodeSequence.java
new file mode 100644
index 0000000..25be0c2
--- /dev/null
+++ b/src/org/apache/xpath/objects/NodeSequence.java
@@ -0,0 +1,717 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import java.io.Serializable;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.dtm.DTMManager;
+import org.apache.xml.dtm.DTMFilter;
+import org.apache.xml.utils.NodeVector;
+import org.apache.xpath.Expression;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.axes.PathComponent;
+
+/**
+ * This class is the dynamic wrapper for a Xalan DTMIterator instance, and
+ * provides random access capabilities.
+ *
+ * (This used to be in the axes package. But in fact it's only
+ * referenced in the objects package, and since it implements
+ * XObject it probably belongs with the latter.)
+ */
+public class NodeSequence extends XObject
+ implements DTMIterator, Cloneable, PathComponent
+{
+ NodeVector m_obj; // Accessed directly by subclasses...?
+
+
+ /** The index of the last node in the iteration. */
+ protected int m_last = -1;
+
+ /**
+ * The index of the next node to be fetched. Useful if this
+ * is a cached iterator, and is being used as random access
+ * NodeList.
+ */
+ protected int m_next = 0;
+
+ /**
+ * If this iterator needs to cache nodes that are fetched, they
+ * are stored in the Vector in the generic object.
+ */
+ protected NodeVector getVector()
+ {
+ return (NodeVector)m_obj;
+ }
+
+ /**
+ * Set the vector where nodes will be stored.
+ */
+ protected void SetVector(NodeVector v)
+ {
+ m_obj = v;
+ }
+
+
+ /**
+ * If this iterator needs to cache nodes that are fetched, they
+ * are stored here.
+ */
+ public boolean hasCache()
+ {
+ return (m_obj != null);
+ }
+
+
+ /**
+ * The functional iterator that fetches nodes.
+ */
+ protected DTMIterator m_iter;
+
+ /**
+ * Set the functional iterator that fetches nodes.
+ * @param iter The iterator that is to be contained.
+ */
+ public final void setIter(DTMIterator iter)
+ {
+ m_iter = iter;
+ if(null == m_dtmMgr)
+ m_dtmMgr = iter.getDTMManager();
+ }
+
+ /**
+ * Get the functional iterator that fetches nodes.
+ * @return The contained iterator.
+ */
+ public final DTMIterator getContainedIter()
+ {
+ return m_iter;
+ }
+
+ /**
+ * The DTMManager to use if we're using a NodeVector only.
+ * We may well want to do away with this, and store it in the NodeVector.
+ */
+ protected DTMManager m_dtmMgr;
+
+ // ==== Constructors ====
+
+ /**
+ * Create a new NodeSequence from a (already cloned) iterator.
+ *
+ * @param iter Cloned (not static) DTMIterator.
+ * @param context The initial context node.
+ * @param xctxt The execution context.
+ * @param shouldCacheNodes True if this sequence can random access.
+ */
+ public NodeSequence(DTMIterator iter, int context,
+ XPathContext xctxt, boolean shouldCacheNodes)
+ {
+ m_dtmMgr = xctxt.getDTMManager();
+ setIter(iter);
+ setRoot(context, xctxt);
+ setShouldCache(shouldCacheNodes);
+ }
+
+ /**
+ * Create a new NodeSequence from a (already cloned) iterator.
+ *
+ * @param iter Cloned (not static) DTMIterator.
+ */
+ public NodeSequence(NodeVector nodeVector)
+ {
+ m_obj=nodeVector;
+ if(null != nodeVector)
+ {
+ if(nodeVector instanceof DTMIterator)
+ {
+ m_dtmMgr = ((DTMIterator)nodeVector).getDTMManager();
+ setIter((DTMIterator)nodeVector);
+ m_last = ((DTMIterator)nodeVector).getLength();
+ }
+
+ }
+ }
+
+ /**
+ * Construct an empty XNodeSet object. This is used to create a mutable
+ * nodeset to which random nodes may be added.
+ */
+ public NodeSequence(DTMManager dtmMgr)
+ {
+ this(new NodeVector());
+ m_last = 0;
+ m_dtmMgr = dtmMgr;
+ }
+
+ /**
+ * Passthrough for XRTreeFrag(Expression) constructor, since
+ * c'tors are not inherited and there seems to be no way to
+ * invoke super.super.super().
+ *
+ * @param frag Document fragment this will wrap
+ */
+ /*
+ protected NodeSequence(org.apache.xpath.Expression expr)
+ {
+ super(expr);
+ }
+ */
+
+
+
+ /**
+ * Create a new NodeSequence in an invalid (null) state.
+ */
+ public NodeSequence()
+ {
+ }
+
+ public Object object()
+ {
+ return m_obj;
+ }
+
+
+ /**
+ * @see DTMIterator#getDTM(int)
+ */
+ public DTM getDTM(int nodeHandle)
+ {
+ DTMManager mgr = getDTMManager();
+ if(null != mgr)
+ return getDTMManager().getDTM(nodeHandle);
+ else
+ {
+ assertion(false, "Can not get a DTM Unless a DTMManager has been set!");
+ return null;
+ }
+ }
+
+ /**
+ * @see DTMIterator#getDTMManager()
+ */
+ public DTMManager getDTMManager()
+ {
+ return m_dtmMgr;
+ }
+
+ /**
+ * @see DTMIterator#getRoot()
+ */
+ public int getRoot()
+ {
+ if(null != m_iter)
+ return m_iter.getRoot();
+ else
+ {
+ // NodeSetDTM will call this, and so it's not a good thing to throw
+ // an assertion here.
+ // assertion(false, "Can not get the root from a non-iterated NodeSequence!");
+ return DTM.NULL;
+ }
+ }
+
+ /**
+ * @see DTMIterator#setRoot(int, Object)
+ */
+ public void setRoot(int nodeHandle, Object environment)
+ {
+ if(null != m_iter)
+ {
+ XPathContext xctxt = (XPathContext)environment;
+ m_dtmMgr = xctxt.getDTMManager();
+ m_iter.setRoot(nodeHandle, environment);
+ if(!m_iter.isDocOrdered())
+ {
+ if(!hasCache())
+ setShouldCache(true);
+ runTo(-1);
+ m_next=0;
+ }
+ }
+ else
+ assertion(false, "Can not setRoot on a non-iterated NodeSequence!");
+ }
+
+ /**
+ * @see DTMIterator#reset()
+ */
+ public void reset()
+ {
+ m_next = 0;
+ // not resetting the iterator on purpose!!!
+ }
+
+ /**
+ * @see DTMIterator#getWhatToShow()
+ */
+ public int getWhatToShow()
+ {
+ return hasCache() ? (DTMFilter.SHOW_ALL & ~DTMFilter.SHOW_ENTITY_REFERENCE)
+ : m_iter.getWhatToShow();
+ }
+
+ /**
+ * @see DTMIterator#getExpandEntityReferences()
+ */
+ public boolean getExpandEntityReferences()
+ {
+ if(null != m_iter)
+ return m_iter.getExpandEntityReferences();
+ else
+ return true;
+ }
+
+ /**
+ * @see DTMIterator#nextNode()
+ */
+ public int nextNode()
+ {
+ // If the cache is on, and the node has already been found, then
+ // just return from the list.
+ NodeVector vec = getVector();
+ if (null != vec)
+ {
+ if(m_next < vec.size())
+ {
+ int next = vec.elementAt(m_next);
+ m_next++;
+ return next;
+ }
+ else if((-1 != m_last) || (null == m_iter))
+ {
+ m_next++;
+ return DTM.NULL;
+ }
+ }
+
+ if (null == m_iter)
+ return DTM.NULL;
+
+ int next = m_iter.nextNode();
+ if(DTM.NULL != next)
+ {
+ if(hasCache())
+ {
+ if(m_iter.isDocOrdered())
+ {
+ getVector().addElement(next);
+ m_next++;
+ }
+ else
+ {
+ int insertIndex = addNodeInDocOrder(next);
+ if(insertIndex >= 0)
+ m_next++;
+ }
+ }
+ else
+ m_next++;
+ }
+ else
+ {
+ m_last = m_next;
+ m_next++;
+ }
+
+ return next;
+ }
+
+ /**
+ * @see DTMIterator#previousNode()
+ */
+ public int previousNode()
+ {
+ if(hasCache())
+ {
+ if(m_next <= 0)
+ return DTM.NULL;
+ else
+ {
+ m_next--;
+ return item(m_next);
+ }
+ }
+ else
+ {
+ int n = m_iter.previousNode();
+ m_next = m_iter.getCurrentPos();
+ return m_next;
+ }
+ }
+
+ /**
+ * @see DTMIterator#detach()
+ */
+ public void detach()
+ {
+ if(null != m_iter)
+ m_iter.detach();
+ super.detach();
+ }
+
+ /**
+ * Calling this with a value of false will cause the nodeset
+ * to be cached.
+ * @see DTMIterator#allowDetachToRelease(boolean)
+ */
+ public void allowDetachToRelease(boolean allowRelease)
+ {
+ if((false == allowRelease) && !hasCache())
+ {
+ setShouldCache(true);
+ }
+
+ if(null != m_iter)
+ m_iter.allowDetachToRelease(allowRelease);
+ super.allowDetachToRelease(allowRelease);
+ }
+
+ /**
+ * @see DTMIterator#getCurrentNode()
+ */
+ public int getCurrentNode()
+ {
+ if(hasCache())
+ {
+ int currentIndex = m_next-1;
+ NodeVector vec = getVector();
+ if((currentIndex >= 0) && (currentIndex < vec.size()))
+ return vec.elementAt(currentIndex);
+ else
+ return DTM.NULL;
+ }
+
+ if(null != m_iter)
+ {
+ return m_iter.getCurrentNode();
+ }
+ else
+ return DTM.NULL;
+ }
+
+ /**
+ * @see DTMIterator#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return (0 == m_next);
+ }
+
+ /**
+ * @see DTMIterator#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ if (b)
+ {
+ if(!hasCache())
+ {
+ SetVector(new NodeVector());
+ }
+// else
+// getVector().RemoveAllNoClear(); // Is this good?
+ }
+ else
+ SetVector(null);
+ }
+
+ /**
+ * @see DTMIterator#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return hasCache(); // though may be surprising if it also has an iterator!
+ }
+
+ /**
+ * @see DTMIterator#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_next-1;
+ }
+
+ /**
+ * @see DTMIterator#runTo(int)
+ */
+ public void runTo(int index)
+ {
+ int n;
+
+ if (-1 == index)
+ {
+ int pos = m_next;
+ while (DTM.NULL != (n = nextNode()));
+ m_next = pos;
+ }
+ else if(m_next == index)
+ {
+ return;
+ }
+ else if(hasCache() && m_next < getVector().size())
+ {
+ m_next = index;
+ }
+ else if((null == getVector()) && (index < m_next))
+ {
+ while ((m_next >= index) && DTM.NULL != (n = previousNode()));
+ }
+ else
+ {
+ while ((m_next < index) && DTM.NULL != (n = nextNode()));
+ }
+
+ }
+
+ /**
+ * @see DTMIterator#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ runTo(i);
+ }
+
+ /**
+ * @see DTMIterator#item(int)
+ */
+ public int item(int index)
+ {
+ setCurrentPos(index);
+ int n = nextNode();
+ m_next = index;
+ return n;
+ }
+
+ /**
+ * @see DTMIterator#setItem(int, int)
+ */
+ public void setItem(int node, int index)
+ {
+ NodeVector vec = getVector();
+ if(null != vec)
+ {
+ vec.setElementAt(node, index);
+ m_last = vec.size();
+ }
+ else
+ m_iter.setItem(node, index);
+ }
+
+ /**
+ * @see DTMIterator#getLength()
+ */
+ public int getLength()
+ {
+ if(hasCache())
+ {
+ if(-1 == m_last)
+ {
+ int pos = m_next;
+ runTo(-1);
+ m_next = pos;
+ }
+ return m_last;
+ }
+ else
+ {
+ return m_iter.getLength();
+ }
+ }
+
+ /**
+ * Note: Not a deep clone.
+ * @see DTMIterator#cloneWithReset()
+ */
+ public DTMIterator cloneWithReset() throws CloneNotSupportedException
+ {
+ NodeSequence seq = (NodeSequence)super.clone();
+ seq.m_next = 0;
+ return seq;
+ }
+
+ /**
+ * Get a clone of this iterator, but don't reset the iteration in the
+ * process, so that it may be used from the current position.
+ * Note: Not a deep clone.
+ *
+ * @return A clone of this object.
+ *
+ * @throws CloneNotSupportedException
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+
+ /**
+ * @see DTMIterator#isDocOrdered()
+ */
+ public boolean isDocOrdered()
+ {
+ if(null != m_iter)
+ return m_iter.isDocOrdered();
+ else
+ return true; // can't be sure?
+ }
+
+ /**
+ * @see DTMIterator#getAxis()
+ */
+ public int getAxis()
+ {
+ if(null != m_iter)
+ return m_iter.getAxis();
+ else
+ {
+ assertion(false, "Can not getAxis from a non-iterated node sequence!");
+ return 0;
+ }
+ }
+
+ /**
+ * @see PathComponent#getAnalysisBits()
+ */
+ public int getAnalysisBits()
+ {
+ if((null != m_iter) && (m_iter instanceof PathComponent))
+ return ((PathComponent)m_iter).getAnalysisBits();
+ else
+ return 0;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ super.fixupVariables(vcs);
+ }
+
+ /**
+ * Add the node into a vector of nodes where it should occur in
+ * document order.
+ * @param v Vector of nodes, presumably containing Nodes
+ * @param obj Node object.
+ *
+ * @param node The node to be added.
+ * @param test true if we should test for doc order
+ * @param support The XPath runtime context.
+ * @return insertIndex.
+ * @throws RuntimeException thrown if this NodeSetDTM is not of
+ * a mutable type.
+ */
+ protected int addNodeInDocOrder(int node)
+ {
+ assertion(hasCache(), "addNodeInDocOrder must be done on a mutable sequence!");
+
+ int insertIndex = -1;
+
+ NodeVector vec = getVector();
+
+ // This needs to do a binary search, but a binary search
+ // is somewhat tough because the sequence test involves
+ // two nodes.
+ int size = vec.size(), i;
+
+ for (i = size - 1; i >= 0; i--)
+ {
+ int child = vec.elementAt(i);
+
+ if (child == node)
+ {
+ i = -2; // Duplicate, suppress insert
+
+ break;
+ }
+
+ DTM dtm = m_dtmMgr.getDTM(node);
+ if (!dtm.isNodeAfter(node, child))
+ {
+ break;
+ }
+ }
+
+ if (i != -2)
+ {
+ insertIndex = i + 1;
+
+ vec.insertElementAt(node, insertIndex);
+ }
+
+ // checkDups();
+ return insertIndex;
+ } // end addNodeInDocOrder(Vector v, Object obj)
+
+
+ /**
+ * @see org.apache.xpath.Expression#isNodesetExpr()
+ */
+ public boolean isNodesetExpr()
+ {
+ return true;
+ }
+
+}
+
diff --git a/src/org/apache/xpath/objects/TypeOperations.java b/src/org/apache/xpath/objects/TypeOperations.java
new file mode 100644
index 0000000..89197fd
--- /dev/null
+++ b/src/org/apache/xpath/objects/TypeOperations.java
@@ -0,0 +1,311 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+/**
+ * The responsibility of TypeOperations is to .
+ *
+ * Created Jul 18, 2002
+ * @author sboag
+ */
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 18, 2002
+ * @author sboag
+ */
+public interface TypeOperations
+{
+ /**
+ * Method add.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject add(XObject left, XObject right);
+
+ /**
+ * Method and.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject and(XObject left, XObject right);
+
+ /**
+ * Method bool.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject bool(XObject left, XObject right);
+
+ /**
+ * Method div.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject div(XObject left, XObject right);
+
+ /**
+ * Method equals.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject equals(XObject left, XObject right);
+
+ /**
+ * Method follows.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject follows(XObject left, XObject right);
+
+ /**
+ * Method fortraneq.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject fortraneq(XObject left, XObject right);
+
+ /**
+ * Method fortrange.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject fortrange(XObject left, XObject right);
+
+ /**
+ * Method fortrangt.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject fortrangt(XObject left, XObject right);
+
+ /**
+ * Method fortranle.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject fortranle(XObject left, XObject right);
+
+ /**
+ * Method fortranlt.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject fortranlt(XObject left, XObject right);
+ /**
+ * Method fortranne.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject fortranne(XObject left, XObject right);
+
+ /**
+ * Method gt.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject gt(XObject left, XObject right);
+
+ /**
+ * Method gte.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject gte(XObject left, XObject right);
+
+ /**
+ * Method gtgt.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject gtgt(XObject left, XObject right);
+
+ /**
+ * Method idiv.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject idiv(XObject left, XObject right);
+
+ /**
+ * Method is.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject is(XObject left, XObject right);
+
+ /**
+ * Method isnot.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject isnot(XObject left, XObject right);
+
+ /**
+ * Method lt.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject lt(XObject left, XObject right);
+
+ /**
+ * Method lte.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject lte(XObject left, XObject right);
+
+ /**
+ * Method ltlt.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject ltlt(XObject left, XObject right);
+
+ /**
+ * Method mod.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject mod(XObject left, XObject right);
+
+ /**
+ * Method mult.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject mult(XObject left, XObject right);
+
+ /**
+ * Method neg.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject neg(XObject left, XObject right);
+
+ /**
+ * Method notequals.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject notequals(XObject left, XObject right);
+
+ /**
+ * Method or.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject or(XObject left, XObject right);
+
+ /**
+ * Method pos.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject pos(XObject left, XObject right);
+
+ /**
+ * Method precedes.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject precedes(XObject left, XObject right);
+
+ /**
+ * Method quo.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject quo(XObject left, XObject right);
+
+ /**
+ * Method subtract.
+ * @param left
+ * @param right
+ * @return XObject
+ */
+ public XObject subtract(XObject left, XObject right);
+}
diff --git a/src/org/apache/xpath/objects/XBoolean.java b/src/org/apache/xpath/objects/XBoolean.java
index 6d406ee..9c04f03 100644
--- a/src/org/apache/xpath/objects/XBoolean.java
+++ b/src/org/apache/xpath/objects/XBoolean.java
@@ -56,6 +56,7 @@
*/
package org.apache.xpath.objects;
+import org.apache.xml.dtm.XType;
import org.w3c.dom.*;
/**
@@ -65,33 +66,26 @@
*/
public class XBoolean extends XObject
{
+ boolean m_val;
- /**
- * <meta name="usage" content="internal"/>
- * A true boolean object so we don't have to keep creating them.
- */
- public static XBoolean S_TRUE = new XBooleanStatic(true);
+ public final static XBoolean S_TRUE = new XBoolean(true);
+ public final static XBoolean S_FALSE = new XBoolean(false);
- /**
- * <meta name="usage" content="internal"/>
- * A true boolean object so we don't have to keep creating them.
- */
- public static XBoolean S_FALSE = new XBooleanStatic(false);
-
- /** Value of the object.
- * @serial */
- boolean m_val;
/**
* Construct a XBoolean object.
+ *
+ * NOTE: Arguably, this should not be a public ctor; folks
+ * should instead be calling a factory which returns one of
+ * the statics. Problem with that: If XBoolean ever directly
+ * implements XSequence, and XSequence behaves as a singleton
+ * iterator... Count this as downside of that approach.
+ * %REVIEW%
*
* @param b Value of the boolean object
*/
public XBoolean(boolean b)
{
-
- super();
-
m_val = b;
}
@@ -102,13 +96,17 @@
*/
public XBoolean(Boolean b)
{
-
- super();
-
m_val = b.booleanValue();
- m_obj = b;
}
-
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return new XSequenceSingleton(this);
+ }
/**
* Tell that this is a CLASS_BOOLEAN.
@@ -169,9 +167,7 @@
*/
public Object object()
{
- if(null == m_obj)
- m_obj = m_val ? S_TRUE : S_FALSE;
- return m_obj;
+ return m_val ? Boolean.TRUE : Boolean.FALSE;
}
/**
@@ -185,12 +181,13 @@
*/
public boolean equals(XObject obj2)
{
-
+ // Alternative approach would be implement equals(XNodeset)...?
+
// In order to handle the 'all' semantics of
// nodeset comparisons, we always call the
// nodeset function.
- if (obj2.getType() == XObject.CLASS_NODESET)
- return obj2.equals(this);
+ if (obj2.isNodesetExpr())
+ return ((XNodeSet)obj2).equalsExistential(this);
try
{
diff --git a/src/org/apache/xpath/objects/XDTDuration.java b/src/org/apache/xpath/objects/XDTDuration.java
new file mode 100644
index 0000000..6714046
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDTDuration.java
@@ -0,0 +1,278 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XDTDuration extends XDuration
+{
+
+ /** Empty string XString object */
+ public static XString EMPTYSTRING = new XString("");
+
+ /**
+ * Construct a XDate object, with a null value.
+ * This one's actually being used, unlike most XObject empty ctors
+ * ... but I'm not sure why; it's equivalent to passing in null.
+ */
+ public XDTDuration()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XDuration(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XDuration(String val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ public XDTDuration(Duration val)
+ {
+ //super(val);
+ m_val = val;
+ }
+
+
+ /**
+ * Tell that this is a CLASS_DURATION.
+ *
+ * @return type CLASS_DURATION
+ */
+ public int getType()
+ {
+ return this.CLASS_DTDURATION;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DURATION"
+ */
+ public String getTypeString()
+ {
+ return "#DAYTIMEDURATION";
+ }
+
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return true if the two objects are equal
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equals(XObject obj2)
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ int t = obj2.getType();
+ if(XObject.CLASS_DTDURATION == t)
+ return m_val.DTEqual(((XDuration)obj2).m_val);
+
+
+ // Otherwise, both objects to be compared are converted to strings as
+ // if by applying the string function.
+ return xstr().equals(obj2.xstr());
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DTDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.DTLessThan(du);
+ }
+ else
+ return this.num() < obj2.num();
+ }
+
+ /**
+ * Tell if one object is less than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DTDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.DTLessThanOrEqual(du);
+ }
+ else
+ return this.num() <= obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+ int t = obj2.getType();
+ if(XObject.CLASS_DTDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.DTGreaterThan(du);
+ }
+ else
+ return this.num() > obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DTDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.DTGreaterThanOrEqual(du);
+ }
+ else
+ return this.num() >= obj2.num();
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XDTMSequence.java b/src/org/apache/xpath/objects/XDTMSequence.java
new file mode 100644
index 0000000..0dcfc4a
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDTMSequence.java
@@ -0,0 +1,560 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.DTMSequence;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xml.utils.XMLString;
+
+/** This class provides an API representation for the XPath 2 Data Model's "Sequences"
+ * -- which are the basic representation for typed values. Only built-in types,
+ * types derived from built-ins, and sets thereof are returned directly by the XPath2
+ * DM; complex schema-types must be accessed through the document tree.
+ *
+ * This implementation exists as a wrapper/proxy for the primitive
+ * DTMSequence object. DTM is not aware of XPath, and DTMSequence
+ * returns its values as primitive Java objects; we need to re-express
+ * that in XPath objects.
+ * */
+public class XDTMSequence extends XObject implements XSequence
+{
+ DTMSequence m_dtmseq;
+
+ protected int m_pos = -1;
+ protected int m_homogtype = -1; // cache getTypes()
+
+ /** Create a sequence, initially empty.
+ * */
+ public XDTMSequence(DTMSequence seq)
+ {
+ m_dtmseq=seq;
+ }
+
+
+ /** @return the number of members in this sequence. */
+ public int getLength()
+ {
+ return m_dtmseq.getLength();
+ }
+
+ /** Retrieve the value for this member of the sequence. Since values may be
+ * a heterogenous mix, and their type may not be known until they're examined,
+ * they're returned as Objects. This is storage-inefficient if the value(s)
+ * is/are builtins that map to Java primitives. Tough.
+ *
+ * @param index 0-based index into the sequence.
+ * @return the specified value
+ * @throws exception if index <0 or >=length
+ * */
+ public XObject next()
+ {
+ if(m_pos >= m_dtmseq.getLength()-1)
+ return null;
+ return XObjectFactory.create(m_dtmseq.getValue(++m_pos));
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ if(m_pos <= 0)
+ return null;
+ return XObjectFactory.create(m_dtmseq.getValue(--m_pos));
+ }
+
+ /** %REVIEW% Format not yet firmly settled. Primarily for debugging purposes!
+ * */
+ public String toString()
+ {
+ return m_dtmseq.toString();
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#allowDetachToRelease(boolean)
+ */
+ public void allowDetachToRelease(boolean allowRelease)
+ {
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#detach()
+ */
+ public void detach()
+ {
+ // Do nothing
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ int pos = m_pos;
+
+ return XObjectFactory.create(m_dtmseq.getValue(m_pos));
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_pos;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ return m_dtmseq.getTypeLocalName(m_pos);
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ return m_dtmseq.getTypeNS(m_pos);
+ }
+
+ /**
+ * If this iterator holds homogenous primitive types, return that type ID.
+ *
+ * @return The homogenous type, or NOTHOMOGENOUS, or EMPTYSEQ.
+ */
+ public int getTypes()
+ {
+ if(m_homogtype==-1) // Return cached value if available
+ {
+ if(m_dtmseq.getLength()==0)
+ m_homogtype=XType.EMPTYSEQ;
+ else
+ {
+ // AT THIS TIME, DTMSequences are always homogenous
+ // collections of primitives,
+ // so I can just check the current element. If that
+ // changes, we'll have to loop and check for conflicts.
+ //
+ // %REVIEW% Should we do so now, as safety net?
+ // Probably safer...
+ m_homogtype=getType();
+ }
+ }
+ return m_homogtype;
+ }
+
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getType()
+ */
+ public int getType()
+ {
+ if(m_dtmseq.getLength()==0)
+ return m_homogtype=XType.EMPTYSEQ;
+
+ String[] names=XType.getNames();
+
+ // Need to check for derivation, rather than just doing lookup
+ // against the name table as in XType.getTypeFromLocalName()
+ //
+ // %REVIEW% What if m_pos is still -1?
+ // ... XSequenceImpl doesn't deal either. Ignored for now.
+ for(int whichtype=names.length-1;whichtype>=0;--whichtype)
+ {
+ if(m_dtmseq.isSchemaType(m_pos,XType.XMLSCHEMA_NAMESPACE,names[whichtype]))
+ return m_homogtype=whichtype;
+ }
+
+ return XType.SEQ; // ANYTYPE? NOTHOMOGENOUS? Shouldn't arise...
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getType()
+ */
+ public int getValueType(int pos)
+ {
+ String ns = m_dtmseq.getTypeNS(pos);
+ String localName = m_dtmseq.getTypeLocalName(pos);
+ int typeID = XType.getTypeID(ns, localName);
+ return typeID;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getType()
+ */
+ public int getValueType()
+ {m_dtmseq.getTypeLocalName(m_pos);
+ String ns = getTypeNS();
+ String localName = getTypeLocalName();
+ int typeID = XType.getTypeID(ns, localName);
+ return typeID;
+ }
+
+
+ /** @return false -- this type is not used for nodes
+ * */
+ public boolean isPureNodeSequence()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return (m_pos == -1) ? true : false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ return m_dtmseq.isSchemaType(m_pos,namespace,localname);
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return m_dtmseq.getLength() <= 1;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ // %REVIEW% What if i is out of range?
+ m_pos = i-1;
+ }
+
+ /**
+ * This method performs no actions.
+ * @see org.apache.xml.dtm.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ // Ignore. We always cache.
+ }
+
+ /**
+ * @return true -- setCurrentPos() works for this object
+ * @see org.apache.xml.dtm.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#reset()
+ */
+ public void reset()
+ {
+ m_pos = -1;
+ }
+
+
+ /**
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ /**
+ * Return a (fresh) sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ if(isFresh())
+ return this;
+ try
+ {
+ XSequence xseq = (XSequence)this.clone();
+ xseq.reset();
+ return xseq;
+ }
+ catch (CloneNotSupportedException e)
+ {
+ // will never happen
+ throw new WrappedRuntimeException(e);
+ }
+ }
+
+ public Object object()
+ {
+ return m_dtmseq;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequenceMutable#getItem(int)
+ */
+ public XObject getItem(int pos)
+ {
+ Object value=m_dtmseq.getValue(pos);
+
+ // %TODO% At the low level, date/time are being returned as
+ // int[8] (because Xerces hasn't yet defined its own class
+ // to represent these). DateTimeObj isn't currently
+ // set up to take this array and a type hint, and DTM is
+ // not currently set up to return the original strings.
+ // We could change either end of that equation. Improving
+ // DateTimeObj would be more efficient but bind us
+ // explicitly to Xerces' current stopgap...
+ //
+ // Durations are treated similarly.
+ if(value instanceof int[])
+ {
+ if("duration".equals(getTypeLocalName()) &&
+ XType.XMLSCHEMA_NAMESPACE.equals(getTypeNS()))
+ value=new Duration((int[])value);
+
+ else // It's a date of some flavor
+ {
+ DateTimeObj dt=new DateTimeObj((int[])value,getTypeLocalName());
+
+ // The following is only good enough for now. Needs more work. -sb
+ int t = getValueType(pos);
+ if(XType.DATE == t)
+ return new XDate(dt);
+ else if(XType.TIME == t)
+ return new XTime(dt);
+
+ value = dt;
+
+ }
+ }
+
+ return XObjectFactory.create(value);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#isSequenceProper()
+ */
+ public boolean isSequenceProper()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#bool()
+ */
+ public boolean bool() throws TransformerException
+ {
+ try
+ {
+ return getItem(0).bool();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return false; // Boolean has no NAN
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#boolWithSideEffects()
+ */
+ public boolean boolWithSideEffects() throws TransformerException
+ {
+ try
+ {
+ return getItem(0).boolWithSideEffects();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return false; // Boolean has no NAN
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#date()
+ */
+ public DateTimeObj date() throws TransformerException
+ {
+ return getItem(0).date();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#datetime()
+ */
+ public DateTimeObj datetime() throws TransformerException
+ {
+ return getItem(0).datetime();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#daytimeDuration()
+ */
+ public Duration daytimeDuration() throws TransformerException
+ {
+ return getItem(0).daytimeDuration();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#duration()
+ */
+ public Duration duration() throws TransformerException
+ {
+ return getItem(0).duration();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#floatVal()
+ */
+ public float floatVal() throws TransformerException
+ {
+ try
+ {
+ return getItem(0).floatVal();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return Float.NaN;
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#integer()
+ */
+ public int integer() throws TransformerException
+ {
+ try
+ {
+ return getItem(0).integer();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return 0; // Integer has no NAN
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#num()
+ */
+ public double num() throws TransformerException
+ {
+ try
+ {
+ return getItem(0).num();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return Double.NaN;
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#str()
+ */
+ public String str()
+ {
+ try
+ {
+ return getItem(0).str();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return "";
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#xstr()
+ */
+ public XMLString xstr()
+ {
+ try
+ {
+ return getItem(0).xstr();
+ }
+ catch(ArrayIndexOutOfBoundsException e)
+ {
+ return XString.EMPTYSTRING;
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#yearmonthDuration()
+ */
+ public Duration yearmonthDuration() throws TransformerException
+ {
+ return getItem(0).yearmonthDuration();
+ }
+
+}
+
diff --git a/src/org/apache/xpath/objects/XDate.java b/src/org/apache/xpath/objects/XDate.java
new file mode 100644
index 0000000..ed112fd
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDate.java
@@ -0,0 +1,152 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.res.XPATHErrorResources;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XDate extends XDateTime
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ public XDate()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XDate(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XDate(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XDate(DateTimeObj val)
+ {
+ super(val);
+ }
+
+ /**
+ * Tell that this is a CLASS_DATE.
+ *
+ * @return type CLASS_DATE
+ */
+ public int getType()
+ {
+ return CLASS_DATE;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DATE"
+ */
+ public String getTypeString()
+ {
+ return "#DATE";
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#datetime()
+ */
+ public DateTimeObj datetime() throws TransformerException
+ {
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "DATETIME" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return new DateTimeObj(""); // To shut up compiler
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#date()
+ */
+ public DateTimeObj date() throws TransformerException
+ {
+ return m_val;
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XDateTime.java b/src/org/apache/xpath/objects/XDateTime.java
new file mode 100644
index 0000000..12e01f5
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDateTime.java
@@ -0,0 +1,405 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XDateTime extends XObject
+{
+
+ /** Empty string XString object */
+ public static XString EMPTYSTRING = new XString("");
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ public XDateTime()
+ {
+ //super(null);
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XDateTime(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val Date object this will wrap.
+ */
+ //public XDateTime(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XDateTime(String val)
+ //{
+ // super(val);
+ //}
+
+ DateTimeObj m_val;
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ public XDateTime(DateTimeObj val)
+ {
+ //super(val);
+ m_val = val;
+ }
+
+ /**
+ * Tell that this is a CLASS_DATE.
+ *
+ * @return type CLASS_DATE
+ */
+ public int getType()
+ {
+ return CLASS_DATETIME;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DATE"
+ */
+ public String getTypeString()
+ {
+ return "#DATETIME";
+ }
+
+ public Object object()
+ {
+ return m_val;
+ }
+
+
+ /**
+ * Cast result object to a number.
+ *
+ * @return 0.0 if this string is null, numeric value of this string
+ * or NaN
+ */
+ public double num()
+ {
+ return new Long(m_val.getDate().getTime()).doubleValue();
+ /*
+ if (m_obj instanceof DateTimeObj)
+ return (new Long(((DateTimeObj)m_obj).getDate().getTime()).doubleValue());
+ else if (m_obj instanceof Date)
+ {
+ long time = ((Date)m_obj).getTime();
+ return (new Long(time)).doubleValue();
+ }
+ else if (m_obj instanceof String)
+ return xstr().toDouble();
+ else
+ return Double.NaN;
+ */
+ }
+
+
+ /**
+ * Cast result object to a boolean.
+ *
+ * @return True if the length of this string object is greater
+ * than 0.
+ */
+ public boolean bool()
+ {
+ return str().length() > 0;
+ }
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ if (m_val != null)
+ return m_val.toString();
+ else
+ return "";
+ }
+
+
+
+ /**
+ * Cast result object to a result tree fragment.
+ *
+ * @param support Xpath context to use for the conversion
+ *
+ * @return A document fragment with this string as a child node
+ */
+ public int rtf(XPathContext support)
+ {
+
+ DTM frag = support.createDocumentFragment();
+
+ frag.appendTextChild(str());
+
+ return frag.getDocument();
+ }
+
+ /**
+ * Directly call the
+ * characters method on the passed ContentHandler for the
+ * string-value. Multiple calls to the
+ * ContentHandler's characters methods may well occur for a single call to
+ * this method.
+ *
+ * @param ch A non-null reference to a ContentHandler.
+ *
+ * @throws org.xml.sax.SAXException
+ */
+ public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
+ throws org.xml.sax.SAXException
+ {
+
+ String str = str();
+
+ ch.characters(str.toCharArray(), 0, str.length());
+ }
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return true if the two objects are equal
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equals(XObject obj2)
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ int t = obj2.getType();
+ if(XObject.CLASS_DATETIME == t ||
+ XObject.CLASS_DATE == t ||
+ XObject.CLASS_TIME == t )
+ return m_val.equals(((XDateTime)obj2).m_val);
+ else
+ return false;
+
+ }
+
+
+ /**
+ * Tell if two objects are functionally not equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is not equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean notEquals(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ return !equals(obj2);
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DATETIME == t ||
+ XObject.CLASS_DATE == t ||
+ XObject.CLASS_TIME == t )
+ return m_val.lessThan(((XDateTime)obj2).m_val);
+ else
+ return this.num() < obj2.num();
+ }
+
+ /**
+ * Tell if one object is less than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DATETIME == t ||
+ XObject.CLASS_DATE == t ||
+ XObject.CLASS_TIME == t )
+ return m_val.lessThanOrEqual(((XDateTime)obj2).m_val);
+ else
+ return this.num() <= obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+ int t = obj2.getType();
+ if(XObject.CLASS_DATETIME == t ||
+ XObject.CLASS_DATE == t ||
+ XObject.CLASS_TIME == t )
+ return m_val.greaterThan(((XDateTime)obj2).m_val);
+ else
+ return this.num() > obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DATETIME == t ||
+ XObject.CLASS_DATE == t ||
+ XObject.CLASS_TIME == t )
+ return m_val.greaterThanOrEqual(((XDateTime)obj2).m_val);
+ else
+ return this.num() >= obj2.num();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#datetime()
+ */
+ public DateTimeObj datetime() throws TransformerException
+ {
+ return m_val;
+ }
+
+
+}
diff --git a/src/org/apache/xpath/objects/XDecimal.java b/src/org/apache/xpath/objects/XDecimal.java
new file mode 100644
index 0000000..7dc8b52
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDecimal.java
@@ -0,0 +1,20 @@
+package org.apache.xpath.objects;
+
+import org.apache.xml.dtm.XType;
+
+public class XDecimal extends XDouble // TBD: For now, just use this as a double.
+{
+ /**
+ * Constructor for Decimal
+ *
+ * This one's actually being used, unlike most XObject empty ctors,
+ * because it may be created and _then_ set (by processToken)
+ * during stylesheet parsing.
+ */
+ public XDecimal()
+ {
+ super();
+ }
+
+}
+
diff --git a/src/org/apache/xpath/objects/XDouble.java b/src/org/apache/xpath/objects/XDouble.java
new file mode 100644
index 0000000..a3e6024
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDouble.java
@@ -0,0 +1,94 @@
+package org.apache.xpath.objects;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.parser.Token;
+
+public class XDouble extends XNumber
+{
+ double m_val;
+ //Double m_doubleobj; // Cache; best guess is we don't need it
+
+ /**
+ * Constructor for XDouble
+ */
+ public XDouble(double num)
+ {
+ m_val = num;
+ }
+
+ /**
+ * Constructor for XDouble
+ */
+ public XDouble(Double num)
+ {
+ m_val = num.doubleValue();
+ //m_doubleobj = num;
+ }
+
+ /**
+ * Constructor for XDouble
+ */
+ public XDouble()
+ {
+ }
+
+ public Object object()
+ {
+ //if(m_doubleobj==null)
+ // m_doubleobj=new Double(m_val);
+ //return m_doubleobj;
+ return new Double(m_val);
+ }
+
+ /**
+ * Cast result object to a number.
+ *
+ * @return the value of the XNumber object
+ */
+ public double num()
+ {
+ return m_val;
+ }
+
+ /**
+ * Evaluate expression to a number.
+ *
+ * @return 0.0
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public double num(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+ return m_val;
+ }
+
+ /**
+ * Cast result object to a boolean.
+ *
+ * @return false if the value is NaN or exactly equal to 0.0
+ */
+ public boolean bool()
+ {
+ return (Double.isNaN(m_val) || (m_val == 0.0)) ? false : true;
+ }
+
+ public void processToken(Token t)
+ {
+ String strNum = t.image;
+ m_val = Double.parseDouble(strNum);
+ //m_doubleobj=null; // Reset/defer
+ }
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return new XSequenceSingleton(this);
+ }
+
+}
+
diff --git a/src/org/apache/xpath/objects/XDuration.java b/src/org/apache/xpath/objects/XDuration.java
new file mode 100644
index 0000000..6437db1
--- /dev/null
+++ b/src/org/apache/xpath/objects/XDuration.java
@@ -0,0 +1,401 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XDuration extends XObject
+{
+
+ /** Empty string XString object */
+ public static XString EMPTYSTRING = new XString("");
+
+ /**
+ * Construct a XDate object, with a null value.
+ * This one's actually being used, unlike most XObject empty ctors
+ * ... but I'm not sure why; it's equivalent to passing in null.
+ */
+ public XDuration()
+ {
+ //super(null);
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XDuration(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XDuration(String val)
+ //{
+ // super(val);
+ //}
+
+ Duration m_val;
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ public XDuration(Duration val)
+ {
+ //super(val);
+ m_val = val;
+ }
+
+ public Object object()
+ {
+ return m_val;
+ }
+
+ /**
+ * Tell that this is a CLASS_DURATION.
+ *
+ * @return type CLASS_DURATION
+ */
+ public int getType()
+ {
+ return CLASS_DURATION;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DURATION"
+ */
+ public String getTypeString()
+ {
+ return "#DURATION";
+ }
+
+
+
+ /**
+ * Cast result object to a number.
+ *
+ * @return 0.0 if this string is null, numeric value of this string
+ * or NaN
+ */
+ public double num()
+ {
+ XMLString s = xstr();
+
+ return s.toDouble();
+ }
+
+
+ /**
+ * Cast result object to a boolean.
+ *
+ * @return True if the length of this string object is greater
+ * than 0.
+ */
+ public boolean bool()
+ {
+ return str().length() > 0;
+ }
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The object this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return m_val.toString();
+ /**
+ if(m_obj instanceof Duration)
+ return (m_val).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ else
+ return m_obj.toString();
+ */
+ }
+
+ /**
+ * Cast result object to a result tree fragment.
+ *
+ * @param support Xpath context to use for the conversion
+ *
+ * @return A document fragment with this string as a child node
+ */
+ public int rtf(XPathContext support)
+ {
+
+ DTM frag = support.createDocumentFragment();
+
+ frag.appendTextChild(str());
+
+ return frag.getDocument();
+ }
+
+ /**
+ * Directly call the
+ * characters method on the passed ContentHandler for the
+ * string-value. Multiple calls to the
+ * ContentHandler's characters methods may well occur for a single call to
+ * this method.
+ *
+ * @param ch A non-null reference to a ContentHandler.
+ *
+ * @throws org.xml.sax.SAXException
+ */
+ public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
+ throws org.xml.sax.SAXException
+ {
+
+ String str = str();
+
+ ch.characters(str.toCharArray(), 0, str.length());
+ }
+
+
+
+
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return true if the two objects are equal
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equals(XObject obj2)
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ int t = obj2.getType();
+ if(XObject.CLASS_DURATION == t)
+ return m_val.equals(((XDuration)obj2).m_val);
+
+
+ // Otherwise, both objects to be compared are converted to strings as
+ // if by applying the string function.
+ return xstr().equals(obj2.xstr());
+ }
+
+ /**
+ * Tell if two objects are functionally not equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is not equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean notEquals(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ return !equals(obj2);
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return (m_val.DTLessThan(du) && m_val.YMLessThan(du));
+ }
+ else
+ return this.num() < obj2.num();
+ }
+
+ /**
+ * Tell if one object is less than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return (m_val.DTLessThanOrEqual(du) && m_val.YMLessThanOrEqual(du));
+ }
+ else
+ return this.num() <= obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+ int t = obj2.getType();
+ if(XObject.CLASS_DURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return (m_val.DTGreaterThan(du) && m_val.YMGreaterThan(du));
+ }
+ else
+ return this.num() > obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_DURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return (m_val.DTGreaterThanOrEqual(du) && m_val.YMGreaterThanOrEqual(du));
+ }
+ else
+ return this.num() >= obj2.num();
+ }
+
+ /**
+ * Cast result object to a DURATION.
+ *
+ * @return Duration
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public Duration duration() throws javax.xml.transform.TransformerException
+ {
+ return m_val;
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XFloat.java b/src/org/apache/xpath/objects/XFloat.java
new file mode 100644
index 0000000..56e573c
--- /dev/null
+++ b/src/org/apache/xpath/objects/XFloat.java
@@ -0,0 +1,101 @@
+package org.apache.xpath.objects;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.parser.Token;
+
+public class XFloat extends XNumber
+{
+ float m_val;
+
+ /**
+ * Constructor for XDouble
+ */
+ public XFloat(float num)
+ {
+ m_val = num;
+ }
+
+ /**
+ * Constructor for XDouble
+ */
+ public XFloat(Float num)
+ {
+ m_val = num.floatValue();
+ }
+
+ /**
+ * Constructor for XDouble
+ */
+ public XFloat()
+ {
+ }
+
+ public Object object()
+ {
+ return new Float(m_val);
+ }
+
+ /**
+ * Cast result object to a number.
+ *
+ * @return the value of the XNumber object
+ */
+ public double num()
+ {
+ return m_val;
+ }
+
+ /**
+ * Get result object as a integer.
+ *
+ * @return At this level, the num() value cast to an integer.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public float floatVal() throws javax.xml.transform.TransformerException
+ {
+
+ return m_val;
+ }
+
+ /**
+ * Evaluate expression to a number.
+ *
+ * @return 0.0
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public double num(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+ return m_val;
+ }
+
+ /**
+ * Cast result object to a boolean.
+ *
+ * @return false if the value is NaN or exactly equal to 0.0
+ */
+ public boolean bool()
+ {
+ return (Double.isNaN(m_val) || (m_val == 0.0)) ? false : true;
+ }
+
+ public void processToken(Token t)
+ {
+ String strNum = t.image;
+ m_val = Float.parseFloat(strNum);
+ }
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return new XSequenceSingleton(this);
+ }
+
+}
+
diff --git a/src/org/apache/xpath/objects/XGDay.java b/src/org/apache/xpath/objects/XGDay.java
new file mode 100644
index 0000000..f0ed80d
--- /dev/null
+++ b/src/org/apache/xpath/objects/XGDay.java
@@ -0,0 +1,196 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XGDay extends XDate
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ protected XGDay()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XGDay(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XGDay(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XGDay(DateTimeObj val)
+ {
+ super(val);
+ }
+
+ /**
+ * Tell that this is a CLASS_GDAY.
+ *
+ * @return type CLASS_GDAY
+ */
+ public int getType()
+ {
+ return CLASS_GDAY;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DATE"
+ */
+ public String getTypeString()
+ {
+ return "#GDAY";
+ }
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return super.str();
+
+ /**
+ if (m_obj!= null)
+ {
+ if (m_obj instanceof Date)
+ {
+ Date date = (Date) m_obj;
+ SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeObj.gd);
+ return dateFormat.format(date);
+ }
+ else if (m_obj instanceof DateTimeObj)
+ return ((DateTimeObj)m_obj).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ }
+ return "";
+ **/
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/org/apache/xpath/objects/XGMonth.java b/src/org/apache/xpath/objects/XGMonth.java
new file mode 100644
index 0000000..048379c
--- /dev/null
+++ b/src/org/apache/xpath/objects/XGMonth.java
@@ -0,0 +1,195 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XGMonth extends XDate
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ protected XGMonth()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XGMonth(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XGMonth(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XGMonth(DateTimeObj val)
+ {
+ super(val);
+ }
+
+ /**
+ * Tell that this is a CLASS_GMONTH.
+ *
+ * @return type CLASS_GMONTH
+ */
+ public int getType()
+ {
+ return CLASS_GMONTH;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#GMONTH"
+ */
+ public String getTypeString()
+ {
+ return "#GMONTH";
+ }
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return super.str();
+
+ /*
+ if (m_obj!= null)
+ {
+ if (m_obj instanceof Date)
+ {
+ Date date = (Date) m_obj;
+ SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeObj.gm);
+ return dateFormat.format(date);
+ }
+ else if (m_obj instanceof DateTimeObj)
+ return ((DateTimeObj)m_obj).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ }
+ return "";
+ */
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/org/apache/xpath/objects/XGMonthDay.java b/src/org/apache/xpath/objects/XGMonthDay.java
new file mode 100644
index 0000000..7c55721
--- /dev/null
+++ b/src/org/apache/xpath/objects/XGMonthDay.java
@@ -0,0 +1,200 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XGMonthDay extends XDate
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ protected XGMonthDay()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XGMonthDay(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XGMonthDay(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XGMonthDay(DateTimeObj val)
+ {
+ super(val);
+ }
+
+ /**
+ * Tell that this is a CLASS_GMONTHDAY.
+ *
+ * @return type CLASS_GMONTHDAY
+ */
+ public int getType()
+ {
+ return CLASS_GMONTHDAY;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#GMONTHDAY"
+ */
+ public String getTypeString()
+ {
+ return "#GMONTHDAY";
+ }
+
+
+
+
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return super.str();
+
+ /*
+ if (m_obj!= null)
+ {
+ if (m_obj instanceof Date)
+ {
+ Date date = (Date) m_obj;
+ SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeObj.gmd);
+ return dateFormat.format(date);
+ }
+ else if (m_obj instanceof DateTimeObj)
+ return ((DateTimeObj)m_obj).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ }
+ return "";
+ */
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/org/apache/xpath/objects/XGYearMonth.java b/src/org/apache/xpath/objects/XGYearMonth.java
new file mode 100644
index 0000000..463ee6b
--- /dev/null
+++ b/src/org/apache/xpath/objects/XGYearMonth.java
@@ -0,0 +1,199 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XGYearMonth extends XDate
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ protected XGYearMonth()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XGYearMonth(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XGYearMonth(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XGYearMonth(DateTimeObj val)
+ {
+ super(val);
+ }
+
+ /**
+ * Tell that this is a CLASS_GYEARMONTH.
+ *
+ * @return type CLASS_GYEARMONTH
+ */
+ public int getType()
+ {
+ return CLASS_GYEARMONTH;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#GYEARMONTH"
+ */
+ public String getTypeString()
+ {
+ return "#GYEARMONTH";
+ }
+
+
+
+
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return super.str();
+ /*
+ if (m_obj!= null)
+ {
+ if (m_obj instanceof Date)
+ {
+ Date date = (Date) m_obj;
+ SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeObj.gym);
+ return dateFormat.format(date);
+ }
+ else if (m_obj instanceof DateTimeObj)
+ return ((DateTimeObj)m_obj).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ }
+ return "";
+ */
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/org/apache/xpath/objects/XGYearObj.java b/src/org/apache/xpath/objects/XGYearObj.java
new file mode 100644
index 0000000..756254f
--- /dev/null
+++ b/src/org/apache/xpath/objects/XGYearObj.java
@@ -0,0 +1,181 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.xml.utils.DateTimeObj;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XGYearObj extends XDate
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ protected XGYearObj()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XGYearObj(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XGYearObj(Date val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XGYearObj(DateTimeObj val)
+ {
+ super(val);
+ }
+
+ /**
+ * Tell that this is a CLASS_GYEAR.
+ *
+ * @return type CLASS_GYEAR
+ */
+ public int getType()
+ {
+ return CLASS_GYEAR;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#GYEAR"
+ */
+ public String getTypeString()
+ {
+ return "#GYEAR";
+ }
+
+
+
+
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return super.str();
+ /*
+ if (m_obj!= null)
+ {
+ if (m_obj instanceof Date)
+ {
+ Date date = (Date) m_obj;
+ SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeObj.gy);
+ return dateFormat.format(date);
+ }
+ else if (m_obj instanceof DateTimeObj)
+ return ((DateTimeObj)m_obj).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ }
+ return "";
+ */
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/org/apache/xpath/objects/XInteger.java b/src/org/apache/xpath/objects/XInteger.java
new file mode 100644
index 0000000..b56b546
--- /dev/null
+++ b/src/org/apache/xpath/objects/XInteger.java
@@ -0,0 +1,121 @@
+package org.apache.xpath.objects;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.parser.Token;
+
+public class XInteger extends XNumber
+{
+ int m_val;
+ //Integer m_intobj; // Cache; current guess is we don't need it
+
+ /**
+ * Constructor for XInteger
+ *
+ * This one's actually being used, unlike most XObject empty ctors,
+ * because it may be created and _then_ set (by processToken)
+ * during stylesheet parsing.
+ */
+ public XInteger()
+ {
+ }
+
+ /**
+ * Constructor for XInteger
+ */
+ public XInteger(int num)
+ {
+ m_val = num;
+ }
+
+ /**
+ * Constructor for XInteger
+ */
+ public XInteger(Integer num)
+ {
+ //m_intobj=num;
+ m_val = num.intValue();
+ }
+
+ /**
+ * Cast result object to a number.
+ *
+ * @return the value of the XNumber object
+ */
+ public double num()
+ {
+ return (double)m_val;
+ }
+
+ /**
+ * Evaluate expression to a number.
+ *
+ * @return 0.0
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public double num(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+ return (double)m_val;
+ }
+
+ /**
+ * Get result object as a integer.
+ *
+ * @return At this level, the num() value cast to an integer.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public int integer() throws javax.xml.transform.TransformerException
+ {
+
+ return m_val;
+ }
+
+
+ /**
+ * Cast result object to a boolean.
+ *
+ * @return false if the value is NaN or equal to 0.0
+ */
+ public boolean bool()
+ {
+ return (m_val == 0) ? false : true;
+ }
+
+
+ public void processToken(Token t)
+ {
+ String strNum = t.image;
+ try
+ {
+ m_val = Integer.parseInt(strNum);
+ //m_intobj=null; // Reset/defer
+ }
+ catch (java.lang.NumberFormatException e)
+ {
+ // TBD: Use error listener. -sb
+ throw e;
+ }
+ }
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return new XSequenceSingleton(this);
+ }
+
+
+ public Object object()
+ {
+ //if(m_intobj==null)
+ // m_intobj=new Integer(m_val);
+ //return m_intobj;
+ return new Integer(m_val);
+ }
+}
+
diff --git a/src/org/apache/xpath/objects/XJavaObject.java b/src/org/apache/xpath/objects/XJavaObject.java
new file mode 100644
index 0000000..afb47a1
--- /dev/null
+++ b/src/org/apache/xpath/objects/XJavaObject.java
@@ -0,0 +1,44 @@
+package org.apache.xpath.objects;
+
+/** Wrap an arbitrary Java object for passing through the XPath
+ * datatype system.
+ *
+ * %REVIEW% This is currently being used to wrap XSequences
+ * in FuncData.java. Makes some sense because a sequence can contain
+ * non-XPath datatypes, and that's exactly what FuncData is returning.
+ * But it feels like we'd prefer an XSequenceObject...
+ *
+ * @author keshlam
+ * @since Jul 24, 2002
+ */
+public class XJavaObject extends XObject
+{
+ Object m_obj=null;
+
+ public XJavaObject(Object obj)
+ {
+ m_obj=obj;
+ }
+
+ public Object object()
+ {
+ return m_obj;
+ }
+
+ /**
+ * Forces the object to release it's resources. This is more harsh than
+ * detach().
+ */
+ public void destruct()
+ {
+
+ if (null != m_obj)
+ {
+ allowDetachToRelease(true);
+ detach();
+
+ m_obj = null; //******
+ }
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XNodeSequenceSingleton.java b/src/org/apache/xpath/objects/XNodeSequenceSingleton.java
new file mode 100644
index 0000000..8823277
--- /dev/null
+++ b/src/org/apache/xpath/objects/XNodeSequenceSingleton.java
@@ -0,0 +1,884 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.dtm.ref.DTMNodeList;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xml.utils.XMLString;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.traversal.NodeIterator;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 20, 2002
+ * @author sboag
+ */
+public class XNodeSequenceSingleton extends XObject
+ implements XSequence
+{
+ DTM m_dtm;
+ int m_nodeHandle;
+ int m_pos = -1;
+
+ /**
+ * Constructor for XNodeSequenceSingleton.
+ */
+ public XNodeSequenceSingleton(int nodeHandle, XNodeSet owningNodeSet)
+ {
+ this(nodeHandle,owningNodeSet.getDTM(nodeHandle));
+ }
+
+ /**
+ * Constructor for XNodeSequenceSingleton.
+ */
+ public XNodeSequenceSingleton(int nodeHandle, DTM dtm)
+ {
+ m_dtm=dtm;
+ m_nodeHandle = nodeHandle;
+ }
+
+
+ /**
+ * Tell what kind of class this is.
+ *
+ * @return CLASS_UNKNOWN
+ * @see org.apache.xpath.objects.XObject@getType()
+ */
+ /*
+ public int getType()
+ {
+ // %REVIEW% May not be the right thing. Makes extensions work,
+ // but currently causes InstanceofExpr to cast it incorrectly
+ // (to XNodeSet, not compatable).
+ // Should we be subclassing XNodeSet rather than XObject?
+ // Should we change this type?
+ // Should we change InstanceOfExpr to cast to XSequence,
+ // which is a shared superclass?
+ return CLASS_NODESET;
+ }
+ */
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#UNKNOWN" + object class name
+ * @see org.apache.xpath.objects.XObject@getTypeString()
+ */
+ /*
+ public String getTypeString()
+ {
+ return "#NODESET";
+ }
+ */
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypes()
+ */
+ public int getTypes()
+ {
+ DTM dtm = getDTM();
+ return XType.getTypeID(dtm, m_nodeHandle);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#next()
+ */
+ public XObject next()
+ {
+ if(m_pos == -1)
+ {
+ m_pos++;
+ return this;
+ }
+ else
+ return null;
+/// try
+// {
+// if(m_pos == -1)
+// {
+// XObject next = (XObject)this.clone();
+// next.reset();
+// m_pos++;
+// return next;
+// }
+// else
+// return null;
+// }
+// catch (CloneNotSupportedException e)
+// {
+// throw new WrappedRuntimeException(e);
+// }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ if(m_pos == 0)
+ {
+ m_pos--;
+ return this;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ if(m_pos == 0)
+ {
+ return this;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return m_pos == -1;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ DTM dtm = getDTM();
+ return dtm.getSchemaTypeNamespace(m_nodeHandle);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ DTM dtm = getDTM();
+ return dtm.getSchemaTypeLocalName(m_nodeHandle);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ DTM dtm = getDTM();
+ return dtm.isNodeSchemaType(m_nodeHandle, namespace, localname);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isPureNodeSequence()
+ */
+ public boolean isPureNodeSequence()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_pos;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ m_pos = i;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getLength()
+ */
+ public int getLength()
+ {
+ return 1;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return true;
+ }
+
+ /**
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ /**
+ * Get numeric value of the string conversion from a single node.
+ *
+ * @param n Node to convert
+ *
+ * @return numeric value of the string conversion from a single node.
+ */
+ public double getNumberFromNode(int n)
+ {
+ XMLString xstr = getDTM().getStringValue(n);
+ // String str = xstr.toString();
+ return xstr.toDouble();
+ }
+
+ /**
+ * Cast result object to a number.
+ *
+ * @return numeric value of the string conversion from the
+ * next node in the NodeSetDTM, or NAN if no node was found
+ */
+ public double num()
+ {
+
+ int node = m_nodeHandle;
+ return (node != DTM.NULL) ? getNumberFromNode(node) : Double.NaN;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#floatVal()
+ */
+ public float floatVal() throws TransformerException
+ {
+ int node = m_nodeHandle;
+ return (node != DTM.NULL) ? (float)getNumberFromNode(node) : Float.NaN;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#integer()
+ */
+ public int integer() throws TransformerException
+ {
+ int node = m_nodeHandle;
+ return (node != DTM.NULL) ? (int)getNumberFromNode(node) : 0;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#numWithSideEffects()
+ */
+ public double numWithSideEffects() throws TransformerException
+ {
+ return super.numWithSideEffects();
+ }
+
+
+ /**
+ * Cast result object to a boolean.
+ *
+ * @return True if there is a next node in the nodeset
+ */
+ public boolean bool()
+ {
+ // Check the new rules about this. -sb
+ return (m_nodeHandle != DTM.NULL);
+ }
+
+ /**
+ * Cast result object to a boolean, but allow side effects, such as the
+ * incrementing of an iterator.
+ *
+ * @return True if there is a next node in the nodeset
+ */
+ public boolean boolWithSideEffects()
+ {
+ return (m_nodeHandle != DTM.NULL);
+ }
+
+
+ /**
+ * Get the string conversion from a single node.
+ *
+ * @param n Node to convert
+ *
+ * @return the string conversion from a single node.
+ */
+ public XMLString getStringFromNode(int n)
+ {
+ // %OPT%
+ // I guess we'll have to get a static instance of the DTM manager...
+ if(DTM.NULL != n)
+ {
+ return getDTM().getStringValue(n);
+ }
+ else
+ {
+ return org.apache.xpath.objects.XString.EMPTYSTRING;
+ }
+ }
+
+ /**
+ * Directly call the
+ * characters method on the passed ContentHandler for the
+ * string-value. Multiple calls to the
+ * ContentHandler's characters methods may well occur for a single call to
+ * this method.
+ *
+ * @param ch A non-null reference to a ContentHandler.
+ *
+ * @throws org.xml.sax.SAXException
+ */
+ public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
+ throws org.xml.sax.SAXException
+ {
+ int node = m_nodeHandle;
+
+ if(node != DTM.NULL)
+ {
+ getDTM().dispatchCharactersEvents(node, ch, false);
+ }
+
+ }
+
+ /**
+ * Cast result object to an XMLString.
+ *
+ * @return The document fragment node data or the empty string.
+ */
+ public XMLString xstr()
+ {
+ int node = m_nodeHandle;
+ return (node != DTM.NULL) ? getStringFromNode(node) : XString.EMPTYSTRING;
+ }
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public void appendToFsb(org.apache.xml.utils.FastStringBuffer fsb)
+ {
+ XString xstring = (XString)xstr();
+ xstring.appendToFsb(fsb);
+ }
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return the string conversion from the next node in the nodeset
+ * or "" if there is no next node
+ */
+ public String str()
+ {
+ int node = m_nodeHandle;
+ return (node != DTM.NULL) ? getStringFromNode(node).toString() : "";
+ }
+
+ /**
+ * Return a java object that's closest to the representation
+ * that should be handed to an extension.
+ *
+ * @return The object that this class wraps
+ */
+ public Object object()
+ {
+ if(null == m_dtm) // Should this case ever arise???
+ return this; // And is this response useful? %REVIEW%
+ else
+ //return m_dtm;
+ return m_dtm.getNode(m_nodeHandle);
+ }
+
+ /**
+ * Returns the dtm.
+ * @return DTM
+ */
+ public DTM getDTM()
+ {
+ return m_dtm;
+ }
+
+ /**
+ * Returns the nodeHandle.
+ * @return int
+ */
+ public int getNodeHandle()
+ {
+ return m_nodeHandle;
+ }
+
+ /**
+ * Sets the dtm.
+ * @param dtm The dtm to set
+ */
+ public void setDTM(DTM dtm)
+ {
+ m_dtm = dtm;
+ }
+
+ /**
+ * Sets the nodeHandle.
+ * @param nodeHandle The nodeHandle to set
+ */
+ public void setNodeHandle(int nodeHandle)
+ {
+ m_nodeHandle = nodeHandle;
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThan(XObject obj2) throws javax.xml.transform.TransformerException
+ {
+ return compare(obj2, XNodeSet.S_LT);
+ }
+
+ /**
+ * Tell if one object is less than or equal to the other.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThanOrEqual(XObject obj2) throws javax.xml.transform.TransformerException
+ {
+ return compare(obj2, XNodeSet.S_LTE);
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThan(XObject obj2) throws javax.xml.transform.TransformerException
+ {
+ return compare(obj2, XNodeSet.S_GT);
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+ return compare(obj2, XNodeSet.S_GTE);
+ }
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equalsExistential(XObject obj2)
+ {
+ try
+ {
+ return compare(obj2, XNodeSet.S_EQ);
+ }
+ catch(javax.xml.transform.TransformerException te)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(te);
+ }
+ }
+
+ /**
+ * Tell if two objects are functionally not equal.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean notEquals(XObject obj2) throws javax.xml.transform.TransformerException
+ {
+ return compare(obj2, XNodeSet.S_NEQ);
+ }
+
+ /**
+ * @see java.lang.Object#equals(Object)
+ */
+ public boolean equals(XObject arg0)
+ {
+ int nodeHandle = ((XObject) arg0).getNodeHandle();
+ return nodeHandle == m_nodeHandle;
+ }
+
+
+ /**
+ * @see java.lang.Object#equals(Object)
+ */
+ public boolean equals(Object arg0)
+ {
+ if(arg0 instanceof XObject)
+ {
+ equals((XObject)arg0);
+ }
+ return super.equals(arg0);
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 Object to compare this nodeset to
+ * @param comparator Comparator to use
+ *
+ * @return See the comments below for each object type comparison
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean compare(XObject obj2, Comparator comparator)
+ throws javax.xml.transform.TransformerException
+ {
+
+ boolean result = false;
+ int type = obj2.getType();
+
+ if (obj2.isNodesetExpr())
+ {
+ // %OPT% This should be XMLString based instead of string based...
+
+ // From http://www.w3.org/TR/xpath:
+ // If both objects to be compared are node-sets, then the comparison
+ // will be true if and only if there is a node in the first node-set
+ // and a node in the second node-set such that the result of performing
+ // the comparison on the string-values of the two nodes is true.
+ // Note this little gem from the draft:
+ // NOTE: If $x is bound to a node-set, then $x="foo"
+ // does not mean the same as not($x!="foo"): the former
+ // is true if and only if some node in $x has the string-value
+ // foo; the latter is true if and only if all nodes in $x have
+ // the string-value foo.
+ XSequence list2 = obj2.xseq();
+ int node1 = m_nodeHandle;
+ java.util.Vector node2Strings = null;
+
+ XMLString s1 = getStringFromNode(node1);
+
+ if (null == node2Strings)
+ {
+
+ XObject next;
+ while (null != (next = list2.next()))
+ {
+ XMLString s2 = next.xstr();
+
+ if (comparator.compareStrings(s1, s2))
+ {
+ result = true;
+
+ break;
+ }
+
+ if (null == node2Strings)
+ node2Strings = new java.util.Vector();
+
+ node2Strings.addElement(s2);
+ }
+ }
+ else
+ {
+ int n = node2Strings.size();
+
+ for (int i = 0; i < n; i++)
+ {
+ if (comparator
+ .compareStrings(s1, (XMLString) node2Strings.elementAt(i)))
+ {
+ result = true;
+
+ break;
+ }
+ }
+ }
+ list2.reset();
+ }
+ else
+ if (XObject.CLASS_BOOLEAN == type)
+ {
+
+ // From http://www.w3.org/TR/xpath:
+ // If one object to be compared is a node-set and the other is a boolean,
+ // then the comparison will be true if and only if the result of
+ // performing the comparison on the boolean and on the result of
+ // converting the node-set to a boolean using the boolean function
+ // is true.
+ double num1 = bool() ? 1.0 : 0.0;
+ double num2 = obj2.num();
+
+ result = comparator.compareNumbers(num1, num2);
+ }
+ else
+ if (XObject.CLASS_NUMBER == type)
+ {
+
+ // From http://www.w3.org/TR/xpath:
+ // If one object to be compared is a node-set and the other is a number,
+ // then the comparison will be true if and only if there is a
+ // node in the node-set such that the result of performing the
+ // comparison on the number to be compared and on the result of
+ // converting the string-value of that node to a number using
+ // the number function is true.
+ double num2 = obj2.num();
+ int node = m_nodeHandle;
+
+ double num1 = getNumberFromNode(node);
+
+ if (comparator.compareNumbers(num1, num2))
+ {
+ result = true;
+ }
+ }
+ else
+ if (XObject.CLASS_RTREEFRAG == type)
+ {
+ XMLString s2 = obj2.xstr();
+ int node = m_nodeHandle;
+
+ XMLString s1 = getStringFromNode(node);
+
+ if (comparator.compareStrings(s1, s2))
+ {
+ result = true;
+ }
+ }
+ else
+ if (XObject.CLASS_STRING == type)
+ {
+
+ // From http://www.w3.org/TR/xpath:
+ // If one object to be compared is a node-set and the other is a
+ // string, then the comparison will be true if and only if there
+ // is a node in the node-set such that the result of performing
+ // the comparison on the string-value of the node and the other
+ // string is true.
+ XMLString s2 = obj2.xstr();
+ int node = m_nodeHandle;
+
+ XMLString s1 = getStringFromNode(node);
+ if (comparator.compareStrings(s1, s2))
+ {
+ result = true;
+ }
+ }
+ else
+ {
+ result = comparator.compareNumbers(this.num(), obj2.num());
+ }
+
+ return result;
+ }
+
+
+ /**
+ * @see org.apache.xpath.Expression#isNodesetExpr()
+ */
+ public boolean isNodesetExpr()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#xseq()
+ */
+ public XSequence xseq()
+ {
+ try
+ {
+ XSequence newXSeq = (XSequence)clone();
+ // newXSeq.reset();
+ return newXSeq;
+ }
+ catch (CloneNotSupportedException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#reset()
+ */
+ public void reset()
+ {
+ super.reset();
+ m_pos = -1;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#nodelist()
+ */
+ public NodeList nodelist() throws TransformerException
+ {
+ return new DTMNodeList(getDTM(),getNodeHandle(), false);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#nodeset()
+ */
+ public NodeIterator nodeset() throws TransformerException
+ {
+ DTM dtm = getDTM();
+ DTMIterator iter = new XNodeSet(getNodeHandle(), dtm.getManager());
+ return new org.apache.xml.dtm.ref.DTMNodeIterator(iter);
+ }
+
+ /**
+ * Cast result object to a nodelist. Always issues an error.
+ *
+ * @return null
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public DTMIterator iter() throws javax.xml.transform.TransformerException
+ {
+
+ DTM dtm = getDTM();
+ DTMIterator iter = new XNodeSet(getNodeHandle(), dtm.getManager());
+
+ return iter;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getType()
+ */
+ public int getType()
+ {
+ return XType.NODE;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getValueType()
+ */
+ public int getValueType()
+ {
+ int nodeHandle = getNodeHandle();
+ if (DTM.NULL != nodeHandle)
+ {
+ DTM dtm = getDTM();
+
+ return XType.getTypeID(dtm, nodeHandle);
+ }
+ else
+ return XType.ANYTYPE;
+ }
+
+// /**
+// * @see org.apache.xpath.objects.XObject#date()
+// */
+// public DateTimeObj date() throws TransformerException
+// {
+// DTM dtm = getDTM();
+// dtm.getN
+// return super.date();
+// }
+
+}
diff --git a/src/org/apache/xpath/objects/XNodeSet.java b/src/org/apache/xpath/objects/XNodeSet.java
index 9db3b52..b399023 100644
--- a/src/org/apache/xpath/objects/XNodeSet.java
+++ b/src/org/apache/xpath/objects/XNodeSet.java
@@ -59,34 +59,38 @@
//import org.w3c.dom.Node;
//import org.w3c.dom.Text;
//import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.traversal.NodeIterator;
-import org.w3c.dom.NodeList;
-
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.dtm.DTMManager;
-
-import org.apache.xpath.DOMHelper;
-import org.apache.xpath.XPathContext;
-import org.apache.xpath.NodeSetDTM;
-import org.apache.xpath.axes.ContextNodeList;
-import org.apache.xpath.axes.NodeSequence;
-import org.apache.xml.utils.StringVector;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.WrappedRuntimeException;
import org.apache.xml.utils.XMLString;
+import org.apache.xpath.NodeSetDTM;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.traversal.NodeIterator;
/**
* <meta name="usage" content="general"/>
* This class represents an XPath nodeset object, and is capable of
* converting the nodeset to other types, such as a string.
*/
-public class XNodeSet extends NodeSequence
+public class XNodeSet extends NodeSequence implements XSequence
{
+ XNodeSequenceSingleton m_current;
+
+
+ // XNodeSetForDOM (subclass) accesses this member as NodeSetDTM
+ // NodeSequence (superclass) sometimes uses it as NodeVector
+ //NodeSetDTM m_obj;
+
/**
* Default constructor for derived objects.
*/
+ /*
protected XNodeSet()
{
}
+ */
/**
* Construct a XNodeSet object.
@@ -95,50 +99,78 @@
*/
public XNodeSet(DTMIterator val)
{
- super();
if(val instanceof XNodeSet)
{
- setIter(((XNodeSet)val).m_iter);
- m_dtmMgr = ((XNodeSet)val).m_dtmMgr;
- m_last = ((XNodeSet)val).m_last;
- if(!((XNodeSet)val).hasCache())
- ((XNodeSet)val).setShouldCacheNodes(true);
- m_obj = ((XNodeSet)val).m_obj;
+ // One would expect an explicit copy ctor to take precedence,
+ // but apparently it doesn't always do so;
+ // moving this alternative into XNodeSet(XNodeSet)
+ // yields erroneous results. I don't quite understand why.
+
+ XNodeSet xns=(XNodeSet)val;
+ setIter(xns.m_iter);
+ m_dtmMgr = xns.m_dtmMgr;
+ m_last = xns.m_last;
+ if(!xns.hasCache())
+ xns.setShouldCache(true);
+ m_obj = xns.m_obj;
}
else
+ {
setIter(val);
+ m_dtmMgr=val.getDTMManager(); // Hadn't been being done..?
+ }
}
/**
- * Construct a XNodeSet object.
+ * Construct a XNodeSet object by copying from another XNodeSet
+ *
+ * Currently, all copy constructions are being caught by the
+ * XNodeSet(DTMIterator) ctor. I've disabled this one for
+ * clarity; we should consider deleting it entirely.
*
* @param val Value of the XNodeSet object
*/
+ /*
public XNodeSet(XNodeSet val)
{
- super();
+ super(val.getDTMManager());
setIter(val.m_iter);
m_dtmMgr = val.m_dtmMgr;
m_last = val.m_last;
if(!val.hasCache())
- val.setShouldCacheNodes(true);
+ val.setShouldCache(true);
m_obj = val.m_obj;
}
-
-
+ */
+
+ /**
+ * Passthrough for XRTreeFrag(Expression) constructor, since
+ * c'tors are not inherited and there seems to be no way to
+ * invoke super.super.super().
+ *
+ * @param frag Document fragment this will wrap
+ */
+ /*
+ protected XNodeSet(org.apache.xpath.Expression expr)
+ {
+ super(expr);
+ }
+ */
+
/**
* Construct an empty XNodeSet object. This is used to create a mutable
* nodeset to which random nodes may be added.
*/
public XNodeSet(DTMManager dtmMgr)
{
- super(dtmMgr);
+ this(DTM.NULL,dtmMgr);
}
/**
- * Construct a XNodeSet object for one node.
+ * Construct a XNodeSet object for one node. (Or empty, if
+ * the node handle is DTM.NULL.)
*
- * @param n Node to add to the new XNodeSet object
+ * @param n Handle of DTM node to add to the new XNodeSet object
*/
public XNodeSet(int n, DTMManager dtmMgr)
{
@@ -148,7 +180,7 @@
if (DTM.NULL != n)
{
- ((NodeSetDTM) m_obj).addNode(n);
+ ((NodeSetDTM)m_obj).addNode(n);
m_last = 1;
}
else
@@ -164,6 +196,22 @@
{
return CLASS_NODESET;
}
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getValueType()
+ */
+ public int getValueType()
+ {
+ int nodeHandle = getCurrentNode();
+ if (DTM.NULL != nodeHandle)
+ {
+ DTM dtm = getDTM(nodeHandle);
+
+ return XType.getTypeID(dtm, nodeHandle);
+ }
+ else
+ return XType.ANYTYPE;
+ }
/**
* Given a request type, return the equivalent string.
@@ -409,6 +457,15 @@
}
/**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return this;
+ }
+
+ /**
* Cast result object to a nodelist.
*
* @return The nodeset as a nodelist
@@ -455,20 +512,19 @@
*/
public NodeSetDTM mutableNodeset()
{
- NodeSetDTM mnl;
-
- if(m_obj instanceof NodeSetDTM)
- {
- mnl = (NodeSetDTM) m_obj;
- }
- else
- {
- mnl = new NodeSetDTM(iter());
- m_obj = mnl;
- setCurrentPos(0);
- }
-
- return mnl;
+ NodeSetDTM mnl;
+
+ if(m_obj instanceof NodeSetDTM)
+ {
+ mnl = (NodeSetDTM) m_obj;
+ }
+ else
+ {
+ mnl = new NodeSetDTM(iter());
+ m_obj = mnl;
+ setCurrentPos(0);
+ }
+ return mnl;
}
/** Less than comparator */
@@ -507,7 +563,7 @@
boolean result = false;
int type = obj2.getType();
- if (XObject.CLASS_NODESET == type)
+ if (obj2.isNodesetExpr())
{
// %OPT% This should be XMLString based instead of string based...
@@ -719,7 +775,7 @@
{
return compare(obj2, S_GTE);
}
-
+
/**
* Tell if two objects are functionally equal.
*
@@ -731,6 +787,21 @@
*/
public boolean equals(XObject obj2)
{
+ int nodeHandle = obj2.getNodeHandle();
+ return nodeHandle == getNodeHandle();
+ }
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 object to compare this nodeset to
+ *
+ * @return see this.compare(...)
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equalsExistential(XObject obj2)
+ {
try
{
return compare(obj2, S_EQ);
@@ -754,6 +825,172 @@
{
return compare(obj2, S_NEQ);
}
+
+ /**
+ * @see org.apache.xpath.Expression#cloneDeep()
+ */
+ public Object cloneDeep() throws CloneNotSupportedException
+ {
+ XNodeSet xns = (XNodeSet)super.clone();
+ if(null != m_iter)
+ xns.m_iter = (DTMIterator)m_iter.clone();
+ return xns;
+ }
+
+// /**
+// * @see org.apache.xml.dtm.DTMIterator#cloneWithReset()
+// */
+// public DTMIterator cloneWithReset() throws CloneNotSupportedException
+// {
+// DTMIterator clone = super.cloneWithReset();
+// return clone;
+// }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ if (null == m_current)
+ {
+ if (null != m_iter)
+ {
+ int nodeHandle = getCurrentNode();
+ // I don't think it's a good idea here to have m_current
+ // get assigned, since next or previous didn't already assign it!
+ return new XNodeSequenceSingleton(
+ nodeHandle,
+ m_iter.getDTM(nodeHandle));
+ }
+ else
+ {
+ return null;
+ }
+ }
+ return m_current;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true; // though I'm not sure about this.
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ int nodeHandle = getCurrentNode();
+ if (DTM.NULL != nodeHandle)
+ {
+ DTM dtm = getDTM(nodeHandle);
+
+ return dtm.getSchemaTypeLocalName(nodeHandle);
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ int nodeHandle = getCurrentNode();
+ if (DTM.NULL != nodeHandle)
+ {
+ DTM dtm = getDTM(nodeHandle);
+ return dtm.getSchemaTypeNamespace(nodeHandle);
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypes()
+ */
+ public int getTypes()
+ {
+ return XType.ANYTYPE; // don't try to predict yet.
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isPureNodeSequence()
+ */
+ public boolean isPureNodeSequence()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ int nodeHandle = getCurrentNode();
+ if (DTM.NULL != nodeHandle)
+ {
+ DTM dtm = getDTM(nodeHandle);
+ return dtm.isNodeSchemaType(nodeHandle, namespace, localname);
+ }
+ else
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#next()
+ */
+ public XObject next()
+ {
+ int node = nextNode();
+ if (DTM.NULL == node)
+ m_current = null;
+ else
+ m_current = new XNodeSequenceSingleton(node, this);
+ return m_current;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ int node = previousNode();
+ if (DTM.NULL == node)
+ m_current = null;
+ else
+ m_current = new XNodeSequenceSingleton(node, this);
+ return m_current;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#isSequenceProper()
+ */
+ public boolean isSequenceProper()
+ {
+ return true;
+ }
+
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getNodeHandle()
+ */
+ public int getNodeHandle()
+ {
+ return getCurrentNode();
+ }
+
}
/**
diff --git a/src/org/apache/xpath/objects/XNodeSetForDOM.java b/src/org/apache/xpath/objects/XNodeSetForDOM.java
index d23b4f7..1e8a7e8 100644
--- a/src/org/apache/xpath/objects/XNodeSetForDOM.java
+++ b/src/org/apache/xpath/objects/XNodeSetForDOM.java
@@ -16,43 +16,65 @@
{
Object m_origObj;
- public XNodeSetForDOM(Node node, DTMManager dtmMgr)
- {
- m_dtmMgr = dtmMgr;
- m_origObj = node;
- int dtmHandle = dtmMgr.getDTMHandleFromNode(node);
- m_obj = new NodeSetDTM(dtmMgr);
- ((NodeSetDTM) m_obj).addNode(dtmHandle);
- }
-
/**
- * Construct a XNodeSet object.
+ * Wrap an XNodeSetForDOM around another XNodeset
*
* @param val Value of the XNodeSet object
*/
+ /*
public XNodeSetForDOM(XNodeSet val)
{
super(val);
if(val instanceof XNodeSetForDOM)
+ {
m_origObj = ((XNodeSetForDOM)val).m_origObj;
+ }
+ }
+ */
+
+ /**
+ * Wrap an XNodeSetForDOM around a single DOM Node.
+ *
+ * (Interesting that this one takes the DTM Manager explicitly
+ * while others get it via the xctxt. Should we reconcile?)
+ *
+ */
+ public XNodeSetForDOM(Node node, DTMManager dtmMgr)
+ {
+ super(dtmMgr);
+ m_origObj = node;
+ int dtmHandle = dtmMgr.getDTMHandleFromNode(node);
+
+ NodeSetDTM nsdtm = new NodeSetDTM(dtmMgr);
+ nsdtm.addNode(dtmHandle);
+ m_obj=nsdtm;
}
+ /**
+ * Wrap an XNodeSetForDOM around a DOM NodeList
+ *
+ */
public XNodeSetForDOM(NodeList nodeList, XPathContext xctxt)
{
- m_dtmMgr = xctxt.getDTMManager();
+ super(xctxt.getDTMManager());
m_origObj = nodeList;
// JKESS 20020514: Longer-term solution is to force
// folks to request length through an accessor, so we can defer this
// retrieval... but that requires an API change.
// m_obj=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
- org.apache.xpath.NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
+ NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
m_last=nsdtm.getLength();
m_obj = nsdtm;
}
+ /**
+ * Wrap an XNodeSetForDOM around a DOM NodeIterator
+ *
+ */
public XNodeSetForDOM(NodeIterator nodeIter, XPathContext xctxt)
{
+ super(xctxt.getDTMManager());
m_dtmMgr = xctxt.getDTMManager();
m_origObj = nodeIter;
@@ -60,7 +82,7 @@
// folks to request length through an accessor, so we can defer this
// retrieval... but that requires an API change.
// m_obj = new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
- org.apache.xpath.NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
+ NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
m_last=nsdtm.getLength();
m_obj = nsdtm;
}
diff --git a/src/org/apache/xpath/objects/XNull.java b/src/org/apache/xpath/objects/XNull.java
index 9be0b3e..9f7f3d6 100644
--- a/src/org/apache/xpath/objects/XNull.java
+++ b/src/org/apache/xpath/objects/XNull.java
@@ -60,10 +60,8 @@
//import org.w3c.dom.DocumentFragment;
import org.apache.xml.dtm.DTM;
-import org.apache.xml.dtm.DTMIterator;
-
+import org.apache.xml.dtm.DTMManager;
import org.apache.xpath.XPathContext;
-import org.apache.xpath.NodeSetDTM;
/**
* <meta name="usage" content="general"/>
@@ -78,7 +76,7 @@
*/
public XNull()
{
- super();
+ super((DTMManager)null); // compile-time cast is needed
}
/**
@@ -168,4 +166,14 @@
{
return obj2.getType() == CLASS_NULL;
}
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return XSequence.EMPTY;
+ }
+
}
diff --git a/src/org/apache/xpath/objects/XNumber.java b/src/org/apache/xpath/objects/XNumber.java
index dd07c63..bc50524 100644
--- a/src/org/apache/xpath/objects/XNumber.java
+++ b/src/org/apache/xpath/objects/XNumber.java
@@ -66,38 +66,29 @@
* This class represents an XPath number, and is capable of
* converting the number to other types, such as a string.
*/
-public class XNumber extends XObject
+public abstract class XNumber extends XObject
{
-
- /** Value of the XNumber object.
- * @serial */
- double m_val;
-
/**
* Construct a XNodeSet object.
*
* @param d Value of the object
*/
- public XNumber(double d)
+ protected XNumber()
{
- super();
-
- m_val = d;
}
-
+
+
/**
* Construct a XNodeSet object.
*
* @param d Value of the object
*/
+ /*
public XNumber(Number num)
{
-
- super();
-
- m_val = num.doubleValue();
- m_obj = num;
+ super(num);
}
+ */
/**
* Tell that this is a CLASS_NUMBER.
@@ -120,39 +111,6 @@
return "#NUMBER";
}
- /**
- * Cast result object to a number.
- *
- * @return the value of the XNumber object
- */
- public double num()
- {
- return m_val;
- }
-
- /**
- * Evaluate expression to a number.
- *
- * @return 0.0
- *
- * @throws javax.xml.transform.TransformerException
- */
- public double num(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
- {
-
- return m_val;
- }
-
- /**
- * Cast result object to a boolean.
- *
- * @return false if the value is NaN or equal to 0.0
- */
- public boolean bool()
- {
- return (Double.isNaN(m_val) || (m_val == 0.0)) ? false : true;
- }
// /**
// * Cast result object to a string.
@@ -312,20 +270,27 @@
*/
public String str()
{
-
- if (Double.isNaN(m_val))
+ double num;
+ try
+ {
+ num = num();
+ }
+ catch(TransformerException te)
+ {
+ throw new RuntimeException(te.getMessage());
+ }
+ if (Double.isNaN(num))
{
return "NaN";
}
- else if (Double.isInfinite(m_val))
+ else if (Double.isInfinite(num))
{
- if (m_val > 0)
+ if (num > 0)
return "Infinity";
else
return "-Infinity";
}
- double num = m_val;
String s = Double.toString(num);
int len = s.length();
@@ -401,12 +366,26 @@
*
* @return The value of this XNumber as a Double object
*/
- public Object object()
+ abstract public Object object();
+ /*
{
if(null == m_obj)
- m_obj = new Double(m_val);
+ {
+ double num;
+ try
+ {
+ num = num();
+ }
+ catch(TransformerException te)
+ {
+ throw new RuntimeException(te.getMessage());
+ }
+
+ m_obj = new Double(num);
+ }
return m_obj;
}
+ */
/**
* Tell if two objects are functionally equal.
@@ -427,11 +406,13 @@
try
{
if (t == XObject.CLASS_NODESET)
- return obj2.equals(this);
+ return ((XNodeSet)obj2).equalsExistential(this);
else if(t == XObject.CLASS_BOOLEAN)
return obj2.bool() == bool();
else
- return m_val == obj2.num();
+ {
+ return num() == obj2.num();
+ }
}
catch(javax.xml.transform.TransformerException te)
{
diff --git a/src/org/apache/xpath/objects/XObject.java b/src/org/apache/xpath/objects/XObject.java
index a10aeaa..c70edff 100644
--- a/src/org/apache/xpath/objects/XObject.java
+++ b/src/org/apache/xpath/objects/XObject.java
@@ -56,24 +56,26 @@
*/
package org.apache.xpath.objects;
-import org.w3c.dom.DocumentFragment;
-//import org.w3c.dom.Text;
-//import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.traversal.NodeIterator;
-import org.apache.xml.dtm.*;
-
import java.io.Serializable;
-import org.apache.xpath.res.XPATHErrorResources;
+import org.apache.xalan.res.XSLMessages;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xml.utils.XMLString;
+import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
-import org.apache.xpath.XPathContext;
import org.apache.xpath.NodeSetDTM;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathException;
import org.apache.xpath.XPathVisitor;
-import org.apache.xalan.res.XSLMessages;
-import org.apache.xpath.Expression;
-import org.apache.xml.utils.XMLString;
+import org.apache.xpath.res.XPATHErrorResources;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.traversal.NodeIterator;
/**
* <meta name="usage" content="general"/>
@@ -81,31 +83,36 @@
* converting the object to various types, such as a string.
* This class acts as the base class to other XPath type objects,
* such as XString, and provides polymorphic casting capabilities.
+ *
+ * Caveat: Default method implementations provided herein may be
+ * inefficient, since they have to retrieve the "contained object"
+ * which may not exist until demanded.
*/
-public class XObject extends Expression implements Serializable, Cloneable
+public abstract class XObject extends Expression implements Serializable, Cloneable
{
-
/**
- * The java object which this object wraps.
- * @serial
+ * Create an undifferentiated XObject.
+ * Note: Abstract methods can't be constructed...
+ * ... and constructors don't inherit, even as abstracts.
*/
- protected Object m_obj; // This may be NULL!!!
+ /*
+ protected XObject(){}
+ */
/**
* Create an XObject.
- */
- public XObject(){}
-
- /**
- * Create an XObject.
+ * Note: Abstract methods can't be constructed...
+ * ... and constructors don't inherit, even as abstracts.
*
* @param obj Can be any object, should be a specific type
* for derived classes, or null.
*/
- public XObject(Object obj)
+ /*
+ protected XObject(Object obj)
{
- m_obj = obj;
+ //m_obj = obj;
}
+ */
/**
* For support of literal objects in xpaths.
@@ -150,12 +157,15 @@
public void destruct()
{
- if (null != m_obj)
+ if (null != object())
{
allowDetachToRelease(true);
detach();
-
- m_obj = null;
+
+ // %BUG% When m_obj was part of this class, we were
+ // nulling it out at this point. Do we need to move
+ // this logic down into the subclasses?
+ // m_obj = null;
}
}
@@ -216,22 +226,57 @@
public static final int CLASS_NULL = -1;
/** Constant for UNKNOWN object type */
- public static final int CLASS_UNKNOWN = 0;
+ public static final int CLASS_UNKNOWN = XType.ANYTYPE;
/** Constant for BOOLEAN object type */
- public static final int CLASS_BOOLEAN = 1;
+ public static final int CLASS_BOOLEAN = XType.BOOLEAN;
/** Constant for NUMBER object type */
- public static final int CLASS_NUMBER = 2;
+ public static final int CLASS_NUMBER = XType.DOUBLE;
/** Constant for STRING object type */
- public static final int CLASS_STRING = 3;
+ public static final int CLASS_STRING = XType.STRING;
/** Constant for NODESET object type */
- public static final int CLASS_NODESET = 4;
+ public static final int CLASS_NODESET = XType.NODE;
/** Constant for RESULT TREE FRAGMENT object type */
- public static final int CLASS_RTREEFRAG = 5;
+ public static final int CLASS_RTREEFRAG = XType.RTREEFRAG;
+
+ /** Constant for DATE object type */
+ public static final int CLASS_DATE = XType.DATE;
+
+ /** Constant for DATETIME object type */
+ public static final int CLASS_DATETIME = XType.DATETIME;
+
+ /** Constant for DURATION object type */
+ public static final int CLASS_DURATION = XType.DURATION;
+
+ /** Constant for DURATION object type */
+ public static final int CLASS_YMDURATION = XType.YEARMONTHDURATION;
+
+
+/** Constant for DURATION object type */
+ public static final int CLASS_DTDURATION = XType.DAYTIMEDURATION;
+
+
+ /** Constant for TIME object type */
+ public static final int CLASS_TIME = XType.TIME;
+
+ /** Constant for GDAY object type */
+ public static final int CLASS_GDAY = XType.GDAY;
+
+ /** Constant for GMONTH object type */
+ public static final int CLASS_GMONTH = XType.GMONTH;
+
+ /** Constant for GMONTHDAY object type */
+ public static final int CLASS_GMONTHDAY = XType.GMONTHDAY;
+
+ /** Constant for GYEAR object type */
+ public static final int CLASS_GYEAR = XType.GYEAR;
+
+ /** Constant for GYEARMONTH object type */
+ public static final int CLASS_GYEARMONTH = XType.GYEARMONTH;
/** Represents an unresolved variable type as an integer. */
public static final int CLASS_UNRESOLVEDVARIABLE = 600;
@@ -245,6 +290,19 @@
{
return CLASS_UNKNOWN;
}
+
+ /**
+ * Get the type of the value that this object represents.
+ * For most objects this is the same as getType(), but for
+ * nodes it is the type of the inner value.
+ *
+ * @return one of the 19 simple types from XType.
+ */
+ public int getValueType()
+ {
+ return getType();
+ }
+
/**
* Given a request type, return the equivalent string.
@@ -274,6 +332,34 @@
}
/**
+ * Get result object as a integer.
+ *
+ * @return At this level, the num() value cast to an integer.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public int integer() throws javax.xml.transform.TransformerException
+ {
+
+ return (int)num();
+ }
+
+ /**
+ * Get result object as a integer.
+ *
+ * @return At this level, the num() value cast to an integer.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public float floatVal() throws javax.xml.transform.TransformerException
+ {
+
+ return (float)num();
+ }
+
+
+
+ /**
* Cast result object to a number, but allow side effects, such as the
* incrementing of an iterator.
*
@@ -330,7 +416,8 @@
*/
public String str()
{
- return (m_obj != null) ? m_obj.toString() : "";
+ Object obj=object();
+ return (obj != null) ? obj.toString() : "";
}
/**
@@ -426,9 +513,30 @@
*
* @return The object that this class wraps
*/
- public Object object()
+ abstract public Object object();
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
{
- return m_obj;
+ Object obj=object();
+ try
+ {
+ // This feels a bit heavy weight, but most of the
+ // derived classes will override this method.
+ if(null == obj || getType() == CLASS_NULL)
+ return XSequence.EMPTY;
+ else if(obj instanceof XSequence)
+ return (XSequence)((XSequence)obj).clone(); // Clone??
+ else
+ return new XSequenceSingleton(this);
+ }
+ catch (CloneNotSupportedException e)
+ {
+ return (XSequence)obj;
+ }
}
/**
@@ -489,6 +597,18 @@
return null;
}
+
+ /**
+ * Get the node representation of this object, or return DTM.NULL if
+ * there is no node representation.
+ *
+ * @return int DTM.NULL if there is no node representation, or the
+ * node handle.
+ */
+ public int getNodeHandle()
+ {
+ return DTM.NULL;
+ }
/**
@@ -505,7 +625,7 @@
error(XPATHErrorResources.ER_CANT_CONVERT_TO_MUTABLENODELIST,
new Object[]{ getTypeString() }); //"Can not convert "+getTypeString()+" to a NodeSetDTM!");
- return (NodeSetDTM) m_obj;
+ return (NodeSetDTM) object();
}
/**
@@ -539,7 +659,7 @@
result = new Boolean(bool());
break;
case CLASS_UNKNOWN :
- result = m_obj;
+ result = object();
break;
// %TBD% What to do here?
@@ -662,25 +782,44 @@
*
* @throws javax.xml.transform.TransformerException
*/
- public boolean equals(XObject obj2)
+ public boolean equalsExistential(XObject obj2)
{
-
// In order to handle the 'all' semantics of
// nodeset comparisons, we always call the
// nodeset function.
- if (obj2.getType() == XObject.CLASS_NODESET)
- return obj2.equals(this);
-
- if (null != m_obj)
+ if (obj2.isNodesetExpr())
{
- return m_obj.equals(obj2.m_obj);
+ // Note: obj2 _must_ overload this function, or we
+ // dive into infinite recursion if "this" is also a
+ // nodeset.
+ return obj2.equalsExistential(this);
}
+
+ return equals(obj2);
+ }
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equals(XObject obj2)
+ {
+ Object obj = object();
+ if (null != obj)
+ return obj.equals(obj2.object());
else
{
- return obj2.m_obj == null;
+ return obj2.object() == null;
}
}
+
+
/**
* Tell if two objects are functionally not equal.
*
@@ -746,7 +885,7 @@
/**
* XObjects should not normally need to fix up variables.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
@@ -783,10 +922,138 @@
// If equals at the expression level calls deepEquals, I think we're
// still safe from infinite recursion since this object overrides
// equals. I hope.
- if(!this.equals((XObject)expr))
+ if(!this.equalsExistential((XObject)expr))
return false;
return true;
}
+
+ /**
+ * Tell if this node should have it's PathExpr ancestory reduced.
+ */
+ public boolean isPathExprReduced()
+ {
+ return true;
+ }
+
+ /**
+ * Tell if this item is a proper sequence, or should be treated as a
+ * value. This is needed for nested sequences (we implement sequences
+ * as nested, even though it appears from the caller's perspective and
+ * from XPath's perspective that sequences are not nested). XObjects
+ * that return true from this method must implement XSequence, though not
+ * all XObjects that implement XSequence must return true from this
+ * method.
+ * @return true if this sequence can be treated as a value or node, falst
+ * if this is a proper sequence.
+ */
+ public boolean isSequenceProper()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return true;
+ }
+
+ /**
+ * Cast result object to a DURATION.
+ *
+ * @return Duration
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public Duration duration() throws javax.xml.transform.TransformerException
+ {
+
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "DURATION" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return null; // To shut up compiler
+ }
+
+ /**
+ * Cast result object to a DAYTIMEDURATION.
+ *
+ * @return Duration
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public Duration daytimeDuration() throws javax.xml.transform.TransformerException
+ {
+
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "DAYTIMEDURATION" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return null; // To shut up compiler
+ }
+
+ /**
+ * Cast result object to a YEARMONTHDURATION.
+ *
+ * @return Duration
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public Duration yearmonthDuration() throws javax.xml.transform.TransformerException
+ {
+
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "YEARMONTHDURATION" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return null; // To shut up compiler
+ }
+
+ /**
+ * Cast result object to a DATE.
+ *
+ * @return DateTimeObj
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public DateTimeObj date() throws javax.xml.transform.TransformerException
+ {
+
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "DATE" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return null; // To shut up compiler
+ }
+
+ /**
+ * Cast result object to a DATETIME.
+ *
+ * @return DateTimeObj
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public DateTimeObj datetime() throws javax.xml.transform.TransformerException
+ {
+
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "DATETIME" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return null; // To shut up compiler
+ }
+
+ /**
+ * Cast result object to a TIME.
+ *
+ * @return DateTimeObj
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public DateTimeObj time() throws javax.xml.transform.TransformerException
+ {
+
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "TIME" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return null; // To shut up compiler
+ }
}
diff --git a/src/org/apache/xpath/objects/XObjectFactory.java b/src/org/apache/xpath/objects/XObjectFactory.java
index 6d873b6..cdcce35 100644
--- a/src/org/apache/xpath/objects/XObjectFactory.java
+++ b/src/org/apache/xpath/objects/XObjectFactory.java
@@ -1,6 +1,8 @@
package org.apache.xpath.objects;
import org.apache.xml.dtm.*;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
import org.apache.xpath.XPathContext;
import org.apache.xpath.NodeSetDTM;
import org.apache.xpath.axes.OneStepIterator;
@@ -37,16 +39,21 @@
}
else if (val instanceof Double)
{
- result = new XNumber(((Double) val));
+ result = new XDouble(((Double) val));
+ }
+ else if (val instanceof Integer)
+ {
+ result = new XInteger(((Integer) val));
}
else
- {
- result = new XObject(val);
+ {
+ result = new XJavaObject(val);
}
return result;
}
+
/**
* Create the right XObject based on the type of the object passed.
* This function <emph>can</emph> make an XObject that exposes DOM Nodes, NodeLists, and
@@ -74,9 +81,21 @@
{
result = new XBoolean((Boolean)val);
}
- else if (val instanceof Number)
+ else if (val instanceof Double)
{
- result = new XNumber(((Number) val));
+ result = new XDouble(((Double) val));
+ }
+ else if (val instanceof Integer)
+ {
+ result = new XInteger(((Integer) val));
+ }
+ else if (val instanceof DateTimeObj)
+ {
+ result = new XDateTime((DateTimeObj) val);
+ }
+ else if (val instanceof Duration)
+ {
+ result = new XDuration((Duration) val);
}
else if (val instanceof DTM)
{
@@ -131,7 +150,7 @@
}
else
{
- result = new XObject(val);
+ result = new XJavaObject(val);
}
return result;
diff --git a/src/org/apache/xpath/objects/XRTreeFrag.java b/src/org/apache/xpath/objects/XRTreeFrag.java
index a805b32..4aa5ea4 100644
--- a/src/org/apache/xpath/objects/XRTreeFrag.java
+++ b/src/org/apache/xpath/objects/XRTreeFrag.java
@@ -58,6 +58,7 @@
import javax.xml.transform.TransformerException;
import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMManager;
import org.apache.xml.dtm.DTMIterator;
import org.apache.xml.utils.FastStringBuffer;
import org.apache.xml.utils.XMLString;
@@ -66,34 +67,16 @@
import org.apache.xpath.XPathContext;
import org.w3c.dom.NodeList;
-import org.apache.xml.dtm.Axis;
-import org.apache.xpath.axes.RTFIterator;
-
/**
* <meta name="usage" content="general"/>
* This class represents an XPath result tree fragment object, and is capable of
* converting the RTF to other types, such as a string.
*/
-public class XRTreeFrag extends XObject implements Cloneable
+public class XRTreeFrag extends XNodeSet implements Cloneable
{
- DTM m_dtm;
- int m_dtmRoot;
- XPathContext m_xctxt;
- boolean m_allowRelease = false;
+ DTM m_dtm=null; // For possible storage management during finalize/destruct
+ boolean m_allowRelease;
-// /**
-// * Create an XRTreeFrag Object.
-// *
-// * @param frag Document fragment this will wrap
-// */
-// public XRTreeFrag(DTMIterator frag)
-// {
-// super(frag);
-//
-// // Obviously, this constructor should be avoided when possible.
-// m_dtmRoot = frag.cloneWithReset().nextNode();
-// }
-
/**
* Create an XRTreeFrag Object.
*
@@ -101,13 +84,13 @@
*/
public XRTreeFrag(int root, XPathContext xctxt, ExpressionNode parent)
{
- super(null);
+ super(root,xctxt);
- // Obviously, this constructor should be avoided when possible.
exprSetParent(parent);
- m_dtmRoot = root;
- m_xctxt = xctxt;
+
m_dtm = xctxt.getDTM(root);
+
+ m_iter=xctxt.createDTMIterator(root);
}
/**
@@ -117,43 +100,36 @@
*/
public XRTreeFrag(int root, XPathContext xctxt)
{
- super(null);
-
- // Obviously, this constructor should be avoided when possible.
- m_dtmRoot = root;
- m_xctxt = xctxt;
+ super(root,xctxt);
+
m_dtm = xctxt.getDTM(root);
+ m_iter=xctxt.createDTMIterator(root);
}
-
- /**
- * Return a java object that's closest to the representation
- * that should be handed to an extension.
- *
- * @return The object that this class wraps
- */
- public Object object()
- {
- if (m_xctxt != null)
- return new org.apache.xml.dtm.ref.DTMNodeIterator((DTMIterator)(new org.apache.xpath.NodeSetDTM(m_dtmRoot, m_xctxt.getDTMManager())));
- else
- return super.object();
- }
-
/**
* Create an XRTreeFrag Object.
*
* @param frag Document fragment this will wrap
*/
- public XRTreeFrag(Expression expr)
+ /*
+ private XRTreeFrag(Expression expr)
{
super(expr);
+
+ // Can't retrieve m_iter until the expression has been executed.
+ // Can't execute without an XCTXT.
+ // Can't win.
+ // Should this constructor exist at all? It seems to be here to support
+ // XRTreeFragSelectWrapper... but I'm not sure that should be considered
+ // an RTF rather than an XNodeSet!!!
}
-
+ */
+
/**
* Release any resources this object may have by calling destruct().
- * %ISSUE% This release will occur asynchronously. Resources it manipulates
- * MUST be thread-safe!
+ *
+ * STRONG WARNING: This release will occur asynchronously. Resources it
+ * manipulates MUST be thread-safe!
*
* @throws Throwable
*/
@@ -193,16 +169,14 @@
{
if(m_allowRelease)
{
- // %REVIEW% Do we actually _need_ detach, now that DTM RTF
- // storage is managed as a stack?
// See #destruct() for a comment about this next check.
- int ident = m_xctxt.getDTMIdentity(m_dtm);
- DTM foundDTM = m_xctxt.getDTM(ident);
+ int ident = m_dtmMgr.getDTMIdentity(m_dtm);
+ DTM foundDTM = m_dtmMgr.getDTM(ident);
if(foundDTM == m_dtm)
{
- m_xctxt.release(m_dtm, true);
+ m_dtmMgr.release(m_dtm, true);
m_dtm = null;
- m_xctxt = null;
+ m_dtmMgr = null;
}
m_obj = null;
}
@@ -234,13 +208,13 @@
// getDTMIdentity(dtm)).
// 6) Transform#2 tries to reference DTMManagerDefault#m_dtms[2], finds it is
// null, and chaos results.
- int ident = m_xctxt.getDTMIdentity(m_dtm);
- DTM foundDTM = m_xctxt.getDTM(ident);
+ int ident = m_dtmMgr.getDTMIdentity(m_dtm);
+ DTM foundDTM = m_dtmMgr.getDTM(ident);
if(foundDTM == m_dtm)
{
- m_xctxt.release(m_dtm, true);
+ m_dtmMgr.release(m_dtm, true);
m_dtm = null;
- m_xctxt = null;
+ m_dtmMgr = null;
}
}
m_obj = null;
@@ -248,6 +222,7 @@
/**
* Tell what kind of class this is.
+ * %REVIEW% Should we really be distinguishing RTF from other NodeSets?
*
* @return type CLASS_RTREEFRAG
*/
@@ -259,6 +234,7 @@
/**
* Given a request type, return the equivalent string.
* For diagnostic purposes.
+ * %REVIEW% Should we really be distinguishing RTF from other NodeSets?
*
* @return type string "#RTREEFRAG"
*/
@@ -269,13 +245,13 @@
/**
* Cast result object to a number.
+ * Note that this is different from XNodeSet's definition; we convert
+ * the entire string content, not just item(0).
*
* @return The result tree fragment as a number or NaN
*/
public double num()
- throws javax.xml.transform.TransformerException
{
-
XMLString s = xstr();
return s.toDouble();
@@ -296,19 +272,23 @@
/**
* Cast result object to an XMLString.
+ * Note that this is different from XNodeSet's definition; we convert
+ * the entire string content, not just item(0).
*
* @return The document fragment node data or the empty string.
*/
public XMLString xstr()
{
if(null == m_xmlStr)
- m_xmlStr = m_dtm.getStringValue(m_dtmRoot);
+ m_xmlStr = m_dtm.getStringValue(item(0));
return m_xmlStr;
}
/**
- * Cast result object to a string.
+ * Append result object's content to a FastStringBuffer.
+ * Note that this is different from XNodeSet's definition; we convert
+ * the entire string content, not just item(0).
*
* @return The string this wraps or the empty string if null
*/
@@ -321,12 +301,14 @@
/**
* Cast result object to a string.
+ * Note that this is different from XNodeSet's definition; we convert
+ * the entire string content, not just item(0).
*
* @return The document fragment node data or the empty string.
*/
public String str()
{
- String str = m_dtm.getStringValue(m_dtmRoot).toString();
+ String str = m_dtm.getStringValue(item(0)).toString();
return (null == str) ? "" : str;
}
@@ -334,41 +316,61 @@
/**
* Cast result object to a result tree fragment.
*
- * @return The document fragment this wraps
+ * @return The DTM Node Handle of the root node of the
+ * document fragment this wraps
*/
public int rtf()
{
- return m_dtmRoot;
+ return item(0);
}
/**
- * Cast result object to a DTMIterator.
- * dml - modified to return an RTFIterator for
- * benefit of EXSLT object-type function in
- * {@link org.apache.xalan.lib.ExsltCommon}.
+ * Cast result object to a DTMIterator. Standard XObject method,
+ * replaces special-case asNodeIterator()
* @return The document fragment as a DTMIterator
*/
+ public DTMIterator iter()
+ {
+ //return m_dtmMgr.createDTMIterator(item(0));
+ return super.iter();
+ }
+
+ /** @deprecated Unnecessarily nonstandard.
+ * @see iter()
+ * */
public DTMIterator asNodeIterator()
{
- DTMIterator iter = new RTFIterator(Axis.SELF);
- iter.setRoot(m_dtmRoot, m_xctxt);
- return iter;
+ return iter();
}
+
/**
- * Cast result object to a nodelist. (special function).
+ * Cast result object to a DOM nodelist, primarily
+ * for use as an extension function argument.
+ * (tandard XObject function, replaces special-case convertToNodeset()
*
* @return The document fragment as a nodelist
*/
- public NodeList convertToNodeset()
+ public NodeList nodelist() throws javax.xml.transform.TransformerException
{
-
+ return super.nodelist();
+ /*
if (m_obj instanceof NodeList)
return (NodeList) m_obj;
else
- return new org.apache.xml.dtm.ref.DTMNodeList(asNodeIterator());
+ return new org.apache.xml.dtm.ref.DTMNodeList(iter());
+ */
}
+ /** @deprecated Unnecessarily nonstandard.
+ * @see nodeList()
+ * */
+ public NodeList convertToNodeset() throws javax.xml.transform.TransformerException
+ {
+ return nodelist();
+ }
+
+
/**
* Tell if two objects are functionally equal.
*
@@ -389,7 +391,7 @@
// In order to handle the 'all' semantics of
// nodeset comparisons, we always call the
// nodeset function.
- return obj2.equals(this);
+ return ((XNodeSet)obj2).equalsExistential(this);
}
else if (XObject.CLASS_BOOLEAN == obj2.getType())
{
diff --git a/src/org/apache/xpath/objects/XRTreeFragSelectWrapper.java b/src/org/apache/xpath/objects/XRTreeFragSelectWrapper.java
index f5af9e0..21e8b1d 100644
--- a/src/org/apache/xpath/objects/XRTreeFragSelectWrapper.java
+++ b/src/org/apache/xpath/objects/XRTreeFragSelectWrapper.java
@@ -6,22 +6,37 @@
import org.apache.xml.utils.XMLString;
-import org.apache.xpath.DOMHelper;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.Expression;
import org.apache.xalan.res.XSLMessages;
import org.apache.xpath.res.XPATHErrorResources;
/**
- * This class makes an select statement act like an result tree fragment.
+ * This class makes an select statement act like an result tree fragment...
+ * at least in its returned values and comparisons. Actually, a
+ * more accurate description might be that its "values", like those of an
+ * RTF, spans all the selected content rather than being taken only from the
+ * first matching node.
+ *
+ * But this really _isn't_ a result tree fragment. The rtf() method is
+ * hardwired to throw an exception, and the type() method returns STRING.
+ *
+ * (Some of the logic is swiped from XRTreeFrag, but we no longer
+ * inherit from that class. Doing so was a bit of a kluge, and became
+ * impractical when XRTreeFrag was rewritten as an XNodeSet derivitive.)
+ *
+ * %REVIEW% Should we rename this class?
*/
-public class XRTreeFragSelectWrapper extends XRTreeFrag implements Cloneable
+public class XRTreeFragSelectWrapper extends XObject implements Cloneable
{
XObject m_selected;
+ boolean m_allowRelease;
+ Expression m_expr;
public XRTreeFragSelectWrapper(Expression expr)
{
- super(expr);
+ m_expr=expr;
}
/**
@@ -34,9 +49,9 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- ((Expression)m_obj).fixupVariables(vars, globalsSize);
+ m_expr.fixupVariables(vcs);
}
/**
@@ -53,7 +68,7 @@
{
try
{
- m_selected = ((Expression)m_obj).execute(xctxt);
+ m_selected = m_expr.execute(xctxt);
m_selected.allowDetachToRelease(m_allowRelease);
XRTreeFragSelectWrapper xrtf = (XRTreeFragSelectWrapper)this.clone();
return xrtf;
@@ -80,24 +95,12 @@
{
m_selected.detach();
m_selected = null;
+ m_expr=null;
}
super.detach();
}
-
- /**
- * Cast result object to a number.
- *
- * @return The result tree fragment as a number or NaN
- */
- public double num()
- throws javax.xml.transform.TransformerException
- {
-
- return m_selected.num();
- }
-
-
+
/**
* Cast result object to an XMLString.
*
@@ -125,13 +128,14 @@
*/
public int getType()
{
- return CLASS_STRING; // hmm...
+ return CLASS_STRING;
}
/**
* Cast result object to a result tree fragment.
+ * Probably not needed since we no longer claim to inherit XRTreeFrag...
*
- * @return The document fragment this wraps
+ * @throws method-not-supported runtime expection.
*/
public int rtf()
{
@@ -147,5 +151,102 @@
{
throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_RTF_NOT_SUPPORTED_XRTREEFRAGSELECTWRAPPER, null)); //"asNodeIterator() not supported by XRTreeFragSelectWrapper!");
}
+
+ public Object object()
+ {
+ /* Would this be preferable?
+ if(m_selected!=null)
+ return m_selected.object();
+ else
+ */
+ return m_expr;
+ }
+
+
+ //-------------------------------------------------------------
+ // Code swiped from XRTreeFrag since we no longer inherit therefrom
+
+ /**
+ * Tell if two objects are functionally equal.
+ * Use logic from XRTreeFrag, not standard XObject.equals()
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if the two objects are equal
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equals(XObject obj2)
+ {
+
+ try
+ {
+ if (XObject.CLASS_NODESET == obj2.getType())
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ return ((XNodeSet)obj2).equalsExistential(this);
+ }
+ else if (XObject.CLASS_BOOLEAN == obj2.getType())
+ {
+ return bool() == obj2.bool();
+ }
+ else if (XObject.CLASS_NUMBER == obj2.getType())
+ {
+ return num() == obj2.num();
+ }
+ else if (XObject.CLASS_NODESET == obj2.getType())
+ {
+ return xstr().equals(obj2.xstr());
+ }
+ else if (XObject.CLASS_STRING == obj2.getType())
+ {
+ return xstr().equals(obj2.xstr());
+ }
+ else if (XObject.CLASS_RTREEFRAG == obj2.getType())
+ {
+
+ // Probably not so good. Think about this.
+ return xstr().equals(obj2.xstr());
+ }
+ else
+ {
+ return super.equals(obj2);
+ }
+ }
+ catch(javax.xml.transform.TransformerException te)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(te);
+ }
+ }
+
+ /**
+ * Cast result object to a number.
+ * Note that this is different from XNodeSet's definition; we convert
+ * the entire string content, not just item(0).
+ *
+ * @return The result tree fragment as a number or NaN
+ */
+ public double num()
+ {
+ XMLString s = xstr();
+
+ return s.toDouble();
+ }
+
+ /**
+ * Cast result object to a boolean. This always returns true for an
+ * XRTreeFragSelectWrapper. (I'm not entirely sure why it should, but some
+ * of the regression tests fail if it doesn't.)
+ *
+ * @return true
+ */
+ public boolean bool()
+ {
+ return true;
+ }
+
}
\ No newline at end of file
diff --git a/src/org/apache/xpath/objects/XSequence.java b/src/org/apache/xpath/objects/XSequence.java
new file mode 100644
index 0000000..d3fbaec
--- /dev/null
+++ b/src/org/apache/xpath/objects/XSequence.java
@@ -0,0 +1,277 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+/**
+ * The responsibility of XSequence is to provide an interface to XPath 2.0
+ * sequences.
+ *
+ * Created Jul 16, 2002
+ * @author sboag
+ * @author jkesselman
+ */
+public interface XSequence extends Cloneable
+{
+ /** MANAFEST CONSTANT: An empty XSequence, which can be returned when no
+ * typed value exists.
+ * */
+ public static final XSequenceEmpty EMPTY = new XSequenceEmpty();
+
+ //========= Type methods on the sequence as a whole ==========
+
+ /**
+ * If this iterator holds homogenous types, return that type ID.
+ *
+ * @return The homogenous type, or NOTHOMOGENOUS, or EMPTYSEQ.
+ */
+ public int getTypes();
+
+
+ //========= Itteration ==========
+
+ /**
+ * Returns the next object in the set and advances the position of the
+ * iterator in the set.
+ *
+ * @return The next item in the set being iterated over, or
+ * <code>null</code> if there are no more members in that set.
+ */
+ public XObject next();
+
+ /**
+ * Returns the previous object in the set and moves the position of the
+ * <code>XSequence</code> backwards in the set.
+ *
+ * @return The previous item in the set being iterated over,
+ * or <code>null</code> if there are no more members in that set.
+ */
+ public XObject previous();
+
+ /**
+ * Detaches the <code>XSequence</code> 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>next</code> or <code>previous</code> will
+ * raise a runtime exception.
+ */
+ public void detach();
+
+ /**
+ * Specify if it's OK for detach to release the iterator for reuse.
+ *
+ * @param allowRelease true if it is OK for detach to release this iterator
+ * for pooling.
+ */
+ public void allowDetachToRelease(boolean allowRelease);
+
+ /**
+ * Get the current item in the iterator.
+ *
+ * @return The item or null if there is no current item.
+ */
+ public XObject getCurrent();
+
+ /**
+ * Tells if this iterator is "fresh", in other words, if
+ * the first next() that is called will return the
+ * first item in the set.
+ *
+ * @return true if the iteration of this list has not yet begun.
+ */
+ public boolean isFresh();
+
+ /**
+ * Retrieve the current item's datatype namespace URI.
+ *
+ * @return the namespace for the current value's type
+ * @throws exception if there is no current item.
+ */
+ public String getTypeNS();
+
+ /**
+ * Retrieve current item's datatype namespace URI.
+ *
+ * @return the localname of the current value's type
+ * @throws exception if there is no current item.
+ */
+ public String getTypeLocalName();
+
+ /**
+ * Ask whether the current item's datatype equals or is derived from a specified
+ * schema NSURI/localname pair.
+ *
+ * @return true if the type is an instance of this schema datatype,
+ * false if it isn't.
+ * @throws exception if there is no current item.
+ */
+ public boolean isSchemaType(String namespace, String localname);
+
+ /**
+ * Retrieve the built-in atomic type of the current item
+ *
+ * @return NODE, ANYTYPE, etc. as defined in XType
+ * @throws exception if there is no current item.
+ */
+ public int getType();
+
+ /** @return true if the sequence is known to contain only NODEs.
+ * (%REVIEW%: If false, that may not mean it doesn't, just that
+ * we don't know this a priori and can't optimize.)
+ * */
+ public boolean isPureNodeSequence();
+
+ /**
+ * Reset the iterator to the beginning of the itteration. After this
+ * is called, isFresh will return true, and there will be no current
+ * node.
+ */
+ public void reset();
+
+
+ //========= Random Access ==========
+
+ /**
+ * If setShouldCache(true) is called, then items will
+ * be cached, enabling random access, and giving the ability to do
+ * sorts and the like. They are not cached by default.
+ *
+ * %REVIEW% Shouldn't the other random-access methods throw an exception
+ * if they're called with this flag set false?
+ *
+ * %REVIEW% Is this method still needed, given that we *removed*
+ * most of the random-access methods (except setCurrentPos)?
+ *
+ * @param b true if the items should be cached.
+ * @throws exception if XSequence can't cache.
+ */
+ public void setShouldCache(boolean b);
+
+ /**
+ * Tell if the random access methods (i.e. those methods
+ * that take an index) can be used. This is the normally the
+ * same value set with setShouldCache(boolean b).
+ *
+ * %REVIEW% Is this method still needed, given that we *removed*
+ * most of the random-access methods (except setCurrentPos)?
+ *
+ * @return true if the random access methods can be used.
+ */
+ public boolean getIsRandomAccess();
+
+ /**
+ * Tells if this iterator can have items added to it.
+ *
+ * @return True if the XSequence can be mutated -- in which case
+ * it presumably implements XSequenceMutable. (However, not all
+ * sequences which implement that interface can be mutated; they
+ * may have been locked.)
+ *
+ * @see XSequenceMutable.lock()
+ */
+ public boolean isMutable();
+
+ /**
+ * Get the current position within the cached list, which is one
+ * less than the next next() call will retrieve. i.e. if you
+ * call getCurrentPos() and the return is 0, the next fetch will
+ * take place at index 1. If the itterator is fresh, this will return
+ * -1.
+ *
+ * @return The position of the iteration.
+ */
+ public int getCurrentPos();
+
+ /**
+ * Set the current position in the sequence. If the index is
+ * at the end of the sequence, the return value will be null.
+ * This is mainly to support setting the index to zero without
+ * caring if the sequence contains a value.
+ *
+ * @param i Must be a valid index.
+ * @return the object at the given index, or null if
+ * index == length.
+ * @throws exception if index < 0 or >= length.
+ * @throws exception if the sequence implementation does not
+ * support random access.
+ */
+ public void setCurrentPos(int i);
+
+ /**
+ * The number of items in the list. The range of valid item indices
+ * is 0 to <code>length-1</code> inclusive. Note that this requires running
+ * the iterator to completion, and presumably filling the cache.
+ * <i>Warning: Use of this function can be expensive and detrimental to
+ * performance.</i>
+ *
+ * @return The number of items in the list.
+ */
+ public int getLength();
+
+ /**
+ * Tell if this item is a singleton. This method will also
+ * return true for an empty sequence.
+ * @return true if this sequence is a singleton, or an empty sequence.
+ */
+ public boolean isSingletonOrEmpty();
+
+ /**
+ * @return XSequence object.
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException;
+
+}
diff --git a/src/org/apache/xpath/objects/XSequenceCachedBase.java b/src/org/apache/xpath/objects/XSequenceCachedBase.java
new file mode 100644
index 0000000..3c754b0
--- /dev/null
+++ b/src/org/apache/xpath/objects/XSequenceCachedBase.java
@@ -0,0 +1,349 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import java.util.Vector;
+
+import org.apache.xpath.XPathContext;
+
+/**
+ * XSequenceCachedBase is an abstract superclass for classes that
+ * want to use XSequenceImpl as a base for caching but are otherwise
+ * incremental.
+ *
+ * Created Jul 20, 2002
+ * @author sboag
+ */
+public abstract class XSequenceCachedBase extends XSequenceImpl implements XSequence
+{
+ protected boolean m_cached = false;
+ protected XObject m_current;
+ protected XPathContext m_xctxt;
+ protected boolean m_foundLast = false;
+
+ /**
+ * Constructor for XSequenceCachedBase.
+ */
+ public XSequenceCachedBase(XPathContext xctxt)
+ {
+ m_xctxt = xctxt;
+ }
+
+
+ /**
+ * Return the next object in the iteration from a next() method.
+ * @param xobj the next Object in the itterator, or null.
+ * @return XObject The same reference that was passed in.
+ */
+ public XObject next()
+ {
+ // Start by asking the cache
+ XObject next = super.next();
+
+ // If not in cache, and not done iterating, request
+ // new value from getNext() (provided by subclass)
+ if(null == next && !m_foundLast)
+ {
+ next = getNext();
+ if(null != next)
+ {
+ // Add it to the cache.
+ m_pos++;
+ if(m_cached)
+ {
+ // Note: The first case arises only if the cache
+ // actually contained a null. May happen if a
+ // subclass knows the expected count and preallocates
+ // the cache; unlikely otherwise.
+ if(m_pos < getValues().size()-1)
+ insertItemAt(next, m_pos);
+ else
+ concat(next);
+ }
+ }
+ else
+ {
+ m_foundLast = true; // Off the end...
+ m_pos++; // go off the end.
+ }
+ }
+ m_current = next;
+ return next;
+ }
+
+ /**
+ * Return the previous object in the iteration from a previous() method.
+ * @param xobj the next Object in the iterator, or null.
+ * @return XObject The same reference that was passed in.
+ */
+ public XObject previous()
+ {
+ // Start by asking the cache
+ XObject prev = super.previous();
+
+ // If not in cache, and not done iterating, request
+ // new value from getNext() (provided by subclass)
+ if(null == prev)
+ {
+ m_pos--;
+ prev = getPrevious();
+ if(null != prev)
+ {
+ // Add it to the cache.
+ // Note: This case arises only if the cache
+ // actually contained a null. May happen if a
+ // subclass knows the expected count and preallocates
+ // the cache; unlikely otherwise.
+ if(m_cached)
+ super.insertItemAt(prev, m_pos);
+ }
+ }
+ m_current = prev;
+ return prev;
+ }
+
+ /**
+ * This method must be implemented by the derived class to return the
+ * next item in the iteration, and is called by the next() method. The
+ * item returned will be inserted into the cache if the cache property
+ * is true.
+ * @return XObject The next item, or null.
+ */
+ protected abstract XObject getNext();
+
+ /**
+ * This method must be implemented by the derived class to return the
+ * previous item in the iteration, and is called by the next() method. The
+ * item returned will be inserted into the cache if the cache property
+ * is true.
+ * @return XObject The previous item, or null.
+ * @throws RuntimeException if this iterator doesn't support non-cached
+ * previous operations.
+ */
+ protected abstract XObject getPrevious();
+
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ return m_current;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return (null == m_current) && super.isFresh();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ assertion((null != m_current), "Current node can not be null for getTypeNS()!");
+ return m_current.xseq().getTypeNS();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ assertion((null != m_current), "Current node can not be null for getTypeLocalName()!");
+ return m_current.xseq().getTypeLocalName();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ assertion((null != m_current), "Current node can not be null for isSchemaType()!");
+ return m_current.xseq().isSchemaType(namespace, localname);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isPureNodeSequence()
+ */
+ public boolean isPureNodeSequence()
+ {
+ // Not totally sure what to do about this yet.
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ if(!isFresh())
+ throw new RuntimeException(this.getClass().getName()+" cache can not be changed after it has started!");
+ if(b)
+ {
+ if(null == getValues())
+ setValues(new Vector());
+ }
+ m_cached = b;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return m_cached;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_pos;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ if (!m_cached)
+ throw new RuntimeException("This "+this.getClass().getName()+" is not set for random access!");
+
+ if (i < 0)
+ {
+ m_current = null;
+ m_pos = -1;
+ }
+ else
+ if (i > m_pos)
+ {
+ while (i > m_pos)
+ {
+ XObject xobj = next(); // Sets m_current implicitly
+ if (null == xobj)
+ break;
+ }
+ }
+ else
+ {
+ m_pos = i;
+ m_current = (XObject) getValues().elementAt(i);
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getLength()
+ */
+ public int getLength()
+ {
+ if(isFresh())
+ setShouldCache(true);
+ else if(!getIsRandomAccess())
+ throw new RuntimeException("This "+this.getClass().getName()+" is not set for random access!");
+
+ if(m_foundLast)
+ return getValues().size();
+
+ int origPos = m_pos;
+ while(next() != null);
+ int len = m_pos;
+ m_pos = origPos;
+ return len;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return false; // hard to tell at this point.
+ }
+
+
+
+ /**
+ * @return XSequence object.
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#reset()
+ */
+ public void reset()
+ {
+ super.reset();
+ m_current = null;
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XSequenceEmpty.java b/src/org/apache/xpath/objects/XSequenceEmpty.java
new file mode 100644
index 0000000..fda5250
--- /dev/null
+++ b/src/org/apache/xpath/objects/XSequenceEmpty.java
@@ -0,0 +1,272 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import org.apache.xml.dtm.XType;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 15, 2002
+ * @author sboag
+ */
+class XSequenceEmpty extends XObject implements XSequence, Cloneable
+{
+ /**
+ * Calling this method doesn't do anything.
+ * @see org.apache.xml.dtm.XSequence#allowDetachToRelease(boolean)
+ */
+ public void allowDetachToRelease(boolean allowRelease)
+ {
+ }
+
+ /**
+ * Calling this method doesn't do anything.
+ * @see org.apache.xml.dtm.XSequence#detach()
+ */
+ public void detach()
+ {
+ }
+
+ /**
+ * Always return null.
+ * @see org.apache.xml.dtm.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ return null;
+ }
+
+ public Object object()
+ {
+ return null;
+ }
+
+ /**
+ * Always returns -1.
+ * @see org.apache.xml.dtm.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return 0;
+ }
+
+ /**
+ * Always returns 0.
+ * @see org.apache.xml.dtm.XSequence#getLength()
+ */
+ public int getLength()
+ {
+ return 0;
+ }
+
+ /**
+ * Always throws IndexOutOfBoundsException.
+ * @see org.apache.xml.dtm.XSequence#getType()
+ */
+ public int getType()
+ {
+ throw new IndexOutOfBoundsException("No current item!");
+ }
+
+ /** @return true if the sequence is known to contain only NODEs.
+ * %REVIEW% I can argue for either calling this an empty sequence
+ * of nodes, or a sequence which does not contain any nodes
+ * (or we could throw an exception, though I don't think that's
+ * useful). Which response is most useful?
+ * */
+ public boolean isPureNodeSequence()
+ {
+ return false;
+ }
+
+ /**
+ * Always throws IndexOutOfBoundsException.
+ * @see org.apache.xml.dtm.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ throw new IndexOutOfBoundsException("No current item!");
+ }
+
+ /**
+ * Always throws IndexOutOfBoundsException.
+ * @see org.apache.xml.dtm.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ throw new IndexOutOfBoundsException("No current item!");
+ }
+
+ /**
+ * Always return XType.EMPTYSEQ.
+ * @see org.apache.xml.dtm.XSequence#getTypes()
+ */
+ public int getTypes()
+ {
+ return XType.EMPTYSEQ;
+ }
+
+ /**
+ * Always return true.
+ * @see org.apache.xml.dtm.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return true;
+ }
+
+ /**
+ * Always return false.
+ * @see org.apache.xml.dtm.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ /**
+ * Always throw IndexOutOfBoundsException.
+ * @see org.apache.xml.dtm.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ throw new IndexOutOfBoundsException("No current item!");
+ }
+
+ /**
+ * Always return true;
+ * @see org.apache.xml.dtm.XSequence#isSingleton()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return true;
+ }
+
+ /**
+ * Always return null.
+ * @see org.apache.xml.dtm.XSequence#next()
+ */
+ public XObject next()
+ {
+ return null;
+ }
+
+ /**
+ * Always return null.
+ * @see org.apache.xml.dtm.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ return null;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ if(0 != i)
+ return;
+ else
+ throw new IndexOutOfBoundsException("No item at that index!");
+ }
+
+ /**
+ * Calling this method doesn't do anything.
+ * @see org.apache.xml.dtm.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ }
+
+ /**
+ * %REVIEW% Format not yet firmly settled. Primarily for debugging purposes!
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return super.toString();
+ }
+
+ /**
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ /**
+ * Always return true.
+ * @see org.apache.xml.dtm.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true; // as far as it goes.
+ }
+
+ /**
+ * Calling this method doesn't do anything.
+ * @see org.apache.xml.dtm.XSequence#reset()
+ */
+ public void reset()
+ {
+ // do nothing.
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XSequenceImpl.java b/src/org/apache/xpath/objects/XSequenceImpl.java
new file mode 100644
index 0000000..aab6b32
--- /dev/null
+++ b/src/org/apache/xpath/objects/XSequenceImpl.java
@@ -0,0 +1,598 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import java.util.Vector;
+
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.IntVector;
+import org.apache.xml.utils.WrappedRuntimeException;
+
+/** This class provides an API representation for the XPath 2 Data Model's "Sequences"
+ * -- which are the basic representation for typed values. Only built-in types,
+ * types derived from built-ins, and sets thereof are returned directly by the XPath2
+ * DM; complex schema-types must be accessed through the document tree.
+ * */
+public class XSequenceImpl extends XObject
+ implements XSequenceMutable
+{
+ // %OPT% Four vectors is not exactly compact.
+ // Do we want to try to improve this?
+ private Vector m_values=new Vector();
+ protected Vector m_typeNamespaces=new Vector();
+ protected Vector m_typeNames=new Vector();
+
+ // We really shouldn't need xTypes, since the XObject should be cabable of
+ // storing the type.
+ // private IntVector xTypes=new IntVector();
+
+ protected int m_pos = -1;
+ protected boolean m_unlocked=true;
+
+ protected int m_homogtype=XType.EMPTYSEQ;
+
+ /** Create a sequence, initially empty.
+ * */
+ public XSequenceImpl()
+ {
+ setValues(new Vector());
+ }
+
+
+ /** Create a sequence, initially empty.
+ * */
+ public XSequenceImpl(boolean shouldCache)
+ {
+ if(shouldCache)
+ setValues(new Vector());
+ }
+
+ /**
+ * %REVIEW% If the type is in the XMLSchema or XMLSchema-datatype
+ * namespaces, should we also assign a primitive XType?
+ *
+ * @param value Item value to add to the iteration.
+ * @param typeNamespace String containing namespace URI of schema type
+ * @param typeNamespace String containing local name of schema type
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(val,ns,typename);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ *
+ * @see XSequenceMutable.append(Object value,String typeNamespace,String typeName)
+ * */
+ public XSequenceMutable concat(Object value,String typeNamespace,String typeName)
+ {
+ if(!m_unlocked)
+ throw new RuntimeException("Sequence is locked, hence not muteable!");
+
+ int xtype=0;
+ if(XType.XMLSCHEMA_DATATYPE_NAMESPACE.equals(typeNamespace)
+ || XType.XMLSCHEMA_NAMESPACE.equals(typeNamespace))
+ xtype=XType.getTypeFromLocalName(typeName);
+
+ XObject xvalue = XObjectFactory.create(value);
+ getValues().addElement(xvalue);
+
+ // If it's an XType, we may save some space by not
+ // storing the strings and instead retrieving them
+ // from the manefest-constant tables.
+ // (Though storing them would simplify retrieval...)
+ // %REVIEW%
+ m_typeNames.addElement(xtype!=0 ? null : typeName);
+ m_typeNamespaces.addElement(xtype!=0 ? null : typeNamespace);
+
+ // Ignore xtype for right now. -sb
+ // xTypes.addElement(xtype);
+
+ if(m_homogtype==XType.EMPTYSEQ)
+ m_homogtype=xtype;
+ else if(m_homogtype!=xtype)
+ m_homogtype=XType.NOTHOMOGENOUS;
+
+ return this;
+ }
+
+ /** Add an object to the sequence, along with its
+ * primitive datatype as defined in XType
+ * @param value Item value to add to the iteration.
+ * @param xtype Primitive type number, as defined in XType.
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(val,type);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ *
+ * @see XSequenceMutable.concat(Object value,int xtype)
+ * */
+ public XSequenceMutable concat(Object value,int xtype)
+ {
+ if(!m_unlocked)
+ throw new RuntimeException("Sequence is locked, hence not mutable!");
+
+ XObject xvalue = XObjectFactory.create(value);
+ getValues().addElement(xvalue);
+
+ // Could store the strings. But given that I'm suppressing
+ // them for efficiency reasons when type was set by strings,
+ // I'll suppress them here for consistancy.
+ // %REVIEW%
+ m_typeNames.addElement(null);
+ m_typeNamespaces.addElement(null);
+
+ // Ignore xTypes for right now. See comment at commented out member var. -sb
+ // xTypes.addElement(xtype);
+
+ if(m_homogtype==XType.EMPTYSEQ)
+ m_homogtype=xtype;
+ else if(m_homogtype!=xtype)
+ m_homogtype=XType.NOTHOMOGENOUS;
+
+ return this;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequenceMutable#concat(XObject)
+ */
+ public XSequenceMutable concat(XObject xvalue)
+ {
+ if(!m_unlocked)
+ throw new RuntimeException("Sequence is locked, hence not muteable!");
+
+ getValues().addElement(xvalue);
+
+ // Could store the strings. But given that I'm suppressing
+ // them for efficiency reasons when type was set by strings,
+ // I'll suppress them here for consistancy.
+ // %REVIEW%
+ m_typeNames.addElement(null);
+ m_typeNamespaces.addElement(null);
+
+ // Ignore xTypes for right now. See comment at commented out member var. -sb
+ // xTypes.addElement(xvalue.getType());
+
+ return this;
+ }
+
+
+ /** Append complete contents of another XSequence
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(otherseq);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ *
+ * @see XSequenceMutable.append(XSequence)
+ * */
+ public XSequenceMutable concat(XSequence other)
+ {
+ if(!m_unlocked)
+ throw new RuntimeException("Sequence is locked, hence not muteable!");
+
+ for(Object value=other.next();
+ value!=null;
+ value=other.next())
+ {
+ getValues().addElement(value);
+
+ int xtype=other.getType();
+
+ // Ignore xTypes for right now. See comment at commented out member var. -sb
+ // xTypes.addElement(xtype);
+
+ m_typeNames.addElement(xtype==0 ? null : other.getTypeLocalName());
+ m_typeNamespaces.addElement(xtype==0 ? null : other.getTypeNS());
+
+ if(m_homogtype==XType.EMPTYSEQ)
+ m_homogtype=xtype;
+ else if(m_homogtype!=xtype)
+ m_homogtype=XType.NOTHOMOGENOUS;
+ }
+
+ return this;
+ }
+
+
+ /** Prevent further mutation of this sequence. After this has
+ * been called, isMutable should return false.
+ * @see XSequence.isMutable()
+ * */
+ public void lock()
+ {
+ m_unlocked=false;
+ }
+
+ /** @return the number of members in this sequence. */
+ public int getLength()
+ {
+ return getValues().size();
+ }
+
+ /** Retrieve the value for this member of the sequence. Since values may be
+ * a heterogenous mix, and their type may not be known until they're examined,
+ * they're returned as Objects. This is storage-inefficient if the value(s)
+ * is/are builtins that map to Java primitives. Tough.
+ *
+ * @param index 0-based index into the sequence.
+ * @return the specified value
+ * @throws exception if index <0 or >=length
+ * */
+ public XObject next()
+ {
+ if(m_pos >= getValues().size()-1)
+ return null;
+ return (XObject)getValues().elementAt(++m_pos);
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ if(m_pos <= 0)
+ return null;
+ return (XObject)getValues().elementAt(--m_pos);
+ }
+
+ /** %REVIEW% Format not yet firmly settled. Primarily for debugging purposes!
+ * */
+ public String toString()
+ {
+ StringBuffer b=new StringBuffer("Sequence[");
+ String start="";
+
+ for(int i=0;i<getValues().size();++i)
+ {
+ XObject xvalue=(XObject)getValues().elementAt(i);
+ String tns,tn;
+ // int xtype=xTypes.elementAt(i);
+ int xtype=xvalue.getType();
+ if(xtype!=XType.ANYTYPE)
+ {
+ tns=XType.XMLSCHEMA_NAMESPACE;
+ tn=XType.getLocalNameFromType(xtype);
+ }
+ else
+ {
+ // %OPT% Is it faster to cast to String, or
+ // to call .toString()? The latter is _safer_...
+ // (Opinion from Sun: Depends on your JVM.)
+ tns=(String)m_typeNamespaces.elementAt(i);
+ tn=(String)m_typeNames.elementAt(i);
+
+ }
+ b.append(start)
+ .append(tns).append(':').append(tn);
+ if(xtype!=0)
+ b.append(" (").append(xtype).append(')');
+ b.append(" = ")
+ .append(xvalue);
+ if(xvalue!=null)
+ b.append(" {"+xvalue.getClass().getName()+"}");
+ start=", ";
+ }
+ return b.append(']').toString();
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#allowDetachToRelease(boolean)
+ */
+ public void allowDetachToRelease(boolean allowRelease)
+ {
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#detach()
+ */
+ public void detach()
+ {
+ // Do nothing
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ return (XObject)getValues().elementAt(m_pos);
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_pos;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ XObject xobj = getCurrent();
+ int xtype = xobj.getType();
+ if (xtype != XType.ANYTYPE)
+ return XType.getLocalNameFromType(xtype);
+ else
+ return (String) m_typeNames.elementAt(m_pos);
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ XObject xobj = getCurrent();
+ int xtype = xobj.getType();
+ if (xtype != XType.ANYTYPE)
+ return XType.XMLSCHEMA_NAMESPACE;
+ else
+ return (String) m_typeNamespaces.elementAt(m_pos);
+ }
+
+ /**
+ * If this iterator holds homogenous primitive types, return that type ID.
+ *
+ * @return The homogenous type, or NOTHOMOGENOUS, or EMPTYSEQ.
+ */
+ public int getTypes()
+ {
+ return m_homogtype;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getType()
+ */
+ public int getType()
+ {
+ XObject xobj = getCurrent();
+ if(null == xobj)
+ return XType.SEQ; // %REVIEW% Not sure what this should return.
+ int xtype = xobj.getType();
+ return xtype;
+ }
+
+ /** @return false, since I don't think we're ever going to put
+ * nodes into an XSequenceImpl (they aren't objects, unless we
+ * are handling DOM nodes...)
+ * %REVIEW%
+ * */
+ public boolean isPureNodeSequence()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return (m_pos == -1) ? true : false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return m_unlocked;
+ }
+
+ /** %BUG% Problem here -- to recognize inheritance we need to
+ * reach into the schemas. Currently that can be done by using
+ * the XPathContext (which we ain't got) to query the AbstractSchema
+ * for an XPath2Type (both of which are Xerces-specific and buried
+ * in XNI2DTM) and asking it... We need a higher-level API for that
+ * test.
+ *
+ * %REVIEW% As a stopgap, match literal type name directly.
+ *
+ * @see org.apache.xml.dtm.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ String tns=getTypeNS();
+ String tn=getTypeLocalName();
+ return
+ ((tns==null) ? namespace==null : tns.equals(namespace))
+ &&
+ ((tn==null) ? localname==null : tn.equals(localname))
+ ;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return getLength() <= 1;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ m_pos = i-1;
+ }
+
+ /**
+ * This method performs no actions.
+ * @see org.apache.xml.dtm.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ // Ignore. We always cache.
+ }
+
+ /**
+ * @return true -- setCurrentPos() works for this object
+ * @see org.apache.xml.dtm.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#reset()
+ */
+ public void reset()
+ {
+ m_pos = -1;
+ }
+
+
+ /**
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ /**
+ * Return a (fresh) sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ if(isFresh())
+ return this;
+ try
+ {
+ XSequence xseq = (XSequence)this.clone();
+ xseq.reset();
+ return xseq;
+ }
+ catch (CloneNotSupportedException e)
+ {
+ // will never happen
+ throw new WrappedRuntimeException(e);
+ }
+ }
+
+ /**
+ * Returns the values.
+ * @return Vector
+ */
+ public Vector getValues()
+ {
+ return m_values;
+ }
+
+ /**
+ * Returns the values.
+ * @return Vector
+ */
+ public Object object()
+ {
+ return m_values;
+ }
+
+ /**
+ * Sets the values.
+ * @param values The values to set
+ */
+ public void setValues(Vector values)
+ {
+ this.m_values = values;
+ }
+
+
+ /**
+ * @see org.apache.xpath.objects.XSequenceMutable#getItem(int)
+ */
+ public XObject getItem(int pos)
+ {
+ return (XObject)getValues().elementAt(pos);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequenceMutable#insertItemAt(XObject, int)
+ */
+ public void insertItemAt(XObject value, int pos)
+ {
+ // TBD: Update homogtype?
+ getValues().insertElementAt(value, pos);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequenceMutable#setItem(XObject, int)
+ */
+ public void setItem(XObject value, int pos)
+ {
+ // TBD: Update homogtype?
+ getValues().setElementAt(value, pos);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#isSequenceProper()
+ */
+ public boolean isSequenceProper()
+ {
+ return true;
+ }
+
+}
+
diff --git a/src/org/apache/xpath/objects/XSequenceMutable.java b/src/org/apache/xpath/objects/XSequenceMutable.java
new file mode 100644
index 0000000..8134f5b
--- /dev/null
+++ b/src/org/apache/xpath/objects/XSequenceMutable.java
@@ -0,0 +1,149 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+
+
+/** Interface for constructable version of XSequence.
+ *
+ * Defined in DTM because XSequence is defined her; if the superclass
+ * is moved, this should be moved with it.
+ *
+ * @author keshlam
+ * @since 7/18/02
+ */
+public interface XSequenceMutable extends XSequence
+{
+ /** Add an object to the sequence, along with its Schema-based
+ * datatype. Within the sequence, wrap the object in an XObject.
+ *
+ * @param value Item value to add to the iteration.
+ * @param typeNamespace String containing namespace URI of schema type
+ * @param typeNamespace String containing local name of schema type
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(newval,...);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ * */
+ public XSequenceMutable concat(Object value,String typeNamespace,String typeName);
+
+ /** Add an object to the sequence, along with its
+ * primitive datatype as defined in XType. Within the sequence,
+ * wrap the object in an XObject.
+ * @param value Item value to add to the iteration.
+ * @param xtype Primitive type number, as defined in XType.
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(newval,...);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ * */
+ public XSequenceMutable concat(Object value,int xtype);
+
+ /** Add an XObject to the sequence.
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(newval,...);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ * */
+ public XSequenceMutable concat(XObject value);
+
+ /**
+ * Set the item at the position. For sorting type operations.
+ * @param value An XObject that should not be a sequence with
+ * multiple values.
+ * @param pos The position to set the value, which must be valid.
+ */
+ public void setItem(XObject value, int pos);
+
+ /**
+ * Insert the item at the position. For sorting type operations.
+ * @param value An XObject that should not be a sequence with
+ * multiple values.
+ * @param pos The position to set the value, which must be valid.
+ */
+ public void insertItemAt(XObject value, int pos);
+
+ /**
+ * Convenience method to get the current item.
+ * @param pos
+ */
+ public XObject getItem(int pos);
+
+ /** Append complete contents of another XSequence
+ *
+ * @return Sequence containing old plus new data. IT MAY BE A NEW
+ * OBJECT; user is responsible for always invoking this as
+ * <code>myseq=myseq.concat(newval,...);</code>. However, IT MAY
+ * NOT BE A NEW OBJECT; don't assume that the old sequence will
+ * still be available after this operation returns.
+ * */
+ public XSequenceMutable concat(XSequence other);
+
+
+ /** Prevent further mutation of this sequence. After this has
+ * been called, isMutable should return false.
+ *
+ * @see XSequence.isMutable()
+ * */
+ public void lock();
+}
diff --git a/src/org/apache/xpath/objects/XSequenceSingleton.java b/src/org/apache/xpath/objects/XSequenceSingleton.java
new file mode 100644
index 0000000..18a581e
--- /dev/null
+++ b/src/org/apache/xpath/objects/XSequenceSingleton.java
@@ -0,0 +1,862 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+import java.io.PrintStream;
+import java.net.URL;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.FastStringBuffer;
+import org.apache.xml.utils.QName;
+import org.apache.xml.utils.XMLString;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.NodeSetDTM;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.Token;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.traversal.NodeIterator;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 18, 2002
+ * @author sboag
+ */
+public class XSequenceSingleton extends XObject implements XSequence
+{
+ XObject m_xobject;
+
+ int m_pos = 0;
+
+ /**
+ * Constructor for XSequenceSingleton.
+ * @param obj
+ */
+ public XSequenceSingleton(XObject obj)
+ {
+ m_xobject=obj;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getTypes()
+ */
+ public int getTypes()
+ {
+ return m_xobject.getType();
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#next()
+ */
+ public XObject next()
+ {
+ if(m_pos == 0)
+ {
+ m_pos++;
+ return this;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ if(m_pos == 1)
+ {
+ m_pos--;
+ return this;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ if(m_pos == 0)
+ {
+ return this;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return (m_pos == 0);
+ }
+
+ /**
+ * At this level, assume that the contained type is always an
+ * atomic type.
+ * @see org.apache.xml.dtm.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ return XType.XMLSCHEMA_DATATYPE_NAMESPACE;
+ }
+
+ /**
+ * At this level, assume that the contained type is always an
+ * atomic type.
+ * @see org.apache.xml.dtm.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ if(m_pos != 0)
+ return null;
+ // For now, I'm going to do this ssslllloooowwww.
+ return XType.getLocalNameFromType(m_xobject.getType());
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ String uri = getTypeNS();
+ String thisname = getTypeLocalName();
+ if(null == namespace)
+ return false;
+ return uri.equals(uri) && thisname.equals(localname);
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true; // as far as it goes.
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_pos;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ m_pos = i;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#getLength()
+ */
+ public int getLength()
+ {
+ return (null == m_xobject) ? 0 : 1;
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getType()
+ */
+ public int getType()
+ {
+ if(m_pos != 0)
+ return XType.SEQ;
+ return m_xobject.getType();
+ }
+
+ /**
+ * @see org.apache.xml.dtm.XSequence#isPureNodeSequence()
+ */
+ public boolean isPureNodeSequence()
+ {
+ return false;
+ }
+
+ /**
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#allowDetachToRelease(boolean)
+ */
+ public void allowDetachToRelease(boolean allowRelease)
+ {
+ m_xobject.allowDetachToRelease(allowRelease);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#appendToFsb(FastStringBuffer)
+ */
+ public void appendToFsb(FastStringBuffer fsb)
+ {
+ m_xobject.appendToFsb(fsb);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#bool()
+ */
+ public boolean bool() throws TransformerException
+ {
+ return m_xobject.bool();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#boolWithSideEffects()
+ */
+ public boolean boolWithSideEffects() throws TransformerException
+ {
+ return m_xobject.boolWithSideEffects();
+ }
+
+ /**
+ * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ m_xobject.callVisitors(owner, visitor);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#castToType(int, XPathContext)
+ */
+ public Object castToType(int t, XPathContext support)
+ throws TransformerException
+ {
+ return m_xobject.castToType(t, support);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return m_xobject.deepEquals(expr);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#destruct()
+ */
+ public void destruct()
+ {
+ m_xobject.destruct();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#detach()
+ */
+ public void detach()
+ {
+ m_xobject.detach();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#dispatchCharactersEvents(ContentHandler)
+ */
+ public void dispatchCharactersEvents(ContentHandler ch) throws SAXException
+ {
+ m_xobject.dispatchCharactersEvents(ch);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#equals(XObject)
+ */
+ public boolean equals(XObject obj2)
+ {
+ return m_xobject.equals(obj2);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#error(int, Object[])
+ */
+ protected void error(int msg, Object[] args) throws TransformerException
+ {
+ m_xobject.error(msg, args);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#error(int)
+ */
+ protected void error(int msg) throws TransformerException
+ {
+ m_xobject.error(msg);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return m_xobject.execute(xctxt);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#fixupVariables(VariableComposeState)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ m_xobject.fixupVariables(vcs);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getFresh()
+ */
+ public XObject getFresh()
+ {
+ return m_xobject.getFresh();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#getTypeString()
+ */
+ public String getTypeString()
+ {
+ return m_xobject.getTypeString();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#greaterThan(XObject)
+ */
+ public boolean greaterThan(XObject obj2) throws TransformerException
+ {
+ return m_xobject.greaterThan(obj2);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#greaterThanOrEqual(XObject)
+ */
+ public boolean greaterThanOrEqual(XObject obj2) throws TransformerException
+ {
+ return m_xobject.greaterThanOrEqual(obj2);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#isPathExprReduced()
+ */
+ public boolean isPathExprReduced()
+ {
+ return m_xobject.isPathExprReduced();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#iter()
+ */
+ public DTMIterator iter() throws TransformerException
+ {
+ return m_xobject.iter();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#lessThan(XObject)
+ */
+ public boolean lessThan(XObject obj2) throws TransformerException
+ {
+ return m_xobject.lessThan(obj2);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#lessThanOrEqual(XObject)
+ */
+ public boolean lessThanOrEqual(XObject obj2) throws TransformerException
+ {
+ return m_xobject.lessThanOrEqual(obj2);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#mutableNodeset()
+ */
+ public NodeSetDTM mutableNodeset() throws TransformerException
+ {
+ return m_xobject.mutableNodeset();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#nodelist()
+ */
+ public NodeList nodelist() throws TransformerException
+ {
+ return m_xobject.nodelist();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#nodeset()
+ */
+ public NodeIterator nodeset() throws TransformerException
+ {
+ return m_xobject.nodeset();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#notEquals(XObject)
+ */
+ public boolean notEquals(XObject obj2) throws TransformerException
+ {
+ return m_xobject.notEquals(obj2);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#num()
+ */
+ public double num() throws TransformerException
+ {
+ return m_xobject.num();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#numWithSideEffects()
+ */
+ public double numWithSideEffects() throws TransformerException
+ {
+ return m_xobject.numWithSideEffects();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#object()
+ */
+ public Object object()
+ {
+ return m_xobject.object();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#reset()
+ */
+ public void reset()
+ {
+ m_xobject.reset();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#rtf()
+ */
+ public int rtf()
+ {
+ return m_xobject.rtf();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#rtf(XPathContext)
+ */
+ public int rtf(XPathContext support)
+ {
+ return m_xobject.rtf(support);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#rtree()
+ */
+ public DocumentFragment rtree()
+ {
+ return m_xobject.rtree();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#rtree(XPathContext)
+ */
+ public DocumentFragment rtree(XPathContext support)
+ {
+ return m_xobject.rtree(support);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#str()
+ */
+ public String str()
+ {
+ return m_xobject.str();
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return m_xobject.toString();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#xseq()
+ */
+ public XSequence xseq()
+ {
+ return m_xobject.xseq();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#xstr()
+ */
+ public XMLString xstr()
+ {
+ return m_xobject.xstr();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#asIterator(XPathContext, int)
+ */
+ public DTMIterator asIterator(XPathContext xctxt, int contextNode)
+ throws TransformerException
+ {
+ return m_xobject.asIterator(xctxt, contextNode);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#asIteratorRaw(XPathContext, int)
+ */
+ public DTMIterator asIteratorRaw(XPathContext xctxt, int contextNode)
+ throws TransformerException
+ {
+ return m_xobject.asIteratorRaw(xctxt, contextNode);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#asNode(XPathContext)
+ */
+ public int asNode(XPathContext xctxt) throws TransformerException
+ {
+ return m_xobject.asNode(xctxt);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#assertion(boolean, String)
+ */
+ public void assertion(boolean b, String msg)
+ {
+ m_xobject.assertion(b, msg);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#bool(XPathContext)
+ */
+ public boolean bool(XPathContext xctxt) throws TransformerException
+ {
+ return m_xobject.bool(xctxt);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#canTraverseOutsideSubtree()
+ */
+ public boolean canTraverseOutsideSubtree()
+ {
+ return m_xobject.canTraverseOutsideSubtree();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#cloneDeep()
+ */
+ public Object cloneDeep() throws CloneNotSupportedException
+ {
+ return m_xobject.cloneDeep();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#error(XPathContext, int, Object[])
+ */
+ public void error(XPathContext xctxt, int msg, Object[] args)
+ throws TransformerException
+ {
+ m_xobject.error(xctxt, msg, args);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#execute(XPathContext, boolean)
+ */
+ public XObject execute(XPathContext xctxt, boolean destructiveOK)
+ throws TransformerException
+ {
+ return m_xobject.execute(xctxt, destructiveOK);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#execute(XPathContext, int, DTM, int)
+ */
+ public XObject execute(
+ XPathContext xctxt,
+ int currentNode,
+ DTM dtm,
+ int expType)
+ throws TransformerException
+ {
+ return m_xobject.execute(xctxt, currentNode, dtm, expType);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#execute(XPathContext, int)
+ */
+ public XObject execute(XPathContext xctxt, int currentNode)
+ throws TransformerException
+ {
+ return m_xobject.execute(xctxt, currentNode);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#executeCharsToContentHandler(XPathContext, ContentHandler)
+ */
+ public void executeCharsToContentHandler(
+ XPathContext xctxt,
+ ContentHandler handler)
+ throws TransformerException, SAXException
+ {
+ m_xobject.executeCharsToContentHandler(xctxt, handler);
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprAddChild(ExpressionNode, int)
+ */
+ public void exprAddChild(ExpressionNode n, int i)
+ {
+ m_xobject.exprAddChild(n, i);
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprGetChild(int)
+ */
+ public ExpressionNode exprGetChild(int i)
+ {
+ return m_xobject.exprGetChild(i);
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprGetNumChildren()
+ */
+ public int exprGetNumChildren()
+ {
+ return m_xobject.exprGetNumChildren();
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprGetParent()
+ */
+ public ExpressionNode exprGetParent()
+ {
+ return m_xobject.exprGetParent();
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprSetParent(ExpressionNode)
+ */
+ public void exprSetParent(ExpressionNode n)
+ {
+ m_xobject.exprSetParent(n);
+ }
+
+ /**
+ * @see javax.xml.transform.SourceLocator#getColumnNumber()
+ */
+ public int getColumnNumber()
+ {
+ return m_xobject.getColumnNumber();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#getExpressionOwner()
+ */
+ public ExpressionNode getExpressionOwner()
+ {
+ return m_xobject.getExpressionOwner();
+ }
+
+ /**
+ * @see javax.xml.transform.SourceLocator#getLineNumber()
+ */
+ public int getLineNumber()
+ {
+ return m_xobject.getLineNumber();
+ }
+
+ /**
+ * @see javax.xml.transform.SourceLocator#getPublicId()
+ */
+ public String getPublicId()
+ {
+ return m_xobject.getPublicId();
+ }
+
+ /**
+ * @see javax.xml.transform.SourceLocator#getSystemId()
+ */
+ public String getSystemId()
+ {
+ return m_xobject.getSystemId();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#isNodesetExpr()
+ */
+ public boolean isNodesetExpr()
+ {
+ return m_xobject.isNodesetExpr();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#isStableNumber()
+ */
+ public boolean isStableNumber()
+ {
+ return m_xobject.isStableNumber();
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#num(XPathContext)
+ */
+ public double num(XPathContext xctxt) throws TransformerException
+ {
+ return m_xobject.num(xctxt);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#warn(XPathContext, int, Object[])
+ */
+ public void warn(XPathContext xctxt, int msg, Object[] args)
+ throws TransformerException
+ {
+ m_xobject.warn(xctxt, msg, args);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#xstr(XPathContext)
+ */
+ public XMLString xstr(XPathContext xctxt) throws TransformerException
+ {
+ return m_xobject.xstr(xctxt);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#dump(String, PrintStream)
+ */
+ public void dump(String prefix, PrintStream ps)
+ {
+ m_xobject.dump(prefix, ps);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#dump(String)
+ */
+ public void dump(String prefix)
+ {
+ m_xobject.dump(prefix);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#toString(String)
+ */
+ public String toString(String prefix)
+ {
+ return m_xobject.toString(prefix);
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return m_xobject.hashCode();
+ }
+
+ /**
+ * @see java.lang.Object#equals(Object)
+ */
+ public boolean equals(Object arg0)
+ {
+ return m_xobject.equals(arg0);
+ }
+
+}
diff --git a/src/org/apache/xpath/objects/XString.java b/src/org/apache/xpath/objects/XString.java
index 5bc70f1..70a5458 100644
--- a/src/org/apache/xpath/objects/XString.java
+++ b/src/org/apache/xpath/objects/XString.java
@@ -60,15 +60,14 @@
import java.util.Locale;
import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.XType;
import org.apache.xml.utils.XMLCharacterRecognizer;
import org.apache.xml.utils.XMLString;
import org.apache.xml.utils.XMLStringFactory;
import org.apache.xpath.ExpressionOwner;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.ext.LexicalHandler;
+import org.apache.xpath.parser.Token;
/**
* <meta name="usage" content="general"/>
@@ -77,19 +76,38 @@
*/
public class XString extends XObject implements XMLString
{
+ /** Java String object representing this XString.
+ * Note that this field is also used as a cache by
+ * XString's subclasses
+ * */
+ protected String m_stringValue=null;
/** Empty string XString object */
public static XString EMPTYSTRING = new XString("");
+
+ /**
+ * Construct a XString object, with a null value.
+ *
+ * This one's actually being used, unlike most XObject empty ctors,
+ * because it may be created and _then_ set (by processToken)
+ * during stylesheet parsing.
+ */
+ public XString()
+ {
+ }
+
/**
* Construct a XString object. This constructor exists for derived classes.
*
* @param val String object this will wrap.
*/
+ /*
protected XString(Object val)
{
super(val);
}
+ */
/**
* Construct a XNodeSet object.
@@ -98,8 +116,18 @@
*/
public XString(String val)
{
- super(val);
+ m_stringValue=val;
}
+
+ /**
+ * Return the sequence representing this object.
+ * @return XSequence
+ */
+ public XSequence xseq()
+ {
+ return new XSequenceSingleton(this);
+ }
+
/**
* Tell that this is a CLASS_STRING.
@@ -131,6 +159,11 @@
{
return true;
}
+
+ public Object object()
+ {
+ return m_stringValue; // str()?
+ }
/**
* Cast result object to a number.
@@ -271,7 +304,17 @@
*/
public String str()
{
- return (null != m_obj) ? ((String) m_obj) : "";
+ // Should this actively replace null with ""?
+ return (m_stringValue==null) ? "" : m_stringValue;
+ }
+
+ /** Yield result object's string value as a sequence of Character Blocks
+ * @return a CharacterBlockEnumeration displaying the contents of
+ * this object's string value (as in str()). May be empty.
+ * */
+ public org.apache.xml.utils.CharacterBlockEnumeration enumerateCharacterBlocks()
+ {
+ return new org.apache.xml.utils.CharacterBlockEnumeration(str());
}
/**
@@ -402,8 +445,8 @@
int t = obj2.getType();
try
{
- if (XObject.CLASS_NODESET == t)
- return obj2.equals(this);
+ if (obj2.isNodesetExpr())
+ return ((XNodeSet)obj2).equalsExistential(this);
// If at least one object to be compared is a boolean, then each object
// to be compared is converted to a boolean as if by applying the
// boolean function.
@@ -471,7 +514,7 @@
// nodeset comparisons, we always call the
// nodeset function.
else if (obj2 instanceof XNodeSet)
- return obj2.equals(this);
+ return ((XNodeSet)obj2).equalsExistential(this);
else if(obj2 instanceof XNumber)
return obj2.equals(this);
else
@@ -1207,5 +1250,25 @@
{
visitor.visitStringLiteral(owner, this);
}
+
+ public void processToken(Token t)
+ {
+ int strLen = t.image.length();
+
+ if(strLen >= 2)
+ {
+ assertion(t.image.charAt(0) == '"' || t.image.charAt(0) == '\'',
+ "First character of string literal must be a quote or apos!");
+ assertion(t.image.charAt(strLen-1) == '"' || t.image.charAt(strLen-1) == '\'',
+ "Last character of string literal must be a quote or apos!");
+ m_stringValue = t.image.substring(1, strLen-1);
+ }
+ else
+ {
+ m_stringValue = "";
+ }
+
+ }
+
}
diff --git a/src/org/apache/xpath/objects/XStringForChars.java b/src/org/apache/xpath/objects/XStringForChars.java
index 8904b78..5c797ab 100644
--- a/src/org/apache/xpath/objects/XStringForChars.java
+++ b/src/org/apache/xpath/objects/XStringForChars.java
@@ -16,14 +16,15 @@
*/
public class XStringForChars extends XString
{
- /** The start position in the fsb. */
+ /** Pointer to the block containing this string */
+ char[] m_chars;
+
+ /** The start position in the character array. */
int m_start;
/** The length of the string. */
int m_length;
- protected String m_strCache = null;
-
/**
* Construct a XNodeSet object.
*
@@ -33,26 +34,28 @@
*/
public XStringForChars(char[] val, int start, int length)
{
- super(val);
- m_start = start;
- m_length = length;
if(null == val)
throw new IllegalArgumentException(
XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FASTSTRINGBUFFER_CANNOT_BE_NULL, null)); //"The FastStringBuffer argument can not be null!!");
+ m_chars=val;
+ m_start = start;
+ m_length = length;
}
/**
- * Construct a XNodeSet object.
+ * Block inherited constructor. (DO ctors inherit?)
*
* @param val String object this will wrap.
*/
+ /*
private XStringForChars(String val)
{
super(val);
throw new IllegalArgumentException(
XSLMessages.createXPATHMessage(XPATHErrorResources.ER_XSTRINGFORCHARS_CANNOT_TAKE_STRING, null)); //"XStringForChars can not take a string for an argument!");
}
+ */
/**
* Cast result object to a string.
@@ -71,7 +74,7 @@
*/
public void appendToFsb(org.apache.xml.utils.FastStringBuffer fsb)
{
- fsb.append((char[])m_obj, m_start, m_length);
+ fsb.append(m_chars, m_start, m_length);
}
@@ -82,7 +85,7 @@
*/
public boolean hasString()
{
- return (null != m_strCache);
+ return (null != m_stringValue);
}
@@ -93,13 +96,23 @@
*/
public String str()
{
- if(null == m_strCache)
- m_strCache = new String((char[])m_obj, m_start, m_length);
+ if(null == m_stringValue)
+ m_stringValue = new String(m_chars, m_start, m_length);
- return m_strCache;
+ return m_stringValue;
}
+ /** Yield result object's string value as a sequence of Character Blocks
+ * @return a CharacterBlockEnumeration displaying the contents of
+ * this object's string value (as in str()). May be empty.
+ * */
+ public org.apache.xml.utils.CharacterBlockEnumeration enumerateCharacterBlocks()
+ {
+ return new org.apache.xml.utils.CharacterBlockEnumeration(
+ m_chars, m_start, m_length);
+ }
+
/**
* Since this object is incomplete without the length and the offset, we
* have to convert to a string when this function is called.
@@ -125,7 +138,7 @@
public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
throws org.xml.sax.SAXException
{
- ch.characters((char[])m_obj, m_start, m_length);
+ ch.characters(m_chars, m_start, m_length);
}
/**
@@ -140,7 +153,7 @@
public void dispatchAsComment(org.xml.sax.ext.LexicalHandler lh)
throws org.xml.sax.SAXException
{
- lh.comment((char[])m_obj, m_start, m_length);
+ lh.comment(m_chars, m_start, m_length);
}
/**
@@ -169,7 +182,7 @@
*/
public char charAt(int index)
{
- return ((char[])m_obj)[index+m_start];
+ return (m_chars)[index+m_start];
}
/**
@@ -195,7 +208,7 @@
*/
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
{
- System.arraycopy((char[])m_obj, m_start+srcBegin, dst, dstBegin, srcEnd);
+ System.arraycopy(m_chars, m_start+srcBegin, dst, dstBegin, srcEnd);
}
}
\ No newline at end of file
diff --git a/src/org/apache/xpath/objects/XStringForFSB.java b/src/org/apache/xpath/objects/XStringForFSB.java
index 56cf68b..b3c7cc4 100644
--- a/src/org/apache/xpath/objects/XStringForFSB.java
+++ b/src/org/apache/xpath/objects/XStringForFSB.java
@@ -61,9 +61,6 @@
import org.apache.xml.utils.XMLStringFactory;
import org.apache.xml.utils.XMLCharacterRecognizer;
-import org.apache.xpath.res.XPATHErrorResources;
-import org.apache.xalan.res.XSLMessages;
-
import java.util.Locale;
/**
@@ -71,6 +68,7 @@
*/
public class XStringForFSB extends XString
{
+ FastStringBuffer m_fsb;
/** The start position in the fsb. */
int m_start;
@@ -78,9 +76,6 @@
/** The length of the string. */
int m_length;
- /** If the str() function is called, the string will be cached here. */
- protected String m_strCache = null;
-
/** cached hash code */
protected int m_hash = 0;
@@ -93,30 +88,30 @@
*/
public XStringForFSB(FastStringBuffer val, int start, int length)
{
-
- super(val);
-
- m_start = start;
- m_length = length;
-
if (null == val)
throw new IllegalArgumentException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FASTSTRINGBUFFER_CANNOT_BE_NULL, null));
+ "The FastStringBuffer argument can not be null!!");
+
+ m_fsb=val;
+ m_start = start;
+ m_length = length;
}
/**
- * Construct a XNodeSet object.
+ * Block inherited ctor. (DO ctors inherit?)
*
* @param val String object this will wrap.
*/
+ /*
private XStringForFSB(String val)
{
super(val);
throw new IllegalArgumentException(
- XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FSB_CANNOT_TAKE_STRING, null)); // "XStringForFSB can not take a string for an argument!");
+ "XStringForFSB can not take a string for an argument!");
}
+ */
/**
* Cast result object to a string.
@@ -125,7 +120,7 @@
*/
public FastStringBuffer fsb()
{
- return ((FastStringBuffer) m_obj);
+ return (m_fsb);
}
/**
@@ -146,15 +141,9 @@
*/
public boolean hasString()
{
- return (null != m_strCache);
+ return (null != m_stringValue);
}
-// /** NEEDSDOC Field strCount */
-// public static int strCount = 0;
-//
-// /** NEEDSDOC Field xtable */
-// static java.util.Hashtable xtable = new java.util.Hashtable();
-
/**
* Since this object is incomplete without the length and the offset, we
* have to convert to a string when this function is called.
@@ -174,9 +163,9 @@
public String str()
{
- if (null == m_strCache)
+ if (null == m_stringValue)
{
- m_strCache = fsb().getString(m_start, m_length);
+ m_stringValue = fsb().getString(m_start, m_length);
// strCount++;
//
@@ -202,8 +191,26 @@
// System.exit(-1);
}
- return m_strCache;
+ return m_stringValue;
}
+
+ /** Yield result object's string value as a sequence of Character Blocks
+ * @return a CharacterBlockEnumeration displaying the contents of
+ * this object's string value (as in str()). May be empty, may
+ * yield multiple blocks depending on the FSB's contents. (The latter
+ * case is why we need to enumerate, of course!)
+ * */
+ public org.apache.xml.utils.CharacterBlockEnumeration enumerateCharacterBlocks()
+ {
+ // %REVIEW% %OPT% I'm not sure this is an optimization. Depends on
+ // how retrieval of char[] from String works in any given JVM.
+ // See comments in CharacterBlockEnumeration, and run some tests.
+ if (null != m_stringValue)
+ return new org.apache.xml.utils.CharacterBlockEnumeration(m_stringValue);
+ else
+ return fsb().enumerateCharacterBlocks(m_start,m_length);
+ }
+
/**
* Directly call the
@@ -375,7 +382,7 @@
return true;
}
if(obj2.getType() == XObject.CLASS_NUMBER)
- return obj2.equals(this);
+ return ((XNodeSet)obj2).equalsExistential(this);
String str = obj2.str();
int n = m_length;
@@ -470,7 +477,7 @@
// nodeset comparisons, we always call the
// nodeset function.
else if (obj2 instanceof XNodeSet)
- return obj2.equals(this);
+ return ((XNodeSet)obj2).equalsExistential(this);
else if (obj2 instanceof XStringForFSB)
return equals((XMLString) this);
else
@@ -698,6 +705,7 @@
return startsWith(prefix, 0);
}
+
/**
* Returns the index within this string of the first occurrence of the
* specified character. If a character with value <code>ch</code> occurs
diff --git a/src/org/apache/xpath/objects/XTime.java b/src/org/apache/xpath/objects/XTime.java
new file mode 100644
index 0000000..66be74f
--- /dev/null
+++ b/src/org/apache/xpath/objects/XTime.java
@@ -0,0 +1,185 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xpath.res.XPATHErrorResources;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XTime extends XDateTime
+{
+
+ /**
+ * Construct a XDate object, with a null value.
+ */
+ public XTime()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XTime(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XTime(String val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val DateTimeObj object this will wrap.
+ */
+ public XTime(DateTimeObj val)
+ {
+ super(val);
+ }
+
+
+ /**
+ * Tell that this is a CLASS_DATE.
+ *
+ * @return type CLASS_DATE
+ */
+ public int getType()
+ {
+ return CLASS_TIME;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DATE"
+ */
+ public String getTypeString()
+ {
+ return "#TIME";
+ }
+
+
+
+
+
+ /**
+ * Cast result object to a string.
+ *
+ * @return The string this wraps or the empty string if null
+ */
+ public String str()
+ {
+ return super.str();
+ /*
+ if (m_obj!= null)
+ {
+ if (m_obj instanceof Date)
+ {
+ Date date = (Date) m_obj;
+ SimpleDateFormat dateFormat = new SimpleDateFormat(DateTimeObj.t1);
+ return dateFormat.format(date);
+ }
+ else if (m_obj instanceof DateTimeObj)
+ return ((DateTimeObj)m_obj).toString();
+ else if(m_obj instanceof String)
+ return (String)m_obj;
+ }
+ return "";
+ */
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#datetime()
+ */
+ public DateTimeObj datetime() throws TransformerException
+ {
+ error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
+ new Object[]{ getTypeString(), "DATETIME" }); //"Can not convert "+getTypeString()+" to a number");
+
+ return new DateTimeObj(""); // To shut up compiler
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#date()
+ */
+ public DateTimeObj time() throws TransformerException
+ {
+ return m_val;
+ }
+
+
+
+}
diff --git a/src/org/apache/xpath/objects/XYMDuration.java b/src/org/apache/xpath/objects/XYMDuration.java
new file mode 100644
index 0000000..514f448
--- /dev/null
+++ b/src/org/apache/xpath/objects/XYMDuration.java
@@ -0,0 +1,278 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.objects;
+
+//import org.w3c.dom.*;
+import java.util.Locale;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat;
+import java.text.ParseException;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.utils.CharacterBlockEnumeration;
+import org.apache.xml.utils.XMLCharacterRecognizer;
+import org.apache.xml.utils.XMLString;
+import org.apache.xml.utils.XMLStringFactory;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.parser.Token;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * <meta name="usage" content="general"/>
+ * This class represents an XPath string object, and is capable of
+ * converting the string to other types, such as a number.
+ */
+public class XYMDuration extends XDuration
+{
+
+ /** Empty string XString object */
+ public static XString EMPTYSTRING = new XString("");
+
+ /**
+ * Construct a XDate object, with a null value.
+ * This one's actually being used, unlike most XObject empty ctors
+ * ... but I'm not sure why; it's equivalent to passing in null.
+ */
+ public XYMDuration()
+ {
+ super();
+ }
+
+
+ /**
+ * Construct a XDate object. This constructor exists for derived classes.
+ *
+ * @param val Date object this will wrap.
+ */
+ //protected XDuration(Object val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ //public XDuration(String val)
+ //{
+ // super(val);
+ //}
+
+ /**
+ * Construct a XDate object.
+ *
+ * @param val String object this will wrap.
+ */
+ public XYMDuration(Duration val)
+ {
+ //super(val);
+ m_val = val;
+ }
+
+
+ /**
+ * Tell that this is a CLASS_DURATION.
+ *
+ * @return type CLASS_DURATION
+ */
+ public int getType()
+ {
+ return this.CLASS_YMDURATION;
+ }
+
+ /**
+ * Given a request type, return the equivalent string.
+ * For diagnostic purposes.
+ *
+ * @return type string "#DURATION"
+ */
+ public String getTypeString()
+ {
+ return "#YEARMONTHDURATION";
+ }
+
+
+ /**
+ * Tell if two objects are functionally equal.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return true if the two objects are equal
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean equals(XObject obj2)
+ {
+
+ // In order to handle the 'all' semantics of
+ // nodeset comparisons, we always call the
+ // nodeset function.
+ int t = obj2.getType();
+ if(XObject.CLASS_YMDURATION == t)
+ return m_val.YMEqual(((XDuration)obj2).m_val);
+
+
+ // Otherwise, both objects to be compared are converted to strings as
+ // if by applying the string function.
+ return xstr().equals(obj2.xstr());
+ }
+
+ /**
+ * Tell if one object is less than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_YMDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.YMLessThan(du);
+ }
+ else
+ return this.num() < obj2.num();
+ }
+
+ /**
+ * Tell if one object is less than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is less than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean lessThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_YMDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.YMLessThanOrEqual(du);
+ }
+ else
+ return this.num() <= obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThan(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+ int t = obj2.getType();
+ if(XObject.CLASS_YMDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.YMGreaterThan(du);
+ }
+ else
+ return this.num() > obj2.num();
+ }
+
+
+ /**
+ * Tell if one object is greater than or equal to the other.
+ *
+ * @param obj2 Object to compare this to
+ *
+ * @return True if this object is greater than or equal to the given object
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean greaterThanOrEqual(XObject obj2)
+ throws javax.xml.transform.TransformerException
+ {
+
+ int t = obj2.getType();
+ if(XObject.CLASS_YMDURATION == t)
+ {
+ Duration du = ((XDuration)obj2).m_val;
+ return m_val.YMGreaterThanOrEqual(du);
+ }
+ else
+ return this.num() >= obj2.num();
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/Add.java b/src/org/apache/xpath/operations/Add.java
new file mode 100644
index 0000000..3e1c1a6
--- /dev/null
+++ b/src/org/apache/xpath/operations/Add.java
@@ -0,0 +1,274 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDate;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xpath.objects.XFloat;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XTime;
+
+/**
+ * The '+' operation expression executer.
+ */
+public class Add extends OperationNormalized
+{
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XDouble(lhs.num() + rhs.num());
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XFloat(lhs.floatVal() + rhs.floatVal());
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XInteger(lhs.integer() + rhs.integer());
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration1 = lhs.duration();
+ // The normalizer should make sure the second argument is always
+ // a duration!
+ Duration duration2 = rhs.duration();
+ Duration du = duration1.addDTDuration(duration2);
+ return new XDuration(du);
+ }
+ });
+ m_funcs.setFunc(XType.DAYTIMEDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration1 = lhs.duration();
+ int rhsVT = rhs.getValueType();
+ if(XType.DATETIME == rhsVT || XType.DATE == rhsVT)
+ {
+ DateTimeObj dt = rhs.datetime();
+ DateTimeObj dateTime = dt.addDTDurationToDateTime(duration1);
+ return new XDateTime(dateTime);
+ }
+ if(XType.DATE == rhsVT)
+ {
+ DateTimeObj dt = rhs.date();
+ DateTimeObj dateTime = dt.addDTDurationToDate(duration1);
+ return new XDateTime(dateTime);
+ }
+ if(XType.TIME == rhsVT)
+ {
+ DateTimeObj dt = rhs.time();
+ DateTimeObj dateTime = dt.addDTDurationToTime(duration1);
+ return new XDateTime(dateTime);
+ }
+ else
+ {
+ // The normalizer should make sure the second argument is always
+ // a duration!
+ Duration duration2 = rhs.duration();
+ Duration du = duration1.addDTDuration(duration2);
+ return new XDuration(du);
+ }
+ }
+ });
+ m_funcs.setFunc(XType.YEARMONTHDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration1 = lhs.duration();
+ int rhsVT = rhs.getValueType();
+ if(XType.DATETIME == rhsVT || XType.DATE == rhsVT)
+ {
+ DateTimeObj dt = rhs.datetime();
+ DateTimeObj dateTime = dt.addYMDurationToDateTime(duration1);
+ return new XDateTime(dateTime);
+ }
+ if(XType.DATE == rhsVT)
+ {
+ DateTimeObj dt = rhs.date();
+ DateTimeObj dateTime = dt.addYMDurationToDate(duration1);
+ return new XDateTime(dateTime);
+ }
+ else
+ {
+ // The normalizer should make sure the second argument is always
+ // a duration!
+ Duration duration2 = rhs.duration();
+ Duration du = duration1.addYMDuration(duration2);
+ return new XDuration(du);
+ }
+ }
+ });
+
+ m_funcs.setFunc(XType.DATETIME, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ DateTimeObj dt = lhs.datetime();
+ int rhsVT = rhs.getValueType();
+ if(XType.DURATION == rhsVT)
+ {
+ // The normalizer should
+ Duration duration2 = rhs.duration();
+ DateTimeObj du = dt.addYMDurationToDateTime(duration2);
+ du = du.addDTDurationToDateTime(duration2);
+ return new XDateTime(du);
+ }
+ if( XType.DAYTIMEDURATION == rhsVT)
+ {
+ // The normalizer should
+ Duration duration2 = rhs.duration();
+ DateTimeObj du = dt.addDTDurationToDateTime(duration2);
+ return new XDateTime(du);
+ }
+ else //if(XType.YEARMONTHDURATION == rhsVT)
+ {
+ Duration duration2 = rhs.duration();
+ DateTimeObj du = dt.addYMDurationToDateTime(duration2);
+ return new XDateTime(du);
+ }
+ }
+ });
+ m_funcs.setFunc(XType.TIME, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ DateTimeObj oldTime = lhs.time();
+ // The normalizer should
+ Duration duration2 = rhs.duration();
+ DateTimeObj newTime = oldTime.addDTDurationToTime(duration2);
+ return new XTime(newTime);
+ }
+ });
+ m_funcs.setFunc(XType.DATE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ DateTimeObj dt = lhs.date();
+ int rhsVT = rhs.getValueType();
+ if(XType.DURATION == rhsVT
+ || XType.DAYTIMEDURATION == rhsVT)
+ {
+ // The normalizer should
+ Duration duration2 = rhs.duration();
+ DateTimeObj newDate = dt.addDTDurationToDate(duration2);
+ return new XDate(newDate);
+ }
+ else //if(XType.YEARMONTHDURATION == rhsVT)
+ {
+ Duration duration2 = rhs.duration();
+ DateTimeObj newDate = dt.addYMDurationToDate(duration2);
+ return new XDate(newDate);
+ }
+ }
+ });
+ m_funcs.setFunc(XType.GYEARMONTH, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEAR, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTHDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTH, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.BOOLEAN, NOTSUPPORTED);
+ m_funcs.setFunc(XType.STRING, NOTSUPPORTED);
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/And.java b/src/org/apache/xpath/operations/And.java
index 51cb3f8..4bf00c3 100644
--- a/src/org/apache/xpath/operations/And.java
+++ b/src/org/apache/xpath/operations/And.java
@@ -69,7 +69,6 @@
*/
public class And extends Operation
{
-
/**
* AND two expressions and return the boolean result. Override
* superclass method for optimization purposes.
@@ -83,7 +82,6 @@
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
{
-
XObject expr1 = m_left.execute(xctxt);
if (expr1.bool())
diff --git a/src/org/apache/xpath/operations/Div.java b/src/org/apache/xpath/operations/Div.java
index 58e857f..fd637dc 100644
--- a/src/org/apache/xpath/operations/Div.java
+++ b/src/org/apache/xpath/operations/Div.java
@@ -56,47 +56,102 @@
*/
package org.apache.xpath.operations;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XFloat;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XYMDuration;
+import org.apache.xpath.objects.XDTDuration;
+import org.apache.xml.utils.Duration;
/**
* The 'div' operation expression executer.
*/
-public class Div extends Operation
+public class Div extends OperationNormalized
{
-
- /**
- * Apply the operation to two operands, and return the result.
- *
- *
- * @param left non-null reference to the evaluated left operand.
- * @param right non-null reference to the evaluated right operand.
- *
- * @return non-null reference to the XObject that represents the result of the operation.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject operate(XObject left, XObject right)
- throws javax.xml.transform.TransformerException
+ static OpFuncLookupTable m_funcs;
{
- return new XNumber(left.num() / right.num());
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XDouble(lhs.num() / rhs.num());
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XFloat(lhs.floatVal() / rhs.floatVal());
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XInteger(lhs.integer() / rhs.integer());
+ }
+ });
+ m_funcs.setFunc(XType.DAYTIMEDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration = lhs.duration();
+ Duration du = duration.divideDTDuration(rhs.num());
+
+ return new XDTDuration(du);
+ }
+ });
+ m_funcs.setFunc(XType.YEARMONTHDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration = lhs.duration();
+ Duration du = duration.divideYMDuration(rhs.num());
+
+ return new XYMDuration(du);
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DURATION, NOTSUPPORTED);
+ // m_funcs.setFunc(XType.DAYTIMEDURATION, NOTSUPPORTED);
+ // m_funcs.setFunc(XType.YEARMONTHDURATION, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DATETIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.TIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.DATE, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEARMONTH, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEAR, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTHDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTH, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.BOOLEAN, NOTSUPPORTED);
+ m_funcs.setFunc(XType.STRING, NOTSUPPORTED);
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
}
/**
- * Evaluate this operation directly to a double.
- *
- * @param xctxt The runtime execution context.
- *
- * @return The result of the operation as a double.
- *
- * @throws javax.xml.transform.TransformerException
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
*/
- public double num(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
+ public OpFuncLookupTable getLookupTable()
{
-
- return (m_left.num(xctxt) / m_right.num(xctxt));
+ return m_funcs;
}
}
diff --git a/src/org/apache/xpath/operations/Equals.java b/src/org/apache/xpath/operations/Equals.java
index ca5250b..2278985 100644
--- a/src/org/apache/xpath/operations/Equals.java
+++ b/src/org/apache/xpath/operations/Equals.java
@@ -56,7 +56,6 @@
*/
package org.apache.xpath.operations;
-import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XBoolean;
import org.apache.xpath.objects.XObject;
@@ -64,9 +63,8 @@
/**
* The '=' operation expression executer.
*/
-public class Equals extends Operation
+public class Equals extends OperationSimple
{
-
/**
* Apply the operation to two operands, and return the result.
*
@@ -81,7 +79,7 @@
public XObject operate(XObject left, XObject right)
throws javax.xml.transform.TransformerException
{
- return left.equals(right) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ return left.equalsExistential(right) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
}
/**
@@ -96,14 +94,14 @@
* @throws javax.xml.transform.TransformerException
*/
public boolean bool(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
+ throws javax.xml.transform.TransformerException
{
XObject left = m_left.execute(xctxt, true);
XObject right = m_right.execute(xctxt, true);
- boolean result = left.equals(right) ? true : false;
- left.detach();
- right.detach();
+ boolean result = left.equalsExistential(right) ? true : false;
+ left.detach();
+ right.detach();
return result;
}
diff --git a/src/org/apache/xpath/operations/Follows.java b/src/org/apache/xpath/operations/Follows.java
new file mode 100644
index 0000000..9264534
--- /dev/null
+++ b/src/org/apache/xpath/operations/Follows.java
@@ -0,0 +1,83 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XBoolean;
+
+/**
+ * The '!=' operation expression executer.
+ */
+public class Follows extends OperationSimple
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException
+ {
+ throw new javax.xml.transform.TransformerException("'Follows' not yet implemented!", this);
+ }
+}
diff --git a/src/org/apache/xpath/operations/FortranEq.java b/src/org/apache/xpath/operations/FortranEq.java
new file mode 100644
index 0000000..4c77cdf
--- /dev/null
+++ b/src/org/apache/xpath/operations/FortranEq.java
@@ -0,0 +1,148 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XDate;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XTime;
+
+/**
+ * The 'eq' operation expression executer.
+ */
+public class FortranEq extends OperationNormalized
+{
+ static GenericOpFunc IsEqualObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ return lhs.equals(rhs) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() == rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.floatVal() == rhs.floatVal()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.integer() == rhs.integer()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, IsEqualObj);
+
+ m_funcs.setFunc(XType.DURATION, IsEqualObj);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, IsEqualObj);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, IsEqualObj);
+
+ m_funcs.setFunc(XType.DATETIME, IsEqualObj);
+ m_funcs.setFunc(XType.TIME, IsEqualObj);
+ m_funcs.setFunc(XType.DATE, IsEqualObj);
+ m_funcs.setFunc(XType.GYEARMONTH, IsEqualObj);
+ m_funcs.setFunc(XType.GYEAR, IsEqualObj);
+ m_funcs.setFunc(XType.GMONTHDAY, IsEqualObj);
+ m_funcs.setFunc(XType.GDAY, IsEqualObj);
+ m_funcs.setFunc(XType.GMONTH, IsEqualObj);
+
+ m_funcs.setFunc(XType.BOOLEAN, IsEqualObj);
+ m_funcs.setFunc(XType.STRING, IsEqualObj);
+ m_funcs.setFunc(XType.BASE64BINARY, IsEqualObj);
+ m_funcs.setFunc(XType.HEXBINARY, IsEqualObj);
+ m_funcs.setFunc(XType.ANYURI, IsEqualObj);
+ m_funcs.setFunc(XType.QNAME, IsEqualObj);
+ m_funcs.setFunc(XType.NOTATION, IsEqualObj);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/FortranGe.java b/src/org/apache/xpath/operations/FortranGe.java
new file mode 100644
index 0000000..9666fc6
--- /dev/null
+++ b/src/org/apache/xpath/operations/FortranGe.java
@@ -0,0 +1,148 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The 'eq' operation expression executer.
+ */
+public class FortranGe extends OperationNormalized
+{
+ static GenericOpFunc GreaterThanOrEqualObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ try
+ {
+ return lhs.greaterThanOrEqual(rhs) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() >= rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.floatVal() >= rhs.floatVal()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.integer() >= rhs.integer()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, GreaterThanOrEqualObj);
+
+ m_funcs.setFunc(XType.DURATION, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, GreaterThanOrEqualObj);
+
+ m_funcs.setFunc(XType.DATETIME, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.TIME, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.DATE, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.GYEARMONTH, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.GYEAR, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.GMONTHDAY, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.GDAY, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.GMONTH, GreaterThanOrEqualObj);
+
+ m_funcs.setFunc(XType.BOOLEAN, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.STRING, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.BASE64BINARY, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.HEXBINARY, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.ANYURI, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.QNAME, GreaterThanOrEqualObj);
+ m_funcs.setFunc(XType.NOTATION, GreaterThanOrEqualObj);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+}
diff --git a/src/org/apache/xpath/operations/FortranGt.java b/src/org/apache/xpath/operations/FortranGt.java
new file mode 100644
index 0000000..7e804d9
--- /dev/null
+++ b/src/org/apache/xpath/operations/FortranGt.java
@@ -0,0 +1,148 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The 'gt' operation expression executer.
+ */
+public class FortranGt extends OperationNormalized
+{
+ static GenericOpFunc GreaterThanObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ try
+ {
+ return lhs.greaterThan(rhs) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() > rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.floatVal() > rhs.floatVal()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.integer() > rhs.integer()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, GreaterThanObj);
+
+ m_funcs.setFunc(XType.DURATION, GreaterThanObj);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, GreaterThanObj);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, GreaterThanObj);
+
+ m_funcs.setFunc(XType.DATETIME, GreaterThanObj);
+ m_funcs.setFunc(XType.TIME, GreaterThanObj);
+ m_funcs.setFunc(XType.DATE, GreaterThanObj);
+ m_funcs.setFunc(XType.GYEARMONTH, GreaterThanObj);
+ m_funcs.setFunc(XType.GYEAR, GreaterThanObj);
+ m_funcs.setFunc(XType.GMONTHDAY, GreaterThanObj);
+ m_funcs.setFunc(XType.GDAY, GreaterThanObj);
+ m_funcs.setFunc(XType.GMONTH, GreaterThanObj);
+
+ m_funcs.setFunc(XType.BOOLEAN, GreaterThanObj);
+ m_funcs.setFunc(XType.STRING, GreaterThanObj);
+ m_funcs.setFunc(XType.BASE64BINARY, GreaterThanObj);
+ m_funcs.setFunc(XType.HEXBINARY, GreaterThanObj);
+ m_funcs.setFunc(XType.ANYURI, GreaterThanObj);
+ m_funcs.setFunc(XType.QNAME, GreaterThanObj);
+ m_funcs.setFunc(XType.NOTATION, GreaterThanObj);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+}
diff --git a/src/org/apache/xpath/operations/FortranLe.java b/src/org/apache/xpath/operations/FortranLe.java
new file mode 100644
index 0000000..67be31f
--- /dev/null
+++ b/src/org/apache/xpath/operations/FortranLe.java
@@ -0,0 +1,163 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The 'le' operation expression executer.
+ */
+public class FortranLe extends OperationNormalized
+{
+ static GenericOpFunc LessThanOrEqualObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ try
+ {
+ return lhs.lessThanOrEqual(rhs) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() <= rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.floatVal() <= rhs.floatVal()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.integer() <= rhs.integer()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+
+ });
+ m_funcs.setFunc(XType.DECIMAL, LessThanOrEqualObj);
+
+ m_funcs.setFunc(XType.DURATION, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, LessThanOrEqualObj);
+
+ m_funcs.setFunc(XType.DATETIME, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.TIME, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.DATE, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.GYEARMONTH, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.GYEAR, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.GMONTHDAY, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.GDAY, LessThanOrEqualObj);
+ m_funcs.setFunc(XType.GMONTH, LessThanOrEqualObj);
+
+ m_funcs.setFunc(XType.BOOLEAN, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ return null;
+ }
+
+ });
+ m_funcs.setFunc(XType.STRING, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ return null;
+ }
+
+ });
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+}
diff --git a/src/org/apache/xpath/operations/FortranLt.java b/src/org/apache/xpath/operations/FortranLt.java
new file mode 100644
index 0000000..cf4a9cd
--- /dev/null
+++ b/src/org/apache/xpath/operations/FortranLt.java
@@ -0,0 +1,148 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The 'lt' operation expression executer.
+ */
+public class FortranLt extends OperationNormalized
+{
+ static GenericOpFunc LessThanObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ try
+ {
+ return lhs.lessThan(rhs) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() < rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.floatVal() < rhs.floatVal()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.integer() < rhs.integer()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, LessThanObj);
+
+ m_funcs.setFunc(XType.DURATION, LessThanObj);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, LessThanObj);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, LessThanObj);
+
+ m_funcs.setFunc(XType.DATETIME, LessThanObj);
+ m_funcs.setFunc(XType.TIME, LessThanObj);
+ m_funcs.setFunc(XType.DATE, LessThanObj);
+ m_funcs.setFunc(XType.GYEARMONTH, LessThanObj);
+ m_funcs.setFunc(XType.GYEAR, LessThanObj);
+ m_funcs.setFunc(XType.GMONTHDAY, LessThanObj);
+ m_funcs.setFunc(XType.GDAY, LessThanObj);
+ m_funcs.setFunc(XType.GMONTH, LessThanObj);
+
+ m_funcs.setFunc(XType.BOOLEAN, LessThanObj);
+ m_funcs.setFunc(XType.STRING, LessThanObj);
+ m_funcs.setFunc(XType.BASE64BINARY, LessThanObj);
+ m_funcs.setFunc(XType.HEXBINARY, LessThanObj);
+ m_funcs.setFunc(XType.ANYURI, LessThanObj);
+ m_funcs.setFunc(XType.QNAME, LessThanObj);
+ m_funcs.setFunc(XType.NOTATION, LessThanObj);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+}
diff --git a/src/org/apache/xpath/operations/FortranNe.java b/src/org/apache/xpath/operations/FortranNe.java
new file mode 100644
index 0000000..cf6b20a
--- /dev/null
+++ b/src/org/apache/xpath/operations/FortranNe.java
@@ -0,0 +1,141 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The 'ne' operation expression executer.
+ */
+public class FortranNe extends OperationNormalized
+{
+ static GenericOpFunc IsNotEqualObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ return lhs.equals(rhs) ? XBoolean.S_FALSE : XBoolean.S_TRUE;
+ }
+
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() != rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() != rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return (lhs.num() != rhs.num()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, IsNotEqualObj);
+
+ m_funcs.setFunc(XType.DURATION, IsNotEqualObj);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, IsNotEqualObj);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, IsNotEqualObj);
+
+ m_funcs.setFunc(XType.DATETIME, IsNotEqualObj);
+ m_funcs.setFunc(XType.TIME, IsNotEqualObj);
+ m_funcs.setFunc(XType.DATE, IsNotEqualObj);
+ m_funcs.setFunc(XType.GYEARMONTH, IsNotEqualObj);
+ m_funcs.setFunc(XType.GYEAR, IsNotEqualObj);
+ m_funcs.setFunc(XType.GMONTHDAY, IsNotEqualObj);
+ m_funcs.setFunc(XType.GDAY, IsNotEqualObj);
+ m_funcs.setFunc(XType.GMONTH, IsNotEqualObj);
+
+ m_funcs.setFunc(XType.BOOLEAN, IsNotEqualObj);
+ m_funcs.setFunc(XType.STRING, IsNotEqualObj);
+ m_funcs.setFunc(XType.BASE64BINARY, IsNotEqualObj);
+ m_funcs.setFunc(XType.HEXBINARY, IsNotEqualObj);
+ m_funcs.setFunc(XType.ANYURI, IsNotEqualObj);
+ m_funcs.setFunc(XType.QNAME, IsNotEqualObj);
+ m_funcs.setFunc(XType.NOTATION, IsNotEqualObj);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+}
diff --git a/src/org/apache/xpath/operations/GenericOpFunc.java b/src/org/apache/xpath/operations/GenericOpFunc.java
new file mode 100644
index 0000000..28f6dc6
--- /dev/null
+++ b/src/org/apache/xpath/operations/GenericOpFunc.java
@@ -0,0 +1,115 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 29, 2002
+ * @author sboag
+ */
+public abstract class GenericOpFunc
+{
+
+ /**
+ * Constructor for GenericOpFunc.
+ */
+ public GenericOpFunc()
+ {
+ super();
+ }
+
+ /**
+ * Perform a generic operation on two operands.
+ * @param xctxt The dynamic execution context.
+ * @param lhs The left hand side operation.
+ * @param rhs The right hand side operation.
+ * @return XObject The result object.
+ */
+ public abstract XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException;
+
+ /**
+ * Perform a generic operation on two operands, and return a boolean.
+ * @param xctxt The dynamic execution context.
+ * @param lhs The left hand side operation.
+ * @param rhs The right hand side operation.
+ * @return boolean The result value.
+ */
+ public boolean operateToBoolean(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ try
+ {
+ XObject xobj = operate(xctxt, lhs, rhs);
+ return xobj.bool(xctxt);
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+
+
+
+}
diff --git a/src/org/apache/xpath/operations/Gt.java b/src/org/apache/xpath/operations/Gt.java
index a1ee4b2..2fc77d7 100644
--- a/src/org/apache/xpath/operations/Gt.java
+++ b/src/org/apache/xpath/operations/Gt.java
@@ -62,9 +62,8 @@
/**
* The '>' operation expression executer.
*/
-public class Gt extends Operation
+public class Gt extends OperationSimple
{
-
/**
* Apply the operation to two operands, and return the result.
*
diff --git a/src/org/apache/xpath/operations/GtGt.java b/src/org/apache/xpath/operations/GtGt.java
new file mode 100644
index 0000000..1a4b793
--- /dev/null
+++ b/src/org/apache/xpath/operations/GtGt.java
@@ -0,0 +1,83 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XBoolean;
+
+/**
+ * The '!=' operation expression executer.
+ */
+public class GtGt extends OperationSimple
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException
+ {
+ throw new javax.xml.transform.TransformerException("'Follows' not yet implemented!", this);
+ }
+}
diff --git a/src/org/apache/xpath/operations/Gte.java b/src/org/apache/xpath/operations/Gte.java
index 42e14be..638c34b 100644
--- a/src/org/apache/xpath/operations/Gte.java
+++ b/src/org/apache/xpath/operations/Gte.java
@@ -62,9 +62,8 @@
/**
* The '>=' operation expression executer.
*/
-public class Gte extends Operation
+public class Gte extends OperationSimple
{
-
/**
* Apply the operation to two operands, and return the result.
*
diff --git a/src/org/apache/xpath/operations/Idiv.java b/src/org/apache/xpath/operations/Idiv.java
new file mode 100644
index 0000000..23286a9
--- /dev/null
+++ b/src/org/apache/xpath/operations/Idiv.java
@@ -0,0 +1,122 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The 'div' operation expression executer.
+ */
+public class Idiv extends OperationNormalized
+{
+ static GenericOpFunc IDivObj = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XInteger(lhs.integer() / rhs.integer());
+ }
+
+ };
+
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, IDivObj);
+ m_funcs.setFunc(XType.FLOAT, IDivObj);
+ m_funcs.setFunc(XType.INTEGER, IDivObj);
+ m_funcs.setFunc(XType.DECIMAL, IDivObj);
+
+ m_funcs.setFunc(XType.DURATION, NOTSUPPORTED);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, NOTSUPPORTED);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DATETIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.TIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.DATE, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEARMONTH, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEAR, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTHDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTH, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.BOOLEAN, NOTSUPPORTED);
+ m_funcs.setFunc(XType.STRING, NOTSUPPORTED);
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/Is.java b/src/org/apache/xpath/operations/Is.java
new file mode 100644
index 0000000..37da637
--- /dev/null
+++ b/src/org/apache/xpath/operations/Is.java
@@ -0,0 +1,111 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * The '=' operation expression executer.
+ */
+public class Is extends OperationSimple
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException
+ {
+ // Might need to be more sophisticated!
+ return (left == right) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+
+ /**
+ * Execute a binary operation by calling execute on each of the operands,
+ * and then calling the operate method on the derived class.
+ *
+ *
+ * @param xctxt The runtime execution context.
+ *
+ * @return The XObject result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public boolean bool(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+ XObject left = m_left.execute(xctxt, true);
+ XObject right = m_right.execute(xctxt, true);
+
+ // Might need to be more sophisticated!
+ boolean result = (left == right) ? true : false;
+ left.detach();
+ right.detach();
+ return result;
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/IsNot.java b/src/org/apache/xpath/operations/IsNot.java
new file mode 100644
index 0000000..26639a2
--- /dev/null
+++ b/src/org/apache/xpath/operations/IsNot.java
@@ -0,0 +1,84 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XBoolean;
+
+/**
+ * The '!=' operation expression executer.
+ */
+public class IsNot extends OperationSimple
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException
+ {
+ // Might have to be more sophisticated!
+ return (left != right) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+}
diff --git a/src/org/apache/xpath/operations/Lt.java b/src/org/apache/xpath/operations/Lt.java
index 31878ba..da5c786 100644
--- a/src/org/apache/xpath/operations/Lt.java
+++ b/src/org/apache/xpath/operations/Lt.java
@@ -62,9 +62,8 @@
/**
* The '<' operation expression executer.
*/
-public class Lt extends Operation
+public class Lt extends OperationSimple
{
-
/**
* Apply the operation to two operands, and return the result.
*
diff --git a/src/org/apache/xpath/operations/LtLt.java b/src/org/apache/xpath/operations/LtLt.java
new file mode 100644
index 0000000..66ed714
--- /dev/null
+++ b/src/org/apache/xpath/operations/LtLt.java
@@ -0,0 +1,83 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XBoolean;
+
+/**
+ * The '!=' operation expression executer.
+ */
+public class LtLt extends OperationSimple
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException
+ {
+ throw new javax.xml.transform.TransformerException("'Follows' not yet implemented!", this);
+ }
+}
diff --git a/src/org/apache/xpath/operations/Lte.java b/src/org/apache/xpath/operations/Lte.java
index 0ccf4ba..8dab46b 100644
--- a/src/org/apache/xpath/operations/Lte.java
+++ b/src/org/apache/xpath/operations/Lte.java
@@ -62,9 +62,8 @@
/**
* The '<=' operation expression executer.
*/
-public class Lte extends Operation
+public class Lte extends OperationSimple
{
-
/**
* Apply the operation to two operands, and return the result.
*
diff --git a/src/org/apache/xpath/operations/Mod.java b/src/org/apache/xpath/operations/Mod.java
index 36a8ea6..4ef27b5 100644
--- a/src/org/apache/xpath/operations/Mod.java
+++ b/src/org/apache/xpath/operations/Mod.java
@@ -56,47 +56,77 @@
*/
package org.apache.xpath.operations;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XFloat;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
/**
* The 'mod' operation expression executer.
*/
-public class Mod extends Operation
+public class Mod extends OperationNormalized
{
-
- /**
- * Apply the operation to two operands, and return the result.
- *
- *
- * @param left non-null reference to the evaluated left operand.
- * @param right non-null reference to the evaluated right operand.
- *
- * @return non-null reference to the XObject that represents the result of the operation.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject operate(XObject left, XObject right)
- throws javax.xml.transform.TransformerException
+ static OpFuncLookupTable m_funcs;
{
- return new XNumber(left.num() % right.num());
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XDouble(lhs.num() % rhs.num());
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XFloat(lhs.floatVal() % rhs.floatVal());
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XInteger(lhs.integer() % rhs.integer());
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DURATION, NOTSUPPORTED);
+ m_funcs.setFunc(XType.DAYTIMEDURATION, NOTSUPPORTED);
+ m_funcs.setFunc(XType.YEARMONTHDURATION, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DATETIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.TIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.DATE, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEARMONTH, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEAR, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTHDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTH, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.BOOLEAN, NOTSUPPORTED);
+ m_funcs.setFunc(XType.STRING, NOTSUPPORTED);
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
}
/**
- * Evaluate this operation directly to a double.
- *
- * @param xctxt The runtime execution context.
- *
- * @return The result of the operation as a double.
- *
- * @throws javax.xml.transform.TransformerException
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
*/
- public double num(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
+ public OpFuncLookupTable getLookupTable()
{
-
- return (m_left.num(xctxt) % m_right.num(xctxt));
+ return m_funcs;
}
}
diff --git a/src/org/apache/xpath/operations/Mult.java b/src/org/apache/xpath/operations/Mult.java
index e5d10ee..3b911a3 100644
--- a/src/org/apache/xpath/operations/Mult.java
+++ b/src/org/apache/xpath/operations/Mult.java
@@ -56,46 +56,102 @@
*/
package org.apache.xpath.operations;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XFloat;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XYMDuration;
+import org.apache.xpath.objects.XDTDuration;
+import org.apache.xml.utils.Duration;
/**
* The '*' operation expression executer.
*/
-public class Mult extends Operation
+public class Mult extends OperationNormalized
{
-
- /**
- * Apply the operation to two operands, and return the result.
- *
- *
- * @param left non-null reference to the evaluated left operand.
- * @param right non-null reference to the evaluated right operand.
- *
- * @return non-null reference to the XObject that represents the result of the operation.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject operate(XObject left, XObject right)
- throws javax.xml.transform.TransformerException
+ static OpFuncLookupTable m_funcs;
{
- return new XNumber(left.num() * right.num());
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XDouble(lhs.num() * rhs.num());
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XFloat(lhs.floatVal() * rhs.floatVal());
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XInteger(lhs.integer() * rhs.integer());
+ }
+ });
+ m_funcs.setFunc(XType.DAYTIMEDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration = lhs.duration();
+ Duration du = duration.multiplyDTDuration(rhs.num());
+
+ return new XDTDuration(du);
+ }
+ });
+ m_funcs.setFunc(XType.YEARMONTHDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration = lhs.duration();
+ Duration du = duration.multiplyYMDuration(rhs.num());
+
+ return new XYMDuration(du);
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DURATION, NOTSUPPORTED);
+ //m_funcs.setFunc(XType.DAYTIMEDURATION, NOTSUPPORTED);
+ //m_funcs.setFunc(XType.YEARMONTHDURATION, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DATETIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.TIME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.DATE, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEARMONTH, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEAR, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTHDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTH, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.BOOLEAN, NOTSUPPORTED);
+ m_funcs.setFunc(XType.STRING, NOTSUPPORTED);
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
}
/**
- * Evaluate this operation directly to a double.
- *
- * @param xctxt The runtime execution context.
- *
- * @return The result of the operation as a double.
- *
- * @throws javax.xml.transform.TransformerException
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
*/
- public double num(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
+ public OpFuncLookupTable getLookupTable()
{
- return (m_left.num(xctxt) * m_right.num(xctxt));
+ return m_funcs;
}
}
diff --git a/src/org/apache/xpath/operations/Neg.java b/src/org/apache/xpath/operations/Neg.java
index 17fe20d..1b7c842 100644
--- a/src/org/apache/xpath/operations/Neg.java
+++ b/src/org/apache/xpath/operations/Neg.java
@@ -56,9 +56,10 @@
*/
package org.apache.xpath.operations;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XObject;
/**
* The unary '-' operation expression executer.
@@ -78,7 +79,7 @@
*/
public XObject operate(XObject right) throws javax.xml.transform.TransformerException
{
- return new XNumber(-right.num());
+ return new XDouble(-right.num());
}
/**
diff --git a/src/org/apache/xpath/operations/NotEquals.java b/src/org/apache/xpath/operations/NotEquals.java
index 16c4872..05c93a4 100644
--- a/src/org/apache/xpath/operations/NotEquals.java
+++ b/src/org/apache/xpath/operations/NotEquals.java
@@ -62,9 +62,8 @@
/**
* The '!=' operation expression executer.
*/
-public class NotEquals extends Operation
+public class NotEquals extends OperationSimple
{
-
/**
* Apply the operation to two operands, and return the result.
*
diff --git a/src/org/apache/xpath/operations/Number.java b/src/org/apache/xpath/operations/Number.java
index 32291f2..1d757aa 100644
--- a/src/org/apache/xpath/operations/Number.java
+++ b/src/org/apache/xpath/operations/Number.java
@@ -56,9 +56,10 @@
*/
package org.apache.xpath.operations;
-import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
+import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XObject;
/**
* The 'number()' operation expression executer.
@@ -82,7 +83,7 @@
if (XObject.CLASS_NUMBER == right.getType())
return right;
else
- return new XNumber(right.num());
+ return new XDouble(right.num());
}
/**
diff --git a/src/org/apache/xpath/operations/OpFuncLookupTable.java b/src/org/apache/xpath/operations/OpFuncLookupTable.java
new file mode 100644
index 0000000..518c2a5
--- /dev/null
+++ b/src/org/apache/xpath/operations/OpFuncLookupTable.java
@@ -0,0 +1,99 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xml.dtm.XType;
+
+/**
+ * Typed operation function.
+ *
+ * Created Jul 29, 2002
+ * @author sboag
+ */
+public class OpFuncLookupTable
+{
+ GenericOpFunc[] m_funcs = new GenericOpFunc[XType.MAXTYPES];
+
+ /**
+ * Constructor for OpFuncLookupTable.
+ */
+ public OpFuncLookupTable()
+ {
+ super();
+ }
+
+ /**
+ * Returns the funcs.
+ * @param type Type ID defined in XType.
+ * @return GenericOpFunc
+ */
+ public GenericOpFunc getFunc(int type)
+ {
+ return m_funcs[type];
+ }
+
+ /**
+ * Sets the funcs.
+ * @param type Type ID defined in XType.
+ * @param funcs The funcs to set
+ */
+ public void setFunc(int type, GenericOpFunc func)
+ {
+ m_funcs[type] = func;
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/Operation.java b/src/org/apache/xpath/operations/Operation.java
index 9a04b4f..df9004b 100644
--- a/src/org/apache/xpath/operations/Operation.java
+++ b/src/org/apache/xpath/operations/Operation.java
@@ -56,11 +56,10 @@
*/
package org.apache.xpath.operations;
-import java.util.Vector;
-
-import javax.xml.transform.TransformerException;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.objects.XObject;
@@ -68,7 +67,7 @@
/**
* The baseclass for a binary operation.
*/
-public class Operation extends Expression implements ExpressionOwner
+public abstract class Operation extends Expression implements ExpressionOwner
{
/** The left operand expression.
@@ -79,6 +78,18 @@
* @serial */
protected Expression m_right;
+ static GenericOpFunc NOTSUPPORTED = new GenericOpFunc()
+ {
+ /**
+ * @see org.apache.xpath.operations.opfuncs.GenericOpFunc#operate(XPathContext, XObject, XObject)
+ */
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ {
+ return null;
+ }
+
+ };
+
/**
* This function is used to fixup variables from QNames to stack frame
* indexes at stylesheet build time.
@@ -89,10 +100,10 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- m_left.fixupVariables(vars, globalsSize);
- m_right.fixupVariables(vars, globalsSize);
+ m_left.fixupVariables(vcs);
+ m_right.fixupVariables(vcs);
}
@@ -123,51 +134,49 @@
*/
public void setLeftRight(Expression l, Expression r)
{
- m_left = l;
- m_right = r;
- l.exprSetParent(this);
- r.exprSetParent(this);
+ jjtAddChild(l, 0);
+ jjtAddChild(r, 1);
+ }
+
+
+ /**
+ * Add the left or right node of the operation.
+ */
+ public void jjtAddChild(org.apache.xpath.parser.Node n, int i)
+ {
+ n = fixupPrimarys(n); // yuck.
+ if(0 == i)
+ {
+ m_left = (Expression)n;
+ m_left.jjtSetParent(this);
+ }
+ else if(1 == i)
+ {
+ m_right = (Expression)n;
+ m_right.jjtSetParent(this);
+ }
+ else
+ {
+ // assertion... should not be able to occur.
+ throw new RuntimeException("Can't add more than two children to an operation!");
+ }
+ }
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i <= 1, "Operation can only have one or two children!");
+ return (0 == i) ? m_left : m_right;
}
- /**
- * Execute a binary operation by calling execute on each of the operands,
- * and then calling the operate method on the derived class.
- *
- *
- * @param xctxt The runtime execution context.
- *
- * @return The XObject result of the operation.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject execute(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
{
-
- XObject left = m_left.execute(xctxt, true);
- XObject right = m_right.execute(xctxt, true);
-
- XObject result = operate(left, right);
- left.detach();
- right.detach();
- return result;
- }
-
- /**
- * Apply the operation to two operands, and return the result.
- *
- *
- * @param left non-null reference to the evaluated left operand.
- * @param right non-null reference to the evaluated right operand.
- *
- * @return non-null reference to the XObject that represents the result of the operation.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject operate(XObject left, XObject right)
- throws javax.xml.transform.TransformerException
- {
- return null; // no-op
+ int count = 1;
+ if(null != m_right)
+ count++;
+ return count;
}
/** @return the left operand of binary operation, as an Expression.
@@ -247,4 +256,12 @@
return true;
}
+ /**
+ * Tell if this node should have it's PathExpr ancestory reduced.
+ */
+ public boolean isPathExprReduced()
+ {
+ return true;
+ }
+
}
diff --git a/src/org/apache/xpath/operations/OperationNormalized.java b/src/org/apache/xpath/operations/OperationNormalized.java
new file mode 100644
index 0000000..2caad81
--- /dev/null
+++ b/src/org/apache/xpath/operations/OperationNormalized.java
@@ -0,0 +1,208 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.XMLString;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.objects.XString;
+
+/**
+ *
+ *
+ * Created Jul 31, 2002
+ * @author sboag
+ */
+public abstract class OperationNormalized extends Operation
+{
+ public abstract OpFuncLookupTable getLookupTable();
+
+
+ /**
+ * Get the default value type that this operation expects.
+ * @return int one of XType.XXX being one of the simple types.
+ */
+ public int getDefaultType()
+ {
+ return XType.DOUBLE;
+ }
+
+ /**
+ * Execute a binary operation by calling execute on each of the operands,
+ * and then calling the operate method on the derived class.
+ *
+ *
+ * @param xctxt The runtime execution context.
+ *
+ * @return The XObject result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+
+ XObject left = m_left.execute(xctxt, true);
+ XObject right = m_right.execute(xctxt, true);
+
+ if(XSequence.EMPTY == left || XSequence.EMPTY == right)
+ return XSequence.EMPTY;
+
+// if(!left.isSingletonOrEmpty())
+// {
+// XSequence xseq = left.xseq();
+// left = xseq.getCurrent();
+// if(null == left)
+// return XSequence.EMPTY;
+// // Node?
+// }
+// if(!right.isSingletonOrEmpty())
+// {
+// XSequence xseq = right.xseq();
+// right = xseq.getCurrent();
+// if(null == right)
+// return XSequence.EMPTY;
+// // Node?
+// }
+
+ int type = left.getValueType();
+ int defaultType = getDefaultType();
+ if(type == XType.ANYTYPE || type == XType.ANYSIMPLETYPE)
+ {
+ type = getDefaultType();
+ }
+ else if(type != defaultType)
+ {
+ type = findFallbackType(type, defaultType);
+ /* if(XType.DURATION == type)
+ {
+ XObject savedLeft = left;
+ left = right;
+ right = savedLeft;
+ type = left.getValueType();
+ type = findFallbackType(type, defaultType);
+ }*/
+ }
+
+ GenericOpFunc opfunc = getLookupTable().getFunc(type);
+ if(null == opfunc)
+ throw new TransformerException("Type Exception!", this);
+ return opfunc.operate(xctxt, left, right);
+ }
+
+ /**
+ * Find the fallback type for this object.
+ * Assumptions: 1) the valType and the requiredType do not match,
+ * 2) the valType has already been checked for ANYTYPE (this is
+ * not officially part of fallback), and 3) the valType is one of
+ * the 19 simple types.
+ * @param valType The value type.
+ * @param requiredType The required type.
+ * @return int Either the valType, or the required type.
+ */
+ public int findFallbackType(int valType, int requiredType)
+ {
+ switch (requiredType)
+ {
+ case XType.DOUBLE :
+ case XType.INTEGER :
+ case XType.FLOAT :
+ switch (valType)
+ {
+ case XType.ANYTYPE :
+ case XType.ANYSIMPLETYPE :
+ return requiredType;
+
+ case XType.STRING :
+ case XType.BOOLEAN :
+ return requiredType;
+
+ case XType.DATE :
+ case XType.DATETIME :
+ case XType.TIME :
+ case XType.GYEARMONTH :
+ case XType.GYEAR :
+ case XType.GMONTHDAY :
+ case XType.GDAY :
+ case XType.GMONTH :
+ return valType;
+
+ case XType.DURATION :
+ case XType.YEARMONTHDURATION :
+ case XType.DAYTIMEDURATION :
+ // Normalize this for duration so that a quick
+ // switch can be made in execute(XPathContext xctxt)
+ // to make the duration the second argument.
+ return valType;//XType.DURATION;
+ }
+ break;
+
+ case XType.BOOLEAN :
+ case XType.STRING :
+ case XType.DECIMAL :
+ return requiredType;
+ }
+ return valType;
+ }
+
+
+}
diff --git a/src/org/apache/xpath/operations/OperationSimple.java b/src/org/apache/xpath/operations/OperationSimple.java
new file mode 100644
index 0000000..7fe1558
--- /dev/null
+++ b/src/org/apache/xpath/operations/OperationSimple.java
@@ -0,0 +1,109 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XObject;
+
+/**
+ *
+ *
+ * Created Jul 31, 2002
+ * @author sboag
+ */
+public abstract class OperationSimple extends Operation
+{
+ /**
+ * Execute a binary operation by calling execute on each of the operands,
+ * and then calling the operate method on the derived class.
+ *
+ *
+ * @param xctxt The runtime execution context.
+ *
+ * @return The XObject result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject execute(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+
+ XObject left = m_left.execute(xctxt, true);
+ XObject right = m_right.execute(xctxt, true);
+
+ XObject result = operate(left, right);
+ left.detach();
+ right.detach();
+ return result;
+ }
+
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public abstract XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException;
+
+
+}
diff --git a/src/org/apache/xpath/operations/Or.java b/src/org/apache/xpath/operations/Or.java
index ad4d756..daf188e 100644
--- a/src/org/apache/xpath/operations/Or.java
+++ b/src/org/apache/xpath/operations/Or.java
@@ -69,6 +69,13 @@
*/
public class Or extends Operation
{
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return null;
+ }
/**
* OR two expressions and return the boolean result. Override
diff --git a/src/org/apache/xpath/operations/Pos.java b/src/org/apache/xpath/operations/Pos.java
new file mode 100644
index 0000000..88a3eb4
--- /dev/null
+++ b/src/org/apache/xpath/operations/Pos.java
@@ -0,0 +1,41 @@
+package org.apache.xpath.operations;
+
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XObject;
+
+public class Pos extends Neg
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject right) throws javax.xml.transform.TransformerException
+ {
+ return new XDouble(+right.num());
+ }
+
+ /**
+ * Evaluate this operation directly to a double.
+ *
+ * @param xctxt The runtime execution context.
+ *
+ * @return The result of the operation as a double.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public double num(XPathContext xctxt)
+ throws javax.xml.transform.TransformerException
+ {
+
+ return +(m_right.num(xctxt));
+ }
+
+}
+
diff --git a/src/org/apache/xpath/operations/Precedes.java b/src/org/apache/xpath/operations/Precedes.java
new file mode 100644
index 0000000..9c935ef
--- /dev/null
+++ b/src/org/apache/xpath/operations/Precedes.java
@@ -0,0 +1,83 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XBoolean;
+
+/**
+ * The '!=' operation expression executer.
+ */
+public class Precedes extends OperationSimple
+{
+ /**
+ * Apply the operation to two operands, and return the result.
+ *
+ *
+ * @param left non-null reference to the evaluated left operand.
+ * @param right non-null reference to the evaluated right operand.
+ *
+ * @return non-null reference to the XObject that represents the result of the operation.
+ *
+ * @throws javax.xml.transform.TransformerException
+ */
+ public XObject operate(XObject left, XObject right)
+ throws javax.xml.transform.TransformerException
+ {
+ throw new javax.xml.transform.TransformerException("'Follows' not yet implemented!", this);
+ }
+}
diff --git a/src/org/apache/xpath/operations/Quo.java b/src/org/apache/xpath/operations/Quo.java
index 4700552..1ccc4e3 100644
--- a/src/org/apache/xpath/operations/Quo.java
+++ b/src/org/apache/xpath/operations/Quo.java
@@ -56,16 +56,16 @@
*/
package org.apache.xpath.operations;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.objects.XNumber;
/**
* The 'quo' operation expression executer. (no longer supported by XPath).
* @deprecated.
*/
-public class Quo extends Operation
+public class Quo extends OperationSimple
{
-
// Actually, this is no longer supported by xpath...
/**
@@ -82,6 +82,6 @@
public XObject operate(XObject left, XObject right)
throws javax.xml.transform.TransformerException
{
- return new XNumber((int) (left.num() / right.num()));
+ return new XDouble((int) (left.num() / right.num()));
}
}
diff --git a/src/org/apache/xpath/operations/Subtract.java b/src/org/apache/xpath/operations/Subtract.java
new file mode 100644
index 0000000..d1fdee9
--- /dev/null
+++ b/src/org/apache/xpath/operations/Subtract.java
@@ -0,0 +1,258 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.operations;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.DateTimeObj;
+import org.apache.xml.utils.Duration;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XDate;
+import org.apache.xpath.objects.XDateTime;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XDuration;
+import org.apache.xpath.objects.XDTDuration;
+import org.apache.xpath.objects.XYMDuration;
+import org.apache.xpath.objects.XFloat;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XTime;
+
+/**
+ * The binary '-' operation expression executer.
+ */
+public class Subtract extends OperationNormalized
+{
+ static OpFuncLookupTable m_funcs;
+ {
+ m_funcs = new OpFuncLookupTable();
+ m_funcs.setFunc(XType.DOUBLE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XDouble(lhs.num() - rhs.num());
+ }
+ });
+ m_funcs.setFunc(XType.FLOAT, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XFloat(lhs.floatVal() - rhs.floatVal());
+ }
+ });
+ m_funcs.setFunc(XType.INTEGER, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ return new XInteger(lhs.integer() - rhs.integer());
+ }
+ });
+ m_funcs.setFunc(XType.DECIMAL, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.DURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ Duration duration1 = lhs.duration();
+ // The normalizer should make sure the second argument is always
+ // a duration!
+ Duration duration2 = rhs.duration();
+ Duration du = duration1.subtractDTDuration(duration2);
+ return new XDuration(du);
+ }
+ });
+ m_funcs.setFunc(XType.DAYTIMEDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ // for now...
+ int rhsVT = rhs.getValueType();
+ if(XType.DURATION == rhsVT
+ || XType.DAYTIMEDURATION == rhsVT)
+ {
+ Duration duration1 = lhs.duration();
+ // The normalizer should make sure the second argument is always
+ // a duration!
+ Duration duration2 = rhs.duration();
+ Duration du = duration1.subtractDTDuration(duration2);
+ return new XDTDuration(du);
+ }
+ else
+ {
+ throw new TransformerException("Type Exception!");
+ }
+ }
+ });
+ m_funcs.setFunc(XType.YEARMONTHDURATION, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ // for now...
+ int rhsVT = rhs.getValueType();
+ if(XType.DURATION == rhsVT
+ || XType.YEARMONTHDURATION == rhsVT)
+ {
+ Duration duration1 = lhs.duration();
+ // The normalizer should make sure the second argument is always
+ // a duration!
+ Duration duration2 = rhs.duration();
+ Duration du = duration1.subtractYMDuration(duration2);
+ return new XYMDuration(du);
+ }
+ else
+ {
+ throw new TransformerException("Type Exception!");
+ }
+ }
+ });
+
+ m_funcs.setFunc(XType.DATETIME, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ DateTimeObj dt = lhs.datetime();
+ // The normalizer should
+ int rhsVT = rhs.getValueType();
+ if(XType.DURATION == rhsVT
+ || XType.DAYTIMEDURATION == rhsVT)
+ {
+ Duration duration2 = rhs.duration();
+ DateTimeObj du = dt.subtractDTDurationFromDateTime(duration2);
+ return new XDateTime(du);
+ }
+ else //if(XType.YEARMONTHDURATION == rhsVT)
+ {
+ Duration duration2 = rhs.duration();
+ DateTimeObj du = dt.subtractYMDurationFromDateTime(duration2);
+ return new XDateTime(du);
+ }
+ }
+ });
+ m_funcs.setFunc(XType.TIME, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ DateTimeObj oldTime = lhs.time();
+ // The normalizer should
+ Duration duration2 = rhs.duration();
+
+ DateTimeObj newTime = oldTime.subtractDTDurationFromTime(duration2);
+ return new XTime(newTime);
+ }
+ });
+ m_funcs.setFunc(XType.DATE, new GenericOpFunc()
+ {
+ public XObject operate(XPathContext xctxt, XObject lhs, XObject rhs)
+ throws TransformerException
+ {
+ DateTimeObj dt = lhs.date();
+ // The normalizer should
+ int rhsVT = rhs.getValueType();
+ if(XType.DURATION == rhsVT
+ || XType.DAYTIMEDURATION == rhsVT)
+ {
+ Duration duration2 = rhs.duration();
+ DateTimeObj newDate = dt.subtractDTDurationFromDate(duration2);
+ return new XDate(newDate);
+ }
+ else if(XType.YEARMONTHDURATION == rhsVT)
+ {
+ Duration duration2 = rhs.duration();
+ DateTimeObj newDate = dt.subtractYMDurationFromDate(duration2);
+ return new XDate(newDate);
+ }
+ else
+ {
+ DateTimeObj dt2 = rhs.date();
+ Duration duration = dt.subtractDateFromDate(dt2);
+ return new XDuration(duration);
+ }
+ }
+ });
+ m_funcs.setFunc(XType.GYEARMONTH, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GYEAR, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTHDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GDAY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.GMONTH, NOTSUPPORTED);
+
+ m_funcs.setFunc(XType.BOOLEAN, NOTSUPPORTED);
+ m_funcs.setFunc(XType.STRING, NOTSUPPORTED);
+ m_funcs.setFunc(XType.BASE64BINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.HEXBINARY, NOTSUPPORTED);
+ m_funcs.setFunc(XType.ANYURI, NOTSUPPORTED);
+ m_funcs.setFunc(XType.QNAME, NOTSUPPORTED);
+ m_funcs.setFunc(XType.NOTATION, NOTSUPPORTED);
+ }
+
+ /**
+ * @see org.apache.xpath.operations.Operation#getLookupTable()
+ */
+ public OpFuncLookupTable getLookupTable()
+ {
+ return m_funcs;
+ }
+
+}
diff --git a/src/org/apache/xpath/operations/UnaryOperation.java b/src/org/apache/xpath/operations/UnaryOperation.java
index 19a67f7..a1453b5 100644
--- a/src/org/apache/xpath/operations/UnaryOperation.java
+++ b/src/org/apache/xpath/operations/UnaryOperation.java
@@ -56,13 +56,12 @@
*/
package org.apache.xpath.operations;
-import java.util.Vector;
-
-import javax.xml.transform.TransformerException;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.ExpressionOwner;
import org.apache.xpath.objects.XObject;
/**
@@ -85,9 +84,9 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- m_right.fixupVariables(vars, globalsSize);
+ m_right.fixupVariables(vcs);
}
/**
@@ -196,6 +195,49 @@
return true;
}
+
+ /**
+ * Add the left or right node of the operation.
+ */
+ public void jjtAddChild(org.apache.xpath.parser.Node n, int i)
+ {
+ n = fixupPrimarys(n); // yuck.
+ if(0 == i)
+ {
+ m_right = (Expression)n;
+ m_right.exprSetParent(this);
+ }
+ else
+ {
+ // assertion... should not be able to occur.
+ throw new RuntimeException("Can't add more than one child to an UnaryOperation!");
+ }
+ }
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i == 0, "UnaryOperation can only have one child!");
+ return m_right;
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ int count = 0;
+ if(null != m_right)
+ count++;
+ return count;
+ }
+
+ /**
+ * Tell if this node should have it's PathExpr ancestory reduced.
+ */
+ public boolean isPathExprReduced()
+ {
+ return true;
+ }
}
diff --git a/src/org/apache/xpath/operations/Variable.java b/src/org/apache/xpath/operations/Variable.java
index bba942d..f15be04 100644
--- a/src/org/apache/xpath/operations/Variable.java
+++ b/src/org/apache/xpath/operations/Variable.java
@@ -59,15 +59,12 @@
import java.util.Vector;
import javax.xml.transform.TransformerException;
+
import org.apache.xalan.res.XSLMessages;
-import org.apache.xalan.templates.ElemTemplateElement;
-import org.apache.xalan.templates.ElemVariable;
-import org.apache.xalan.templates.Stylesheet;
-import org.apache.xml.utils.PrefixResolver;
import org.apache.xml.utils.QName;
import org.apache.xpath.Expression;
-import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPath;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
@@ -75,9 +72,8 @@
import org.apache.xpath.axes.WalkerFactory;
import org.apache.xpath.objects.XNodeSet;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.Node;
import org.apache.xpath.res.XPATHErrorResources;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
/**
@@ -157,9 +153,11 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
m_fixUpWasCalled = true;
+ Vector vars = vcs.getVariableNames();
+ int globalsSize = vcs.getGlobalsSize();
int sz = vars.size();
for (int i = vars.size()-1; i >= 0; i--)
@@ -428,5 +426,38 @@
return false;
}
+ /**
+ * Tell if this node should have it's PathExpr ancestory reduced.
+ */
+ public boolean isPathExprReduced()
+ {
+ // Assume that the parent of the parent is always a PathExpr when this
+ // method is called.
+ Node pathOwner = jjtGetParent().jjtGetParent();
+ return pathOwner.jjtGetNumChildren() == 1 ? true : false;
+ }
+
+ public java.lang.String toString()
+ {
+ return "$"+m_qname;
+ }
+
+ /**
+ * Returns the fixUpWasCalled.
+ * @return boolean
+ */
+ public boolean isFixUpWasCalled()
+ {
+ return m_fixUpWasCalled;
+ }
+
+ /**
+ * Sets the fixUpWasCalled.
+ * @param fixUpWasCalled The fixUpWasCalled to set
+ */
+ public void setFixUpWasCalled(boolean fixUpWasCalled)
+ {
+ m_fixUpWasCalled = fixUpWasCalled;
+ }
}
diff --git a/src/org/apache/xpath/parser/ASCII_CharStream.java b/src/org/apache/xpath/parser/ASCII_CharStream.java
new file mode 100644
index 0000000..43ae731
--- /dev/null
+++ b/src/org/apache/xpath/parser/ASCII_CharStream.java
@@ -0,0 +1,377 @@
+/* Generated By:JavaCC: Do not edit this line. ASCII_CharStream.java Version 0.7pre6 */
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+package org.apache.xpath.parser;
+
+public final class ASCII_CharStream
+{
+ public static final boolean staticFlag = false;
+ int bufsize;
+ int available;
+ int tokenBegin;
+ public int bufpos = -1;
+ private int bufline[];
+ private int bufcolumn[];
+
+ private int column = 0;
+ private int line = 1;
+
+ private boolean prevCharIsCR = false;
+ private boolean prevCharIsLF = false;
+
+ private java.io.Reader inputStream;
+
+ private char[] buffer;
+ private int maxNextCharInd = 0;
+ private int inBuf = 0;
+
+ private final void ExpandBuff(boolean wrapAround)
+ {
+ char[] newbuffer = new char[bufsize + 2048];
+ int newbufline[] = new int[bufsize + 2048];
+ int newbufcolumn[] = new int[bufsize + 2048];
+
+ try
+ {
+ if (wrapAround)
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ System.arraycopy(buffer, 0, newbuffer,
+ bufsize - tokenBegin, bufpos);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+ bufcolumn = newbufcolumn;
+
+ maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+ }
+ else
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ bufcolumn = newbufcolumn;
+
+ maxNextCharInd = (bufpos -= tokenBegin);
+ }
+ }
+ catch (Throwable t)
+ {
+ throw new Error(t.getMessage());
+ }
+
+
+ bufsize += 2048;
+ available = bufsize;
+ tokenBegin = 0;
+ }
+
+ private final void FillBuff() throws java.io.IOException
+ {
+ if (maxNextCharInd == available)
+ {
+ if (available == bufsize)
+ {
+ if (tokenBegin > 2048)
+ {
+ bufpos = maxNextCharInd = 0;
+ available = tokenBegin;
+ }
+ else if (tokenBegin < 0)
+ bufpos = maxNextCharInd = 0;
+ else
+ ExpandBuff(false);
+ }
+ else if (available > tokenBegin)
+ available = bufsize;
+ else if ((tokenBegin - available) < 2048)
+ ExpandBuff(true);
+ else
+ available = tokenBegin;
+ }
+
+ int i;
+ try {
+ if ((i = inputStream.read(buffer, maxNextCharInd,
+ available - maxNextCharInd)) == -1)
+ {
+ inputStream.close();
+ throw new java.io.IOException();
+ }
+ else
+ maxNextCharInd += i;
+ return;
+ }
+ catch(java.io.IOException e) {
+ --bufpos;
+ backup(0);
+ if (tokenBegin == -1)
+ tokenBegin = bufpos;
+ throw e;
+ }
+ }
+
+ public final char BeginToken() throws java.io.IOException
+ {
+ tokenBegin = -1;
+ char c = readChar();
+ tokenBegin = bufpos;
+
+ return c;
+ }
+
+ private final void UpdateLineColumn(char c)
+ {
+ column++;
+
+ if (prevCharIsLF)
+ {
+ prevCharIsLF = false;
+ line += (column = 1);
+ }
+ else if (prevCharIsCR)
+ {
+ prevCharIsCR = false;
+ if (c == '\n')
+ {
+ prevCharIsLF = true;
+ }
+ else
+ line += (column = 1);
+ }
+
+ switch (c)
+ {
+ case '\r' :
+ prevCharIsCR = true;
+ break;
+ case '\n' :
+ prevCharIsLF = true;
+ break;
+ case '\t' :
+ column--;
+ column += (8 - (column & 07));
+ break;
+ default :
+ break;
+ }
+
+ bufline[bufpos] = line;
+ bufcolumn[bufpos] = column;
+ }
+
+ public final char readChar() throws java.io.IOException
+ {
+ if (inBuf > 0)
+ {
+ --inBuf;
+ return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
+ }
+
+ if (++bufpos >= maxNextCharInd)
+ FillBuff();
+
+ char c = (char)((char)0xff & buffer[bufpos]);
+
+ UpdateLineColumn(c);
+ return (c);
+ }
+
+ /**
+ * @deprecated
+ * @see #getEndColumn
+ */
+
+ public final int getColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ /**
+ * @deprecated
+ * @see #getEndLine
+ */
+
+ public final int getLine() {
+ return bufline[bufpos];
+ }
+
+ public final int getEndColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ public final int getEndLine() {
+ return bufline[bufpos];
+ }
+
+ public final int getBeginColumn() {
+ return bufcolumn[tokenBegin];
+ }
+
+ public final int getBeginLine() {
+ return bufline[tokenBegin];
+ }
+
+ public final void backup(int amount) {
+
+ inBuf += amount;
+ if ((bufpos -= amount) < 0)
+ bufpos += bufsize;
+ }
+
+ public ASCII_CharStream(java.io.Reader dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ }
+
+ public ASCII_CharStream(java.io.Reader dstream, int startline,
+ int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+ public void ReInit(java.io.Reader dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ if (buffer == null || buffersize != buffer.length)
+ {
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ }
+ prevCharIsLF = prevCharIsCR = false;
+ tokenBegin = inBuf = maxNextCharInd = 0;
+ bufpos = -1;
+ }
+
+ public void ReInit(java.io.Reader dstream, int startline,
+ int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+ public ASCII_CharStream(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+
+ public ASCII_CharStream(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+ public final String GetImage()
+ {
+ if (bufpos >= tokenBegin)
+ return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+ else
+ return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+ new String(buffer, 0, bufpos + 1);
+ }
+
+ public final char[] GetSuffix(int len)
+ {
+ char[] ret = new char[len];
+
+ if ((bufpos + 1) >= len)
+ System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+ else
+ {
+ System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+ len - bufpos - 1);
+ System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+ }
+
+ return ret;
+ }
+
+ public void Done()
+ {
+ buffer = null;
+ bufline = null;
+ bufcolumn = null;
+ }
+
+ /**
+ * Method to adjust line and column numbers for the start of a token.<BR>
+ */
+ public void adjustBeginLineColumn(int newLine, int newCol)
+ {
+ int start = tokenBegin;
+ int len;
+
+ if (bufpos >= tokenBegin)
+ {
+ len = bufpos - tokenBegin + inBuf + 1;
+ }
+ else
+ {
+ len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+ }
+
+ int i = 0, j = 0, k = 0;
+ int nextColDiff = 0, columnDiff = 0;
+
+ while (i < len &&
+ bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+ {
+ bufline[j] = newLine;
+ nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+ bufcolumn[j] = newCol + columnDiff;
+ columnDiff = nextColDiff;
+ i++;
+ }
+
+ if (i < len)
+ {
+ bufline[j] = newLine++;
+ bufcolumn[j] = newCol + columnDiff;
+
+ while (i++ < len)
+ {
+ if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+ bufline[j] = newLine++;
+ else
+ bufline[j] = newLine;
+ }
+ }
+
+ line = bufline[j];
+ column = bufcolumn[j];
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/AnyKindTest.java b/src/org/apache/xpath/parser/AnyKindTest.java
new file mode 100644
index 0000000..6b81274
--- /dev/null
+++ b/src/org/apache/xpath/parser/AnyKindTest.java
@@ -0,0 +1,21 @@
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.DTMFilter;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class AnyKindTest extends KindTest
+{
+ public AnyKindTest(XPath parser)
+ {
+ super(parser);
+ }
+
+ public int getWhatToShow()
+ {
+ return DTMFilter.SHOW_ALL;
+ }
+}
+
diff --git a/src/org/apache/xpath/parser/AtomicType.java b/src/org/apache/xpath/parser/AtomicType.java
new file mode 100644
index 0000000..af78f33
--- /dev/null
+++ b/src/org/apache/xpath/parser/AtomicType.java
@@ -0,0 +1,100 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.XType;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class AtomicType extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for AtomicType.
+ * @param parser
+ * @param value
+ */
+ public AtomicType(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for AtomicType.
+ * @param parser
+ */
+ public AtomicType(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ QName qname = (QName)jjtGetChild(0);
+ int id = XType.getTypeFromQName(qname.getQName());
+ ((ItemType)n).setAtomicTypeID(id);
+ super.jjtSetParent(n);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/CommentTest.java b/src/org/apache/xpath/parser/CommentTest.java
new file mode 100644
index 0000000..314d50e
--- /dev/null
+++ b/src/org/apache/xpath/parser/CommentTest.java
@@ -0,0 +1,21 @@
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.DTMFilter;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class CommentTest extends KindTest
+{
+ public CommentTest(XPath parser)
+ {
+ super(parser);
+ }
+
+ public int getWhatToShow()
+ {
+ return DTMFilter.SHOW_COMMENT;
+ }
+}
+
diff --git a/src/org/apache/xpath/parser/ElemOrAttrType.java b/src/org/apache/xpath/parser/ElemOrAttrType.java
new file mode 100644
index 0000000..60e5f59
--- /dev/null
+++ b/src/org/apache/xpath/parser/ElemOrAttrType.java
@@ -0,0 +1,153 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class ElemOrAttrType extends NonExecutableExpression
+{
+ /** The ElemOrAttrType name, meaning the tag QName, may be null. */
+ private org.apache.xml.utils.QName m_elemOrAttrName;
+
+ /** The SchemaType name, meaning the tag QName, may be null. */
+ private org.apache.xml.utils.QName m_schemaTypeName;
+
+ /**
+ * Constructor for ElemOrAttrType.
+ * @param parser
+ * @param value
+ */
+ public ElemOrAttrType(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for ElemOrAttrType.
+ * @param parser
+ */
+ public ElemOrAttrType(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * Returns the elemOrAttrName.
+ * @return org.apache.xml.utils.QName
+ */
+ public org.apache.xml.utils.QName getElemOrAttrName()
+ {
+ return m_elemOrAttrName;
+ }
+
+ /**
+ * Returns the schemaTypeName.
+ * @return org.apache.xml.utils.QName
+ */
+ public org.apache.xml.utils.QName getSchemaTypeName()
+ {
+ return m_schemaTypeName;
+ }
+
+ /**
+ * Sets the elemOrAttrName.
+ * @param elemOrAttrName The elemOrAttrName to set
+ */
+ public void setElemOrAttrName(org.apache.xml.utils.QName elemOrAttrName)
+ {
+ m_elemOrAttrName = elemOrAttrName;
+ }
+
+ /**
+ * Sets the schemaTypeName.
+ * @param schemaTypeName The schemaTypeName to set
+ */
+ public void setSchemaTypeName(org.apache.xml.utils.QName schemaTypeName)
+ {
+ m_schemaTypeName = schemaTypeName;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ ItemType itype = (ItemType)n;
+ itype.setElemOrAttrName(m_elemOrAttrName);
+
+ itype.setSchemaTypeName(m_schemaTypeName);
+ super.jjtSetParent(n);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ super.jjtAddChild(n, i);
+ if(n instanceof QName && !(n instanceof SchemaType))
+ {
+ QName qname = (QName)n;
+ m_elemOrAttrName = qname.getQName();
+ }
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/Empty.java b/src/org/apache/xpath/parser/Empty.java
new file mode 100644
index 0000000..cb92d16
--- /dev/null
+++ b/src/org/apache/xpath/parser/Empty.java
@@ -0,0 +1,87 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class Empty extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for Empty.
+ * @param parser
+ * @param value
+ */
+ public Empty(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for Empty.
+ * @param parser
+ */
+ public Empty(XPath parser)
+ {
+ super(parser);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/ForClause.java b/src/org/apache/xpath/parser/ForClause.java
new file mode 100644
index 0000000..c81d6dc
--- /dev/null
+++ b/src/org/apache/xpath/parser/ForClause.java
@@ -0,0 +1,64 @@
+/* Generated By:JJTree: Do not edit this line. ForClause.java */
+
+package org.apache.xpath.parser;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.operations.Variable;
+import org.apache.xpath.seqctor.Binding;
+import org.apache.xpath.seqctor.FLWRExpr;
+
+/**
+ * ForClause ::= <"for" "$"> VarName "in"
+ * Expr ("," "$" VarName "in" Expr)*
+ *
+ * Created Jul 18, 2002
+ * @author sboag
+ */
+public class ForClause extends NonExecutableExpression
+{
+
+ public ForClause(XPath parser) {
+ super(parser);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ super.jjtSetParent(n);
+ FLWRExpr flwr = (FLWRExpr)n;
+ int vsize = m_exprs.size();
+ // vsize--;
+ Binding[] bindings = new Binding[vsize/3];
+
+ int bindingIndex = 0;
+ for (int i = 0; i < vsize; i+=3)
+ {
+ Variable var = (Variable)m_exprs.elementAt(i);
+ try
+ {
+ Binding binding = new Binding();
+ binding.setVar(var);
+ bindings[bindingIndex] = binding;
+ bindingIndex++;
+ var.jjtSetParent(flwr);
+ }
+ catch (java.lang.NullPointerException e)
+ {
+ throw e;
+ }
+ }
+ bindingIndex = 0;
+ // Ignore the "in" node. (It should really be void)
+ for (int i = 2; i < vsize; i+=3)
+ {
+ Expression expr = (Expression)m_exprs.elementAt(i);
+ expr = (Expression)fixupPrimarys(expr);
+ bindings[bindingIndex++].setExpr(expr);
+ expr.jjtSetParent(flwr);
+ }
+ flwr.setBindings(bindings);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/IfExpr.java b/src/org/apache/xpath/parser/IfExpr.java
new file mode 100644
index 0000000..4931f6a
--- /dev/null
+++ b/src/org/apache/xpath/parser/IfExpr.java
@@ -0,0 +1,25 @@
+package org.apache.xpath.parser;
+
+
+
+public class IfExpr extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for IfExpr
+ */
+ public IfExpr(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * @see SimpleNode#shouldReduceIfOneChild()
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return (jjtGetNumChildren() == 1) ? true : false;
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/In.java b/src/org/apache/xpath/parser/In.java
new file mode 100644
index 0000000..d71cf6e
--- /dev/null
+++ b/src/org/apache/xpath/parser/In.java
@@ -0,0 +1,26 @@
+/* Generated By:JJTree: Do not edit this line. In.java */
+
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+// This node could probably be void. -sb
+public class In extends NonExecutableExpression
+{
+
+ public In(XPath parser) {
+ super(parser);
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/Instanceof.java b/src/org/apache/xpath/parser/Instanceof.java
new file mode 100644
index 0000000..a820572
--- /dev/null
+++ b/src/org/apache/xpath/parser/Instanceof.java
@@ -0,0 +1,14 @@
+package org.apache.xpath.parser;
+public class Instanceof extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for InstanceofExpr
+ */
+ public Instanceof(XPath parser)
+ {
+ super(parser);
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/ItemType.java b/src/org/apache/xpath/parser/ItemType.java
new file mode 100644
index 0000000..15ad2fb
--- /dev/null
+++ b/src/org/apache/xpath/parser/ItemType.java
@@ -0,0 +1,200 @@
+/* Generated By:JJTree: Do not edit this line. ItemType.java */
+
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.types.InstanceofExpr;
+
+public class ItemType extends NonExecutableExpression
+{
+ /** The sequence on which to act. **/
+ private Expression m_targetExpr;
+
+ /** The node type value, one of DTMFilter.SHOW_ATTRIBUTE, etc. **/
+ private int m_whatToShow;
+
+ /** The atomic type ID, one of XType.BOOLEAN, etc. **/
+ private int m_atomicTypeID;
+
+ /** The occurance indicator ID. One of ZERO_OR_MORE, etc. or EMPTY_SEQ **/
+ private int m_occurrenceIndicator = InstanceofExpr.ONE_OR_MORE;
+
+ /** The ElemOrAttrType name, meaning the tag QName, may be null. */
+ private org.apache.xml.utils.QName m_elemOrAttrName;
+
+ /** The SchemaType name, meaning the tag QName, may be null. */
+ private org.apache.xml.utils.QName m_schemaTypeName;
+
+ /** SchemaContext is not executable for the moment, so leave it
+ * as a NEE until we figure out what we want to do with it. **/
+ private SchemaContext m_schemaContext;
+
+
+ /**
+ * Constructor for ItemType.
+ * @param parser
+ * @param value
+ */
+ public ItemType(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for ItemType.
+ * @param parser
+ */
+ public ItemType(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * Returns the occurrenceIndicator.
+ * @return int
+ */
+ public int getOccurrenceIndicator()
+ {
+ return m_occurrenceIndicator;
+ }
+
+ /**
+ * Returns the schemaContext.
+ * @return SchemaContext
+ */
+ public SchemaContext getSchemaContext()
+ {
+ return m_schemaContext;
+ }
+
+ /**
+ * Returns the schemaTypeName.
+ * @return org.apache.xml.utils.QName
+ */
+ public org.apache.xml.utils.QName getSchemaTypeName()
+ {
+ return m_schemaTypeName;
+ }
+
+ /**
+ * Returns the targetExpr.
+ * @return Expression
+ */
+ public Expression getTargetExpr()
+ {
+ return m_targetExpr;
+ }
+
+ /**
+ * Returns the whatToShow.
+ * @return int
+ */
+ public int getWhatToShow()
+ {
+ return m_whatToShow;
+ }
+
+ /**
+ * Sets the occurrenceIndicator.
+ * @param occurrenceIndicator The occurrenceIndicator to set
+ */
+ public void setOccurrenceIndicator(int occurrenceIndicator)
+ {
+ m_occurrenceIndicator = occurrenceIndicator;
+ }
+
+ /**
+ * Sets the schemaContext.
+ * @param schemaContext The schemaContext to set
+ */
+ public void setSchemaContext(SchemaContext schemaContext)
+ {
+ m_schemaContext = schemaContext;
+ }
+
+ /**
+ * Sets the schemaTypeName.
+ * @param schemaTypeName The schemaTypeName to set
+ */
+ public void setSchemaTypeName(org.apache.xml.utils.QName schemaTypeName)
+ {
+ m_schemaTypeName = schemaTypeName;
+ }
+
+ /**
+ * Sets the targetExpr.
+ * @param targetExpr The targetExpr to set
+ */
+ public void setTargetExpr(Expression targetExpr)
+ {
+ m_targetExpr = targetExpr;
+ }
+
+ /**
+ * Sets the whatToShow.
+ * @param whatToShow The whatToShow to set
+ */
+ public void setWhatToShow(int whatToShow)
+ {
+ m_whatToShow = whatToShow;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ SequenceType stype = (SequenceType)n;
+ stype.setAtomicTypeID(m_atomicTypeID);
+ stype.setElemOrAttrName(m_elemOrAttrName);
+ stype.setOccurrenceIndicator(m_occurrenceIndicator);
+ stype.setSchemaContext(m_schemaContext);
+ stype.setSchemaTypeName(m_schemaTypeName);
+ stype.setWhatToShow(m_whatToShow);
+ super.jjtSetParent(n);
+ }
+
+ /**
+ * Returns the atomicTypeID.
+ * @return int
+ */
+ public int getAtomicTypeID()
+ {
+ return m_atomicTypeID;
+ }
+
+ /**
+ * Returns the elemOrAttrName.
+ * @return org.apache.xml.utils.QName
+ */
+ public org.apache.xml.utils.QName getElemOrAttrName()
+ {
+ return m_elemOrAttrName;
+ }
+
+ /**
+ * Sets the atomicTypeID.
+ * @param atomicTypeID The atomicTypeID to set
+ */
+ public void setAtomicTypeID(int atomicTypeID)
+ {
+ m_atomicTypeID = atomicTypeID;
+ }
+
+ /**
+ * Sets the elemOrAttrName.
+ * @param elemOrAttrName The elemOrAttrName to set
+ */
+ public void setElemOrAttrName(org.apache.xml.utils.QName elemOrAttrName)
+ {
+ m_elemOrAttrName = elemOrAttrName;
+ }
+
+
+}
diff --git a/src/org/apache/xpath/parser/JJTXPathState.java b/src/org/apache/xpath/parser/JJTXPathState.java
new file mode 100644
index 0000000..21a5cca
--- /dev/null
+++ b/src/org/apache/xpath/parser/JJTXPathState.java
@@ -0,0 +1,123 @@
+/* Generated By:JJTree: Do not edit this line. F:/xalan3/xml-xalan/java/xpath-src\JJTXPathState.java */
+
+package org.apache.xpath.parser;
+
+class JJTXPathState {
+ private java.util.Stack nodes;
+ private java.util.Stack marks;
+
+ private int sp; // number of nodes on stack
+ private int mk; // current mark
+ private boolean node_created;
+
+ JJTXPathState() {
+ nodes = new java.util.Stack();
+ marks = new java.util.Stack();
+ sp = 0;
+ mk = 0;
+ }
+
+ /* Determines whether the current node was actually closed and
+ pushed. This should only be called in the final user action of a
+ node scope. */
+ boolean nodeCreated() {
+ return node_created;
+ }
+
+ /* Call this to reinitialize the node stack. It is called
+ automatically by the parser's ReInit() method. */
+ void reset() {
+ nodes.removeAllElements();
+ marks.removeAllElements();
+ sp = 0;
+ mk = 0;
+ }
+
+ /* Returns the root node of the AST. It only makes sense to call
+ this after a successful parse. */
+ Node rootNode() {
+ return (Node)nodes.elementAt(0);
+ }
+
+ /* Pushes a node on to the stack. */
+ void pushNode(Node n) {
+ nodes.push(n);
+ ++sp;
+ }
+
+ /* Returns the node on the top of the stack, and remove it from the
+ stack. */
+ Node popNode() {
+ if (--sp < mk) {
+ mk = ((Integer)marks.pop()).intValue();
+ }
+ return (Node)nodes.pop();
+ }
+
+ /* Returns the node currently on the top of the stack. */
+ Node peekNode() {
+ return (Node)nodes.peek();
+ }
+
+ /* Returns the number of children on the stack in the current node
+ scope. */
+ int nodeArity() {
+ return sp - mk;
+ }
+
+
+ void clearNodeScope(Node n) {
+ while (sp > mk) {
+ popNode();
+ }
+ mk = ((Integer)marks.pop()).intValue();
+ }
+
+
+ void openNodeScope(Node n) {
+ marks.push(new Integer(mk));
+ mk = sp;
+ n.jjtOpen();
+ }
+
+
+ /* A definite node is constructed from a specified number of
+ children. That number of nodes are popped from the stack and
+ made the children of the definite node. Then the definite node
+ is pushed on to the stack. */
+ void closeNodeScope(Node n, int num) {
+ mk = ((Integer)marks.pop()).intValue();
+ while (num-- > 0) {
+ Node c = popNode();
+ c.jjtSetParent(n);
+ n.jjtAddChild(c, num);
+ }
+ n.jjtClose();
+ pushNode(n);
+ node_created = true;
+ }
+
+
+ /* A conditional node is constructed if its condition is true. All
+ the nodes that have been pushed since the node was opened are
+ made children of the the conditional node, which is then pushed
+ on to the stack. If the condition is false the node is not
+ constructed and they are left on the stack. */
+ void closeNodeScope(Node n, boolean condition) {
+ if (condition) {
+ int a = nodeArity();
+ mk = ((Integer)marks.pop()).intValue();
+ while (a-- > 0) {
+ Node c = popNode();
+ c.jjtSetParent(n);
+ n.jjtAddChild(c, a);
+ }
+ n.jjtClose();
+ pushNode(n);
+ node_created = true;
+ } else {
+ mk = ((Integer)marks.pop()).intValue();
+ node_created = false;
+ }
+ }
+}
diff --git a/src/org/apache/xpath/parser/KindTest.java b/src/org/apache/xpath/parser/KindTest.java
new file mode 100644
index 0000000..a2f7011
--- /dev/null
+++ b/src/org/apache/xpath/parser/KindTest.java
@@ -0,0 +1,28 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class KindTest extends NameTest
+{
+ public KindTest(XPath parser)
+ {
+ super(parser);
+ }
+
+// Why on earth did I have this commented?
+// public int getWhatToShow()
+// {
+// return 0;
+// }
+}
+
diff --git a/src/org/apache/xpath/parser/LbrackOrRbrack.java b/src/org/apache/xpath/parser/LbrackOrRbrack.java
new file mode 100644
index 0000000..1d75f1d
--- /dev/null
+++ b/src/org/apache/xpath/parser/LbrackOrRbrack.java
@@ -0,0 +1,9 @@
+package org.apache.xpath.parser;
+public class LbrackOrRbrack extends NonExecutableExpression
+{
+ public LbrackOrRbrack(XPath parser)
+ {
+ super(parser);
+ }
+}
+
diff --git a/src/org/apache/xpath/parser/NCNameColonStar.java b/src/org/apache/xpath/parser/NCNameColonStar.java
new file mode 100644
index 0000000..e5aa067
--- /dev/null
+++ b/src/org/apache/xpath/parser/NCNameColonStar.java
@@ -0,0 +1,30 @@
+package org.apache.xpath.parser;
+public class NCNameColonStar extends StarColonNCName
+{
+ NCNameColonStar(XPath parser)
+ {
+ super(parser);
+ }
+
+ protected String m_namespace;
+
+ public String getNamespaceURI()
+ {
+ return m_namespace;
+ }
+
+ public String getLocalName()
+ {
+ return org.apache.xpath.patterns.NodeTest.WILD;
+ }
+
+
+ public void processToken(Token t)
+ {
+ int posOfColon = t.image.indexOf(':');
+ String prefix = t.image.substring(0, posOfColon).trim();
+ m_namespace = m_prefixResolver.getNamespaceForPrefix(prefix);
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/NameTest.java b/src/org/apache/xpath/parser/NameTest.java
new file mode 100644
index 0000000..c09b080
--- /dev/null
+++ b/src/org/apache/xpath/parser/NameTest.java
@@ -0,0 +1,142 @@
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.DTMFilter;
+import org.apache.xpath.objects.XString;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class NameTest extends NonExecutableExpression
+{
+ public NameTest(XPath parser)
+ {
+ super(parser);
+ }
+
+ void processKindTest(KindTest kind)
+ {
+ if (kind instanceof AnyKindTest)
+ {
+ m_isTotallyWild = true;
+ // m_name = org.apache.xpath.patterns.NodeTest.WILD;
+ m_name = org.apache.xpath.patterns.StepPattern.PSEUDONAME_ANY;
+ m_namespace = null;
+ if (m_parser.m_predLevel == 0 && m_parser.m_isMatchPattern)
+ m_whatToShow =
+ ~DTMFilter.SHOW_ATTRIBUTE
+ & ~DTMFilter.SHOW_DOCUMENT
+ & ~DTMFilter.SHOW_DOCUMENT_FRAGMENT;
+ else
+ m_whatToShow = DTMFilter.SHOW_ALL;
+ }
+ else
+ if (kind instanceof TextTest)
+ {
+ m_isTotallyWild = false;
+ m_name = org.apache.xpath.patterns.StepPattern.PSEUDONAME_TEXT;
+ m_namespace = null;
+ m_whatToShow = DTMFilter.SHOW_TEXT;
+ }
+ else
+ if (kind instanceof CommentTest)
+ {
+ m_isTotallyWild = false;
+ m_name = org.apache.xpath.patterns.StepPattern.PSEUDONAME_COMMENT;
+ m_namespace = null;
+ m_whatToShow = DTMFilter.SHOW_COMMENT;
+ }
+ else
+ if (kind instanceof ProcessingInstructionTest)
+ {
+ m_isTotallyWild = false;
+ m_name = ((ProcessingInstructionTest)kind).getLocalName();
+ m_namespace = null;
+ m_whatToShow = DTMFilter.SHOW_PROCESSING_INSTRUCTION;
+ }
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ if(n instanceof QName)
+ {
+ QName qname = ((QName)n);
+ m_namespace = qname.getNamespaceURI();
+ m_name = qname.getLocalName();
+ m_whatToShow = DTMFilter.SHOW_ELEMENT;
+ }
+ else if(n instanceof Star)
+ {
+ m_isTotallyWild = true;
+ m_name = org.apache.xpath.patterns.NodeTest.WILD;
+ // m_name = null;
+ m_namespace = null;
+ m_whatToShow = DTMFilter.SHOW_ELEMENT;
+ }
+ else if(n instanceof KindTest)
+ {
+ if(jjtGetNumChildren() > 0)
+ {
+ processKindTest((KindTest)n.jjtGetChild(0));
+ }
+ else
+ {
+ processKindTest((KindTest)n);
+ }
+ super.jjtAddChild(n, i);
+ }
+ else
+ {
+ // Probably this is a CommentTest, TextTest, etc.
+ // super.jjtAddChild(n, i);
+ // Assertion, should never happen.
+ throw new RuntimeException("node can only be a QName, Wildcard, or KindTest!");
+ }
+ }
+
+ private boolean m_isTotallyWild = false;
+
+ public boolean isTotallyWild()
+ {
+ return m_isTotallyWild;
+ }
+
+ public void setIsTotallyWild(boolean b)
+ {
+ m_isTotallyWild = b;
+ }
+
+
+ /**
+ * The namespace to be tested for, which may be null.
+ * @serial
+ */
+ String m_namespace;
+
+ /**
+ * The local name to be tested for.
+ * @serial
+ */
+ String m_name;
+
+ public String getNamespaceURI()
+ {
+ return m_namespace;
+ }
+
+ public String getLocalName()
+ {
+ return m_name;
+ }
+
+ int m_whatToShow = DTMFilter.SHOW_ALL;
+
+ public int getWhatToShow()
+ {
+ return m_whatToShow; // ??
+ }
+
+
+
+}
+
diff --git a/src/org/apache/xpath/parser/Node.java b/src/org/apache/xpath/parser/Node.java
new file mode 100644
index 0000000..2e17f1b
--- /dev/null
+++ b/src/org/apache/xpath/parser/Node.java
@@ -0,0 +1,37 @@
+/* Generated By:JJTree: Do not edit this line. Node.java */
+
+/* All AST nodes must implement this interface. It provides basic
+ machinery for constructing the parent and child relationships
+ between nodes. */
+
+package org.apache.xpath.parser;
+
+public interface Node {
+
+ /** This method is called after the node has been made the current
+ node. It indicates that child nodes can now be added to it. */
+ public void jjtOpen();
+
+ /** This method is called after all the child nodes have been
+ added. */
+ public void jjtClose();
+
+ /** This pair of methods are used to inform the node of its
+ parent. */
+ public void jjtSetParent(Node n);
+ public Node jjtGetParent();
+
+ /** This method tells the node to add its argument to the node's
+ list of children. */
+ public void jjtAddChild(Node n, int i);
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public Node jjtGetChild(int i);
+
+ /** Return the number of children the node has. */
+ public int jjtGetNumChildren();
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(XPathVisitor visitor, Object data);
+}
diff --git a/src/org/apache/xpath/parser/NodeTest.java b/src/org/apache/xpath/parser/NodeTest.java
new file mode 100644
index 0000000..0fdecbf
--- /dev/null
+++ b/src/org/apache/xpath/parser/NodeTest.java
@@ -0,0 +1,102 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class NodeTest extends NonExecutableExpression
+{
+ public NodeTest(XPath parser)
+ {
+ super(parser);
+ }
+
+ NodeTest(int whatToShow, XPath parser)
+ {
+ super(parser);
+ m_whatToShow = whatToShow;
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ if(n instanceof NameTest) // includes KindTest
+ {
+ NameTest ntest = (NameTest)n;
+ m_isTotallyWild = ntest.isTotallyWild();
+ m_namespace = ntest.getNamespaceURI();
+ m_name = ntest.getLocalName();
+ m_whatToShow = ntest.getWhatToShow();
+ }
+ else
+ {
+ // Assertion, should never happen.
+ throw new RuntimeException("Child of NodeTest can only be a NameTest or KindTest: "+
+ n+" "+m_parser.m_prefixResolver);
+ }
+ }
+
+ int m_whatToShow;
+
+ public int getWhatToShow()
+ {
+ return m_whatToShow;
+ }
+
+ public void setWhatToShow(int wts)
+ {
+ m_whatToShow = wts;
+ }
+
+
+ private boolean m_isTotallyWild = false;
+
+ public boolean isTotallyWild()
+ {
+ return m_isTotallyWild;
+ }
+
+ public void setTotallyWild(boolean b)
+ {
+ m_isTotallyWild = b;
+ }
+
+ /**
+ * The namespace to be tested for, which may be null.
+ */
+ String m_namespace;
+
+ /**
+ * The local name to be tested for.
+ */
+ String m_name;
+
+ public String getNamespaceURI()
+ {
+ return m_namespace;
+ }
+
+ public String getLocalName()
+ {
+ return m_name;
+ }
+
+ public void setNamespaceURI(String n)
+ {
+ m_namespace = n;
+ }
+
+ public void setLocalName(String n)
+ {
+ m_name = n;
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/NodeTestType.java b/src/org/apache/xpath/parser/NodeTestType.java
new file mode 100644
index 0000000..e3ae696
--- /dev/null
+++ b/src/org/apache/xpath/parser/NodeTestType.java
@@ -0,0 +1,111 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.DTMFilter;
+
+/**
+ * The responsibility of this node is to hold simple node tests for
+ * the SequenceType/ItemType.
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class NodeTestType extends NonExecutableExpression
+{
+ int m_whatToShow;
+
+ /**
+ * Constructor for ElemOrAttrType.
+ * @param parser The parser that is producing this node.
+ * @param value one of DTMFilter.SHOW_ATTRIBUTE, DTMFilter.SHOW_ELEMENT, etc.
+ */
+ public NodeTestType(XPath parser, int whatToShow)
+ {
+ super(parser);
+ m_whatToShow = whatToShow;
+ }
+
+ /**
+ * Returns the whatToShow value.
+ * @return int one of DTMFilter.SHOW_ATTRIBUTE, DTMFilter.SHOW_ELEMENT, etc.
+ */
+ public int getWhatToShow()
+ {
+ return m_whatToShow;
+ }
+
+ /**
+ * Sets the whatToShow value.
+ * @param whatToShow The whatToShow value to set,
+ * one of DTMFilter.SHOW_ATTRIBUTE, DTMFilter.SHOW_ELEMENT, etc.
+ */
+ public void setWhatToShow(int whatToShow)
+ {
+ m_whatToShow = whatToShow;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ ((ItemType)n).setWhatToShow(m_whatToShow);
+ super.jjtSetParent(n);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/NonExecutableExpression.java b/src/org/apache/xpath/parser/NonExecutableExpression.java
new file mode 100644
index 0000000..7a102c1
--- /dev/null
+++ b/src/org/apache/xpath/parser/NonExecutableExpression.java
@@ -0,0 +1,132 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.DTM;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class NonExecutableExpression extends Expression
+{
+ protected XPath m_parser; // I'm going to leave this for right now only.
+
+ public NonExecutableExpression(XPath parser, String value)
+ {
+ m_parser = parser;
+ m_value = value;
+ }
+
+ protected NonExecutableExpression(XPath parser)
+ {
+ m_parser = parser;
+ }
+
+ public XPath getParser()
+ {
+ return m_parser;
+ }
+
+ public Vector m_exprs = new Vector();
+
+ public void jjtAddChild(Node n, int i)
+ {
+ n = fixupPrimarys(n);
+ if(null == m_exprs)
+ m_exprs = new Vector();
+ if(i >= m_exprs.size())
+ {
+ m_exprs.setSize(i+1);
+ }
+ m_exprs.setElementAt(n, i);
+ }
+
+ public Node jjtGetChild(int i)
+ {
+ if(null == m_exprs)
+ return null;
+ else
+ return (Node)m_exprs.elementAt(i);
+ }
+
+ public int jjtGetNumChildren()
+ {
+ if(null == m_exprs)
+ return 0;
+ else
+ return m_exprs.size();
+ }
+
+ String m_value;
+ public void processToken(Token t) { m_value = t.image; }
+
+ public String toString()
+ {
+ return this.getClass().getName()+ ((null == m_value) ? "" : (" "+m_value));
+ }
+
+
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ * Dummy stub.
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ * Dummy stub.
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ * Dummy stub.
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ throw new RuntimeException("Can't execute a NonExecutableExpression!");
+ // return null;
+ }
+
+ public XObject execute(XPathContext xctxt, int currentNode)
+ throws javax.xml.transform.TransformerException
+ {
+ throw new RuntimeException("Can't execute a NonExecutableExpression!");
+ }
+
+ public XObject execute(
+ XPathContext xctxt, int currentNode, DTM dtm, int expType)
+ throws javax.xml.transform.TransformerException
+ {
+ throw new RuntimeException("Can't execute a NonExecutableExpression!");
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ * Dummy stub.
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+}
+
diff --git a/src/org/apache/xpath/parser/OccurrenceIndicator.java b/src/org/apache/xpath/parser/OccurrenceIndicator.java
new file mode 100644
index 0000000..0b774ab
--- /dev/null
+++ b/src/org/apache/xpath/parser/OccurrenceIndicator.java
@@ -0,0 +1,88 @@
+/* Generated By:JJTree: Do not edit this line. OccurrenceIndicator.java */
+
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.operations.Add;
+import org.apache.xpath.types.InstanceofExpr;
+
+public class OccurrenceIndicator extends NonExecutableExpression
+{
+ int m_occuranceType;
+
+ /**
+ * Constructor for OccurrenceIndicator.
+ * @param parser
+ * @param value
+ */
+ public OccurrenceIndicator(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for OccurrenceIndicator.
+ * @param parser
+ */
+ public OccurrenceIndicator(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ if(n instanceof Add) // Hack... there should be a PlusOccuranceIndicator token!..
+ m_occuranceType = InstanceofExpr.ONE_OR_MORE;
+ else
+ {
+ // Assume NEE
+ char c = ((NonExecutableExpression)n).m_value.charAt(0);
+ if('*' == c)
+ m_occuranceType = InstanceofExpr.ZERO_OR_MORE;
+ else if('?' == c)
+ m_occuranceType = InstanceofExpr.ZERO_OR_ONE;
+ else
+ this.flagProblem("The occurance indicator value is unknown! Value: "+c);
+ }
+ }
+
+ /**
+ * Returns the occuranceType.
+ * @return int
+ */
+ public int getOccuranceType()
+ {
+ return m_occuranceType;
+ }
+
+ /**
+ * Sets the occuranceType.
+ * @param occuranceType The occuranceType to set
+ */
+ public void setOccuranceType(int occuranceType)
+ {
+ m_occuranceType = occuranceType;
+ }
+
+
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ if(n instanceof SequenceType)
+ ((SequenceType)n).setOccurrenceIndicator(m_occuranceType);
+ super.jjtSetParent(n);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/OfType.java b/src/org/apache/xpath/parser/OfType.java
new file mode 100644
index 0000000..2255268
--- /dev/null
+++ b/src/org/apache/xpath/parser/OfType.java
@@ -0,0 +1,35 @@
+/* Generated By:JJTree: Do not edit this line. OfType.java */
+
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+public class OfType extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for OfType.
+ * @param parser
+ * @param value
+ */
+ public OfType(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for OfType.
+ * @param parser
+ */
+ public OfType(XPath parser)
+ {
+ super(parser);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/ParseException.java b/src/org/apache/xpath/parser/ParseException.java
new file mode 100644
index 0000000..acc9236
--- /dev/null
+++ b/src/org/apache/xpath/parser/ParseException.java
@@ -0,0 +1,192 @@
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */
+
+package org.apache.xpath.parser;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ *
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
+public class ParseException extends Exception {
+
+ /**
+ * This constructor is used by the method "generateParseException"
+ * in the generated parser. Calling this constructor generates
+ * a new object of this type with the fields "currentToken",
+ * "expectedTokenSequences", and "tokenImage" set. The boolean
+ * flag "specialConstructor" is also set to true to indicate that
+ * this constructor was used to create this object.
+ * This constructor calls its super class with the empty string
+ * to force the "toString" method of parent class "Throwable" to
+ * print the error message in the form:
+ * ParseException: <result of getMessage>
+ */
+ public ParseException(Token currentTokenVal,
+ int[][] expectedTokenSequencesVal,
+ String[] tokenImageVal
+ )
+ {
+ super("");
+ specialConstructor = true;
+ currentToken = currentTokenVal;
+ expectedTokenSequences = expectedTokenSequencesVal;
+ tokenImage = tokenImageVal;
+ }
+
+ /**
+ * The following constructors are for use by you for whatever
+ * purpose you can think of. Constructing the exception in this
+ * manner makes the exception behave in the normal way - i.e., as
+ * documented in the class "Throwable". The fields "errorToken",
+ * "expectedTokenSequences", and "tokenImage" do not contain
+ * relevant information. The JavaCC generated code does not use
+ * these constructors.
+ */
+
+ public ParseException() {
+ super();
+ specialConstructor = false;
+ }
+
+ public ParseException(String message) {
+ super(message);
+ specialConstructor = false;
+ }
+
+ /**
+ * This variable determines which constructor was used to create
+ * this object and thereby affects the semantics of the
+ * "getMessage" method (see below).
+ */
+ protected boolean specialConstructor;
+
+ /**
+ * This is the last token that has been consumed successfully. If
+ * this object has been created due to a parse error, the token
+ * followng this token will (therefore) be the first error token.
+ */
+ public Token currentToken;
+
+ /**
+ * Each entry in this array is an array of integers. Each array
+ * of integers represents a sequence of tokens (by their ordinal
+ * values) that is expected at this point of the parse.
+ */
+ public int[][] expectedTokenSequences;
+
+ /**
+ * This is a reference to the "tokenImage" array of the generated
+ * parser within which the parse error occurred. This array is
+ * defined in the generated ...Constants interface.
+ */
+ public String[] tokenImage;
+
+ /**
+ * This method has the standard behavior when this object has been
+ * created using the standard constructors. Otherwise, it uses
+ * "currentToken" and "expectedTokenSequences" to generate a parse
+ * error message and returns it. If this object has been created
+ * due to a parse error, and you do not catch it (it gets thrown
+ * from the parser), then this method is called during the printing
+ * of the final stack trace, and hence the correct error message
+ * gets displayed.
+ */
+ public String getMessage() {
+ if (!specialConstructor) {
+ return super.getMessage();
+ }
+ String expected = "";
+ int maxSize = 0;
+ for (int i = 0; i < expectedTokenSequences.length; i++) {
+ if (maxSize < expectedTokenSequences[i].length) {
+ maxSize = expectedTokenSequences[i].length;
+ }
+ for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+ expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+ }
+ if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+ expected += "...";
+ }
+ expected += eol + " ";
+ }
+ String retval = "Encountered \"";
+ Token tok = currentToken.next;
+ for (int i = 0; i < maxSize; i++) {
+ if (i != 0) retval += " ";
+ if (tok.kind == 0) {
+ retval += tokenImage[0];
+ break;
+ }
+ retval += add_escapes(tok.image);
+ tok = tok.next;
+ }
+ retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol;
+ if (expectedTokenSequences.length == 1) {
+ retval += "Was expecting:" + eol + " ";
+ } else {
+ retval += "Was expecting one of:" + eol + " ";
+ }
+ retval += expected;
+ return retval;
+ }
+
+ /**
+ * The end of line string for this machine.
+ */
+ protected String eol = System.getProperty("line.separator", "\n");
+
+ /**
+ * Used to convert raw characters to their escaped version
+ * when these raw version cannot be used as part of an ASCII
+ * string literal.
+ */
+ protected String add_escapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/PathExpr.java b/src/org/apache/xpath/parser/PathExpr.java
new file mode 100644
index 0000000..0b9d15e
--- /dev/null
+++ b/src/org/apache/xpath/parser/PathExpr.java
@@ -0,0 +1,117 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+
+import org.apache.xpath.functions.Function;
+import org.apache.xpath.operations.Variable;
+
+public class PathExpr extends NonExecutableExpression
+{
+ public PathExpr(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * Tell if this node is part of a PathExpr chain. For instance:
+ * <pre>
+ * |UnaryExpr
+ * | PathExpr
+ * | StepExpr
+ * | AxisChild child::
+ * | NodeTest
+ * | NameTest
+ * | QName foo
+ * | Predicates *
+ * </pre><br/>
+ * In this example, UnaryExpr, PathExpr, and StepExpr should all return true.
+ */
+ public boolean isPathExpr()
+ {
+ return true;
+ }
+
+
+// public void jjtAddChild(Node n, int i)
+// {
+// n = fixupPrimarys(n);
+// if(null == m_exprs)
+// m_exprs = new Vector();
+// if(i >= m_exprs.size())
+// {
+// m_exprs.setSize(i+1);
+// }
+// m_exprs.setElementAt(n, i);
+// }
+
+ public void jjtClose()
+ {
+ int size = m_exprs.size();
+ for(int i = size-1; i >= 0; i--)
+ {
+ SimpleNode node = (SimpleNode)m_exprs.elementAt(i);
+ if(node instanceof SlashOrSlashSlash)
+ {
+ boolean isSlashSlash = ((SlashOrSlashSlash)node).getisSlashSlash();
+ if(isSlashSlash)
+ {
+ node = new StepExpr(m_parser);
+ PatternAxis patAxis = new PatternAxis(org.apache.xml.dtm.Axis.DESCENDANTORSELF, m_parser);
+ patAxis.m_value = "descendant-or-self::"; // for diagnostics
+ NodeTest nt = new NodeTest(org.apache.xml.dtm.DTMFilter.SHOW_ALL, m_parser);
+ Predicates preds = new Predicates(m_parser);
+ node.jjtAddChild(patAxis, 0);
+ node.jjtAddChild(nt, 1);
+ node.jjtAddChild(preds, 2);
+ m_exprs.setElementAt(node, i);
+ }
+ else
+ m_exprs.removeElementAt(i);
+ // i--;
+ }
+
+ }
+ Node child;
+ if((jjtGetNumChildren() == 1)
+ && (child = jjtGetChild(0)) instanceof StepExpr)
+ {
+ if(child.jjtGetNumChildren() == 2)
+ {
+ StepExpr stepExpr = (StepExpr)child;
+ if(stepExpr.getPredicates().jjtGetNumChildren() == 0)
+ {
+ Node varOrFunc = stepExpr.jjtGetChild(0);
+ if(varOrFunc instanceof Variable
+ || varOrFunc instanceof Function
+ || varOrFunc instanceof org.apache.xpath.patterns.FunctionPattern)
+ {
+ m_exprs.setElementAt(varOrFunc, 0);
+ varOrFunc.jjtSetParent(this); // parent will continue to reduce.
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ if (n instanceof StepExpr && n.jjtGetChild(0) instanceof Variable)
+ {
+ if (null == m_exprs)
+ m_exprs = new Vector();
+ if (i >= m_exprs.size())
+ {
+ m_exprs.setSize(i + 1);
+ }
+ m_exprs.setElementAt(n, i);
+ }
+ else
+ super.jjtAddChild(n, i);
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/Pattern.java b/src/org/apache/xpath/parser/Pattern.java
new file mode 100644
index 0000000..8769a68
--- /dev/null
+++ b/src/org/apache/xpath/parser/Pattern.java
@@ -0,0 +1,86 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+
+import org.apache.xerces.impl.xpath.XPath.Axis;
+import org.apache.xpath.Expression;
+import org.apache.xpath.patterns.StepPattern;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class Pattern extends NonExecutableExpression
+{
+ public Pattern(XPath parser)
+ {
+ super(parser);
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ if(null == m_exprs)
+ m_exprs = new Vector();
+ if(i >= m_exprs.size())
+ {
+ m_exprs.setSize(i+1);
+ }
+ int invertedPos = (m_exprs.size()-1)-i;
+ if(0 == invertedPos)
+ {
+// if(n instanceof StepPattern)
+// {
+// StepPattern spat = (StepPattern)n;
+// spat.setAxis(org.apache.xml.dtm.Axis.SELF);
+// }
+ m_exprs.setElementAt(n, invertedPos);
+ }
+ else if(n instanceof SlashOrSlashSlash)
+ {
+ m_exprs.setElementAt(n, invertedPos);
+ }
+ else
+ {
+ int prevNodePos = invertedPos-1;
+ Node prevNode = (Node)m_exprs.elementAt(prevNodePos);
+ int whichAxis;
+ if(prevNode instanceof SlashOrSlashSlash)
+ {
+ m_exprs.removeElementAt(prevNodePos);
+ whichAxis = ((SlashOrSlashSlash)prevNode).getisSlashSlash() ?
+ org.apache.xml.dtm.Axis.ANCESTOR : org.apache.xml.dtm.Axis.PARENT;
+
+ if(n instanceof StepPattern)
+ {
+ StepPattern spat = (StepPattern)n;
+ spat.setAxis(whichAxis);
+ }
+ }
+
+ Node head = (Node)m_exprs.elementAt(0);
+ if(head instanceof StepPattern)
+ {
+ StepPattern headPat = (StepPattern)head;
+ StepPattern tail = headPat.getRelativePathPattern();
+ while(null != tail)
+ {
+ headPat = tail;
+ tail = tail.getRelativePathPattern();
+ }
+ headPat.setExpression((Expression)n);
+ }
+
+ }
+ }
+
+ public void jjtClose()
+ {
+ if(jjtGetNumChildren() > 0)
+ {
+ ((StepPattern)jjtGetChild(0)).calcScore();
+ int i = 4; // debugger breakpoint
+ }
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/PatternAxis.java b/src/org/apache/xpath/parser/PatternAxis.java
new file mode 100644
index 0000000..81aa677
--- /dev/null
+++ b/src/org/apache/xpath/parser/PatternAxis.java
@@ -0,0 +1,54 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class PatternAxis extends NonExecutableExpression
+{
+ public PatternAxis(XPath parser)
+ {
+ super(parser);
+ }
+
+ int m_axis;
+
+ /**
+ * Return what axis this node represents.
+ * @return one of org.apache.xml.dtm.Axis.DESCENDANT, etc.
+ */
+ public int getAxis()
+ {
+ return m_axis;
+ }
+
+ /**
+ * Return what axis this node represents.
+ * @return one of org.apache.xml.dtm.Axis.DESCENDANT, etc.
+ */
+ public void setAxis(int axis)
+ {
+ m_axis = axis;
+ }
+
+
+ /**
+ * Construct a PatternAxis.
+ *
+ * @param axis one of org.apache.xml.dtm.Axis.DESCENDANT, etc.
+ */
+ PatternAxis(int axis, XPath parser)
+ {
+ super(parser);
+ m_axis = axis;
+ }
+}
+
diff --git a/src/org/apache/xpath/parser/Predicates.java b/src/org/apache/xpath/parser/Predicates.java
new file mode 100644
index 0000000..8cf8a1c
--- /dev/null
+++ b/src/org/apache/xpath/parser/Predicates.java
@@ -0,0 +1,43 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class Predicates extends NonExecutableExpression
+{
+ public Predicates(XPath parser)
+ {
+ super(parser);
+ }
+
+ public Vector getPreds()
+ {
+ return m_exprs;
+ }
+
+ public void jjtClose()
+ {
+ if(null == m_exprs)
+ return;
+ int count = m_exprs.size();
+ for(int i = count-1; i >= 0; i--)
+ {
+ Object n = m_exprs.elementAt(i);
+ if(n instanceof LbrackOrRbrack)
+ m_exprs.removeElementAt(i);
+ }
+ super.jjtClose();
+ }
+
+
+}
+
diff --git a/src/org/apache/xpath/parser/ProcessingInstructionTest.java b/src/org/apache/xpath/parser/ProcessingInstructionTest.java
new file mode 100644
index 0000000..6c676f3
--- /dev/null
+++ b/src/org/apache/xpath/parser/ProcessingInstructionTest.java
@@ -0,0 +1,45 @@
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.DTMFilter;
+import org.apache.xpath.objects.XString;
+import org.apache.xpath.patterns.StepPattern;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class ProcessingInstructionTest extends KindTest
+{
+ public ProcessingInstructionTest(XPath parser)
+ {
+ super(parser);
+ m_name = StepPattern.WILD;
+ }
+
+ public int getWhatToShow()
+ {
+ return DTMFilter.SHOW_PROCESSING_INSTRUCTION;
+ }
+
+
+ public String getLocalName()
+ {
+ return m_name;
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ if(n instanceof org.apache.xpath.objects.XString) // Includes KindTest
+ {
+ m_name = ((XString)n).str();
+ }
+ else
+ {
+ // Assertion, should never happen.
+ throw new RuntimeException("node can only be a QName or Wildcard!");
+ }
+ }
+
+
+}
+
diff --git a/src/org/apache/xpath/parser/QName.java b/src/org/apache/xpath/parser/QName.java
new file mode 100644
index 0000000..d368bfc
--- /dev/null
+++ b/src/org/apache/xpath/parser/QName.java
@@ -0,0 +1,70 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xml.utils.PrefixResolver;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class QName extends NonExecutableExpression
+{
+ protected PrefixResolver m_prefixResolver;
+
+ QName(XPath parser)
+ {
+ super(parser);
+ m_prefixResolver = parser.m_prefixResolver;
+ }
+
+ protected org.apache.xml.utils.QName m_qname;
+
+ public org.apache.xml.utils.QName getQName()
+ {
+ return m_qname;
+ }
+
+ public String getNamespaceURI()
+ {
+ return m_qname.getNamespaceURI();
+ }
+
+ public String getLocalName()
+ {
+ return m_qname.getLocalName();
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#processToken(Token)
+ */
+ public void processToken(Token t)
+ {
+ if (null == m_qname)
+ // We might have to call this earlier than natural, so avoid duplicate processing.
+ {
+ String qname = t.image;
+ int parenIndex = qname.lastIndexOf("(");
+ if (parenIndex > 0)
+ {
+ qname = qname.substring(0, qname.lastIndexOf("("));
+ }
+ try
+ {
+ qname = qname.trim();
+ m_qname = new org.apache.xml.utils.QName(qname, m_prefixResolver);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ }
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/QuantifiedExpr.java b/src/org/apache/xpath/parser/QuantifiedExpr.java
new file mode 100644
index 0000000..5904c2e
--- /dev/null
+++ b/src/org/apache/xpath/parser/QuantifiedExpr.java
@@ -0,0 +1,22 @@
+package org.apache.xpath.parser;
+public class QuantifiedExpr extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for QuantifiedExpr
+ */
+ public QuantifiedExpr(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * @see SimpleNode#shouldReduceIfOneChild()
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return (jjtGetNumChildren() == 1) ? true : false;
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/Return.java b/src/org/apache/xpath/parser/Return.java
new file mode 100644
index 0000000..2f2fce6
--- /dev/null
+++ b/src/org/apache/xpath/parser/Return.java
@@ -0,0 +1,22 @@
+/* Generated By:JJTree: Do not edit this line. Return.java */
+
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.seqctor.FLWRExpr;
+
+// The return node should probably be void
+public class Return extends NonExecutableExpression
+{
+
+ public Return(XPath parser)
+ {
+ super(parser);
+ }
+}
diff --git a/src/org/apache/xpath/parser/RootOfRoot.java b/src/org/apache/xpath/parser/RootOfRoot.java
new file mode 100644
index 0000000..27466c7
--- /dev/null
+++ b/src/org/apache/xpath/parser/RootOfRoot.java
@@ -0,0 +1,29 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+// This is a dummy class, created because I can't seem to get the XPath2
+// node off the top of the tree by using #void.
+public class RootOfRoot extends NonExecutableExpression
+{
+ public RootOfRoot(XPath parser)
+ {
+ super(parser);
+ }
+
+ public void jjtClose()
+ {
+ // We don't want this node to any longer be the child's parent!
+ Node n = jjtGetChild(0);
+ n.jjtSetParent(null);
+ super.jjtClose();
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/RootOfRootPattern.java b/src/org/apache/xpath/parser/RootOfRootPattern.java
new file mode 100644
index 0000000..6a18c1b
--- /dev/null
+++ b/src/org/apache/xpath/parser/RootOfRootPattern.java
@@ -0,0 +1,45 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+
+import org.apache.xpath.patterns.UnionPattern;
+
+public class RootOfRootPattern extends RootOfRoot
+{
+ public RootOfRootPattern(XPath parser)
+ {
+ super(parser);
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ if(null == m_exprs)
+ m_exprs = new Vector();
+ if(i >= m_exprs.size())
+ {
+ m_exprs.setSize(i+1);
+ }
+ if(n instanceof UnionPattern)
+ {
+ UnionPattern up = (UnionPattern)n;
+ if(1 == up.jjtGetNumChildren())
+ {
+ n = up.jjtGetChild(0);
+ }
+ }
+ m_exprs.setElementAt(n, i);
+ }
+
+ public void jjtClose()
+ {
+ Node n = jjtGetChild(0);
+ if(n instanceof Pattern)
+ {
+ n.jjtSetParent(null);
+ m_exprs.setElementAt(n.jjtGetChild(0), 0);
+ }
+ super.jjtClose();
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/SchemaContext.java b/src/org/apache/xpath/parser/SchemaContext.java
new file mode 100644
index 0000000..7edf261
--- /dev/null
+++ b/src/org/apache/xpath/parser/SchemaContext.java
@@ -0,0 +1,87 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class SchemaContext extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for SchemaContext.
+ * @param parser
+ * @param value
+ */
+ public SchemaContext(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for SchemaContext.
+ * @param parser
+ */
+ public SchemaContext(XPath parser)
+ {
+ super(parser);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/SchemaContextStep.java b/src/org/apache/xpath/parser/SchemaContextStep.java
new file mode 100644
index 0000000..4b1cff1
--- /dev/null
+++ b/src/org/apache/xpath/parser/SchemaContextStep.java
@@ -0,0 +1,77 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class SchemaContextStep extends QName
+{
+
+ /**
+ * Constructor for SchemaContextStep.
+ * @param parser
+ */
+ public SchemaContextStep(XPath parser)
+ {
+ super(parser);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/SchemaGlobalContext.java b/src/org/apache/xpath/parser/SchemaGlobalContext.java
new file mode 100644
index 0000000..5c1bd96
--- /dev/null
+++ b/src/org/apache/xpath/parser/SchemaGlobalContext.java
@@ -0,0 +1,87 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class SchemaGlobalContext extends NonExecutableExpression
+{
+
+ /**
+ * Constructor for SchemaGlobalContext.
+ * @param parser
+ * @param value
+ */
+ public SchemaGlobalContext(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for SchemaGlobalContext.
+ * @param parser
+ */
+ public SchemaGlobalContext(XPath parser)
+ {
+ super(parser);
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/SchemaType.java b/src/org/apache/xpath/parser/SchemaType.java
new file mode 100644
index 0000000..8da5889
--- /dev/null
+++ b/src/org/apache/xpath/parser/SchemaType.java
@@ -0,0 +1,89 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.parser;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class SchemaType extends QName
+{
+
+ /**
+ * Constructor for SchemaType.
+ * @param parser
+ */
+ public SchemaType(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ QName qname = (QName)this.jjtGetChild(1);
+ ((ElemOrAttrType)n).setSchemaTypeName(qname.getQName());
+ super.jjtSetParent(n);
+ }
+
+
+
+}
diff --git a/src/org/apache/xpath/parser/SequenceType.java b/src/org/apache/xpath/parser/SequenceType.java
new file mode 100644
index 0000000..88461fa
--- /dev/null
+++ b/src/org/apache/xpath/parser/SequenceType.java
@@ -0,0 +1,187 @@
+/* Generated By:JJTree: Do not edit this line. SequenceType.java */
+
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.QName;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.types.InstanceofExpr;
+
+public class SequenceType extends NonExecutableExpression
+{
+
+ /** The sequence on which to act. **/
+ private Expression m_targetExpr;
+
+ /** The node type value, one of DTMFilter.SHOW_ATTRIBUTE, etc. **/
+ private int m_whatToShow;
+
+ /** The atomic type ID, one of XType.BOOLEAN, etc. **/
+ private int m_atomicTypeID;
+
+ /** The occurance indicator ID. One of ZERO_OR_MORE, etc. or EMPTY_SEQ **/
+ private int m_occurrenceIndicator = InstanceofExpr.ONE_OR_MORE;
+
+ /** The ElemOrAttrType name, meaning the tag QName, may be null. */
+ private org.apache.xml.utils.QName m_elemOrAttrName;
+
+ /** The SchemaType name, meaning the tag QName, may be null. */
+ private org.apache.xml.utils.QName m_schemaTypeName;
+
+ /** SchemaContext is not executable for the moment, so leave it
+ * as a NEE until we figure out what we want to do with it. **/
+ private SchemaContext m_schemaContext;
+
+
+ /**
+ * Constructor for SequenceType.
+ * @param parser
+ * @param value
+ */
+ public SequenceType(XPath parser, String value)
+ {
+ super(parser, value);
+ }
+
+ /**
+ * Constructor for SequenceType.
+ * @param parser
+ */
+ public SequenceType(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * Returns the occurrenceIndicator.
+ * @return int
+ */
+ public int getOccurrenceIndicator()
+ {
+ return m_occurrenceIndicator;
+ }
+
+ /**
+ * Returns the schemaContext.
+ * @return SchemaContext
+ */
+ public SchemaContext getSchemaContext()
+ {
+ return m_schemaContext;
+ }
+
+ /**
+ * Returns the schemaTypeName.
+ * @return org.apache.xml.utils.QName
+ */
+ public org.apache.xml.utils.QName getSchemaTypeName()
+ {
+ return m_schemaTypeName;
+ }
+
+ /**
+ * Returns the targetExpr.
+ * @return Expression
+ */
+ public Expression getTargetExpr()
+ {
+ return m_targetExpr;
+ }
+
+ /**
+ * Returns the whatToShow.
+ * @return int
+ */
+ public int getWhatToShow()
+ {
+ return m_whatToShow;
+ }
+
+ /**
+ * Sets the occurrenceIndicator.
+ * @param occurrenceIndicator The occurrenceIndicator to set
+ */
+ public void setOccurrenceIndicator(int occurrenceIndicator)
+ {
+ m_occurrenceIndicator = occurrenceIndicator;
+ }
+
+ /**
+ * Sets the schemaContext.
+ * @param schemaContext The schemaContext to set
+ */
+ public void setSchemaContext(SchemaContext schemaContext)
+ {
+ m_schemaContext = schemaContext;
+ }
+
+ /**
+ * Sets the schemaTypeName.
+ * @param schemaTypeName The schemaTypeName to set
+ */
+ public void setSchemaTypeName(org.apache.xml.utils.QName schemaTypeName)
+ {
+ m_schemaTypeName = schemaTypeName;
+ }
+
+ /**
+ * Sets the targetExpr.
+ * @param targetExpr The targetExpr to set
+ */
+ public void setTargetExpr(Expression targetExpr)
+ {
+ m_targetExpr = targetExpr;
+ }
+
+ /**
+ * Sets the whatToShow.
+ * @param whatToShow The whatToShow to set
+ */
+ public void setWhatToShow(int whatToShow)
+ {
+ m_whatToShow = whatToShow;
+ }
+
+ /**
+ * Returns the atomicTypeID.
+ * @return int
+ */
+ public int getAtomicTypeID()
+ {
+ return m_atomicTypeID;
+ }
+
+ /**
+ * Returns the elemOrAttrName.
+ * @return org.apache.xml.utils.QName
+ */
+ public org.apache.xml.utils.QName getElemOrAttrName()
+ {
+ return m_elemOrAttrName;
+ }
+
+ /**
+ * Sets the atomicTypeID.
+ * @param atomicTypeID The atomicTypeID to set
+ */
+ public void setAtomicTypeID(int atomicTypeID)
+ {
+ m_atomicTypeID = atomicTypeID;
+ }
+
+ /**
+ * Sets the elemOrAttrName.
+ * @param elemOrAttrName The elemOrAttrName to set
+ */
+ public void setElemOrAttrName(org.apache.xml.utils.QName elemOrAttrName)
+ {
+ m_elemOrAttrName = elemOrAttrName;
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/SimpleNode.java b/src/org/apache/xpath/parser/SimpleNode.java
new file mode 100644
index 0000000..c952f63
--- /dev/null
+++ b/src/org/apache/xpath/parser/SimpleNode.java
@@ -0,0 +1,1308 @@
+package org.apache.xpath.parser;
+
+import java.util.Hashtable;
+
+import javax.xml.transform.SourceLocator;
+
+import org.apache.xml.dtm.DTMFilter;
+import org.apache.xml.utils.QName;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.axes.UnionPathIterator;
+import org.apache.xpath.axes.WalkerFactory;
+import org.apache.xpath.functions.*;
+import org.apache.xpath.objects.XDecimal;
+import org.apache.xpath.objects.XDouble;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.operations.Variable;
+import org.apache.xpath.patterns.FunctionPattern;
+import org.apache.xpath.patterns.StepPattern;
+import org.apache.xpath.seqctor.ExprSequence;
+import org.apache.xpath.seqctor.FLWRExpr;
+import org.apache.xpath.types.InstanceofExpr;
+
+/**
+ * This is the most generic syntax node, which implements the JJTree
+ * interface "Node" methods. This class assumes that it's derived
+ * class is org.apache.xpath.Expression, and so does a fair amount
+ * of downcasting. The only reason this class exists is to separate
+ * out the jjXXX methods, to act as a more generic interface to
+ * the JavaCC/JJTree parser, and also to act as a factory class for
+ * the concrete implementations of the expressions.
+ *
+ * @author sboag
+ */
+public class SimpleNode implements Node
+{
+
+ /**
+ * Construct a new SimpleNode.
+ * @see java.lang.Object#Object()
+ */
+ public SimpleNode()
+ {
+ }
+
+ public static Hashtable m_builtInFunctions;
+
+ static {
+ // For user installed functions, can we really have a single static table?
+ // Answer: no, each parser instance will need to copy the table.
+ // Then the question is, can all instances of a user Function be shared among
+ // processes? Answer: I think that would cause regressions.
+ m_builtInFunctions = new Hashtable();
+ m_builtInFunctions.put(new QName("current"), new FuncCurrent());
+ m_builtInFunctions.put(
+ new QName("last"),
+ new org.apache.xpath.functions.FuncLast());
+ m_builtInFunctions.put(
+ new QName("position"),
+ new org.apache.xpath.functions.FuncPosition());
+ m_builtInFunctions.put(new QName("count"), new FuncCount());
+ m_builtInFunctions.put(new QName("id"), new FuncId());
+ m_builtInFunctions.put(
+ new QName("key"),
+ new org.apache.xalan.templates.FuncKey());
+ m_builtInFunctions.put(new QName("local-name"), new FuncLocalPart());
+ m_builtInFunctions.put(new QName("namespace-uri"), new FuncNamespace());
+ m_builtInFunctions.put(new QName("name"), new FuncQname());
+ m_builtInFunctions.put(new QName("generate-id"), new FuncGenerateId());
+ m_builtInFunctions.put(new QName("not"), new FuncNot());
+ m_builtInFunctions.put(new QName("true"), new FuncTrue());
+ m_builtInFunctions.put(new QName("false"), new FuncFalse());
+ m_builtInFunctions.put(new QName("boolean"), new FuncBoolean());
+ m_builtInFunctions.put(new QName("lang"), new FuncLang());
+ m_builtInFunctions.put(new QName("number"), new FuncNumber());
+ m_builtInFunctions.put(new QName("floor"), new FuncFloor());
+ m_builtInFunctions.put(new QName("ceiling"), new FuncCeiling());
+ m_builtInFunctions.put(new QName("round"), new FuncRound());
+ m_builtInFunctions.put(new QName("sum"), new FuncSum());
+ m_builtInFunctions.put(new QName("string"), new FuncString());
+ m_builtInFunctions.put(new QName("starts-with"), new FuncStartsWith());
+ m_builtInFunctions.put(new QName("contains"), new FuncContains());
+ m_builtInFunctions.put(
+ new QName("substring-before"),
+ new FuncSubstringBefore());
+ m_builtInFunctions.put(
+ new QName("substring-after"),
+ new FuncSubstringAfter());
+ m_builtInFunctions.put(
+ new QName("normalize-space"),
+ new FuncNormalizeSpace());
+ m_builtInFunctions.put(new QName("translate"), new FuncTranslate());
+ m_builtInFunctions.put(new QName("concat"), new FuncConcat());
+ m_builtInFunctions.put(
+ new QName("system-property"),
+ new FuncSystemProperty());
+ m_builtInFunctions.put(
+ new QName("function-available"),
+ new FuncExtFunctionAvailable());
+ m_builtInFunctions.put(
+ new QName("element-available"),
+ new FuncExtElementAvailable());
+ m_builtInFunctions.put(new QName("substring"), new FuncSubstring());
+ m_builtInFunctions.put(new QName("string-length"), new FuncStringLength());
+ m_builtInFunctions.put(
+ new QName("unparsed-entity-uri"),
+ new FuncUnparsedEntityURI());
+ m_builtInFunctions.put(
+ new QName("document-location"),
+ new FuncDoclocation());
+ // Proprietary
+ // XPATH2 experimental
+ m_builtInFunctions.put(
+ new QName("data"),
+ new FuncData());
+ m_builtInFunctions.put(
+ new QName("current-dateTime"),
+ new FuncCurrentDateTime());
+ m_builtInFunctions.put(
+ new QName("current-date"),
+ new FuncCurrentDate());
+ m_builtInFunctions.put(
+ new QName("dateTime"),
+ new FuncDateTime());
+ m_builtInFunctions.put(
+ new QName("date"),
+ new FuncDate());
+ m_builtInFunctions.put(
+ new QName("duration"),
+ new FuncDuration());
+ m_builtInFunctions.put(
+ new QName("time"),
+ new FuncTime());
+ m_builtInFunctions.put(
+ new QName("yearMonthDuration"),
+ new FuncYMDuration());
+ m_builtInFunctions.put(
+ new QName("yearMonthDuration-from-months"),
+ new FuncYMDurationFromMonths());
+ m_builtInFunctions.put(
+ new QName("dayTimeDuration"),
+ new FuncDTDuration());
+ m_builtInFunctions.put(
+ new QName("dayTimeDuration-from-seconds"),
+ new FuncDTDurationFromSecs());
+ m_builtInFunctions.put(
+ new QName("add-dayTimeDuration"),
+ new FuncAddDayTimeDuration());
+ m_builtInFunctions.put(
+ new QName("subtract-dayTimeDuration"),
+ new FuncSubDayTimeDuration());
+ m_builtInFunctions.put(
+ new QName("multiply-dayTimeDuration"),
+ new FuncMultDayTimeDuration());
+ m_builtInFunctions.put(
+ new QName("divide-dayTimeDuration"),
+ new FuncDivDayTimeDuration());
+ m_builtInFunctions.put(
+ new QName("add-yearMonthDuration"),
+ new FuncAddYearMonthDuration());
+ m_builtInFunctions.put(
+ new QName("subtract-yearMonthDuration"),
+ new FuncSubYearMonthDuration());
+ m_builtInFunctions.put(
+ new QName("multiply-yearMonthDuration"),
+ new FuncMultYearMonthDuration());
+ m_builtInFunctions.put(
+ new QName("divide-yearMonthDuration"),
+ new FuncDivYearMonthDuration());
+ m_builtInFunctions.put(
+ new QName("get-yearMonthDuration"),
+ new FuncGetYMDuration());
+ m_builtInFunctions.put(
+ new QName("get-dayTimeDuration"),
+ new FuncGetDTDuration());
+ m_builtInFunctions.put(
+ new QName("add-yearMonthDurationToDateTime"),
+ new FuncAddYMDurationToDT());
+ m_builtInFunctions.put(
+ new QName("subtract-yearMonthDurationFromDateTime"),
+ new FuncSubtractYMDurationFromDT());
+ m_builtInFunctions.put(
+ new QName("add-yearMonthDurationToDate"),
+ new FuncAddYMDurationToDate());
+ m_builtInFunctions.put(
+ new QName("subtract-yearMonthDurationFromDate"),
+ new FuncSubtractYMDurationFromDate());
+ m_builtInFunctions.put(
+ new QName("add-dayTimeDurationToDateTime"),
+ new FuncAddDTDurationToDT());
+ m_builtInFunctions.put(
+ new QName("subtract-dayTimeDurationFromDateTime"),
+ new FuncSubtractDTDurationFromDT());
+ m_builtInFunctions.put(
+ new QName("add-dayTimeDurationToDate"),
+ new FuncAddDTDurationToDate());
+ m_builtInFunctions.put(
+ new QName("add-dayTimeDurationToTime"),
+ new FuncAddDTDurationToTime());
+ m_builtInFunctions.put(
+ new QName("subtract-dayTimeDurationFromDate"),
+ new FuncSubtractDTDurationFromDate());
+ m_builtInFunctions.put(
+ new QName("subtract-dayTimeDurationFromTime"),
+ new FuncSubtractDTDurationFromTime());
+ m_builtInFunctions.put(
+ new QName("add-days"),
+ new FuncAddDays());
+ m_builtInFunctions.put(
+ new QName("gYearMonth"),
+ new FuncGYearMonth());
+ m_builtInFunctions.put(
+ new QName("gYear"),
+ new FuncGYear());
+ m_builtInFunctions.put(
+ new QName("gMonth"),
+ new FuncGMonth());
+ m_builtInFunctions.put(
+ new QName("gMonthDay"),
+ new FuncGMonthDay());
+ m_builtInFunctions.put(
+ new QName("gDay"),
+ new FuncGDay());
+m_builtInFunctions.put(
+ new QName("get-day-from-date"),
+ new FuncGetDFromDate());
+m_builtInFunctions.put(
+ new QName("get-day-from-dateTime"),
+ new FuncGetDFromDT());
+m_builtInFunctions.put(
+ new QName("get-days-from-dayTimeDuration"),
+ new FuncGetDFromDTDuration());
+m_builtInFunctions.put(
+ new QName("get-hours-from-dateTime"),
+ new FuncGetHFromDT());
+m_builtInFunctions.put(
+ new QName("get-hours-from-dayTimeDuration"),
+ new FuncGetHFromDTDuration());
+m_builtInFunctions.put(
+ new QName("get-hours-from-time"),
+ new FuncGetHFromTime());
+m_builtInFunctions.put(
+ new QName("get-month-from-date"),
+ new FuncGetMFromDate());
+m_builtInFunctions.put(
+ new QName("get-month-from-dateTime"),
+ new FuncGetMFromDT());
+m_builtInFunctions.put(
+ new QName("get-months-from-yearMonthDuration"),
+ new FuncGetMFromYMDuration());
+m_builtInFunctions.put(
+ new QName("get-minutes-from-dateTime"),
+ new FuncGetMnFromDT());
+m_builtInFunctions.put(
+ new QName("get-minutes-from-dayTimeDuration"),
+ new FuncGetMnFromDTDuration());
+m_builtInFunctions.put(
+ new QName("get-minutes-from-time"),
+ new FuncGetMnFromTime());
+m_builtInFunctions.put(
+ new QName("get-seconds-from-dateTime"),
+ new FuncGetSFromDT());
+m_builtInFunctions.put(
+ new QName("get-seconds-from-dayTimeDuration"),
+ new FuncGetSFromDTDuration());
+m_builtInFunctions.put(
+ new QName("get-seconds-from-time"),
+ new FuncGetSFromTime());
+m_builtInFunctions.put(
+ new QName("get-timezone-from-datetime"),
+ new FuncGetTZFromDT());
+m_builtInFunctions.put(
+ new QName("get-timezone-from-date"),
+ new FuncGetTZFromDate());
+m_builtInFunctions.put(
+ new QName("get-timezone-from-time"),
+ new FuncGetTZFromTime());
+m_builtInFunctions.put(
+ new QName("get-year-from-date"),
+ new FuncGetYFromDate());
+m_builtInFunctions.put(
+ new QName("get-year-from-dateTime"),
+ new FuncGetYFromDT());
+m_builtInFunctions.put(
+ new QName("get-years-from-yearMonthDuration"),
+ new FuncGetYFromYMDuration());
+m_builtInFunctions.put(
+ new QName("duration-equal"),
+ new FuncDurationEqual());
+m_builtInFunctions.put(
+ new QName("yearMonthDuration-equal"),
+ new FuncYMDurationEqual());
+m_builtInFunctions.put(
+ new QName("yearMonthDuration-greater-than"),
+ new FuncYMDurationGT());
+m_builtInFunctions.put(
+ new QName("yearMonthDuration-less-than"),
+ new FuncYMDurationLT());
+m_builtInFunctions.put(
+ new QName("dayTimeDuration-equal"),
+ new FuncDTDurationEqual());
+m_builtInFunctions.put(
+ new QName("dayTimeDuration-greater-than"),
+ new FuncDTDurationGT());
+m_builtInFunctions.put(
+ new QName("dayTimeDuration-less-than"),
+ new FuncDTDurationLT());
+m_builtInFunctions.put(
+ new QName("dateTime-equal"),
+ new FuncDateTimeEq());
+m_builtInFunctions.put(
+ new QName("dateTime-less-than"),
+ new FuncDateTimeLT());
+m_builtInFunctions.put(
+ new QName("dateTime-greater-than"),
+ new FuncDateTimeGT());
+ }
+
+ /**
+ * Factory method for creating parse tree nodes, which is called by
+ * the JJTree created parser.
+ * @param p The JJTree created XPath parser.
+ * @param id The ID of the node.
+ * @return Node The new node, which may not be null.
+ */
+ public static Node jjtCreate(XPath p, int id)
+ {
+ SimpleNode newNode = null;
+ // To be done: If function on stack, assume param.
+ switch (id)
+ {
+ case XPathTreeConstants.JJTXPATH2 :
+ // When I try to use #void to cancel out this node,
+ // I get an error. So I guess
+ // the top of the tree can't be void. So I create a dummy
+ // node. This makes the called have to call
+ // ((SimpleNode)tree.jjtGetChild(0)) to get the real root.
+ newNode = new RootOfRoot(p);
+ break;
+
+ // === MATCH EXPRESSIONS ===
+ case XPathTreeConstants.JJTMATCHPATTERN :
+ // See comment above.
+ // TBD: If the pattern is a MatchPattern, then RootOfRoot should
+ // rebuild the children according to the structure needed
+ // by the patterns package.
+ newNode = new RootOfRootPattern(p);
+ break;
+ case XPathTreeConstants.JJTPATTERN :
+ // This should be optimized away if there is only one pattern
+ newNode = new org.apache.xpath.patterns.UnionPattern();
+ break;
+ case XPathTreeConstants.JJTPATHPATTERN :
+ // This is a temporary node, for construction purposes only,
+ // Since the patterns package constructs the StepPatterns as
+ // a linked list.
+ newNode = new Pattern(p);
+ break;
+ case XPathTreeConstants.JJTPATTERNSTEP :
+ {
+ StepPattern spat = new StepPattern();
+ // At this point, the PatternAxis, NodeTest, and Predicates
+ // should be already on the stack?
+ newNode = spat;
+ }
+ break;
+
+ case XPathTreeConstants.JJTROOT :
+ {
+ if (!p.m_isMatchPattern || p.m_predLevel > 0)
+ {
+ newNode = new StepExpr(p);
+ PatternAxis patAxis =
+ new PatternAxis(org.apache.xml.dtm.Axis.ROOT, p);
+ patAxis.m_value = "root::"; // for diagnostics
+ NodeTest nt =
+ new NodeTest(
+ org.apache.xml.dtm.DTMFilter.SHOW_DOCUMENT
+ | org.apache.xml.dtm.DTMFilter.SHOW_DOCUMENT_FRAGMENT,
+ p);
+ Predicates preds = new Predicates(p);
+ newNode.jjtAddChild(patAxis, 0);
+ newNode.jjtAddChild(nt, 1);
+ newNode.jjtAddChild(preds, 2);
+ }
+ else
+ {
+ StepPattern spat = new StepPattern();
+ spat.setWhatToShow(
+ DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT);
+ spat.setAxis(org.apache.xml.dtm.Axis.PARENT);
+ // spat.setT(org.apache.xpath.patterns.StepPattern.PSEUDONAME_ROOT);
+ newNode = spat;
+ }
+ }
+ break;
+ case XPathTreeConstants.JJTROOTDESCENDANTS :
+ {
+ if (!p.m_isMatchPattern || p.m_predLevel > 0)
+ {
+ newNode = new StepExpr(p);
+ PatternAxis patAxis =
+ new PatternAxis(
+ org.apache.xml.dtm.Axis.DESCENDANTSORSELFFROMROOT,
+ p);
+ patAxis.m_value = "descendants-from-root::"; // for diagnostics
+ NodeTest nt =
+ new NodeTest(org.apache.xml.dtm.DTMFilter.SHOW_ALL, p);
+ nt.setTotallyWild(true);
+ // nt.setLocalName(org.apache.xpath.patterns.StepPattern.PSEUDONAME_ROOT);
+ Predicates preds = new Predicates(p);
+ newNode.jjtAddChild(patAxis, 0);
+ newNode.jjtAddChild(nt, 1);
+ newNode.jjtAddChild(preds, 2);
+ }
+ else
+ {
+ // see comment for JJTROOT.
+ StepPattern spat = new StepPattern();
+ spat.setWhatToShow(
+ DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT);
+ spat.setAxis(org.apache.xml.dtm.Axis.ANCESTOR);
+ newNode = spat;
+ }
+ }
+ break;
+
+ case XPathTreeConstants.JJTSLASH :
+ newNode = new SlashOrSlashSlash(false, p);
+ break;
+ case XPathTreeConstants.JJTSLASHSLASH :
+ newNode = new SlashOrSlashSlash(true, p);
+ break;
+
+ // === NODE TESTS ===
+ case XPathTreeConstants.JJTNODETEST :
+ newNode = new NodeTest(p);
+ break;
+ case XPathTreeConstants.JJTNAMETEST :
+ newNode = new NameTest(p);
+ break;
+ case XPathTreeConstants.JJTQNAME :
+ newNode = new org.apache.xpath.parser.QName(p);
+ break;
+ case XPathTreeConstants.JJTSTAR : // Wildcard
+ newNode = new Star(p);
+ break;
+ case XPathTreeConstants.JJTNCNAMECOLONSTAR :
+ newNode = new NCNameColonStar(p);
+ break;
+ case XPathTreeConstants.JJTSTARCOLONNCNAME :
+ newNode = new StarColonNCName(p);
+ break;
+
+ case XPathTreeConstants.JJTKINDTEST :
+ newNode = new KindTest(p);
+ break;
+ case XPathTreeConstants.JJTPROCESSINGINSTRUCTIONTEST :
+ newNode = new ProcessingInstructionTest(p);
+ break;
+ case XPathTreeConstants.JJTCOMMENTTEST :
+ newNode = new CommentTest(p);
+ break;
+ case XPathTreeConstants.JJTTEXTTEST :
+ newNode = new TextTest(p);
+ break;
+ case XPathTreeConstants.JJTANYKINDTEST :
+ newNode = new AnyKindTest(p);
+ break;
+
+ case XPathTreeConstants.JJTLBRACK :
+ newNode = new LbrackOrRbrack(p);
+ p.m_predLevel++;
+ break;
+ case XPathTreeConstants.JJTRBRACK :
+ newNode = new LbrackOrRbrack(p);
+ p.m_predLevel--;
+ break;
+ case XPathTreeConstants.JJTPREDICATES :
+ newNode = new Predicates(p);
+ break;
+
+ // === AXES, ETC. ===
+ case XPathTreeConstants.JJTAXISDESCENDANT :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.DESCENDANT, p);
+ break;
+ case XPathTreeConstants.JJTAXISSELF :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.SELF, p);
+ break;
+ case XPathTreeConstants.JJTAXISDESCENDANTORSELF :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.DESCENDANTORSELF, p);
+ break;
+ case XPathTreeConstants.JJTAXISFOLLOWINGSIBLING :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.FOLLOWINGSIBLING, p);
+ break;
+ case XPathTreeConstants.JJTAXISFOLLOWING :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.FOLLOWING, p);
+ break;
+ case XPathTreeConstants.JJTAXISNAMESPACE :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.NAMESPACE, p);
+ break;
+ case XPathTreeConstants.JJTAXISPARENT :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.PARENT, p);
+ break;
+ case XPathTreeConstants.JJTAXISANCESTOR :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.ANCESTOR, p);
+ break;
+ case XPathTreeConstants.JJTAXISPRECEDINGSIBLING :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.PRECEDINGSIBLING, p);
+ break;
+ case XPathTreeConstants.JJTAXISPRECEDING :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.PRECEDING, p);
+ break;
+ case XPathTreeConstants.JJTAXISANCESTORORSELF :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.ANCESTORORSELF, p);
+ break;
+ case XPathTreeConstants.JJTAXISCHILD :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.CHILD, p);
+ break;
+ case XPathTreeConstants.JJTAXISATTRIBUTE :
+ case XPathTreeConstants.JJTAT :
+ newNode = new PatternAxis(org.apache.xml.dtm.Axis.ATTRIBUTE, p);
+ break;
+
+ case XPathTreeConstants.JJTABBREVIATEDFORWARDSTEP :
+ {
+ PatternAxis patAxis =
+ new PatternAxis(org.apache.xml.dtm.Axis.CHILD, p);
+ patAxis.m_value = "child::"; // for diagnostics
+ newNode = patAxis;
+ }
+ break;
+ case XPathTreeConstants.JJTDOT :
+ {
+ PatternAxis patAxis =
+ new PatternAxis(org.apache.xml.dtm.Axis.SELF, p);
+ patAxis.m_value = "self::"; // for diagnostics
+ newNode = patAxis;
+ NodeTest nt = new NodeTest(org.apache.xml.dtm.DTMFilter.SHOW_ALL, p);
+ newNode.jjtAddChild(nt, 0);
+ }
+ break;
+ case XPathTreeConstants.JJTDOTDOT :
+ {
+ PatternAxis patAxis =
+ new PatternAxis(org.apache.xml.dtm.Axis.PARENT, p);
+ patAxis.m_value = "parent::"; // for diagnostics
+ newNode = patAxis;
+ NodeTest nt = new NodeTest(org.apache.xml.dtm.DTMFilter.SHOW_ALL, p);
+ newNode.jjtAddChild(nt, 0);
+ }
+ break;
+
+ // === PATH EXPRESSIONS ===
+ case XPathTreeConstants.JJTPATHEXPR :
+ newNode = new PathExpr(p);
+ break;
+ case XPathTreeConstants.JJTSTEPEXPR :
+ newNode = new StepExpr(p);
+ break;
+
+ // === SEQUENCE UNIONS AND INTERSECTIONS ===
+ case XPathTreeConstants.JJTUNIONEXPR :
+ newNode = new UnionPathIterator();
+ break;
+ case XPathTreeConstants.JJTINTERSECTEXCEPTEXPR :
+ newNode = new NonExecutableExpression(p, "JJTUNIONEXPR");
+ break;
+ // case XPathTreeConstants.JJTUNION:
+ // newNode = new SimpleNode();
+ // break;
+ // case XPathTreeConstants.JJTVBAR:
+ // newNode = new SimpleNode();
+ // break;
+ // case XPathTreeConstants.JJTRELATIVEPATHPATTERN:
+ // newNode = new SimpleNode();
+ // break;
+
+ // === FUNCTIONS ===
+ case XPathTreeConstants.JJTIDKEYPATTERN :
+ {
+ FunctionPattern fpat = new FunctionPattern();
+ p.m_matchFunc = fpat; // short lived.
+ newNode = fpat;
+ }
+ break;
+ case XPathTreeConstants.JJTFUNCTIONCALL :
+ {
+ FunctionPattern fpat = new TempFunctionHolder();
+ p.m_matchFunc = fpat; // short lived.
+ newNode = fpat;
+ }
+ break;
+ case XPathTreeConstants.JJTQNAMELPAR :
+ try
+ {
+
+ org.apache.xpath.parser.QName qname =
+ new org.apache.xpath.parser.QName(p);
+ if (null != p.m_matchFunc)
+ {
+ qname.processToken(p.getToken(0));
+ QName funcName = qname.getQName();
+ String ns = funcName.getNamespaceURI();
+ if (null != ns && ns.length() > 0)
+ {
+ String uniqueKey =
+ String.valueOf(
+ ((SourceLocator) p.m_prefixResolver).getLineNumber())
+ + String.valueOf(funcName.hashCode())
+ + String.valueOf(System.currentTimeMillis());
+ Function extension =
+ new FuncExtFunction(ns, funcName.getLocalPart(), uniqueKey);
+ p.m_matchFunc.setFunctionExpression(extension);
+ p.m_matchFunc = null;
+ }
+ else
+ {
+ Expression exp = (Expression) m_builtInFunctions.get(funcName);
+ if (null != exp)
+ {
+ exp = (Expression) exp.getClass().newInstance();
+ p.m_matchFunc.setFunctionExpression(exp);
+ p.m_matchFunc = null;
+ }
+ else
+ {
+ // TBD: a proper error throw. -sb
+ throw new RuntimeException(
+ "Function not found: " + funcName + "!");
+ }
+ }
+ }
+ newNode = qname;
+ }
+ catch (InstantiationException iae)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(iae);
+ }
+ catch (IllegalAccessException iae)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(iae);
+ }
+
+ break;
+
+ // === BINARY OPERATORS ===
+
+ case XPathTreeConstants.JJTOREXPR :
+ newNode = new org.apache.xpath.operations.Or();
+ break;
+ case XPathTreeConstants.JJTANDEXPR :
+ newNode = new org.apache.xpath.operations.And();
+ break;
+ case XPathTreeConstants.JJTCOMPARISONEXPR :
+ {
+ Token operator = (Token) p.binaryTokenStack.peek();
+ switch (operator.kind)
+ {
+ case XPathConstants.Equals :
+ newNode = new org.apache.xpath.operations.Equals();
+ break;
+ case XPathConstants.NotEquals :
+ newNode = new org.apache.xpath.operations.NotEquals();
+ ;
+ break;
+ case XPathConstants.Lt :
+ newNode = new org.apache.xpath.operations.Lt();
+ break;
+ case XPathConstants.LtEquals :
+ newNode = new org.apache.xpath.operations.Lte();
+ break;
+ case XPathConstants.Gt :
+ newNode = new org.apache.xpath.operations.Gt();
+ break;
+ case XPathConstants.GtEquals :
+ newNode = new org.apache.xpath.operations.Gte();
+ break;
+ case XPathConstants.FortranEq :
+ newNode = new org.apache.xpath.operations.FortranEq();
+ break;
+ case XPathConstants.FortranNe :
+ newNode = new org.apache.xpath.operations.FortranNe();
+ break;
+ case XPathConstants.FortranLt :
+ newNode = new org.apache.xpath.operations.FortranLt();
+ break;
+ case XPathConstants.FortranLe :
+ newNode = new org.apache.xpath.operations.FortranLe();
+ break;
+ case XPathConstants.FortranGt :
+ newNode = new org.apache.xpath.operations.FortranGt();
+ break;
+ case XPathConstants.FortranGe :
+ newNode = new org.apache.xpath.operations.FortranGe();
+ break;
+ case XPathConstants.Is :
+ newNode = new org.apache.xpath.operations.Is();
+ break;
+ case XPathConstants.IsNot :
+ newNode = new org.apache.xpath.operations.IsNot();
+ break;
+ case XPathConstants.LtLt :
+ newNode = new org.apache.xpath.operations.LtLt();
+ break;
+ case XPathConstants.GtGt :
+ newNode = new org.apache.xpath.operations.GtGt();
+ break;
+ case XPathConstants.Precedes :
+ newNode = new org.apache.xpath.operations.Precedes();
+ break;
+ case XPathConstants.Follows :
+ newNode = new org.apache.xpath.operations.Follows();
+ break;
+ }
+ }
+ break;
+ case XPathTreeConstants.JJTRANGEEXPR :
+ newNode = new org.apache.xpath.seqctor.RangeExpr();
+ break;
+ case XPathTreeConstants.JJTADDITIVEEXPR :
+ {
+ Token operator = (Token) p.binaryTokenStack.peek();
+ switch (operator.kind)
+ {
+ case XPathConstants.Plus :
+ newNode = new org.apache.xpath.operations.Add();
+ break;
+ case XPathConstants.Minus :
+ newNode = new org.apache.xpath.operations.Subtract();
+ ;
+ break;
+ }
+ }
+ break;
+ case XPathTreeConstants.JJTMULTIPLICATIVEEXPR :
+ {
+ Token operator = (Token) p.binaryTokenStack.peek();
+ switch (operator.kind)
+ {
+ case XPathConstants.Multiply :
+ newNode = new org.apache.xpath.operations.Mult();
+ break;
+ case XPathConstants.Div :
+ newNode = new org.apache.xpath.operations.Div();
+ ;
+ break;
+ case XPathConstants.Idiv :
+ newNode = new org.apache.xpath.operations.Idiv();
+ break;
+ case XPathConstants.Mod :
+ newNode = new org.apache.xpath.operations.Mod();
+ ;
+ break;
+ }
+ }
+ break;
+
+ // === UNARY OPERATORS ===
+ case XPathTreeConstants.JJTUNARYEXPR :
+ newNode = new UnaryExpr(p);
+ break;
+ case XPathTreeConstants.JJTPLUS :
+ newNode = new org.apache.xpath.operations.Pos();
+ break;
+ case XPathTreeConstants.JJTMINUS :
+ newNode = new org.apache.xpath.operations.Neg();
+ break;
+
+ // === VARIABLES ===
+ case XPathTreeConstants.JJTVARNAME :
+ {
+ // We'll have to check to make sure the node is
+ // really on the stack.
+ Variable var = new Variable();
+ Token varToken = p.getToken(0);
+ String varName = varToken.image;
+ QName varQName = new QName(varName, p.m_prefixResolver);
+ var.setQName(varQName);
+ newNode = var;
+ }
+ break;
+
+ // === LITERALS ===
+ case XPathTreeConstants.JJTSTRINGLITERAL :
+ newNode = new org.apache.xpath.objects.XString();
+ break;
+ case XPathTreeConstants.JJTINTEGERLITERAL :
+ if(p.getVersion() >= 2.0)
+ newNode = new XInteger();
+ else
+ newNode = new XDouble();
+ break;
+ case XPathTreeConstants.JJTDECIMALLITERAL :
+ newNode = new XDecimal();
+ break;
+ case XPathTreeConstants.JJTDOUBLELITERAL :
+ newNode = new XDouble();
+ break;
+
+ // === SEQUENCE CONSTRUCTION ===
+ case XPathTreeConstants.JJTEXPRSEQUENCE :
+ newNode = new ExprSequence();
+ break;
+
+ // === QUANTIFIED EXPRESSIONS ===
+ case XPathTreeConstants.JJTQUANTIFIEDEXPR :
+ newNode = new QuantifiedExpr(p);
+ break;
+ case XPathTreeConstants.JJTSOME :
+ newNode = new org.apache.xpath.quantified.Some();
+ break;
+ case XPathTreeConstants.JJTEVERY :
+ newNode = new org.apache.xpath.quantified.Every();
+ break;
+ case XPathTreeConstants.JJTSATISFIES :
+ newNode = new org.apache.xpath.quantified.Satisfies();
+ break;
+
+ case XPathTreeConstants.JJTIN : // Both for ForClause and Quantified.
+ newNode = new In(p);
+ break;
+
+ // === CONDITIONAL EXPRESSIONS ===
+ case XPathTreeConstants.JJTIFEXPR :
+ newNode = new IfExpr(p);
+ break;
+ case XPathTreeConstants.JJTIFLPAR :
+ newNode = new org.apache.xpath.conditional.If();
+ break;
+ case XPathTreeConstants.JJTTHEN :
+ newNode = new org.apache.xpath.conditional.Then();
+ break;
+ case XPathTreeConstants.JJTELSE :
+ newNode = new org.apache.xpath.conditional.Else();
+ break;
+
+ // === ITTERATION ===
+ case XPathTreeConstants.JJTFLWREXPR :
+ newNode = new FLWRExpr();
+ break;
+ case XPathTreeConstants.JJTFORCLAUSE :
+ newNode = new org.apache.xpath.parser.ForClause(p);
+ break;
+ case XPathTreeConstants.JJTRETURN :
+ newNode = new org.apache.xpath.parser.Return(p);
+ break;
+
+ // === TYPE HANDLING ===
+ case XPathTreeConstants.JJTINSTANCEOFEXPR :
+ newNode = new InstanceofExpr();
+ break;
+ case XPathTreeConstants.JJTINSTANCEOF :
+ newNode = new Instanceof(p);
+ break;
+ case XPathTreeConstants.JJTVALIDATEEXPR :
+ newNode = new NonExecutableExpression(p, "JJTVALIDATEEXPR");
+ break;
+ case XPathTreeConstants.JJTVALIDATE :
+ newNode = new NonExecutableExpression(p, "JJTVALIDATE");
+ break;
+ case XPathTreeConstants.JJTLBRACE :
+ newNode = new NonExecutableExpression(p, "JJTLBRACE");
+ break;
+ case XPathTreeConstants.JJTRBRACE :
+ newNode = new NonExecutableExpression(p, "JJTRBRACE");
+ break;
+ case XPathTreeConstants.JJTCASTEXPR :
+ newNode = new NonExecutableExpression(p, "JJTCASTEXPR");
+ break;
+ case XPathTreeConstants.JJTCASTAS :
+ newNode = new NonExecutableExpression(p, "JJTCASTAS");
+ break;
+ case XPathTreeConstants.JJTTREATAS :
+ newNode = new NonExecutableExpression(p, "JJTTREATAS");
+ break;
+ case XPathTreeConstants.JJTSCHEMACONTEXT :
+ newNode = new SchemaContext(p, "JJTSCHEMACONTEXT");
+ break;
+ case XPathTreeConstants.JJTSCHEMAGLOBALCONTEXT :
+ newNode = new SchemaGlobalContext(p, "JJTSCHEMAGLOBALCONTEXT");
+ break;
+ case XPathTreeConstants.JJTTYPE :
+ newNode = new NonExecutableExpression(p, "JJTTYPE");
+ break;
+ case XPathTreeConstants.JJTSCHEMACONTEXTSTEP :
+ newNode = new SchemaContextStep(p);
+ break;
+ case XPathTreeConstants.JJTSEQUENCETYPE :
+ newNode = new SequenceType(p, "JJTSEQUENCETYPE");
+ break;
+ case XPathTreeConstants.JJTEMPTY :
+ newNode = new Empty(p, "JJTEMPTY");
+ break;
+ case XPathTreeConstants.JJTITEMTYPE :
+ newNode = new ItemType(p, "JJTITEMTYPE");
+ break;
+ case XPathTreeConstants.JJTELEMENTTYPE :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_ELEMENT);
+ break;
+ case XPathTreeConstants.JJTATTRIBUTETYPE :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_ATTRIBUTE);
+ break;
+ case XPathTreeConstants.JJTNODE :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_ALL);
+ break;
+ case XPathTreeConstants.JJTPROCESSINGINSTRUCTION :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_PROCESSING_INSTRUCTION);
+ break;
+ case XPathTreeConstants.JJTCOMMENT :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_COMMENT);
+ break;
+ case XPathTreeConstants.JJTTEXT :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_TEXT);
+ break;
+ case XPathTreeConstants.JJTDOCUMENT :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_DOCUMENT);
+ break;
+ case XPathTreeConstants.JJTITEM :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_ITEM);
+ break;
+ case XPathTreeConstants.JJTUNTYPED :
+ newNode = new NodeTestType(p, DTMFilter.SHOW_UNTYPED);
+ break;
+// case XPathTreeConstants.JJTATOMICVALUE :
+// newNode = new AtomicType(p);
+// break;
+ case XPathTreeConstants.JJTELEMORATTRTYPE :
+ newNode = new ElemOrAttrType(p, "JJTELEMORATTRTYPE");
+ break;
+ case XPathTreeConstants.JJTSCHEMATYPE :
+ newNode = new SchemaType(p);
+ break;
+ case XPathTreeConstants.JJTOFTYPE :
+ newNode = new OfType(p, "JJTOFTYPE");
+ break;
+ case XPathTreeConstants.JJTATOMICTYPE :
+ newNode = new AtomicType(p, "JJTATOMICTYPE");
+ break;
+ case XPathTreeConstants.JJTOCCURRENCEINDICATOR :
+ newNode = new OccurrenceIndicator(p, "JJTOCCURRENCEINDICATOR");
+ break;
+ case XPathTreeConstants.JJTMULTIPLY :
+ // Leave as NEE
+ newNode = new NonExecutableExpression(p, "JJTMULTIPLY");
+ break;
+ case XPathTreeConstants.JJTQMARK :
+ // Leave as NEE
+ newNode = new NonExecutableExpression(p, "JJTQMARK");
+ break;
+
+ default :
+ newNode = new NonExecutableExpression(p, "(case default: " + id + ")");
+ }
+ return newNode;
+ }
+
+ /**
+ * Tell if this node is part of a PathExpr chain. For instance:
+ * <pre>
+ * |UnaryExpr
+ * | PathExpr
+ * | StepExpr
+ * | AxisChild child::
+ * | NodeTest
+ * | NameTest
+ * | QName foo
+ * | Predicates *
+ * </pre><br/>
+ * In this example, UnaryExpr, PathExpr, and StepExpr should all return true.
+ */
+ public boolean isPathExpr()
+ {
+ return false;
+ }
+
+ /**
+ * Tell if this node should have it's PathExpr ancestory reduced.
+ */
+ public boolean isPathExprReduced()
+ {
+ return false;
+ }
+
+ /**
+ * Tell if this node should have it's parent reduced.
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return false;
+ }
+
+ /**
+ * This function checks the integrity of the tree, after it has been fully built and
+ * is ready for execution.
+ * @return boolean true if the tree has integrity, false otherwise.
+ */
+ public boolean checkTreeIntegrity()
+ {
+ return checkTreeIntegrity(0, 0, true);
+ }
+
+ /**
+ * Tell the user there is a problem with the tree.
+ * @param s The string to show the user.
+ * @return boolean false always.
+ */
+ protected boolean flagProblem(String s)
+ {
+ // System.err.println("checkTreeIntegrity failed: " + s);
+ throw new RuntimeException("checkTreeIntegrity failed: " + s);
+ // return false;
+ }
+
+ /**
+ * This function checks the integrity of the tree, after it has been fully built and
+ * is ready for execution. Derived classes can overload this function to check
+ * their own assumptions.
+ *
+ * @param levelCount The current tree level.
+ * @param childNumber The current child index.
+ * @param parentOK The parent's integrity flag.
+ * @return boolean true the node does not have integrity, otherwise
+ * return the parentOK value.
+ */
+ public boolean checkTreeIntegrity(
+ int levelCount,
+ int childNumber,
+ boolean parentOK)
+ {
+ boolean isOK;
+// try
+ {
+ isOK = parentOK;
+ if (levelCount == 0)
+ {
+ if (!(null == jjtGetParent()))
+ isOK =
+ flagProblem("The root node has a parent?? parent: " + jjtGetParent());
+ }
+ else
+ {
+ Node parent = jjtGetParent();
+ if (null == parent)
+ isOK =
+ flagProblem(
+ toString() + " has a null parent and is not the root node! "+
+ this.getClass().getName());
+ else
+ {
+ if ( (childNumber >= parent.jjtGetNumChildren())
+ || (parent.jjtGetChild(childNumber) != this))
+ {
+ isOK =
+ flagProblem(
+ toString() + " has a parent that it is not a child of!");
+ }
+ }
+
+ }
+ if (this instanceof NonExecutableExpression)
+ isOK = flagProblem(toString() + " is a NonExecutableExpression!");
+
+ int childCount = jjtGetNumChildren();
+ for (int i = 0; i < childCount; i++)
+ {
+ Node child = jjtGetChild(i);
+ if(null == child)
+ isOK = flagProblem(toString() + " has a null child!");
+ else
+ isOK = ((SimpleNode) child).checkTreeIntegrity(levelCount + 1, i, isOK);
+ }
+ }
+// catch (RuntimeException e)
+// {
+// isOK = flagProblem(toString() + e.getMessage());
+// e.printStackTrace();
+// }
+
+ return isOK;
+ }
+
+ /**
+ * This ugly little function strips the extranious PathExpr/RelativePathExpr/StepExpr
+ * from XObjects, recursively calling the node's child at index zero, if
+ * the node is a path expression. It should be called from
+ * jjtAddChild functions.
+ *
+ * @param n The node to fix up.
+ * @return Node The fixed up node that should be added as a child, which
+ * may well not be the same node that was passed in.
+ */
+ protected org.apache.xpath.parser.Node fixupPrimaryRecursive(
+ org.apache.xpath.parser.Node n)
+ {
+ if (((SimpleNode) n).isPathExpr() && n.jjtGetNumChildren() > 0)
+ {
+ SimpleNode newRoot = (SimpleNode) fixupPrimaryRecursive(n.jjtGetChild(0));
+
+ if (newRoot.isPathExprReduced() && !newRoot.isPathExpr())
+ {
+ return newRoot;
+ }
+ }
+ return n;
+ }
+
+ /**
+ * Set this to false if you don't want the PathExprs rewritten to LocationPaths.
+ * For Diagnostic purposes.
+ */
+ public static boolean m_rewritePathExprs = true;
+
+ /**
+ * This ugly little function strips the extranious PathExpr/RelativePathExpr/StepExpr
+ * from XObjects. I'm not sure what I'm going to do with the predicates of
+ * these expressions, or with variables, yet. It should be called from
+ * jjtAddChild functions.
+ *
+ * @param n The node to fix up.
+ * @return Node The fixed up node that should be added as a child, which
+ * may well not be the same node that was passed in.
+ */
+ protected org.apache.xpath.parser.Node fixupPrimarys(
+ org.apache.xpath.parser.Node n)
+ {
+ if (((SimpleNode) n).shouldReduceIfOneChild())
+ {
+ n = n.jjtGetChild(0);
+ n.jjtSetParent(this);
+ return n;
+ }
+ Node orig = n;
+ if ((n instanceof NonExecutableExpression) && n.jjtGetNumChildren() > 0)
+ {
+ n = fixupPrimaryRecursive(n);
+ }
+ if (n instanceof PathExpr)
+ {
+ Node mightBeStepExprOrSomethingElse = n.jjtGetChild(0);
+ if (!(mightBeStepExprOrSomethingElse instanceof StepExpr))
+ n = mightBeStepExprOrSomethingElse; // is something else, so reduce
+ }
+ if (m_rewritePathExprs && n instanceof PathExpr)
+ {
+ boolean isTopLevel = (((PathExpr) n).m_parser.m_predLevel == 0);
+ try
+ {
+ n = (Node) WalkerFactory.newDTMIterator((PathExpr) n, isTopLevel);
+ }
+ catch (javax.xml.transform.TransformerException te)
+ {
+ throw new org.apache.xml.utils.WrappedRuntimeException(te);
+ }
+ }
+ if (n != orig)
+ n.jjtSetParent(this); // because jjtree can't!
+ return n;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtOpen()
+ */
+ public void jjtOpen()
+ {
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtClose()
+ */
+ public void jjtClose()
+ {
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtSetParent(Node)
+ */
+ public void jjtSetParent(Node n)
+ {
+ ((Expression) this).exprSetParent((ExpressionNode) n);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetParent()
+ */
+ public Node jjtGetParent()
+ {
+ return (Node) ((Expression) this).exprGetParent();
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ n = fixupPrimarys(n);
+ ((Expression) this).exprAddChild((ExpressionNode) n, i);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetChild(int)
+ */
+ public Node jjtGetChild(int i)
+ {
+ return (Node) ((Expression) this).exprGetChild(i);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetNumChildren()
+ */
+ public int jjtGetNumChildren()
+ {
+ return ((Expression) this).exprGetNumChildren();
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAccept(XPathVisitor, Object)
+ */
+ public Object jjtAccept(XPathVisitor visitor, Object data)
+ {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * Call jjtAccept for each child of the node.
+ * @param visitor The visitor that will visit the child node.
+ * @param data A data object to be handed to that visitor.
+ * @return Object The data object handed in, possibly
+ * modified by jjtAccept.
+ */
+ public Object childrenAccept(XPathVisitor visitor, Object data)
+ {
+ int nChildren = jjtGetNumChildren();
+ for (int i = 0; i < nChildren; ++i)
+ {
+ jjtGetChild(i).jjtAccept(visitor, data);
+ }
+ return data;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return this.getClass().getName();
+ }
+
+ /**
+ * Method toString.
+ * @param prefix
+ * @return String
+ */
+ public String toString(String prefix)
+ {
+ return prefix + toString();
+ }
+
+ public void processToken(Token t)
+ {
+ // abstract
+ }
+
+ /**
+ * Dump a diagnostic representation of the node to System.out.
+ * @param prefix The prefix string to be added before the
+ * to each line of output.
+ */
+ public void dump(String prefix)
+ {
+ dump(prefix, System.out);
+ }
+
+ /**
+ * Method for subclasses to override to print the diagnostic
+ * <i>value</i> of the node.
+ * @param ps The PrintStream to write the value to.
+ */
+ public void printValue(java.io.PrintStream ps)
+ {
+ }
+
+ /**
+ * Dump a diagnostic representation of the node to a PrintStream.
+ *
+ * @param prefix The prefix string to be added before the
+ * to each line of output.
+
+ * @param ps The PrintStream where the representation will
+ * be written.
+ */
+ public void dump(String prefix, java.io.PrintStream ps)
+ {
+ ps.print(toString(prefix));
+ printValue(ps);
+ ps.println();
+ int nChildren = jjtGetNumChildren();
+ for (int i = 0; i < nChildren; ++i)
+ {
+ SimpleNode n = (SimpleNode) jjtGetChild(i);
+ if (n != null)
+ {
+ n.dump(prefix + " ", ps);
+ }
+ }
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/SlashOrSlashSlash.java b/src/org/apache/xpath/parser/SlashOrSlashSlash.java
new file mode 100644
index 0000000..cc8db01
--- /dev/null
+++ b/src/org/apache/xpath/parser/SlashOrSlashSlash.java
@@ -0,0 +1,65 @@
+package org.apache.xpath.parser;
+
+/**
+ * Represents a "/" or "//" node that does not appear at the head of a path expression. This node
+ * is not executable and exists for construction purposes only.
+ *
+ * Created Jul 11, 2002
+ * @author sboag
+ */
+public class SlashOrSlashSlash extends NonExecutableExpression
+{
+ /** true if this is a "//" step. */
+ boolean m_isSlashSlash;
+
+ /**
+ * Construct a SlashOrSlashSlash node.
+ * @param isSlashSlash true if this is a "//" step.
+ * @see org.apache.xpath.parser.NonExecutableExpression#NonExecutableExpression(XPath)
+ */
+ public SlashOrSlashSlash(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * Construct a SlashOrSlashSlash node.
+ * @param isSlashSlash true if this is a "//" step.
+ * @param parser The XPath parser that is creating this node.
+ */
+ SlashOrSlashSlash(boolean isSlashSlash, XPath parser)
+ {
+ super(parser);
+ m_isSlashSlash = isSlashSlash;
+ }
+
+ /**
+ * Returns the isSlashSlash property.
+ * @return boolean true if this is a "//" step.
+ */
+ public boolean getisSlashSlash()
+ {
+ return m_isSlashSlash;
+ }
+
+
+ /**
+ * Returns the isSlashSlash property.
+ * @return boolean true if this is a "//" step.
+ */
+ public boolean isSlashSlash()
+ {
+ return m_isSlashSlash;
+ }
+
+ /**
+ * Sets the isSlashSlash.
+ * @param isSlashSlash The isSlashSlash to set
+ */
+ public void setIsSlashSlash(boolean isSlashSlash)
+ {
+ m_isSlashSlash = isSlashSlash;
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/Star.java b/src/org/apache/xpath/parser/Star.java
new file mode 100644
index 0000000..4392536
--- /dev/null
+++ b/src/org/apache/xpath/parser/Star.java
@@ -0,0 +1,22 @@
+package org.apache.xpath.parser;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class Star extends NonExecutableExpression
+{
+ public Star(XPath parser)
+ {
+ super(parser);
+ }
+}
+
diff --git a/src/org/apache/xpath/parser/StarColonNCName.java b/src/org/apache/xpath/parser/StarColonNCName.java
new file mode 100644
index 0000000..9a9a147
--- /dev/null
+++ b/src/org/apache/xpath/parser/StarColonNCName.java
@@ -0,0 +1,29 @@
+package org.apache.xpath.parser;
+public class StarColonNCName extends QName
+{
+ StarColonNCName(XPath parser)
+ {
+ super(parser);
+ }
+
+ protected String m_localName;
+
+ public String getNamespaceURI()
+ {
+ return org.apache.xpath.patterns.NodeTest.WILD;
+ }
+
+ public String getLocalName()
+ {
+ return m_localName;
+ }
+
+
+ public void processToken(Token t)
+ {
+ int posOfColon = t.image.indexOf(':');
+ m_localName = t.image.substring(posOfColon+1).trim();
+ }
+
+}
+
diff --git a/src/org/apache/xpath/parser/StepExpr.java b/src/org/apache/xpath/parser/StepExpr.java
new file mode 100644
index 0000000..20c95dc
--- /dev/null
+++ b/src/org/apache/xpath/parser/StepExpr.java
@@ -0,0 +1,262 @@
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.Axis;
+import org.apache.xml.dtm.DTMFilter;
+import org.apache.xpath.axes.LocPathIterator;
+
+/**
+ * The responsibility of StepExpr is to hold the axis, node test, and
+ * predicates while the expression is being constructed. Objects of
+ * this class will be rewritten as DTMIterators or AxesWalkers.
+ *
+ * Created Jul 12, 2002
+ *
+ * @author sboag
+ * @see org.apache.xpath.parser.NonExecutableExpression#NonExecutableExpression(XPath)
+ * @see org.apache.xpath.parser.PathExpr#jjtAddChild(Node, int)
+ * @see org.apache.xpath.parser.SimpleNode#jjtAddChild(Node, int)
+ */
+public class StepExpr extends NonExecutableExpression
+{
+ /**
+ * Create a StepExpr object for construction purposes.
+ */
+ public StepExpr(XPath parser)
+ {
+ super(parser);
+ }
+
+ /**
+ * Tell if this node is part of a PathExpr chain. For instance:
+ * <pre>
+ * |UnaryExpr
+ * | PathExpr
+ * | StepExpr
+ * | AxisChild child::
+ * | NodeTest
+ * | NameTest
+ * | QName foo
+ * | Predicates *
+ * </pre><br/>
+ * In this example, UnaryExpr, PathExpr, and StepExpr should all return true.
+ */
+ public boolean isPathExpr()
+ {
+ // Don't reduce if there are predicates!
+ return (getNumPredicates() > 0) ? false : true;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtClose()
+ */
+ public void jjtClose()
+ {
+ Node n = jjtGetChild(0);
+ if (n instanceof PatternAxis && n.jjtGetNumChildren() == 2)
+ {
+ Node patternAxis = n.jjtGetChild(0);
+ m_exprs.setElementAt(patternAxis, 0);
+ patternAxis.jjtSetParent(this);
+
+ NameTest nt = (NameTest) n.jjtGetChild(1);
+ NodeTest nodeTest = new NodeTest(getParser());
+ nodeTest.jjtAddChild(nt, 0);
+
+ m_exprs.insertElementAt(nodeTest, 1);
+ nodeTest.jjtSetParent(this);
+
+ ((PatternAxis) n).m_exprs.removeAllElements();
+ }
+ else
+ if (n instanceof PatternAxis && n.jjtGetNumChildren() == 1)
+ {
+ Node child = n.jjtGetChild(0);
+ if (child instanceof NodeTest)
+ {
+ NodeTest nodeTest = (NodeTest) n.jjtGetChild(0);
+ m_exprs.insertElementAt(nodeTest, 1);
+ nodeTest.jjtSetParent(this);
+ }
+ else // instanceof pattern axis
+ {
+ // occurs for "." and "..".
+ PatternAxis patAxes = (PatternAxis) n.jjtGetChild(0);
+ m_exprs.setElementAt(patAxes, 0); // replace self
+ patAxes.jjtSetParent(this);
+ NodeTest nodeTest = (NodeTest) patAxes.jjtGetChild(0);
+ m_exprs.insertElementAt(nodeTest, 1);
+ nodeTest.jjtSetParent(this);
+ patAxes.m_exprs.removeAllElements();
+ }
+
+ ((PatternAxis) n).m_exprs.removeAllElements();
+ }
+
+ // We can't tell if a "*" is an attribute until late, so we have to
+ // wait until now, and fix up the WhatToShow value.
+ int axis = getAxis();
+
+ if (Axis.ATTRIBUTE == axis || Axis.NAMESPACE == axis)
+ {
+ NodeTest ntest = getNodeTest();
+ if (null != ntest)
+ {
+ if (org.apache.xml.dtm.Axis.ATTRIBUTE == axis)
+ ntest.setWhatToShow(org.apache.xml.dtm.DTMFilter.SHOW_ATTRIBUTE);
+ else
+ if (org.apache.xml.dtm.Axis.NAMESPACE == axis)
+ {
+ ntest.setWhatToShow(org.apache.xml.dtm.DTMFilter.SHOW_NAMESPACE);
+ org.apache.xml.utils.PrefixResolver resolver =
+ getParser().getPrefixResolver();
+ // NodeTest compares the resolved URI, so I guess this is done here.
+ // (even though I can't find it in the old code...
+ // I guess it's in there somewhere? -sb)
+ String prefix = ntest.getLocalName();
+ if (!prefix.equals("*"))
+ {
+ String ns = resolver.getNamespaceForPrefix(prefix);
+ ntest.setLocalName(ns);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the axis ID for this step expression.
+ * @return int One of org.apache.xml.dtm.Axis.XXXX.
+ * @see org.apache.xml.dtm.Axis
+ */
+ public int getAxis()
+ {
+ Node firstChild = jjtGetChild(0);
+ if (firstChild instanceof PatternAxis)
+ return ((PatternAxis) firstChild).getAxis();
+ else
+ return org.apache.xml.dtm.Axis.ALLFROMNODE;
+ }
+
+ /**
+ * Get the axis to be traversed for this step expression.
+ * @return PatternAxis The axis expression object, or null if there isn't one.
+ */
+ public PatternAxis getAxisExpr()
+ {
+ Node firstChild = jjtGetChild(0);
+ if (firstChild instanceof PatternAxis)
+ return ((PatternAxis) firstChild);
+ else
+ return null;
+ }
+
+ /**
+ * Get the node test object owned by this step expression.
+ * @return NodeTest The node test, or null if there isn't one.
+ */
+ public NodeTest getNodeTest()
+ {
+ if (jjtGetNumChildren() > 2)
+ {
+ Node secondChild = jjtGetChild(1);
+ if (secondChild instanceof NodeTest)
+ return (NodeTest) secondChild;
+ else
+ return null;
+ }
+ else
+ return null;
+ }
+
+ /**
+ * Tell what this node should show on the given axis.
+ * @return int One of org.apache.xml.dtm.DTMFilter.SHOW_XXX.
+ * @see org.apache.xml.dtm.DTMFilter
+ */
+ public int getWhatToShow()
+ {
+ NodeTest nt = getNodeTest();
+ if (null != nt)
+ return nt.getWhatToShow();
+ else
+ return DTMFilter.SHOW_ALL;
+ }
+
+ /**
+ * Tell if this node test is a wildcard.
+ * @return boolean true if the node test should show all the nodes on the axis.
+ */
+ public boolean isTotallyWild()
+ {
+ NodeTest nt = getNodeTest();
+ if (null != nt)
+ return nt.isTotallyWild();
+ else
+ return true;
+ }
+
+ /**
+ * Get the namespace URI for the node test owned by this expression.
+ * @return String URI string, or null if none.
+ */
+ public String getNamespaceURI()
+ {
+ NodeTest nt = getNodeTest();
+ if (null != nt)
+ return nt.getNamespaceURI();
+ else
+ return null;
+ }
+
+ /**
+ * Get the local name for the node test owned by this expression.
+ * @return String local name, or null if none.
+ */
+ public String getLocalName()
+ {
+ NodeTest nt = getNodeTest();
+ if (null != nt)
+ return nt.getLocalName();
+ else
+ return null;
+ }
+
+ /**
+ * Get the number of predicates for this expression.
+ * @return int The number of predicates to apply to this expression.
+ */
+ public int getNumPredicates()
+ {
+ int lastChildIndex = jjtGetNumChildren() - 1;
+ if (lastChildIndex > 0)
+ {
+ Node lastChild = jjtGetChild(lastChildIndex);
+ if (lastChild instanceof Predicates)
+ return ((Predicates) lastChild).jjtGetNumChildren();
+ else
+ return 0;
+ }
+ else
+ return 0;
+ }
+
+ /**
+ * Get the predicates for this step expression.
+ * @return Predicates predicates if they have been added, otherwise null.
+ */
+ public Predicates getPredicates()
+ {
+ int lastChildIndex = jjtGetNumChildren() - 1;
+ if (lastChildIndex > 0)
+ {
+ Node lastChild = jjtGetChild(lastChildIndex);
+ if (lastChild instanceof Predicates)
+ return (Predicates) lastChild;
+ else
+ return null;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/TempFunctionHolder.java b/src/org/apache/xpath/parser/TempFunctionHolder.java
new file mode 100644
index 0000000..6466fd0
--- /dev/null
+++ b/src/org/apache/xpath/parser/TempFunctionHolder.java
@@ -0,0 +1,38 @@
+package org.apache.xpath.parser;
+
+import org.apache.xpath.patterns.FunctionPattern;
+
+/**
+ * Temporarily holds a function while it's being built.
+ */
+public class TempFunctionHolder extends FunctionPattern
+{
+
+ /**
+ * Constructor for TempFunctionHolder
+ */
+ public TempFunctionHolder()
+ {
+ super();
+ }
+
+ /**
+ * Tell if this node should have it's parent reduced.
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return true;
+ }
+
+ public Node jjtGetChild(int i)
+ {
+ return m_functionExpr;
+ }
+
+ public int jjtGetNumChildren() {
+ return 1;
+ }
+
+
+}
+
diff --git a/src/org/apache/xpath/parser/TextTest.java b/src/org/apache/xpath/parser/TextTest.java
new file mode 100644
index 0000000..679b2a2
--- /dev/null
+++ b/src/org/apache/xpath/parser/TextTest.java
@@ -0,0 +1,21 @@
+package org.apache.xpath.parser;
+
+import org.apache.xml.dtm.DTMFilter;
+
+/**
+ * This is an expression node that only exists for construction
+ * purposes.
+ */
+public class TextTest extends KindTest
+{
+ public TextTest(XPath parser)
+ {
+ super(parser);
+ }
+
+ public int getWhatToShow()
+ {
+ return DTMFilter.SHOW_TEXT;
+ }
+}
+
diff --git a/src/org/apache/xpath/parser/Token.java b/src/org/apache/xpath/parser/Token.java
new file mode 100644
index 0000000..7016baa
--- /dev/null
+++ b/src/org/apache/xpath/parser/Token.java
@@ -0,0 +1,81 @@
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */
+package org.apache.xpath.parser;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token {
+
+ /**
+ * An integer that describes the kind of this token. This numbering
+ * system is determined by JavaCCParser, and a table of these numbers is
+ * stored in the file ...Constants.java.
+ */
+ public int kind;
+
+ /**
+ * beginLine and beginColumn describe the position of the first character
+ * of this token; endLine and endColumn describe the position of the
+ * last character of this token.
+ */
+ public int beginLine, beginColumn, endLine, endColumn;
+
+ /**
+ * The string image of the token.
+ */
+ public String image;
+
+ /**
+ * A reference to the next regular (non-special) token from the input
+ * stream. If this is the last token from the input stream, or if the
+ * token manager has not read tokens beyond this one, this field is
+ * set to null. This is true only if this token is also a regular
+ * token. Otherwise, see below for a description of the contents of
+ * this field.
+ */
+ public Token next;
+
+ /**
+ * This field is used to access special tokens that occur prior to this
+ * token, but after the immediately preceding regular (non-special) token.
+ * If there are no such special tokens, this field is set to null.
+ * When there are more than one such special token, this field refers
+ * to the last of these special tokens, which in turn refers to the next
+ * previous special token through its specialToken field, and so on
+ * until the first special token (whose specialToken field is null).
+ * The next fields of special tokens refer to other special tokens that
+ * immediately follow it (without an intervening regular token). If there
+ * is no such token, this field is null.
+ */
+ public Token specialToken;
+
+ /**
+ * Returns the image.
+ */
+ public final String toString()
+ {
+ return image;
+ }
+
+ /**
+ * Returns a new Token object, by default. However, if you want, you
+ * can create and return subclass objects based on the value of ofKind.
+ * Simply add the cases to the switch for all those special cases.
+ * For example, if you have a subclass of Token called IDToken that
+ * you want to create if ofKind is ID, simlpy add something like :
+ *
+ * case MyParserConstants.ID : return new IDToken();
+ *
+ * to the following switch statement. Then you can cast matchedToken
+ * variable to the appropriate type and use it in your lexical actions.
+ */
+ public static final Token newToken(int ofKind)
+ {
+ switch(ofKind)
+ {
+ default : return new Token();
+ }
+ }
+
+}
diff --git a/src/org/apache/xpath/parser/TokenMgrError.java b/src/org/apache/xpath/parser/TokenMgrError.java
new file mode 100644
index 0000000..2ee4f10
--- /dev/null
+++ b/src/org/apache/xpath/parser/TokenMgrError.java
@@ -0,0 +1,133 @@
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */
+package org.apache.xpath.parser;
+
+public class TokenMgrError extends Error
+{
+ /*
+ * Ordinals for various reasons why an Error of this type can be thrown.
+ */
+
+ /**
+ * Lexical error occured.
+ */
+ static final int LEXICAL_ERROR = 0;
+
+ /**
+ * An attempt wass made to create a second instance of a static token manager.
+ */
+ static final int STATIC_LEXER_ERROR = 1;
+
+ /**
+ * Tried to change to an invalid lexical state.
+ */
+ static final int INVALID_LEXICAL_STATE = 2;
+
+ /**
+ * Detected (and bailed out of) an infinite loop in the token manager.
+ */
+ static final int LOOP_DETECTED = 3;
+
+ /**
+ * Indicates the reason why the exception is thrown. It will have
+ * one of the above 4 values.
+ */
+ int errorCode;
+
+ /**
+ * Replaces unprintable characters by their espaced (or unicode escaped)
+ * equivalents in the given string
+ */
+ protected static final String addEscapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+ /**
+ * Returns a detailed message for the Error when it is thrown by the
+ * token manager to indicate a lexical error.
+ * Parameters :
+ * EOFSeen : indicates if EOF caused the lexicl error
+ * curLexState : lexical state in which this error occured
+ * errorLine : line number when the error occured
+ * errorColumn : column number when the error occured
+ * errorAfter : prefix that was seen before this error occured
+ * curchar : the offending character
+ * Note: You can customize the lexical error message by modifying this method.
+ */
+ private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+ return("Lexical error at line " +
+ errorLine + ", column " +
+ errorColumn + ". Encountered: " +
+ (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+ "after : \"" + addEscapes(errorAfter) + "\"");
+ }
+
+ /**
+ * You can also modify the body of this method to customize your error messages.
+ * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+ * of end-users concern, so you can return something like :
+ *
+ * "Internal Error : Please file a bug report .... "
+ *
+ * from this method for such cases in the release version of your parser.
+ */
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ /*
+ * Constructors of various flavors follow.
+ */
+
+ public TokenMgrError() {
+ }
+
+ public TokenMgrError(String message, int reason) {
+ super(message);
+ errorCode = reason;
+ }
+
+ public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+ this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+ }
+}
diff --git a/src/org/apache/xpath/parser/UnaryExpr.java b/src/org/apache/xpath/parser/UnaryExpr.java
new file mode 100644
index 0000000..efb9824
--- /dev/null
+++ b/src/org/apache/xpath/parser/UnaryExpr.java
@@ -0,0 +1,54 @@
+package org.apache.xpath.parser;
+public class UnaryExpr extends NonExecutableExpression
+{
+ public UnaryExpr(XPath parser)
+ {
+ super(parser);
+ }
+
+ public void jjtClose()
+ {
+ int n = jjtGetNumChildren();
+ if(n > 1)
+ {
+ Node head = jjtGetChild(0);
+ for(int i = 1; i < n; i++)
+ {
+ Node next = jjtGetChild(i);
+ head.jjtAddChild(next, 0);
+ head = next;
+ }
+ m_exprs.setSize(1);
+ }
+ }
+
+ /**
+ * Tell if this node is part of a PathExpr chain. For instance:
+ * <pre>
+ * |UnaryExpr
+ * | PathExpr
+ * | StepExpr
+ * | AxisChild child::
+ * | NodeTest
+ * | NameTest
+ * | QName foo
+ * | Predicates *
+ * </pre><br/>
+ * In this example, UnaryExpr, PathExpr, and StepExpr should all return true.
+ */
+ public boolean isPathExpr()
+ {
+ return true;
+ }
+
+ /**
+ * @see SimpleNode#shouldReduceIfOneChild()
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return (jjtGetNumChildren() == 1) ? true : false;
+ }
+
+
+}
+
diff --git a/src/org/apache/xpath/parser/XPath.java b/src/org/apache/xpath/parser/XPath.java
new file mode 100644
index 0000000..0aa239b
--- /dev/null
+++ b/src/org/apache/xpath/parser/XPath.java
@@ -0,0 +1,3909 @@
+/* Generated By:JJTree&JavaCC: Do not edit this line. XPath.java */
+package org.apache.xpath.parser;
+
+
+import java.util.Stack;
+
+public class XPath/*@bgen(jjtree)*/implements XPathTreeConstants, XPathConstants {/*@bgen(jjtree)*/
+ protected JJTXPathState jjtree = new JJTXPathState();
+ org.apache.xml.utils.PrefixResolver m_prefixResolver;
+ org.apache.xpath.patterns.FunctionPattern m_matchFunc = null; // short lived.
+
+ int m_predLevel = 0;
+
+ public void setPrefixResolver(org.apache.xml.utils.PrefixResolver resolver)
+ {
+ m_prefixResolver = resolver;
+ }
+
+ public org.apache.xml.utils.PrefixResolver getPrefixResolver()
+ {
+ return m_prefixResolver;
+ }
+
+ /**
+ * The "version" property.
+ * @serial
+ */
+ private double m_version;
+
+ /**
+ * Set the "version" property for XPath.
+ *
+ * @param v Value for the "version" property.
+ */
+ public void setVersion(double v)
+ {
+ m_version = v;
+ }
+
+ /**
+ * Get the "version" property of XPath.
+ *
+ * @return The value of the "version" property.
+ */
+ public double getVersion()
+ {
+ return m_version;
+ }
+
+
+
+ boolean m_isMatchPattern = false;
+
+ Stack binaryTokenStack = new Stack();
+ public static void main(String args[])
+ throws Exception
+ {
+ int numberArgsLeft = args.length;
+ int argsStart = 0;
+ boolean isMatchParser = false;
+ if(numberArgsLeft > 0)
+ {
+ if(args[argsStart].equals("-match"))
+ {
+ isMatchParser = true;
+ System.out.println("Match Pattern Parser");
+ argsStart++;
+ numberArgsLeft--;
+ }
+ }
+ if(numberArgsLeft > 0)
+ {
+ try
+ {
+ for(int i = argsStart; i < args.length; i++)
+ {
+ System.out.println();
+ System.out.println("Test["+i+"]: "+args[i]);
+ XPath parser = new XPath(new java.io.StringBufferInputStream(args[i]));
+ SimpleNode tree;
+ if(isMatchParser)
+ {
+ tree = parser.MatchPattern();
+ }
+ else
+ {
+ tree = parser.XPath2();
+ }
+ ((SimpleNode)tree.jjtGetChild(0)).dump("|") ;
+ }
+ System.out.println("Success!!!!");
+ }
+ catch(ParseException pe)
+ {
+ System.err.println(pe.getMessage());
+ }
+ return;
+ }
+ java.io.DataInputStream dinput = new java.io.DataInputStream(System.in);
+ while(true)
+ {
+ try
+ {
+ System.err.println("Type Expression: ");
+ String input = dinput.readLine();
+ if(null == input || input.trim().length() == 0)
+ break;
+ XPath parser = new XPath(new java.io.StringBufferInputStream(input));
+ SimpleNode tree;
+ if(isMatchParser)
+ {
+ tree = parser.MatchPattern();
+ }
+ else
+ {
+ tree = parser.XPath2();
+ }
+ ((SimpleNode)tree.jjtGetChild(0)).dump("|") ;
+ }
+ catch(ParseException pe)
+ {
+ System.err.println(pe.getMessage());
+ }
+ catch(Exception e)
+ {
+ System.err.println(e.getMessage());
+ }
+ }
+ }
+
+ final public SimpleNode XPath2() throws ParseException {
+ /*@bgen(jjtree) XPath2 */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTXPATH2);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ Expr();
+ jj_consume_token(0);
+ jjtree.closeNodeScope(jjtn000, true);
+ jjtc000 = false;
+ {if (true) return jjtn000 ;}
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public SimpleNode MatchPattern() throws ParseException {
+ /*@bgen(jjtree) MatchPattern */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTMATCHPATTERN);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);m_isMatchPattern = true;
+ try {
+ Pattern();
+ jj_consume_token(0);
+ jjtree.closeNodeScope(jjtn000, true);
+ jjtc000 = false;
+ {if (true) return jjtn000 ;}
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ throw new Error("Missing return statement in function");
+ }
+
+ final public void ExprSequence() throws ParseException {
+ /*@bgen(jjtree) ExprSequence */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTEXPRSEQUENCE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ Expr();
+ label_1:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Comma:
+ ;
+ break;
+ default:
+ jj_la1[0] = jj_gen;
+ break label_1;
+ }
+ jj_consume_token(Comma);
+ Expr();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void Pattern() throws ParseException {
+ /*@bgen(jjtree) Pattern */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPATTERN);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ PathPattern();
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Union:
+ case Vbar:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Union:
+ jj_consume_token(Union);
+ break;
+ case Vbar:
+ jj_consume_token(Vbar);
+ break;
+ default:
+ jj_la1[1] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ Pattern();
+ break;
+ default:
+ jj_la1[2] = jj_gen;
+ ;
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void PathPattern() throws ParseException {
+ /*@bgen(jjtree) PathPattern */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPATHPATTERN);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Root:
+ jj_consume_token(Root);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTROOT);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisAttribute:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case At:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case QName:
+ RelativePathPattern();
+ break;
+ default:
+ jj_la1[3] = jj_gen;
+ ;
+ }
+ break;
+ case RootDescendants:
+ jj_consume_token(RootDescendants);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTROOTDESCENDANTS);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ RelativePathPattern();
+ break;
+ case QNameLpar:
+ IdKeyPattern();
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ case SlashSlash:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ jj_consume_token(Slash);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASH);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ case SlashSlash:
+ jj_consume_token(SlashSlash);
+ SimpleNode jjtn004 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASHSLASH);
+ boolean jjtc004 = true;
+ jjtree.openNodeScope(jjtn004);
+ try {
+ jjtree.closeNodeScope(jjtn004, true);
+ jjtc004 = false;
+ jjtn004.processToken(token);
+ } finally {
+ if (jjtc004) {
+ jjtree.closeNodeScope(jjtn004, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[4] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ RelativePathPattern();
+ break;
+ default:
+ jj_la1[5] = jj_gen;
+ ;
+ }
+ break;
+ case AxisChild:
+ case AxisAttribute:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case At:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case QName:
+ RelativePathPattern();
+ break;
+ default:
+ jj_la1[6] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void RelativePathPattern() throws ParseException {
+ PatternStep();
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ case SlashSlash:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ jj_consume_token(Slash);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASH);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case SlashSlash:
+ jj_consume_token(SlashSlash);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASHSLASH);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[7] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ RelativePathPattern();
+ break;
+ default:
+ jj_la1[8] = jj_gen;
+ ;
+ }
+ }
+
+ final public void PatternStep() throws ParseException {
+ /*@bgen(jjtree) PatternStep */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPATTERNSTEP);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisAttribute:
+ case At:
+ PatternAxis();
+ break;
+ default:
+ jj_la1[9] = jj_gen;
+ ;
+ }
+ NodeTest();
+ Predicates();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void PatternAxis() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ jj_consume_token(AxisChild);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISCHILD);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case AxisAttribute:
+ jj_consume_token(AxisAttribute);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISATTRIBUTE);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ case At:
+ jj_consume_token(At);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAT);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[10] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void IdKeyPattern() throws ParseException {
+ /*@bgen(jjtree) IdKeyPattern */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIDKEYPATTERN);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(QNameLpar);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAMELPAR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ IdKeyValue();
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Comma:
+ jj_consume_token(Comma);
+ IdKeyValue();
+ break;
+ default:
+ jj_la1[11] = jj_gen;
+ ;
+ }
+ jj_consume_token(Rpar);
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void IdKeyValue() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case StringLiteral:
+ Literal();
+ break;
+ case VariableIndicator:
+ jj_consume_token(VariableIndicator);
+ jj_consume_token(VarName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVARNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[12] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void Expr() throws ParseException {
+ OrExpr();
+ }
+
+ final public void OrExpr() throws ParseException {
+ AndExpr();
+ label_2:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Or:
+ ;
+ break;
+ default:
+ jj_la1[13] = jj_gen;
+ break label_2;
+ }
+ jj_consume_token(Or);
+ binaryTokenStack.push(token);
+ AndExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTOREXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void AndExpr() throws ParseException {
+ FLWRExpr();
+ label_3:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case And:
+ ;
+ break;
+ default:
+ jj_la1[14] = jj_gen;
+ break label_3;
+ }
+ jj_consume_token(And);
+ binaryTokenStack.push(token);
+ FLWRExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTANDEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void FLWRExpr() throws ParseException {
+ /*@bgen(jjtree) FLWRExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTFLWREXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ label_4:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case ForVariable:
+ ;
+ break;
+ default:
+ jj_la1[15] = jj_gen;
+ break label_4;
+ }
+ ForClause();
+ jj_consume_token(Return);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTRETURN);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ }
+ QuantifiedExpr();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void QuantifiedExpr() throws ParseException {
+ /*@bgen(jjtree) QuantifiedExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQUANTIFIEDEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ label_5:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Some:
+ case Every:
+ ;
+ break;
+ default:
+ jj_la1[16] = jj_gen;
+ break label_5;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Some:
+ jj_consume_token(Some);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSOME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case Every:
+ jj_consume_token(Every);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTEVERY);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[17] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ jj_consume_token(VarName);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVARNAME);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ jj_consume_token(In);
+ SimpleNode jjtn004 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIN);
+ boolean jjtc004 = true;
+ jjtree.openNodeScope(jjtn004);
+ try {
+ jjtree.closeNodeScope(jjtn004, true);
+ jjtc004 = false;
+ jjtn004.processToken(token);
+ } finally {
+ if (jjtc004) {
+ jjtree.closeNodeScope(jjtn004, true);
+ }
+ }
+ Expr();
+ label_6:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Comma:
+ ;
+ break;
+ default:
+ jj_la1[18] = jj_gen;
+ break label_6;
+ }
+ jj_consume_token(Comma);
+ jj_consume_token(VariableIndicator);
+ jj_consume_token(VarName);
+ SimpleNode jjtn005 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVARNAME);
+ boolean jjtc005 = true;
+ jjtree.openNodeScope(jjtn005);
+ try {
+ jjtree.closeNodeScope(jjtn005, true);
+ jjtc005 = false;
+ jjtn005.processToken(token);
+ } finally {
+ if (jjtc005) {
+ jjtree.closeNodeScope(jjtn005, true);
+ }
+ }
+ jj_consume_token(In);
+ SimpleNode jjtn006 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIN);
+ boolean jjtc006 = true;
+ jjtree.openNodeScope(jjtn006);
+ try {
+ jjtree.closeNodeScope(jjtn006, true);
+ jjtc006 = false;
+ jjtn006.processToken(token);
+ } finally {
+ if (jjtc006) {
+ jjtree.closeNodeScope(jjtn006, true);
+ }
+ }
+ Expr();
+ }
+ jj_consume_token(Satisfies);
+ SimpleNode jjtn007 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSATISFIES);
+ boolean jjtc007 = true;
+ jjtree.openNodeScope(jjtn007);
+ try {
+ jjtree.closeNodeScope(jjtn007, true);
+ jjtc007 = false;
+ jjtn007.processToken(token);
+ } finally {
+ if (jjtc007) {
+ jjtree.closeNodeScope(jjtn007, true);
+ }
+ }
+ }
+ IfExpr();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void IfExpr() throws ParseException {
+ /*@bgen(jjtree) IfExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIFEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ label_7:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case IfLpar:
+ ;
+ break;
+ default:
+ jj_la1[19] = jj_gen;
+ break label_7;
+ }
+ jj_consume_token(IfLpar);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIFLPAR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ Expr();
+ jj_consume_token(Rpar);
+ jj_consume_token(Then);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTTHEN);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ Expr();
+ jj_consume_token(Else);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTELSE);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ }
+ InstanceofExpr();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void InstanceofExpr() throws ParseException {
+ /*@bgen(jjtree) InstanceofExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTINSTANCEOFEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ ComparisonExpr();
+ label_8:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Instanceof:
+ ;
+ break;
+ default:
+ jj_la1[20] = jj_gen;
+ break label_8;
+ }
+ jj_consume_token(Instanceof);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTINSTANCEOF);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ SequenceType();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ComparisonExpr() throws ParseException {
+ RangeExpr();
+ label_9:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Precedes:
+ case Follows:
+ case Equals:
+ case Is:
+ case NotEquals:
+ case IsNot:
+ case LtEquals:
+ case LtLt:
+ case GtEquals:
+ case GtGt:
+ case FortranEq:
+ case FortranNe:
+ case FortranGt:
+ case FortranGe:
+ case FortranLt:
+ case FortranLe:
+ case Lt:
+ case Gt:
+ ;
+ break;
+ default:
+ jj_la1[21] = jj_gen;
+ break label_9;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case FortranEq:
+ case FortranNe:
+ case FortranGt:
+ case FortranGe:
+ case FortranLt:
+ case FortranLe:
+ ValueComp();
+ break;
+ case Equals:
+ case NotEquals:
+ case LtEquals:
+ case GtEquals:
+ case Lt:
+ case Gt:
+ GeneralComp();
+ break;
+ case Is:
+ case IsNot:
+ NodeComp();
+ break;
+ case Precedes:
+ case Follows:
+ case LtLt:
+ case GtGt:
+ OrderComp();
+ break;
+ default:
+ jj_la1[22] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ RangeExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTCOMPARISONEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void RangeExpr() throws ParseException {
+ AdditiveExpr();
+ label_10:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case To:
+ ;
+ break;
+ default:
+ jj_la1[23] = jj_gen;
+ break label_10;
+ }
+ jj_consume_token(To);
+ binaryTokenStack.push(token);
+ AdditiveExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTRANGEEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void AdditiveExpr() throws ParseException {
+ MultiplicativeExpr();
+ label_11:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Minus:
+ case Plus:
+ ;
+ break;
+ default:
+ jj_la1[24] = jj_gen;
+ break label_11;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Plus:
+ jj_consume_token(Plus);
+ binaryTokenStack.push(token);
+ break;
+ case Minus:
+ jj_consume_token(Minus);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[25] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ MultiplicativeExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTADDITIVEEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void MultiplicativeExpr() throws ParseException {
+ UnionExpr();
+ label_12:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Div:
+ case Idiv:
+ case Mod:
+ case Multiply:
+ ;
+ break;
+ default:
+ jj_la1[26] = jj_gen;
+ break label_12;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Multiply:
+ jj_consume_token(Multiply);
+ binaryTokenStack.push(token);
+ break;
+ case Div:
+ jj_consume_token(Div);
+ binaryTokenStack.push(token);
+ break;
+ case Idiv:
+ jj_consume_token(Idiv);
+ binaryTokenStack.push(token);
+ break;
+ case Mod:
+ jj_consume_token(Mod);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[27] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ UnionExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTMULTIPLICATIVEEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void UnionExpr() throws ParseException {
+ IntersectExceptExpr();
+ label_13:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Union:
+ case Vbar:
+ ;
+ break;
+ default:
+ jj_la1[28] = jj_gen;
+ break label_13;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Union:
+ jj_consume_token(Union);
+ binaryTokenStack.push(token);
+ break;
+ case Vbar:
+ jj_consume_token(Vbar);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[29] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ IntersectExceptExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTUNIONEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void IntersectExceptExpr() throws ParseException {
+ UnaryExpr();
+ label_14:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Intersect:
+ case Except:
+ ;
+ break;
+ default:
+ jj_la1[30] = jj_gen;
+ break label_14;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Intersect:
+ jj_consume_token(Intersect);
+ binaryTokenStack.push(token);
+ break;
+ case Except:
+ jj_consume_token(Except);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[31] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ UnaryExpr();
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTINTERSECTEXCEPTEXPR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, 2);
+ jjtc001 = false;
+ try
+ {
+ jjtn001.processToken((Token)binaryTokenStack.pop());
+ }
+ catch(java.util.EmptyStackException e)
+ {
+ token_source.printLinePos();
+ e.printStackTrace();
+ {if (true) throw e;}
+ }
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, 2);
+ }
+ }
+ }
+ }
+
+ final public void UnaryExpr() throws ParseException {
+ /*@bgen(jjtree) UnaryExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTUNARYEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ label_15:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Minus:
+ case Plus:
+ ;
+ break;
+ default:
+ jj_la1[32] = jj_gen;
+ break label_15;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Minus:
+ jj_consume_token(Minus);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTMINUS);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case Plus:
+ jj_consume_token(Plus);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPLUS);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[33] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ ValueExpr();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ValueExpr() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Validate:
+ ValidateExpr();
+ break;
+ case CastAs:
+ case TreatAs:
+ CastExpr();
+ break;
+ case AxisChild:
+ case AxisDescendant:
+ case AxisParent:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisAncestor:
+ case AxisFollowingSibling:
+ case AxisPrecedingSibling:
+ case AxisFollowing:
+ case AxisPreceding:
+ case AxisNamespace:
+ case AxisAncestorOrSelf:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case Root:
+ case RootDescendants:
+ case Lpar:
+ case At:
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case StringLiteral:
+ case Dot:
+ case DotDot:
+ case VariableIndicator:
+ case QName:
+ case QNameLpar:
+ PathExpr();
+ break;
+ default:
+ jj_la1[34] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void PathExpr() throws ParseException {
+ /*@bgen(jjtree) PathExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPATHEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Root:
+ jj_consume_token(Root);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTROOT);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisDescendant:
+ case AxisParent:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisAncestor:
+ case AxisFollowingSibling:
+ case AxisPrecedingSibling:
+ case AxisFollowing:
+ case AxisPreceding:
+ case AxisNamespace:
+ case AxisAncestorOrSelf:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case Lpar:
+ case At:
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case StringLiteral:
+ case Dot:
+ case DotDot:
+ case VariableIndicator:
+ case QName:
+ case QNameLpar:
+ RelativePathExpr();
+ break;
+ default:
+ jj_la1[35] = jj_gen;
+ ;
+ }
+ break;
+ case RootDescendants:
+ jj_consume_token(RootDescendants);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTROOTDESCENDANTS);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ RelativePathExpr();
+ break;
+ case AxisChild:
+ case AxisDescendant:
+ case AxisParent:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisAncestor:
+ case AxisFollowingSibling:
+ case AxisPrecedingSibling:
+ case AxisFollowing:
+ case AxisPreceding:
+ case AxisNamespace:
+ case AxisAncestorOrSelf:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case Lpar:
+ case At:
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case StringLiteral:
+ case Dot:
+ case DotDot:
+ case VariableIndicator:
+ case QName:
+ case QNameLpar:
+ RelativePathExpr();
+ break;
+ default:
+ jj_la1[36] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void RelativePathExpr() throws ParseException {
+ StepExpr();
+ label_16:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ case SlashSlash:
+ ;
+ break;
+ default:
+ jj_la1[37] = jj_gen;
+ break label_16;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ jj_consume_token(Slash);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASH);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case SlashSlash:
+ jj_consume_token(SlashSlash);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASHSLASH);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[38] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ StepExpr();
+ }
+ }
+
+ final public void StepExpr() throws ParseException {
+ /*@bgen(jjtree) StepExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSTEPEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisDescendant:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisFollowingSibling:
+ case AxisFollowing:
+ case AxisNamespace:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case At:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case Dot:
+ case QName:
+ ForwardStep();
+ break;
+ case AxisParent:
+ case AxisAncestor:
+ case AxisPrecedingSibling:
+ case AxisPreceding:
+ case AxisAncestorOrSelf:
+ case DotDot:
+ ReverseStep();
+ break;
+ case Lpar:
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case StringLiteral:
+ case VariableIndicator:
+ case QNameLpar:
+ PrimaryExpr();
+ break;
+ default:
+ jj_la1[39] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ Predicates();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ForClause() throws ParseException {
+ /*@bgen(jjtree) ForClause */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTFORCLAUSE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(ForVariable);
+ jj_consume_token(VarName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVARNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ jj_consume_token(In);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIN);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ Expr();
+ label_17:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Comma:
+ ;
+ break;
+ default:
+ jj_la1[40] = jj_gen;
+ break label_17;
+ }
+ jj_consume_token(Comma);
+ jj_consume_token(VariableIndicator);
+ jj_consume_token(VarName);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVARNAME);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ jj_consume_token(In);
+ SimpleNode jjtn004 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIN);
+ boolean jjtc004 = true;
+ jjtree.openNodeScope(jjtn004);
+ try {
+ jjtree.closeNodeScope(jjtn004, true);
+ jjtc004 = false;
+ jjtn004.processToken(token);
+ } finally {
+ if (jjtc004) {
+ jjtree.closeNodeScope(jjtn004, true);
+ }
+ }
+ Expr();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ValidateExpr() throws ParseException {
+ /*@bgen(jjtree) ValidateExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVALIDATEEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(Validate);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVALIDATE);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case In:
+ SchemaContext();
+ break;
+ default:
+ jj_la1[41] = jj_gen;
+ ;
+ }
+ jj_consume_token(Lbrace);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTLBRACE);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ Expr();
+ jj_consume_token(Rbrace);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTRBRACE);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void CastExpr() throws ParseException {
+ /*@bgen(jjtree) CastExpr */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTCASTEXPR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case CastAs:
+ jj_consume_token(CastAs);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTCASTAS);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case TreatAs:
+ jj_consume_token(TreatAs);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTTREATAS);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[42] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ SequenceType();
+ ParenthesizedExpr();
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void GeneralComp() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Equals:
+ jj_consume_token(Equals);
+ binaryTokenStack.push(token);
+ break;
+ case NotEquals:
+ jj_consume_token(NotEquals);
+ binaryTokenStack.push(token);
+ break;
+ case Lt:
+ jj_consume_token(Lt);
+ binaryTokenStack.push(token);
+ break;
+ case LtEquals:
+ jj_consume_token(LtEquals);
+ binaryTokenStack.push(token);
+ break;
+ case Gt:
+ jj_consume_token(Gt);
+ binaryTokenStack.push(token);
+ break;
+ case GtEquals:
+ jj_consume_token(GtEquals);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[43] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void ValueComp() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case FortranEq:
+ jj_consume_token(FortranEq);
+ binaryTokenStack.push(token);
+ break;
+ case FortranNe:
+ jj_consume_token(FortranNe);
+ binaryTokenStack.push(token);
+ break;
+ case FortranLt:
+ jj_consume_token(FortranLt);
+ binaryTokenStack.push(token);
+ break;
+ case FortranLe:
+ jj_consume_token(FortranLe);
+ binaryTokenStack.push(token);
+ break;
+ case FortranGt:
+ jj_consume_token(FortranGt);
+ binaryTokenStack.push(token);
+ break;
+ case FortranGe:
+ jj_consume_token(FortranGe);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[44] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void NodeComp() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Is:
+ jj_consume_token(Is);
+ binaryTokenStack.push(token);
+ break;
+ case IsNot:
+ jj_consume_token(IsNot);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[45] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void OrderComp() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case LtLt:
+ jj_consume_token(LtLt);
+ binaryTokenStack.push(token);
+ break;
+ case GtGt:
+ jj_consume_token(GtGt);
+ binaryTokenStack.push(token);
+ break;
+ case Precedes:
+ jj_consume_token(Precedes);
+ binaryTokenStack.push(token);
+ break;
+ case Follows:
+ jj_consume_token(Follows);
+ binaryTokenStack.push(token);
+ break;
+ default:
+ jj_la1[46] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void PrimaryExpr() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case StringLiteral:
+ Literal();
+ break;
+ case QNameLpar:
+ FunctionCall();
+ break;
+ case VariableIndicator:
+ jj_consume_token(VariableIndicator);
+ jj_consume_token(VarName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTVARNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case Lpar:
+ ParenthesizedExpr();
+ break;
+ default:
+ jj_la1[47] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void ForwardAxis() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ jj_consume_token(AxisChild);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISCHILD);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case AxisDescendant:
+ jj_consume_token(AxisDescendant);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISDESCENDANT);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ case AxisAttribute:
+ jj_consume_token(AxisAttribute);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISATTRIBUTE);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ case AxisSelf:
+ jj_consume_token(AxisSelf);
+ SimpleNode jjtn004 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISSELF);
+ boolean jjtc004 = true;
+ jjtree.openNodeScope(jjtn004);
+ try {
+ jjtree.closeNodeScope(jjtn004, true);
+ jjtc004 = false;
+ jjtn004.processToken(token);
+ } finally {
+ if (jjtc004) {
+ jjtree.closeNodeScope(jjtn004, true);
+ }
+ }
+ break;
+ case AxisDescendantOrSelf:
+ jj_consume_token(AxisDescendantOrSelf);
+ SimpleNode jjtn005 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISDESCENDANTORSELF);
+ boolean jjtc005 = true;
+ jjtree.openNodeScope(jjtn005);
+ try {
+ jjtree.closeNodeScope(jjtn005, true);
+ jjtc005 = false;
+ jjtn005.processToken(token);
+ } finally {
+ if (jjtc005) {
+ jjtree.closeNodeScope(jjtn005, true);
+ }
+ }
+ break;
+ case AxisFollowingSibling:
+ jj_consume_token(AxisFollowingSibling);
+ SimpleNode jjtn006 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISFOLLOWINGSIBLING);
+ boolean jjtc006 = true;
+ jjtree.openNodeScope(jjtn006);
+ try {
+ jjtree.closeNodeScope(jjtn006, true);
+ jjtc006 = false;
+ jjtn006.processToken(token);
+ } finally {
+ if (jjtc006) {
+ jjtree.closeNodeScope(jjtn006, true);
+ }
+ }
+ break;
+ case AxisFollowing:
+ jj_consume_token(AxisFollowing);
+ SimpleNode jjtn007 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISFOLLOWING);
+ boolean jjtc007 = true;
+ jjtree.openNodeScope(jjtn007);
+ try {
+ jjtree.closeNodeScope(jjtn007, true);
+ jjtc007 = false;
+ jjtn007.processToken(token);
+ } finally {
+ if (jjtc007) {
+ jjtree.closeNodeScope(jjtn007, true);
+ }
+ }
+ break;
+ case AxisNamespace:
+ jj_consume_token(AxisNamespace);
+ SimpleNode jjtn008 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISNAMESPACE);
+ boolean jjtc008 = true;
+ jjtree.openNodeScope(jjtn008);
+ try {
+ jjtree.closeNodeScope(jjtn008, true);
+ jjtc008 = false;
+ jjtn008.processToken(token);
+ } finally {
+ if (jjtc008) {
+ jjtree.closeNodeScope(jjtn008, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[48] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void ReverseAxis() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisParent:
+ jj_consume_token(AxisParent);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISPARENT);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case AxisAncestor:
+ jj_consume_token(AxisAncestor);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISANCESTOR);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ case AxisPrecedingSibling:
+ jj_consume_token(AxisPrecedingSibling);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISPRECEDINGSIBLING);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ case AxisPreceding:
+ jj_consume_token(AxisPreceding);
+ SimpleNode jjtn004 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISPRECEDING);
+ boolean jjtc004 = true;
+ jjtree.openNodeScope(jjtn004);
+ try {
+ jjtree.closeNodeScope(jjtn004, true);
+ jjtc004 = false;
+ jjtn004.processToken(token);
+ } finally {
+ if (jjtc004) {
+ jjtree.closeNodeScope(jjtn004, true);
+ }
+ }
+ break;
+ case AxisAncestorOrSelf:
+ jj_consume_token(AxisAncestorOrSelf);
+ SimpleNode jjtn005 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAXISANCESTORORSELF);
+ boolean jjtc005 = true;
+ jjtree.openNodeScope(jjtn005);
+ try {
+ jjtree.closeNodeScope(jjtn005, true);
+ jjtc005 = false;
+ jjtn005.processToken(token);
+ } finally {
+ if (jjtc005) {
+ jjtree.closeNodeScope(jjtn005, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[49] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void NodeTest() throws ParseException {
+ /*@bgen(jjtree) NodeTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTNODETEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ KindTest();
+ break;
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case QName:
+ NameTest();
+ break;
+ default:
+ jj_la1[50] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void NameTest() throws ParseException {
+ /*@bgen(jjtree) NameTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTNAMETEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case QName:
+ jj_consume_token(QName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ Wildcard();
+ break;
+ default:
+ jj_la1[51] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void Wildcard() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Star:
+ jj_consume_token(Star);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSTAR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case NCNameColonStar:
+ jj_consume_token(NCNameColonStar);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTNCNAMECOLONSTAR);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ case StarColonNCName:
+ jj_consume_token(StarColonNCName);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSTARCOLONNCNAME);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[52] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void KindTest() throws ParseException {
+ /*@bgen(jjtree) KindTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTKINDTEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case ProcessingInstructionLpar:
+ ProcessingInstructionTest();
+ break;
+ case CommentLpar:
+ CommentTest();
+ break;
+ case TextLpar:
+ TextTest();
+ break;
+ case NodeLpar:
+ AnyKindTest();
+ break;
+ default:
+ jj_la1[53] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ProcessingInstructionTest() throws ParseException {
+ /*@bgen(jjtree) ProcessingInstructionTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPROCESSINGINSTRUCTIONTEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(ProcessingInstructionLpar);
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case StringLiteral:
+ jj_consume_token(StringLiteral);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSTRINGLITERAL);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[54] = jj_gen;
+ ;
+ }
+ jj_consume_token(Rpar);
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void CommentTest() throws ParseException {
+ /*@bgen(jjtree) CommentTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTCOMMENTTEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(CommentLpar);
+ jj_consume_token(Rpar);
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void TextTest() throws ParseException {
+ /*@bgen(jjtree) TextTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTTEXTTEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(TextLpar);
+ jj_consume_token(Rpar);
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void AnyKindTest() throws ParseException {
+ /*@bgen(jjtree) AnyKindTest */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTANYKINDTEST);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(NodeLpar);
+ jj_consume_token(Rpar);
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ForwardStep() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisDescendant:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisFollowingSibling:
+ case AxisFollowing:
+ case AxisNamespace:
+ ForwardAxis();
+ NodeTest();
+ break;
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case At:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case Dot:
+ case QName:
+ AbbreviatedForwardStep();
+ break;
+ default:
+ jj_la1[55] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void ReverseStep() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisParent:
+ case AxisAncestor:
+ case AxisPrecedingSibling:
+ case AxisPreceding:
+ case AxisAncestorOrSelf:
+ ReverseAxis();
+ NodeTest();
+ break;
+ case DotDot:
+ AbbreviatedReverseStep();
+ break;
+ default:
+ jj_la1[56] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void AbbreviatedForwardStep() throws ParseException {
+ /*@bgen(jjtree) AbbreviatedForwardStep */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTABBREVIATEDFORWARDSTEP);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Dot:
+ jj_consume_token(Dot);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTDOT);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case At:
+ jj_consume_token(At);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTAT);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ NameTest();
+ break;
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case QName:
+ NodeTest();
+ break;
+ default:
+ jj_la1[57] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void AbbreviatedReverseStep() throws ParseException {
+ jj_consume_token(DotDot);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTDOTDOT);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ }
+
+ final public void Predicates() throws ParseException {
+ /*@bgen(jjtree) Predicates */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPREDICATES);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ label_18:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Lbrack:
+ ;
+ break;
+ default:
+ jj_la1[58] = jj_gen;
+ break label_18;
+ }
+ jj_consume_token(Lbrack);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTLBRACK);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ Expr();
+ jj_consume_token(Rbrack);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTRBRACK);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void NumericLiteral() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case IntegerLiteral:
+ jj_consume_token(IntegerLiteral);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTINTEGERLITERAL);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case DecimalLiteral:
+ jj_consume_token(DecimalLiteral);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTDECIMALLITERAL);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ case DoubleLiteral:
+ jj_consume_token(DoubleLiteral);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTDOUBLELITERAL);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[59] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void Literal() throws ParseException {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ NumericLiteral();
+ break;
+ case StringLiteral:
+ jj_consume_token(StringLiteral);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSTRINGLITERAL);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[60] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+
+ final public void ParenthesizedExpr() throws ParseException {
+ jj_consume_token(Lpar);
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisDescendant:
+ case AxisParent:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisAncestor:
+ case AxisFollowingSibling:
+ case AxisPrecedingSibling:
+ case AxisFollowing:
+ case AxisPreceding:
+ case AxisNamespace:
+ case AxisAncestorOrSelf:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case Root:
+ case RootDescendants:
+ case Minus:
+ case Plus:
+ case Lpar:
+ case At:
+ case Some:
+ case Every:
+ case ForVariable:
+ case CastAs:
+ case TreatAs:
+ case Validate:
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case IfLpar:
+ case StringLiteral:
+ case Dot:
+ case DotDot:
+ case VariableIndicator:
+ case QName:
+ case QNameLpar:
+ ExprSequence();
+ break;
+ default:
+ jj_la1[61] = jj_gen;
+ ;
+ }
+ jj_consume_token(Rpar);
+ }
+
+ final public void FunctionCall() throws ParseException {
+ /*@bgen(jjtree) FunctionCall */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTFUNCTIONCALL);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(QNameLpar);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAMELPAR);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case AxisChild:
+ case AxisDescendant:
+ case AxisParent:
+ case AxisAttribute:
+ case AxisSelf:
+ case AxisDescendantOrSelf:
+ case AxisAncestor:
+ case AxisFollowingSibling:
+ case AxisPrecedingSibling:
+ case AxisFollowing:
+ case AxisPreceding:
+ case AxisNamespace:
+ case AxisAncestorOrSelf:
+ case Star:
+ case NCNameColonStar:
+ case StarColonNCName:
+ case Root:
+ case RootDescendants:
+ case Minus:
+ case Plus:
+ case Lpar:
+ case At:
+ case Some:
+ case Every:
+ case ForVariable:
+ case CastAs:
+ case TreatAs:
+ case Validate:
+ case IntegerLiteral:
+ case DecimalLiteral:
+ case DoubleLiteral:
+ case NodeLpar:
+ case CommentLpar:
+ case TextLpar:
+ case ProcessingInstructionLpar:
+ case IfLpar:
+ case StringLiteral:
+ case Dot:
+ case DotDot:
+ case VariableIndicator:
+ case QName:
+ case QNameLpar:
+ Expr();
+ label_19:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Comma:
+ ;
+ break;
+ default:
+ jj_la1[62] = jj_gen;
+ break label_19;
+ }
+ jj_consume_token(Comma);
+ Expr();
+ }
+ break;
+ default:
+ jj_la1[63] = jj_gen;
+ ;
+ }
+ jj_consume_token(Rpar);
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void SchemaContext() throws ParseException {
+ /*@bgen(jjtree) SchemaContext */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSCHEMACONTEXT);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(In);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTIN);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ SchemaGlobalContext();
+ label_20:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Slash:
+ ;
+ break;
+ default:
+ jj_la1[64] = jj_gen;
+ break label_20;
+ }
+ jj_consume_token(Slash);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSLASH);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ SchemaContextStep();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void SchemaGlobalContext() throws ParseException {
+ /*@bgen(jjtree) SchemaGlobalContext */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSCHEMAGLOBALCONTEXT);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case QName:
+ jj_consume_token(QName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case Type:
+ jj_consume_token(Type);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTTYPE);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ jj_consume_token(QName);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[65] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void SchemaContextStep() throws ParseException {
+ /*@bgen(jjtree) SchemaContextStep */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSCHEMACONTEXTSTEP);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(QName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void SequenceType() throws ParseException {
+ /*@bgen(jjtree) SequenceType */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSEQUENCETYPE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Item:
+ case ElementType:
+ case AttributeType:
+ case AtomicValue:
+ case Node:
+ case Comment:
+ case Document:
+ case Text:
+ case Untyped:
+ case ProcessingInstruction:
+ case QName:
+ ItemType();
+ OccurrenceIndicator();
+ break;
+ case Empty:
+ jj_consume_token(Empty);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTEMPTY);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[66] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ItemType() throws ParseException {
+ /*@bgen(jjtree) ItemType */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTITEMTYPE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case ElementType:
+ case AttributeType:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case ElementType:
+ jj_consume_token(ElementType);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTELEMENTTYPE);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case AttributeType:
+ jj_consume_token(AttributeType);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTATTRIBUTETYPE);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[67] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case OfType:
+ case QName:
+ ElemOrAttrType();
+ break;
+ default:
+ jj_la1[68] = jj_gen;
+ ;
+ }
+ break;
+ case Node:
+ jj_consume_token(Node);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTNODE);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ case ProcessingInstruction:
+ jj_consume_token(ProcessingInstruction);
+ SimpleNode jjtn004 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPROCESSINGINSTRUCTION);
+ boolean jjtc004 = true;
+ jjtree.openNodeScope(jjtn004);
+ try {
+ jjtree.closeNodeScope(jjtn004, true);
+ jjtc004 = false;
+ jjtn004.processToken(token);
+ } finally {
+ if (jjtc004) {
+ jjtree.closeNodeScope(jjtn004, true);
+ }
+ }
+ break;
+ case Comment:
+ jj_consume_token(Comment);
+ SimpleNode jjtn005 = (SimpleNode)SimpleNode.jjtCreate(this, JJTCOMMENT);
+ boolean jjtc005 = true;
+ jjtree.openNodeScope(jjtn005);
+ try {
+ jjtree.closeNodeScope(jjtn005, true);
+ jjtc005 = false;
+ jjtn005.processToken(token);
+ } finally {
+ if (jjtc005) {
+ jjtree.closeNodeScope(jjtn005, true);
+ }
+ }
+ break;
+ case Text:
+ jj_consume_token(Text);
+ SimpleNode jjtn006 = (SimpleNode)SimpleNode.jjtCreate(this, JJTTEXT);
+ boolean jjtc006 = true;
+ jjtree.openNodeScope(jjtn006);
+ try {
+ jjtree.closeNodeScope(jjtn006, true);
+ jjtc006 = false;
+ jjtn006.processToken(token);
+ } finally {
+ if (jjtc006) {
+ jjtree.closeNodeScope(jjtn006, true);
+ }
+ }
+ break;
+ case Document:
+ jj_consume_token(Document);
+ SimpleNode jjtn007 = (SimpleNode)SimpleNode.jjtCreate(this, JJTDOCUMENT);
+ boolean jjtc007 = true;
+ jjtree.openNodeScope(jjtn007);
+ try {
+ jjtree.closeNodeScope(jjtn007, true);
+ jjtc007 = false;
+ jjtn007.processToken(token);
+ } finally {
+ if (jjtc007) {
+ jjtree.closeNodeScope(jjtn007, true);
+ }
+ }
+ break;
+ case Item:
+ jj_consume_token(Item);
+ SimpleNode jjtn008 = (SimpleNode)SimpleNode.jjtCreate(this, JJTITEM);
+ boolean jjtc008 = true;
+ jjtree.openNodeScope(jjtn008);
+ try {
+ jjtree.closeNodeScope(jjtn008, true);
+ jjtc008 = false;
+ jjtn008.processToken(token);
+ } finally {
+ if (jjtc008) {
+ jjtree.closeNodeScope(jjtn008, true);
+ }
+ }
+ break;
+ case QName:
+ AtomicType();
+ break;
+ case Untyped:
+ jj_consume_token(Untyped);
+ SimpleNode jjtn009 = (SimpleNode)SimpleNode.jjtCreate(this, JJTUNTYPED);
+ boolean jjtc009 = true;
+ jjtree.openNodeScope(jjtn009);
+ try {
+ jjtree.closeNodeScope(jjtn009, true);
+ jjtc009 = false;
+ jjtn009.processToken(token);
+ } finally {
+ if (jjtc009) {
+ jjtree.closeNodeScope(jjtn009, true);
+ }
+ }
+ break;
+ case AtomicValue:
+ jj_consume_token(AtomicValue);
+ SimpleNode jjtn010 = (SimpleNode)SimpleNode.jjtCreate(this, JJTATOMICVALUE);
+ boolean jjtc010 = true;
+ jjtree.openNodeScope(jjtn010);
+ try {
+ jjtree.closeNodeScope(jjtn010, true);
+ jjtc010 = false;
+ jjtn010.processToken(token);
+ } finally {
+ if (jjtc010) {
+ jjtree.closeNodeScope(jjtn010, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[69] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void ElemOrAttrType() throws ParseException {
+ /*@bgen(jjtree) ElemOrAttrType */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTELEMORATTRTYPE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case QName:
+ jj_consume_token(QName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case OfType:
+ SchemaType();
+ break;
+ default:
+ jj_la1[71] = jj_gen;
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case In:
+ SchemaContext();
+ break;
+ default:
+ jj_la1[70] = jj_gen;
+ ;
+ }
+ }
+ break;
+ case OfType:
+ SchemaType();
+ break;
+ default:
+ jj_la1[72] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ } catch (Throwable jjte000) {
+ if (jjtc000) {
+ jjtree.clearNodeScope(jjtn000);
+ jjtc000 = false;
+ } else {
+ jjtree.popNode();
+ }
+ if (jjte000 instanceof RuntimeException) {
+ {if (true) throw (RuntimeException)jjte000;}
+ }
+ if (jjte000 instanceof ParseException) {
+ {if (true) throw (ParseException)jjte000;}
+ }
+ {if (true) throw (Error)jjte000;}
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void SchemaType() throws ParseException {
+ /*@bgen(jjtree) SchemaType */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTSCHEMATYPE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(OfType);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTOFTYPE);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ jj_consume_token(QName);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void AtomicType() throws ParseException {
+ /*@bgen(jjtree) AtomicType */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTATOMICTYPE);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ jj_consume_token(QName);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQNAME);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ final public void OccurrenceIndicator() throws ParseException {
+ /*@bgen(jjtree) OccurrenceIndicator */
+ SimpleNode jjtn000 = (SimpleNode)SimpleNode.jjtCreate(this, JJTOCCURRENCEINDICATOR);
+ boolean jjtc000 = true;
+ jjtree.openNodeScope(jjtn000);
+ try {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Multiply:
+ case Plus:
+ case QMark:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case Multiply:
+ jj_consume_token(Multiply);
+ SimpleNode jjtn001 = (SimpleNode)SimpleNode.jjtCreate(this, JJTMULTIPLY);
+ boolean jjtc001 = true;
+ jjtree.openNodeScope(jjtn001);
+ try {
+ jjtree.closeNodeScope(jjtn001, true);
+ jjtc001 = false;
+ jjtn001.processToken(token);
+ } finally {
+ if (jjtc001) {
+ jjtree.closeNodeScope(jjtn001, true);
+ }
+ }
+ break;
+ case Plus:
+ jj_consume_token(Plus);
+ SimpleNode jjtn002 = (SimpleNode)SimpleNode.jjtCreate(this, JJTPLUS);
+ boolean jjtc002 = true;
+ jjtree.openNodeScope(jjtn002);
+ try {
+ jjtree.closeNodeScope(jjtn002, true);
+ jjtc002 = false;
+ jjtn002.processToken(token);
+ } finally {
+ if (jjtc002) {
+ jjtree.closeNodeScope(jjtn002, true);
+ }
+ }
+ break;
+ case QMark:
+ jj_consume_token(QMark);
+ SimpleNode jjtn003 = (SimpleNode)SimpleNode.jjtCreate(this, JJTQMARK);
+ boolean jjtc003 = true;
+ jjtree.openNodeScope(jjtn003);
+ try {
+ jjtree.closeNodeScope(jjtn003, true);
+ jjtc003 = false;
+ jjtn003.processToken(token);
+ } finally {
+ if (jjtc003) {
+ jjtree.closeNodeScope(jjtn003, true);
+ }
+ }
+ break;
+ default:
+ jj_la1[73] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ break;
+ default:
+ jj_la1[74] = jj_gen;
+ ;
+ }
+ } finally {
+ if (jjtc000) {
+ jjtree.closeNodeScope(jjtn000, true);
+ }
+ }
+ }
+
+ public XPathTokenManager token_source;
+ ASCII_CharStream jj_input_stream;
+ public Token token, jj_nt;
+ private int jj_ntk;
+ private int jj_gen;
+ final private int[] jj_la1 = new int[75];
+ final private int[] jj_la1_0 = {0x0,0x80000000,0x80000000,0x120,0x0,0x0,0x120,0x0,0x0,0x120,0x120,0x0,0x0,0x40000,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0xf00000,0xf00000,0x80000000,0x80000000,0x40000000,0x40000000,0x0,0x0,0x3ffe0,0x3ffe0,0x3ffe0,0x0,0x0,0x3ffe0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x15760,0x2a880,0x0,0x0,0x0,0x0,0x0,0x15760,0x2a880,0x0,0x0,0x0,0x0,0x3ffe0,0x0,0x3ffe0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x800000,0x800000,};
+ final private int[] jj_la1_1 = {0x0,0x0,0x0,0x700000,0x6000000,0x6000000,0x1f00000,0x6000000,0x6000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0xf8000006,0xf8000006,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x1f00000,0x700000,0x1f00000,0x6000000,0x6000000,0x700000,0x0,0x0,0x0,0xa8000000,0x0,0x50000000,0x6,0x0,0x0,0x0,0x700000,0x700000,0x700000,0x0,0x0,0x700000,0x0,0x700000,0x0,0x0,0x0,0x1f00000,0x0,0x1f00000,0x2000000,0x8000,0x34070,0x60,0x2000,0x14070,0x0,0x2000,0x2000,0x0,0x0,};
+ final private int[] jj_la1_2 = {0x0,0x4000,0x4000,0x10000,0x0,0x0,0x10000,0x0,0x0,0x10000,0x10000,0x0,0x38000000,0x0,0x0,0x400000,0x300000,0x300000,0x0,0x0,0x0,0x7ff,0x7ff,0x0,0x1800,0x1800,0x0,0x0,0x4000,0x4000,0x0,0x0,0x1800,0x1800,0x3b818000,0x38018000,0x38018000,0x0,0x0,0x38018000,0x0,0x0,0x1800000,0x602,0x1f8,0x0,0x5,0x38008000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x0,0x10000,0x20000,0x38000000,0x38000000,0x3bf19800,0x0,0x3bf19800,0x0,0x0,0xc0000000,0x0,0x0,0xc0000000,0x0,0x0,0x0,0x3000,0x3000,};
+ final private int[] jj_la1_3 = {0x200,0x0,0x0,0x800f0,0x0,0x0,0x4800f0,0x0,0x0,0x0,0x0,0x200,0x20400,0x0,0x0,0x0,0x0,0x0,0x200,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4a34f0,0x4a34f0,0x4a34f0,0x0,0x0,0x4a34f0,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x420400,0x0,0x0,0x800f0,0x80000,0x0,0xf0,0x400,0x810f0,0x2000,0x810f0,0x0,0x0,0x400,0x4a35f0,0x200,0x4a35f0,0x0,0x80000,0x8000e,0x0,0x80000,0x8000e,0x0,0x0,0x80000,0x0,0x0,};
+ final private int[] jj_la1_4 = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+
+ public XPath(java.io.InputStream stream) {
+ jj_input_stream = new ASCII_CharStream(stream, 1, 1);
+ token_source = new XPathTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 75; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(java.io.InputStream stream) {
+ jj_input_stream.ReInit(stream, 1, 1);
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jjtree.reset();
+ jj_gen = 0;
+ for (int i = 0; i < 75; i++) jj_la1[i] = -1;
+ }
+
+ public XPath(java.io.Reader stream) {
+ jj_input_stream = new ASCII_CharStream(stream, 1, 1);
+ token_source = new XPathTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 75; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(java.io.Reader stream) {
+ jj_input_stream.ReInit(stream, 1, 1);
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jjtree.reset();
+ jj_gen = 0;
+ for (int i = 0; i < 75; i++) jj_la1[i] = -1;
+ }
+
+ public XPath(XPathTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 75; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(XPathTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jjtree.reset();
+ jj_gen = 0;
+ for (int i = 0; i < 75; i++) jj_la1[i] = -1;
+ }
+
+ final private Token jj_consume_token(int kind) throws ParseException {
+ Token oldToken;
+ if ((oldToken = token).next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
+ jj_ntk = -1;
+ if (token.kind == kind) {
+ jj_gen++;
+ return token;
+ }
+ token = oldToken;
+ jj_kind = kind;
+ throw generateParseException();
+ }
+
+ final public Token getNextToken() {
+ if (token.next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
+ jj_ntk = -1;
+ jj_gen++;
+ return token;
+ }
+
+ final public Token getToken(int index) {
+ Token t = token;
+ for (int i = 0; i < index; i++) {
+ if (t.next != null) t = t.next;
+ else t = t.next = token_source.getNextToken();
+ }
+ return t;
+ }
+
+ final private int jj_ntk() {
+ if ((jj_nt=token.next) == null)
+ return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+ else
+ return (jj_ntk = jj_nt.kind);
+ }
+
+ private java.util.Vector jj_expentries = new java.util.Vector();
+ private int[] jj_expentry;
+ private int jj_kind = -1;
+
+ final public ParseException generateParseException() {
+ jj_expentries.removeAllElements();
+ boolean[] la1tokens = new boolean[129];
+ for (int i = 0; i < 129; i++) {
+ la1tokens[i] = false;
+ }
+ if (jj_kind >= 0) {
+ la1tokens[jj_kind] = true;
+ jj_kind = -1;
+ }
+ for (int i = 0; i < 75; i++) {
+ if (jj_la1[i] == jj_gen) {
+ for (int j = 0; j < 32; j++) {
+ if ((jj_la1_0[i] & (1<<j)) != 0) {
+ la1tokens[j] = true;
+ }
+ if ((jj_la1_1[i] & (1<<j)) != 0) {
+ la1tokens[32+j] = true;
+ }
+ if ((jj_la1_2[i] & (1<<j)) != 0) {
+ la1tokens[64+j] = true;
+ }
+ if ((jj_la1_3[i] & (1<<j)) != 0) {
+ la1tokens[96+j] = true;
+ }
+ if ((jj_la1_4[i] & (1<<j)) != 0) {
+ la1tokens[128+j] = true;
+ }
+ }
+ }
+ }
+ for (int i = 0; i < 129; i++) {
+ if (la1tokens[i]) {
+ jj_expentry = new int[1];
+ jj_expentry[0] = i;
+ jj_expentries.addElement(jj_expentry);
+ }
+ }
+ int[][] exptokseq = new int[jj_expentries.size()][];
+ for (int i = 0; i < jj_expentries.size(); i++) {
+ exptokseq[i] = (int[])jj_expentries.elementAt(i);
+ }
+ return new ParseException(token, exptokseq, tokenImage);
+ }
+
+ final public void enable_tracing() {
+ }
+
+ final public void disable_tracing() {
+ }
+
+ }
diff --git a/src/org/apache/xpath/parser/XPathConstants.java b/src/org/apache/xpath/parser/XPathConstants.java
new file mode 100644
index 0000000..7d2f6df
--- /dev/null
+++ b/src/org/apache/xpath/parser/XPathConstants.java
@@ -0,0 +1,286 @@
+/* Generated By:JJTree&JavaCC: Do not edit this line. XPathConstants.java */
+package org.apache.xpath.parser;
+
+public interface XPathConstants {
+
+ int EOF = 0;
+ int ExprComment = 1;
+ int skip_ = 3;
+ int S = 4;
+ int AxisChild = 5;
+ int AxisDescendant = 6;
+ int AxisParent = 7;
+ int AxisAttribute = 8;
+ int AxisSelf = 9;
+ int AxisDescendantOrSelf = 10;
+ int AxisAncestor = 11;
+ int AxisFollowingSibling = 12;
+ int AxisPrecedingSibling = 13;
+ int AxisFollowing = 14;
+ int AxisPreceding = 15;
+ int AxisNamespace = 16;
+ int AxisAncestorOrSelf = 17;
+ int Or = 18;
+ int And = 19;
+ int Div = 20;
+ int Idiv = 21;
+ int Mod = 22;
+ int Multiply = 23;
+ int In = 24;
+ int Satisfies = 25;
+ int Return = 26;
+ int Then = 27;
+ int Else = 28;
+ int To = 29;
+ int Intersect = 30;
+ int Union = 31;
+ int Except = 32;
+ int Precedes = 33;
+ int Follows = 34;
+ int Instanceof = 35;
+ int Item = 36;
+ int ElementType = 37;
+ int AttributeType = 38;
+ int ElementQNameLbrace = 39;
+ int AttributeQNameLbrace = 40;
+ int ElementLbrace = 41;
+ int AttributeLbrace = 42;
+ int DefaultElement = 43;
+ int DefaultFunction = 44;
+ int OfType = 45;
+ int AtomicValue = 46;
+ int Type = 47;
+ int Node = 48;
+ int Empty = 49;
+ int Nmstart = 50;
+ int Nmchar = 51;
+ int Star = 52;
+ int NCNameColonStar = 53;
+ int StarColonNCName = 54;
+ int Root = 55;
+ int RootDescendants = 56;
+ int Slash = 57;
+ int SlashSlash = 58;
+ int Equals = 59;
+ int Is = 60;
+ int NotEquals = 61;
+ int IsNot = 62;
+ int LtEquals = 63;
+ int LtLt = 64;
+ int GtEquals = 65;
+ int GtGt = 66;
+ int FortranEq = 67;
+ int FortranNe = 68;
+ int FortranGt = 69;
+ int FortranGe = 70;
+ int FortranLt = 71;
+ int FortranLe = 72;
+ int Lt = 73;
+ int Gt = 74;
+ int Minus = 75;
+ int Plus = 76;
+ int QMark = 77;
+ int Vbar = 78;
+ int Lpar = 79;
+ int At = 80;
+ int Lbrack = 81;
+ int Rbrack = 82;
+ int Rpar = 83;
+ int Some = 84;
+ int Every = 85;
+ int ForVariable = 86;
+ int CastAs = 87;
+ int TreatAs = 88;
+ int Validate = 89;
+ int Digits = 90;
+ int IntegerLiteral = 91;
+ int DecimalLiteral = 92;
+ int DoubleLiteral = 93;
+ int Comment = 94;
+ int Document = 95;
+ int DocumentLbrace = 96;
+ int Text = 97;
+ int Untyped = 98;
+ int ProcessingInstruction = 99;
+ int NodeLpar = 100;
+ int CommentLpar = 101;
+ int TextLpar = 102;
+ int ProcessingInstructionLpar = 103;
+ int IfLpar = 104;
+ int Comma = 105;
+ int StringLiteral = 106;
+ int NamespaceURLLiteral = 107;
+ int Dot = 108;
+ int DotDot = 109;
+ int NCName = 110;
+ int Prefix = 111;
+ int LocalPart = 112;
+ int VariableIndicator = 113;
+ int VarName = 114;
+ int QName = 115;
+ int FuncName = 116;
+ int FuncPListOpen = 117;
+ int QNameLpar = 118;
+ int Lbrace = 119;
+ int Rbrace = 120;
+ int Char = 121;
+ int WhitespaceChar = 122;
+ int Letter = 123;
+ int BaseChar = 124;
+ int Ideographic = 125;
+ int CombiningChar = 126;
+ int Digit = 127;
+ int Extender = 128;
+
+ int DEFAULT = 0;
+ int ELEMENT_CONTENT = 1;
+ int OPERATOR = 2;
+ int QNAME = 3;
+ int NAMESPACEDECL = 4;
+ int XMLSPACE_DECL = 5;
+ int ITEMTYPE = 6;
+ int FUNCDEF = 7;
+ int NAMESPACEKEYWORD = 8;
+ int START_TAG = 9;
+ int END_TAG = 10;
+ int VARNAME = 11;
+ int QUOT_ATTRIBUTE_CONTENT = 12;
+ int APOS_ATTRIBUTE_CONTENT = 13;
+ int CDATA_SECTION = 14;
+ int PROCESSING_INSTRUCTION = 15;
+ int XML_COMMENT = 16;
+ int XQUERY_COMMENT = 17;
+
+ String[] tokenImage = {
+ "<EOF>",
+ "<ExprComment>",
+ "<token of kind 2>",
+ "<skip_>",
+ "<S>",
+ "<AxisChild>",
+ "<AxisDescendant>",
+ "<AxisParent>",
+ "<AxisAttribute>",
+ "<AxisSelf>",
+ "<AxisDescendantOrSelf>",
+ "<AxisAncestor>",
+ "<AxisFollowingSibling>",
+ "<AxisPrecedingSibling>",
+ "<AxisFollowing>",
+ "<AxisPreceding>",
+ "<AxisNamespace>",
+ "<AxisAncestorOrSelf>",
+ "\"or\"",
+ "\"and\"",
+ "\"div\"",
+ "\"idiv\"",
+ "\"mod\"",
+ "\"*\"",
+ "\"in\"",
+ "\"satisfies\"",
+ "\"return\"",
+ "\"then\"",
+ "\"else\"",
+ "\"to\"",
+ "\"intersect\"",
+ "\"union\"",
+ "\"except\"",
+ "\"precedes\"",
+ "\"follows\"",
+ "<Instanceof>",
+ "\"item\"",
+ "\"element\"",
+ "\"attribute\"",
+ "<ElementQNameLbrace>",
+ "<AttributeQNameLbrace>",
+ "<ElementLbrace>",
+ "<AttributeLbrace>",
+ "<DefaultElement>",
+ "<DefaultFunction>",
+ "<OfType>",
+ "<AtomicValue>",
+ "\"type\"",
+ "\"node\"",
+ "\"empty\"",
+ "<Nmstart>",
+ "<Nmchar>",
+ "\"*\"",
+ "<NCNameColonStar>",
+ "<StarColonNCName>",
+ "\"/\"",
+ "\"//\"",
+ "\"/\"",
+ "\"//\"",
+ "\"=\"",
+ "\"is\"",
+ "\"!=\"",
+ "\"isnot\"",
+ "\"<=\"",
+ "\"<<\"",
+ "\">=\"",
+ "\">>\"",
+ "\"eq\"",
+ "\"ne\"",
+ "\"gt\"",
+ "\"ge\"",
+ "\"lt\"",
+ "\"le\"",
+ "\"<\"",
+ "\">\"",
+ "\"-\"",
+ "\"+\"",
+ "\"?\"",
+ "\"|\"",
+ "\"(\"",
+ "\"@\"",
+ "\"[\"",
+ "\"]\"",
+ "\")\"",
+ "<Some>",
+ "<Every>",
+ "<ForVariable>",
+ "<CastAs>",
+ "<TreatAs>",
+ "\"validate\"",
+ "<Digits>",
+ "<IntegerLiteral>",
+ "<DecimalLiteral>",
+ "<DoubleLiteral>",
+ "\"comment\"",
+ "\"document\"",
+ "<DocumentLbrace>",
+ "\"text\"",
+ "\"untyped\"",
+ "\"processing-instruction\"",
+ "<NodeLpar>",
+ "<CommentLpar>",
+ "<TextLpar>",
+ "<ProcessingInstructionLpar>",
+ "<IfLpar>",
+ "\",\"",
+ "<StringLiteral>",
+ "<NamespaceURLLiteral>",
+ "\".\"",
+ "\"..\"",
+ "<NCName>",
+ "<Prefix>",
+ "<LocalPart>",
+ "\"$\"",
+ "<VarName>",
+ "<QName>",
+ "<FuncName>",
+ "\"(\"",
+ "<QNameLpar>",
+ "\"{\"",
+ "\"}\"",
+ "<Char>",
+ "<WhitespaceChar>",
+ "<Letter>",
+ "<BaseChar>",
+ "<Ideographic>",
+ "<CombiningChar>",
+ "<Digit>",
+ "<Extender>",
+ };
+
+}
diff --git a/src/org/apache/xpath/parser/XPathTokenManager.java b/src/org/apache/xpath/parser/XPathTokenManager.java
new file mode 100644
index 0000000..98b550c
--- /dev/null
+++ b/src/org/apache/xpath/parser/XPathTokenManager.java
@@ -0,0 +1,7912 @@
+/* Generated By:JJTree&JavaCC: Do not edit this line. XPathTokenManager.java */
+package org.apache.xpath.parser;
+
+import java.util.Stack;
+
+
+public class XPathTokenManager implements XPathConstants
+{
+ private java.util.Vector stateStack = new java.util.Vector();
+ private void pushState() {
+ stateStack.addElement(new Integer(curLexState));
+ }
+ private void pushState(int state) {
+ stateStack.addElement(new Integer(state));
+ }
+ private void popState() {
+ if(stateStack.size() == 0)
+ {
+ printLinePos();
+ }
+
+ int nextState = ((Integer)stateStack.lastElement()).intValue();
+
+ stateStack.setSize(stateStack.size() - 1);
+ SwitchTo(nextState);
+ }
+
+ public void printLinePos()
+ {
+ System.err.println("Line: "+input_stream.getEndLine());
+ }
+
+private final int jjMoveStringLiteralDfa0_15()
+{
+ return jjMoveNfa_15(0, 0);
+}
+private final void jjCheckNAdd(int state)
+{
+ if (jjrounds[state] != jjround)
+ {
+ jjstateSet[jjnewStateCnt++] = state;
+ jjrounds[state] = jjround;
+ }
+}
+private final void jjAddStates(int start, int end)
+{
+ do {
+ jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+ } while (start++ != end);
+}
+private final void jjCheckNAddTwoStates(int state1, int state2)
+{
+ jjCheckNAdd(state1);
+ jjCheckNAdd(state2);
+}
+private final void jjCheckNAddStates(int start, int end)
+{
+ do {
+ jjCheckNAdd(jjnextStates[start]);
+ } while (start++ != end);
+}
+private final void jjCheckNAddStates(int start)
+{
+ jjCheckNAdd(jjnextStates[start]);
+ jjCheckNAdd(jjnextStates[start + 1]);
+}
+static final long[] jjbitVec0 = {
+ 0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x7fffffffffffffffL
+};
+static final long[] jjbitVec2 = {
+ 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec3 = {
+ 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffffffffL
+};
+private final int jjMoveNfa_15(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xffffffff00002600L & l) != 0L)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_10(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_10(int pos, long active0, long active1)
+{
+ return jjMoveNfa_10(jjStopStringLiteralDfa_10(pos, active0, active1), pos + 1);
+}
+private final int jjStopAtPos(int pos, int kind)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ return pos + 1;
+}
+private final int jjStartNfaWithStates_10(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_10(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_10()
+{
+ switch(curChar)
+ {
+ case 123:
+ return jjStopAtPos(0, 119);
+ default :
+ return jjMoveNfa_10(0, 0);
+ }
+}
+private final int jjMoveNfa_10(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x100002600L & l) == 0L)
+ break;
+ kind = 4;
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_16()
+{
+ return jjMoveNfa_16(0, 0);
+}
+private final int jjMoveNfa_16(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xffffffff00002600L & l) != 0L)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_3(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ case 0:
+ if ((active0 & 0x10000000000000L) != 0L)
+ return 8;
+ return -1;
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_3(int pos, long active0, long active1)
+{
+ return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_3(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_3(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_3()
+{
+ switch(curChar)
+ {
+ case 36:
+ return jjStopAtPos(0, 113);
+ case 40:
+ return jjStopAtPos(0, 79);
+ case 41:
+ return jjStopAtPos(0, 83);
+ case 42:
+ return jjStartNfaWithStates_3(0, 52, 8);
+ case 46:
+ jjmatchedKind = 108;
+ return jjMoveStringLiteralDfa1_3(0x0L, 0x200000000000L);
+ case 47:
+ jjmatchedKind = 55;
+ return jjMoveStringLiteralDfa1_3(0x100000000000000L, 0x0L);
+ case 64:
+ return jjStopAtPos(0, 80);
+ default :
+ return jjMoveNfa_3(6, 0);
+ }
+}
+private final int jjMoveStringLiteralDfa1_3(long active0, long active1)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_3(0, active0, active1);
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 46:
+ if ((active1 & 0x200000000000L) != 0L)
+ return jjStopAtPos(1, 109);
+ break;
+ case 47:
+ if ((active0 & 0x100000000000000L) != 0L)
+ return jjStopAtPos(1, 56);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_3(0, active0, active1);
+}
+static final long[] jjbitVec4 = {
+ 0x0L, 0xffffffffffffc000L, 0xfffff0007fffffffL, 0x7fffffL
+};
+static final long[] jjbitVec5 = {
+ 0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL
+};
+static final long[] jjbitVec6 = {
+ 0x7ff3ffffffffffffL, 0x7ffffffffffffdfeL, 0xffffffffffffffffL, 0xfc31ffffffffe00fL
+};
+static final long[] jjbitVec7 = {
+ 0xffffffL, 0xffffffffffff0000L, 0xf80001ffffffffffL, 0x3L
+};
+static final long[] jjbitVec8 = {
+ 0x0L, 0x0L, 0xfffffffbffffd740L, 0xffffd547f7fffL
+};
+static final long[] jjbitVec9 = {
+ 0xffffffffffffdffeL, 0xffffffffdffeffffL, 0xffffffffffff0003L, 0x33fcfffffff199fL
+};
+static final long[] jjbitVec10 = {
+ 0xfffe000000000000L, 0xfffffffe027fffffL, 0x7fL, 0x707ffffff0000L
+};
+static final long[] jjbitVec11 = {
+ 0x7fffffe00000000L, 0xfffe0000000007feL, 0x7cffffffffffffffL, 0x60002f7fffL
+};
+static final long[] jjbitVec12 = {
+ 0x23ffffffffffffe0L, 0x3ff000000L, 0x3c5fdfffff99fe0L, 0x30003b0000000L
+};
+static final long[] jjbitVec13 = {
+ 0x36dfdfffff987e0L, 0x1c00005e000000L, 0x23edfdfffffbafe0L, 0x100000000L
+};
+static final long[] jjbitVec14 = {
+ 0x23cdfdfffff99fe0L, 0x3b0000000L, 0x3bfc718d63dc7e0L, 0x0L
+};
+static final long[] jjbitVec15 = {
+ 0x3effdfffffddfe0L, 0x300000000L, 0x3effdfffffddfe0L, 0x340000000L
+};
+static final long[] jjbitVec16 = {
+ 0x3fffdfffffddfe0L, 0x300000000L, 0x0L, 0x0L
+};
+static final long[] jjbitVec17 = {
+ 0xd7ffffffffffeL, 0x3fL, 0x200d6caefef02596L, 0x1fL
+};
+static final long[] jjbitVec18 = {
+ 0x0L, 0x3fffffffeffL, 0x0L, 0x0L
+};
+static final long[] jjbitVec19 = {
+ 0x0L, 0x0L, 0xffffffff00000000L, 0x7fffffffff003fL
+};
+static final long[] jjbitVec20 = {
+ 0x500000000007daedL, 0x2c62ab82315001L, 0xf580c90040000000L, 0x201080000000007L
+};
+static final long[] jjbitVec21 = {
+ 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffff0fffffffL, 0x3ffffffffffffffL
+};
+static final long[] jjbitVec22 = {
+ 0xffffffff3f3fffffL, 0x3fffffffaaff3f3fL, 0x5fdfffffffffffffL, 0x1fdc1fff0fcf1fdcL
+};
+static final long[] jjbitVec23 = {
+ 0x4c4000000000L, 0x0L, 0x7L, 0x0L
+};
+static final long[] jjbitVec24 = {
+ 0x3fe00000080L, 0xfffffffffffffffeL, 0xfffffffe001fffffL, 0x7ffffffffffffffL
+};
+static final long[] jjbitVec25 = {
+ 0x1fffffffffe0L, 0x0L, 0x0L, 0x0L
+};
+static final long[] jjbitVec26 = {
+ 0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffL, 0x0L
+};
+static final long[] jjbitVec27 = {
+ 0xffffffffffffffffL, 0xffffffffffffffffL, 0xfffffffffL, 0x0L
+};
+static final long[] jjbitVec28 = {
+ 0x0L, 0x0L, 0x80000000000000L, 0xff7fffffff7fffffL
+};
+static final long[] jjbitVec29 = {
+ 0xffffffL, 0xffffffffffff0000L, 0xf80001ffffffffffL, 0x30003L
+};
+static final long[] jjbitVec30 = {
+ 0xffffffffffffffffL, 0x30000003fL, 0xfffffffbffffd7c0L, 0xffffd547f7fffL
+};
+static final long[] jjbitVec31 = {
+ 0xffffffffffffdffeL, 0xffffffffdffeffffL, 0xffffffffffff007bL, 0x33fcfffffff199fL
+};
+static final long[] jjbitVec32 = {
+ 0xfffe000000000000L, 0xfffffffe027fffffL, 0xbbfffffbfffe007fL, 0x707ffffff0016L
+};
+static final long[] jjbitVec33 = {
+ 0x7fffffe00000000L, 0xffff03ff0007ffffL, 0x7cffffffffffffffL, 0x3ff3dffffef7fffL
+};
+static final long[] jjbitVec34 = {
+ 0xf3ffffffffffffeeL, 0xffcfff1e3fffL, 0xd3c5fdfffff99feeL, 0x3ffcfb080399fL
+};
+static final long[] jjbitVec35 = {
+ 0xd36dfdfffff987e4L, 0x1fffc05e003987L, 0xf3edfdfffffbafeeL, 0xffc100003bbfL
+};
+static final long[] jjbitVec36 = {
+ 0xf3cdfdfffff99feeL, 0xffc3b0c0398fL, 0xc3bfc718d63dc7ecL, 0xff8000803dc7L
+};
+static final long[] jjbitVec37 = {
+ 0xc3effdfffffddfeeL, 0xffc300603ddfL, 0xc3effdfffffddfecL, 0xffc340603ddfL
+};
+static final long[] jjbitVec38 = {
+ 0xc3fffdfffffddfecL, 0xffc300803dcfL, 0x0L, 0x0L
+};
+static final long[] jjbitVec39 = {
+ 0x7ff7ffffffffffeL, 0x3ff7fffL, 0x3bff6caefef02596L, 0x3ff3f5fL
+};
+static final long[] jjbitVec40 = {
+ 0xc2a003ff03000000L, 0xfffe03fffffffeffL, 0x2fe3ffffebf0fdfL, 0x0L
+};
+static final long[] jjbitVec41 = {
+ 0x0L, 0x0L, 0x0L, 0x21fff0000L
+};
+static final long[] jjbitVec42 = {
+ 0x3efffe000000a0L, 0xfffffffffffffffeL, 0xfffffffe661fffffL, 0x77ffffffffffffffL
+};
+private final int jjMoveNfa_3(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 227;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((0x100002600L & l) != 0L)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(18, 19);
+ }
+ else if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 8;
+ break;
+ case 1:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(0, 1);
+ break;
+ case 2:
+ if (curChar == 58 && kind > 9)
+ kind = 9;
+ break;
+ case 3:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 7:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 8;
+ break;
+ case 8:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 9;
+ break;
+ case 10:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjstateSet[jjnewStateCnt++] = 10;
+ break;
+ case 12:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(2, 3);
+ break;
+ case 13:
+ if (curChar == 40 && kind > 102)
+ kind = 102;
+ break;
+ case 17:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(18, 19);
+ break;
+ case 18:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(18);
+ break;
+ case 19:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(19);
+ break;
+ case 22:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(4, 5);
+ break;
+ case 23:
+ if (curChar == 58 && kind > 5)
+ kind = 5;
+ break;
+ case 24:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 23;
+ break;
+ case 29:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(6, 7);
+ break;
+ case 30:
+ if (curChar == 40 && kind > 101)
+ kind = 101;
+ break;
+ case 38:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(8, 9);
+ break;
+ case 39:
+ if (curChar == 58 && kind > 6)
+ kind = 6;
+ break;
+ case 40:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 39;
+ break;
+ case 50:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(10, 11);
+ break;
+ case 51:
+ if (curChar == 58 && kind > 10)
+ kind = 10;
+ break;
+ case 52:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 51;
+ break;
+ case 56:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 55;
+ break;
+ case 59:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 58;
+ break;
+ case 71:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(12, 13);
+ break;
+ case 72:
+ if (curChar == 58 && kind > 7)
+ kind = 7;
+ break;
+ case 73:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 72;
+ break;
+ case 79:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(14, 15);
+ break;
+ case 80:
+ if (curChar == 58 && kind > 13)
+ kind = 13;
+ break;
+ case 81:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 80;
+ break;
+ case 88:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 87;
+ break;
+ case 98:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(16, 17);
+ break;
+ case 99:
+ if (curChar == 58 && kind > 15)
+ kind = 15;
+ break;
+ case 100:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 99;
+ break;
+ case 109:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(18, 19);
+ break;
+ case 110:
+ if (curChar == 40 && kind > 103)
+ kind = 103;
+ break;
+ case 121:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 120;
+ break;
+ case 133:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(20, 21);
+ break;
+ case 134:
+ if (curChar == 58 && kind > 8)
+ kind = 8;
+ break;
+ case 135:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 134;
+ break;
+ case 144:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(22, 23);
+ break;
+ case 145:
+ if (curChar == 58 && kind > 11)
+ kind = 11;
+ break;
+ case 146:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 145;
+ break;
+ case 154:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(24, 25);
+ break;
+ case 155:
+ if (curChar == 58 && kind > 17)
+ kind = 17;
+ break;
+ case 156:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 155;
+ break;
+ case 160:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 159;
+ break;
+ case 163:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 162;
+ break;
+ case 173:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(26, 27);
+ break;
+ case 174:
+ if (curChar == 58 && kind > 12)
+ kind = 12;
+ break;
+ case 175:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 174;
+ break;
+ case 182:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 181;
+ break;
+ case 192:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(28, 29);
+ break;
+ case 193:
+ if (curChar == 58 && kind > 14)
+ kind = 14;
+ break;
+ case 194:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 193;
+ break;
+ case 204:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(30, 31);
+ break;
+ case 205:
+ if (curChar == 58 && kind > 16)
+ kind = 16;
+ break;
+ case 206:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 205;
+ break;
+ case 215:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(32, 33);
+ break;
+ case 216:
+ if (curChar == 40 && kind > 100)
+ kind = 100;
+ break;
+ case 220:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjAddStates(34, 35);
+ break;
+ case 221:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 222;
+ break;
+ case 222:
+ if (curChar == 42 && kind > 53)
+ kind = 53;
+ break;
+ case 223:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjAddStates(36, 37);
+ break;
+ case 224:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 225;
+ break;
+ case 226:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjstateSet[jjnewStateCnt++] = 226;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(38, 42);
+ }
+ if (curChar == 110)
+ jjAddStates(43, 44);
+ else if (curChar == 102)
+ jjAddStates(45, 46);
+ else if (curChar == 97)
+ jjAddStates(47, 49);
+ else if (curChar == 112)
+ jjAddStates(50, 53);
+ else if (curChar == 100)
+ jjAddStates(54, 55);
+ else if (curChar == 99)
+ jjAddStates(56, 57);
+ else if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 15;
+ else if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 5;
+ break;
+ case 0:
+ if (curChar == 102)
+ jjAddStates(0, 1);
+ break;
+ case 4:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 5:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 4;
+ break;
+ case 9:
+ case 10:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(10);
+ break;
+ case 11:
+ if (curChar == 116)
+ jjAddStates(2, 3);
+ break;
+ case 14:
+ if (curChar == 120)
+ jjstateSet[jjnewStateCnt++] = 11;
+ break;
+ case 15:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 14;
+ break;
+ case 16:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 15;
+ break;
+ case 20:
+ if (curChar == 99)
+ jjAddStates(56, 57);
+ break;
+ case 21:
+ if (curChar == 100)
+ jjAddStates(4, 5);
+ break;
+ case 25:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 21;
+ break;
+ case 26:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 27:
+ if (curChar == 104)
+ jjstateSet[jjnewStateCnt++] = 26;
+ break;
+ case 28:
+ if (curChar == 116)
+ jjAddStates(6, 7);
+ break;
+ case 31:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 28;
+ break;
+ case 32:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 31;
+ break;
+ case 33:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 32;
+ break;
+ case 34:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 33;
+ break;
+ case 35:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 34;
+ break;
+ case 36:
+ if (curChar == 100)
+ jjAddStates(54, 55);
+ break;
+ case 37:
+ if (curChar == 116)
+ jjAddStates(8, 9);
+ break;
+ case 41:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 37;
+ break;
+ case 42:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 41;
+ break;
+ case 43:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 42;
+ break;
+ case 44:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 43;
+ break;
+ case 45:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 44;
+ break;
+ case 46:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 45;
+ break;
+ case 47:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 46;
+ break;
+ case 48:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 47;
+ break;
+ case 49:
+ if (curChar == 102)
+ jjAddStates(10, 11);
+ break;
+ case 53:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 49;
+ break;
+ case 54:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 53;
+ break;
+ case 55:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 54;
+ break;
+ case 57:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 56;
+ break;
+ case 58:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 57;
+ break;
+ case 60:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 59;
+ break;
+ case 61:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 60;
+ break;
+ case 62:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 61;
+ break;
+ case 63:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 62;
+ break;
+ case 64:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 63;
+ break;
+ case 65:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 64;
+ break;
+ case 66:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 65;
+ break;
+ case 67:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 66;
+ break;
+ case 68:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 67;
+ break;
+ case 69:
+ if (curChar == 112)
+ jjAddStates(50, 53);
+ break;
+ case 70:
+ if (curChar == 116)
+ jjAddStates(12, 13);
+ break;
+ case 74:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 70;
+ break;
+ case 75:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 74;
+ break;
+ case 76:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 75;
+ break;
+ case 77:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 76;
+ break;
+ case 78:
+ if (curChar == 103)
+ jjAddStates(14, 15);
+ break;
+ case 82:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 78;
+ break;
+ case 83:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 82;
+ break;
+ case 84:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 83;
+ break;
+ case 85:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 84;
+ break;
+ case 86:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 85;
+ break;
+ case 87:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 86;
+ break;
+ case 89:
+ if (curChar == 103)
+ jjstateSet[jjnewStateCnt++] = 88;
+ break;
+ case 90:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 89;
+ break;
+ case 91:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 90;
+ break;
+ case 92:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 91;
+ break;
+ case 93:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 92;
+ break;
+ case 94:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 93;
+ break;
+ case 95:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 94;
+ break;
+ case 96:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 95;
+ break;
+ case 97:
+ if (curChar == 103)
+ jjAddStates(16, 17);
+ break;
+ case 101:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 97;
+ break;
+ case 102:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 101;
+ break;
+ case 103:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 102;
+ break;
+ case 104:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 103;
+ break;
+ case 105:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 104;
+ break;
+ case 106:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 105;
+ break;
+ case 107:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 106;
+ break;
+ case 108:
+ if (curChar == 110)
+ jjAddStates(18, 19);
+ break;
+ case 111:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 108;
+ break;
+ case 112:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 111;
+ break;
+ case 113:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 112;
+ break;
+ case 114:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 113;
+ break;
+ case 115:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 114;
+ break;
+ case 116:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 115;
+ break;
+ case 117:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 116;
+ break;
+ case 118:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 117;
+ break;
+ case 119:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 118;
+ break;
+ case 120:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 119;
+ break;
+ case 122:
+ if (curChar == 103)
+ jjstateSet[jjnewStateCnt++] = 121;
+ break;
+ case 123:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 122;
+ break;
+ case 124:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 123;
+ break;
+ case 125:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 124;
+ break;
+ case 126:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 125;
+ break;
+ case 127:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 126;
+ break;
+ case 128:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 127;
+ break;
+ case 129:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 128;
+ break;
+ case 130:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 129;
+ break;
+ case 131:
+ if (curChar == 97)
+ jjAddStates(47, 49);
+ break;
+ case 132:
+ if (curChar == 101)
+ jjAddStates(20, 21);
+ break;
+ case 136:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 132;
+ break;
+ case 137:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 136;
+ break;
+ case 138:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 137;
+ break;
+ case 139:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 138;
+ break;
+ case 140:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 139;
+ break;
+ case 141:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 140;
+ break;
+ case 142:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 141;
+ break;
+ case 143:
+ if (curChar == 114)
+ jjAddStates(22, 23);
+ break;
+ case 147:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 143;
+ break;
+ case 148:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 147;
+ break;
+ case 149:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 148;
+ break;
+ case 150:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 149;
+ break;
+ case 151:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 150;
+ break;
+ case 152:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 151;
+ break;
+ case 153:
+ if (curChar == 102)
+ jjAddStates(24, 25);
+ break;
+ case 157:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 153;
+ break;
+ case 158:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 157;
+ break;
+ case 159:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 158;
+ break;
+ case 161:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 160;
+ break;
+ case 162:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 161;
+ break;
+ case 164:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 163;
+ break;
+ case 165:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 164;
+ break;
+ case 166:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 165;
+ break;
+ case 167:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 166;
+ break;
+ case 168:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 167;
+ break;
+ case 169:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 168;
+ break;
+ case 170:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 169;
+ break;
+ case 171:
+ if (curChar == 102)
+ jjAddStates(45, 46);
+ break;
+ case 172:
+ if (curChar == 103)
+ jjAddStates(26, 27);
+ break;
+ case 176:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 172;
+ break;
+ case 177:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 176;
+ break;
+ case 178:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 177;
+ break;
+ case 179:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 178;
+ break;
+ case 180:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 179;
+ break;
+ case 181:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 180;
+ break;
+ case 183:
+ if (curChar == 103)
+ jjstateSet[jjnewStateCnt++] = 182;
+ break;
+ case 184:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 183;
+ break;
+ case 185:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 184;
+ break;
+ case 186:
+ if (curChar == 119)
+ jjstateSet[jjnewStateCnt++] = 185;
+ break;
+ case 187:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 186;
+ break;
+ case 188:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 187;
+ break;
+ case 189:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 188;
+ break;
+ case 190:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 189;
+ break;
+ case 191:
+ if (curChar == 103)
+ jjAddStates(28, 29);
+ break;
+ case 195:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 191;
+ break;
+ case 196:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 195;
+ break;
+ case 197:
+ if (curChar == 119)
+ jjstateSet[jjnewStateCnt++] = 196;
+ break;
+ case 198:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 197;
+ break;
+ case 199:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 198;
+ break;
+ case 200:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 199;
+ break;
+ case 201:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 200;
+ break;
+ case 202:
+ if (curChar == 110)
+ jjAddStates(43, 44);
+ break;
+ case 203:
+ if (curChar == 101)
+ jjAddStates(30, 31);
+ break;
+ case 207:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 203;
+ break;
+ case 208:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 207;
+ break;
+ case 209:
+ if (curChar == 112)
+ jjstateSet[jjnewStateCnt++] = 208;
+ break;
+ case 210:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 209;
+ break;
+ case 211:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 210;
+ break;
+ case 212:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 211;
+ break;
+ case 213:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 212;
+ break;
+ case 214:
+ if (curChar == 101)
+ jjAddStates(32, 33);
+ break;
+ case 217:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 214;
+ break;
+ case 218:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 217;
+ break;
+ case 219:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(38, 42);
+ break;
+ case 220:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(220, 221);
+ break;
+ case 223:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(223, 224);
+ break;
+ case 225:
+ case 226:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(226);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(38, 42);
+ break;
+ case 9:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(10);
+ break;
+ case 10:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(10);
+ break;
+ case 220:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(220, 221);
+ break;
+ case 223:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(223, 224);
+ break;
+ case 225:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(226);
+ break;
+ case 226:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(226);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 227 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_6(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ case 0:
+ if ((active0 & 0x4000000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 10;
+ }
+ if ((active0 & 0x1003000000000L) != 0L || (active1 & 0xec0000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 27;
+ }
+ return -1;
+ case 1:
+ if ((active0 & 0x1003000000000L) != 0L || (active1 & 0xec0000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 1;
+ return 27;
+ }
+ if ((active0 & 0x4000000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 1;
+ return 9;
+ }
+ return -1;
+ case 2:
+ if ((active0 & 0x1007000000000L) != 0L || (active1 & 0xec0000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 2;
+ return 27;
+ }
+ return -1;
+ case 3:
+ if ((active0 & 0x1001000000000L) != 0L || (active1 & 0x200000000L) != 0L)
+ return 27;
+ if ((active0 & 0x6000000000L) != 0L || (active1 & 0xcc0000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 3;
+ return 27;
+ }
+ return -1;
+ case 4:
+ if ((active0 & 0x6000000000L) != 0L || (active1 & 0xcc0000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 4;
+ return 27;
+ }
+ return -1;
+ case 5:
+ if ((active0 & 0x6000000000L) != 0L || (active1 & 0xcc0000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 5;
+ return 27;
+ }
+ return -1;
+ case 6:
+ if ((active0 & 0x4000000000L) != 0L || (active1 & 0x880000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 6;
+ return 27;
+ }
+ if ((active0 & 0x2000000000L) != 0L || (active1 & 0x440000000L) != 0L)
+ return 27;
+ return -1;
+ case 7:
+ if ((active1 & 0x80000000L) != 0L)
+ return 27;
+ if ((active0 & 0x4000000000L) != 0L || (active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 7;
+ return 27;
+ }
+ return -1;
+ case 8:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 8;
+ return 27;
+ }
+ if ((active0 & 0x4000000000L) != 0L)
+ return 27;
+ return -1;
+ case 9:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 9;
+ return 27;
+ }
+ return -1;
+ case 10:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 10;
+ return 27;
+ }
+ return -1;
+ case 11:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 11;
+ return 27;
+ }
+ return -1;
+ case 12:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 12;
+ return 27;
+ }
+ return -1;
+ case 13:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 13;
+ return 27;
+ }
+ return -1;
+ case 14:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 14;
+ return 27;
+ }
+ return -1;
+ case 15:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 15;
+ return 27;
+ }
+ return -1;
+ case 16:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 16;
+ return 27;
+ }
+ return -1;
+ case 17:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 17;
+ return 27;
+ }
+ return -1;
+ case 18:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 18;
+ return 27;
+ }
+ return -1;
+ case 19:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 19;
+ return 27;
+ }
+ return -1;
+ case 20:
+ if ((active1 & 0x800000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 20;
+ return 27;
+ }
+ return -1;
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_6(int pos, long active0, long active1)
+{
+ return jjMoveNfa_6(jjStopStringLiteralDfa_6(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_6(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_6(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_6()
+{
+ switch(curChar)
+ {
+ case 36:
+ return jjStopAtPos(0, 113);
+ case 41:
+ return jjStopAtPos(0, 83);
+ case 46:
+ jjmatchedKind = 108;
+ return jjMoveStringLiteralDfa1_6(0x0L, 0x200000000000L);
+ case 97:
+ return jjMoveStringLiteralDfa1_6(0x4000000000L, 0x0L);
+ case 99:
+ return jjMoveStringLiteralDfa1_6(0x0L, 0x40000000L);
+ case 100:
+ return jjMoveStringLiteralDfa1_6(0x0L, 0x80000000L);
+ case 101:
+ return jjMoveStringLiteralDfa1_6(0x2000000000L, 0x0L);
+ case 105:
+ return jjMoveStringLiteralDfa1_6(0x1000000000L, 0x0L);
+ case 110:
+ return jjMoveStringLiteralDfa1_6(0x1000000000000L, 0x0L);
+ case 112:
+ return jjMoveStringLiteralDfa1_6(0x0L, 0x800000000L);
+ case 116:
+ return jjMoveStringLiteralDfa1_6(0x0L, 0x200000000L);
+ case 117:
+ return jjMoveStringLiteralDfa1_6(0x0L, 0x400000000L);
+ default :
+ return jjMoveNfa_6(11, 0);
+ }
+}
+private final int jjMoveStringLiteralDfa1_6(long active0, long active1)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(0, active0, active1);
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 46:
+ if ((active1 & 0x200000000000L) != 0L)
+ return jjStopAtPos(1, 109);
+ break;
+ case 101:
+ return jjMoveStringLiteralDfa2_6(active0, 0L, active1, 0x200000000L);
+ case 108:
+ return jjMoveStringLiteralDfa2_6(active0, 0x2000000000L, active1, 0L);
+ case 110:
+ return jjMoveStringLiteralDfa2_6(active0, 0L, active1, 0x400000000L);
+ case 111:
+ return jjMoveStringLiteralDfa2_6(active0, 0x1000000000000L, active1, 0xc0000000L);
+ case 114:
+ return jjMoveStringLiteralDfa2_6(active0, 0L, active1, 0x800000000L);
+ case 116:
+ return jjMoveStringLiteralDfa2_6(active0, 0x5000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(0, active0, active1);
+}
+private final int jjMoveStringLiteralDfa2_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(0, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(1, active0, active1);
+ return 2;
+ }
+ switch(curChar)
+ {
+ case 99:
+ return jjMoveStringLiteralDfa3_6(active0, 0L, active1, 0x80000000L);
+ case 100:
+ return jjMoveStringLiteralDfa3_6(active0, 0x1000000000000L, active1, 0L);
+ case 101:
+ return jjMoveStringLiteralDfa3_6(active0, 0x3000000000L, active1, 0L);
+ case 109:
+ return jjMoveStringLiteralDfa3_6(active0, 0L, active1, 0x40000000L);
+ case 111:
+ return jjMoveStringLiteralDfa3_6(active0, 0L, active1, 0x800000000L);
+ case 116:
+ return jjMoveStringLiteralDfa3_6(active0, 0x4000000000L, active1, 0x400000000L);
+ case 120:
+ return jjMoveStringLiteralDfa3_6(active0, 0L, active1, 0x200000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(1, active0, active1);
+}
+private final int jjMoveStringLiteralDfa3_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(1, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(2, active0, active1);
+ return 3;
+ }
+ switch(curChar)
+ {
+ case 99:
+ return jjMoveStringLiteralDfa4_6(active0, 0L, active1, 0x800000000L);
+ case 101:
+ if ((active0 & 0x1000000000000L) != 0L)
+ return jjStartNfaWithStates_6(3, 48, 27);
+ break;
+ case 109:
+ if ((active0 & 0x1000000000L) != 0L)
+ return jjStartNfaWithStates_6(3, 36, 27);
+ return jjMoveStringLiteralDfa4_6(active0, 0x2000000000L, active1, 0x40000000L);
+ case 114:
+ return jjMoveStringLiteralDfa4_6(active0, 0x4000000000L, active1, 0L);
+ case 116:
+ if ((active1 & 0x200000000L) != 0L)
+ return jjStartNfaWithStates_6(3, 97, 27);
+ break;
+ case 117:
+ return jjMoveStringLiteralDfa4_6(active0, 0L, active1, 0x80000000L);
+ case 121:
+ return jjMoveStringLiteralDfa4_6(active0, 0L, active1, 0x400000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(2, active0, active1);
+}
+private final int jjMoveStringLiteralDfa4_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(2, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(3, active0, active1);
+ return 4;
+ }
+ switch(curChar)
+ {
+ case 101:
+ return jjMoveStringLiteralDfa5_6(active0, 0x2000000000L, active1, 0x840000000L);
+ case 105:
+ return jjMoveStringLiteralDfa5_6(active0, 0x4000000000L, active1, 0L);
+ case 109:
+ return jjMoveStringLiteralDfa5_6(active0, 0L, active1, 0x80000000L);
+ case 112:
+ return jjMoveStringLiteralDfa5_6(active0, 0L, active1, 0x400000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(3, active0, active1);
+}
+private final int jjMoveStringLiteralDfa5_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(3, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(4, active0, active1);
+ return 5;
+ }
+ switch(curChar)
+ {
+ case 98:
+ return jjMoveStringLiteralDfa6_6(active0, 0x4000000000L, active1, 0L);
+ case 101:
+ return jjMoveStringLiteralDfa6_6(active0, 0L, active1, 0x480000000L);
+ case 110:
+ return jjMoveStringLiteralDfa6_6(active0, 0x2000000000L, active1, 0x40000000L);
+ case 115:
+ return jjMoveStringLiteralDfa6_6(active0, 0L, active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(4, active0, active1);
+}
+private final int jjMoveStringLiteralDfa6_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(4, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(5, active0, active1);
+ return 6;
+ }
+ switch(curChar)
+ {
+ case 100:
+ if ((active1 & 0x400000000L) != 0L)
+ return jjStartNfaWithStates_6(6, 98, 27);
+ break;
+ case 110:
+ return jjMoveStringLiteralDfa7_6(active0, 0L, active1, 0x80000000L);
+ case 115:
+ return jjMoveStringLiteralDfa7_6(active0, 0L, active1, 0x800000000L);
+ case 116:
+ if ((active0 & 0x2000000000L) != 0L)
+ return jjStartNfaWithStates_6(6, 37, 27);
+ else if ((active1 & 0x40000000L) != 0L)
+ return jjStartNfaWithStates_6(6, 94, 27);
+ break;
+ case 117:
+ return jjMoveStringLiteralDfa7_6(active0, 0x4000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(5, active0, active1);
+}
+private final int jjMoveStringLiteralDfa7_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(5, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(6, active0, active1);
+ return 7;
+ }
+ switch(curChar)
+ {
+ case 105:
+ return jjMoveStringLiteralDfa8_6(active0, 0L, active1, 0x800000000L);
+ case 116:
+ if ((active1 & 0x80000000L) != 0L)
+ return jjStartNfaWithStates_6(7, 95, 27);
+ return jjMoveStringLiteralDfa8_6(active0, 0x4000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(6, active0, active1);
+}
+private final int jjMoveStringLiteralDfa8_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(6, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(7, active0, active1);
+ return 8;
+ }
+ switch(curChar)
+ {
+ case 101:
+ if ((active0 & 0x4000000000L) != 0L)
+ return jjStartNfaWithStates_6(8, 38, 27);
+ break;
+ case 110:
+ return jjMoveStringLiteralDfa9_6(active0, 0L, active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(7, active0, active1);
+}
+private final int jjMoveStringLiteralDfa9_6(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_6(7, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(8, 0L, active1);
+ return 9;
+ }
+ switch(curChar)
+ {
+ case 103:
+ return jjMoveStringLiteralDfa10_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(8, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa10_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(8, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(9, 0L, active1);
+ return 10;
+ }
+ switch(curChar)
+ {
+ case 45:
+ return jjMoveStringLiteralDfa11_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(9, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa11_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(9, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(10, 0L, active1);
+ return 11;
+ }
+ switch(curChar)
+ {
+ case 105:
+ return jjMoveStringLiteralDfa12_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(10, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa12_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(10, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(11, 0L, active1);
+ return 12;
+ }
+ switch(curChar)
+ {
+ case 110:
+ return jjMoveStringLiteralDfa13_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(11, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa13_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(11, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(12, 0L, active1);
+ return 13;
+ }
+ switch(curChar)
+ {
+ case 115:
+ return jjMoveStringLiteralDfa14_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(12, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa14_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(12, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(13, 0L, active1);
+ return 14;
+ }
+ switch(curChar)
+ {
+ case 116:
+ return jjMoveStringLiteralDfa15_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(13, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa15_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(13, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(14, 0L, active1);
+ return 15;
+ }
+ switch(curChar)
+ {
+ case 114:
+ return jjMoveStringLiteralDfa16_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(14, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa16_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(14, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(15, 0L, active1);
+ return 16;
+ }
+ switch(curChar)
+ {
+ case 117:
+ return jjMoveStringLiteralDfa17_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(15, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa17_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(15, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(16, 0L, active1);
+ return 17;
+ }
+ switch(curChar)
+ {
+ case 99:
+ return jjMoveStringLiteralDfa18_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(16, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa18_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(16, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(17, 0L, active1);
+ return 18;
+ }
+ switch(curChar)
+ {
+ case 116:
+ return jjMoveStringLiteralDfa19_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(17, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa19_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(17, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(18, 0L, active1);
+ return 19;
+ }
+ switch(curChar)
+ {
+ case 105:
+ return jjMoveStringLiteralDfa20_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(18, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa20_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(18, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(19, 0L, active1);
+ return 20;
+ }
+ switch(curChar)
+ {
+ case 111:
+ return jjMoveStringLiteralDfa21_6(active1, 0x800000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_6(19, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa21_6(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_6(19, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_6(20, 0L, active1);
+ return 21;
+ }
+ switch(curChar)
+ {
+ case 110:
+ if ((active1 & 0x800000000L) != 0L)
+ return jjStartNfaWithStates_6(21, 99, 27);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_6(20, 0L, active1);
+}
+private final int jjMoveNfa_6(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 27;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 9:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 25;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 22;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 11:
+ if ((0x100002600L & l) != 0L)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(17, 18);
+ }
+ else if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 13;
+ break;
+ case 27:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 25;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 22;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 10:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 25;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 22;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 1:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(58, 59);
+ break;
+ case 12:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 13;
+ break;
+ case 13:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 14;
+ break;
+ case 15:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjstateSet[jjnewStateCnt++] = 15;
+ break;
+ case 16:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(17, 18);
+ break;
+ case 17:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(17);
+ break;
+ case 18:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(18);
+ break;
+ case 20:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 21:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 22;
+ break;
+ case 22:
+ if (curChar == 42 && kind > 53)
+ kind = 53;
+ break;
+ case 23:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ break;
+ case 24:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 26:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 9:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 8;
+ break;
+ case 11:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(60, 64);
+ }
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 10;
+ break;
+ case 27:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 10:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 9;
+ break;
+ case 0:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 1;
+ break;
+ case 2:
+ if (curChar == 101 && kind > 46)
+ kind = 46;
+ break;
+ case 3:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 4:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 5:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 4;
+ break;
+ case 6:
+ if (curChar == 118)
+ jjstateSet[jjnewStateCnt++] = 5;
+ break;
+ case 7:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 8:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 7;
+ break;
+ case 14:
+ case 15:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(15);
+ break;
+ case 19:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(60, 64);
+ break;
+ case 20:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 23:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ break;
+ case 25:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ break;
+ case 26:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 9:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ break;
+ case 11:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(60, 64);
+ break;
+ case 27:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ break;
+ case 10:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ }
+ break;
+ case 14:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(15);
+ break;
+ case 15:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(15);
+ break;
+ case 20:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(20, 21);
+ break;
+ case 23:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ break;
+ case 25:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ break;
+ case 26:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(26);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 27 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_1(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_1(int pos, long active0, long active1)
+{
+ return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_1(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_1(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_1()
+{
+ switch(curChar)
+ {
+ case 123:
+ return jjStartNfaWithStates_1(0, 119, 5);
+ default :
+ return jjMoveNfa_1(6, 0);
+ }
+}
+private final int jjMoveNfa_1(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 8;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((0xffffffff00002600L & l) != 0L && kind > 121)
+ kind = 121;
+ break;
+ case 0:
+ if (curChar == 45)
+ jjCheckNAddTwoStates(1, 4);
+ break;
+ case 1:
+ jjCheckNAddTwoStates(1, 4);
+ break;
+ case 3:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 4:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 5:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if (kind > 121)
+ kind = 121;
+ if (curChar == 123)
+ jjstateSet[jjnewStateCnt++] = 5;
+ break;
+ case 1:
+ if ((0xdfffffffffffffffL & l) != 0L)
+ jjAddStates(65, 66);
+ break;
+ case 2:
+ if (curChar == 125 && kind > 1)
+ kind = 1;
+ break;
+ case 7:
+ if (kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ case 1:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(65, 66);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 8 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_2(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ case 0:
+ if ((active0 & 0x800000L) != 0L)
+ return 19;
+ if ((active0 & 0x5000000041200000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 9;
+ }
+ if ((active0 & 0x100000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 48;
+ }
+ if ((active0 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 26;
+ }
+ if ((active0 & 0x400000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 38;
+ }
+ if ((active1 & 0x300000000000L) != 0L)
+ return 81;
+ if ((active0 & 0x40000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 11;
+ }
+ if ((active0 & 0x8002ac480000L) != 0L || (active1 & 0x20001f0L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 82;
+ }
+ if ((active0 & 0x110000000L) != 0L || (active1 & 0x8L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 33;
+ }
+ return -1;
+ case 1:
+ if ((active0 & 0x41000000L) != 0L)
+ return 8;
+ if ((active0 & 0x400000000L) != 0L)
+ {
+ if (jjmatchedPos != 1)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 1;
+ }
+ return 35;
+ }
+ if ((active0 & 0x5000000020040000L) != 0L || (active1 & 0x1f8L) != 0L)
+ return 82;
+ if ((active0 & 0x80039e780000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ if (jjmatchedPos != 1)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 1;
+ }
+ return 82;
+ }
+ return -1;
+ case 2:
+ if ((active0 & 0x40008007de200000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 2;
+ return 82;
+ }
+ if ((active0 & 0x580000L) != 0L)
+ return 82;
+ return -1;
+ case 3:
+ if ((active0 & 0x800018200000L) != 0L)
+ return 82;
+ if ((active0 & 0x40000007c6000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 3;
+ return 82;
+ }
+ return -1;
+ case 4:
+ if ((active0 & 0x4000000080000000L) != 0L)
+ return 82;
+ if ((active0 & 0x746000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 4;
+ return 82;
+ }
+ return -1;
+ case 5:
+ if ((active0 & 0x104000000L) != 0L)
+ return 82;
+ if ((active0 & 0x642000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 5;
+ return 82;
+ }
+ return -1;
+ case 6:
+ if ((active0 & 0x400000000L) != 0L)
+ return 82;
+ if ((active0 & 0x242000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 6;
+ return 82;
+ }
+ return -1;
+ case 7:
+ if ((active0 & 0x200000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ return 82;
+ if ((active0 & 0x42000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 7;
+ return 82;
+ }
+ return -1;
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_2(int pos, long active0, long active1)
+{
+ return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_2(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_2(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_2()
+{
+ switch(curChar)
+ {
+ case 33:
+ return jjMoveStringLiteralDfa1_2(0x2000000000000000L, 0x0L);
+ case 36:
+ return jjStopAtPos(0, 113);
+ case 40:
+ return jjStopAtPos(0, 79);
+ case 41:
+ return jjStopAtPos(0, 83);
+ case 42:
+ return jjStartNfaWithStates_2(0, 23, 19);
+ case 43:
+ return jjStopAtPos(0, 76);
+ case 44:
+ return jjStopAtPos(0, 105);
+ case 45:
+ return jjStopAtPos(0, 75);
+ case 46:
+ jjmatchedKind = 108;
+ return jjMoveStringLiteralDfa1_2(0x0L, 0x200000000000L);
+ case 47:
+ jjmatchedKind = 57;
+ return jjMoveStringLiteralDfa1_2(0x400000000000000L, 0x0L);
+ case 60:
+ jjmatchedKind = 73;
+ return jjMoveStringLiteralDfa1_2(0x8000000000000000L, 0x1L);
+ case 61:
+ return jjStopAtPos(0, 59);
+ case 62:
+ jjmatchedKind = 74;
+ return jjMoveStringLiteralDfa1_2(0x0L, 0x6L);
+ case 63:
+ return jjStopAtPos(0, 77);
+ case 91:
+ return jjStopAtPos(0, 81);
+ case 93:
+ return jjStopAtPos(0, 82);
+ case 97:
+ return jjMoveStringLiteralDfa1_2(0x80000L, 0x0L);
+ case 100:
+ return jjMoveStringLiteralDfa1_2(0x100000L, 0x0L);
+ case 101:
+ return jjMoveStringLiteralDfa1_2(0x110000000L, 0x8L);
+ case 102:
+ return jjMoveStringLiteralDfa1_2(0x400000000L, 0x0L);
+ case 103:
+ return jjMoveStringLiteralDfa1_2(0x0L, 0x60L);
+ case 105:
+ return jjMoveStringLiteralDfa1_2(0x5000000041200000L, 0x0L);
+ case 108:
+ return jjMoveStringLiteralDfa1_2(0x0L, 0x180L);
+ case 109:
+ return jjMoveStringLiteralDfa1_2(0x400000L, 0x0L);
+ case 110:
+ return jjMoveStringLiteralDfa1_2(0x0L, 0x10L);
+ case 111:
+ return jjMoveStringLiteralDfa1_2(0x40000L, 0x0L);
+ case 112:
+ return jjMoveStringLiteralDfa1_2(0x200000000L, 0x0L);
+ case 114:
+ return jjMoveStringLiteralDfa1_2(0x4000000L, 0x0L);
+ case 115:
+ return jjMoveStringLiteralDfa1_2(0x2000000L, 0x0L);
+ case 116:
+ return jjMoveStringLiteralDfa1_2(0x800028000000L, 0x0L);
+ case 117:
+ return jjMoveStringLiteralDfa1_2(0x80000000L, 0x0L);
+ case 118:
+ return jjMoveStringLiteralDfa1_2(0x0L, 0x2000000L);
+ case 124:
+ return jjStopAtPos(0, 78);
+ case 125:
+ return jjStopAtPos(0, 120);
+ default :
+ return jjMoveNfa_2(10, 0);
+ }
+}
+private final int jjMoveStringLiteralDfa1_2(long active0, long active1)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(0, active0, active1);
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 46:
+ if ((active1 & 0x200000000000L) != 0L)
+ return jjStopAtPos(1, 109);
+ break;
+ case 47:
+ if ((active0 & 0x400000000000000L) != 0L)
+ return jjStopAtPos(1, 58);
+ break;
+ case 60:
+ if ((active1 & 0x1L) != 0L)
+ return jjStopAtPos(1, 64);
+ break;
+ case 61:
+ if ((active0 & 0x2000000000000000L) != 0L)
+ return jjStopAtPos(1, 61);
+ else if ((active0 & 0x8000000000000000L) != 0L)
+ return jjStopAtPos(1, 63);
+ else if ((active1 & 0x2L) != 0L)
+ return jjStopAtPos(1, 65);
+ break;
+ case 62:
+ if ((active1 & 0x4L) != 0L)
+ return jjStopAtPos(1, 66);
+ break;
+ case 97:
+ return jjMoveStringLiteralDfa2_2(active0, 0x2000000L, active1, 0x2000000L);
+ case 100:
+ return jjMoveStringLiteralDfa2_2(active0, 0x200000L, active1, 0L);
+ case 101:
+ if ((active1 & 0x10L) != 0L)
+ return jjStartNfaWithStates_2(1, 68, 82);
+ else if ((active1 & 0x40L) != 0L)
+ return jjStartNfaWithStates_2(1, 70, 82);
+ else if ((active1 & 0x100L) != 0L)
+ return jjStartNfaWithStates_2(1, 72, 82);
+ return jjMoveStringLiteralDfa2_2(active0, 0x4000000L, active1, 0L);
+ case 104:
+ return jjMoveStringLiteralDfa2_2(active0, 0x8000000L, active1, 0L);
+ case 105:
+ return jjMoveStringLiteralDfa2_2(active0, 0x100000L, active1, 0L);
+ case 108:
+ return jjMoveStringLiteralDfa2_2(active0, 0x10000000L, active1, 0L);
+ case 110:
+ if ((active0 & 0x1000000L) != 0L)
+ {
+ jjmatchedKind = 24;
+ jjmatchedPos = 1;
+ }
+ return jjMoveStringLiteralDfa2_2(active0, 0xc0080000L, active1, 0L);
+ case 111:
+ if ((active0 & 0x20000000L) != 0L)
+ return jjStartNfaWithStates_2(1, 29, 82);
+ return jjMoveStringLiteralDfa2_2(active0, 0x400400000L, active1, 0L);
+ case 113:
+ if ((active1 & 0x8L) != 0L)
+ return jjStartNfaWithStates_2(1, 67, 82);
+ break;
+ case 114:
+ if ((active0 & 0x40000L) != 0L)
+ return jjStartNfaWithStates_2(1, 18, 82);
+ return jjMoveStringLiteralDfa2_2(active0, 0x200000000L, active1, 0L);
+ case 115:
+ if ((active0 & 0x1000000000000000L) != 0L)
+ {
+ jjmatchedKind = 60;
+ jjmatchedPos = 1;
+ }
+ return jjMoveStringLiteralDfa2_2(active0, 0x4000000000000000L, active1, 0L);
+ case 116:
+ if ((active1 & 0x20L) != 0L)
+ return jjStartNfaWithStates_2(1, 69, 82);
+ else if ((active1 & 0x80L) != 0L)
+ return jjStartNfaWithStates_2(1, 71, 82);
+ break;
+ case 120:
+ return jjMoveStringLiteralDfa2_2(active0, 0x100000000L, active1, 0L);
+ case 121:
+ return jjMoveStringLiteralDfa2_2(active0, 0x800000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_2(0, active0, active1);
+}
+private final int jjMoveStringLiteralDfa2_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(0, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(1, active0, active1);
+ return 2;
+ }
+ switch(curChar)
+ {
+ case 99:
+ return jjMoveStringLiteralDfa3_2(active0, 0x100000000L, active1, 0L);
+ case 100:
+ if ((active0 & 0x80000L) != 0L)
+ return jjStartNfaWithStates_2(2, 19, 82);
+ else if ((active0 & 0x400000L) != 0L)
+ return jjStartNfaWithStates_2(2, 22, 82);
+ break;
+ case 101:
+ return jjMoveStringLiteralDfa3_2(active0, 0x208000000L, active1, 0L);
+ case 105:
+ return jjMoveStringLiteralDfa3_2(active0, 0x80200000L, active1, 0L);
+ case 108:
+ return jjMoveStringLiteralDfa3_2(active0, 0x400000000L, active1, 0x2000000L);
+ case 110:
+ return jjMoveStringLiteralDfa3_2(active0, 0x4000000000000000L, active1, 0L);
+ case 112:
+ return jjMoveStringLiteralDfa3_2(active0, 0x800000000000L, active1, 0L);
+ case 115:
+ return jjMoveStringLiteralDfa3_2(active0, 0x10000000L, active1, 0L);
+ case 116:
+ return jjMoveStringLiteralDfa3_2(active0, 0x46000000L, active1, 0L);
+ case 118:
+ if ((active0 & 0x100000L) != 0L)
+ return jjStartNfaWithStates_2(2, 20, 82);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_2(1, active0, active1);
+}
+private final int jjMoveStringLiteralDfa3_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(1, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(2, active0, active1);
+ return 3;
+ }
+ switch(curChar)
+ {
+ case 99:
+ return jjMoveStringLiteralDfa4_2(active0, 0x200000000L, active1, 0L);
+ case 101:
+ if ((active0 & 0x10000000L) != 0L)
+ return jjStartNfaWithStates_2(3, 28, 82);
+ else if ((active0 & 0x800000000000L) != 0L)
+ return jjStartNfaWithStates_2(3, 47, 82);
+ return jjMoveStringLiteralDfa4_2(active0, 0x140000000L, active1, 0L);
+ case 105:
+ return jjMoveStringLiteralDfa4_2(active0, 0x2000000L, active1, 0x2000000L);
+ case 108:
+ return jjMoveStringLiteralDfa4_2(active0, 0x400000000L, active1, 0L);
+ case 110:
+ if ((active0 & 0x8000000L) != 0L)
+ return jjStartNfaWithStates_2(3, 27, 82);
+ break;
+ case 111:
+ return jjMoveStringLiteralDfa4_2(active0, 0x4000000080000000L, active1, 0L);
+ case 117:
+ return jjMoveStringLiteralDfa4_2(active0, 0x4000000L, active1, 0L);
+ case 118:
+ if ((active0 & 0x200000L) != 0L)
+ return jjStartNfaWithStates_2(3, 21, 82);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_2(2, active0, active1);
+}
+private final int jjMoveStringLiteralDfa4_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(2, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(3, active0, active1);
+ return 4;
+ }
+ switch(curChar)
+ {
+ case 100:
+ return jjMoveStringLiteralDfa5_2(active0, 0L, active1, 0x2000000L);
+ case 101:
+ return jjMoveStringLiteralDfa5_2(active0, 0x200000000L, active1, 0L);
+ case 110:
+ if ((active0 & 0x80000000L) != 0L)
+ return jjStartNfaWithStates_2(4, 31, 82);
+ break;
+ case 111:
+ return jjMoveStringLiteralDfa5_2(active0, 0x400000000L, active1, 0L);
+ case 112:
+ return jjMoveStringLiteralDfa5_2(active0, 0x100000000L, active1, 0L);
+ case 114:
+ return jjMoveStringLiteralDfa5_2(active0, 0x44000000L, active1, 0L);
+ case 115:
+ return jjMoveStringLiteralDfa5_2(active0, 0x2000000L, active1, 0L);
+ case 116:
+ if ((active0 & 0x4000000000000000L) != 0L)
+ return jjStartNfaWithStates_2(4, 62, 82);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_2(3, active0, active1);
+}
+private final int jjMoveStringLiteralDfa5_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(3, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(4, active0, active1);
+ return 5;
+ }
+ switch(curChar)
+ {
+ case 97:
+ return jjMoveStringLiteralDfa6_2(active0, 0L, active1, 0x2000000L);
+ case 100:
+ return jjMoveStringLiteralDfa6_2(active0, 0x200000000L, active1, 0L);
+ case 102:
+ return jjMoveStringLiteralDfa6_2(active0, 0x2000000L, active1, 0L);
+ case 110:
+ if ((active0 & 0x4000000L) != 0L)
+ return jjStartNfaWithStates_2(5, 26, 82);
+ break;
+ case 115:
+ return jjMoveStringLiteralDfa6_2(active0, 0x40000000L, active1, 0L);
+ case 116:
+ if ((active0 & 0x100000000L) != 0L)
+ return jjStartNfaWithStates_2(5, 32, 82);
+ break;
+ case 119:
+ return jjMoveStringLiteralDfa6_2(active0, 0x400000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_2(4, active0, active1);
+}
+private final int jjMoveStringLiteralDfa6_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(4, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(5, active0, active1);
+ return 6;
+ }
+ switch(curChar)
+ {
+ case 101:
+ return jjMoveStringLiteralDfa7_2(active0, 0x240000000L, active1, 0L);
+ case 105:
+ return jjMoveStringLiteralDfa7_2(active0, 0x2000000L, active1, 0L);
+ case 115:
+ if ((active0 & 0x400000000L) != 0L)
+ return jjStartNfaWithStates_2(6, 34, 82);
+ break;
+ case 116:
+ return jjMoveStringLiteralDfa7_2(active0, 0L, active1, 0x2000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_2(5, active0, active1);
+}
+private final int jjMoveStringLiteralDfa7_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(5, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(6, active0, active1);
+ return 7;
+ }
+ switch(curChar)
+ {
+ case 99:
+ return jjMoveStringLiteralDfa8_2(active0, 0x40000000L, active1, 0L);
+ case 101:
+ if ((active1 & 0x2000000L) != 0L)
+ return jjStartNfaWithStates_2(7, 89, 82);
+ return jjMoveStringLiteralDfa8_2(active0, 0x2000000L, active1, 0L);
+ case 115:
+ if ((active0 & 0x200000000L) != 0L)
+ return jjStartNfaWithStates_2(7, 33, 82);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_2(6, active0, active1);
+}
+private final int jjMoveStringLiteralDfa8_2(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_2(6, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_2(7, active0, 0L);
+ return 8;
+ }
+ switch(curChar)
+ {
+ case 115:
+ if ((active0 & 0x2000000L) != 0L)
+ return jjStartNfaWithStates_2(8, 25, 82);
+ break;
+ case 116:
+ if ((active0 & 0x40000000L) != 0L)
+ return jjStartNfaWithStates_2(8, 30, 82);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_2(7, active0, 0L);
+}
+private final int jjMoveNfa_2(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 81;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 38:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 9:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 11:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 33:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 10:
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 91)
+ kind = 91;
+ jjCheckNAddStates(67, 72);
+ }
+ else if ((0x100002600L & l) != 0L)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(57, 58);
+ }
+ else if (curChar == 46)
+ jjCheckNAddTwoStates(79, 80);
+ else if (curChar == 39)
+ jjCheckNAddTwoStates(54, 55);
+ else if (curChar == 34)
+ jjCheckNAddTwoStates(51, 52);
+ else if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 19;
+ break;
+ case 35:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 81:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(80, 75);
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(79);
+ }
+ break;
+ case 82:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 8:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 48:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 26:
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 1:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(0, 1);
+ break;
+ case 12:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(73, 74);
+ break;
+ case 18:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 19;
+ break;
+ case 19:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 20;
+ break;
+ case 21:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjstateSet[jjnewStateCnt++] = 21;
+ break;
+ case 23:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(75, 76);
+ break;
+ case 24:
+ if (curChar == 36 && kind > 84)
+ kind = 84;
+ break;
+ case 29:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(6, 7);
+ break;
+ case 30:
+ if (curChar == 36 && kind > 85)
+ kind = 85;
+ break;
+ case 36:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(77, 78);
+ break;
+ case 37:
+ if (curChar == 36 && kind > 86)
+ kind = 86;
+ break;
+ case 41:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(79, 80);
+ break;
+ case 50:
+ if (curChar == 34)
+ jjCheckNAddTwoStates(51, 52);
+ break;
+ case 51:
+ if ((0xfffffffbffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(51, 52);
+ break;
+ case 52:
+ if (curChar != 34)
+ break;
+ if (kind > 106)
+ kind = 106;
+ jjstateSet[jjnewStateCnt++] = 50;
+ break;
+ case 53:
+ if (curChar == 39)
+ jjCheckNAddTwoStates(54, 55);
+ break;
+ case 54:
+ if ((0xffffff7fffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(54, 55);
+ break;
+ case 55:
+ if (curChar != 39)
+ break;
+ if (kind > 106)
+ kind = 106;
+ jjstateSet[jjnewStateCnt++] = 53;
+ break;
+ case 56:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(57, 58);
+ break;
+ case 57:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(57);
+ break;
+ case 58:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(58);
+ break;
+ case 60:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 61:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 62;
+ break;
+ case 62:
+ if (curChar == 42 && kind > 53)
+ kind = 53;
+ break;
+ case 63:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ break;
+ case 64:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 65;
+ break;
+ case 66:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ break;
+ case 67:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 91)
+ kind = 91;
+ jjCheckNAddStates(67, 72);
+ break;
+ case 68:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 91)
+ kind = 91;
+ jjCheckNAdd(68);
+ break;
+ case 69:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(69, 70);
+ break;
+ case 70:
+ if (curChar != 46)
+ break;
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(71);
+ break;
+ case 71:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(71);
+ break;
+ case 72:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(81, 83);
+ break;
+ case 73:
+ if (curChar == 46)
+ jjCheckNAddTwoStates(74, 75);
+ break;
+ case 74:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(74, 75);
+ break;
+ case 76:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(77);
+ break;
+ case 77:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 93)
+ kind = 93;
+ jjCheckNAdd(77);
+ break;
+ case 78:
+ if (curChar == 46)
+ jjCheckNAddTwoStates(79, 80);
+ break;
+ case 79:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(79);
+ break;
+ case 80:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(80, 75);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 38:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 35;
+ break;
+ case 9:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 8;
+ break;
+ case 11:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 12;
+ break;
+ case 33:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 118)
+ jjstateSet[jjnewStateCnt++] = 32;
+ break;
+ case 10:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(84, 88);
+ }
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 48;
+ else if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 38;
+ else if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 33;
+ else if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 26;
+ else if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 11;
+ else if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 9;
+ break;
+ case 35:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 114)
+ jjAddStates(77, 78);
+ break;
+ case 82:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 8:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 7;
+ break;
+ case 48:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 47;
+ break;
+ case 26:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 0:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 1;
+ break;
+ case 2:
+ if (curChar == 102 && kind > 35)
+ kind = 35;
+ break;
+ case 3:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 4:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 5:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 4;
+ break;
+ case 6:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 5;
+ break;
+ case 7:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 6;
+ break;
+ case 13:
+ if (curChar == 101 && kind > 45)
+ kind = 45;
+ break;
+ case 14:
+ if (curChar == 112)
+ jjstateSet[jjnewStateCnt++] = 13;
+ break;
+ case 15:
+ if (curChar == 121)
+ jjstateSet[jjnewStateCnt++] = 14;
+ break;
+ case 16:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 15;
+ break;
+ case 17:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 11;
+ break;
+ case 20:
+ case 21:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(21);
+ break;
+ case 22:
+ if (curChar == 101)
+ jjAddStates(75, 76);
+ break;
+ case 25:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 22;
+ break;
+ case 27:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 26;
+ break;
+ case 28:
+ if (curChar == 121)
+ jjAddStates(6, 7);
+ break;
+ case 31:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 28;
+ break;
+ case 32:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 31;
+ break;
+ case 34:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 33;
+ break;
+ case 39:
+ if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 38;
+ break;
+ case 40:
+ if (curChar == 116)
+ jjAddStates(79, 80);
+ break;
+ case 42:
+ if (curChar == 123 && kind > 96)
+ kind = 96;
+ break;
+ case 43:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 40;
+ break;
+ case 44:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 43;
+ break;
+ case 45:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 44;
+ break;
+ case 46:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 45;
+ break;
+ case 47:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 46;
+ break;
+ case 49:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 48;
+ break;
+ case 51:
+ jjAddStates(89, 90);
+ break;
+ case 54:
+ jjAddStates(91, 92);
+ break;
+ case 59:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(84, 88);
+ break;
+ case 60:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 63:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ break;
+ case 65:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ break;
+ case 66:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ break;
+ case 75:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(93, 94);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 38:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 9:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 11:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 33:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 10:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(84, 88);
+ break;
+ case 35:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 82:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 8:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 48:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 26:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ }
+ break;
+ case 20:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(21);
+ break;
+ case 21:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(21);
+ break;
+ case 51:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(89, 90);
+ break;
+ case 54:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(91, 92);
+ break;
+ case 60:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 63:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(63, 64);
+ break;
+ case 65:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ break;
+ case 66:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(66);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 81 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_14()
+{
+ return jjMoveNfa_14(0, 0);
+}
+private final int jjMoveNfa_14(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xffffffff00002600L & l) != 0L)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_8()
+{
+ return jjMoveNfa_8(6, 0);
+}
+private final int jjMoveNfa_8(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 9;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((0x100002600L & l) != 0L)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(7, 8);
+ }
+ else if (curChar == 39)
+ jjCheckNAddTwoStates(4, 5);
+ else if (curChar == 34)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 0:
+ if (curChar == 34)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 1:
+ if ((0xfffffffbffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 2:
+ if (curChar != 34)
+ break;
+ if (kind > 106)
+ kind = 106;
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 3:
+ if (curChar == 39)
+ jjCheckNAddTwoStates(4, 5);
+ break;
+ case 4:
+ if ((0xffffff7fffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(4, 5);
+ break;
+ case 5:
+ if (curChar != 39)
+ break;
+ if (kind > 106)
+ kind = 106;
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 7:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(7);
+ break;
+ case 8:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(8);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 1:
+ jjAddStates(95, 96);
+ break;
+ case 4:
+ jjAddStates(97, 98);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 1:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(95, 96);
+ break;
+ case 4:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(97, 98);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 9 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_11()
+{
+ return jjMoveNfa_11(0, 0);
+}
+private final int jjMoveNfa_11(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 5;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 1:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjAddStates(95, 96);
+ break;
+ case 2:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 4:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjstateSet[jjnewStateCnt++] = 4;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(99, 101);
+ break;
+ case 1:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 3:
+ case 4:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(4);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAddStates(99, 101);
+ break;
+ case 1:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 3:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(4);
+ break;
+ case 4:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 114)
+ kind = 114;
+ jjCheckNAdd(4);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 5 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_9(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_9(int pos, long active0, long active1)
+{
+ return jjMoveNfa_9(jjStopStringLiteralDfa_9(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_9(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_9(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_9()
+{
+ switch(curChar)
+ {
+ case 123:
+ return jjStopAtPos(0, 119);
+ default :
+ return jjMoveNfa_9(0, 0);
+ }
+}
+private final int jjMoveNfa_9(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x100002600L & l) == 0L)
+ break;
+ kind = 4;
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_17()
+{
+ return jjMoveNfa_17(0, 0);
+}
+private final int jjMoveNfa_17(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xffffffff00002600L & l) != 0L)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_4()
+{
+ return jjMoveNfa_4(6, 0);
+}
+private final int jjMoveNfa_4(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 9;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 6:
+ if ((0x100002600L & l) != 0L)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(7, 8);
+ }
+ else if (curChar == 39)
+ jjCheckNAddTwoStates(4, 5);
+ else if (curChar == 34)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 0:
+ if (curChar == 34)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 1:
+ if ((0xfffffffbffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 2:
+ if (curChar != 34)
+ break;
+ if (kind > 107)
+ kind = 107;
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 3:
+ if (curChar == 39)
+ jjCheckNAddTwoStates(4, 5);
+ break;
+ case 4:
+ if ((0xffffff7fffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(4, 5);
+ break;
+ case 5:
+ if (curChar != 39)
+ break;
+ if (kind > 107)
+ kind = 107;
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 7:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(7);
+ break;
+ case 8:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(8);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 1:
+ jjAddStates(95, 96);
+ break;
+ case 4:
+ jjAddStates(97, 98);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 1:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(95, 96);
+ break;
+ case 4:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(97, 98);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 9 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjMoveStringLiteralDfa0_5()
+{
+ return jjMoveNfa_5(0, 0);
+}
+private final int jjMoveNfa_5(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x100002600L & l) == 0L)
+ break;
+ kind = 2;
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ case 0:
+ if ((active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 386;
+ }
+ if ((active0 & 0x10000000000000L) != 0L)
+ return 15;
+ if ((active0 & 0x2000000000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ return 330;
+ }
+ if ((active1 & 0x300000000000L) != 0L)
+ return 387;
+ return -1;
+ case 1:
+ if ((active0 & 0x2000000000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 1;
+ return 386;
+ }
+ return -1;
+ case 2:
+ if ((active0 & 0x2000000000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 2;
+ return 386;
+ }
+ return -1;
+ case 3:
+ if ((active0 & 0x2000000000000L) != 0L || (active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 3;
+ return 386;
+ }
+ return -1;
+ case 4:
+ if ((active0 & 0x2000000000000L) != 0L)
+ return 386;
+ if ((active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 4;
+ return 386;
+ }
+ return -1;
+ case 5:
+ if ((active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 5;
+ return 386;
+ }
+ return -1;
+ case 6:
+ if ((active1 & 0x2000000L) != 0L)
+ {
+ jjmatchedKind = 115;
+ jjmatchedPos = 6;
+ return 386;
+ }
+ return -1;
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_0(int pos, long active0, long active1)
+{
+ return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_0(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_0()
+{
+ switch(curChar)
+ {
+ case 36:
+ return jjStopAtPos(0, 113);
+ case 40:
+ return jjStopAtPos(0, 79);
+ case 41:
+ return jjStopAtPos(0, 83);
+ case 42:
+ return jjStartNfaWithStates_0(0, 52, 15);
+ case 43:
+ return jjStopAtPos(0, 76);
+ case 44:
+ return jjStopAtPos(0, 105);
+ case 45:
+ return jjStopAtPos(0, 75);
+ case 46:
+ jjmatchedKind = 108;
+ return jjMoveStringLiteralDfa1_0(0x0L, 0x200000000000L);
+ case 47:
+ jjmatchedKind = 55;
+ return jjMoveStringLiteralDfa1_0(0x100000000000000L, 0x0L);
+ case 64:
+ return jjStopAtPos(0, 80);
+ case 91:
+ return jjStopAtPos(0, 81);
+ case 93:
+ return jjStopAtPos(0, 82);
+ case 101:
+ return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x0L);
+ case 118:
+ return jjMoveStringLiteralDfa1_0(0x0L, 0x2000000L);
+ case 125:
+ return jjStopAtPos(0, 120);
+ default :
+ return jjMoveNfa_0(6, 0);
+ }
+}
+private final int jjMoveStringLiteralDfa1_0(long active0, long active1)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(0, active0, active1);
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 46:
+ if ((active1 & 0x200000000000L) != 0L)
+ return jjStopAtPos(1, 109);
+ break;
+ case 47:
+ if ((active0 & 0x100000000000000L) != 0L)
+ return jjStopAtPos(1, 56);
+ break;
+ case 97:
+ return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2000000L);
+ case 109:
+ return jjMoveStringLiteralDfa2_0(active0, 0x2000000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(0, active0, active1);
+}
+private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(0, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(1, active0, active1);
+ return 2;
+ }
+ switch(curChar)
+ {
+ case 108:
+ return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2000000L);
+ case 112:
+ return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(1, active0, active1);
+}
+private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(1, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(2, active0, active1);
+ return 3;
+ }
+ switch(curChar)
+ {
+ case 105:
+ return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x2000000L);
+ case 116:
+ return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000L, active1, 0L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(2, active0, active1);
+}
+private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(2, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(3, active0, active1);
+ return 4;
+ }
+ switch(curChar)
+ {
+ case 100:
+ return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000L);
+ case 121:
+ if ((active0 & 0x2000000000000L) != 0L)
+ return jjStartNfaWithStates_0(4, 49, 386);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(3, active0, active1);
+}
+private final int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
+{
+ if (((active0 &= old0) | (active1 &= old1)) == 0L)
+ return jjStartNfa_0(3, old0, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(4, 0L, active1);
+ return 5;
+ }
+ switch(curChar)
+ {
+ case 97:
+ return jjMoveStringLiteralDfa6_0(active1, 0x2000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(4, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa6_0(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_0(4, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(5, 0L, active1);
+ return 6;
+ }
+ switch(curChar)
+ {
+ case 116:
+ return jjMoveStringLiteralDfa7_0(active1, 0x2000000L);
+ default :
+ break;
+ }
+ return jjStartNfa_0(5, 0L, active1);
+}
+private final int jjMoveStringLiteralDfa7_0(long old1, long active1)
+{
+ if (((active1 &= old1)) == 0L)
+ return jjStartNfa_0(5, 0L, old1);
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(6, 0L, active1);
+ return 7;
+ }
+ switch(curChar)
+ {
+ case 101:
+ if ((active1 & 0x2000000L) != 0L)
+ return jjStartNfaWithStates_0(7, 89, 386);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(6, 0L, active1);
+}
+private final int jjMoveNfa_0(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 386;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 330:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ else if ((0x100002600L & l) != 0L)
+ jjCheckNAddTwoStates(357, 358);
+ else if (curChar == 40)
+ {
+ if (kind > 118)
+ kind = 118;
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 355;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 351;
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 348;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ break;
+ case 6:
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 91)
+ kind = 91;
+ jjCheckNAddStates(105, 110);
+ }
+ else if ((0x100002600L & l) != 0L)
+ {
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(29, 30);
+ }
+ else if (curChar == 46)
+ jjCheckNAddTwoStates(384, 385);
+ else if (curChar == 39)
+ jjCheckNAddTwoStates(26, 27);
+ else if (curChar == 34)
+ jjCheckNAddTwoStates(23, 24);
+ else if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 15;
+ break;
+ case 387:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(385, 380);
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(384);
+ }
+ break;
+ case 386:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ else if ((0x100002600L & l) != 0L)
+ jjCheckNAddTwoStates(357, 358);
+ else if (curChar == 40)
+ {
+ if (kind > 118)
+ kind = 118;
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 355;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 351;
+ if ((0x3ff600000000000L & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ }
+ else if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 348;
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ break;
+ case 0:
+ if (curChar == 45)
+ jjCheckNAddTwoStates(1, 4);
+ break;
+ case 1:
+ jjCheckNAddTwoStates(1, 4);
+ break;
+ case 3:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 4:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 5:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 8:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(111, 112);
+ break;
+ case 14:
+ if (curChar == 42)
+ jjstateSet[jjnewStateCnt++] = 15;
+ break;
+ case 15:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 16;
+ break;
+ case 17:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjstateSet[jjnewStateCnt++] = 17;
+ break;
+ case 19:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(113, 114);
+ break;
+ case 20:
+ if (curChar == 40 && kind > 104)
+ kind = 104;
+ break;
+ case 22:
+ if (curChar == 34)
+ jjCheckNAddTwoStates(23, 24);
+ break;
+ case 23:
+ if ((0xfffffffbffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(23, 24);
+ break;
+ case 24:
+ if (curChar != 34)
+ break;
+ if (kind > 106)
+ kind = 106;
+ jjstateSet[jjnewStateCnt++] = 22;
+ break;
+ case 25:
+ if (curChar == 39)
+ jjCheckNAddTwoStates(26, 27);
+ break;
+ case 26:
+ if ((0xffffff7fffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(26, 27);
+ break;
+ case 27:
+ if (curChar != 39)
+ break;
+ if (kind > 106)
+ kind = 106;
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 28:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(29, 30);
+ break;
+ case 29:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(29);
+ break;
+ case 30:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(30);
+ break;
+ case 33:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(115, 116);
+ break;
+ case 34:
+ if (curChar == 58 && kind > 5)
+ kind = 5;
+ break;
+ case 35:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 34;
+ break;
+ case 40:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(117, 118);
+ break;
+ case 46:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(119, 120);
+ break;
+ case 47:
+ if (curChar == 40 && kind > 101)
+ kind = 101;
+ break;
+ case 55:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(121, 122);
+ break;
+ case 56:
+ if (curChar == 58 && kind > 6)
+ kind = 6;
+ break;
+ case 57:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 56;
+ break;
+ case 67:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(123, 124);
+ break;
+ case 68:
+ if (curChar == 58 && kind > 10)
+ kind = 10;
+ break;
+ case 69:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 68;
+ break;
+ case 73:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 72;
+ break;
+ case 76:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 75;
+ break;
+ case 87:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(125, 126);
+ break;
+ case 101:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(127, 128);
+ break;
+ case 116:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(129, 130);
+ break;
+ case 126:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(131, 132);
+ break;
+ case 127:
+ if (curChar == 58 && kind > 7)
+ kind = 7;
+ break;
+ case 128:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 127;
+ break;
+ case 134:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(133, 134);
+ break;
+ case 135:
+ if (curChar == 58 && kind > 13)
+ kind = 13;
+ break;
+ case 136:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 135;
+ break;
+ case 143:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 142;
+ break;
+ case 153:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(135, 136);
+ break;
+ case 154:
+ if (curChar == 58 && kind > 15)
+ kind = 15;
+ break;
+ case 155:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 154;
+ break;
+ case 164:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(137, 138);
+ break;
+ case 165:
+ if (curChar == 40 && kind > 103)
+ kind = 103;
+ break;
+ case 176:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 175;
+ break;
+ case 188:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(139, 140);
+ break;
+ case 189:
+ if (curChar == 58 && kind > 8)
+ kind = 8;
+ break;
+ case 190:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 189;
+ break;
+ case 199:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(141, 142);
+ break;
+ case 200:
+ if (curChar == 58 && kind > 11)
+ kind = 11;
+ break;
+ case 201:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 200;
+ break;
+ case 209:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(143, 144);
+ break;
+ case 210:
+ if (curChar == 58 && kind > 17)
+ kind = 17;
+ break;
+ case 211:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 210;
+ break;
+ case 215:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 214;
+ break;
+ case 218:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 217;
+ break;
+ case 227:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(145, 146);
+ break;
+ case 229:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjAddStates(147, 148);
+ break;
+ case 230:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 231;
+ break;
+ case 232:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(232, 233);
+ break;
+ case 233:
+ if ((0x100002600L & l) != 0L)
+ jjCheckNAddTwoStates(233, 234);
+ break;
+ case 243:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(149, 150);
+ break;
+ case 254:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(151, 152);
+ break;
+ case 255:
+ if (curChar == 58 && kind > 9)
+ kind = 9;
+ break;
+ case 256:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 255;
+ break;
+ case 260:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(153, 154);
+ break;
+ case 261:
+ if (curChar == 36 && kind > 84)
+ kind = 84;
+ break;
+ case 266:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(155, 156);
+ break;
+ case 267:
+ if (curChar == 58 && kind > 12)
+ kind = 12;
+ break;
+ case 268:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 267;
+ break;
+ case 275:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 274;
+ break;
+ case 285:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(157, 158);
+ break;
+ case 286:
+ if (curChar == 58 && kind > 14)
+ kind = 14;
+ break;
+ case 287:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 286;
+ break;
+ case 296:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(159, 160);
+ break;
+ case 297:
+ if (curChar == 36 && kind > 86)
+ kind = 86;
+ break;
+ case 301:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(161, 162);
+ break;
+ case 302:
+ if (curChar == 58 && kind > 16)
+ kind = 16;
+ break;
+ case 303:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 302;
+ break;
+ case 312:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(163, 164);
+ break;
+ case 313:
+ if (curChar == 40 && kind > 100)
+ kind = 100;
+ break;
+ case 318:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(165, 166);
+ break;
+ case 320:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjAddStates(167, 168);
+ break;
+ case 321:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 322;
+ break;
+ case 323:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(323, 324);
+ break;
+ case 324:
+ if ((0x100002600L & l) != 0L)
+ jjCheckNAddTwoStates(324, 325);
+ break;
+ case 332:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(169, 170);
+ break;
+ case 340:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(171, 172);
+ break;
+ case 341:
+ if (curChar == 36 && kind > 85)
+ kind = 85;
+ break;
+ case 346:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ break;
+ case 347:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 348;
+ break;
+ case 348:
+ if (curChar == 42 && kind > 53)
+ kind = 53;
+ break;
+ case 349:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ break;
+ case 350:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 351;
+ break;
+ case 352:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ break;
+ case 353:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ break;
+ case 354:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 355;
+ break;
+ case 356:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ case 357:
+ if ((0x100002600L & l) != 0L)
+ jjCheckNAddTwoStates(357, 358);
+ break;
+ case 358:
+ if (curChar == 40 && kind > 118)
+ kind = 118;
+ break;
+ case 361:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(173, 174);
+ break;
+ case 368:
+ if ((0x100002600L & l) != 0L)
+ jjAddStates(175, 176);
+ break;
+ case 369:
+ if (curChar == 40 && kind > 102)
+ kind = 102;
+ break;
+ case 372:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 91)
+ kind = 91;
+ jjCheckNAddStates(105, 110);
+ break;
+ case 373:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 91)
+ kind = 91;
+ jjCheckNAdd(373);
+ break;
+ case 374:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(374, 375);
+ break;
+ case 375:
+ if (curChar != 46)
+ break;
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(376);
+ break;
+ case 376:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(376);
+ break;
+ case 377:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(177, 179);
+ break;
+ case 378:
+ if (curChar == 46)
+ jjCheckNAddTwoStates(379, 380);
+ break;
+ case 379:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(379, 380);
+ break;
+ case 381:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(382);
+ break;
+ case 382:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 93)
+ kind = 93;
+ jjCheckNAdd(382);
+ break;
+ case 383:
+ if (curChar == 46)
+ jjCheckNAddTwoStates(384, 385);
+ break;
+ case 384:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 92)
+ kind = 92;
+ jjCheckNAdd(384);
+ break;
+ case 385:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(385, 380);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 330:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ if (curChar == 118)
+ jjstateSet[jjnewStateCnt++] = 343;
+ else if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 337;
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 329;
+ break;
+ case 6:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(180, 189);
+ }
+ else if (curChar == 123)
+ jjstateSet[jjnewStateCnt++] = 5;
+ if (curChar == 116)
+ jjAddStates(190, 191);
+ else if (curChar == 101)
+ jjAddStates(192, 194);
+ else if (curChar == 110)
+ jjAddStates(195, 196);
+ else if (curChar == 102)
+ jjAddStates(197, 199);
+ else if (curChar == 115)
+ jjAddStates(200, 201);
+ else if (curChar == 97)
+ jjAddStates(202, 206);
+ else if (curChar == 112)
+ jjAddStates(207, 210);
+ else if (curChar == 100)
+ jjAddStates(211, 215);
+ else if (curChar == 99)
+ jjAddStates(216, 218);
+ else if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 18;
+ else if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 7;
+ break;
+ case 386:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ }
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ break;
+ case 1:
+ if ((0xdfffffffffffffffL & l) != 0L)
+ jjAddStates(65, 66);
+ break;
+ case 2:
+ if (curChar == 125 && kind > 1)
+ kind = 1;
+ break;
+ case 7:
+ if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 8;
+ break;
+ case 9:
+ if (curChar == 101 && kind > 45)
+ kind = 45;
+ break;
+ case 10:
+ if (curChar == 112)
+ jjstateSet[jjnewStateCnt++] = 9;
+ break;
+ case 11:
+ if (curChar == 121)
+ jjstateSet[jjnewStateCnt++] = 10;
+ break;
+ case 12:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 11;
+ break;
+ case 13:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 7;
+ break;
+ case 16:
+ case 17:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(17);
+ break;
+ case 18:
+ if (curChar == 102)
+ jjAddStates(113, 114);
+ break;
+ case 21:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 18;
+ break;
+ case 23:
+ jjAddStates(75, 76);
+ break;
+ case 26:
+ jjAddStates(219, 220);
+ break;
+ case 31:
+ if (curChar == 99)
+ jjAddStates(216, 218);
+ break;
+ case 32:
+ if (curChar == 100)
+ jjAddStates(115, 116);
+ break;
+ case 36:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 32;
+ break;
+ case 37:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 36;
+ break;
+ case 38:
+ if (curChar == 104)
+ jjstateSet[jjnewStateCnt++] = 37;
+ break;
+ case 39:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 40;
+ break;
+ case 41:
+ if (curChar == 115 && kind > 87)
+ kind = 87;
+ break;
+ case 42:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 41;
+ break;
+ case 43:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 39;
+ break;
+ case 44:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 43;
+ break;
+ case 45:
+ if (curChar == 116)
+ jjAddStates(119, 120);
+ break;
+ case 48:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 45;
+ break;
+ case 49:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 48;
+ break;
+ case 50:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 49;
+ break;
+ case 51:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 50;
+ break;
+ case 52:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 51;
+ break;
+ case 53:
+ if (curChar == 100)
+ jjAddStates(211, 215);
+ break;
+ case 54:
+ if (curChar == 116)
+ jjAddStates(121, 122);
+ break;
+ case 58:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 54;
+ break;
+ case 59:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 58;
+ break;
+ case 60:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 59;
+ break;
+ case 61:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 60;
+ break;
+ case 62:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 61;
+ break;
+ case 63:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 62;
+ break;
+ case 64:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 63;
+ break;
+ case 65:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 64;
+ break;
+ case 66:
+ if (curChar == 102)
+ jjAddStates(123, 124);
+ break;
+ case 70:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 66;
+ break;
+ case 71:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 70;
+ break;
+ case 72:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 71;
+ break;
+ case 74:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 73;
+ break;
+ case 75:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 74;
+ break;
+ case 77:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 76;
+ break;
+ case 78:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 77;
+ break;
+ case 79:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 78;
+ break;
+ case 80:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 79;
+ break;
+ case 81:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 80;
+ break;
+ case 82:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 81;
+ break;
+ case 83:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 82;
+ break;
+ case 84:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 83;
+ break;
+ case 85:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 84;
+ break;
+ case 86:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 87;
+ break;
+ case 88:
+ if (curChar == 116 && kind > 43)
+ kind = 43;
+ break;
+ case 89:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 88;
+ break;
+ case 90:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 89;
+ break;
+ case 91:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 90;
+ break;
+ case 92:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 91;
+ break;
+ case 93:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 92;
+ break;
+ case 94:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 93;
+ break;
+ case 95:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 86;
+ break;
+ case 96:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 95;
+ break;
+ case 97:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 96;
+ break;
+ case 98:
+ if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 97;
+ break;
+ case 99:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 98;
+ break;
+ case 100:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 101;
+ break;
+ case 102:
+ if (curChar == 110 && kind > 44)
+ kind = 44;
+ break;
+ case 103:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 102;
+ break;
+ case 104:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 103;
+ break;
+ case 105:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 104;
+ break;
+ case 106:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 105;
+ break;
+ case 107:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 106;
+ break;
+ case 108:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 107;
+ break;
+ case 109:
+ if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 108;
+ break;
+ case 110:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 100;
+ break;
+ case 111:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 110;
+ break;
+ case 112:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 111;
+ break;
+ case 113:
+ if (curChar == 102)
+ jjstateSet[jjnewStateCnt++] = 112;
+ break;
+ case 114:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 113;
+ break;
+ case 115:
+ if (curChar == 116)
+ jjAddStates(129, 130);
+ break;
+ case 117:
+ if (curChar == 123 && kind > 96)
+ kind = 96;
+ break;
+ case 118:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 115;
+ break;
+ case 119:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 118;
+ break;
+ case 120:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 119;
+ break;
+ case 121:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 120;
+ break;
+ case 122:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 121;
+ break;
+ case 123:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 122;
+ break;
+ case 124:
+ if (curChar == 112)
+ jjAddStates(207, 210);
+ break;
+ case 125:
+ if (curChar == 116)
+ jjAddStates(131, 132);
+ break;
+ case 129:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 125;
+ break;
+ case 130:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 129;
+ break;
+ case 131:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 130;
+ break;
+ case 132:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 131;
+ break;
+ case 133:
+ if (curChar == 103)
+ jjAddStates(133, 134);
+ break;
+ case 137:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 133;
+ break;
+ case 138:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 137;
+ break;
+ case 139:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 138;
+ break;
+ case 140:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 139;
+ break;
+ case 141:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 140;
+ break;
+ case 142:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 141;
+ break;
+ case 144:
+ if (curChar == 103)
+ jjstateSet[jjnewStateCnt++] = 143;
+ break;
+ case 145:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 144;
+ break;
+ case 146:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 145;
+ break;
+ case 147:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 146;
+ break;
+ case 148:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 147;
+ break;
+ case 149:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 148;
+ break;
+ case 150:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 149;
+ break;
+ case 151:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 150;
+ break;
+ case 152:
+ if (curChar == 103)
+ jjAddStates(135, 136);
+ break;
+ case 156:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 152;
+ break;
+ case 157:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 156;
+ break;
+ case 158:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 157;
+ break;
+ case 159:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 158;
+ break;
+ case 160:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 159;
+ break;
+ case 161:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 160;
+ break;
+ case 162:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 161;
+ break;
+ case 163:
+ if (curChar == 110)
+ jjAddStates(137, 138);
+ break;
+ case 166:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 163;
+ break;
+ case 167:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 166;
+ break;
+ case 168:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 167;
+ break;
+ case 169:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 168;
+ break;
+ case 170:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 169;
+ break;
+ case 171:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 170;
+ break;
+ case 172:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 171;
+ break;
+ case 173:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 172;
+ break;
+ case 174:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 173;
+ break;
+ case 175:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 174;
+ break;
+ case 177:
+ if (curChar == 103)
+ jjstateSet[jjnewStateCnt++] = 176;
+ break;
+ case 178:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 177;
+ break;
+ case 179:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 178;
+ break;
+ case 180:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 179;
+ break;
+ case 181:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 180;
+ break;
+ case 182:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 181;
+ break;
+ case 183:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 182;
+ break;
+ case 184:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 183;
+ break;
+ case 185:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 184;
+ break;
+ case 186:
+ if (curChar == 97)
+ jjAddStates(202, 206);
+ break;
+ case 187:
+ if (curChar == 101)
+ jjAddStates(139, 140);
+ break;
+ case 191:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 187;
+ break;
+ case 192:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 191;
+ break;
+ case 193:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 192;
+ break;
+ case 194:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 193;
+ break;
+ case 195:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 194;
+ break;
+ case 196:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 195;
+ break;
+ case 197:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 196;
+ break;
+ case 198:
+ if (curChar == 114)
+ jjAddStates(141, 142);
+ break;
+ case 202:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 198;
+ break;
+ case 203:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 202;
+ break;
+ case 204:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 203;
+ break;
+ case 205:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 204;
+ break;
+ case 206:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 205;
+ break;
+ case 207:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 206;
+ break;
+ case 208:
+ if (curChar == 102)
+ jjAddStates(143, 144);
+ break;
+ case 212:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 208;
+ break;
+ case 213:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 212;
+ break;
+ case 214:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 213;
+ break;
+ case 216:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 215;
+ break;
+ case 217:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 216;
+ break;
+ case 219:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 218;
+ break;
+ case 220:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 219;
+ break;
+ case 221:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 220;
+ break;
+ case 222:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 221;
+ break;
+ case 223:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 222;
+ break;
+ case 224:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 223;
+ break;
+ case 225:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 224;
+ break;
+ case 226:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 227;
+ break;
+ case 228:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(221, 224);
+ break;
+ case 229:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(229, 230);
+ break;
+ case 231:
+ case 232:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(232, 233);
+ break;
+ case 234:
+ if (curChar == 123 && kind > 40)
+ kind = 40;
+ break;
+ case 235:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 226;
+ break;
+ case 236:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 235;
+ break;
+ case 237:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 236;
+ break;
+ case 238:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 237;
+ break;
+ case 239:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 238;
+ break;
+ case 240:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 239;
+ break;
+ case 241:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 240;
+ break;
+ case 242:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 243;
+ break;
+ case 244:
+ if (curChar == 123 && kind > 42)
+ kind = 42;
+ break;
+ case 245:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 242;
+ break;
+ case 246:
+ if (curChar == 117)
+ jjstateSet[jjnewStateCnt++] = 245;
+ break;
+ case 247:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 246;
+ break;
+ case 248:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 247;
+ break;
+ case 249:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 248;
+ break;
+ case 250:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 249;
+ break;
+ case 251:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 250;
+ break;
+ case 252:
+ if (curChar == 115)
+ jjAddStates(200, 201);
+ break;
+ case 253:
+ if (curChar == 102)
+ jjAddStates(151, 152);
+ break;
+ case 257:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 253;
+ break;
+ case 258:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 257;
+ break;
+ case 259:
+ if (curChar == 101)
+ jjAddStates(153, 154);
+ break;
+ case 262:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 259;
+ break;
+ case 263:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 262;
+ break;
+ case 264:
+ if (curChar == 102)
+ jjAddStates(197, 199);
+ break;
+ case 265:
+ if (curChar == 103)
+ jjAddStates(155, 156);
+ break;
+ case 269:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 265;
+ break;
+ case 270:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 269;
+ break;
+ case 271:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 270;
+ break;
+ case 272:
+ if (curChar == 98)
+ jjstateSet[jjnewStateCnt++] = 271;
+ break;
+ case 273:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 272;
+ break;
+ case 274:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 273;
+ break;
+ case 276:
+ if (curChar == 103)
+ jjstateSet[jjnewStateCnt++] = 275;
+ break;
+ case 277:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 276;
+ break;
+ case 278:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 277;
+ break;
+ case 279:
+ if (curChar == 119)
+ jjstateSet[jjnewStateCnt++] = 278;
+ break;
+ case 280:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 279;
+ break;
+ case 281:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 280;
+ break;
+ case 282:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 281;
+ break;
+ case 283:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 282;
+ break;
+ case 284:
+ if (curChar == 103)
+ jjAddStates(157, 158);
+ break;
+ case 288:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 284;
+ break;
+ case 289:
+ if (curChar == 105)
+ jjstateSet[jjnewStateCnt++] = 288;
+ break;
+ case 290:
+ if (curChar == 119)
+ jjstateSet[jjnewStateCnt++] = 289;
+ break;
+ case 291:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 290;
+ break;
+ case 292:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 291;
+ break;
+ case 293:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 292;
+ break;
+ case 294:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 293;
+ break;
+ case 295:
+ if (curChar == 114)
+ jjAddStates(159, 160);
+ break;
+ case 298:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 295;
+ break;
+ case 299:
+ if (curChar == 110)
+ jjAddStates(195, 196);
+ break;
+ case 300:
+ if (curChar == 101)
+ jjAddStates(161, 162);
+ break;
+ case 304:
+ if (curChar == 99)
+ jjstateSet[jjnewStateCnt++] = 300;
+ break;
+ case 305:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 304;
+ break;
+ case 306:
+ if (curChar == 112)
+ jjstateSet[jjnewStateCnt++] = 305;
+ break;
+ case 307:
+ if (curChar == 115)
+ jjstateSet[jjnewStateCnt++] = 306;
+ break;
+ case 308:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 307;
+ break;
+ case 309:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 308;
+ break;
+ case 310:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 309;
+ break;
+ case 311:
+ if (curChar == 101)
+ jjAddStates(163, 164);
+ break;
+ case 314:
+ if (curChar == 100)
+ jjstateSet[jjnewStateCnt++] = 311;
+ break;
+ case 315:
+ if (curChar == 111)
+ jjstateSet[jjnewStateCnt++] = 314;
+ break;
+ case 316:
+ if (curChar == 101)
+ jjAddStates(192, 194);
+ break;
+ case 317:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 318;
+ break;
+ case 319:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(225, 228);
+ break;
+ case 320:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(320, 321);
+ break;
+ case 322:
+ case 323:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(323, 324);
+ break;
+ case 325:
+ if (curChar == 123 && kind > 39)
+ kind = 39;
+ break;
+ case 326:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 317;
+ break;
+ case 327:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 326;
+ break;
+ case 328:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 327;
+ break;
+ case 329:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 328;
+ break;
+ case 331:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 332;
+ break;
+ case 333:
+ if (curChar == 123 && kind > 41)
+ kind = 41;
+ break;
+ case 334:
+ if (curChar == 110)
+ jjstateSet[jjnewStateCnt++] = 331;
+ break;
+ case 335:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 334;
+ break;
+ case 336:
+ if (curChar == 109)
+ jjstateSet[jjnewStateCnt++] = 335;
+ break;
+ case 337:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 336;
+ break;
+ case 338:
+ if (curChar == 108)
+ jjstateSet[jjnewStateCnt++] = 337;
+ break;
+ case 339:
+ if (curChar == 121)
+ jjAddStates(171, 172);
+ break;
+ case 342:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 339;
+ break;
+ case 343:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 342;
+ break;
+ case 344:
+ if (curChar == 118)
+ jjstateSet[jjnewStateCnt++] = 343;
+ break;
+ case 345:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(180, 189);
+ break;
+ case 346:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ break;
+ case 349:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ break;
+ case 351:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ break;
+ case 352:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ break;
+ case 353:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ break;
+ case 355:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ case 356:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ case 359:
+ if (curChar == 116)
+ jjAddStates(190, 191);
+ break;
+ case 360:
+ if (curChar == 116)
+ jjstateSet[jjnewStateCnt++] = 361;
+ break;
+ case 362:
+ if (curChar == 115 && kind > 88)
+ kind = 88;
+ break;
+ case 363:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 362;
+ break;
+ case 364:
+ if (curChar == 97)
+ jjstateSet[jjnewStateCnt++] = 360;
+ break;
+ case 365:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 364;
+ break;
+ case 366:
+ if (curChar == 114)
+ jjstateSet[jjnewStateCnt++] = 365;
+ break;
+ case 367:
+ if (curChar == 116)
+ jjAddStates(175, 176);
+ break;
+ case 370:
+ if (curChar == 120)
+ jjstateSet[jjnewStateCnt++] = 367;
+ break;
+ case 371:
+ if (curChar == 101)
+ jjstateSet[jjnewStateCnt++] = 370;
+ break;
+ case 380:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(229, 230);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 330:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ }
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ case 6:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAddStates(180, 189);
+ break;
+ case 386:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ {
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ }
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ case 1:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(65, 66);
+ break;
+ case 16:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(17);
+ break;
+ case 17:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 54)
+ kind = 54;
+ jjCheckNAdd(17);
+ break;
+ case 23:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(75, 76);
+ break;
+ case 26:
+ if ((jjbitVec2[i2] & l2) != 0L)
+ jjAddStates(219, 220);
+ break;
+ case 228:
+ if ((jjbitVec5[i2] & l2) != 0L)
+ jjCheckNAddStates(221, 224);
+ break;
+ case 229:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(229, 230);
+ break;
+ case 231:
+ if ((jjbitVec5[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(232, 233);
+ break;
+ case 232:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(232, 233);
+ break;
+ case 319:
+ if ((jjbitVec5[i2] & l2) != 0L)
+ jjCheckNAddStates(225, 228);
+ break;
+ case 320:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(320, 321);
+ break;
+ case 322:
+ if ((jjbitVec5[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(323, 324);
+ break;
+ case 323:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(323, 324);
+ break;
+ case 346:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(346, 347);
+ break;
+ case 349:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(349, 350);
+ break;
+ case 351:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ break;
+ case 352:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 115)
+ kind = 115;
+ jjCheckNAdd(352);
+ break;
+ case 353:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(353, 354);
+ break;
+ case 355:
+ if ((jjbitVec5[i2] & l2) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ case 356:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddStates(102, 104);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 386 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_13(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_13(int pos, long active0, long active1)
+{
+ return jjMoveNfa_13(jjStopStringLiteralDfa_13(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_13(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_13(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_13()
+{
+ switch(curChar)
+ {
+ case 123:
+ return jjStopAtPos(0, 119);
+ default :
+ return jjMoveNfa_13(0, 0);
+ }
+}
+private final int jjMoveNfa_13(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xffffffff00002600L & l) != 0L)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_12(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_12(int pos, long active0, long active1)
+{
+ return jjMoveNfa_12(jjStopStringLiteralDfa_12(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_12(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_12(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_12()
+{
+ switch(curChar)
+ {
+ case 123:
+ return jjStopAtPos(0, 119);
+ default :
+ return jjMoveNfa_12(0, 0);
+ }
+}
+private final int jjMoveNfa_12(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xffffffff00002600L & l) != 0L)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec2[i2] & l2) != 0L && kind > 121)
+ kind = 121;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_7(int pos, long active0, long active1)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_7(int pos, long active0, long active1)
+{
+ return jjMoveNfa_7(jjStopStringLiteralDfa_7(pos, active0, active1), pos + 1);
+}
+private final int jjStartNfaWithStates_7(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_7(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_7()
+{
+ switch(curChar)
+ {
+ case 40:
+ return jjStopAtPos(0, 117);
+ default :
+ return jjMoveNfa_7(0, 0);
+ }
+}
+private final int jjMoveNfa_7(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 8;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAddTwoStates(6, 7);
+ break;
+ case 1:
+ if ((0x3ff600000000000L & l) != 0L)
+ jjAddStates(95, 96);
+ break;
+ case 2:
+ if (curChar == 58)
+ jjstateSet[jjnewStateCnt++] = 3;
+ break;
+ case 4:
+ if ((0x3ff600000000000L & l) == 0L)
+ break;
+ if (kind > 116)
+ kind = 116;
+ jjstateSet[jjnewStateCnt++] = 4;
+ break;
+ case 6:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 2)
+ kind = 2;
+ jjCheckNAdd(6);
+ break;
+ case 7:
+ if ((0x100002600L & l) == 0L)
+ break;
+ if (kind > 4)
+ kind = 4;
+ jjCheckNAdd(7);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 116)
+ kind = 116;
+ jjCheckNAddStates(99, 101);
+ break;
+ case 1:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 3:
+ case 4:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 116)
+ kind = 116;
+ jjCheckNAdd(4);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 116)
+ kind = 116;
+ jjCheckNAddStates(99, 101);
+ break;
+ case 1:
+ if ((jjbitVec28[i2] & l2) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 3:
+ if ((jjbitVec5[i2] & l2) == 0L)
+ break;
+ if (kind > 116)
+ kind = 116;
+ jjCheckNAdd(4);
+ break;
+ case 4:
+ if ((jjbitVec28[i2] & l2) == 0L)
+ break;
+ if (kind > 116)
+ kind = 116;
+ jjCheckNAdd(4);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 8 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+static final int[] jjnextStates = {
+ 1, 3, 12, 13, 22, 24, 29, 30, 38, 40, 50, 52, 71, 73, 79, 81,
+ 98, 100, 109, 110, 133, 135, 144, 146, 154, 156, 173, 175, 192, 194, 204, 206,
+ 215, 216, 220, 221, 223, 224, 220, 221, 223, 224, 226, 213, 218, 190, 201, 142,
+ 152, 170, 77, 96, 107, 130, 48, 68, 27, 35, 1, 6, 20, 21, 23, 24,
+ 26, 1, 4, 68, 69, 70, 72, 73, 75, 12, 16, 23, 24, 36, 37, 41,
+ 42, 72, 73, 75, 60, 61, 63, 64, 66, 51, 52, 54, 55, 76, 77, 1,
+ 2, 4, 5, 1, 2, 4, 356, 357, 358, 373, 374, 375, 377, 378, 380, 8,
+ 12, 19, 20, 33, 35, 40, 42, 46, 47, 55, 57, 67, 69, 87, 94, 101,
+ 109, 116, 117, 126, 128, 134, 136, 153, 155, 164, 165, 188, 190, 199, 201, 209,
+ 211, 227, 228, 229, 230, 243, 244, 254, 256, 260, 261, 266, 268, 285, 287, 296,
+ 297, 301, 303, 312, 313, 318, 319, 320, 321, 332, 333, 340, 341, 361, 363, 368,
+ 369, 377, 378, 380, 346, 347, 349, 350, 352, 353, 354, 356, 357, 358, 366, 371,
+ 330, 338, 344, 310, 315, 283, 294, 298, 258, 263, 197, 207, 225, 241, 251, 132,
+ 151, 162, 185, 65, 85, 99, 114, 123, 38, 44, 52, 26, 27, 229, 230, 232,
+ 233, 320, 321, 323, 324, 381, 382,
+};
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, null, null, "\157\162", "\141\156\144", "\144\151\166",
+"\151\144\151\166", "\155\157\144", "\52", "\151\156", "\163\141\164\151\163\146\151\145\163",
+"\162\145\164\165\162\156", "\164\150\145\156", "\145\154\163\145", "\164\157",
+"\151\156\164\145\162\163\145\143\164", "\165\156\151\157\156", "\145\170\143\145\160\164",
+"\160\162\145\143\145\144\145\163", "\146\157\154\154\157\167\163", null, "\151\164\145\155",
+"\145\154\145\155\145\156\164", "\141\164\164\162\151\142\165\164\145", null, null, null, null, null, null,
+null, null, "\164\171\160\145", "\156\157\144\145", "\145\155\160\164\171", null,
+null, "\52", null, null, "\57", "\57\57", "\57", "\57\57", "\75", "\151\163",
+"\41\75", "\151\163\156\157\164", "\74\75", "\74\74", "\76\75", "\76\76", "\145\161",
+"\156\145", "\147\164", "\147\145", "\154\164", "\154\145", "\74", "\76", "\55", "\53",
+"\77", "\174", "\50", "\100", "\133", "\135", "\51", null, null, null, null, null,
+"\166\141\154\151\144\141\164\145", null, null, null, null, "\143\157\155\155\145\156\164",
+"\144\157\143\165\155\145\156\164", null, "\164\145\170\164", "\165\156\164\171\160\145\144",
+"\160\162\157\143\145\163\163\151\156\147\55\151\156\163\164\162\165\143\164\151\157\156", null, null, null, null, null, "\54", null, null, "\56", "\56\56", null, null,
+null, "\44", null, null, null, "\50", null, "\173", "\175", null, null, null, null,
+null, null, null, null, };
+public static final String[] lexStateNames = {
+ "DEFAULT",
+ "ELEMENT_CONTENT",
+ "OPERATOR",
+ "QNAME",
+ "NAMESPACEDECL",
+ "XMLSPACE_DECL",
+ "ITEMTYPE",
+ "FUNCDEF",
+ "NAMESPACEKEYWORD",
+ "START_TAG",
+ "END_TAG",
+ "VARNAME",
+ "QUOT_ATTRIBUTE_CONTENT",
+ "APOS_ATTRIBUTE_CONTENT",
+ "CDATA_SECTION",
+ "PROCESSING_INSTRUCTION",
+ "XML_COMMENT",
+ "XQUERY_COMMENT",
+};
+public static final int[] jjnewLexState = {
+ -1, -1, -1, -1, -1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, -1, -1, -1, -1, 8, 8, 3, 0, 0, 0, -1,
+ -1, -1, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 2, 2, 11, 11, 11, 6, 6, 2, -1, 2, 2, 2, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, 2, 0, 2, 2, -1, -1, -1, 11, 2, 2, -1, 6, -1, 0, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+};
+static final long[] jjtoToken = {
+ 0xfff3fffffffffff1L, 0x3fe3ffffbffffffL, 0x0L,
+};
+static final long[] jjtoSkip = {
+ 0x6L, 0x0L, 0x0L,
+};
+static final long[] jjtoSpecial = {
+ 0x2L, 0x0L, 0x0L,
+};
+private ASCII_CharStream input_stream;
+private final int[] jjrounds = new int[386];
+private final int[] jjstateSet = new int[772];
+StringBuffer image;
+int jjimageLen;
+int lengthOfMatch;
+protected char curChar;
+public XPathTokenManager(ASCII_CharStream stream)
+{
+ if (ASCII_CharStream.staticFlag)
+ throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+ input_stream = stream;
+}
+public XPathTokenManager(ASCII_CharStream stream, int lexState)
+{
+ this(stream);
+ SwitchTo(lexState);
+}
+public void ReInit(ASCII_CharStream stream)
+{
+ jjmatchedPos = jjnewStateCnt = 0;
+ curLexState = defaultLexState;
+ input_stream = stream;
+ ReInitRounds();
+}
+private final void ReInitRounds()
+{
+ int i;
+ jjround = 0x80000001;
+ for (i = 386; i-- > 0;)
+ jjrounds[i] = 0x80000000;
+}
+public void ReInit(ASCII_CharStream stream, int lexState)
+{
+ ReInit(stream);
+ SwitchTo(lexState);
+}
+public void SwitchTo(int lexState)
+{
+ if (lexState >= 18 || lexState < 0)
+ throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+ else
+ curLexState = lexState;
+}
+
+private final Token jjFillToken()
+{
+ Token t = Token.newToken(jjmatchedKind);
+ t.kind = jjmatchedKind;
+ String im = jjstrLiteralImages[jjmatchedKind];
+ t.image = (im == null) ? input_stream.GetImage() : im;
+ t.beginLine = input_stream.getBeginLine();
+ t.beginColumn = input_stream.getBeginColumn();
+ t.endLine = input_stream.getEndLine();
+ t.endColumn = input_stream.getEndColumn();
+ return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+public final Token getNextToken()
+{
+ int kind;
+ Token specialToken = null;
+ Token matchedToken;
+ int curPos = 0;
+
+ EOFLoop :
+ for (;;)
+ {
+ try
+ {
+ curChar = input_stream.BeginToken();
+ }
+ catch(java.io.IOException e)
+ {
+ jjmatchedKind = 0;
+ matchedToken = jjFillToken();
+ matchedToken.specialToken = specialToken;
+ return matchedToken;
+ }
+ image = null;
+ jjimageLen = 0;
+
+ switch(curLexState)
+ {
+ case 0:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_0();
+ break;
+ case 1:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_1();
+ break;
+ case 2:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_2();
+ break;
+ case 3:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_3();
+ break;
+ case 4:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_4();
+ break;
+ case 5:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_5();
+ break;
+ case 6:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_6();
+ break;
+ case 7:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_7();
+ break;
+ case 8:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_8();
+ break;
+ case 9:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_9();
+ break;
+ case 10:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_10();
+ break;
+ case 11:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_11();
+ break;
+ case 12:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_12();
+ break;
+ case 13:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_13();
+ break;
+ case 14:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_14();
+ break;
+ case 15:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_15();
+ break;
+ case 16:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_16();
+ break;
+ case 17:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_17();
+ break;
+ }
+ if (jjmatchedKind != 0x7fffffff)
+ {
+ if (jjmatchedPos + 1 < curPos)
+ input_stream.backup(curPos - jjmatchedPos - 1);
+ if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ matchedToken = jjFillToken();
+ matchedToken.specialToken = specialToken;
+ TokenLexicalActions(matchedToken);
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ return matchedToken;
+ }
+ else
+ {
+ if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ matchedToken = jjFillToken();
+ if (specialToken == null)
+ specialToken = matchedToken;
+ else
+ {
+ matchedToken.specialToken = specialToken;
+ specialToken = (specialToken.next = matchedToken);
+ }
+ }
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ continue EOFLoop;
+ }
+ }
+ int error_line = input_stream.getEndLine();
+ int error_column = input_stream.getEndColumn();
+ String error_after = null;
+ boolean EOFSeen = false;
+ try { input_stream.readChar(); input_stream.backup(1); }
+ catch (java.io.IOException e1) {
+ EOFSeen = true;
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ if (curChar == '\n' || curChar == '\r') {
+ error_line++;
+ error_column = 0;
+ }
+ else
+ error_column++;
+ }
+ if (!EOFSeen) {
+ input_stream.backup(1);
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ }
+ throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+ }
+}
+
+final void TokenLexicalActions(Token matchedToken)
+{
+ switch(jjmatchedKind)
+ {
+ case 39 :
+ if (image == null)
+ image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ else
+ image.append(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ pushState(DEFAULT);
+ break;
+ case 40 :
+ if (image == null)
+ image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ else
+ image.append(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ pushState(DEFAULT);
+ break;
+ case 41 :
+ if (image == null)
+ image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ else
+ image.append(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ pushState(DEFAULT);
+ break;
+ case 42 :
+ if (image == null)
+ image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ else
+ image.append(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ pushState(DEFAULT);
+ break;
+ case 119 :
+ if (image == null)
+ image = new StringBuffer(jjstrLiteralImages[119]);
+ else
+ image.append(jjstrLiteralImages[119]);
+ pushState();
+ break;
+ case 120 :
+ if (image == null)
+ image = new StringBuffer(jjstrLiteralImages[120]);
+ else
+ image.append(jjstrLiteralImages[120]);
+ popState();
+ break;
+ default :
+ break;
+ }
+}
+}
diff --git a/src/org/apache/xpath/parser/XPathTreeConstants.java b/src/org/apache/xpath/parser/XPathTreeConstants.java
new file mode 100644
index 0000000..dd8b4b4
--- /dev/null
+++ b/src/org/apache/xpath/parser/XPathTreeConstants.java
@@ -0,0 +1,227 @@
+/* Generated By:JJTree: Do not edit this line. F:/xalan3/xml-xalan/java/xpath-src\XPathTreeConstants.java */
+
+package org.apache.xpath.parser;
+
+public interface XPathTreeConstants
+{
+ public int JJTXPATH2 = 0;
+ public int JJTMATCHPATTERN = 1;
+ public int JJTEXPRSEQUENCE = 2;
+ public int JJTPATTERN = 3;
+ public int JJTPATHPATTERN = 4;
+ public int JJTROOT = 5;
+ public int JJTROOTDESCENDANTS = 6;
+ public int JJTSLASH = 7;
+ public int JJTSLASHSLASH = 8;
+ public int JJTVOID = 9;
+ public int JJTPATTERNSTEP = 10;
+ public int JJTAXISCHILD = 11;
+ public int JJTAXISATTRIBUTE = 12;
+ public int JJTAT = 13;
+ public int JJTIDKEYPATTERN = 14;
+ public int JJTQNAMELPAR = 15;
+ public int JJTVARNAME = 16;
+ public int JJTOREXPR = 17;
+ public int JJTANDEXPR = 18;
+ public int JJTFLWREXPR = 19;
+ public int JJTRETURN = 20;
+ public int JJTQUANTIFIEDEXPR = 21;
+ public int JJTSOME = 22;
+ public int JJTEVERY = 23;
+ public int JJTIN = 24;
+ public int JJTSATISFIES = 25;
+ public int JJTIFEXPR = 26;
+ public int JJTIFLPAR = 27;
+ public int JJTTHEN = 28;
+ public int JJTELSE = 29;
+ public int JJTINSTANCEOFEXPR = 30;
+ public int JJTINSTANCEOF = 31;
+ public int JJTCOMPARISONEXPR = 32;
+ public int JJTRANGEEXPR = 33;
+ public int JJTADDITIVEEXPR = 34;
+ public int JJTMULTIPLICATIVEEXPR = 35;
+ public int JJTUNIONEXPR = 36;
+ public int JJTINTERSECTEXCEPTEXPR = 37;
+ public int JJTUNARYEXPR = 38;
+ public int JJTMINUS = 39;
+ public int JJTPLUS = 40;
+ public int JJTPATHEXPR = 41;
+ public int JJTSTEPEXPR = 42;
+ public int JJTFORCLAUSE = 43;
+ public int JJTVALIDATEEXPR = 44;
+ public int JJTVALIDATE = 45;
+ public int JJTLBRACE = 46;
+ public int JJTRBRACE = 47;
+ public int JJTCASTEXPR = 48;
+ public int JJTCASTAS = 49;
+ public int JJTTREATAS = 50;
+ public int JJTAXISDESCENDANT = 51;
+ public int JJTAXISSELF = 52;
+ public int JJTAXISDESCENDANTORSELF = 53;
+ public int JJTAXISFOLLOWINGSIBLING = 54;
+ public int JJTAXISFOLLOWING = 55;
+ public int JJTAXISNAMESPACE = 56;
+ public int JJTAXISPARENT = 57;
+ public int JJTAXISANCESTOR = 58;
+ public int JJTAXISPRECEDINGSIBLING = 59;
+ public int JJTAXISPRECEDING = 60;
+ public int JJTAXISANCESTORORSELF = 61;
+ public int JJTNODETEST = 62;
+ public int JJTNAMETEST = 63;
+ public int JJTQNAME = 64;
+ public int JJTSTAR = 65;
+ public int JJTNCNAMECOLONSTAR = 66;
+ public int JJTSTARCOLONNCNAME = 67;
+ public int JJTKINDTEST = 68;
+ public int JJTPROCESSINGINSTRUCTIONTEST = 69;
+ public int JJTSTRINGLITERAL = 70;
+ public int JJTCOMMENTTEST = 71;
+ public int JJTTEXTTEST = 72;
+ public int JJTANYKINDTEST = 73;
+ public int JJTABBREVIATEDFORWARDSTEP = 74;
+ public int JJTDOT = 75;
+ public int JJTDOTDOT = 76;
+ public int JJTPREDICATES = 77;
+ public int JJTLBRACK = 78;
+ public int JJTRBRACK = 79;
+ public int JJTINTEGERLITERAL = 80;
+ public int JJTDECIMALLITERAL = 81;
+ public int JJTDOUBLELITERAL = 82;
+ public int JJTFUNCTIONCALL = 83;
+ public int JJTSCHEMACONTEXT = 84;
+ public int JJTSCHEMAGLOBALCONTEXT = 85;
+ public int JJTTYPE = 86;
+ public int JJTSCHEMACONTEXTSTEP = 87;
+ public int JJTSEQUENCETYPE = 88;
+ public int JJTEMPTY = 89;
+ public int JJTITEMTYPE = 90;
+ public int JJTELEMENTTYPE = 91;
+ public int JJTATTRIBUTETYPE = 92;
+ public int JJTNODE = 93;
+ public int JJTPROCESSINGINSTRUCTION = 94;
+ public int JJTCOMMENT = 95;
+ public int JJTTEXT = 96;
+ public int JJTDOCUMENT = 97;
+ public int JJTITEM = 98;
+ public int JJTUNTYPED = 99;
+ public int JJTATOMICVALUE = 100;
+ public int JJTELEMORATTRTYPE = 101;
+ public int JJTSCHEMATYPE = 102;
+ public int JJTOFTYPE = 103;
+ public int JJTATOMICTYPE = 104;
+ public int JJTOCCURRENCEINDICATOR = 105;
+ public int JJTMULTIPLY = 106;
+ public int JJTQMARK = 107;
+
+
+ public String[] jjtNodeName = {
+ "XPath2",
+ "MatchPattern",
+ "ExprSequence",
+ "Pattern",
+ "PathPattern",
+ "Root",
+ "RootDescendants",
+ "Slash",
+ "SlashSlash",
+ "void",
+ "PatternStep",
+ "AxisChild",
+ "AxisAttribute",
+ "At",
+ "IdKeyPattern",
+ "QNameLpar",
+ "VarName",
+ "OrExpr",
+ "AndExpr",
+ "FLWRExpr",
+ "Return",
+ "QuantifiedExpr",
+ "Some",
+ "Every",
+ "In",
+ "Satisfies",
+ "IfExpr",
+ "IfLpar",
+ "Then",
+ "Else",
+ "InstanceofExpr",
+ "Instanceof",
+ "ComparisonExpr",
+ "RangeExpr",
+ "AdditiveExpr",
+ "MultiplicativeExpr",
+ "UnionExpr",
+ "IntersectExceptExpr",
+ "UnaryExpr",
+ "Minus",
+ "Plus",
+ "PathExpr",
+ "StepExpr",
+ "ForClause",
+ "ValidateExpr",
+ "Validate",
+ "Lbrace",
+ "Rbrace",
+ "CastExpr",
+ "CastAs",
+ "TreatAs",
+ "AxisDescendant",
+ "AxisSelf",
+ "AxisDescendantOrSelf",
+ "AxisFollowingSibling",
+ "AxisFollowing",
+ "AxisNamespace",
+ "AxisParent",
+ "AxisAncestor",
+ "AxisPrecedingSibling",
+ "AxisPreceding",
+ "AxisAncestorOrSelf",
+ "NodeTest",
+ "NameTest",
+ "QName",
+ "Star",
+ "NCNameColonStar",
+ "StarColonNCName",
+ "KindTest",
+ "ProcessingInstructionTest",
+ "StringLiteral",
+ "CommentTest",
+ "TextTest",
+ "AnyKindTest",
+ "AbbreviatedForwardStep",
+ "Dot",
+ "DotDot",
+ "Predicates",
+ "Lbrack",
+ "Rbrack",
+ "IntegerLiteral",
+ "DecimalLiteral",
+ "DoubleLiteral",
+ "FunctionCall",
+ "SchemaContext",
+ "SchemaGlobalContext",
+ "Type",
+ "SchemaContextStep",
+ "SequenceType",
+ "Empty",
+ "ItemType",
+ "ElementType",
+ "AttributeType",
+ "Node",
+ "ProcessingInstruction",
+ "Comment",
+ "Text",
+ "Document",
+ "Item",
+ "Untyped",
+ "AtomicValue",
+ "ElemOrAttrType",
+ "SchemaType",
+ "OfType",
+ "AtomicType",
+ "OccurrenceIndicator",
+ "Multiply",
+ "QMark",
+ };
+}
diff --git a/src/org/apache/xpath/parser/XPathVisitor.java b/src/org/apache/xpath/parser/XPathVisitor.java
new file mode 100644
index 0000000..b126a57
--- /dev/null
+++ b/src/org/apache/xpath/parser/XPathVisitor.java
@@ -0,0 +1,8 @@
+/* Generated By:JJTree: Do not edit this line. F:/xalan3/xml-xalan/java/xpath-src\XPathVisitor.java */
+
+package org.apache.xpath.parser;
+
+public interface XPathVisitor
+{
+ public Object visit(SimpleNode node, Object data);
+}
diff --git a/src/org/apache/xpath/patterns/ContextMatchStepPattern.java b/src/org/apache/xpath/patterns/ContextMatchStepPattern.java
index 8e0c93e..5d22abf 100644
--- a/src/org/apache/xpath/patterns/ContextMatchStepPattern.java
+++ b/src/org/apache/xpath/patterns/ContextMatchStepPattern.java
@@ -71,16 +71,24 @@
public class ContextMatchStepPattern extends StepPattern
{
+// /**
+// * Construct a ContextMatchStepPattern.
+// *
+// * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
+// */
+// public ContextMatchStepPattern(int axis, int paxis)
+// {
+// super(DTMFilter.SHOW_ALL, axis, paxis);
+// }
+
/**
* Construct a ContextMatchStepPattern.
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
*/
- public ContextMatchStepPattern(int axis, int paxis)
+ public ContextMatchStepPattern()
{
- super(DTMFilter.SHOW_ALL, axis, paxis);
}
+
/**
* Execute this pattern step, including predicates.
*
diff --git a/src/org/apache/xpath/patterns/FunctionPattern.java b/src/org/apache/xpath/patterns/FunctionPattern.java
index ffbffba..4ff02ba 100644
--- a/src/org/apache/xpath/patterns/FunctionPattern.java
+++ b/src/org/apache/xpath/patterns/FunctionPattern.java
@@ -61,13 +61,15 @@
import javax.xml.transform.TransformerException;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.utils.QName;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.objects.XNumber;
import org.apache.xpath.objects.XObject;
-import org.apache.xpath.patterns.StepPattern.PredOwner;
+import org.apache.xpath.parser.Node;
/**
* <meta name="usage" content="advanced"/>
@@ -76,22 +78,30 @@
public class FunctionPattern extends StepPattern
{
+// /**
+// * Construct a FunctionPattern from a
+// * {@link org.apache.xpath.functions.Function expression}.
+// *
+// *
+// * @param a should be a {@link org.apache.xpath.functions.Function expression}.
+// *
+// * NEEDSDOC @param expr
+// */
+// public FunctionPattern(Expression expr, int axis, int predaxis)
+// {
+//
+// super(0, null, null, axis, predaxis);
+//
+// m_functionExpr = expr;
+// }
+
/**
- * Construct a FunctionPattern from a
- * {@link org.apache.xpath.functions.Function expression}.
- *
- *
- * @param a should be a {@link org.apache.xpath.functions.Function expression}.
- *
- * NEEDSDOC @param expr
+ * Construct a FunctionPattern.
*/
- public FunctionPattern(Expression expr, int axis, int predaxis)
+ public FunctionPattern()
{
-
- super(0, null, null, axis, predaxis);
-
- m_functionExpr = expr;
}
+
/**
* Static calc of match score.
@@ -109,7 +119,41 @@
* Should be a {@link org.apache.xpath.functions.Function expression}.
* @serial
*/
- Expression m_functionExpr;
+ protected Expression m_functionExpr;
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setFunctionExpression(Expression exp)
+ {
+ exp.exprSetParent(this);
+ m_functionExpr = exp;
+ }
+
+ /**
+ * Add parameters to the function expression.
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ if(!(n instanceof org.apache.xpath.parser.QName))
+ {
+ m_functionExpr.jjtAddChild(n, i-1);
+ }
+ }
+
+// public void jjtClose()
+// {
+// if(
+// }
+
+ public Node jjtGetChild(int i)
+ {
+ return m_functionExpr.jjtGetChild(i);
+ }
+
+ public int jjtGetNumChildren() {
+ return m_functionExpr.jjtGetNumChildren();
+ }
/**
* This function is used to fixup variables from QNames to stack frame
@@ -121,10 +165,10 @@
* in the stack frame (but variables above the globalsTop value will need
* to be offset to the current stack frame).
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
- m_functionExpr.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
+ m_functionExpr.fixupVariables(vcs);
}
@@ -286,5 +330,18 @@
m_functionExpr.callVisitors(new FunctionOwner(), visitor);
super.callSubtreeVisitors(visitor);
}
+
+ /**
+ * Get the string represenentation of this step for diagnostic purposes.
+ *
+ *
+ * @return A string representation of this step, built by reverse-engineering
+ * the contained info.
+ */
+ public String toString()
+ {
+ return m_functionExpr.toString();
+ }
+
}
diff --git a/src/org/apache/xpath/patterns/NodeTest.java b/src/org/apache/xpath/patterns/NodeTest.java
index c18a072..31a5b64 100644
--- a/src/org/apache/xpath/patterns/NodeTest.java
+++ b/src/org/apache/xpath/patterns/NodeTest.java
@@ -61,13 +61,13 @@
import javax.xml.transform.TransformerException;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMFilter;
-import org.apache.xml.dtm.ref.ExpandedNameTable;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPath;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
-import org.apache.xpath.objects.XNumber;
+import org.apache.xpath.objects.XDouble;
import org.apache.xpath.objects.XObject;
/**
@@ -188,68 +188,68 @@
* {@link #SCORE_OTHER}.
* @serial
*/
- XNumber m_score;
+ XDouble m_score;
/**
* The match score if the pattern consists of just a NodeTest.
* @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
*/
- public static final XNumber SCORE_NODETEST =
- new XNumber(XPath.MATCH_SCORE_NODETEST);
+ public static final XDouble SCORE_NODETEST =
+ new XDouble(XPath.MATCH_SCORE_NODETEST);
/**
* The match score if the pattern pattern has the form NCName:*.
* @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
*/
- public static final XNumber SCORE_NSWILD =
- new XNumber(XPath.MATCH_SCORE_NSWILD);
+ public static final XDouble SCORE_NSWILD =
+ new XDouble(XPath.MATCH_SCORE_NSWILD);
/**
* The match score if the pattern has the form
* of a QName optionally preceded by an @ character.
* @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
*/
- public static final XNumber SCORE_QNAME =
- new XNumber(XPath.MATCH_SCORE_QNAME);
+ public static final XDouble SCORE_QNAME =
+ new XDouble(XPath.MATCH_SCORE_QNAME);
/**
* The match score if the pattern consists of something
* other than just a NodeTest or just a qname.
* @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
*/
- public static final XNumber SCORE_OTHER =
- new XNumber(XPath.MATCH_SCORE_OTHER);
+ public static final XDouble SCORE_OTHER =
+ new XDouble(XPath.MATCH_SCORE_OTHER);
/**
* The match score if no match is made.
* @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
*/
- public static final XNumber SCORE_NONE =
- new XNumber(XPath.MATCH_SCORE_NONE);
+ public static final XDouble SCORE_NONE =
+ new XDouble(XPath.MATCH_SCORE_NONE);
- /**
- * Construct an NodeTest that tests for namespaces and node names.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- * @param namespace The namespace to be tested.
- * @param name The local name to be tested.
- */
- public NodeTest(int whatToShow, String namespace, String name)
- {
- initNodeTest(whatToShow, namespace, name);
- }
-
- /**
- * Construct an NodeTest that doesn't test for node names.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- */
- public NodeTest(int whatToShow)
- {
- initNodeTest(whatToShow);
- }
+// /**
+// * Construct an NodeTest that tests for namespaces and node names.
+// *
+// *
+// * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
+// * @param namespace The namespace to be tested.
+// * @param name The local name to be tested.
+// */
+// public NodeTest(int whatToShow, String namespace, String name)
+// {
+// initNodeTest(whatToShow, namespace, name);
+// }
+//
+// /**
+// * Construct an NodeTest that doesn't test for node names.
+// *
+// *
+// * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
+// */
+// public NodeTest(int whatToShow)
+// {
+// initNodeTest(whatToShow);
+// }
/**
* @see Expression#deepEquals(Expression)
@@ -334,13 +334,13 @@
* True if this test has a null namespace and a local name of {@link #WILD}.
* @serial
*/
- private boolean m_isTotallyWild;
+ boolean m_isTotallyWild;
/**
* Get the static score for this node test.
* @return Should be one of the SCORE_XXX constants.
*/
- public XNumber getStaticScore()
+ public XDouble getStaticScore()
{
return m_score;
}
@@ -349,7 +349,7 @@
* Set the static score for this node test.
* @param score Should be one of the SCORE_XXX constants.
*/
- public void setStaticScore(XNumber score)
+ public void setStaticScore(XDouble score)
{
m_score = score;
}
@@ -715,7 +715,7 @@
/**
* Node tests by themselves do not need to fix up variables.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
// no-op
}
diff --git a/src/org/apache/xpath/patterns/StepPattern.java b/src/org/apache/xpath/patterns/StepPattern.java
index 6dc4244..b055eaf 100644
--- a/src/org/apache/xpath/patterns/StepPattern.java
+++ b/src/org/apache/xpath/patterns/StepPattern.java
@@ -56,6 +56,11 @@
*/
package org.apache.xpath.patterns;
+import java.io.ByteArrayOutputStream;
+import java.io.CharArrayWriter;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
import java.util.Vector;
import javax.xml.transform.TransformerException;
@@ -64,12 +69,16 @@
import org.apache.xml.dtm.DTMAxisTraverser;
import org.apache.xml.dtm.DTMFilter;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.axes.SubContextList;
-import org.apache.xpath.compiler.PsuedoNames;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.PatternAxis;
+import org.apache.xpath.parser.Predicates;
/**
* <meta name="usage" content="advanced"/>
@@ -79,48 +88,86 @@
{
/** The axis for this test. */
- protected int m_axis;
+ protected int m_axis = org.apache.xml.dtm.Axis.SELF;
+
+// /**
+// * Construct a StepPattern that tests for namespaces and node names.
+// *
+// *
+// * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
+// * @param namespace The namespace to be tested.
+// * @param name The local name to be tested.
+// * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
+// * @param axisForPredicate No longer used.
+// */
+// public StepPattern(int whatToShow, String namespace, String name, int axis,
+// int axisForPredicate)
+// {
+//
+// super(whatToShow, namespace, name);
+//
+// m_axis = axis;
+// }
+//
+// /**
+// * Construct a StepPattern that doesn't test for node names.
+// *
+// *
+// * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
+// * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
+// * @param axisForPredicate No longer used.
+// */
+// public StepPattern(int whatToShow, int axis, int axisForPredicate)
+// {
+//
+// super(whatToShow);
+//
+// m_axis = axis;
+// }
/**
- * Construct a StepPattern that tests for namespaces and node names.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- * @param namespace The namespace to be tested.
- * @param name The local name to be tested.
- * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
- * @param axisForPredicate No longer used.
+ * Construct a StepPattern.
*/
- public StepPattern(int whatToShow, String namespace, String name, int axis,
- int axisForPredicate)
+ public StepPattern()
{
-
- super(whatToShow, namespace, name);
-
- m_axis = axis;
}
- /**
- * Construct a StepPattern that doesn't test for node names.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
- * @param axisForPredicate No longer used.
- */
- public StepPattern(int whatToShow, int axis, int axisForPredicate)
- {
-
- super(whatToShow);
-
- m_axis = axis;
- }
/**
* The target local name or psuedo name, for hash table lookup optimization.
* @serial
*/
String m_targetString; // only calculate on head
+
+ /**
+ * Psuedo name for a wild card pattern ('*').
+ */
+ public static final String PSEUDONAME_ANY = "*";
+
+ /**
+ * Psuedo name for the root node.
+ */
+ public static final String PSEUDONAME_ROOT = "/";
+
+ /**
+ * Psuedo name for a text node.
+ */
+ public static final String PSEUDONAME_TEXT = "#text";
+
+ /**
+ * Psuedo name for a comment node.
+ */
+ public static final String PSEUDONAME_COMMENT = "#comment";
+
+ /**
+ * Psuedo name for a processing instruction node.
+ */
+ public static final String PSEUDONAME_PI = "#pi";
+
+ /**
+ * Psuedo name for an unknown type value.
+ */
+ public static final String PSEUDONAME_OTHER = "*";
/**
* Calculate the local name or psuedo name of the node that this pattern will test,
@@ -136,28 +183,28 @@
switch (whatToShow)
{
case DTMFilter.SHOW_COMMENT :
- m_targetString = PsuedoNames.PSEUDONAME_COMMENT;
+ m_targetString = PSEUDONAME_COMMENT;
break;
case DTMFilter.SHOW_TEXT :
case DTMFilter.SHOW_CDATA_SECTION :
case (DTMFilter.SHOW_TEXT | DTMFilter.SHOW_CDATA_SECTION) :
- m_targetString = PsuedoNames.PSEUDONAME_TEXT;
+ m_targetString = PSEUDONAME_TEXT;
break;
case DTMFilter.SHOW_ALL :
- m_targetString = PsuedoNames.PSEUDONAME_ANY;
+ m_targetString = PSEUDONAME_ANY;
break;
case DTMFilter.SHOW_DOCUMENT :
case DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT :
- m_targetString = PsuedoNames.PSEUDONAME_ROOT;
+ m_targetString = PSEUDONAME_ROOT;
break;
case DTMFilter.SHOW_ELEMENT :
if (this.WILD == m_name)
- m_targetString = PsuedoNames.PSEUDONAME_ANY;
+ m_targetString = PSEUDONAME_ANY;
else
m_targetString = m_name;
break;
default :
- m_targetString = PsuedoNames.PSEUDONAME_ANY;
+ m_targetString = PSEUDONAME_ANY;
break;
}
}
@@ -193,22 +240,22 @@
* to be offset to the current stack frame).
* @param globalsSize The number of variables in the global variable area.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
- super.fixupVariables(vars, globalsSize);
+ super.fixupVariables(vcs);
if (null != m_predicates)
{
for (int i = 0; i < m_predicates.length; i++)
{
- m_predicates[i].fixupVariables(vars, globalsSize);
+ m_predicates[i].fixupVariables(vcs);
}
}
if (null != m_relativePathPattern)
{
- m_relativePathPattern.fixupVariables(vars, globalsSize);
+ m_relativePathPattern.fixupVariables(vcs);
}
}
@@ -345,6 +392,9 @@
}
else
super.calcScore();
+
+ if(null != m_relativePathPattern)
+ m_relativePathPattern.calcScore();
if (null == m_targetString)
calcTargetString();
@@ -814,11 +864,24 @@
return result;
}
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ assertion(i == 0, "StepPattern can only have one child!");
+ return m_relativePathPattern;
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ return (null == m_relativePathPattern) ? 0 : 1;
+ }
/**
* Get the string represenentation of this step for diagnostic purposes.
*
- *
* @return A string representation of this step, built by reverse-engineering
* the contained info.
*/
@@ -826,8 +889,9 @@
{
StringBuffer buf = new StringBuffer();
-
- for (StepPattern pat = this; pat != null; pat = pat.m_relativePathPattern)
+
+ StepPattern pat = this;
+ // for (StepPattern pat = this; pat != null; pat = pat.m_relativePathPattern)
{
if (pat != this)
buf.append("/");
@@ -901,7 +965,11 @@
for (int i = 0; i < pat.m_predicates.length; i++)
{
buf.append("[");
- buf.append(pat.m_predicates[i]);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+ pat.m_predicates[i].dump(" ", ps);
+ ps.close();
+ buf.append(baos.toString());
buf.append("]");
}
}
@@ -1053,6 +1121,56 @@
}
/**
+ * This method is called by the parser to add the PatternAxis,
+ * NodeTest, and Predicates. We only use the node the populate
+ * the fields of this class.
+ */
+ public void jjtAddChild(org.apache.xpath.parser.Node n, int index)
+ {
+ if(n instanceof org.apache.xpath.parser.PatternAxis)
+ {
+ m_axis = ((org.apache.xpath.parser.PatternAxis)n).getAxis();
+ if(Axis.ATTRIBUTE == m_axis)
+ {
+ m_whatToShow = DTMFilter.SHOW_ATTRIBUTE;
+ if(0 == index)
+ m_axis = Axis.SELF;
+ }
+ }
+ else if(n instanceof org.apache.xpath.parser.NodeTest)
+ {
+ org.apache.xpath.parser.NodeTest ntest = (org.apache.xpath.parser.NodeTest)n;
+ m_isTotallyWild = ntest.isTotallyWild();
+ m_namespace = ntest.getNamespaceURI();
+ m_name = ntest.getLocalName();
+ if(Axis.ATTRIBUTE == m_axis)
+ m_whatToShow = DTMFilter.SHOW_ATTRIBUTE;
+ else
+ m_whatToShow = ntest.getWhatToShow();
+ }
+ else if(n instanceof org.apache.xpath.parser.Predicates)
+ {
+ Vector preds = ((org.apache.xpath.parser.Predicates)n).getPreds();
+ if(null != preds)
+ {
+ int nPreds = preds.size();
+ m_predicates = new Expression[nPreds];
+ for(int i = 0; i < nPreds; i++)
+ {
+ m_predicates[i] = (Expression)preds.elementAt(i);
+ }
+
+ }
+ }
+ else
+ {
+ // Assertion, should never happen.
+ throw new RuntimeException("node can only be a QName or Wildcard!");
+ }
+ }
+
+
+ /**
* @see Expression#deepEquals(Expression)
*/
public boolean deepEquals(Expression expr)
@@ -1088,4 +1206,12 @@
}
+ /**
+ * @see org.apache.xpath.parser.Node#jjtClose()
+ */
+ public void jjtClose()
+ {
+ super.jjtClose();
+ }
+
}
diff --git a/src/org/apache/xpath/patterns/UnionPattern.java b/src/org/apache/xpath/patterns/UnionPattern.java
index dac9456..6c838d9 100644
--- a/src/org/apache/xpath/patterns/UnionPattern.java
+++ b/src/org/apache/xpath/patterns/UnionPattern.java
@@ -60,10 +60,14 @@
import javax.xml.transform.TransformerException;
import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.Pattern;
/**
* <meta name="usage" content="advanced"/>
@@ -75,16 +79,16 @@
/** Array of the contained step patterns to be tested.
* @serial */
- private StepPattern[] m_patterns;
+ private ExpressionNode[] m_patterns;
/**
* No arguments to process, so this does nothing.
*/
- public void fixupVariables(java.util.Vector vars, int globalsSize)
+ public void fixupVariables(VariableComposeState vcs)
{
for (int i = 0; i < m_patterns.length; i++)
{
- m_patterns[i].fixupVariables(vars, globalsSize);
+ ((Expression)m_patterns[i]).fixupVariables(vcs);
}
}
@@ -102,7 +106,7 @@
int n = m_patterns.length;
for (int i = 0; i < n; i++)
{
- if(m_patterns[i].canTraverseOutsideSubtree())
+ if(((StepPattern)m_patterns[i]).canTraverseOutsideSubtree())
return true;
}
}
@@ -127,6 +131,88 @@
}
}
+
+ /** This method tells the node to add its argument to the node's
+ list of children. */
+ public void exprAddChild(ExpressionNode n, int i)
+ {
+
+ if(null == m_patterns)
+ {
+ m_patterns = new ExpressionNode[i+1];
+ }
+ if(i >= m_patterns.length)
+ {
+ ExpressionNode newPats[] = new ExpressionNode[i+1];
+ System.arraycopy(m_patterns, 0, newPats, 0, m_patterns.length);
+ m_patterns = newPats;
+
+ }
+ m_patterns[i] = n;
+ }
+
+ public void jjtAddChild(org.apache.xpath.parser.Node n, int i)
+ {
+ if(n instanceof UnionPattern)
+ {
+ // Undo the work of having the unions as binary operators.
+ // Certainly, this makes no sense for match patters.
+ UnionPattern up = (UnionPattern)n;
+ int count = up.jjtGetNumChildren();
+ for(int j = 0; j < count; j++)
+ {
+ n = up.jjtGetChild(j);
+ if(n instanceof Pattern)
+ {
+ n = n.jjtGetChild(0);
+ // n.jjtSetParent(this); // Called in jjtClose
+ }
+
+ exprAddChild((ExpressionNode)n, i+j);
+ }
+ }
+ else
+ {
+ if(n instanceof Pattern)
+ {
+ n = n.jjtGetChild(0);
+ // n.jjtSetParent(this); // Called in jjtClose
+ }
+ exprAddChild((ExpressionNode)n, i);
+ }
+ }
+
+ /** This method returns a child node. The children are numbered
+ from zero, left to right. */
+ public ExpressionNode exprGetChild(int i)
+ {
+ return m_patterns[i];
+ }
+
+ /** Return the number of children the node has. */
+ public int exprGetNumChildren()
+ {
+ if(null == m_patterns)
+ {
+ return 0;
+ }
+ else
+ {
+ return m_patterns.length;
+ }
+ }
+
+ public void jjtClose()
+ {
+ super.jjtClose();
+ int childCount = jjtGetNumChildren();
+ for(int i = 0; i < childCount; i++)
+ {
+ Node child = jjtGetChild(i);
+ child.jjtSetParent(this);
+ }
+ }
+
/**
* Get the contained step patterns to be tested.
@@ -134,9 +220,9 @@
*
* @return an array of the contained step patterns to be tested.
*/
- public StepPattern[] getPatterns()
+ public ExpressionNode[] getPatterns()
{
- return m_patterns;
+ return (ExpressionNode[])m_patterns;
}
/**
@@ -160,7 +246,7 @@
for (int i = 0; i < n; i++)
{
- XObject score = m_patterns[i].execute(xctxt);
+ XObject score = ((Expression)m_patterns[i]).execute(xctxt);
if (score != NodeTest.SCORE_NONE)
{
@@ -193,7 +279,7 @@
*/
public Expression getExpression()
{
- return m_patterns[m_index];
+ return (Expression)m_patterns[m_index];
}
@@ -218,7 +304,7 @@
int n = m_patterns.length;
for(int i = 0; i < n; i++)
{
- m_patterns[i].callVisitors(new UnionPathPartOwner(i), visitor);
+ ((Expression)m_patterns[i]).callVisitors(new UnionPathPartOwner(i), visitor);
}
}
}
@@ -241,7 +327,7 @@
for(int i = 0; i < n; i++)
{
- if(!m_patterns[i].deepEquals(up.m_patterns[i]))
+ if(!((Expression)m_patterns[i]).deepEquals((Expression)up.m_patterns[i]))
return false;
}
}
diff --git a/src/org/apache/xpath/quantified/Every.java b/src/org/apache/xpath/quantified/Every.java
new file mode 100644
index 0000000..4686cbe
--- /dev/null
+++ b/src/org/apache/xpath/quantified/Every.java
@@ -0,0 +1,77 @@
+/* Generated By:JJTree: Do not edit this line. Every.java */
+
+package org.apache.xpath.quantified;
+
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.XPath;
+
+public class Every extends Expression implements ExpressionOwner
+{
+
+ public Every() {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return null;
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ }
+
+
+}
diff --git a/src/org/apache/xpath/quantified/In.java b/src/org/apache/xpath/quantified/In.java
new file mode 100644
index 0000000..3455c9e
--- /dev/null
+++ b/src/org/apache/xpath/quantified/In.java
@@ -0,0 +1,76 @@
+/* Generated By:JJTree: Do not edit this line. In.java */
+
+package org.apache.xpath.quantified;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+public class In extends Expression implements ExpressionOwner
+{
+
+ public In() {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return null;
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ }
+
+
+}
diff --git a/src/org/apache/xpath/quantified/Satisfies.java b/src/org/apache/xpath/quantified/Satisfies.java
new file mode 100644
index 0000000..2cec42c
--- /dev/null
+++ b/src/org/apache/xpath/quantified/Satisfies.java
@@ -0,0 +1,76 @@
+/* Generated By:JJTree: Do not edit this line. Satisfies.java */
+
+package org.apache.xpath.quantified;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+public class Satisfies extends Expression implements ExpressionOwner
+{
+
+ public Satisfies() {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return null;
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ }
+
+
+}
diff --git a/src/org/apache/xpath/quantified/Some.java b/src/org/apache/xpath/quantified/Some.java
new file mode 100644
index 0000000..c9761e8
--- /dev/null
+++ b/src/org/apache/xpath/quantified/Some.java
@@ -0,0 +1,70 @@
+/* Generated By:JJTree: Do not edit this line. Some.java */
+
+package org.apache.xpath.quantified;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+
+public class Some extends Expression implements ExpressionOwner
+{
+
+ public Some() {
+ super();
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ }
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return null;
+ }
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ }
+
+}
diff --git a/src/org/apache/xpath/res/XPATHErrorResources.java b/src/org/apache/xpath/res/XPATHErrorResources.java
index 7084ad9..2cff2e9 100644
--- a/src/org/apache/xpath/res/XPATHErrorResources.java
+++ b/src/org/apache/xpath/res/XPATHErrorResources.java
@@ -464,68 +464,7 @@
// Variable accessed before it is bound!
public static final int ER_VARIABLE_ACCESSED_BEFORE_BIND = 85;
-
- // XStringForFSB can not take a string for an argument!
- public static final int ER_FSB_CANNOT_TAKE_STRING = 86;
-
- // Error! Setting the root of a walker to null!
- public static final int ER_SETTING_WALKER_ROOT_TO_NULL = 87;
-
- // This NodeSetDTM can not iterate to a previous node!
- public static final int ER_NODESETDTM_CANNOT_ITERATE = 88;
-
- // This NodeSet can not iterate to a previous node!
- public static final int ER_NODESET_CANNOT_ITERATE = 89;
- // This NodeSetDTM can not do indexing or counting functions!
- public static final int ER_NODESETDTM_CANNOT_INDEX = 90;
-
- // This NodeSet can not do indexing or counting functions!
- public static final int ER_NODESET_CANNOT_INDEX = 91;
-
- // Can not call setShouldCacheNodes after nextNode has been called!
- public static final int ER_CANNOT_CALL_SETSHOULDCACHENODE = 92;
-
- // {0} only allows {1} arguments
- public static final int ER_ONLY_ALLOWS = 93;
-
- // Programmer's assertion in getNextStepPos: unknown stepType: {0}
- public static final int ER_UNKNOWN_STEP = 94;
-
- /** Problem with RelativeLocationPath */
- public static final int ER_EXPECTED_REL_LOC_PATH = 95;
-
-
- /** Problem with LocationPath */
- public static final int ER_EXPECTED_LOC_PATH = 96;
-
-
- /** Problem with Step */
- public static final int ER_EXPECTED_LOC_STEP = 97;
-
-
- /** Problem with NodeTest */
- public static final int ER_EXPECTED_NODE_TEST = 98;
-
-
- /** Expected step pattern */
- public static final int ER_EXPECTED_STEP_PATTERN = 99;
-
-
- /** Expected relative path pattern */
- public static final int ER_EXPECTED_REL_PATH_PATTERN = 100;
-
- /** localname in QNAME should be a valid NCName */
- public static final int ER_ARG_LOCALNAME_INVALID = 101;
-
- /** prefix in QNAME should be a valid NCName */
- public static final int ER_ARG_PREFIX_INVALID = 102;
-
-
-
-
-
-
// Warnings...
/** Field WG_LOCALE_NAME_NOT_HANDLED */
diff --git a/src/org/apache/xpath/res/XPATHErrorResources.properties b/src/org/apache/xpath/res/XPATHErrorResources.properties
index bafeda2..b749e7a 100644
--- a/src/org/apache/xpath/res/XPATHErrorResources.properties
+++ b/src/org/apache/xpath/res/XPATHErrorResources.properties
@@ -176,41 +176,6 @@
ER0084=2 or 3
# ER_VARIABLE_ACCESSED_BEFORE_BIND
ER0085=Variable accessed before it is bound!
-# ER_FSB_CANNOT_TAKE_STRING
-ER0086=XStringForFSB can not take a string for an argument!
-# ER_SETTING_WALKER_ROOT_T)_NULL
-ER0087=\n !!!! Error! Setting the root of a walker to null!!!
-# ER_NODESETDTM_CANNOT_ITERATE
-ER0088=This NodeSetDTM can not iterate to a previous node!
-# ER_NODESET_CANNOT_ITERATE
-ER0089=This NodeSet can not iterate to a previous node!
-# ER_NODESETDTM_CANNOT_INDEX
-ER0090=This NodeSetDTM can not do indexing or counting functions!
-# ER_NODESET_CANNOT_INDEX
-ER0091=This NodeSet can not do indexing or counting functions!
-# ER_CANNOT_CALL_SETSHOULDCACHENODE
-ER0092=Can not call setShouldCacheNodes after nextNode has been called!
-# ER_ONLY_ALLOWS
-ER0093={0} only allows {1} arguments
-# ER_UNKNOWN_STEP
-ER0094=Programmer's assertion in getNextStepPos: unknown stepType: {0}
-# ER_EXPECTED_REL_LOC_PATH
-ER0095=A relative location path was expected following the '/' or '//' token.
-# ER_EXPECTED_LOC_PATH
-ER0096=A location path was expected, but the following token was encountered\u003a {0}
-# ER_EXPECTED_LOC_STEP
-ER0097=A location step was expected following the '/' or '//' token.
-# ER_EXPECTED_NODE_TEST
-ER0098=A node test that matches either NCName:* or QName was expected.
-# ER_EXPECTED_STEP_PATTERN
-ER0099=A step pattern was expected, but '/' was encountered.
-# ER_EXPECTED_REL_PATH_PATTERN
-ER0100=A relative path pattern was expected.
-# ER_ARG_LOCALNAME_INVALID
-ER0101= Localname in QNAME should be a valid NCName
-# ER_ARG_PREFIX_INVALID
-ER0102=Prefix in QNAME should be a valid NCName
-
# WG_LOCALE_NAME_NOT_HANDLED
WR0001=locale name in the format-number function not yet handled!
diff --git a/src/org/apache/xpath/seqctor/Binding.java b/src/org/apache/xpath/seqctor/Binding.java
new file mode 100644
index 0000000..3b1f36b
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/Binding.java
@@ -0,0 +1,117 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.seqctor;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.operations.Variable;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 19, 2002
+ * @author sboag
+ */
+public class Binding
+{
+ private Variable m_var;
+ private Expression m_expr;
+
+ /**
+ * Constructor for Binding.
+ */
+ public Binding()
+ {
+ super();
+ }
+
+ /**
+ * Returns the expr.
+ * @return Expression
+ */
+ public Expression getExpr()
+ {
+ return m_expr;
+ }
+
+ /**
+ * Returns the var.
+ * @return Variable
+ */
+ public Variable getVar()
+ {
+ return m_var;
+ }
+
+ /**
+ * Sets the expr.
+ * @param expr The expr to set
+ */
+ public void setExpr(Expression expr)
+ {
+ m_expr = expr;
+ }
+
+ /**
+ * Sets the var.
+ * @param var The var to set
+ */
+ public void setVar(Variable var)
+ {
+ m_var = var;
+ }
+
+}
diff --git a/src/org/apache/xpath/seqctor/ExprSequence.java b/src/org/apache/xpath/seqctor/ExprSequence.java
new file mode 100644
index 0000000..3940c21
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/ExprSequence.java
@@ -0,0 +1,126 @@
+/* Generated By:JJTree: Do not edit this line. ExprSequence.java */
+
+package org.apache.xpath.seqctor;
+
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.Token;
+
+public class ExprSequence extends Expression implements ExpressionOwner
+{
+
+ Vector m_exprs = new Vector();
+
+ public void jjtAddChild(Node n, int i)
+ {
+ n = fixupPrimarys(n);
+ if(null == m_exprs)
+ m_exprs = new Vector();
+ if(i >= m_exprs.size())
+ {
+ m_exprs.setSize(i+1);
+ }
+ m_exprs.setElementAt(n, i);
+ }
+
+ public Node jjtGetChild(int i)
+ {
+ if(null == m_exprs)
+ return null;
+ else
+ return (Node)m_exprs.elementAt(i);
+ }
+
+ public int jjtGetNumChildren()
+ {
+ if(null == m_exprs)
+ return 0;
+ else
+ return m_exprs.size();
+ }
+
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ * Dummy stub.
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ * Dummy stub.
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ Vector exprs = m_exprs;
+ int vsize = exprs.size();
+ for (int i = 0; i < vsize; i++)
+ {
+ Expression val = (Expression)exprs.elementAt(i);
+ val.fixupVariables(vcs);
+ }
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ * Dummy stub.
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return new ExprSequenceIter(m_exprs, xctxt);
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ * Dummy stub.
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ }
+
+ /**
+ * @see SimpleNode#shouldReduceIfOneChild()
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return (jjtGetNumChildren() == 1) ? true : false;
+ }
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#isPathExprReduced()
+ */
+ public boolean isPathExprReduced()
+ {
+ return (null == m_exprs) ? false : true;
+ }
+
+}
diff --git a/src/org/apache/xpath/seqctor/ExprSequenceIter.java b/src/org/apache/xpath/seqctor/ExprSequenceIter.java
new file mode 100644
index 0000000..c13f2d0
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/ExprSequenceIter.java
@@ -0,0 +1,157 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.seqctor;
+
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.objects.XSequenceCachedBase;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 20, 2002
+ * @author sboag
+ */
+public class ExprSequenceIter extends XSequenceCachedBase
+{
+ protected Vector m_exprs;
+ // XSequence[] m_xsequences;
+ int m_exprsIndex = 0;
+ private XSequence m_containedIterator;
+ private XObject m_contextItem;
+
+ /**
+ * Constructor for ExprSequenceIter.
+ */
+ public ExprSequenceIter(Vector exprs, XPathContext xctxt)
+ {
+ super(xctxt);
+ this.setShouldCache(true); // for now!
+ m_exprs = exprs;
+ m_contextItem = xctxt.getCurrentItem();
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getNext()
+ */
+ public XObject getNext()
+ {
+ XObject xobj;
+ try
+ {
+ m_xctxt.pushCurrentItem(m_contextItem);
+ if (null != m_containedIterator)
+ {
+ xobj = m_containedIterator.next();
+ if (null != xobj)
+ {
+ return xobj;
+ }
+ else
+ {
+ m_containedIterator = null;
+ }
+ }
+
+ if (m_exprsIndex >= m_exprs.size())
+ return null;
+ Expression expr = (Expression) m_exprs.elementAt(m_exprsIndex);
+ m_exprsIndex++;
+ xobj = expr.execute(m_xctxt);
+ if (xobj.isSequenceProper())
+ {
+ m_containedIterator = (XSequence) xobj;
+ return getNext();
+ }
+ else
+ return xobj;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ finally
+ {
+ m_xctxt.popCurrentItem();
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getPrevious()
+ */
+ public XObject getPrevious()
+ {
+ throw new RuntimeException("ExprSequence can not go backwards without cacheing!");
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#reset()
+ */
+ public void reset()
+ {
+ super.reset();
+ m_exprsIndex = 0;
+ }
+
+}
diff --git a/src/org/apache/xpath/seqctor/FLWRExpr.java b/src/org/apache/xpath/seqctor/FLWRExpr.java
new file mode 100644
index 0000000..faa363e
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/FLWRExpr.java
@@ -0,0 +1,167 @@
+package org.apache.xpath.seqctor;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.QName;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.operations.Variable;
+import org.apache.xpath.parser.Node;
+
+public class FLWRExpr extends Expression implements ExpressionOwner
+{
+ Binding[] m_bindings;
+ Expression m_return;
+
+ /**
+ * Constructor for FLWRExpr
+ */
+ public FLWRExpr()
+ {
+ super();
+ }
+
+ /**
+ * @see SimpleNode#shouldReduceIfOneChild()
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return (jjtGetNumChildren() == 1) ? true : false;
+ }
+
+ /**
+ * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ return new FLWRIter(m_bindings, m_return, xctxt);
+ }
+
+ /**
+ * @see org.apache.xpath.Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ vcs.pushStackMark();
+ Binding[] bindings = m_bindings;
+ int globalsSize = vcs.getGlobalsSize();
+ for (int i = 0; i < bindings.length; i++)
+ {
+ Binding binding = bindings[i];
+ binding.getExpr().fixupVariables(vcs);
+ Variable var = binding.getVar();
+ QName varName = var.getQName();
+ int index = vcs.addVariableName(varName) - globalsSize;
+ var.setIndex(index);
+ var.setFixUpWasCalled(true);
+ // var.fixupVariables(vcs);
+ }
+ m_return.fixupVariables(vcs);
+ vcs.popStackMark();
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return null;
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ m_return = exp;
+ }
+
+ /**
+ * Returns the r.
+ * @return Expression
+ */
+ public Expression getReturn()
+ {
+ return m_return;
+ }
+
+ /**
+ * Sets the inExprs.
+ * @param inExprs The inExprs to set
+ */
+ public void setBindings(Binding[] bindings)
+ {
+ m_bindings = bindings;
+ }
+
+ /**
+ * Sets the r.
+ * @param r The r to set
+ */
+ public void setReturn(Expression r)
+ {
+ m_return = r;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ if(null == m_bindings && 0 == i)
+ m_return = (Expression)fixupPrimarys(n); // Act like a construction node!
+ else if(i == 2)
+ m_return = (Expression)fixupPrimarys(n);
+ }
+
+
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetChild(int)
+ */
+ public Node jjtGetChild(int i)
+ {
+ if (i == jjtGetNumChildren() - 1)
+ return m_return;
+ else
+ if (null != m_bindings)
+ {
+ if ((i % 2) == 1)
+ return m_bindings[i / 2].getVar();
+ else
+ return m_bindings[i / 2].getExpr();
+ }
+ else
+ return null;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtGetNumChildren()
+ */
+ public int jjtGetNumChildren()
+ {
+ return (((null != m_bindings) ? m_bindings.length : 0)*2)+
+ ((null != m_return) ? 1 : 0);
+ }
+
+}
+
diff --git a/src/org/apache/xpath/seqctor/FLWRIter.java b/src/org/apache/xpath/seqctor/FLWRIter.java
new file mode 100644
index 0000000..5c6257d
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/FLWRIter.java
@@ -0,0 +1,227 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.seqctor;
+
+import java.util.Vector;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.utils.WrappedRuntimeException;
+import org.apache.xpath.Expression;
+import org.apache.xpath.VariableStack;
+import org.apache.xpath.XPath;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.objects.XNodeSequenceSingleton;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.objects.XSequenceCachedBase;
+import org.apache.xpath.objects.XSequenceSingleton;
+
+/**
+ * The FLWRIter must iterate over a set of variable bindings to
+ * sequences, call an expression for each tuple, and return the
+ * result.
+ *
+ * Created Jul 19, 2002
+ * @author sboag
+ */
+public class FLWRIter extends XSequenceCachedBase implements XSequence
+{
+ private Binding[] m_bindings;
+ private XSequence[] m_evaluations;
+ private int m_lastNonNull;
+ private Expression m_returnExpr;
+ private XSequence m_containedIterator;
+ private XObject m_contextItem;
+ int m_evalPos = 0;
+
+ /**
+ * Constructor for FLWRIter.
+ */
+ public FLWRIter(Binding[] bindings, Expression returnExpr, XPathContext xctxt)
+ {
+ super(xctxt);
+ setShouldCache(true);
+ m_xctxt = xctxt;
+ m_returnExpr = returnExpr;
+ m_bindings = bindings;
+ int len = bindings.length;
+ m_evaluations = new XSequence[len];
+
+ m_lastNonNull = len - 1; // Might not need this
+
+ m_contextItem = xctxt.getCurrentItem();
+ boolean foundNonEmpty = false;
+
+ }
+
+ /**
+ * Bind the next tuple of values to the variables. The tuples are expressed
+ * as sets within the cartesian product of the 'in' clauses (though note
+ * that I'm not sure 'cartesian' is strictly good terminology, since it
+ * applies to only two sets).
+ * @return XObject The last evaluation found, or null if
+ * there's no more to evaluate.
+ */
+ public XObject evalVariables()
+ {
+ XSequence[] evals = m_evaluations;
+ VariableStack vars = m_xctxt.getVarStack();
+ XObject xobj = null;
+
+ for (int bindex = m_evalPos; bindex < evals.length; bindex++)
+ {
+ XSequence xseq = evals[bindex];
+ if (null == xseq)
+ {
+ try
+ {
+ Binding binding = m_bindings[bindex];
+ XObject result = binding.getExpr().execute(m_xctxt);
+ xseq = result.xseq();
+ m_evaluations[bindex] = xseq;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ }
+ xobj = xseq.next();
+ if (null != xobj)
+ {
+ Binding binding = m_bindings[bindex];
+ int vindex = binding.getVar().getIndex();
+ vars.setLocalVariable(vindex, xobj);
+ m_evalPos = bindex;
+ }
+ else
+ if (bindex != 0)
+ {
+ // m_evalPos = bindex;
+ evals[bindex] = null;
+ bindex-=2;
+ // xseq.reset();
+ }
+ else
+ {
+ m_evalPos = evals.length;
+ break;
+ }
+ }
+ return xobj;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getNext()
+ */
+ protected XObject getNext()
+ {
+ XObject xobj;
+ if (null != m_containedIterator)
+ {
+ xobj = m_containedIterator.next();
+ if (null != xobj)
+ {
+ return xobj;
+ }
+ else
+ m_containedIterator = null;
+ }
+
+ m_xctxt.pushCurrentItem(m_contextItem);
+ try
+ {
+ if (null == evalVariables())
+ return null;
+ xobj = m_returnExpr.execute(m_xctxt);
+ if (xobj.isSequenceProper())
+ {
+ m_containedIterator = (XSequence) xobj;
+ return getNext();
+ }
+ else
+ return xobj;
+ }
+ catch (TransformerException e)
+ {
+ throw new WrappedRuntimeException(e);
+ }
+ finally
+ {
+ m_xctxt.popCurrentItem();
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getNext()
+ */
+ protected XObject getPrevious()
+ {
+ assertion(true, "getPrevious() not supported in the FLWRIter!");
+ return null;
+ }
+
+ /**
+ * @return XSequence object.
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+}
diff --git a/src/org/apache/xpath/seqctor/RangeExpr.java b/src/org/apache/xpath/seqctor/RangeExpr.java
new file mode 100644
index 0000000..13a1481
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/RangeExpr.java
@@ -0,0 +1,32 @@
+/* Generated By:JJTree: Do not edit this line. RangeExpr.java */
+
+package org.apache.xpath.seqctor;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.operations.OpFuncLookupTable;
+import org.apache.xpath.operations.Operation;
+
+public class RangeExpr extends Operation
+{
+ public RangeExpr() {
+ super();
+ }
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ int from = m_left.execute(xctxt).integer();
+ int to = m_right.execute(xctxt).integer();
+ return new RangeIter(from, to);
+ }
+
+}
diff --git a/src/org/apache/xpath/seqctor/RangeIter.java b/src/org/apache/xpath/seqctor/RangeIter.java
new file mode 100644
index 0000000..1710625
--- /dev/null
+++ b/src/org/apache/xpath/seqctor/RangeIter.java
@@ -0,0 +1,319 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.seqctor;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.objects.XInteger;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+
+/**
+ * The responsibility of enclosing_type is to .
+ *
+ * Created Jul 23, 2002
+ * @author sboag
+ */
+public class RangeIter extends XObject implements XSequence
+{
+ private int m_from;
+ private int m_to;
+ private int m_pos;
+ private XObject m_current;
+ private Object m_obj;
+
+ /**
+ * Constructor for RangeIter.
+ */
+ public RangeIter(int from, int to)
+ {
+ super();
+ m_to = to;
+ m_from = from;
+ m_pos = from-1;
+ }
+
+ /**
+ * Constructor for RangeIter.
+ * @param obj
+ */
+ public RangeIter(Object obj)
+ {
+ //super(obj);
+ m_obj=obj;
+ }
+
+ public Object object()
+ {
+ return m_obj;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypes()
+ */
+ public int getTypes()
+ {
+ return 0;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#next()
+ */
+ public XObject next()
+ {
+ if (m_pos <= m_to)
+ {
+ m_pos++;
+ if (m_pos <= m_to)
+ return m_current = new XInteger(m_pos);
+ else
+ return m_current = null;
+ }
+ return m_current = null;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#previous()
+ */
+ public XObject previous()
+ {
+ if (m_pos >= m_from)
+ {
+ m_pos--;
+ if (m_pos >= m_from)
+ return m_current = new XInteger(m_pos);
+ else
+ return m_current = null;
+ }
+ else
+ return m_current = null;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrent()
+ */
+ public XObject getCurrent()
+ {
+ return m_current;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isFresh()
+ */
+ public boolean isFresh()
+ {
+ return m_pos == m_from-1;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeNS()
+ */
+ public String getTypeNS()
+ {
+ return XType.XMLSCHEMA_DATATYPE_NAMESPACE;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getTypeLocalName()
+ */
+ public String getTypeLocalName()
+ {
+ return XType.getLocalNameFromType(XType.INTEGER);
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSchemaType(String, String)
+ */
+ public boolean isSchemaType(String namespace, String localname)
+ {
+ int type = XType.getTypeID(namespace, localname);
+ return type == XType.INTEGER;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isPureNodeSequence()
+ */
+ public boolean isPureNodeSequence()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#setShouldCache(boolean)
+ */
+ public void setShouldCache(boolean b)
+ {
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getIsRandomAccess()
+ */
+ public boolean getIsRandomAccess()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isMutable()
+ */
+ public boolean isMutable()
+ {
+ return false;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getCurrentPos()
+ */
+ public int getCurrentPos()
+ {
+ return m_pos-m_from;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#setCurrentPos(int)
+ */
+ public void setCurrentPos(int i)
+ {
+ m_pos = m_from+i;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#getLength()
+ */
+ public int getLength()
+ {
+ return m_to-m_from;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XSequence#isSingletonOrEmpty()
+ */
+ public boolean isSingletonOrEmpty()
+ {
+ return getLength() <= 1;
+ }
+
+ /**
+ * @see java.lang.Object#clone()
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+
+
+ /**
+ * Returns the from.
+ * @return int
+ */
+ public int getFrom()
+ {
+ return m_from;
+ }
+
+ /**
+ * Returns the to.
+ * @return int
+ */
+ public int getTo()
+ {
+ return m_to;
+ }
+
+ /**
+ * Sets the current.
+ * @param current The current to set
+ */
+ public void setCurrent(XObject current)
+ {
+ m_current = current;
+ }
+
+ /**
+ * Sets the from.
+ * @param from The from to set
+ */
+ public void setFrom(int from)
+ {
+ m_from = from;
+ }
+
+ /**
+ * Sets the to.
+ * @param to The to to set
+ */
+ public void setTo(int to)
+ {
+ m_to = to;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#isSequenceProper()
+ */
+ public boolean isSequenceProper()
+ {
+ return true;
+ }
+
+ /**
+ * @see org.apache.xpath.objects.XObject#xseq()
+ */
+ public XSequence xseq()
+ {
+ return this;
+ }
+
+}
diff --git a/src/org/apache/xpath/types/Atomizer.java b/src/org/apache/xpath/types/Atomizer.java
new file mode 100644
index 0000000..2807077
--- /dev/null
+++ b/src/org/apache/xpath/types/Atomizer.java
@@ -0,0 +1,139 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.types;
+
+import org.apache.xml.dtm.XType;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+
+/**
+ * Singleton class that handles automization.
+ *
+ * Created Jul 30, 2002
+ * @author sboag
+ */
+public class Atomizer
+{
+ public static XObject makeAtom(XObject xobj)
+ {
+ if(XSequence.EMPTY == xobj)
+ return xobj;
+ else if(xobj.isSingletonOrEmpty())
+ {
+ return xobj;
+ }
+ else
+ {
+ XSequence xseq = xobj.xseq();
+ XObject first = xseq.next();
+ if(null == first)
+ return XSequence.EMPTY;
+ XObject second = xseq.next();
+ if(second != null)
+ return xobj;
+ // For now, could be node or atom. Don't do any
+ // type checks here.
+ return first;
+ }
+ }
+
+
+ public static XObject makeFallbackAtom(XObject xobj, int requiredType)
+ {
+ switch (requiredType)
+ {
+ case XType.ANYTYPE :
+ case XType.BOOLEAN :
+ case XType.DOUBLE :
+ case XType.STRING :
+ case XType.NODE :
+ case XType.RTREEFRAG :
+
+ // Callers should expect the actual values of these constants to
+ // changed... i.e. they should not rely on the value itself.
+ case XType.BASE64BINARY :
+ case XType.HEXBINARY :
+ case XType.FLOAT :
+ case XType.DECIMAL :
+ case XType.INTEGER :
+ case XType.ANYURI :
+ case XType.QNAME :
+ case XType.NOTATION :
+ case XType.DURATION :
+ case XType.DATETIME :
+ case XType.TIME :
+ case XType.DATE :
+ case XType.GYEARMONTH :
+ case XType.GYEAR :
+ case XType.GMONTHDAY :
+ case XType.GDAY :
+ case XType.GMONTH :
+
+ case XType.YEARMONTHDURATION :
+ case XType.DAYTIMEDURATION :
+
+ case XType.ANYSIMPLETYPE :
+ case XType.EMPTYSEQ :
+
+ // Answer for a sequence when it hasn't iterated. -sb
+ case XType.SEQ :
+ break;
+ default :
+ }
+ return null;
+ }
+}
diff --git a/src/org/apache/xpath/types/InstanceofExpr.java b/src/org/apache/xpath/types/InstanceofExpr.java
new file mode 100644
index 0000000..01a7574
--- /dev/null
+++ b/src/org/apache/xpath/types/InstanceofExpr.java
@@ -0,0 +1,462 @@
+/* Generated By:JJTree: Do not edit this line. Instanceof.java */
+
+package org.apache.xpath.types;
+
+import java.io.PrintStream;
+import java.util.Vector;
+import javax.xml.transform.TransformerException;
+
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMFilter;
+import org.apache.xml.dtm.XType;
+import org.apache.xml.utils.QName;
+import org.apache.xpath.Expression;
+import org.apache.xpath.ExpressionNode;
+import org.apache.xpath.ExpressionOwner;
+import org.apache.xpath.VariableComposeState;
+import org.apache.xpath.XPathContext;
+import org.apache.xpath.XPathVisitor;
+import org.apache.xpath.objects.XBoolean;
+import org.apache.xpath.objects.XNodeSet;
+import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XSequence;
+import org.apache.xpath.parser.Node;
+import org.apache.xpath.parser.SchemaContext;
+import org.apache.xpath.parser.SequenceType;
+import org.apache.xpath.parser.SimpleNode;
+import org.apache.xpath.parser.XPath;
+
+/**
+ * This class implements the "instance of" production for XPath 2.0.
+ *
+ * <p>(For easy reference, until the spec is more stable...)</p>
+ * <pre>
+ * [9] InstanceofExpr ::= {Expr} ( <"instance" "of"> SequenceType )?
+ * [51] SequenceType ::= (ItemType OccurrenceIndicator) | "empty"
+ * [52] ItemType ::= (("element" | "attribute") ElemOrAttrType?)
+ * | "node"
+ * | "processing-instruction"
+ * | "comment"
+ * | "text"
+ * | "document"
+ * | "item"
+ * | AtomicType
+ * | "untyped"
+ * | <"atomic" "value">
+ * [53] ElemOrAttrType ::= (QName (SchemaType | SchemaContext?)) | SchemaType
+ * [54] SchemaType ::= <"of" "type"> QName
+ * [55] AtomicType ::= QName
+ * [56] OccurrenceIndicator ::= ("*" | "+" | "?")?
+ * </pre>
+ *
+ * <p>Notes to Joe: You can call just the parser to give a diagnostic dump
+ * of the expression by calling org.apache.xpath.parser.XPath.main() with
+ * an argument of a an expression string (quote it): "foo instance of xsd:integer".
+ * This will dump out thus:</p>
+ * <pre>
+ * Test[0]: foo instance of xsd:integer
+ * |instance of
+ * | child::foo org.apache.xpath.axes.ChildTestIterator
+ * | m_atomicTypeID: 2
+ * | m_elemOrAttrName: null
+ * | m_occurrenceIndicator: 2
+ * | m_schemaContext: null
+ * | m_schemaTypeName: null
+ * | m_whatToShow: 0
+ * Success!!!!
+ * I've only tested:
+ * "foo instance of xsd:integer"
+ * "foo instance of element of type baz"
+ * "foo instance of element yada of type baz"
+ * "foo instance of node"
+ * "foo instance of text"
+ * "foo instance of comment"
+ * "foo instance of untyped"
+ * </pre>
+ *
+ * <p>It's highly likely that there are bugs in the construction with
+ * other expressions. Come get me if that happens.</p>
+ * <p>SchemaContext & co is unimplemented right now. Don't worry about
+ * it for right now.</p>
+ *
+ * Created Jul 17, 2002
+ * @author sboag
+ */
+public class InstanceofExpr extends Expression implements ExpressionOwner
+{
+ /** The sequence on which to act. **/
+ private Expression m_targetExpr;
+
+ /** The node type value, one of DTMFilter.SHOW_ATTRIBUTE, etc.
+ * %REVIEW% Why isn't this just the node type? **/
+ private int m_whatToShow;
+
+ /** The atomic type ID, one of XType.BOOLEAN, etc. **/
+ private int m_atomicTypeID;
+
+ // Occurence indicator ID values.
+ public static final int ZERO_OR_MORE = 1;
+ public static final int ONE_OR_MORE = 2;
+ public static final int ZERO_OR_ONE = 3;
+ public static final int EMPTY_SEQ = 4;
+
+ /** The occurance indicator ID. One of ZERO_OR_MORE, etc. or EMPTY_SEQ **/
+ private int m_occurrenceIndicator = ONE_OR_MORE;
+
+ /** The ElemOrAttrType name, meaning the tag QName, may be null. */
+ private QName m_elemOrAttrName;
+
+ /** The SchemaType name, meaning the tag QName, may be null. */
+ private QName m_schemaTypeName;
+
+ /** SchemaContext is not executable for the moment, so leave it
+ * as a NEE until we figure out what we want to do with it. **/
+ private SchemaContext m_schemaContext;
+
+ public InstanceofExpr() {
+ super();
+
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(org.apache.xpath.parser.XPathVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
+ /**
+ * @see Expression#deepEquals(Expression)
+ */
+ public boolean deepEquals(Expression expr)
+ {
+ if(!(expr instanceof InstanceofExpr))
+ return false;
+ return false;
+ }
+
+ /**
+ * @see Expression#fixupVariables(Vector, int)
+ */
+ public void fixupVariables(VariableComposeState vcs)
+ {
+ m_targetExpr.fixupVariables(vcs);
+ }
+
+
+ /**
+ * @see Expression#execute(XPathContext)
+ */
+ public XObject execute(XPathContext xctxt) throws TransformerException
+ {
+ // m_atomicTypeID: Integer XType primitive, IFF no m_schemaTypeName
+ // m_schemaContext: SchemaContext, UNSPECIFIED AT THIS TIME
+ // and hence unsupported.
+ boolean isInstance=true;
+
+ XObject value=m_targetExpr.execute(xctxt);
+
+
+ switch(value.getType())
+ {
+ case XObject.CLASS_UNKNOWN:
+ // If not XSLT type, can't be instance of ...?
+ // %REVIEW% what SHOW_ITEM and SHOW_UNTYPED mean
+ case XObject.CLASS_NULL:
+ isInstance=false;
+ break;
+
+ case XObject.CLASS_NODESET:
+ case XObject.CLASS_RTREEFRAG:
+ int len=0;
+ XSequence valNodeSet= value.xseq();
+ for( XObject next=valNodeSet.next();
+ isInstance && next!=null;
+ next=valNodeSet.next(),++len)
+ {
+ int handle = next.getNodeHandle();
+ if(DTM.NULL == handle)
+ continue;
+ if(m_whatToShow!=0)
+ {
+ int nodetype=xctxt.getDTM(handle).getNodeType(handle);
+ if(0==(m_whatToShow & 1<<(nodetype-1)))
+ isInstance=false;
+ else if(m_elemOrAttrName!=null)
+ {
+ isInstance&=
+ (m_elemOrAttrName.getNamespace/*URI*/()
+ ==xctxt.getDTM(handle).getNamespaceURI(handle))
+ &&
+ (m_elemOrAttrName.getLocalName()
+ ==xctxt.getDTM(handle).getLocalName(handle));
+ }
+ }
+ if(m_schemaTypeName!=null)
+ {
+ isInstance&=
+ xctxt.getDTM(handle).isNodeSchemaType(
+ handle,
+ m_schemaTypeName.getNamespaceURI(),
+ m_schemaTypeName.getLocalName());
+ }
+ else if(m_atomicTypeID!=0)
+ {
+ // Unless DTM implements awareness of these
+ // typenumbers, or our sequence/nodeset layers
+ // handle this for us, we need to convert back
+ // to strings. We also have to convert from the
+ // Schema_datatype namespace, used in requesting the
+ // primitive, to the Schema namespace used when
+ // the node was declared.
+ isInstance&=
+ xctxt.getDTM(handle).isNodeSchemaType(
+ handle,
+ XType.XMLSCHEMA_NAMESPACE,
+ XType.getLocalNameFromType(m_atomicTypeID));
+ }
+ } // End scan contents
+ switch(m_occurrenceIndicator)
+ {
+ case ZERO_OR_MORE:
+ break; // Anything is OK
+ case ONE_OR_MORE:
+ isInstance&=(len>=1);
+ break;
+ case ZERO_OR_ONE:
+ isInstance&=(len<2);
+ break;
+ case EMPTY_SEQ:
+ isInstance&=(len==0);
+ break;
+ }
+ break;
+
+ case XObject.CLASS_BOOLEAN:
+ isInstance&=(m_elemOrAttrName==null);
+ isInstance&=(m_schemaTypeName==null);
+ isInstance&=(m_whatToShow==0);
+ isInstance&=(m_atomicTypeID==XType.BOOLEAN);
+ break;
+
+ case XObject.CLASS_NUMBER:
+ isInstance&=(m_elemOrAttrName==null);
+ isInstance&=(m_schemaTypeName==null);
+ isInstance&=(m_whatToShow==0);
+ // %REVIEW% XNumber is just that, a number.
+ // We want *it* to tell *us* whether it's straight
+ // decimal or double or whatever...?
+ isInstance&=(m_atomicTypeID==XType.DECIMAL
+ || m_atomicTypeID==XType.DOUBLE);
+ break;
+
+ case XObject.CLASS_STRING:
+ isInstance&=(m_elemOrAttrName==null);
+ isInstance&=(m_schemaTypeName==null);
+ isInstance&=(m_whatToShow==0);
+ isInstance&=(m_atomicTypeID==XType.STRING);
+ break;
+
+ default:
+ // Should never arise
+ isInstance=false;
+ break;
+ }
+
+ return isInstance ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+ }
+
+
+ /**
+ * @see XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
+ */
+ public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
+ {
+ m_targetExpr.callVisitors(this, visitor);
+ }
+
+
+ /**
+ * @see ExpressionOwner#getExpression()
+ */
+ public Expression getExpression()
+ {
+ return m_targetExpr;
+ }
+
+
+ /**
+ * @see ExpressionOwner#setExpression(Expression)
+ */
+ public void setExpression(Expression exp)
+ {
+ m_targetExpr = exp;
+ }
+
+ /**
+ * @see SimpleNode#shouldReduceIfOneChild()
+ */
+ public boolean shouldReduceIfOneChild()
+ {
+ return (m_whatToShow == 0 && m_atomicTypeID == 0) ? true : false;
+ }
+
+
+ /**
+ * Returns the occurrenceIndicator.
+ * @return int
+ */
+ public int getOccurrenceIndicator()
+ {
+ return m_occurrenceIndicator;
+ }
+
+ /**
+ * Returns the schemaContext.
+ * @return SchemaContext
+ */
+ public SchemaContext getSchemaContext()
+ {
+ return m_schemaContext;
+ }
+
+ /**
+ * Returns the schemaTypeName.
+ * @return QName
+ */
+ public QName getSchemaTypeName()
+ {
+ return m_schemaTypeName;
+ }
+
+ /**
+ * Returns the targetExpr.
+ * @return Expression
+ */
+ public Expression getTargetExpr()
+ {
+ return m_targetExpr;
+ }
+
+ /**
+ * Returns the whatToShow.
+ * @return int
+ */
+ public int getWhatToShow()
+ {
+ return m_whatToShow;
+ }
+
+ /**
+ * Sets the occurrenceIndicator.
+ * @param occurrenceIndicator The occurrenceIndicator to set
+ */
+ public void setOccurrenceIndicator(int occurrenceIndicator)
+ {
+ m_occurrenceIndicator = occurrenceIndicator;
+ }
+
+ /**
+ * Sets the schemaContext.
+ * @param schemaContext The schemaContext to set
+ */
+ public void setSchemaContext(SchemaContext schemaContext)
+ {
+ m_schemaContext = schemaContext;
+ }
+
+ /**
+ * Sets the schemaTypeName.
+ * @param schemaTypeName The schemaTypeName to set
+ */
+ public void setSchemaTypeName(QName schemaTypeName)
+ {
+ m_schemaTypeName = schemaTypeName;
+ }
+
+ /**
+ * Sets the targetExpr.
+ * @param targetExpr The targetExpr to set
+ */
+ public void setTargetExpr(Expression targetExpr)
+ {
+ m_targetExpr = targetExpr;
+ }
+
+ /**
+ * Sets the whatToShow.
+ * @param whatToShow The whatToShow to set
+ */
+ public void setWhatToShow(int whatToShow)
+ {
+ m_whatToShow = whatToShow;
+ }
+
+ /**
+ * @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
+ */
+ public void jjtAddChild(Node n, int i)
+ {
+ if(0 == i)
+ {
+ n = this.fixupPrimarys(n);
+ m_targetExpr = (Expression)n;
+ }
+ else if(2 == i) // skip the child at index 1, which is the instance of keyword.
+ {
+ SequenceType stype = (SequenceType)n;
+ m_atomicTypeID = stype.getAtomicTypeID();
+ m_elemOrAttrName = stype.getElemOrAttrName();
+ m_occurrenceIndicator = stype.getOccurrenceIndicator();
+ m_schemaContext = stype.getSchemaContext();
+ m_schemaTypeName = stype.getSchemaTypeName();
+ m_whatToShow = stype.getWhatToShow();
+ }
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprGetChild(int)
+ */
+ public ExpressionNode exprGetChild(int i)
+ {
+ // This doesn't work perfectly, but it's good enough.
+ return (0 == i) ? m_targetExpr : (1 == 0) ? m_schemaContext : null;
+ }
+
+ /**
+ * @see org.apache.xpath.ExpressionNode#exprGetNumChildren()
+ */
+ public int exprGetNumChildren()
+ {
+ // This doesn't work perfectly, but it's good enough.
+ return ((null == m_targetExpr) ? 1 : 0)+((null == m_schemaContext) ? 1 : 0);
+ }
+
+ /**
+ * @see org.apache.xpath.parser.SimpleNode#dump(String, PrintStream)
+ */
+ public void dump(String prefix, PrintStream ps)
+ {
+ super.dump(prefix, ps);
+ prefix = prefix+" ";
+ ps.print(prefix);
+ ps.println("m_atomicTypeID: "+m_atomicTypeID);
+ ps.print(prefix);
+ ps.println("m_elemOrAttrName: "+m_elemOrAttrName);
+ ps.print(prefix);
+ ps.println("m_occurrenceIndicator: "+m_occurrenceIndicator);
+ ps.print(prefix);
+ ps.println("m_schemaContext: "+m_schemaContext);
+ ps.print(prefix);
+ ps.println("m_schemaTypeName: "+m_schemaTypeName);
+ ps.print(prefix);
+ ps.println("m_whatToShow: "+m_whatToShow);
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "instance of";
+ }
+
+}
diff --git a/src/org/apache/xpath/types/Promoter.java b/src/org/apache/xpath/types/Promoter.java
new file mode 100644
index 0000000..55ac14b
--- /dev/null
+++ b/src/org/apache/xpath/types/Promoter.java
@@ -0,0 +1,69 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xalan" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, Lotus
+ * Development Corporation., http://www.lotus.com. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+package org.apache.xpath.types;
+
+/**
+ * Typed operation function.
+ *
+ * Created Jul 30, 2002
+ * @author sboag
+ */
+public class Promoter
+{
+
+
+}