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: XObject.java 469368 2006-10-31 04:41:36Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.objects;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.Serializable;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLString;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Expression;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.NodeSetDTM;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathException;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathVisitor;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DocumentFragment;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.NodeList;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.traversal.NodeIterator;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents an XPath object, and is capable of
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * converting the object to various types, such as a string.
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class acts as the base class to other XPath type objects,
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * such as XString, and provides polymorphic casting capabilities.
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage general
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XObject extends Expression implements Serializable, Cloneable
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -821887098985662951L;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The java object which this object wraps.
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected Object m_obj;  // This may be NULL!!!
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an XObject.
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject(){}
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an XObject.
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj Can be any object, should be a specific type
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for derived classes, or null.
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject(Object obj)
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setObject(obj);
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void setObject(Object obj) {
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_obj = obj;
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For support of literal objects in xpaths.
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath execution context.
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return This object.
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt)
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Specify if it's OK for detach to release the iterator for reuse.
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function should be called with a value of false for objects that are
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * stored in variables.
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Calling this with a value of false on a XNodeSet will cause the nodeset
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to be cached.
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param allowRelease true if it is OK for detach to release this iterator
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for pooling.
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void allowDetachToRelease(boolean allowRelease){}
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Detaches the <code>DTMIterator</code> from the set which it iterated
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * over, releasing any computational resources and placing the iterator
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the INVALID state. After <code>detach</code> has been invoked,
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * calls to <code>nextNode</code> or <code>previousNode</code> will
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * raise a runtime exception.
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void detach(){}
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Forces the object to release it's resources.  This is more harsh than
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * detach().
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void destruct()
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_obj)
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      allowDetachToRelease(true);
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      detach();
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      setObject(null);
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset for fresh reuse.
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void reset()
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Directly call the
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * characters method on the passed ContentHandler for the
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * string-value. Multiple calls to the
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler's characters methods may well occur for a single call to
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this method.
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws org.xml.sax.SAXException
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xstr().dispatchCharactersEvents(ch);
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create the right XObject based on the type of the object passed.  This
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * function can not make an XObject that exposes DOM Nodes, NodeLists, and
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NodeIterators to the XSLT stylesheet as node-sets.
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param val The java object which this object will wrap.
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the right XObject based on the type of the object passed.
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static public XObject create(Object val)
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return XObjectFactory.create(val);
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create the right XObject based on the type of the object passed.
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function <emph>can</emph> make an XObject that exposes DOM Nodes, NodeLists, and
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NodeIterators to the XSLT stylesheet as node-sets.
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param val The java object which this object will wrap.
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath context.
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the right XObject based on the type of the object passed.
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static public XObject create(Object val, XPathContext xctxt)
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return XObjectFactory.create(val, xctxt);
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for NULL object type */
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_NULL = -1;
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for UNKNOWN object type */
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_UNKNOWN = 0;
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for BOOLEAN  object type */
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_BOOLEAN = 1;
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for NUMBER object type */
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_NUMBER = 2;
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for STRING object type */
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_STRING = 3;
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for NODESET object type */
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_NODESET = 4;
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Constant for RESULT TREE FRAGMENT object type */
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_RTREEFRAG = 5;
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Represents an unresolved variable type as an integer. */
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int CLASS_UNRESOLVEDVARIABLE = 600;
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell what kind of class this is.
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return CLASS_UNKNOWN
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getType()
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return CLASS_UNKNOWN;
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a request type, return the equivalent string.
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For diagnostic purposes.
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return type string "#UNKNOWN" + object class name
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getTypeString()
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return "#UNKNOWN (" + object().getClass().getName() + ")";
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a number. Always issues an error.
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return 0.0
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double num() throws javax.xml.transform.TransformerException
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XPATHErrorResources.ER_CANT_CONVERT_TO_NUMBER,
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          new Object[]{ getTypeString() });  //"Can not convert "+getTypeString()+" to a number");
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return 0.0;
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a number, but allow side effects, such as the
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * incrementing of an iterator.
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return numeric value of the string conversion from the
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * next node in the NodeSetDTM, or NAN if no node was found
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double numWithSideEffects()  throws javax.xml.transform.TransformerException
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return num();
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a boolean. Always issues an error.
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return false
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean bool() throws javax.xml.transform.TransformerException
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XPATHErrorResources.ER_CANT_CONVERT_TO_NUMBER,
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          new Object[]{ getTypeString() });  //"Can not convert "+getTypeString()+" to a number");
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a boolean, but allow side effects, such as the
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * incrementing of an iterator.
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if there is a next node in the nodeset
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean boolWithSideEffects() throws javax.xml.transform.TransformerException
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return bool();
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a string.
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The string this wraps or the empty string if null
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XMLString xstr()
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return XMLStringFactoryImpl.getFactory().newstr(str());
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a string.
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The object as a string
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String str()
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (m_obj != null) ? m_obj.toString() : "";
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the string representation of the object
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the string representation of the object
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String toString()
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return str();
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a result tree fragment.
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support XPath context to use for the conversion
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the objec as a result tree fragment.
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int rtf(XPathContext support)
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int result = rtf();
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL == result)
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM frag = support.createDocumentFragment();
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %OPT%
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      frag.appendTextChild(str());
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = frag.getDocument();
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return result;
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a result tree fragment.
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support XPath context to use for the conversion
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the objec as a result tree fragment.
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DocumentFragment rtree(XPathContext support)
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DocumentFragment docFrag = null;
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int result = rtf();
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL == result)
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM frag = support.createDocumentFragment();
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %OPT%
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      frag.appendTextChild(str());
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      docFrag = (DocumentFragment)frag.getNode(frag.getDocument());
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM frag = support.getDTM(result);
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      docFrag = (DocumentFragment)frag.getNode(frag.getDocument());
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return docFrag;
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For functions to override.
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DocumentFragment rtree()
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For functions to override.
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int rtf()
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return a java object that's closest to the representation
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that should be handed to an extension.
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The object that this class wraps
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object object()
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_obj;
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist. Always issues an error.
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMIterator iter() throws javax.xml.transform.TransformerException
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XPATHErrorResources.ER_CANT_CONVERT_TO_NODELIST,
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          new Object[]{ getTypeString() });  //"Can not convert "+getTypeString()+" to a NodeList!");
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a fresh copy of the object.  For use with variables.
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return This object, unless overridden by subclass.
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject getFresh()
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist. Always issues an error.
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeIterator nodeset() throws javax.xml.transform.TransformerException
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XPATHErrorResources.ER_CANT_CONVERT_TO_NODELIST,
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          new Object[]{ getTypeString() });  //"Can not convert "+getTypeString()+" to a NodeList!");
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist. Always issues an error.
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeList nodelist() throws javax.xml.transform.TransformerException
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XPATHErrorResources.ER_CANT_CONVERT_TO_NODELIST,
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          new Object[]{ getTypeString() });  //"Can not convert "+getTypeString()+" to a NodeList!");
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a nodelist. Always issues an error.
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The object as a NodeSetDTM.
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeSetDTM mutableNodeset()
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XPATHErrorResources.ER_CANT_CONVERT_TO_MUTABLENODELIST,
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          new Object[]{ getTypeString() });  //"Can not convert "+getTypeString()+" to a NodeSetDTM!");
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (NodeSetDTM) m_obj;
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast object to type t.
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param t Type of object to cast this to
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support XPath context to use for the conversion
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return This object as the given type t
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Object castToType(int t, XPathContext support)
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Object result;
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (t)
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case CLASS_STRING :
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = str();
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case CLASS_NUMBER :
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = new Double(num());
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case CLASS_NODESET :
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = iter();
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case CLASS_BOOLEAN :
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = new Boolean(bool());
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case CLASS_UNKNOWN :
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = m_obj;
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %TBD%  What to do here?
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //    case CLASS_RTREEFRAG :
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      result = rtree(support);
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //      break;
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      error(XPATHErrorResources.ER_CANT_CONVERT_TO_TYPE,
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            new Object[]{ getTypeString(),
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          Integer.toString(t) });  //"Can not convert "+getTypeString()+" to a type#"+t);
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      result = null;
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return result;
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than the other.
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this to
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this object is less than the given object
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean lessThan(XObject obj2)
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // In order to handle the 'all' semantics of
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset comparisons, we always call the
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset function.  Because the arguments
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // are backwards, we call the opposite comparison
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // function.
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (obj2.getType() == XObject.CLASS_NODESET)
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.greaterThan(this);
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this.num() < obj2.num();
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is less than or equal to the other.
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this to
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this object is less than or equal to the given object
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean lessThanOrEqual(XObject obj2)
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // In order to handle the 'all' semantics of
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset comparisons, we always call the
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset function.  Because the arguments
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // are backwards, we call the opposite comparison
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // function.
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (obj2.getType() == XObject.CLASS_NODESET)
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.greaterThanOrEqual(this);
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this.num() <= obj2.num();
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is greater than the other.
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this to
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this object is greater than the given object
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean greaterThan(XObject obj2)
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // In order to handle the 'all' semantics of
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset comparisons, we always call the
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset function.  Because the arguments
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // are backwards, we call the opposite comparison
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // function.
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (obj2.getType() == XObject.CLASS_NODESET)
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.lessThan(this);
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this.num() > obj2.num();
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if one object is greater than or equal to the other.
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this to
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this object is greater than or equal to the given object
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean greaterThanOrEqual(XObject obj2)
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // In order to handle the 'all' semantics of
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset comparisons, we always call the
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset function.  Because the arguments
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // are backwards, we call the opposite comparison
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // function.
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (obj2.getType() == XObject.CLASS_NODESET)
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.lessThanOrEqual(this);
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this.num() >= obj2.num();
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if two objects are functionally equal.
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this to
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this object is equal to the given object
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean equals(XObject obj2)
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // In order to handle the 'all' semantics of
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset comparisons, we always call the
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset function.
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (obj2.getType() == XObject.CLASS_NODESET)
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.equals(this);
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_obj)
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_obj.equals(obj2.m_obj);
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.m_obj == null;
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if two objects are functionally not equal.
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param obj2 Object to compare this to
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True if this object is not equal to the given object
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean notEquals(XObject obj2)
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // In order to handle the 'all' semantics of
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset comparisons, we always call the
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // nodeset function.
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (obj2.getType() == XObject.CLASS_NODESET)
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return obj2.notEquals(this);
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return !equals(obj2);
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell the user of an error, and probably throw an
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception.
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param msg Error message to issue
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void error(String msg)
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(msg, null);
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell the user of an error, and probably throw an
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception.
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param msg Error message to issue
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param args Arguments to use in the message
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void error(String msg, Object[] args)
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String fmsg = XSLMessages.createXPATHMessage(msg, args);
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // boolean shouldThrow = support.problem(m_support.XPATHPROCESSOR,
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //                                      m_support.ERROR,
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //                                      null,
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //                                      null, fmsg, 0, 0);
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // if(shouldThrow)
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new XPathException(fmsg, this);
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XObjects should not normally need to fix up variables.
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void fixupVariables(java.util.Vector vars, int globalsSize)
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no-op
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Cast result object to a string.
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param fsb
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The string this wraps or the empty string if null
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void appendToFsb(org.apache.xml.utils.FastStringBuffer fsb)
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    fsb.append(str());
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	assertion(false, "callVisitors should not be called for this object!!!");
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see Expression#deepEquals(Expression)
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean deepEquals(Expression expr)
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(!isSameClass(expr))
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// If equals at the expression level calls deepEquals, I think we're
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// still safe from infinite recursion since this object overrides
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	// equals.  I hope.
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(!this.equals((XObject)expr))
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return true;
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
760