14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file
44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information
54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file
64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License.
84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at
94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software
134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and
164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License.
174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: XNodeSet.java 469368 2006-10-31 04:41:36Z minchau $
204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xpath.objects;
224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.dtm.DTM;
244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.dtm.DTMManager;
264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.utils.XMLString;
274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.NodeSetDTM;
284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.axes.NodeSequence;
294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.w3c.dom.NodeList;
314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.w3c.dom.traversal.NodeIterator;
324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class represents an XPath nodeset object, and is capable of
354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * converting the nodeset to other types, such as a string.
364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage general
374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class XNodeSet extends NodeSequence
394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    static final long serialVersionUID = 1916026368035639667L;
414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Default constructor for derived objects.
434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  protected XNodeSet()
454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a XNodeSet object.
504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param val Value of the XNodeSet object
524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XNodeSet(DTMIterator val)
544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	super();
564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	if(val instanceof XNodeSet)
574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	{
584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        final XNodeSet nodeSet = (XNodeSet) val;
594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	    setIter(nodeSet.m_iter);
604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	    m_dtmMgr = nodeSet.m_dtmMgr;
614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	    m_last = nodeSet.m_last;
624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // First make sure the DTMIterator val has a cache,
634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // so if it doesn't have one, make one.
644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	    if(!nodeSet.hasCache())
654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	        nodeSet.setShouldCacheNodes(true);
664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // Get the cache from val and use it ourselves (we share it).
684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	    setObject(nodeSet.getIteratorCache());
694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	}
704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	else
714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	setIter(val);
724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a XNodeSet object.
764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param val Value of the XNodeSet object
784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XNodeSet(XNodeSet val)
804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	super();
824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    setIter(val.m_iter);
834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_dtmMgr = val.m_dtmMgr;
844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_last = val.m_last;
854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if(!val.hasCache())
864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	val.setShouldCacheNodes(true);
874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    setObject(val.m_obj);
884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct an empty XNodeSet object.  This is used to create a mutable
934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * nodeset to which random nodes may be added.
944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XNodeSet(DTMManager dtmMgr)
964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson     this(DTM.NULL,dtmMgr);
984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a XNodeSet object for one node.
1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n Node to add to the new XNodeSet object
1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XNodeSet(int n, DTMManager dtmMgr)
1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    super(new NodeSetDTM(dtmMgr));
1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_dtmMgr = dtmMgr;
1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (DTM.NULL != n)
1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      ((NodeSetDTM) m_obj).addNode(n);
1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_last = 1;
1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else
1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	m_last = 0;
1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell that this is a CLASS_NODESET.
1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return type CLASS_NODESET
1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public int getType()
1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return CLASS_NODESET;
1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Given a request type, return the equivalent string.
1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * For diagnostic purposes.
1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return type string "#NODESET"
1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public String getTypeString()
1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return "#NODESET";
1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get numeric value of the string conversion from a single node.
1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n Node to convert
1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return numeric value of the string conversion from a single node.
1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public double getNumberFromNode(int n)
1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    XMLString xstr = m_dtmMgr.getDTM(n).getStringValue(n);
1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return xstr.toDouble();
1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a number.
1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return numeric value of the string conversion from the
1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * next node in the NodeSetDTM, or NAN if no node was found
1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public double num()
1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int node = item(0);
1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (node != DTM.NULL) ? getNumberFromNode(node) : Double.NaN;
1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a number, but allow side effects, such as the
1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * incrementing of an iterator.
1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return numeric value of the string conversion from the
1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * next node in the NodeSetDTM, or NAN if no node was found
1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public double numWithSideEffects()
1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int node = nextNode();
1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (node != DTM.NULL) ? getNumberFromNode(node) : Double.NaN;
1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a boolean.
1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return True if there is a next node in the nodeset
1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean bool()
1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (item(0) != DTM.NULL);
1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a boolean, but allow side effects, such as the
1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * incrementing of an iterator.
1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return True if there is a next node in the nodeset
1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean boolWithSideEffects()
1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (nextNode() != DTM.NULL);
2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get the string conversion from a single node.
2064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n Node to convert
2084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return the string conversion from a single node.
2104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XMLString getStringFromNode(int n)
2124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // %OPT%
2144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // I guess we'll have to get a static instance of the DTM manager...
2154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if(DTM.NULL != n)
2164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      return m_dtmMgr.getDTM(n).getStringValue(n);
2184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else
2204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      return org.apache.xpath.objects.XString.EMPTYSTRING;
2224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Directly call the
2274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * characters method on the passed ContentHandler for the
2284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * string-value. Multiple calls to the
2294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * ContentHandler's characters methods may well occur for a single call to
2304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * this method.
2314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
2334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws org.xml.sax.SAXException
2354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
2374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          throws org.xml.sax.SAXException
2384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int node = item(0);
2404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if(node != DTM.NULL)
2424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_dtmMgr.getDTM(node).dispatchCharactersEvents(node, ch, false);
2444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to an XMLString.
2504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The document fragment node data or the empty string.
2524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XMLString xstr()
2544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int node = item(0);
2564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (node != DTM.NULL) ? getStringFromNode(node) : XString.EMPTYSTRING;
2574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a string.
2614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The string this wraps or the empty string if null
2634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void appendToFsb(org.apache.xml.utils.FastStringBuffer fsb)
2654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    XString xstring = (XString)xstr();
2674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    xstring.appendToFsb(fsb);
2684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a string.
2734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return the string conversion from the next node in the nodeset
2754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * or "" if there is no next node
2764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public String str()
2784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int node = item(0);
2804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (node != DTM.NULL) ? getStringFromNode(node).toString() : "";
2814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Return a java object that's closest to the representation
2854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * that should be handed to an extension.
2864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The object that this class wraps
2884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public Object object()
2904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if(null == m_obj)
2924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	return this;
2934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else
2944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	return m_obj;
2954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  // %REVIEW%
2984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  // hmmm...
2994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  /**
3004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   * Cast result object to a result tree fragment.
3014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   *
3024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   * @param support The XPath context to use for the conversion
3034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   *
3044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   * @return the nodeset as a result tree fragment.
3054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   */
3064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  public DocumentFragment rtree(XPathContext support)
3074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  {
3084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
3094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    DocumentBuilder db = dbf.newDocumentBuilder();
3104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    Document myDoc = db.newDocument();
3114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//
3124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    DocumentFragment docFrag = myDoc.createDocumentFragment();
3134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//
3144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    DTMIterator nl = iter();
3154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    int node;
3164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//
3174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    while (DTM.NULL != (node = nl.nextNode()))
3184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    {
3194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//      frag.appendChild(node, true, true);
3204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    }
3214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//
3224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    return frag.getDocument();
3234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  }
3244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a nodelist.
3274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return a NodeIterator.
3294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
3314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public NodeIterator nodeset() throws javax.xml.transform.TransformerException
3334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return new org.apache.xml.dtm.ref.DTMNodeIterator(iter());
3354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a nodelist.
3394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return a NodeList.
3414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
3434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public NodeList nodelist() throws javax.xml.transform.TransformerException
3454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    org.apache.xml.dtm.ref.DTMNodeList nodelist = new org.apache.xml.dtm.ref.DTMNodeList(this);
3474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // Creating a DTMNodeList has the side-effect that it will create a clone
3484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // XNodeSet with cache and run m_iter to the end. You cannot get any node
3494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // from m_iter after this call. As a fix, we call SetVector() on the clone's
3504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // cache. See Bugzilla 14406.
3514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    XNodeSet clone = (XNodeSet)nodelist.getDTMIterator();
3524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    SetVector(clone.getVector());
3534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return nodelist;
3544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  /**
3584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   * Return a java object that's closest to the representation
3594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   * that should be handed to an extension.
3604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   *
3614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   * @return The object that this class wraps
3624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//   */
3634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  public Object object()
3644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  {
3654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//    return new org.apache.xml.dtm.ref.DTMNodeList(iter());
3664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson//  }
3674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Return the iterator without cloning, etc.
3704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public DTMIterator iterRaw()
3724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return this;
3744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void release(DTMIterator iter)
3774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a nodelist.
3824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The nodeset as a nodelist
3844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public DTMIterator iter()
3864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    try
3884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	if(hasCache())
3904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      		return cloneWithReset();
3914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      	else
3924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      		return this; // don't bother to clone... won't do any good!
3934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    catch (CloneNotSupportedException cnse)
3954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      throw new RuntimeException(cnse.getMessage());
3974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
4014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get a fresh copy of the object.  For use with variables.
4024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return A fresh nodelist.
4044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
4054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public XObject getFresh()
4064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
4074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    try
4084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
4094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    	if(hasCache())
4104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      		return (XObject)cloneWithReset();
4114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      	else
4124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      		return this; // don't bother to clone... won't do any good!
4134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
4144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    catch (CloneNotSupportedException cnse)
4154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
4164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      throw new RuntimeException(cnse.getMessage());
4174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
4184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
4194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
4214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Cast result object to a mutableNodeset.
4224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return The nodeset as a mutableNodeset
4244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
4254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public NodeSetDTM mutableNodeset()
4264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
4274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    NodeSetDTM mnl;
4284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if(m_obj instanceof NodeSetDTM)
4304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
4314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      mnl = (NodeSetDTM) m_obj;
4324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
4334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else
4344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
4354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      mnl = new NodeSetDTM(iter());
4364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      setObject(mnl);
4374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      setCurrentPos(0);
4384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
4394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return mnl;
4414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
4424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Less than comparator         */
4444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  static final LessThanComparator S_LT = new LessThanComparator();
4454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Less than or equal comparator          */
4474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  static final LessThanOrEqualComparator S_LTE = new LessThanOrEqualComparator();
4484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Greater than comparator         */
4504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  static final GreaterThanComparator S_GT = new GreaterThanComparator();
4514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Greater than or equal comparator          */
4534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  static final GreaterThanOrEqualComparator S_GTE =
4544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    new GreaterThanOrEqualComparator();
4554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Equal comparator         */
4574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  static final EqualComparator S_EQ = new EqualComparator();
4584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Not equal comparator         */
4604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  static final NotEqualComparator S_NEQ = new NotEqualComparator();
4614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
4634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if one object is less than the other.
4644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 Object to compare this nodeset to
4664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param comparator Comparator to use
4674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return See the comments below for each object type comparison
4694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
4714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
4724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean compare(XObject obj2, Comparator comparator)
4734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          throws javax.xml.transform.TransformerException
4744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
4754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    boolean result = false;
4774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    int type = obj2.getType();
4784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (XObject.CLASS_NODESET == type)
4804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
4814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // %OPT% This should be XMLString based instead of string based...
4824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // From http://www.w3.org/TR/xpath:
4844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // If both objects to be compared are node-sets, then the comparison
4854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // will be true if and only if there is a node in the first node-set
4864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // and a node in the second node-set such that the result of performing
4874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // the comparison on the string-values of the two nodes is true.
4884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // Note this little gem from the draft:
4894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // NOTE: If $x is bound to a node-set, then $x="foo"
4904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // does not mean the same as not($x!="foo"): the former
4914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // is true if and only if some node in $x has the string-value
4924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // foo; the latter is true if and only if all nodes in $x have
4934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // the string-value foo.
4944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      DTMIterator list1 = iterRaw();
4954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      DTMIterator list2 = ((XNodeSet) obj2).iterRaw();
4964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      int node1;
4974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      java.util.Vector node2Strings = null;
4984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      while (DTM.NULL != (node1 = list1.nextNode()))
5004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
5014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XMLString s1 = getStringFromNode(node1);
5024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (null == node2Strings)
5044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
5054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          int node2;
5064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          while (DTM.NULL != (node2 = list2.nextNode()))
5084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
5094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            XMLString s2 = getStringFromNode(node2);
5104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            if (comparator.compareStrings(s1, s2))
5124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            {
5134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson              result = true;
5144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson              break;
5164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            }
5174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            if (null == node2Strings)
5194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson              node2Strings = new java.util.Vector();
5204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            node2Strings.addElement(s2);
5224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
5234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
5244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        else
5254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
5264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          int n = node2Strings.size();
5274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          for (int i = 0; i < n; i++)
5294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
5304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            if (comparator.compareStrings(s1, (XMLString)node2Strings.elementAt(i)))
5314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            {
5324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson              result = true;
5334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson              break;
5354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            }
5364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
5374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
5384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
5394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      list1.reset();
5404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      list2.reset();
5414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
5424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else if (XObject.CLASS_BOOLEAN == type)
5434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
5444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // From http://www.w3.org/TR/xpath:
5464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // If one object to be compared is a node-set and the other is a boolean,
5474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // then the comparison will be true if and only if the result of
5484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // performing the comparison on the boolean and on the result of
5494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // converting the node-set to a boolean using the boolean function
5504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // is true.
5514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      double num1 = bool() ? 1.0 : 0.0;
5524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      double num2 = obj2.num();
5534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      result = comparator.compareNumbers(num1, num2);
5554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
5564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else if (XObject.CLASS_NUMBER == type)
5574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
5584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // From http://www.w3.org/TR/xpath:
5604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // If one object to be compared is a node-set and the other is a number,
5614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // then the comparison will be true if and only if there is a
5624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // node in the node-set such that the result of performing the
5634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // comparison on the number to be compared and on the result of
5644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // converting the string-value of that node to a number using
5654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // the number function is true.
5664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      DTMIterator list1 = iterRaw();
5674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      double num2 = obj2.num();
5684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      int node;
5694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      while (DTM.NULL != (node = list1.nextNode()))
5714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
5724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        double num1 = getNumberFromNode(node);
5734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (comparator.compareNumbers(num1, num2))
5754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
5764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          result = true;
5774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          break;
5794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
5804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
5814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      list1.reset();
5824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
5834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else if (XObject.CLASS_RTREEFRAG == type)
5844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
5854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      XMLString s2 = obj2.xstr();
5864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      DTMIterator list1 = iterRaw();
5874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      int node;
5884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      while (DTM.NULL != (node = list1.nextNode()))
5904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
5914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XMLString s1 = getStringFromNode(node);
5924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (comparator.compareStrings(s1, s2))
5944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
5954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          result = true;
5964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
5974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          break;
5984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
5994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
6004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      list1.reset();
6014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
6024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else if (XObject.CLASS_STRING == type)
6034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
6044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // From http://www.w3.org/TR/xpath:
6064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // If one object to be compared is a node-set and the other is a
6074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // string, then the comparison will be true if and only if there
6084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // is a node in the node-set such that the result of performing
6094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // the comparison on the string-value of the node and the other
6104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // string is true.
6114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      XMLString s2 = obj2.xstr();
6124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      DTMIterator list1 = iterRaw();
6134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      int node;
6144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      while (DTM.NULL != (node = list1.nextNode()))
6164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
6174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XMLString s1 = getStringFromNode(node);
6184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (comparator.compareStrings(s1, s2))
6194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
6204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          result = true;
6214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          break;
6234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
6244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
6254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      list1.reset();
6264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
6274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else
6284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
6294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      result = comparator.compareNumbers(this.num(), obj2.num());
6304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
6314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return result;
6334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
6344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
6364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if one object is less than the other.
6374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 object to compare this nodeset to
6394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return see this.compare(...)
6414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
6434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
6444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean lessThan(XObject obj2) throws javax.xml.transform.TransformerException
6454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
6464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return compare(obj2, S_LT);
6474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
6484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
6504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if one object is less than or equal to the other.
6514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 object to compare this nodeset to
6534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return see this.compare(...)
6554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
6574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
6584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean lessThanOrEqual(XObject obj2) throws javax.xml.transform.TransformerException
6594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
6604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return compare(obj2, S_LTE);
6614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
6624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
6644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if one object is less than the other.
6654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 object to compare this nodeset to
6674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return see this.compare(...)
6694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
6714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
6724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean greaterThan(XObject obj2) throws javax.xml.transform.TransformerException
6734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
6744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return compare(obj2, S_GT);
6754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
6764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
6784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if one object is less than the other.
6794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 object to compare this nodeset to
6814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return see this.compare(...)
6834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
6854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
6864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean greaterThanOrEqual(XObject obj2)
6874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          throws javax.xml.transform.TransformerException
6884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
6894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return compare(obj2, S_GTE);
6904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
6914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
6924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
6934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if two objects are functionally equal.
6944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 object to compare this nodeset to
6964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return see this.compare(...)
6984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
6994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
7004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
7014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean equals(XObject obj2)
7024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
7034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    try
7044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
7054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      return compare(obj2, S_EQ);
7064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
7074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    catch(javax.xml.transform.TransformerException te)
7084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
7094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      throw new org.apache.xml.utils.WrappedRuntimeException(te);
7104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
7114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
7124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
7144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if two objects are functionally not equal.
7154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param obj2 object to compare this nodeset to
7174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return see this.compare(...)
7194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @throws javax.xml.transform.TransformerException
7214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
7224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public boolean notEquals(XObject obj2) throws javax.xml.transform.TransformerException
7234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
7244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return compare(obj2, S_NEQ);
7254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
7264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
7274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
7294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * compares nodes for various boolean operations.
7304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
7314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonabstract class Comparator
7324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
7334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
7354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings
7364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
7394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
7404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return Whether the strings are equal or not
7424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
7434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  abstract boolean compareStrings(XMLString s1, XMLString s2);
7444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
7464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers
7474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
7504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
7514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return Whether the numbers are equal or not
7534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
7544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  abstract boolean compareNumbers(double n1, double n2);
7554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
7564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
7584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Compare strings or numbers for less than.
7594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
7604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass LessThanComparator extends Comparator
7614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
7624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
7644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings for less than.
7654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
7684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
7694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return True if s1 is less than s2
7714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
7724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
7734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
7744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (s1.toDouble() < s2.toDouble());
7754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // return s1.compareTo(s2) < 0;
7764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
7774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
7794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers for less than.
7804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
7834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
7844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
7854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if n1 is less than n2
7864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
7874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareNumbers(double n1, double n2)
7884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
7894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return n1 < n2;
7904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
7914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
7924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
7944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Compare strings or numbers for less than or equal.
7954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
7964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass LessThanOrEqualComparator extends Comparator
7974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
7984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
7994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
8004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings for less than or equal.
8014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
8044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
8054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if s1 is less than or equal to s2
8074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
8084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
8094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
8104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (s1.toDouble() <= s2.toDouble());
8114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // return s1.compareTo(s2) <= 0;
8124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
8134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
8154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers for less than or equal.
8164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
8194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
8204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if n1 is less than or equal to n2
8224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
8234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareNumbers(double n1, double n2)
8244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
8254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return n1 <= n2;
8264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
8274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
8284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
8304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Compare strings or numbers for greater than.
8314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
8324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass GreaterThanComparator extends Comparator
8334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
8344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
8364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings for greater than.
8374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
8404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
8414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if s1 is greater than s2
8434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
8444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
8454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
8464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (s1.toDouble() > s2.toDouble());
8474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // return s1.compareTo(s2) > 0;
8484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
8494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
8514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers for greater than.
8524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
8554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
8564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if n1 is greater than n2
8584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
8594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareNumbers(double n1, double n2)
8604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
8614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return n1 > n2;
8624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
8634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
8644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
8664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Compare strings or numbers for greater than or equal.
8674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
8684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass GreaterThanOrEqualComparator extends Comparator
8694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
8704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
8724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings for greater than or equal.
8734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
8764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
8774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if s1 is greater than or equal to s2
8794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
8804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
8814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
8824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return (s1.toDouble() >= s2.toDouble());
8834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    // return s1.compareTo(s2) >= 0;
8844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
8854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
8864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
8874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers for greater than or equal.
8884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
8914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
8924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
8934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if n1 is greater than or equal to n2
8944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
8954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareNumbers(double n1, double n2)
8964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
8974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return n1 >= n2;
8984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
8994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
9004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
9014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
9024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Compare strings or numbers for equality.
9034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
9044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass EqualComparator extends Comparator
9054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
9064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
9074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
9084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings for equality.
9094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
9124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
9134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if s1 is equal to s2
9154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
9164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
9174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
9184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return s1.equals(s2);
9194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
9204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
9214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
9224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers for equality.
9234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
9264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
9274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if n1 is equal to n2
9294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
9304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareNumbers(double n1, double n2)
9314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
9324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return n1 == n2;
9334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
9344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
9354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
9364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
9374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Compare strings or numbers for non-equality.
9384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
9394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass NotEqualComparator extends Comparator
9404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
9414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
9424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
9434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two strings for non-equality.
9444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s1 First string to compare
9474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s2 Second String to compare
9484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if s1 is not equal to s2
9504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
9514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareStrings(XMLString s1, XMLString s2)
9524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
9534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return !s1.equals(s2);
9544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
9554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
9564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
9574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Compare two numbers for non-equality.
9584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n1 First number to compare
9614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param n2 Second number to compare
9624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
9634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if n1 is not equal to n2
9644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
9654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  boolean compareNumbers(double n1, double n2)
9664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
9674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return n1 != n2;
9684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
9694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
970