19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: XNodeSet.java 469368 2006-10-31 04:41:36Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.objects;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMManager;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLString;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.NodeSetDTM;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.axes.NodeSequence;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.NodeList;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.traversal.NodeIterator;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents an XPath nodeset object, and is capable of
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * converting the nodeset to other types, such as a string.
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage general
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XNodeSet extends NodeSequence
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = 1916026368035639667L;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Default constructor for derived objects.
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected XNodeSet()
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a XNodeSet object.
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param val Value of the XNodeSet object
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XNodeSet(DTMIterator val)
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	super();
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(val instanceof XNodeSet)
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        final XNodeSet nodeSet = (XNodeSet) val;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	    setIter(nodeSet.m_iter);
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	    m_dtmMgr = nodeSet.m_dtmMgr;
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	    m_last = nodeSet.m_last;
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // First make sure the DTMIterator val has a cache,
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // so if it doesn't have one, make one.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	    if(!nodeSet.hasCache())
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	        nodeSet.setShouldCacheNodes(true);
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Get the cache from val and use it ourselves (we share it).
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	    setObject(nodeSet.getIteratorCache());
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	else
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	setIter(val);
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a XNodeSet object.
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param val Value of the XNodeSet object
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XNodeSet(XNodeSet val)
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	super();
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setIter(val.m_iter);
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dtmMgr = val.m_dtmMgr;
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_last = val.m_last;
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(!val.hasCache())
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	val.setShouldCacheNodes(true);
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setObject(val.m_obj);
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an empty XNodeSet object.  This is used to create a mutable
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * nodeset to which random nodes may be added.
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XNodeSet(DTMManager dtmMgr)
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     this(DTM.NULL,dtmMgr);
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a XNodeSet object for one node.
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to add to the new XNodeSet object
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XNodeSet(int n, DTMManager dtmMgr)
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(new NodeSetDTM(dtmMgr));
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dtmMgr = dtmMgr;
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL != n)
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ((NodeSetDTM) m_obj).addNode(n);
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_last = 1;
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	m_last = 0;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell that this is a CLASS_NODESET.
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return type CLASS_NODESET
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getType()
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return CLASS_NODESET;
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a request type, return the equivalent string.
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For diagnostic purposes.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return type string "#NODESET"
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getTypeString()
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return "#NODESET";
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get numeric value of the string conversion from a single node.
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to convert
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return numeric value of the string conversion from a single node.
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double getNumberFromNode(int n)
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XMLString xstr = m_dtmMgr.getDTM(n).getStringValue(n);
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return xstr.toDouble();
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a number.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return numeric value of the string conversion from the
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * next node in the NodeSetDTM, or NAN if no node was found
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double num()
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int node = item(0);
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (node != DTM.NULL) ? getNumberFromNode(node) : Double.NaN;
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a number, but allow side effects, such as the
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * incrementing of an iterator.
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return numeric value of the string conversion from the
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * next node in the NodeSetDTM, or NAN if no node was found
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double numWithSideEffects()
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int node = nextNode();
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (node != DTM.NULL) ? getNumberFromNode(node) : Double.NaN;
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a boolean.
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if there is a next node in the nodeset
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean bool()
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (item(0) != DTM.NULL);
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a boolean, but allow side effects, such as the
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * incrementing of an iterator.
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if there is a next node in the nodeset
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean boolWithSideEffects()
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (nextNode() != DTM.NULL);
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the string conversion from a single node.
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n Node to convert
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the string conversion from a single node.
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XMLString getStringFromNode(int n)
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %OPT%
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // I guess we'll have to get a static instance of the DTM manager...
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(DTM.NULL != n)
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_dtmMgr.getDTM(n).getStringValue(n);
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return org.apache.xpath.objects.XString.EMPTYSTRING;
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Directly call the
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * characters method on the passed ContentHandler for the
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * string-value. Multiple calls to the
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler's characters methods may well occur for a single call to
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this method.
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws org.xml.sax.SAXException
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int node = item(0);
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(node != DTM.NULL)
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dtmMgr.getDTM(node).dispatchCharactersEvents(node, ch, false);
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to an XMLString.
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The document fragment node data or the empty string.
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XMLString xstr()
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int node = item(0);
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (node != DTM.NULL) ? getStringFromNode(node) : XString.EMPTYSTRING;
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a string.
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The string this wraps or the empty string if null
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void appendToFsb(org.apache.xml.utils.FastStringBuffer fsb)
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XString xstring = (XString)xstr();
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xstring.appendToFsb(fsb);
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a string.
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the string conversion from the next node in the nodeset
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or "" if there is no next node
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String str()
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int node = item(0);
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (node != DTM.NULL) ? getStringFromNode(node).toString() : "";
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return a java object that's closest to the representation
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that should be handed to an extension.
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The object that this class wraps
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object object()
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == m_obj)
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	return this;
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	return m_obj;
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // %REVIEW%
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // hmmm...
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Cast result object to a result tree fragment.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @param support The XPath context to use for the conversion
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @return the nodeset as a result tree fragment.
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  public DocumentFragment rtree(XPathContext support)
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    DocumentBuilder db = dbf.newDocumentBuilder();
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    Document myDoc = db.newDocument();
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    DocumentFragment docFrag = myDoc.createDocumentFragment();
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    DTMIterator nl = iter();
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    int node;
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    while (DTM.NULL != (node = nl.nextNode()))
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      frag.appendChild(node, true, true);
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    return frag.getDocument();
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist.
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a NodeIterator.
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeIterator nodeset() throws javax.xml.transform.TransformerException
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return new org.apache.xml.dtm.ref.DTMNodeIterator(iter());
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist.
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a NodeList.
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeList nodelist() throws javax.xml.transform.TransformerException
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    org.apache.xml.dtm.ref.DTMNodeList nodelist = new org.apache.xml.dtm.ref.DTMNodeList(this);
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Creating a DTMNodeList has the side-effect that it will create a clone
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // XNodeSet with cache and run m_iter to the end. You cannot get any node
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // from m_iter after this call. As a fix, we call SetVector() on the clone's
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // cache. See Bugzilla 14406.
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XNodeSet clone = (XNodeSet)nodelist.getDTMIterator();
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SetVector(clone.getVector());
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return nodelist;
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Return a java object that's closest to the representation
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * that should be handed to an extension.
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @return The object that this class wraps
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  public Object object()
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    return new org.apache.xml.dtm.ref.DTMNodeList(iter());
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the iterator without cloning, etc.
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMIterator iterRaw()
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void release(DTMIterator iter)
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist.
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The nodeset as a nodelist
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMIterator iter()
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	if(hasCache())
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      		return cloneWithReset();
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	else
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      		return this; // don't bother to clone... won't do any good!
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (CloneNotSupportedException cnse)
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(cnse.getMessage());
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a fresh copy of the object.  For use with variables.
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A fresh nodelist.
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject getFresh()
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	if(hasCache())
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      		return (XObject)cloneWithReset();
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	else
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      		return this; // don't bother to clone... won't do any good!
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (CloneNotSupportedException cnse)
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(cnse.getMessage());
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a mutableNodeset.
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The nodeset as a mutableNodeset
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSetDTM mutableNodeset()
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    NodeSetDTM mnl;
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_obj instanceof NodeSetDTM)
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      mnl = (NodeSetDTM) m_obj;
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      mnl = new NodeSetDTM(iter());
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      setObject(mnl);
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      setCurrentPos(0);
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return mnl;
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Less than comparator         */
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final LessThanComparator S_LT = new LessThanComparator();
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Less than or equal comparator          */
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final LessThanOrEqualComparator S_LTE = new LessThanOrEqualComparator();
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Greater than comparator         */
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final GreaterThanComparator S_GT = new GreaterThanComparator();
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Greater than or equal comparator          */
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final GreaterThanOrEqualComparator S_GTE =
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new GreaterThanOrEqualComparator();
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Equal comparator         */
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final EqualComparator S_EQ = new EqualComparator();
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Not equal comparator         */
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final NotEqualComparator S_NEQ = new NotEqualComparator();
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than the other.
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this nodeset to
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param comparator Comparator to use
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return See the comments below for each object type comparison
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean compare(XObject obj2, Comparator comparator)
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean result = false;
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = obj2.getType();
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (XObject.CLASS_NODESET == type)
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %OPT% This should be XMLString based instead of string based...
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // From http://www.w3.org/TR/xpath:
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If both objects to be compared are node-sets, then the comparison
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // will be true if and only if there is a node in the first node-set
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // and a node in the second node-set such that the result of performing
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the comparison on the string-values of the two nodes is true.
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Note this little gem from the draft:
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // NOTE: If $x is bound to a node-set, then $x="foo"
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // does not mean the same as not($x!="foo"): the former
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // is true if and only if some node in $x has the string-value
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // foo; the latter is true if and only if all nodes in $x have
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the string-value foo.
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMIterator list1 = iterRaw();
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMIterator list2 = ((XNodeSet) obj2).iterRaw();
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node1;
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      java.util.Vector node2Strings = null;
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (node1 = list1.nextNode()))
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XMLString s1 = getStringFromNode(node1);
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == node2Strings)
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int node2;
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          while (DTM.NULL != (node2 = list2.nextNode()))
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XMLString s2 = getStringFromNode(node2);
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (comparator.compareStrings(s1, s2))
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              result = true;
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null == node2Strings)
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              node2Strings = new java.util.Vector();
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            node2Strings.addElement(s2);
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int n = node2Strings.size();
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          for (int i = 0; i < n; i++)
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (comparator.compareStrings(s1, (XMLString)node2Strings.elementAt(i)))
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              result = true;
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      list1.reset();
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      list2.reset();
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (XObject.CLASS_BOOLEAN == type)
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // From http://www.w3.org/TR/xpath:
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If one object to be compared is a node-set and the other is a boolean,
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // then the comparison will be true if and only if the result of
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // performing the comparison on the boolean and on the result of
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // converting the node-set to a boolean using the boolean function
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // is true.
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      double num1 = bool() ? 1.0 : 0.0;
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      double num2 = obj2.num();
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = comparator.compareNumbers(num1, num2);
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (XObject.CLASS_NUMBER == type)
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // From http://www.w3.org/TR/xpath:
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If one object to be compared is a node-set and the other is a number,
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // then the comparison will be true if and only if there is a
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // node in the node-set such that the result of performing the
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // comparison on the number to be compared and on the result of
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // converting the string-value of that node to a number using
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the number function is true.
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMIterator list1 = iterRaw();
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      double num2 = obj2.num();
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node;
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (node = list1.nextNode()))
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        double num1 = getNumberFromNode(node);
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (comparator.compareNumbers(num1, num2))
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          result = true;
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      list1.reset();
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (XObject.CLASS_RTREEFRAG == type)
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XMLString s2 = obj2.xstr();
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMIterator list1 = iterRaw();
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node;
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (node = list1.nextNode()))
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XMLString s1 = getStringFromNode(node);
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (comparator.compareStrings(s1, s2))
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          result = true;
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      list1.reset();
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (XObject.CLASS_STRING == type)
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // From http://www.w3.org/TR/xpath:
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If one object to be compared is a node-set and the other is a
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // string, then the comparison will be true if and only if there
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // is a node in the node-set such that the result of performing
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the comparison on the string-value of the node and the other
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // string is true.
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XMLString s2 = obj2.xstr();
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMIterator list1 = iterRaw();
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node;
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (node = list1.nextNode()))
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XMLString s1 = getStringFromNode(node);
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (comparator.compareStrings(s1, s2))
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          result = true;
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      list1.reset();
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = comparator.compareNumbers(this.num(), obj2.num());
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return result;
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than the other.
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 object to compare this nodeset to
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return see this.compare(...)
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean lessThan(XObject obj2) throws javax.xml.transform.TransformerException
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return compare(obj2, S_LT);
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than or equal to the other.
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 object to compare this nodeset to
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return see this.compare(...)
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean lessThanOrEqual(XObject obj2) throws javax.xml.transform.TransformerException
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return compare(obj2, S_LTE);
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than the other.
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 object to compare this nodeset to
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return see this.compare(...)
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean greaterThan(XObject obj2) throws javax.xml.transform.TransformerException
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return compare(obj2, S_GT);
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than the other.
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 object to compare this nodeset to
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return see this.compare(...)
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean greaterThanOrEqual(XObject obj2)
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return compare(obj2, S_GTE);
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if two objects are functionally equal.
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 object to compare this nodeset to
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return see this.compare(...)
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean equals(XObject obj2)
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return compare(obj2, S_EQ);
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch(javax.xml.transform.TransformerException te)
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new org.apache.xml.utils.WrappedRuntimeException(te);
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if two objects are functionally not equal.
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 object to compare this nodeset to
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return see this.compare(...)
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean notEquals(XObject obj2) throws javax.xml.transform.TransformerException
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return compare(obj2, S_NEQ);
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * compares nodes for various boolean operations.
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonabstract class Comparator
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Whether the strings are equal or not
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  abstract boolean compareStrings(XMLString s1, XMLString s2);
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Whether the numbers are equal or not
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  abstract boolean compareNumbers(double n1, double n2);
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compare strings or numbers for less than.
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass LessThanComparator extends Comparator
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings for less than.
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if s1 is less than s2
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (s1.toDouble() < s2.toDouble());
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // return s1.compareTo(s2) < 0;
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers for less than.
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if n1 is less than n2
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareNumbers(double n1, double n2)
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n1 < n2;
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compare strings or numbers for less than or equal.
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass LessThanOrEqualComparator extends Comparator
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings for less than or equal.
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if s1 is less than or equal to s2
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (s1.toDouble() <= s2.toDouble());
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // return s1.compareTo(s2) <= 0;
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers for less than or equal.
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if n1 is less than or equal to n2
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareNumbers(double n1, double n2)
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n1 <= n2;
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compare strings or numbers for greater than.
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass GreaterThanComparator extends Comparator
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings for greater than.
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if s1 is greater than s2
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (s1.toDouble() > s2.toDouble());
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // return s1.compareTo(s2) > 0;
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers for greater than.
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if n1 is greater than n2
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareNumbers(double n1, double n2)
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n1 > n2;
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compare strings or numbers for greater than or equal.
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass GreaterThanOrEqualComparator extends Comparator
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings for greater than or equal.
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if s1 is greater than or equal to s2
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (s1.toDouble() >= s2.toDouble());
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // return s1.compareTo(s2) >= 0;
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers for greater than or equal.
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if n1 is greater than or equal to n2
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareNumbers(double n1, double n2)
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n1 >= n2;
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compare strings or numbers for equality.
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass EqualComparator extends Comparator
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings for equality.
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if s1 is equal to s2
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return s1.equals(s2);
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers for equality.
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if n1 is equal to n2
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareNumbers(double n1, double n2)
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n1 == n2;
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compare strings or numbers for non-equality.
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass NotEqualComparator extends Comparator
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two strings for non-equality.
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s1 First string to compare
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s2 Second String to compare
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if s1 is not equal to s2
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return !s1.equals(s2);
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compare two numbers for non-equality.
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n1 First number to compare
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n2 Second number to compare
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if n1 is not equal to n2
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean compareNumbers(double n1, double n2)
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return n1 != n2;
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
970