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: SAX2DTM.java 468653 2006-10-28 07:07:05Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.dtm.ref.sax2dtm;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Hashtable;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.*;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.*;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.StringVector;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.IntVector;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.FastStringBuffer;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.IntStack;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SuballocatedIntVector;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SystemIDResolver;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.WrappedRuntimeException;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLString;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLStringFactory;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLErrorResources;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLMessages;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.*;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ext.*;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class implements a DTM that tends to be optimized more for speed than
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for compactness, that is constructed via SAX2 ContentHandler events.
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class SAX2DTM extends DTMDefaultBaseIterators
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler,
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   DeclHandler, LexicalHandler
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Set true to monitor SAX events and similar diagnostic info. */
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean DEBUG = false;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If we're building the model incrementally on demand, we need to
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be able to tell the source when to send us more data.
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that if this has not been set, and you attempt to read ahead
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the current build point, we'll probably throw a null-pointer
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception. We could try to wait-and-retry instead, as a very poor
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * fallback, but that has all the known problems with multithreading
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * on multiprocessors and we Don't Want to Go There.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see setIncrementalSAXSource
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private IncrementalSAXSource m_incrementalSAXSource = null;
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * All the character content, including attribute values, are stored in
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this buffer.
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Should this have an option of being shared across DTMs?
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Sequentially only; not threadsafe... Currently, I think not.
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Initial size was pushed way down to reduce weight of RTFs.
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * pending reduction in number of RTF DTMs. Now that we're sharing a DTM
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * between RTFs, and tail-pruning... consider going back to the larger/faster.
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected rather than private so SAX2RTFDTM can access it.
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //private FastStringBuffer m_chars = new FastStringBuffer(13, 13);
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected FastStringBuffer m_chars;
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** This vector holds offset and length data.
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_data;
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The parent stack, needed only for construction.
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected rather than private so SAX2RTFDTM can access it.
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected IntStack m_parents;
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The current previous node, needed only for construction time.
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected rather than private so SAX2RTFDTM can access it.
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_previous = 0;
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Namespace support, only relevent at construction time.
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected rather than private so SAX2RTFDTM can access it.
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected java.util.Vector m_prefixMappings =
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new java.util.Vector();
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Namespace support, only relevent at construction time.
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected rather than private so SAX2RTFDTM can access it.
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected IntStack m_contextIndexes;
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Type of next characters() event within text block in prgress. */
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_textType = DTM.TEXT_NODE;
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Type of coalesced text block. See logic in the characters()
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method.
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected int m_coalescedTextType = DTM.TEXT_NODE;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The SAX Document locator */
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected Locator m_locator = null;
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The SAX Document system-id */
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient private String m_systemId = null;
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** We are inside the DTD.  This is used for ignoring comments.  */
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  transient protected boolean m_insideDTD = false;
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Tree Walker for dispatchToEvents. */
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTMTreeWalker m_walker = new DTMTreeWalker();
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** pool of string values that come as strings. */
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTMStringPool m_valuesOrPrefixes;
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** End document has been reached.
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected rather than private so SAX2RTFDTM can access it.
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean m_endDocumentOccured = false;
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Data or qualified name values, one array element for each node. */
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected SuballocatedIntVector m_dataOrQName;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This table holds the ID string to node associations, for
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XML IDs.
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected Hashtable m_idAttributes = new Hashtable();
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * fixed dom-style names.
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final String[] m_fixednames = { null,
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null,  // nothing, Element
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null, "#text",  // Attr, Text
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    "#cdata_section", null,  // CDATA, EntityReference
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null, null,  // Entity, PI
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    "#comment", "#document",  // Comment, Document
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null, "#document-fragment",  // Doctype, DocumentFragment
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null };  // Notation
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Vector of entities.  Each record is composed of four Strings:
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  publicId, systemID, notationName, and name.
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Vector m_entities = null;
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** m_entities public ID offset. */
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final int ENTITY_FIELD_PUBLICID = 0;
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** m_entities system ID offset. */
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final int ENTITY_FIELD_SYSTEMID = 1;
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** m_entities notation name offset. */
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final int ENTITY_FIELD_NOTATIONNAME = 2;
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** m_entities name offset. */
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final int ENTITY_FIELD_NAME = 3;
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Number of entries per record for m_entities. */
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final int ENTITY_FIELDS_PER = 4;
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The starting offset within m_chars for the text or
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * CDATA_SECTION node currently being acumulated,
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or -1 if there is no text node in progress
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int m_textPendingStart = -1;
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Describes whether information about document source location
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be maintained or not.
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Made protected for access by SAX2RTFDTM.
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean m_useSourceLocationProperty = false;
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   /** Made protected for access by SAX2RTFDTM.
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected StringVector m_sourceSystemId;
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   /** Made protected for access by SAX2RTFDTM.
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected IntVector m_sourceLine;
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   /** Made protected for access by SAX2RTFDTM.
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected IntVector m_sourceColumn;
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a SAX2DTM object using the default block size.
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mgr The DTMManager who owns this DTM.
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source the JAXP 1.1 Source object for this DTM.
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmIdentity The DTM identity ID for this DTM.
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter The white space filter for this DTM, which may
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xstringfactory XMLString factory for creating character content.
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public SAX2DTM(DTMManager mgr, Source source, int dtmIdentity,
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 DTMWSFilter whiteSpaceFilter,
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XMLStringFactory xstringfactory,
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 boolean doIndexing)
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(mgr, source, dtmIdentity, whiteSpaceFilter,
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xstringfactory, doIndexing, DEFAULT_BLOCKSIZE, true, false);
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a SAX2DTM object ready to be constructed from SAX2
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler events.
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mgr The DTMManager who owns this DTM.
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source the JAXP 1.1 Source object for this DTM.
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtmIdentity The DTM identity ID for this DTM.
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter The white space filter for this DTM, which may
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xstringfactory XMLString factory for creating character content.
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param blocksize The block size of the DTM.
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param usePrevsib true if we want to build the previous sibling node array.
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param newNameTable true if we want to use a new ExpandedNameTable for this DTM.
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public SAX2DTM(DTMManager mgr, Source source, int dtmIdentity,
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 DTMWSFilter whiteSpaceFilter,
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 XMLStringFactory xstringfactory,
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 boolean doIndexing,
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 int blocksize,
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 boolean usePrevsib,
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 boolean newNameTable)
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(mgr, source, dtmIdentity, whiteSpaceFilter,
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xstringfactory, doIndexing, blocksize, usePrevsib, newNameTable);
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %OPT% Use smaller sizes for all internal storage units when
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the blocksize is small. This reduces the cost of creating an RTF.
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (blocksize <= 64)
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_data = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS_SMALL);
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dataOrQName = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS_SMALL);
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_valuesOrPrefixes = new DTMStringPool(16);
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_chars = new FastStringBuffer(7, 10);
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_contextIndexes = new IntStack(4);
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_parents = new IntStack(4);
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_data = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS);
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dataOrQName = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS);
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_valuesOrPrefixes = new DTMStringPool();
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_chars = new FastStringBuffer(10, 13);
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_contextIndexes = new IntStack();
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_parents = new IntStack();
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW%  Initial size pushed way down to reduce weight of RTFs
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // (I'm not entirely sure 0 would work, so I'm playing it safe for now.)
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //m_data = new SuballocatedIntVector(doIndexing ? (1024*2) : 512, 1024);
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //m_data = new SuballocatedIntVector(blocksize);
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_data.addElement(0);   // Need placeholder in case index into here must be <0.
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //m_dataOrQName = new SuballocatedIntVector(blocksize);
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // m_useSourceLocationProperty=org.apache.xalan.processor.TransformerFactoryImpl.m_source_location;
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_useSourceLocationProperty = mgr.getSource_location();
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_sourceSystemId = (m_useSourceLocationProperty) ? new StringVector() : null;
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 	m_sourceLine = (m_useSourceLocationProperty) ?  new IntVector() : null;
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_sourceColumn = (m_useSourceLocationProperty) ?  new IntVector() : null;
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set whether information about document source location
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be maintained or not.
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setUseSourceLocation(boolean useSourceLocation)
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_useSourceLocationProperty = useSourceLocation;
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the data or qualified name for the given node identity.
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity.
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The data or qualified name, or DTM.NULL.
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int _dataOrQName(int identity)
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (identity < m_size)
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_dataOrQName.elementAt(identity);
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Check to see if the information requested has been processed, and,
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // if not, advance the iterator until we the information has been
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // processed.
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (true)
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isMore = nextNode();
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isMore)
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NULL;
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (identity < m_size)
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_dataOrQName.elementAt(identity);
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Ask the CoRoutine parser to doTerminate and clear the reference.
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void clearCoRoutine()
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clearCoRoutine(true);
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Ask the CoRoutine parser to doTerminate and clear the reference. If
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the CoRoutine parser has already been cleared, this will have no effect.
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param callDoTerminate true of doTerminate should be called on the
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * coRoutine parser.
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void clearCoRoutine(boolean callDoTerminate)
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_incrementalSAXSource)
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (callDoTerminate)
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_incrementalSAXSource.deliverMoreNodes(false);
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_incrementalSAXSource = null;
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Bind a IncrementalSAXSource to this DTM. If we discover we need nodes
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that have not yet been built, we will ask this object to send us more
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * events, and it will manage interactions with its data sources.
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that we do not actually build the IncrementalSAXSource, since we don't
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * know what source it's reading from, what thread that source will run in,
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or when it will run.
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param incrementalSAXSource The parser that we want to recieve events from
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * on demand.
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setIncrementalSAXSource(IncrementalSAXSource incrementalSAXSource)
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Establish coroutine link so we can request more data
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Note: It's possible that some versions of IncrementalSAXSource may
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // not actually use a CoroutineManager, and hence may not require
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // that we obtain an Application Coroutine ID. (This relies on the
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // coroutine transaction details having been encapsulated in the
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // IncrementalSAXSource.do...() methods.)
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_incrementalSAXSource = incrementalSAXSource;
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Establish SAX-stream link so we can receive the requested data
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    incrementalSAXSource.setContentHandler(this);
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    incrementalSAXSource.setLexicalHandler(this);
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    incrementalSAXSource.setDTDHandler(this);
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Are the following really needed? incrementalSAXSource doesn't yet
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // support them, and they're mostly no-ops here...
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //incrementalSAXSource.setErrorHandler(this);
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //incrementalSAXSource.setDeclHandler(this);
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * getContentHandler returns "our SAX builder" -- the thing that
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * someone else should send SAX events to in order to extend this
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * DTM model.
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Should this return null if constrution already done/begun?
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null if this model doesn't respond to SAX events,
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * "this" if the DTM object has a built-in SAX ContentHandler,
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the IncrementalSAXSource if we're bound to one and should receive
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the SAX stream via it for incremental build purposes...
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ContentHandler getContentHandler()
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_incrementalSAXSource instanceof IncrementalSAXSource_Filter)
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (ContentHandler) m_incrementalSAXSource;
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return this DTM's lexical handler.
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Should this return null if constrution already done/begun?
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null if this model doesn't respond to lexical SAX events,
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * "this" if the DTM object has a built-in SAX ContentHandler,
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the IncrementalSAXSource if we're bound to one and should receive
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the SAX stream via it for incremental build purposes...
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public LexicalHandler getLexicalHandler()
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_incrementalSAXSource instanceof IncrementalSAXSource_Filter)
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (LexicalHandler) m_incrementalSAXSource;
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return this;
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return this DTM's EntityResolver.
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null if this model doesn't respond to SAX entity ref events.
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public EntityResolver getEntityResolver()
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return this DTM's DTDHandler.
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null if this model doesn't respond to SAX dtd events.
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTDHandler getDTDHandler()
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return this DTM's ErrorHandler.
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null if this model doesn't respond to SAX error events.
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ErrorHandler getErrorHandler()
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return this DTM's DeclHandler.
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return null if this model doesn't respond to SAX Decl events.
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DeclHandler getDeclHandler()
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return this;
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true iff we're building this model incrementally (eg
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * we're partnered with a IncrementalSAXSource) and thus require that the
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation and the parse run simultaneously. Guidance to the
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * DTMManager.
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean needsTwoThreads()
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null != m_incrementalSAXSource;
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Directly call the
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * characters method on the passed ContentHandler for the
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * string-value of the given node (see http://www.w3.org/TR/xpath#data-model
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the definition of a node's string-value). Multiple calls to the
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * ContentHandler's characters methods may well occur for a single call to
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this method.
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param normalize true if the content should be normalized according to
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the rules for the XPath
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <a href="http://www.w3.org/TR/xpath#function-normalize-space">normalize-space</a>
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * function.
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void dispatchCharactersEvents(int nodeHandle, ContentHandler ch,
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       boolean normalize)
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (identity == DTM.NULL)
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = _type(identity);
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (isTextType(type))
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int dataIndex = m_dataOrQName.elementAt(identity);
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int offset = m_data.elementAt(dataIndex);
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int length = m_data.elementAt(dataIndex + 1);
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(normalize)
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_chars.sendNormalizedSAXcharacters(ch, offset, length);
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_chars.sendSAXcharacters(ch, offset, length);
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int firstChild = _firstch(identity);
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DTM.NULL != firstChild)
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int offset = -1;
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int length = 0;
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int startNode = identity;
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        identity = firstChild;
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        do {
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          type = _type(identity);
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (isTextType(type))
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int dataIndex = _dataOrQName(identity);
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (-1 == offset)
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              offset = m_data.elementAt(dataIndex);
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            length += m_data.elementAt(dataIndex + 1);
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          identity = getNextNodeIdentity(identity);
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } while (DTM.NULL != identity && (_parent(identity) >= startNode));
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length > 0)
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if(normalize)
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_chars.sendNormalizedSAXcharacters(ch, offset, length);
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_chars.sendSAXcharacters(ch, offset, length);
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if(type != DTM.ELEMENT_NODE)
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int dataIndex = _dataOrQName(identity);
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (dataIndex < 0)
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          dataIndex = -dataIndex;
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          dataIndex = m_data.elementAt(dataIndex + 1);
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String str = m_valuesOrPrefixes.indexToString(dataIndex);
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if(normalize)
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            FastStringBuffer.sendNormalizedSAXcharacters(str.toCharArray(),
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                         0, str.length(), ch);
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ch.characters(str.toCharArray(), 0, str.length());
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its DOM-style node name. This will
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * include names such as #text or #document.
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Name of this node, which may be an empty string.
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Document when empty string is possible...
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW-COMMENT% It should never be empty, should it?
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeName(int nodeHandle)
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int expandedTypeID = getExpandedTypeID(nodeHandle);
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If just testing nonzero, no need to shift...
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int namespaceID = m_expandedNameTable.getNamespaceID(expandedTypeID);
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 == namespaceID)
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Don't retrieve name until/unless needed
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // String name = m_expandedNameTable.getLocalName(expandedTypeID);
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int type = getNodeType(nodeHandle);
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (type == DTM.NAMESPACE_NODE)
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == m_expandedNameTable.getLocalName(expandedTypeID))
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return "xmlns";
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return "xmlns:" + m_expandedNameTable.getLocalName(expandedTypeID);
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (0 == m_expandedNameTable.getLocalNameID(expandedTypeID))
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_fixednames[type];
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_expandedNameTable.getLocalName(expandedTypeID);
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int qnameIndex = m_dataOrQName.elementAt(makeNodeIdentity(nodeHandle));
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (qnameIndex < 0)
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        qnameIndex = -qnameIndex;
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        qnameIndex = m_data.elementAt(qnameIndex);
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_valuesOrPrefixes.indexToString(qnameIndex);
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return the XPath node name.  This should be
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the name as described by the XPath data model, NOT the DOM-style
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * name.
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Name of this node, which may be an empty string.
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeNameX(int nodeHandle)
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int expandedTypeID = getExpandedTypeID(nodeHandle);
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int namespaceID = m_expandedNameTable.getNamespaceID(expandedTypeID);
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 == namespaceID)
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String name = m_expandedNameTable.getLocalName(expandedTypeID);
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (name == null)
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return "";
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return name;
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int qnameIndex = m_dataOrQName.elementAt(makeNodeIdentity(nodeHandle));
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (qnameIndex < 0)
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        qnameIndex = -qnameIndex;
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        qnameIndex = m_data.elementAt(qnameIndex);
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_valuesOrPrefixes.indexToString(qnameIndex);
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     5. [specified] A flag indicating whether this attribute was actually
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        specified in the start-tag of its element, or was defaulted from the
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        DTD.
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributeHandle Must be a valid handle to an attribute node.
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return <code>true</code> if the attribute was specified;
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         <code>false</code> if it was defaulted.
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isAttributeSpecified(int attributeHandle)
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // I'm not sure if I want to do anything with this...
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;  // ??
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   A document type declaration information item has the following properties:
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *     1. [system identifier] The system identifier of the external subset, if
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        it exists. Otherwise this property has no value.
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the system identifier String object, or null if there is none.
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentTypeDeclarationSystemIdentifier()
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMDefaultBase abstract method */
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"Not yet supported!");
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the next node identity value in the list, and call the iterator
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * if it hasn't been added yet.
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param identity The node identity (index).
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return identity+1, or DTM.NULL.
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int getNextNodeIdentity(int identity)
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    identity += 1;
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (identity >= m_size)
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == m_incrementalSAXSource)
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return DTM.NULL;
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      nextNode();
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return identity;
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Directly create SAX parser events from a subtree.
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch A non-null reference to a ContentHandler.
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void dispatchToEvents(int nodeHandle, org.xml.sax.ContentHandler ch)
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws org.xml.sax.SAXException
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMTreeWalker treeWalker = m_walker;
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ContentHandler prevCH = treeWalker.getcontentHandler();
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != prevCH)
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      treeWalker = new DTMTreeWalker();
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    treeWalker.setcontentHandler(ch);
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    treeWalker.setDTM(this);
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      treeWalker.traverse(nodeHandle);
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      treeWalker.setcontentHandler(null);
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the number of nodes that have been added.
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The number of that are currently in the tree.
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getNumberOfNodes()
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_size;
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method should try and build one or more nodes in the table.
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The true if a next node is found or false if
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         there are no more nodes.
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean nextNode()
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_incrementalSAXSource)
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return false;
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_endDocumentOccured)
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      clearCoRoutine();
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return false;
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Object gotMore = m_incrementalSAXSource.deliverMoreNodes(true);
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // gotMore may be a Boolean (TRUE if still parsing, FALSE if
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // EOF) or an exception if IncrementalSAXSource malfunctioned
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // (code error rather than user error).
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% Currently the ErrorHandlers sketched herein are
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no-ops, so I'm going to initially leave this also as a
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no-op.
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!(gotMore instanceof Boolean))
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(gotMore instanceof RuntimeException)
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw (RuntimeException)gotMore;
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if(gotMore instanceof Exception)
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new WrappedRuntimeException((Exception)gotMore);
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // for now...
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      clearCoRoutine();
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return false;
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %TBD%
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (gotMore != Boolean.TRUE)
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // EOF reached without satisfying the request
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      clearCoRoutine();  // Drop connection, stop trying
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %TBD% deregister as its listener?
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Bottleneck determination of text type.
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type oneof DTM.XXX_NODE.
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this is a text or cdata section.
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private final boolean isTextType(int type)
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (DTM.TEXT_NODE == type || DTM.CDATA_SECTION_NODE == type);
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    /**
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * Ensure that the size of the information arrays can hold another entry
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * at the given index.
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     *
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * @param on exit from this function, the information arrays sizes must be
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * at least index+1.
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     *
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     * NEEDSDOC @param index
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//     */
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    protected void ensureSize(int index)
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          // dataOrQName is an SuballocatedIntVector and hence self-sizing.
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          // But DTMDefaultBase may need fixup.
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        super.ensureSize(index);
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct the node map from the node.
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type raw type ID, one of DTM.XXX_NODE.
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expandedTypeID The expended type ID.
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param parentIndex The current parent index.
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param previousSibling The previous sibling index.
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dataOrPrefix index into m_data table, or string handle.
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param canHaveFirstChild true if the node can have a first child, false
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                          if it is atomic.
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The index identity of the node that was added.
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int addNode(int type, int expandedTypeID,
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        int parentIndex, int previousSibling,
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        int dataOrPrefix, boolean canHaveFirstChild)
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Common to all nodes:
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeIndex = m_size++;
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Have we overflowed a DTM Identity's addressing range?
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_dtmIdent.size() == (nodeIndex>>>DTMManager.IDENT_DTM_NODE_BITS))
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addNewDTMID(nodeIndex);
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_firstch.addElement(canHaveFirstChild ? NOTPROCESSED : DTM.NULL);
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_nextsib.addElement(NOTPROCESSED);
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_parent.addElement(parentIndex);
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_exptype.addElement(expandedTypeID);
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dataOrQName.addElement(dataOrPrefix);
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_prevsib != null) {
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_prevsib.addElement(previousSibling);
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL != previousSibling) {
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_nextsib.setElementAt(nodeIndex,previousSibling);
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_locator != null && m_useSourceLocationProperty) {
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      setSourceLocation();
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Note that nextSibling is not processed until charactersFlush()
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is called, to handle successive characters() events.
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Special handling by type: Declare namespaces, attach first child
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch(type)
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTM.NAMESPACE_NODE:
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      declareNamespaceInContext(parentIndex,nodeIndex);
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTM.ATTRIBUTE_NODE:
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default:
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DTM.NULL == previousSibling && DTM.NULL != parentIndex) {
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_firstch.setElementAt(nodeIndex,parentIndex);
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return nodeIndex;
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a new DTM ID beginning at the specified node index.
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param  nodeIndex The node identity at which the new DTM ID will begin
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * addressing.
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void addNewDTMID(int nodeIndex) {
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(m_mgr==null)
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new ClassCastException();
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              // Handle as Extended Addressing
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMManagerDefault mgrD=(DTMManagerDefault)m_mgr;
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int id=mgrD.getFirstFreeDTMID();
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      mgrD.addDTM(this,id,nodeIndex);
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dtmIdent.addElement(id<<DTMManager.IDENT_DTM_NODE_BITS);
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch(ClassCastException e)
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %REVIEW% Wrong error message, but I've been told we're trying
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // not to add messages right not for I18N reasons.
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %REVIEW% Should this be a Fatal Error?
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      error(XMLMessages.createXMLMessage(XMLErrorResources.ER_NO_DTMIDS_AVAIL, null));//"No more DTM IDs are available";
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * Migrate a DTM built with an old DTMManager to a new DTMManager.
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * After the migration, the new DTMManager will treat the DTM as
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * one that is built by itself.
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * This is used to support DTM sharing between multiple transformations.
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    * @param manager the DTMManager
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    */
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void migrateTo(DTMManager manager) {
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.migrateTo(manager);
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // We have to reset the information in m_dtmIdent and
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // register the DTM with the new manager.
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int numDTMs = m_dtmIdent.size();
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int dtmId = m_mgrDefault.getFirstFreeDTMID();
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeIndex = 0;
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < numDTMs; i++)
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_dtmIdent.setElementAt(dtmId << DTMManager.IDENT_DTM_NODE_BITS, i);
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_mgrDefault.addDTM(this, dtmId, nodeIndex);
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      dtmId++;
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      nodeIndex += (1 << DTMManager.IDENT_DTM_NODE_BITS);
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Store the source location of the current node.  This method must be called
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as every node is added to the DTM or for no node.
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void setSourceLocation() {
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_sourceSystemId.addElement(m_locator.getSystemId());
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_sourceLine.addElement(m_locator.getLineNumber());
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_sourceColumn.addElement(m_locator.getColumnNumber());
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //%REVIEW% %BUG% Prevent this from arising in the first place
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // by not allowing the enabling conditions to change after we start
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // building the document.
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_sourceSystemId.size() != m_size) {
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String msg = "CODING ERROR in Source Location: " + m_size + " != "
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + m_sourceSystemId.size();
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.err.println(msg);
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new RuntimeException(msg);
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its node value. This is mostly
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as defined by the DOM, but may ignore some conveniences.
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node id.
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Value of this node, or null if not
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * meaningful for this node type.
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeValue(int nodeHandle)
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = _type(identity);
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (isTextType(type))
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int dataIndex = _dataOrQName(identity);
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int offset = m_data.elementAt(dataIndex);
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int length = m_data.elementAt(dataIndex + 1);
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %OPT% We should cache this, I guess.
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_chars.getString(offset, length);
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (DTM.ELEMENT_NODE == type || DTM.DOCUMENT_FRAGMENT_NODE == type
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             || DTM.DOCUMENT_NODE == type)
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int dataIndex = _dataOrQName(identity);
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (dataIndex < 0)
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        dataIndex = -dataIndex;
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        dataIndex = m_data.elementAt(dataIndex + 1);
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_valuesOrPrefixes.indexToString(dataIndex);
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its XPath-style localname.
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (As defined in Namespaces, this is the portion of the name after any
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * colon character).
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String Local name of this node.
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getLocalName(int nodeHandle)
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable.getLocalName(_exptype(makeNodeIdentity(nodeHandle)));
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The getUnparsedEntityURI function returns the URI of the unparsed
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * entity with the specified name in the same document as the context
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node (see [3.3 Unparsed Entities]). It returns the empty string if
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * there is no such entity.
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XML processors may choose to use the System Identifier (if one
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is provided) to resolve the entity, rather than the URI in the
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Public Identifier. The details are dependent on the processor, and
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * we would have to support some form of plug-in resolver to handle
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this properly. Currently, we simply return the System Identifier if
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * present, and hope that it a usable URI or that our caller can
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * map it to one.
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: Resolve Public Identifiers... or consider changing function name.
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If we find a relative URI
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reference, XML expects it to be resolved in terms of the base URI
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of the document. The DOM doesn't do that for us, and it isn't
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * entirely clear whether that should be done here; currently that's
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * pushed up to a higher level of our application. (Note that DOM Level
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * 1 didn't store the document's base URI.)
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: Consider resolving Relative URIs.
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (The DOM's statement that "An XML processor may choose to
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * completely expand entities before the structure model is passed
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to the DOM" refers only to parsed entities, not unparsed, and hence
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * doesn't affect this function.)
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name A string containing the Entity Name of the unparsed
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * entity.
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String containing the URI of the Unparsed Entity, or an
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * empty string if no such entity exists.
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getUnparsedEntityURI(String name)
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String url = "";
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_entities)
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return url;
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = m_entities.size();
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i += ENTITY_FIELDS_PER)
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String ename = (String) m_entities.elementAt(i + ENTITY_FIELD_NAME);
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != ename && ename.equals(name))
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String nname = (String) m_entities.elementAt(i
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         + ENTITY_FIELD_NOTATIONNAME);
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != nname)
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // The draft says: "The XSLT processor may use the public
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // identifier to generate a URI for the entity instead of the URI
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // specified in the system identifier. If the XSLT processor does
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // not use the public identifier to generate the URI, it must use
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // the system identifier; if the system identifier is a relative
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // URI, it must be resolved into an absolute URI using the URI of
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // the resource containing the entity declaration as the base
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // URI [RFC2396]."
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // So I'm falling a bit short here.
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          url = (String) m_entities.elementAt(i + ENTITY_FIELD_SYSTEMID);
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (null == url)
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            url = (String) m_entities.elementAt(i + ENTITY_FIELD_PUBLICID);
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return url;
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a namespace handle, return the prefix that the namespace decl is
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * mapping.
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return the prefix used to map to the namespace.
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p> %REVIEW% Are you sure you want "" for no prefix?  </p>
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p> %REVIEW-COMMENT% I think so... not totally sure. -sb  </p>
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String prefix of this node's name, or "" if no explicit
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespace prefix was given.
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getPrefix(int nodeHandle)
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = _type(identity);
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.ELEMENT_NODE == type)
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int prefixIndex = _dataOrQName(identity);
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (0 == prefixIndex)
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return "";
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String qname = m_valuesOrPrefixes.indexToString(prefixIndex);
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return getPrefix(qname, null);
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (DTM.ATTRIBUTE_NODE == type)
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int prefixIndex = _dataOrQName(identity);
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (prefixIndex < 0)
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefixIndex = m_data.elementAt(-prefixIndex);
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String qname = m_valuesOrPrefixes.indexToString(prefixIndex);
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return getPrefix(qname, null);
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return "";
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Retrieves an attribute node by by qualified name and namespace URI.
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle int Handle of the node upon which to look up this attribute..
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespaceURI The namespace URI of the attribute to
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   retrieve, or null.
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name of the attribute to
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   retrieve.
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The attribute node handle with the specified name (
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>nodeName</code>) or <code>DTM.NULL</code> if there is no such
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   attribute.
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getAttributeNode(int nodeHandle, String namespaceURI,
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              String name)
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int attrH = getFirstAttribute(nodeHandle); DTM.NULL != attrH;
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            attrH = getNextAttribute(attrH))
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String attrNS = getNamespaceURI(attrH);
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String attrName = getLocalName(attrH);
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean nsMatch = namespaceURI == attrNS
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        || (namespaceURI != null
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            && namespaceURI.equals(attrNS));
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nsMatch && name.equals(attrName))
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return attrH;
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the public identifier of the external subset,
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * normalized as described in 4.2.2 External Entities [XML]. If there is
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * no external subset or if it has no public identifier, this property
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * has no value.
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the public identifier String object, or null if there is none.
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getDocumentTypeDeclarationPublicIdentifier()
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMDefaultBase abstract method */
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"Not yet supported!");
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a node handle, return its DOM-style namespace URI
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (As defined in Namespaces, this is the declared URI which this node's
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * prefix -- or default in lieu thereof -- was mapped to.)
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% Null or ""? -sb</p>
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle the id of the node.
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return String URI value of this node's namespace, or null if no
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespace was resolved.
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNamespaceURI(int nodeHandle)
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable.getNamespace(_exptype(makeNodeIdentity(nodeHandle)));
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the string-value of a node as a String object
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (see http://www.w3.org/TR/xpath#data-model
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the definition of a node's string-value).
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node ID.
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A string object that represents the string-value of the given node.
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XMLString getStringValue(int nodeHandle)
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type;
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(identity==DTM.NULL) // Separate lines because I wanted to breakpoint it
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      type = DTM.NULL;
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      type= _type(identity);
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (isTextType(type))
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int dataIndex = _dataOrQName(identity);
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int offset = m_data.elementAt(dataIndex);
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int length = m_data.elementAt(dataIndex + 1);
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_xstrf.newstr(m_chars, offset, length);
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int firstChild = _firstch(identity);
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DTM.NULL != firstChild)
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int offset = -1;
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int length = 0;
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int startNode = identity;
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        identity = firstChild;
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        do {
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          type = _type(identity);
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (isTextType(type))
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int dataIndex = _dataOrQName(identity);
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (-1 == offset)
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              offset = m_data.elementAt(dataIndex);
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            length += m_data.elementAt(dataIndex + 1);
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          identity = getNextNodeIdentity(identity);
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } while (DTM.NULL != identity && (_parent(identity) >= startNode));
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length > 0)
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return m_xstrf.newstr(m_chars, offset, length);
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if(type != DTM.ELEMENT_NODE)
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int dataIndex = _dataOrQName(identity);
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (dataIndex < 0)
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          dataIndex = -dataIndex;
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          dataIndex = m_data.elementAt(dataIndex + 1);
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_xstrf.newstr(m_valuesOrPrefixes.indexToString(dataIndex));
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_xstrf.emptystr();
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Determine if the string-value of a node is whitespace
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle The node Handle.
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Return true if the given node is whitespace.
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isWhitespace(int nodeHandle)
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int identity = makeNodeIdentity(nodeHandle);
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type;
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(identity==DTM.NULL) // Separate lines because I wanted to breakpoint it
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      type = DTM.NULL;
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      type= _type(identity);
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (isTextType(type))
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int dataIndex = _dataOrQName(identity);
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int offset = m_data.elementAt(dataIndex);
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int length = m_data.elementAt(dataIndex + 1);
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_chars.isWhitespace(offset, length);
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Returns the <code>Element</code> whose <code>ID</code> is given by
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>elementId</code>. If no such element exists, returns
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>DTM.NULL</code>. Behavior is not defined if more than one element
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * has this <code>ID</code>. Attributes (including those
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with the name "ID") are not of type ID unless so defined by DTD/Schema
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * information available to the DTM implementation.
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Implementations that do not know whether attributes are of type ID or
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * not are expected to return <code>DTM.NULL</code>.
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>%REVIEW% Presumably IDs are still scoped to a single document,
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and this operation searches only within a single document, right?
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Wouldn't want collisions between DTMs in the same process.</p>
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elementId The unique <code>id</code> value for an element.
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The handle of the matching element.
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getElementById(String elementId)
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Integer intObj;
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean isMore = true;
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    do
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      intObj = (Integer) m_idAttributes.get(elementId);
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != intObj)
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return makeNodeHandle(intObj.intValue());
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isMore || m_endDocumentOccured)
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      isMore = nextNode();
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (null == intObj);
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return DTM.NULL;
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a prefix either from the qname or from the uri mapping, or just make
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * one up!
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param qname The qualified name, which may be null.
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The namespace URI, which may be null.
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The prefix if there is one, or null.
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getPrefix(String qname, String uri)
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String prefix;
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int uriIndex = -1;
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != uri && uri.length() > 0)
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      do
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        uriIndex = m_prefixMappings.indexOf(uri, ++uriIndex);
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } while ( (uriIndex & 0x01) == 0);
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (uriIndex >= 0)
14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefix = (String) m_prefixMappings.elementAt(uriIndex - 1);
14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (null != qname)
14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int indexOfNSSep = qname.indexOf(':');
14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (qname.equals("xmlns"))
14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = "";
14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (qname.startsWith("xmlns:"))
14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = qname.substring(indexOfNSSep + 1);
14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = (indexOfNSSep > 0)
14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   ? qname.substring(0, indexOfNSSep) : null;
14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefix = null;
14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (null != qname)
14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int indexOfNSSep = qname.indexOf(':');
14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (indexOfNSSep > 0)
14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (qname.startsWith("xmlns:"))
14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = qname.substring(indexOfNSSep + 1);
14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = qname.substring(0, indexOfNSSep);
14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	if (qname.equals("xmlns"))
14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	  prefix = "";
14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	else
14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      	  prefix = null;
14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = null;
14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return prefix;
14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a prefix either from the uri mapping, or just make
14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * one up!
14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The namespace URI, which may be null.
14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The prefix if there is one, or null.
14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getIdForNamespace(String uri)
14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     return m_valuesOrPrefixes.stringToIndex(uri);
14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a prefix either from the qname or from the uri mapping, or just make
14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * one up!
14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The prefix if there is one, or null.
14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNamespaceURI(String prefix)
14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String uri = "";
14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int prefixIndex = m_contextIndexes.peek() - 1 ;
14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == prefix)
14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = "";
14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      do
14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefixIndex = m_prefixMappings.indexOf(prefix, ++prefixIndex);
14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } while ( (prefixIndex >= 0) && (prefixIndex & 0x01) == 0x01);
14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (prefixIndex > -1)
14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        uri = (String) m_prefixMappings.elementAt(prefixIndex + 1);
14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return uri;
14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set an ID string to node association in the ID table.
15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param id The ID string.
15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elem The associated element handle.
15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setIDAttribute(String id, int elem)
15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_idAttributes.put(id, new Integer(elem));
15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Check whether accumulated text should be stripped; if not,
15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * append the appropriate flavor of text/cdata node.
15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void charactersFlush()
15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_textPendingStart >= 0)  // -1 indicates no-text-in-progress
15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int length = m_chars.size() - m_textPendingStart;
15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean doStrip = false;
15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (getShouldStripWhitespace())
15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        doStrip = m_chars.isWhitespace(m_textPendingStart, length);
15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (doStrip) {
15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_chars.setLength(m_textPendingStart);  // Discard accumulated text
15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Guard against characters/ignorableWhitespace events that
15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // contained no characters.  They should not result in a node.
15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length > 0) {
15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int exName = m_expandedNameTable.getExpandedTypeID(DTM.TEXT_NODE);
15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int dataIndex = m_data.size();
15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_previous = addNode(m_coalescedTextType, exName,
15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               m_parents.peek(), m_previous, dataIndex, false);
15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_data.addElement(m_textPendingStart);
15399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_data.addElement(length);
15409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
15429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Reset for next text block
15449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_textPendingStart = -1;
15459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_textType = m_coalescedTextType = DTM.TEXT_NODE;
15469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
15509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Implementation of the EntityResolver interface.
15519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
15529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Resolve an external entity.
15559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Always return null, so that the parser will use the system
15579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * identifier provided in the XML document.  This method implements
15589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the SAX default behaviour: application writers can override it
15599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in a subclass to do special translations such as catalog lookups
15609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or URI redirection.</p>
15619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param publicId The public identifer, or null if none is
15639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                 available.
15649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param systemId The system identifier provided in the XML
15659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                 document.
15669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The new input source, or null to require the
15679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         default behaviour.
15689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
15699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
15709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.EntityResolver#resolveEntity
15719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException
15739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
15749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public InputSource resolveEntity(String publicId, String systemId)
15759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
15769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
15779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
15789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
15799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
15819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Implementation of DTDHandler interface.
15829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
15839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
15859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of a notation declaration.
15869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
15889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass if they wish to keep track of the notations
15899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * declared in a document.</p>
15909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The notation name.
15929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param publicId The notation public identifier, or null if not
15939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                 available.
15949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param systemId The notation system identifier.
15959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
15969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
15979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.DTDHandler#notationDecl
15989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
15999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException
16009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void notationDecl(String name, String publicId, String systemId)
16029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
16039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
16069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of an unparsed entity declaration.
16109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
16129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to keep track of the unparsed entities
16139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * declared in a document.</p>
16149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The entity name.
16169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param publicId The entity public identifier, or null if not
16179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                 available.
16189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param systemId The entity system identifier.
16199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param notationName The name of the associated notation.
16209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
16219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
16229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.DTDHandler#unparsedEntityDecl
16239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException
16259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void unparsedEntityDecl(
16279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String name, String publicId, String systemId, String notationName)
16289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws SAXException
16299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_entities)
16329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_entities = new Vector();
16349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
16379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      systemId = SystemIDResolver.getAbsoluteURI(systemId,
16399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                 getDocumentBaseURI());
16409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
16429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
16439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new org.xml.sax.SAXException(e);
16449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
16459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //  private static final int ENTITY_FIELD_PUBLICID = 0;
16479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_entities.addElement(publicId);
16489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //  private static final int ENTITY_FIELD_SYSTEMID = 1;
16509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_entities.addElement(systemId);
16519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //  private static final int ENTITY_FIELD_NOTATIONNAME = 2;
16539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_entities.addElement(notationName);
16549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //  private static final int ENTITY_FIELD_NAME = 3;
16569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_entities.addElement(name);
16579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
16609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Implementation of ContentHandler interface.
16619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
16629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive a Locator object for document events.
16659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
16679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass if they wish to store the locator for use
16689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with other document events.</p>
16699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param locator A locator for all SAX document events.
16719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#setDocumentLocator
16729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.Locator
16739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setDocumentLocator(Locator locator)
16759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_locator = locator;
16779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_systemId = locator.getSystemId();
16789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
16799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
16819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of the beginning of the document.
16829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
16839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
16849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
16859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#startDocument
16869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
16879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void startDocument() throws SAXException
16889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
16899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DEBUG)
16909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("startDocument");
16919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int doc = addNode(DTM.DOCUMENT_NODE,
16949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      m_expandedNameTable.getExpandedTypeID(DTM.DOCUMENT_NODE),
16959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      DTM.NULL, DTM.NULL, 0, true);
16969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
16979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_parents.push(doc);
16989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_previous = DTM.NULL;
16999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contextIndexes.push(m_prefixMappings.size());  // for the next element.
17019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of the end of the document.
17059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
17079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
17089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#endDocument
17099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void endDocument() throws SAXException
17119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DEBUG)
17139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("endDocument");
17149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		charactersFlush();
17169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_nextsib.setElementAt(NULL,0);
17189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_firstch.elementAt(0) == NOTPROCESSED)
17209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_firstch.setElementAt(NULL,0);
17219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL != m_previous)
17239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_nextsib.setElementAt(DTM.NULL,m_previous);
17249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_parents = null;
17269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_prefixMappings = null;
17279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contextIndexes = null;
17289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_endDocumentOccured = true;
17309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Bugzilla 4858: throw away m_locator. we cache m_systemId
17329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_locator = null;
17339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of the start of a Namespace mapping.
17379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
17399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to take specific actions at the start of
17409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * each Namespace prefix scope (such as storing the prefix mapping).</p>
17419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix The Namespace prefix being declared.
17439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The Namespace URI mapped to the prefix.
17449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
17459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
17469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#startPrefixMapping
17479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void startPrefixMapping(String prefix, String uri)
17499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
17509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DEBUG)
17539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("startPrefixMapping: prefix: " + prefix + ", uri: "
17549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         + uri);
17559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == prefix)
17579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = "";
17589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_prefixMappings.addElement(prefix);  // JDK 1.1.x compat -sc
17599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_prefixMappings.addElement(uri);  // JDK 1.1.x compat -sc
17609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
17639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of the end of a Namespace mapping.
17649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
17669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to take specific actions at the end of
17679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * each prefix mapping.</p>
17689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
17699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix The Namespace prefix being declared.
17709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
17719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
17729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#endPrefixMapping
17739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
17749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void endPrefixMapping(String prefix) throws SAXException
17759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
17769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DEBUG)
17779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("endPrefixMapping: prefix: " + prefix);
17789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == prefix)
17809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = "";
17819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int index = m_contextIndexes.peek() - 1;
17839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    do
17859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      index = m_prefixMappings.indexOf(prefix, ++index);
17879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } while ( (index >= 0) && ((index & 0x01) == 0x01) );
17889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (index > -1)
17919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
17929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_prefixMappings.setElementAt("%@$#^@#", index);
17939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_prefixMappings.setElementAt("%@$#^@#", index + 1);
17949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
17959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
17979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
17989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
17999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Check if a declaration has already been made for a given prefix.
18019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix non-null prefix string.
18039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the declaration has already been declared in the
18059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         current context.
18069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected boolean declAlreadyDeclared(String prefix)
18089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int startDecls = m_contextIndexes.peek();
18119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    java.util.Vector prefixMappings = m_prefixMappings;
18129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nDecls = prefixMappings.size();
18139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = startDecls; i < nDecls; i += 2)
18159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String prefixDecl = (String) prefixMappings.elementAt(i);
18179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (prefixDecl == null)
18199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        continue;
18209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (prefixDecl.equals(prefix))
18229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
18239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
18249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
18269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
18279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	boolean m_pastFirstElement=false;
18299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
18319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of the start of an element.
18329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
18349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to take specific actions at the start of
18359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * each element (such as allocating a new tree node or writing
18369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * output to a file).</p>
18379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
18389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The Namespace URI, or the empty string if the
18399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        element has no Namespace URI or if Namespace
18409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        processing is not being performed.
18419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name (without prefix), or the
18429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        empty string if Namespace processing is not being
18439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        performed.
18449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param qName The qualified name (with prefix), or the
18459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        empty string if qualified names are not available.
18469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attributes The specified or defaulted attributes.
18479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
18489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
18499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#startElement
18509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
18519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void startElement(
18529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String uri, String localName, String qName, Attributes attributes)
18539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws SAXException
18549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
18559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   if (DEBUG)
18569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 {
18579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("startElement: uri: " + uri + ", localname: "
18589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson												 + localName + ", qname: "+qName+", atts: " + attributes);
18599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			boolean DEBUG_ATTRS=true;
18619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			if(DEBUG_ATTRS & attributes!=null)
18629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
18639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				int n = attributes.getLength();
18649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				if(n==0)
18659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					System.out.println("\tempty attribute list");
18669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				else for (int i = 0; i < n; i++)
18679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson					System.out.println("\t attr: uri: " + attributes.getURI(i) +
18689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson														 ", localname: " + attributes.getLocalName(i) +
18699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson														 ", qname: " + attributes.getQName(i) +
18709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson														 ", type: " + attributes.getType(i) +
18719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson														 ", value: " + attributes.getValue(i)
18729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson														 );
18739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
18749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 }
18759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    charactersFlush();
18779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int exName = m_expandedNameTable.getExpandedTypeID(uri, localName, DTM.ELEMENT_NODE);
18799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String prefix = getPrefix(qName, uri);
18809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int prefixIndex = (null != prefix)
18819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      ? m_valuesOrPrefixes.stringToIndex(qName) : 0;
18829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int elemNode = addNode(DTM.ELEMENT_NODE, exName,
18849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                           m_parents.peek(), m_previous, prefixIndex, true);
18859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_indexing)
18879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      indexNode(exName, elemNode);
18889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_parents.push(elemNode);
18919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int startDecls = m_contextIndexes.peek();
18939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nDecls = m_prefixMappings.size();
18949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int prev = DTM.NULL;
18959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
18969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(!m_pastFirstElement)
18979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
18989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // SPECIAL CASE: Implied declaration at root element
18999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix="xml";
19009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String declURL = "http://www.w3.org/XML/1998/namespace";
19019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
19029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int val = m_valuesOrPrefixes.stringToIndex(declURL);
19039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prev = addNode(DTM.NAMESPACE_NODE, exName, elemNode,
19049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     prev, val, false);
19059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_pastFirstElement=true;
19069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = startDecls; i < nDecls; i += 2)
19099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = (String) m_prefixMappings.elementAt(i);
19119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (prefix == null)
19139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        continue;
19149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String declURL = (String) m_prefixMappings.elementAt(i + 1);
19169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
19189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int val = m_valuesOrPrefixes.stringToIndex(declURL);
19209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prev = addNode(DTM.NAMESPACE_NODE, exName, elemNode,
19229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     prev, val, false);
19239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = attributes.getLength();
19269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
19289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String attrUri = attributes.getURI(i);
19309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String attrQName = attributes.getQName(i);
19319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String valString = attributes.getValue(i);
19329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = getPrefix(attrQName, attrUri);
19349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nodeType;
19369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       String attrLocalName = attributes.getLocalName(i);
19389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((null != attrQName)
19409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              && (attrQName.equals("xmlns")
19419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  || attrQName.startsWith("xmlns:")))
19429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (declAlreadyDeclared(prefix))
19449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          continue;  // go to the next attribute.
19459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nodeType = DTM.NAMESPACE_NODE;
19479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
19499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nodeType = DTM.ATTRIBUTE_NODE;
19519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (attributes.getType(i).equalsIgnoreCase("ID"))
19539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          setIDAttribute(valString, elemNode);
19549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Bit of a hack... if somehow valString is null, stringToIndex will
19579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // return -1, which will make things very unhappy.
19589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == valString)
19599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        valString = "";
19609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int val = m_valuesOrPrefixes.stringToIndex(valString);
19629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //String attrLocalName = attributes.getLocalName(i);
19639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != prefix)
19659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
19669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefixIndex = m_valuesOrPrefixes.stringToIndex(attrQName);
19689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int dataIndex = m_data.size();
19709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_data.addElement(prefixIndex);
19729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_data.addElement(val);
19739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        val = -dataIndex;
19759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
19769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName, nodeType);
19789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prev = addNode(nodeType, exName, elemNode, prev, val,
19799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     false);
19809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL != prev)
19839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_nextsib.setElementAt(DTM.NULL,prev);
19849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_wsfilter)
19869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
19879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode), this);
19889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean shouldStrip = (DTMWSFilter.INHERIT == wsv)
19899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            ? getShouldStripWhitespace()
19909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            : (DTMWSFilter.STRIP == wsv);
19919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pushShouldStripWhitespace(shouldStrip);
19939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
19949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_previous = DTM.NULL;
19969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
19979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contextIndexes.push(m_prefixMappings.size());  // for the children.
19989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
19999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of the end of an element.
20029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
20049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to take specific actions at the end of
20059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * each element (such as finalising a tree node or writing
20069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * output to a file).</p>
20079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri The Namespace URI, or the empty string if the
20099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        element has no Namespace URI or if Namespace
20109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        processing is not being performed.
20119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param localName The local name (without prefix), or the
20129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        empty string if Namespace processing is not being
20139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        performed.
20149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param qName The qualified XML 1.0 name (with prefix), or the
20159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        empty string if qualified names are not available.
20169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
20179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
20189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#endElement
20199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void endElement(String uri, String localName, String qName)
20219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
20229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
20239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   if (DEBUG)
20249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("endElement: uri: " + uri + ", localname: "
20259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson												 + localName + ", qname: "+qName);
20269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    charactersFlush();
20289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If no one noticed, startPrefixMapping is a drag.
20309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Pop the context for the last child (the one pushed by startElement)
20319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contextIndexes.quickPop(1);
20329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Do it again for this one (the one pushed by the last endElement).
20349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int topContextIndex = m_contextIndexes.peek();
20359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (topContextIndex != m_prefixMappings.size()) {
20369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_prefixMappings.setSize(topContextIndex);
20379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int lastNode = m_previous;
20409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_previous = m_parents.pop();
20429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If lastNode is still DTM.NULL, this element had no children
20449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DTM.NULL == lastNode)
20459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_firstch.setElementAt(DTM.NULL,m_previous);
20469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
20479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_nextsib.setElementAt(DTM.NULL,lastNode);
20489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    popShouldStripWhitespace();
20509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
20519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of character data inside an element.
20549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
20569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method to take specific actions for each chunk of character data
20579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (such as adding the data to a node or buffer, or printing it to
20589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a file).</p>
20599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch The characters.
20619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param start The start position in the character array.
20629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param length The number of characters to use from the
20639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *               character array.
20649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
20659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
20669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#characters
20679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
20689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void characters(char ch[], int start, int length) throws SAXException
20699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
20709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_textPendingStart == -1)  // First one in this block
20719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_textPendingStart = m_chars.size();
20739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_coalescedTextType = m_textType;
20749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Type logic: If all adjacent text is CDATASections, the
20769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // concatentated text is treated as a single CDATASection (see
20779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // initialization above).  If any were ordinary Text, the whole
20789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // thing is treated as Text. This may be worth %REVIEW%ing.
20799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (m_textType == DTM.TEXT_NODE)
20809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
20819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_coalescedTextType = DTM.TEXT_NODE;
20829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
20839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_chars.append(ch, start, length);
20859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
20869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
20879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
20889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of ignorable whitespace in element content.
20899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
20919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method to take specific actions for each chunk of ignorable
20929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * whitespace (such as adding data to a node or buffer, or printing
20939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * it to a file).</p>
20949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
20959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch The whitespace characters.
20969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param start The start position in the character array.
20979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param length The number of characters to use from the
20989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *               character array.
20999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
21009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
21019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#ignorableWhitespace
21029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void ignorableWhitespace(char ch[], int start, int length)
21049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
21059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %OPT% We can probably take advantage of the fact that we know this
21089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is whitespace.
21099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    characters(ch, start, length);
21109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of a processing instruction.
21149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
21169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to take specific actions for each
21179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processing instruction, such as setting status variables or
21189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * invoking other methods.</p>
21199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param target The processing instruction target.
21219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param data The processing instruction data, or null if
21229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *             none is supplied.
21239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
21249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
21259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#processingInstruction
21269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void processingInstruction(String target, String data)
21289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
21299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (DEBUG)
21319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 System.out.println("processingInstruction: target: " + target +", data: "+data);
21329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    charactersFlush();
21349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int exName = m_expandedNameTable.getExpandedTypeID(null, target,
21369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         DTM.PROCESSING_INSTRUCTION_NODE);
21379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int dataIndex = m_valuesOrPrefixes.stringToIndex(data);
21389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_previous = addNode(DTM.PROCESSING_INSTRUCTION_NODE, exName,
21409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         m_parents.peek(), m_previous,
21419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         dataIndex, false);
21429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of a skipped entity.
21469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>By default, do nothing.  Application writers may override this
21489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method in a subclass to take specific actions for each
21499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * processing instruction, such as setting status variables or
21509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * invoking other methods.</p>
21519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the skipped entity.
21539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
21549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
21559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ContentHandler#processingInstruction
21569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void skippedEntity(String name) throws SAXException
21589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% What should be done here?
21619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
21629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
21659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Implementation of the ErrorHandler interface.
21669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
21679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of a parser warning.
21709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The default implementation does nothing.  Application writers
21729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * may override this method in a subclass to take specific actions
21739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for each warning, such as inserting the message in a log file or
21749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * printing it to the console.</p>
21759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param e The warning information encoded as an exception.
21779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
21789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
21799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ErrorHandler#warning
21809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.SAXParseException
21819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
21829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void warning(SAXParseException e) throws SAXException
21839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
21849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% Is there anyway to get the JAXP error listener here?
21869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    System.err.println(e.getMessage());
21879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
21889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
21899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
21909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Receive notification of a recoverable parser error.
21919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The default implementation does nothing.  Application writers
21939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * may override this method in a subclass to take specific actions
21949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for each error, such as inserting the message in a log file or
21959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * printing it to the console.</p>
21969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
21979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param e The warning information encoded as an exception.
21989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
21999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
22009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ErrorHandler#warning
22019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.SAXParseException
22029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void error(SAXParseException e) throws SAXException
22049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throw e;
22069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report a fatal XML parsing error.
22109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The default implementation throws a SAXParseException.
22129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Application writers may override this method in a subclass if
22139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * they need to take specific actions for each fatal error (such as
22149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * collecting all of the errors into a single report): in any case,
22159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the application must stop all regular processing when this
22169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method is invoked, since the document is no longer reliable, and
22179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the parser may no longer report parsing events.</p>
22189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param e The error information encoded as an exception.
22209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException Any SAX exception, possibly
22219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            wrapping another exception.
22229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ErrorHandler#fatalError
22239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.SAXParseException
22249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void fatalError(SAXParseException e) throws SAXException
22269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throw e;
22289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
22319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Implementation of the DeclHandler interface.
22329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
22339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report an element type declaration.
22369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The content model will consist of the string "EMPTY", the
22389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * string "ANY", or a parenthesised group, optionally followed
22399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * by an occurrence indicator.  The model will be normalized so
22409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that all whitespace is removed,and will include the enclosing
22419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * parentheses.</p>
22429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The element type name.
22449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param model The content model as a normalized string.
22459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
22469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void elementDecl(String name, String model) throws SAXException
22489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
22519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report an attribute type declaration.
22559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Only the effective (first) declaration for an attribute will
22579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be reported.  The type will be one of the strings "CDATA",
22589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * "ID", "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY",
22599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * "ENTITIES", or "NOTATION", or a parenthesized token group with
22609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the separator "|" and all whitespace removed.</p>
22619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param eName The name of the associated element.
22639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param aName The name of the attribute.
22649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type A string representing the attribute type.
22659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param valueDefault A string representing the attribute default
22669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        ("#IMPLIED", "#REQUIRED", or "#FIXED") or null if
22679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        none of these applies.
22689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value A string representing the attribute's default value,
22699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        or null if there is none.
22709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
22719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void attributeDecl(
22739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String eName, String aName, String type, String valueDefault, String value)
22749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws SAXException
22759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
22789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
22819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report an internal entity declaration.
22829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Only the effective (first) declaration for each entity
22849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * will be reported.</p>
22859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
22869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the entity.  If it is a parameter
22879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        entity, the name will begin with '%'.
22889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value The replacement text of the entity.
22899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
22909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #externalEntityDecl
22919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.DTDHandler#unparsedEntityDecl
22929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
22939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void internalEntityDecl(String name, String value)
22949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
22959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
22969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
22979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
22989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
22999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report a parsed external entity declaration.
23029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Only the effective (first) declaration for each entity
23049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * will be reported.</p>
23059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the entity.  If it is a parameter
23079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        entity, the name will begin with '%'.
23089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param publicId The declared public identifier of the entity, or
23099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        null if none was declared.
23109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param systemId The declared system identifier of the entity.
23119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
23129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #internalEntityDecl
23139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.DTDHandler#unparsedEntityDecl
23149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void externalEntityDecl(
23169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String name, String publicId, String systemId) throws SAXException
23179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
23209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
23239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // Implementation of the LexicalHandler interface.
23249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  ////////////////////////////////////////////////////////////////////
23259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report the start of DTD declarations, if any.
23289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Any declarations are assumed to be in the internal subset
23309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * unless otherwise indicated by a {@link #startEntity startEntity}
23319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * event.</p>
23329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Note that the start/endDTD events will appear within
23349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the start/endDocument events from ContentHandler and
23359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * before the first startElement event.</p>
23369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The document type name.
23389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param publicId The declared public identifier for the
23399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        external DTD subset, or null if none was declared.
23409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param systemId The declared system identifier for the
23419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        external DTD subset, or null if none was declared.
23429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an
23439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            exception.
23449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #endDTD
23459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #startEntity
23469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void startDTD(String name, String publicId, String systemId)
23489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws SAXException
23499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_insideDTD = true;
23529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report the end of DTD declarations.
23569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
23589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #startDTD
23599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void endDTD() throws SAXException
23619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_insideDTD = false;
23649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report the beginning of an entity in content.
23689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p><strong>NOTE:</entity> entity references in attribute
23709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * values -- and the start and end of the document entity --
23719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * are never reported.</p>
23729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The start and end of the external DTD subset are reported
23749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * using the pseudo-name "[dtd]".  All other events must be
23759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properly nested within start/end entity events.</p>
23769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Note that skipped entities will be reported through the
23789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * {@link org.xml.sax.ContentHandler#skippedEntity skippedEntity}
23799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * event, which is part of the ContentHandler interface.</p>
23809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the entity.  If it is a parameter
23829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        entity, the name will begin with '%'.
23839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
23849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #endEntity
23859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ext.DeclHandler#internalEntityDecl
23869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.xml.sax.ext.DeclHandler#externalEntityDecl
23879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
23889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void startEntity(String name) throws SAXException
23899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
23909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
23929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
23939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
23949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
23959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report the end of an entity.
23969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
23979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The name of the entity that is ending.
23989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
23999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #startEntity
24009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void endEntity(String name) throws SAXException
24029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no op
24059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report the start of a CDATA section.
24099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>The contents of the CDATA section will be reported through
24119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the regular {@link org.xml.sax.ContentHandler#characters
24129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * characters} event.</p>
24139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
24159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #endCDATA
24169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void startCDATA() throws SAXException
24189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_textType = DTM.CDATA_SECTION_NODE;
24209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report the end of a CDATA section.
24249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
24269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see #startCDATA
24279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void endCDATA() throws SAXException
24299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_textType = DTM.TEXT_NODE;
24319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Report an XML comment anywhere in the document.
24359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>This callback will be used for comments inside or outside the
24379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * document element, including comments in the external DTD
24389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * subset (if read).</p>
24399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ch An array holding the characters in the comment.
24419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param start The starting position in the array.
24429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param length The number of characters to use from the array.
24439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws SAXException The application may raise an exception.
24449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void comment(char ch[], int start, int length) throws SAXException
24469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_insideDTD)      // ignore comments if we're inside the DTD
24499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return;
24509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    charactersFlush();
24529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int exName = m_expandedNameTable.getExpandedTypeID(DTM.COMMENT_NODE);
24549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // For now, treat comments as strings...  I guess we should do a
24569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // seperate FSB buffer instead.
24579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int dataIndex = m_valuesOrPrefixes.stringToIndex(new String(ch, start,
24589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      length));
24599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_previous = addNode(DTM.COMMENT_NODE, exName,
24629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         m_parents.peek(), m_previous, dataIndex, false);
24639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
24669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set a run time property for this DTM instance.
24679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * %REVIEW% Now that we no longer use this method to support
24699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * getSourceLocatorFor, can we remove it?
24709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param property a <code>String</code> value
24729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param value an <code>Object</code> value
24739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
24749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setProperty(String property, Object value)
24759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
24779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Retrieve the SourceLocator associated with a specific node.
24799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is only meaningful if the XalanProperties.SOURCE_LOCATION flag was
24809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * set True using setProperty; if it was never set, or was set false, we
24819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * will return null.
24829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
24839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (We _could_ return a locator with the document's base URI and bogus
24849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * line/column information. Trying that; see the else clause.)
24859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * */
24869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public SourceLocator getSourceLocatorFor(int node)
24879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
24889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_useSourceLocationProperty)
24899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
24909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      node = makeNodeIdentity(node);
24929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
24949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return new NodeLocator(null,
24959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             m_sourceSystemId.elementAt(node),
24969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             m_sourceLine.elementAt(node),
24979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                             m_sourceColumn.elementAt(node));
24989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
24999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if(m_locator!=null)
25009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
25019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	return new NodeLocator(null,m_locator.getSystemId(),-1,-1);
25029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
25039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if(m_systemId!=null)
25049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
25059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	return new NodeLocator(null,m_systemId,-1,-1);
25069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
25079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
25089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
25109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getFixedNames(int type){
25119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_fixednames[type];
25129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
25139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
2514