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: DTMDefaultBase.java 468653 2006-10-28 07:07:05Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.dtm.ref;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.*;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SuballocatedIntVector;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.BoolStack;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLString;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLStringFactory;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLMessages;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLErrorResources;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.*; // for dumpDTM
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The <code>DTMDefaultBase</code> class serves as a helper base for DTMs.
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * It sets up structures for navigation and type, while leaving data
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * management and construction to the derived classes.
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic abstract class DTMDefaultBase implements DTM
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final boolean JJK_DEBUG=false;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // This constant is likely to be removed in the future. Use the
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // getDocument() method instead of ROOTNODE to get at the root
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // node of a DTM.
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The identity of the root node. */
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int ROOTNODE = 0;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The number of nodes, which is also used to determine the next
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  node index.
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int m_size = 0;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The expanded names, one array element for each node. */
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_exptype;
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** First child values, one array element for each node. */
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_firstch;
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Next sibling values, one array element for each node. */
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_nextsib;
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Previous sibling values, one array element for each node. */
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_prevsib;
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Previous sibling values, one array element for each node. */
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_parent;
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Vector of SuballocatedIntVectors of NS decl sets */
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected Vector m_namespaceDeclSets = null;
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** SuballocatedIntVector  of elements at which corresponding
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespaceDeclSets were defined */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_namespaceDeclSetElements = null;
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * These hold indexes to elements based on namespace and local name.
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The base lookup is the the namespace.  The second lookup is the local
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * name, and the last array contains the the first free element
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * at the start, and the list of element handles following.
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int[][][] m_elemIndexes;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The default block size of the node arrays */
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int DEFAULT_BLOCKSIZE = 512;  // favor small docs.
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The number of blocks for the node arrays */
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int DEFAULT_NUMBLOCKS = 32;
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The number of blocks used for small documents & RTFs */
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int DEFAULT_NUMBLOCKS_SMALL = 4;
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The block size of the node arrays */
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //protected final int m_blocksize;
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The value to use when the information has not been built yet.
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected static final int NOTPROCESSED = DTM.NULL - 1;
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The DTM manager who "owns" this DTM.
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMManager m_mgr;
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * m_mgr cast to DTMManagerDefault, or null if it isn't an instance
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (Efficiency hook)
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTMManagerDefault m_mgrDefault=null;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The document identity number(s). If we have overflowed the addressing
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * range of the first that was assigned to us, we may add others. */
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_dtmIdent;
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The mask for the identity.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      %REVIEW% Should this really be set to the _DEFAULT? What if
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      a particular DTM wanted to use another value? */
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //protected final static int m_mask = DTMManager.IDENT_NODE_DEFAULT;
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The base URI for this document. */
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected String m_documentBaseURI;
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The whitespace filter that enables elements to strip whitespace or not.
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTMWSFilter m_wsfilter;
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Flag indicating whether to strip whitespace nodes */
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean m_shouldStripWS = false;
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Stack of flags indicating whether to strip whitespace nodes */
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected BoolStack m_shouldStripWhitespaceStack;
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The XMLString factory for creating XMLStrings. */
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected XMLStringFactory m_xstrf;
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The table for exandedNameID lookups.  This may or may not be the same
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * table as is contained in the DTMManagerDefault.
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected ExpandedNameTable m_expandedNameTable;
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** true if indexing is turned on. */
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean m_indexing;
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a DTMDefaultBase object using the default block size.
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mgr The DTMManager who owns this DTM.
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source The object that is used to specify the construction source.
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmIdentity The DTM identity ID for this DTM.
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter The white space filter for this DTM, which may
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xstringfactory The factory to use for creating XMLStrings.
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMDefaultBase(DTMManager mgr, Source source, int dtmIdentity,
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			DTMWSFilter whiteSpaceFilter,
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			XMLStringFactory xstringfactory, boolean doIndexing)
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(mgr, source, dtmIdentity, whiteSpaceFilter, xstringfactory,
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         doIndexing, DEFAULT_BLOCKSIZE, true, false);
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a DTMDefaultBase object from a DOM node.
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mgr The DTMManager who owns this DTM.
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source The object that is used to specify the construction source.
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmIdentity The DTM identity ID for this DTM.
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter The white space filter for this DTM, which may
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xstringfactory The factory to use for creating XMLStrings.
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param blocksize The block size of the DTM.
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param usePrevsib true if we want to build the previous sibling node array.
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param newNameTable true if we want to use a new ExpandedNameTable for this DTM.
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMDefaultBase(DTMManager mgr, Source source, int dtmIdentity,
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DTMWSFilter whiteSpaceFilter,
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        XMLStringFactory xstringfactory, boolean doIndexing,
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        int blocksize, boolean usePrevsib,
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        boolean newNameTable)
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Use smaller sizes for the internal node arrays if the block size
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is small.
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int numblocks;
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (blocksize <= 64)
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      numblocks = DEFAULT_NUMBLOCKS_SMALL;
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dtmIdent= new SuballocatedIntVector(4, 1);
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      numblocks = DEFAULT_NUMBLOCKS;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dtmIdent= new SuballocatedIntVector(32);
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_exptype = new SuballocatedIntVector(blocksize, numblocks);
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstch = new SuballocatedIntVector(blocksize, numblocks);
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_nextsib = new SuballocatedIntVector(blocksize, numblocks);
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_parent  = new SuballocatedIntVector(blocksize, numblocks);
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Only create the m_prevsib array if the usePrevsib flag is true.
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Some DTM implementations (e.g. SAXImpl) do not need this array.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // We can save the time to build it in those cases.
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (usePrevsib)
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_prevsib = new SuballocatedIntVector(blocksize, numblocks);
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mgr = mgr;
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(mgr instanceof DTMManagerDefault)
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mgrDefault=(DTMManagerDefault)mgr;
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_documentBaseURI = (null != source) ? source.getSystemId() : null;
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dtmIdent.setElementAt(dtmIdentity,0);
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_wsfilter = whiteSpaceFilter;
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_xstrf = xstringfactory;
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_indexing = doIndexing;
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (doIndexing)
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_expandedNameTable = new ExpandedNameTable();
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Note that this fails if we aren't talking to an instance of
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // DTMManagerDefault
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_expandedNameTable = m_mgrDefault.getExpandedNameTable(this);
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != whiteSpaceFilter)
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_shouldStripWhitespaceStack = new BoolStack();
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pushShouldStripWhitespace(false);
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Ensure that the size of the element indexes can hold the information.
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespaceID Namespace ID index.
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param LocalNameID Local name ID.
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void ensureSizeOfIndex(int namespaceID, int LocalNameID)
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_elemIndexes)
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elemIndexes = new int[namespaceID + 20][][];
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (m_elemIndexes.length <= namespaceID)
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int[][][] indexes = m_elemIndexes;
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elemIndexes = new int[namespaceID + 20][][];
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(indexes, 0, m_elemIndexes, 0, indexes.length);
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int[][] localNameIndex = m_elemIndexes[namespaceID];
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == localNameIndex)
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      localNameIndex = new int[LocalNameID + 100][];
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elemIndexes[namespaceID] = localNameIndex;
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (localNameIndex.length <= LocalNameID)
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int[][] indexes = localNameIndex;
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      localNameIndex = new int[LocalNameID + 100][];
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(indexes, 0, localNameIndex, 0, indexes.length);
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_elemIndexes[namespaceID] = localNameIndex;
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int[] elemHandles = localNameIndex[LocalNameID];
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == elemHandles)
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      elemHandles = new int[128];
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      localNameIndex[LocalNameID] = elemHandles;
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      elemHandles[0] = 1;
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (elemHandles.length <= elemHandles[0] + 1)
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int[] indexes = elemHandles;
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      elemHandles = new int[elemHandles[0] + 1024];
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.arraycopy(indexes, 0, elemHandles, 0, indexes.length);
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      localNameIndex[LocalNameID] = elemHandles;
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add a node to the element indexes. The node will not be added unless
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it's an element.
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expandedTypeID The expanded type ID of the node.
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity index.
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void indexNode(int expandedTypeID, int identity)
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ExpandedNameTable ent = m_expandedNameTable;
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    short type = ent.getType(expandedTypeID);
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.ELEMENT_NODE == type)
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int namespaceID = ent.getNamespaceID(expandedTypeID);
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int localNameID = ent.getLocalNameID(expandedTypeID);
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ensureSizeOfIndex(namespaceID, localNameID);
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int[] index = m_elemIndexes[namespaceID][localNameID];
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      index[index[0]] = identity;
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      index[0]++;
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Find the first index that occurs in the list that is greater than or
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * equal to the given value.
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param list A list of integers.
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param start The start index to begin the search.
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param len The number of items to search.
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value Find the slot that has a value that is greater than or
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * identical to this argument.
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The index in the list of the slot that is higher or identical
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to the identity argument, or -1 if no node is higher or equal.
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int findGTE(int[] list, int start, int len, int value)
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int low = start;
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int high = start + (len - 1);
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int end = high;
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (low <= high)
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int mid = (low + high) / 2;
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int c = list[mid];
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (c > value)
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        high = mid - 1;
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (c < value)
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        low = mid + 1;
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return mid;
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (low <= end && list[low] > value) ? low : -1;
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Find the first matching element from the index at or after the
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given node.
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nsIndex The namespace index lookup.
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param lnIndex The local name index lookup.
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param firstPotential The first potential match that is worth looking at.
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The first node that is greater than or equal to the
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         firstPotential argument, or DTM.NOTPROCESSED if not found.
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  int findElementFromIndex(int nsIndex, int lnIndex, int firstPotential)
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int[][][] indexes = m_elemIndexes;
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != indexes && nsIndex < indexes.length)
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int[][] lnIndexs = indexes[nsIndex];
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != lnIndexs && lnIndex < lnIndexs.length)
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int[] elems = lnIndexs[lnIndex];
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != elems)
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int pos = findGTE(elems, 1, elems[0], firstPotential);
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (pos > -1)
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return elems[pos];
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return NOTPROCESSED;
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the next node identity value in the list, and call the iterator
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * if it hasn't been added yet.
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity (index).
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return identity+1, or DTM.NULL.
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected abstract int getNextNodeIdentity(int identity);
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method should try and build one or more nodes in the table.
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The true if a next node is found or false if
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         there are no more nodes.
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected abstract boolean nextNode();
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the number of nodes that have been added.
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the number of nodes that have been mapped.
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected abstract int getNumberOfNodes();
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Stateless axis traversers, lazely built. */
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTMAxisTraverser[] m_traversers;
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    /**
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * Ensure that the size of the information arrays can hold another entry
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * at the given index.
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     *
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * @param index On exit from this function, the information arrays sizes must be
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * at least index+1.
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     */
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    protected void ensureSize(int index)
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        // We've cut over to Suballocated*Vector, which are self-sizing.
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the simple type ID for the given node identity.
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The simple type ID, or DTM.NULL.
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected short _type(int identity)
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int info = _exptype(identity);
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (NULL != info)
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_expandedNameTable.getType(info);
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return NULL;
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the expanded type ID for the given node identity.
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The expanded type ID, or DTM.NULL.
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _exptype(int identity)
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if (identity == DTM.NULL)
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return NULL;
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Reorganized test and loop into single flow
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Tiny performance improvement, saves a few bytes of code, clearer.
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %OPT% Other internal getters could be treated simliarly
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (identity>=m_size)
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!nextNode() && identity >= m_size)
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_exptype.elementAt(identity);
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the level in the tree for the given node identity.
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The tree level, or DTM.NULL.
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _level(int identity)
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (identity>=m_size)
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isMore = nextNode();
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isMore && identity >= m_size)
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int i=0;
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while(NULL != (identity=_parent(identity)))
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ++i;
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return i;
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the first child for the given node identity.
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The first child identity, or DTM.NULL.
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _firstch(int identity)
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Boiler-plate code for each of the _xxx functions, except for the array.
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int info = (identity >= m_size) ? NOTPROCESSED : m_firstch.elementAt(identity);
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Check to see if the information requested has been processed, and,
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // if not, advance the iterator until we the information has been
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // processed.
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (info == NOTPROCESSED)
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isMore = nextNode();
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (identity >= m_size &&!isMore)
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        info = m_firstch.elementAt(identity);
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(info == NOTPROCESSED && !isMore)
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return NULL;
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return info;
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the next sibling for the given node identity.
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The next sibling identity, or DTM.NULL.
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _nextsib(int identity)
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Boiler-plate code for each of the _xxx functions, except for the array.
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int info = (identity >= m_size) ? NOTPROCESSED : m_nextsib.elementAt(identity);
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Check to see if the information requested has been processed, and,
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // if not, advance the iterator until we the information has been
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // processed.
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (info == NOTPROCESSED)
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isMore = nextNode();
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (identity >= m_size &&!isMore)
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        info = m_nextsib.elementAt(identity);
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(info == NOTPROCESSED && !isMore)
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return NULL;
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return info;
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the previous sibling for the given node identity.
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The previous sibling identity, or DTM.NULL.
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _prevsib(int identity)
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (identity < m_size)
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_prevsib.elementAt(identity);
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Check to see if the information requested has been processed, and,
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // if not, advance the iterator until we the information has been
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // processed.
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (true)
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isMore = nextNode();
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (identity >= m_size && !isMore)
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (identity < m_size)
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_prevsib.elementAt(identity);
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the parent for the given node identity.
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The parent identity, or DTM.NULL.
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _parent(int identity)
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (identity < m_size)
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_parent.elementAt(identity);
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Check to see if the information requested has been processed, and,
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // if not, advance the iterator until we the information has been
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // processed.
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (true)
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isMore = nextNode();
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (identity >= m_size && !isMore)
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (identity < m_size)
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_parent.elementAt(identity);
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Diagnostics function to dump the DTM.
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void dumpDTM(OutputStream os)
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(os==null)
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	      File f = new File("DTMDump"+((Object)this).hashCode()+".txt");
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 	      System.err.println("Dumping... "+f.getAbsolutePath());
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 	      os=new FileOutputStream(f);
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      PrintStream ps = new PrintStream(os);
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (nextNode()){}
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nRecords = m_size;
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ps.println("Total nodes: " + nRecords);
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int index = 0; index < nRecords; ++index)
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	int i=makeNodeHandle(index);
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("=========== index=" + index + " handle=" + i + " ===========");
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("NodeName: " + getNodeName(i));
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("NodeNameX: " + getNodeNameX(i));
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("LocalName: " + getLocalName(i));
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("NamespaceURI: " + getNamespaceURI(i));
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("Prefix: " + getPrefix(i));
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int exTypeID = _exptype(index);
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("Expanded Type ID: "
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                           + Integer.toHexString(exTypeID));
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int type = _type(index);
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String typestring;
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        switch (type)
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ATTRIBUTE_NODE :
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ATTRIBUTE_NODE";
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.CDATA_SECTION_NODE :
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "CDATA_SECTION_NODE";
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.COMMENT_NODE :
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "COMMENT_NODE";
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_FRAGMENT_NODE :
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "DOCUMENT_FRAGMENT_NODE";
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_NODE :
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "DOCUMENT_NODE";
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_TYPE_NODE :
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "DOCUMENT_NODE";
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ELEMENT_NODE :
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ELEMENT_NODE";
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ENTITY_NODE :
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ENTITY_NODE";
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ENTITY_REFERENCE_NODE :
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ENTITY_REFERENCE_NODE";
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.NAMESPACE_NODE :
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "NAMESPACE_NODE";
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.NOTATION_NODE :
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "NOTATION_NODE";
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.NULL :
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "NULL";
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.PROCESSING_INSTRUCTION_NODE :
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "PROCESSING_INSTRUCTION_NODE";
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.TEXT_NODE :
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "TEXT_NODE";
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        default :
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "Unknown!";
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("Type: " + typestring);
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int firstChild = _firstch(index);
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (DTM.NULL == firstChild)
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("First child: DTM.NULL");
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (NOTPROCESSED == firstChild)
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("First child: NOTPROCESSED");
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("First child: " + firstChild);
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_prevsib != null)
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int prevSibling = _prevsib(index);
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (DTM.NULL == prevSibling)
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ps.println("Prev sibling: DTM.NULL");
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else if (NOTPROCESSED == prevSibling)
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ps.println("Prev sibling: NOTPROCESSED");
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ps.println("Prev sibling: " + prevSibling);
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int nextSibling = _nextsib(index);
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (DTM.NULL == nextSibling)
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("Next sibling: DTM.NULL");
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (NOTPROCESSED == nextSibling)
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("Next sibling: NOTPROCESSED");
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("Next sibling: " + nextSibling);
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int parent = _parent(index);
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (DTM.NULL == parent)
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("Parent: DTM.NULL");
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (NOTPROCESSED == parent)
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("Parent: NOTPROCESSED");
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ps.println("Parent: " + parent);
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int level = _level(index);
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("Level: " + level);
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("Node Value: " + getNodeValue(i));
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ps.println("String Value: " + getStringValue(i));
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch(IOException ioe)
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ioe.printStackTrace(System.err);
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new RuntimeException(ioe.getMessage());
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Diagnostics function to dump a single node.
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% KNOWN GLITCH: If you pass it a node index rather than a
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node handle, it works just fine... but the displayed identity
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * number before the colon is different, which complicates comparing
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it with nodes printed the other way. We could always OR the DTM ID
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * into the value, to suppress that distinction...
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% This might want to be moved up to DTMDefaultBase, or possibly
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * DTM itself, since it's a useful diagnostic and uses only DTM's public
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * APIs.
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String dumpNode(int nodeHandle)
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  if(nodeHandle==DTM.NULL)
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		  return "[null]";
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String typestring;
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        switch (getNodeType(nodeHandle))
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ATTRIBUTE_NODE :
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ATTR";
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.CDATA_SECTION_NODE :
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "CDATA";
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.COMMENT_NODE :
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "COMMENT";
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_FRAGMENT_NODE :
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "DOC_FRAG";
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_NODE :
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "DOC";
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.DOCUMENT_TYPE_NODE :
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "DOC_TYPE";
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ELEMENT_NODE :
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ELEMENT";
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ENTITY_NODE :
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ENTITY";
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.ENTITY_REFERENCE_NODE :
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "ENT_REF";
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.NAMESPACE_NODE :
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "NAMESPACE";
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.NOTATION_NODE :
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "NOTATION";
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.NULL :
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "null";
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.PROCESSING_INSTRUCTION_NODE :
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "PI";
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        case DTM.TEXT_NODE :
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "TEXT";
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        default :
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          typestring = "Unknown!";
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      StringBuffer sb=new StringBuffer();
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  sb.append("["+nodeHandle+": "+typestring+
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				"(0x"+Integer.toHexString(getExpandedTypeID(nodeHandle))+") "+
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				getNodeNameX(nodeHandle)+" {"+getNamespaceURI(nodeHandle)+"}"+
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				"=\""+ getNodeValue(nodeHandle)+"\"]");
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  return sb.toString();
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ========= DTM Implementation Control Functions. ==============
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set an implementation dependent feature.
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Do we really expect to set features on DTMs?
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param featureId A feature URL.
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param state true if this feature should be on, false otherwise.
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setFeature(String featureId, boolean state){}
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ========= Document Navigation Functions =========
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, test if it has child nodes.
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p> %REVIEW% This is obviously useful at the DOM layer, where it
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * would permit testing this without having to create a proxy
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node. It's less useful in the DTM API, where
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (dtm.getFirstChild(nodeHandle)!=DTM.NULL) is just as fast and
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * almost as self-evident. But it's a convenience, and eases porting
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of DOM code to DTM.  </p>
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int true if the given node has child nodes.
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean hasChildNodes(int nodeHandle)
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int firstChild = _firstch(identity);
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return firstChild != DTM.NULL;
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Given a node identity, return a node handle. If extended addressing
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * has been used (multiple DTM IDs), we need to map the high bits of the
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * identity into the proper DTM ID.
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This has been made FINAL to facilitate inlining, since we do not expect
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * any subclass of DTMDefaultBase to ever change the algorithm. (I don't
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * really like doing so, and would love to have an excuse not to...)
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Is it worth trying to specialcase small documents?
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Should this be exposed at the package/public layers?
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeIdentity Internal offset to this node's records.
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return NodeHandle (external representation of node)
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * */
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  final public int makeNodeHandle(int nodeIdentity)
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(NULL==nodeIdentity) return NULL;
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(JJK_DEBUG && nodeIdentity>DTMManager.IDENT_NODE_DEFAULT)
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.err.println("GONK! (only useful in limited situations)");
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_dtmIdent.elementAt(nodeIdentity >>> DTMManager.IDENT_DTM_NODE_BITS)
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      + (nodeIdentity & DTMManager.IDENT_NODE_DEFAULT) ;
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Given a node handle, return a node identity. If extended addressing
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * has been used (multiple DTM IDs), we need to map the high bits of the
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * identity into the proper DTM ID and thence find the proper offset
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to add to the low bits of the identity
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This has been made FINAL to facilitate inlining, since we do not expect
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * any subclass of DTMDefaultBase to ever change the algorithm. (I don't
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * really like doing so, and would love to have an excuse not to...)
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %OPT% Performance is critical for this operation.
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Should this be exposed at the package/public layers?
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle (external representation of node)
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return nodeIdentity Internal offset to this node's records.
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * */
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  final public int makeNodeIdentity(int nodeHandle)
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(NULL==nodeHandle) return NULL;
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_mgrDefault!=null)
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Optimization: use the DTMManagerDefault's fast DTMID-to-offsets
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // table.  I'm not wild about this solution but this operation
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // needs need extreme speed.
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int whichDTMindex=nodeHandle>>>DTMManager.IDENT_DTM_NODE_BITS;
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %REVIEW% Wish I didn't have to perform the pre-test, but
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // someone is apparently asking DTMs whether they contain nodes
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // which really don't belong to them. That's probably a bug
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // which should be fixed, but until it is:
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(m_mgrDefault.m_dtms[whichDTMindex]!=this)
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	return NULL;
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	return
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  m_mgrDefault.m_dtm_offsets[whichDTMindex]
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  | (nodeHandle & DTMManager.IDENT_NODE_DEFAULT);
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int whichDTMid=m_dtmIdent.indexOf(nodeHandle & DTMManager.IDENT_DTM_DEFAULT);
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (whichDTMid==NULL)
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ? NULL
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      : (whichDTMid << DTMManager.IDENT_DTM_NODE_BITS)
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      + (nodeHandle & DTMManager.IDENT_NODE_DEFAULT);
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, get the handle of the node's first child.
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If not yet resolved, waits for more nodes to be added to the document and
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tries again.
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int DTM node-number of first child, or DTM.NULL to indicate none exists.
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getFirstChild(int nodeHandle)
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int firstChild = _firstch(identity);
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return makeNodeHandle(firstChild);
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, get the handle of the node's first child.
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If not yet resolved, waits for more nodes to be added to the document and
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tries again.
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int DTM node-number of first child, or DTM.NULL to indicate none exists.
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getTypedFirstChild(int nodeHandle, int nodeType)
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int firstChild, eType;
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (nodeType < DTM.NTYPES) {
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (firstChild = _firstch(makeNodeIdentity(nodeHandle));
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           firstChild != DTM.NULL;
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           firstChild = _nextsib(firstChild)) {
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        eType = _exptype(firstChild);
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (eType == nodeType
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               || (eType >= DTM.NTYPES
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      && m_expandedNameTable.getType(eType) == nodeType)) {
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return makeNodeHandle(firstChild);
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } else {
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (firstChild = _firstch(makeNodeIdentity(nodeHandle));
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           firstChild != DTM.NULL;
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           firstChild = _nextsib(firstChild)) {
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (_exptype(firstChild) == nodeType) {
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return makeNodeHandle(firstChild);
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, advance to its last child.
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If not yet resolved, waits for more nodes to be added to the document and
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tries again.
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node-number of last child,
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getLastChild(int nodeHandle)
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int child = _firstch(identity);
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int lastChild = DTM.NULL;
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (child != DTM.NULL)
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      lastChild = child;
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      child = _nextsib(child);
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return makeNodeHandle(lastChild);
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Retrieves an attribute node by by qualified name and namespace URI.
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node upon which to look up this attribute..
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespaceURI The namespace URI of the attribute to
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   retrieve, or null.
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name of the attribute to
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   retrieve.
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The attribute node handle with the specified name (
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>nodeName</code>) or <code>DTM.NULL</code> if there is no such
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   attribute.
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract int getAttributeNode(int nodeHandle, String namespaceURI,
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       String name);
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, get the index of the node's first attribute.
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Handle of first attribute, or DTM.NULL to indicate none exists.
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getFirstAttribute(int nodeHandle)
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeID = makeNodeIdentity(nodeHandle);
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return makeNodeHandle(getFirstAttributeIdentity(nodeID));
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node identity, get the index of the node's first attribute.
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity int identity of the node.
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Identity of first attribute, or DTM.NULL to indicate none exists.
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int getFirstAttributeIdentity(int identity) {
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = _type(identity);
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.ELEMENT_NODE == type)
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Assume that attributes and namespaces immediately follow the element.
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (identity = getNextNodeIdentity(identity)))
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Assume this can not be null.
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        type = _type(identity);
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (type == DTM.ATTRIBUTE_NODE)
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return identity;
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (DTM.NAMESPACE_NODE != type)
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle and an expanded type ID, get the index of the node's
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute of that type, if any.
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attType int expanded type ID of the required attribute.
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Handle of attribute of the required type, or DTM.NULL to indicate
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * none exists.
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int getTypedAttribute(int nodeHandle, int attType) {
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = getNodeType(nodeHandle);
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.ELEMENT_NODE == type) {
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int identity = makeNodeIdentity(nodeHandle);
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (DTM.NULL != (identity = getNextNodeIdentity(identity)))
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        type = _type(identity);
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (type == DTM.ATTRIBUTE_NODE)
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (_exptype(identity) == attType) return makeNodeHandle(identity);
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (DTM.NAMESPACE_NODE != type)
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, advance to its next sibling.
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If not yet resolved, waits for more nodes to be added to the document and
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tries again.
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node-number of next sibling,
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNextSibling(int nodeHandle)
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if (nodeHandle == DTM.NULL)
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return DTM.NULL;
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return makeNodeHandle(_nextsib(makeNodeIdentity(nodeHandle)));
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, advance to its next sibling.
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If not yet resolved, waits for more nodes to be added to the document and
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tries again.
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node-number of next sibling,
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getTypedNextSibling(int nodeHandle, int nodeType)
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if (nodeHandle == DTM.NULL)
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return DTM.NULL;
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	int node = makeNodeIdentity(nodeHandle);
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	int eType;
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	while ((node = _nextsib(node)) != DTM.NULL &&
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	((eType = _exptype(node)) != nodeType &&
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	m_expandedNameTable.getType(eType)!= nodeType));
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	//_type(node) != nodeType));
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (node == DTM.NULL ? DTM.NULL : makeNodeHandle(node));
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, find its preceeding sibling.
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * WARNING: DTM is asymmetric; this operation is resolved by search, and is
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * relatively expensive.
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node-number of the previous sib,
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getPreviousSibling(int nodeHandle)
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (nodeHandle == DTM.NULL)
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.NULL;
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_prevsib != null)
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return makeNodeHandle(_prevsib(makeNodeIdentity(nodeHandle)));
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If the previous sibling array is not built, we get at
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // the previous sibling using the parent, firstch and
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // nextsib arrays.
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeID = makeNodeIdentity(nodeHandle);
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int parent = _parent(nodeID);
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int node = _firstch(parent);
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int result = DTM.NULL;
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (node != nodeID)
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        result = node;
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        node = _nextsib(node);
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return makeNodeHandle(result);
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, advance to the next attribute.
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If an attr, we advance to
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the next attr on the same node.  If not an attribute, we return NULL.
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node.
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int DTM node-number of the resolved attr,
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNextAttribute(int nodeHandle) {
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeID = makeNodeIdentity(nodeHandle);
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (_type(nodeID) == DTM.ATTRIBUTE_NODE) {
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return makeNodeHandle(getNextAttributeIdentity(nodeID));
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node identity for an attribute, advance to the next attribute.
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity int identity of the attribute node.  This
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <strong>must</strong> be an attribute node.
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int DTM node-identity of the resolved attr,
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int getNextAttributeIdentity(int identity) {
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Assume that attributes and namespace nodes immediately follow the element
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (DTM.NULL != (identity = getNextNodeIdentity(identity))) {
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int type = _type(identity);
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (type == DTM.ATTRIBUTE_NODE) {
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return identity;
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else if (type != DTM.NAMESPACE_NODE) {
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Lazily created namespace lists. */
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Vector m_namespaceLists = null;  // on demand
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Build table of namespace declaration
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * locations during DTM construction. Table is a Vector of
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * SuballocatedIntVectors containing the namespace node HANDLES declared at
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that ID, plus an SuballocatedIntVector of the element node INDEXES at which
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * these declarations appeared.
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NOTE: Since this occurs during model build, nodes will be encountered
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in doucment order and thus the table will be ordered by element,
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * permitting binary-search as a possible retrieval optimization.
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Directly managed arrays rather than vectors?
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Handles or IDs? Given usage, I think handles.
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * */
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void declareNamespaceInContext(int elementNodeIndex,int namespaceNodeIndex)
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    SuballocatedIntVector nsList=null;
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_namespaceDeclSets==null)
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // First
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_namespaceDeclSetElements=new SuballocatedIntVector(32);
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_namespaceDeclSetElements.addElement(elementNodeIndex);
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_namespaceDeclSets=new Vector();
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nsList=new SuballocatedIntVector(32);
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_namespaceDeclSets.addElement(nsList);
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Most recent. May be -1 (none) if DTM was pruned.
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // %OPT% Is there a lastElement() method? Should there be?
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int last=m_namespaceDeclSetElements.size()-1;
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(last>=0 && elementNodeIndex==m_namespaceDeclSetElements.elementAt(last))
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nsList=(SuballocatedIntVector)m_namespaceDeclSets.elementAt(last);
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(nsList==null)
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_namespaceDeclSetElements.addElement(elementNodeIndex);
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        SuballocatedIntVector inherited =
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                findNamespaceContext(_parent(elementNodeIndex));
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (inherited!=null) {
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // %OPT% Count-down might be faster, but debuggability may
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // be better this way, and if we ever decide we want to
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // keep this ordered by expanded-type...
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int isize=inherited.size();
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Base the size of a new namespace list on the
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // size of the inherited list - but within reason!
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nsList=new SuballocatedIntVector(Math.max(Math.min(isize+16,2048),
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                      32));
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for(int i=0;i<isize;++i)
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                nsList.addElement(inherited.elementAt(i));
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nsList=new SuballocatedIntVector(32);
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_namespaceDeclSets.addElement(nsList);
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Handle overwriting inherited.
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %OPT% Keep sorted? (By expanded-name rather than by doc order...)
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Downside: Would require insertElementAt if not found,
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // which has recopying costs. But these are generally short lists...
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int newEType=_exptype(namespaceNodeIndex);
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for(int i=nsList.size()-1;i>=0;--i)
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(newEType==getExpandedTypeID(nsList.elementAt(i)))
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nsList.setElementAt(makeNodeHandle(namespaceNodeIndex),i);
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return;
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    nsList.addElement(makeNodeHandle(namespaceNodeIndex));
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Retrieve list of namespace declaration locations
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * active at this node. List is an SuballocatedIntVector whose
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * entries are the namespace node HANDLES declared at that ID.
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVIEW% Directly managed arrays rather than vectors?
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVIEW% Handles or IDs? Given usage, I think handles.
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * */
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector findNamespaceContext(int elementNodeIndex)
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null!=m_namespaceDeclSetElements)
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // %OPT% Is binary-search really saving us a lot versus linear?
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // (... It may be, in large docs with many NS decls.)
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int wouldBeAt=findInSortedSuballocatedIntVector(m_namespaceDeclSetElements,
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                            elementNodeIndex);
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(wouldBeAt>=0) // Found it
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return (SuballocatedIntVector) m_namespaceDeclSets.elementAt(wouldBeAt);
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(wouldBeAt == -1) // -1-wouldbeat == 0
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return null; // Not after anything; definitely not found
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Not found, but we know where it should have been.
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Search back until we find an ancestor or run out.
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        wouldBeAt=-1-wouldBeAt;
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Decrement wouldBeAt to find last possible ancestor
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int candidate=m_namespaceDeclSetElements.elementAt(-- wouldBeAt);
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int ancestor=_parent(elementNodeIndex);
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Special case: if the candidate is before the given node, and
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // is in the earliest possible position in the document, it
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // must have the namespace declarations we're interested in.
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (wouldBeAt == 0 && candidate < ancestor) {
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int rootHandle = getDocumentRoot(makeNodeHandle(elementNodeIndex));
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int rootID = makeNodeIdentity(rootHandle);
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int uppermostNSCandidateID;
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (getNodeType(rootHandle) == DTM.DOCUMENT_NODE) {
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int ch = _firstch(rootID);
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uppermostNSCandidateID = (ch != DTM.NULL) ? ch : rootID;
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else {
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uppermostNSCandidateID = rootID;
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (candidate == uppermostNSCandidateID) {
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return (SuballocatedIntVector)m_namespaceDeclSets.elementAt(wouldBeAt);
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while(wouldBeAt>=0 && ancestor>0)
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (candidate==ancestor) {
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Found ancestor in list
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return (SuballocatedIntVector)m_namespaceDeclSets.elementAt(wouldBeAt);
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (candidate<ancestor) {
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Too deep in tree
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                do {
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  ancestor=_parent(ancestor);
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } while (candidate < ancestor);
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if(wouldBeAt > 0){
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // Too late in list
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              candidate=m_namespaceDeclSetElements.elementAt(--wouldBeAt);
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            	break;
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null; // No namespaces known at this node
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Subroutine: Locate the specified node within
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * m_namespaceDeclSetElements, or the last element which
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * preceeds it in document order
14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * %REVIEW% Inlne this into findNamespaceContext? Create SortedSuballocatedIntVector type?
14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return If positive or zero, the index of the found item.
14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If negative, index of the point at which it would have appeared,
14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * encoded as -1-index and hence reconvertable by subtracting
14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * it from -1. (Encoding because I don't want to recompare the strings
14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * but don't want to burn bytes on a datatype to hold a flagged value.)
14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int findInSortedSuballocatedIntVector(SuballocatedIntVector vector, int lookfor)
14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Binary search
14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int i = 0;
14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(vector != null) {
14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int first = 0;
14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int last  = vector.size() - 1;
14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (first <= last) {
14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        i = (first + last) / 2;
14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int test = lookfor-vector.elementAt(i);
14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(test == 0) {
14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return i; // Name found
14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (test < 0) {
14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          last = i - 1; // looked too late
14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else {
14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          first = i + 1; // looked ot early
14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (first > i) {
14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        i = first; // Clean up at loop end
14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1 - i; // not-found has to be encoded.
14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, get the index of the node's first child.
14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If not yet resolved, waits for more nodes to be added to the document and
14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * tries again
14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle handle to node, which should probably be an element
14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   node, but need not be.
14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param inScope    true if all namespaces in scope should be returned,
14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   false if only the namespace declarations should be
14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   returned.
14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return handle of first namespace, or DTM.NULL to indicate none exists.
14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getFirstNamespaceNode(int nodeHandle, boolean inScope)
14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(inScope)
14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int identity = makeNodeIdentity(nodeHandle);
14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (_type(identity) == DTM.ELEMENT_NODE)
14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              SuballocatedIntVector nsContext=findNamespaceContext(identity);
14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if(nsContext==null || nsContext.size()<1)
14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return NULL;
14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return nsContext.elementAt(0);
14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return NULL;
14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Assume that attributes and namespaces immediately
14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // follow the element.
14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //
14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // %OPT% Would things be faster if all NS nodes were built
14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // before all Attr nodes? Some costs at build time for 2nd
14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // pass...
14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int identity = makeNodeIdentity(nodeHandle);
14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (_type(identity) == DTM.ELEMENT_NODE)
14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              while (DTM.NULL != (identity = getNextNodeIdentity(identity)))
14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                int type = _type(identity);
14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (type == DTM.NAMESPACE_NODE)
14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return makeNodeHandle(identity);
14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else if (DTM.ATTRIBUTE_NODE != type)
14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    break;
14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return NULL;
14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else
14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return NULL;
14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a namespace handle, advance to the next namespace.
15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param baseHandle handle to original node from where the first namespace
15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * was relative to (needed to return nodes in document order).
15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle A namespace handle for which we will find the next node.
15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param inScope true if all namespaces that are in scope should be processed,
15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * otherwise just process the nodes in the given element handle.
15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return handle of next namespace, or DTM.NULL to indicate none exists.
15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNextNamespaceNode(int baseHandle, int nodeHandle,
15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                  boolean inScope)
15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(inScope)
15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //Since we've been given the base, try direct lookup
15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //(could look from nodeHandle but this is at least one
15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //comparison/get-parent faster)
15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //SuballocatedIntVector nsContext=findNamespaceContext(nodeHandle & m_mask);
15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                SuballocatedIntVector nsContext=findNamespaceContext(makeNodeIdentity(baseHandle));
15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(nsContext==null)
15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return NULL;
15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int i=1 + nsContext.indexOf(nodeHandle);
15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(i<=0 || i==nsContext.size())
15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return NULL;
15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return nsContext.elementAt(i);
15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Assume that attributes and namespace nodes immediately follow the element.
15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int identity = makeNodeIdentity(nodeHandle);
15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            while (DTM.NULL != (identity = getNextNodeIdentity(identity)))
15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                int type = _type(identity);
15389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (type == DTM.NAMESPACE_NODE)
15399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
15409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return makeNodeHandle(identity);
15419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
15429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else if (type != DTM.ATTRIBUTE_NODE)
15439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
15449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    break;
15459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
15469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
15479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
15489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     return DTM.NULL;
15499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, find its parent node.
15539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
15559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node-number of parent,
15569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or DTM.NULL to indicate none exists.
15579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getParent(int nodeHandle)
15599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
15629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (identity > 0)
15649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return makeNodeHandle(_parent(identity));
15659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
15669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.NULL;
15679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Find the Document node handle for the document currently under construction.
15719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * PLEASE NOTE that most people should use getOwnerDocument(nodeHandle) instead;
15729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this version of the operation is primarily intended for use during negotiation
15739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with the DTM Manager.
15749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @return int Node handle of document, which should always be valid.
15769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getDocument()
15789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_dtmIdent.elementAt(0); // makeNodeHandle(0)
15809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, find the owning document node.  This has the exact
15849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * same semantics as the DOM Document method of the same name, in that if
15859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the nodeHandle is a document node, it will return NULL.
15869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% Since this is DOM-specific, it may belong at the DOM
15889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * binding layer. Included here as a convenience function and to
15899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * aid porting of DOM code to DTM.</p>
15909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
15929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node handle of owning document, or -1 if the node was a Docment
15939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getOwnerDocument(int nodeHandle)
15959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.DOCUMENT_NODE == getNodeType(nodeHandle))
15989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	    return DTM.NULL;
15999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getDocumentRoot(nodeHandle);
16019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, find the owning document node.  Unlike the DOM,
16059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this considers the owningDocument of a Document to be itself.
16069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
16089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node handle of owning document, or the nodeHandle if it is
16099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *             a Document.
16109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getDocumentRoot(int nodeHandle)
16129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getManager().getDTM(nodeHandle).getDocument();
16149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the string-value of a node as a String object
16189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (see http://www.w3.org/TR/xpath#data-model
16199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the definition of a node's string-value).
16209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
16229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A string object that represents the string-value of the given node.
16249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract XMLString getStringValue(int nodeHandle);
16269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get number of character array chunks in
16299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the string-value of a node.
16309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (see http://www.w3.org/TR/xpath#data-model
16319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the definition of a node's string-value).
16329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that a single text node may have multiple text chunks.
16339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
16359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return number of character array chunks in
16379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         the string-value of a node.
16389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getStringValueChunkCount(int nodeHandle)
16409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %TBD%
16439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//("getStringValueChunkCount not yet supported!");
16449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return 0;
16469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a character array chunk in the string-value of a node.
16509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (see http://www.w3.org/TR/xpath#data-model
16519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the definition of a node's string-value).
16529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that a single text node may have multiple text chunks.
16539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
16559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param chunkIndex Which chunk to get.
16569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param startAndLen An array of 2 where the start position and length of
16579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                    the chunk will be returned.
16589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The character array reference where the chunk occurs.
16609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public char[] getStringValueChunk(int nodeHandle, int chunkIndex,
16629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    int[] startAndLen)
16639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %TBD%
16669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"getStringValueChunk not yet supported!");
16679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
16699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return an ID that represents the node's expanded name.
16739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The handle to the node in question.
16759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the expanded-name id of the node.
16779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getExpandedTypeID(int nodeHandle)
16799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% This _should_ only be null if someone asked the wrong DTM about the node...
16819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // which one would hope would never happen...
16829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int id=makeNodeIdentity(nodeHandle);
16839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(id==NULL)
16849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return NULL;
16859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return _exptype(id);
16869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an expanded name, return an ID.  If the expanded-name does not
16909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exist in the internal tables, the entry will be created, and the ID will
16919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be returned.  Any additional nodes that are created that have this
16929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * expanded name will use this ID.
16939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type The simple type, i.e. one of ELEMENT, ATTRIBUTE, etc.
16959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace The namespace URI, which may be null, may be an empty
16979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                  string (which will be the same as null), or may be a
16989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                  namespace URI.
16999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name string, which must be a valid
17009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                  <a href="http://www.w3.org/TR/REC-xml-names/">NCName</a>.
17019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the expanded-name id of the node.
17039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getExpandedTypeID(String namespace, String localName, int type)
17059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ExpandedNameTable ent = m_expandedNameTable;
17089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return ent.getExpandedTypeID(namespace, localName, type);
17109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an expanded-name ID, return the local name part.
17149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expandedNameID an ID that represents an expanded-name.
17169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Local name of this node.
17179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getLocalNameFromExpandedNameID(int expandedNameID)
17199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable.getLocalName(expandedNameID);
17219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an expanded-name ID, return the namespace URI part.
17259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expandedNameID an ID that represents an expanded-name.
17279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String URI value of this node's namespace, or null if no
17289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespace was resolved.
17299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNamespaceFromExpandedNameID(int expandedNameID)
17319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable.getNamespace(expandedNameID);
17339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns the namespace type of a specific node
17379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
17389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the ID of the namespace.
17399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNamespaceType(final int nodeHandle)
17419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
17449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int expandedNameID = _exptype(identity);
17459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable.getNamespaceID(expandedNameID);
17479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its DOM-style node name. This will
17519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * include names such as #text or #document.
17529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
17549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Name of this node, which may be an empty string.
17559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Document when empty string is possible...
17569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW-COMMENT% It should never be empty, should it?
17579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getNodeName(int nodeHandle);
17599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return the XPath node name.  This should be
17629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the name as described by the XPath data model, NOT the DOM-style
17639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * name.
17649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
17669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Name of this node, which may be an empty string.
17679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeNameX(int nodeHandle)
17699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMDefaultBase abstract method */
17729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"Not yet supported!");
17739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
17759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its XPath-style localname.
17799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (As defined in Namespaces, this is the portion of the name after any
17809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * colon character).
17819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
17839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Local name of this node.
17849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getLocalName(int nodeHandle);
17869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a namespace handle, return the prefix that the namespace decl is
17899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * mapping.
17909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return the prefix used to map to the namespace.
17919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p> %REVIEW% Are you sure you want "" for no prefix?  </p>
17939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p> %REVIEW-COMMENT% I think so... not totally sure. -sb  </p>
17949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
17969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String prefix of this node's name, or "" if no explicit
17979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespace prefix was given.
17989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getPrefix(int nodeHandle);
18009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its DOM-style namespace URI
18039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (As defined in Namespaces, this is the declared URI which this node's
18049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * prefix -- or default in lieu thereof -- was mapped to.)
18059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% Null or ""? -sb</p>
18079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
18099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String URI value of this node's namespace, or null if no
18109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespace was resolved.
18119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getNamespaceURI(int nodeHandle);
18139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its node value. This is mostly
18169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as defined by the DOM, but may ignore some conveniences.
18179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
18189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id.
18209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Value of this node, or null if not
18219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * meaningful for this node type.
18229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getNodeValue(int nodeHandle);
18249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its DOM-style node type.
18279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
18289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Generally, returning short is false economy. Return int?
18299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Make assumption that node has already arrived.  Is OK?
18309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id.
18329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return int Node type, as per the DOM's Node._NODE constants.
18339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public short getNodeType(int nodeHandle)
18359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if (nodeHandle == DTM.NULL)
18379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return DTM.NULL;
18389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable.getType(_exptype(makeNodeIdentity(nodeHandle)));
18399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
18409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the depth level of this node in the tree (equals 1 for
18439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a parentless node).
18449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id.
18469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the number of ancestors, plus one
18479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
18489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public short getLevel(int nodeHandle)
18509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Apparently, the axis walker stuff requires levels to count from 1.
18529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
18539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (short) (_level(identity) + 1);
18549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
18559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the identity of this node in the tree
18589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node handle.
18609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the node identity
18619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
18629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNodeIdent(int nodeHandle)
18649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /*if (nodeHandle != DTM.NULL)
18669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return nodeHandle & m_mask;
18679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
18689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.NULL;*/
18699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return makeNodeIdentity(nodeHandle);
18719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
18729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the handle of this node in the tree
18759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeId The node identity.
18779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the node handle
18789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
18799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNodeHandle(int nodeId)
18819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /*if (nodeId != DTM.NULL)
18839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return nodeId | m_dtmIdent;
18849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
18859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.NULL;*/
18869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return makeNodeHandle(nodeId);
18889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
18899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ============== Document query functions ==============
18919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tests whether DTM DOM implementation implements a specific feature and
18949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that feature is supported by this node.
18959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param feature The name of the feature to test.
18979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param version This is the version number of the feature to test.
18989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   If the version is not
18999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   specified, supporting any version of the feature will cause the
19009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   method to return <code>true</code>.
19019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Returns <code>true</code> if the specified feature is
19029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   supported on this node, <code>false</code> otherwise.
19039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isSupported(String feature, String version)
19059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %TBD%
19089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
19099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the base URI of the document entity. If it is not known
19139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (because the document was parsed from a socket connection or from
19149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * standard input, for example), the value of this property is unknown.
19159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the document base URI String object or null if unknown.
19179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentBaseURI()
19199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_documentBaseURI;
19219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the base URI of the document entity.
19259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param baseURI the document base URI String object or null if unknown.
19279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setDocumentBaseURI(String baseURI)
19299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_documentBaseURI = baseURI;
19319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the system identifier of the document entity. If
19359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it is not known, the value of this property is unknown.
19369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id, which can be any valid node handle.
19389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the system identifier String object or null if unknown.
19399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentSystemIdentifier(int nodeHandle)
19419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW%  OK? -sb
19449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_documentBaseURI;
19459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the name of the character encoding scheme
19499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        in which the document entity is expressed.
19509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id, which can be any valid node handle.
19529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the document encoding String object.
19539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
19549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentEncoding(int nodeHandle)
19569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW%  OK??  -sb
19599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return "UTF-8";
19609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return an indication of the standalone status of the document,
19649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        either "yes" or "no". This property is derived from the optional
19659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        standalone document declaration in the XML declaration at the
19669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        beginning of the document entity, and has no value if there is no
19679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        standalone document declaration.
19689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id, which can be any valid node handle.
19709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the document standalone String object, either "yes", "no", or null.
19719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentStandalone(int nodeHandle)
19739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
19759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return a string representing the XML version of the document. This
19799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * property is derived from the XML declaration optionally present at the
19809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * beginning of the document entity, and has no value if there is no XML
19819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * declaration.
19829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param documentHandle The document handle
19849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the document version String object.
19869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
19879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentVersion(int documentHandle)
19889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
19899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
19909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
19939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return an indication of
19949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * whether the processor has read the complete DTD. Its value is a
19959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * boolean. If it is false, then certain properties (indicated in their
19969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * descriptions below) may be unknown. If it is true, those properties
19979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * are never unknown.
19989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
19999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return <code>true</code> if all declarations were processed;
20009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         <code>false</code> otherwise.
20019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean getDocumentAllDeclarationsProcessed()
20039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
20049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% OK?
20069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
20079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
20089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   A document type declaration information item has the following properties:
20119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     1. [system identifier] The system identifier of the external subset, if
20139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        it exists. Otherwise this property has no value.
20149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the system identifier String object, or null if there is none.
20169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getDocumentTypeDeclarationSystemIdentifier();
20189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the public identifier of the external subset,
20219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * normalized as described in 4.2.2 External Entities [XML]. If there is
20229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * no external subset or if it has no public identifier, this property
20239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * has no value.
20249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the public identifier String object, or null if there is none.
20269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getDocumentTypeDeclarationPublicIdentifier();
20289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns the <code>Element</code> whose <code>ID</code> is given by
20319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>elementId</code>. If no such element exists, returns
20329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>DTM.NULL</code>. Behavior is not defined if more than one element
20339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * has this <code>ID</code>. Attributes (including those
20349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with the name "ID") are not of type ID unless so defined by DTD/Schema
20359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * information available to the DTM implementation.
20369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Implementations that do not know whether attributes are of type ID or
20379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * not are expected to return <code>DTM.NULL</code>.
20389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% Presumably IDs are still scoped to a single document,
20409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and this operation searches only within a single document, right?
20419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Wouldn't want collisions between DTMs in the same process.</p>
20429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elementId The unique <code>id</code> value for an element.
20449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The handle of the matching element.
20459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract int getElementById(String elementId);
20479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The getUnparsedEntityURI function returns the URI of the unparsed
20509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * entity with the specified name in the same document as the context
20519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node (see [3.3 Unparsed Entities]). It returns the empty string if
20529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * there is no such entity.
20539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
20549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XML processors may choose to use the System Identifier (if one
20559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is provided) to resolve the entity, rather than the URI in the
20569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Public Identifier. The details are dependent on the processor, and
20579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * we would have to support some form of plug-in resolver to handle
20589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this properly. Currently, we simply return the System Identifier if
20599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * present, and hope that it a usable URI or that our caller can
20609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * map it to one.
20619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: Resolve Public Identifiers... or consider changing function name.
20629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
20639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If we find a relative URI
20649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reference, XML expects it to be resolved in terms of the base URI
20659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the document. The DOM doesn't do that for us, and it isn't
20669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * entirely clear whether that should be done here; currently that's
20679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * pushed up to a higher level of our application. (Note that DOM Level
20689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 1 didn't store the document's base URI.)
20699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: Consider resolving Relative URIs.
20709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
20719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (The DOM's statement that "An XML processor may choose to
20729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * completely expand entities before the structure model is passed
20739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to the DOM" refers only to parsed entities, not unparsed, and hence
20749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * doesn't affect this function.)
20759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name A string containing the Entity Name of the unparsed
20779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * entity.
20789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String containing the URI of the Unparsed Entity, or an
20809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * empty string if no such entity exists.
20819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract String getUnparsedEntityURI(String name);
20839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ============== Boolean methods ================
20859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return true if the xsl:strip-space or xsl:preserve-space was processed
20889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * during construction of the DTM document.
20899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this DTM supports prestripping.
20919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean supportsPreStripping()
20939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
20949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
20959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
20969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Figure out whether nodeHandle2 should be considered as being later
20999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the document than nodeHandle1, in Document Order as defined
21009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * by the XPath model. This may not agree with the ordering defined
21019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * by other XML applications.
21029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
21039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * There are some cases where ordering isn't defined, and neither are
21049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the results of this function -- though we'll generally return false.
21059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle1 Node handle to perform position comparison on.
21079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle2 Second Node handle to perform position comparison on .
21089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if node1 comes before node2, otherwise return false.
21109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * You can think of this as
21119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>(node1.documentOrderPosition &lt;= node2.documentOrderPosition)</code>.
21129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isNodeAfter(int nodeHandle1, int nodeHandle2)
21149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// These return NULL if the node doesn't belong to this document.
21169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int index1 = makeNodeIdentity(nodeHandle1);
21179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int index2 = makeNodeIdentity(nodeHandle2);
21189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return index1!=NULL && index2!=NULL && index1 <= index2;
21209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     2. [element content whitespace] A boolean indicating whether the
21249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        character is white space appearing within element content (see [XML],
21259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        2.10 "White Space Handling"). Note that validating XML processors are
21269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        required by XML 1.0 to provide this information. If there is no
21279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        declaration for the containing element, this property has no value for
21289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        white space characters. If no declaration has been read, but the [all
21299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        declarations processed] property of the document information item is
21309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        false (so there may be an unread declaration), then the value of this
21319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        property is unknown for white space characters. It is always false for
21329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        characters that are not white space.
21339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the node ID.
21359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return <code>true</code> if the character data is whitespace;
21369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         <code>false</code> otherwise.
21379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isCharacterElementContentWhitespace(int nodeHandle)
21399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %TBD%
21429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
21439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *    10. [all declarations processed] This property is not strictly speaking
21479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        part of the infoset of the document. Rather it is an indication of
21489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        whether the processor has read the complete DTD. Its value is a
21499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        boolean. If it is false, then certain properties (indicated in their
21509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        descriptions below) may be unknown. If it is true, those properties
21519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        are never unknown.
21529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param documentHandle A node handle that must identify a document.
21549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return <code>true</code> if all declarations were processed;
21559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         <code>false</code> otherwise.
21569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isDocumentAllDeclarationsProcessed(int documentHandle)
21589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
21609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     5. [specified] A flag indicating whether this attribute was actually
21649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        specified in the start-tag of its element, or was defaulted from the
21659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        DTD.
21669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributeHandle The attribute handle in question.
21689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return <code>true</code> if the attribute was specified;
21709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         <code>false</code> if it was defaulted.
21719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract boolean isAttributeSpecified(int attributeHandle);
21739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ========== Direct SAX Dispatch, for optimization purposes ========
21759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Directly call the
21789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * characters method on the passed ContentHandler for the
21799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * string-value of the given node (see http://www.w3.org/TR/xpath#data-model
21809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the definition of a node's string-value). Multiple calls to the
21819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler's characters methods may well occur for a single call to
21829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this method.
21839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
21859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
21869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param normalize true if the content should be normalized according to
21879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the rules for the XPath
21889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <a href="http://www.w3.org/TR/xpath#function-normalize-space">normalize-space</a>
21899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * function.
21909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
21929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract void dispatchCharactersEvents(
21949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeHandle, org.xml.sax.ContentHandler ch, boolean normalize)
21959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throws org.xml.sax.SAXException;
21969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Directly create SAX parser events from a subtree.
21999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
22019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
22029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
22049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public abstract void dispatchToEvents(
22069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeHandle, org.xml.sax.ContentHandler ch)
22079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throws org.xml.sax.SAXException;
22089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return an DOM node for the given node.
22119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
22139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A node representation of the DTM node.
22159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public org.w3c.dom.Node getNode(int nodeHandle)
22179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return new DTMNodeProxy(this, nodeHandle);
22199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ==== Construction methods (may not be supported by some implementations!) =====
22229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Append a child to the end of the document. Please note that the node
22259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is always cloned if it is owned by another document.
22269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% "End of the document" needs to be defined more clearly.
22289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Does it become the last child of the Document? Of the root element?</p>
22299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param newChild Must be a valid new node handle.
22319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param clone true if the child should be cloned into the document.
22329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param cloneDepth if the clone argument is true, specifies that the
22339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   clone should include all it's children.
22349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void appendChild(int newChild, boolean clone, boolean cloneDepth)
22369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"appendChild not yet supported!");
22389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Append a text node child that will be constructed from a string,
22429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to the end of the document.
22439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% "End of the document" needs to be defined more clearly.
22459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Does it become the last child of the Document? Of the root element?</p>
22469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param str Non-null reverence to a string.
22489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void appendTextChild(String str)
22509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"appendTextChild not yet supported!");
22529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Simple error for asserts and the like.
22569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param msg Error message to report.
22589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void error(String msg)
22609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throw new DTMException(msg);
22629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Find out whether or not to strip whispace nodes.
22669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return whether or not to strip whispace nodes.
22699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean getShouldStripWhitespace()
22719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_shouldStripWS;
22739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set whether to strip whitespaces and push in current value of
22779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * m_shouldStripWS in m_shouldStripWhitespaceStack.
22789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldStrip Flag indicating whether to strip whitespace nodes
22809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void pushShouldStripWhitespace(boolean shouldStrip)
22829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_shouldStripWS = shouldStrip;
22859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_shouldStripWhitespaceStack)
22879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_shouldStripWhitespaceStack.push(shouldStrip);
22889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set whether to strip whitespaces at this point by popping out
22929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * m_shouldStripWhitespaceStack.
22939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void popShouldStripWhitespace()
22969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_shouldStripWhitespaceStack)
22989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_shouldStripWS = m_shouldStripWhitespaceStack.popAndTop();
22999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set whether to strip whitespaces and set the top of the stack to
23039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the current value of m_shouldStripWS.
23049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldStrip Flag indicating whether to strip whitespace nodes
23079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void setShouldStripWhitespace(boolean shouldStrip)
23099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_shouldStripWS = shouldStrip;
23129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_shouldStripWhitespaceStack)
23149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_shouldStripWhitespaceStack.setTop(shouldStrip);
23159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A dummy routine to satisify the abstract interface. If the DTM
23199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implememtation that extends the default base requires notification
23209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of registration, they can override this method.
23219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   public void documentRegistration()
23239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
23249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
23259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A dummy routine to satisify the abstract interface. If the DTM
23289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implememtation that extends the default base requires notification
23299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * when the document is being released, they can override this method
23309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   public void documentRelease()
23329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
23339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
23349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   /**
23369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * Migrate a DTM built with an old DTMManager to a new DTMManager.
23379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * After the migration, the new DTMManager will treat the DTM as
23389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * one that is built by itself.
23399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * This is used to support DTM sharing between multiple transformations.
23409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * @param mgr the DTMManager
23419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    */
23429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   public void migrateTo(DTMManager mgr)
23439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
23449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     m_mgr = mgr;
23459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     if(mgr instanceof DTMManagerDefault)
23469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       m_mgrDefault=(DTMManagerDefault)mgr;
23479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
23489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 /** Query which DTMManager this DTM is currently being handled by.
23509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  *
23519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  * %REVEW% Should this become part of the base DTM API?
23529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  *
23539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  * @return a DTMManager, or null if this is a "stand-alone" DTM.
23549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  */
23559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 public DTMManager getManager()
23569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 {
23579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 return m_mgr;
23589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 }
23599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 /** Query which DTMIDs this DTM is currently using within the DTMManager.
23619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  *
23629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  * %REVEW% Should this become part of the base DTM API?
23639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  *
23649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  * @return an IntVector, or null if this is a "stand-alone" DTM.
23659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	  */
23669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 public SuballocatedIntVector getDTMIDs()
23679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 {
23689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 if(m_mgr==null) return null;
23699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 return m_dtmIdent;
23709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 }
23719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
2372