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: DTMManagerDefault.java 468653 2006-10-28 07:07:05Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.dtm.ref;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.parsers.DocumentBuilder;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.parsers.DocumentBuilderFactory;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.dom.DOMSource;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXSource;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.stream.StreamSource;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMException;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMFilter;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMIterator;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMManager;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMWSFilter;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.dom2dtm.DOM2DTM;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.sax2dtm.SAX2DTM;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.sax2dtm.SAX2RTFDTM;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLErrorResources;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.res.XMLMessages;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.PrefixResolver;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SystemIDResolver;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLReaderManager;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLStringFactory;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Document;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.InputSource;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXNotRecognizedException;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXNotSupportedException;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.XMLReader;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.DefaultHandler;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The default implementation for the DTMManager.
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * %REVIEW% There is currently a reentrancy issue, since the finalizer
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for XRTreeFrag (which runs in the GC thread) wants to call
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * DTMManager.release(), and may do so at the same time that the main
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * transformation thread is accessing the manager. Our current solution is
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to make most of the manager's methods <code>synchronized</code>.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Early tests suggest that doing so is not causing a significant
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * performance hit in Xalan. However, it should be noted that there
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is a possible alternative solution: rewrite release() so it merely
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * posts a request for release onto a threadsafe queue, and explicitly
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * process that queue on an infrequent basis during main-thread
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * activity (eg, when getDTM() is invoked). The downside of that solution
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * would be a greater delay before the DTM's storage is actually released
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for reuse.
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * */
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class DTMManagerDefault extends DTMManager
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //static final boolean JKESS_XNI_EXPERIMENT=true;
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Set this to true if you want a dump of the DTM after creation. */
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean DUMPTREE = false;
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Set this to true if you want a basic diagnostics. */
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean DEBUG = false;
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Map from DTM identifier numbers to DTM objects that this manager manages.
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * One DTM may have several prefix numbers, if extended node indexing
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is in use; in that case, m_dtm_offsets[] will used to control which
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * prefix maps to which section of the DTM.
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This array grows as necessary; see addDTM().
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This array grows as necessary; see addDTM(). Growth is uncommon... but
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * access needs to be blindingly fast since it's used in node addressing.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTM m_dtms[] = new DTM[256];
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Map from DTM identifier numbers to offsets. For small DTMs with a
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * single identifier, this will always be 0. In overflow addressing, where
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * additional identifiers are allocated to access nodes beyond the range of
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a single Node Handle, this table is used to map the handle's node field
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * into the actual node identifier.
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This array grows as necessary; see addDTM().
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This array grows as necessary; see addDTM(). Growth is uncommon... but
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * access needs to be blindingly fast since it's used in node addressing.
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (And at the moment, that includes accessing it from DTMDefaultBase,
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * which is why this is not Protected or Private.)
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  int m_dtm_offsets[] = new int[256];
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The cache for XMLReader objects to be used if the user did not
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * supply an XMLReader for a SAXSource or supplied a StreamSource.
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected XMLReaderManager m_readerManager = null;
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The default implementation of ContentHandler, DTDHandler and ErrorHandler.
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DefaultHandler m_defaultHandler = new DefaultHandler();
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add a DTM to the DTM table. This convenience call adds it as the
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * "base DTM ID", with offset 0. The other version of addDTM should
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be used if you want to add "extended" DTM IDs with nonzero offsets.
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm Should be a valid reference to a DTM.
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param id Integer DTM ID to be bound to this DTM
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public void addDTM(DTM dtm, int id) {	addDTM(dtm,id,0); }
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add a DTM to the DTM table.
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm Should be a valid reference to a DTM.
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param id Integer DTM ID to be bound to this DTM.
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param offset Integer addressing offset. The internal DTM Node ID is
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * obtained by adding this offset to the node-number field of the
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * public DTM Handle. For the first DTM ID accessing each DTM, this is 0;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for overflow addressing it will be a multiple of 1<<IDENT_DTM_NODE_BITS.
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public void addDTM(DTM dtm, int id, int offset)
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if(id>=IDENT_MAX_DTMS)
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// TODO: %REVIEW% Not really the right error message.
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	    throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NO_DTMIDS_AVAIL, null)); //"No more DTM IDs are available!");
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// We used to just allocate the array size to IDENT_MAX_DTMS.
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// But we expect to increase that to 16 bits, and I'm not willing
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// to allocate that much space unless needed. We could use one of our
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// handy-dandy Fast*Vectors, but this will do for now.
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// %REVIEW%
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		int oldlen=m_dtms.length;
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if(oldlen<=id)
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// Various growth strategies are possible. I think we don't want
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// to over-allocate excessively, and I'm willing to reallocate
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// more often to get that. See also Fast*Vector classes.
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			//
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// %REVIEW% Should throw a more diagnostic error if we go over the max...
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int newlen=Math.min((id+256),IDENT_MAX_DTMS);
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			DTM new_m_dtms[] = new DTM[newlen];
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			System.arraycopy(m_dtms,0,new_m_dtms,0,oldlen);
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_dtms=new_m_dtms;
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int new_m_dtm_offsets[] = new int[newlen];
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			System.arraycopy(m_dtm_offsets,0,new_m_dtm_offsets,0,oldlen);
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			m_dtm_offsets=new_m_dtm_offsets;
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dtms[id] = dtm;
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		m_dtm_offsets[id]=offset;
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    dtm.documentRegistration();
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// The DTM should have been told who its manager was when we created it.
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// Do we need to allow for adopting DTMs _not_ created by this manager?
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the first free DTM ID available. %OPT% Linear search is inefficient!
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public int getFirstFreeDTMID()
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = m_dtms.length;
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 1; i < n; i++)
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == m_dtms[i])
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return i;
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		return n; // count on addDTM() to throw exception if out of range
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The default table for exandedNameID lookups.
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ExpandedNameTable m_expandedNameTable =
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new ExpandedNameTable();
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Constructor DTMManagerDefault
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DTMManagerDefault(){}
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an instance of a DTM, loaded with the content from the
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * specified source.  If the unique flag is true, a new instance will
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * always be returned.  Otherwise it is up to the DTMManager to return a
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * new instance or an instance that it already created and may be being used
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * by someone else.
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A bit of magic in this implementation: If the source is null, unique is true,
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and incremental and doIndexing are both false, we return an instance of
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * SAX2RTFDTM, which see.
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (I think more parameters will need to be added for error handling, and entity
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * resolution, and more explicit control of the RTF situation).
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param source the specification of the source object.
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param unique true if the returned DTM must be unique, probably because it
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is going to be mutated.
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whiteSpaceFilter Enables filtering of whitespace nodes, and may
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                         be null.
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param incremental true if the DTM should be built incrementally, if
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                    possible.
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param doIndexing true if the caller considers it worth it to use
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   indexing schemes.
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a non-null DTM reference.
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTM getDTM(Source source, boolean unique,
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 DTMWSFilter whiteSpaceFilter,
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 boolean incremental, boolean doIndexing)
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(DEBUG && null != source)
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("Starting "+
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         (unique ? "UNIQUE" : "shared")+
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         " source: "+source.getSystemId()
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         );
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XMLStringFactory xstringFactory = m_xsf;
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int dtmPos = getFirstFreeDTMID();
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int documentID = dtmPos << IDENT_DTM_NODE_BITS;
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((null != source) && source instanceof DOMSource)
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DOM2DTM dtm = new DOM2DTM(this, (DOMSource) source, documentID,
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                whiteSpaceFilter, xstringFactory, doIndexing);
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addDTM(dtm, dtmPos, 0);
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      if (DUMPTREE)
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      {
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //        dtm.dumpDTM();
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //      }
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return dtm;
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isSAXSource = (null != source)
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ? (source instanceof SAXSource) : true;
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isStreamSource = (null != source)
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ? (source instanceof StreamSource) : false;
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (isSAXSource || isStreamSource) {
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XMLReader reader = null;
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        SAX2DTM dtm;
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          InputSource xmlSource;
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (null == source) {
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xmlSource = null;
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else {
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader = getXMLReader(source);
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            xmlSource = SAXSource.sourceToInputSource(source);
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String urlOfSource = xmlSource.getSystemId();
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null != urlOfSource) {
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              try {
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                urlOfSource = SystemIDResolver.getAbsoluteURI(urlOfSource);
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              } catch (Exception e) {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // %REVIEW% Is there a better way to send a warning?
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                System.err.println("Can not absolutize URL: " + urlOfSource);
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              xmlSource.setSystemId(urlOfSource);
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (source==null && unique && !incremental && !doIndexing) {
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Special case to support RTF construction into shared DTM.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // It should actually still work for other uses,
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // but may be slightly deoptimized relative to the base
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // to allow it to deal with carrying multiple documents.
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // %REVIEW% This is a sloppy way to request this mode;
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // we need to consider architectural improvements.
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            dtm = new SAX2RTFDTM(this, source, documentID, whiteSpaceFilter,
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 xstringFactory, doIndexing);
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          /**************************************************************
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // EXPERIMENTAL 3/22/02
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else if(JKESS_XNI_EXPERIMENT && m_incremental) {
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            dtm = new XNI2DTM(this, source, documentID, whiteSpaceFilter,
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              xstringFactory, doIndexing);
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          **************************************************************/
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Create the basic SAX2DTM.
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            dtm = new SAX2DTM(this, source, documentID, whiteSpaceFilter,
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              xstringFactory, doIndexing);
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Go ahead and add the DTM to the lookup table.  This needs to be
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // done before any parsing occurs. Note offset 0, since we've just
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // created a new DTM.
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          addDTM(dtm, dtmPos, 0);
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          boolean haveXercesParser =
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     (null != reader)
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     && (reader.getClass()
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               .getName()
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               .equals("org.apache.xerces.parsers.SAXParser") );
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (haveXercesParser) {
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            incremental = true;  // No matter what.  %REVIEW%
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // If the reader is null, but they still requested an incremental
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // build, then we still want to set up the IncrementalSAXSource stuff.
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (m_incremental && incremental
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               /* || ((null == reader) && incremental) */) {
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            IncrementalSAXSource coParser=null;
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (haveXercesParser) {
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // IncrementalSAXSource_Xerces to avoid threading.
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              try {
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                coParser =(IncrementalSAXSource)
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  Class.forName("org.apache.xml.dtm.ref.IncrementalSAXSource_Xerces").newInstance();
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }  catch( Exception ex ) {
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ex.printStackTrace();
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                coParser=null;
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (coParser==null ) {
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // Create a IncrementalSAXSource to run on the secondary thread.
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (null == reader) {
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                coParser = new IncrementalSAXSource_Filter();
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              } else {
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                IncrementalSAXSource_Filter filter =
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         new IncrementalSAXSource_Filter();
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                filter.setXMLReader(reader);
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                coParser=filter;
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            /**************************************************************
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // EXPERIMENTAL 3/22/02
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (JKESS_XNI_EXPERIMENT && m_incremental &&
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  dtm instanceof XNI2DTM &&
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  coParser instanceof IncrementalSAXSource_Xerces) {
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                org.apache.xerces.xni.parser.XMLPullParserConfiguration xpc=
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      ((IncrementalSAXSource_Xerces)coParser)
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                           .getXNIParserConfiguration();
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (xpc!=null) {
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Bypass SAX; listen to the XNI stream
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ((XNI2DTM)dtm).setIncrementalXNISource(xpc);
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              } else {
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  // Listen to the SAX stream (will fail, diagnostically...)
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                dtm.setIncrementalSAXSource(coParser);
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ***************************************************************/
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Have the DTM set itself up as IncrementalSAXSource's listener.
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            dtm.setIncrementalSAXSource(coParser);
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null == xmlSource) {
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // Then the user will construct it themselves.
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return dtm;
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null == reader.getErrorHandler()) {
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              reader.setErrorHandler(dtm);
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader.setDTDHandler(dtm);
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // Launch parsing coroutine.  Launches a second thread,
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // if we're using IncrementalSAXSource.filter().
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              coParser.startParse(xmlSource);
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } catch (RuntimeException re) {
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              dtm.clearCoRoutine();
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              throw re;
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } catch (Exception e) {
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              dtm.clearCoRoutine();
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              throw new org.apache.xml.utils.WrappedRuntimeException(e);
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } else {
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null == reader) {
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              // Then the user will construct it themselves.
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return dtm;
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // not incremental
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader.setContentHandler(dtm);
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader.setDTDHandler(dtm);
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null == reader.getErrorHandler()) {
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              reader.setErrorHandler(dtm);
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              reader.setProperty(
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               "http://xml.org/sax/properties/lexical-handler",
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                               dtm);
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } catch (SAXNotRecognizedException e){}
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              catch (SAXNotSupportedException e){}
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              reader.parse(xmlSource);
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } catch (RuntimeException re) {
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              dtm.clearCoRoutine();
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              throw re;
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } catch (Exception e) {
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              dtm.clearCoRoutine();
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              throw new org.apache.xml.utils.WrappedRuntimeException(e);
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (DUMPTREE) {
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            System.out.println("Dumping SAX2DOM");
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            dtm.dumpDTM(System.err);
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return dtm;
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } finally {
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Reset the ContentHandler, DTDHandler, ErrorHandler to the DefaultHandler
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // after creating the DTM.
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (reader != null && !(m_incremental && incremental)) {
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader.setContentHandler(m_defaultHandler);
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader.setDTDHandler(m_defaultHandler);
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            reader.setErrorHandler(m_defaultHandler);
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Reset the LexicalHandler to null after creating the DTM.
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              reader.setProperty("http://xml.org/sax/properties/lexical-handler", null);
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (Exception e) {}
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          releaseXMLReader(reader);
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      } else {
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // It should have been handled by a derived class or the caller
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // made a mistake.
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new DTMException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NOT_SUPPORTED, new Object[]{source})); //"Not supported: " + source);
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a W3C DOM node, try and return a DTM handle.
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note: calling this may be non-optimal, and there is no guarantee that
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the node will be found in any particular DTM.
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node Non-null reference to a DOM node.
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a valid DTM handle.
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public int getDTMHandleFromNode(org.w3c.dom.Node node)
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == node)
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new IllegalArgumentException(XMLMessages.createXMLMessage(XMLErrorResources.ER_NODE_NON_NULL, null)); //"node must be non-null for getDTMHandleFromNode!");
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (node instanceof org.apache.xml.dtm.ref.DTMNodeProxy)
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return ((org.apache.xml.dtm.ref.DTMNodeProxy) node).getDTMNodeNumber();
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Find the DOM2DTMs wrapped around this Document (if any)
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // and check whether they contain the Node in question.
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // NOTE that since a DOM2DTM may represent a subtree rather
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // than a full document, we have to be prepared to check more
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // than one -- and there is no guarantee that we will find
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // one that contains ancestors or siblings of the node we're
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // seeking.
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // %REVIEW% We could search for the one which contains this
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // node at the deepest level, and thus covers the widest
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // subtree, but that's going to entail additional work
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // checking more DTMs... and getHandleOfNode is not a
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // cheap operation in most implementations.
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			//
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// TODO: %REVIEW% If overflow addressing, we may recheck a DTM
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// already examined. Ouch. But with the increased number of DTMs,
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// scanning back to check this is painful.
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// POSSIBLE SOLUTIONS:
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			//   Generate a list of _unique_ DTM objects?
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			//   Have each DTM cache last DOM node search?
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int max = m_dtms.length;
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for(int i = 0; i < max; i++)
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          DTM thisDTM=m_dtms[i];
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if((null != thisDTM) && thisDTM instanceof DOM2DTM)
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int handle=((DOM2DTM)thisDTM).getHandleOfNode(node);
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(handle!=DTM.NULL) return handle;
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         }
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// Not found; generate a new DTM.
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			//
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// %REVIEW% Is this really desirable, or should we return null
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// and make folks explicitly instantiate from a DOMSource? The
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// latter is more work but gives the caller the opportunity to
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// explicitly add the DTM to a DTMManager... and thus to know when
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// it can be discarded again, which is something we need to pay much
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// more attention to. (Especially since only DTMs which are assigned
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// to a manager can use the overflow addressing scheme.)
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			//
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// %BUG% If the source node was a DOM2DTM$defaultNamespaceDeclarationNode
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// and the DTM wasn't registered with this DTMManager, we will create
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// a new DTM and _still_ not be able to find the node (since it will
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// be resynthesized). Another reason to push hard on making all DTMs
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// be managed DTMs.
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			// Since the real root of our tree may be a DocumentFragment, we need to
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // use getParent to find the root, instead of getOwnerDocument.  Otherwise
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // DOM2DTM#getHandleOfNode will be very unhappy.
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node root = node;
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node p = (root.getNodeType() == Node.ATTRIBUTE_NODE) ? ((org.w3c.dom.Attr)root).getOwnerElement() : root.getParentNode();
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (; p != null; p = p.getParentNode())
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        root = p;
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DOM2DTM dtm = (DOM2DTM) getDTM(new javax.xml.transform.dom.DOMSource(root),
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson																		 false, null, true, true);
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int handle;
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(node instanceof org.apache.xml.dtm.ref.dom2dtm.DOM2DTMdefaultNamespaceDeclarationNode)
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				// Can't return the same node since it's unique to a specific DTM,
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				// but can return the equivalent node -- find the corresponding
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				// Document Element, then ask it for the xml: namespace decl.
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				handle=dtm.getHandleOfNode(((org.w3c.dom.Attr)node).getOwnerElement());
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				handle=dtm.getAttributeNode(handle,node.getNamespaceURI(),node.getLocalName());
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				handle = ((DOM2DTM)dtm).getHandleOfNode(node);
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(DTM.NULL == handle)
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new RuntimeException(XMLMessages.createXMLMessage(XMLErrorResources.ER_COULD_NOT_RESOLVE_NODE, null)); //"Could not resolve the node to a handle!");
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return handle;
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This method returns the SAX2 parser to use with the InputSource
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * obtained from this URI.
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It may return null if any SAX2-conformant XML parser can be used,
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or if getInputSource() will also return null. The parser must
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be free for use (i.e., not currently in use for another parse().
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * After use of the parser is completed, the releaseXMLReader(XMLReader)
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * must be called.
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param inputSource The value returned from the URIResolver.
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  a SAX2 XMLReader to use to resolve the inputSource argument.
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return non-null XMLReader reference ready to parse.
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public XMLReader getXMLReader(Source inputSource)
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XMLReader reader = (inputSource instanceof SAXSource)
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         ? ((SAXSource) inputSource).getXMLReader() : null;
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // If user did not supply a reader, ask for one from the reader manager
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == reader) {
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (m_readerManager == null) {
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            m_readerManager = XMLReaderManager.getInstance();
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        reader = m_readerManager.getXMLReader();
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return reader;
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } catch (SAXException se) {
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new DTMException(se.getMessage(), se);
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Indicates that the XMLReader object is no longer in use for the transform.
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that the getXMLReader method may return an XMLReader that was
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * specified on the SAXSource object by the application code.  Such a
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * reader should still be passed to releaseXMLReader, but the reader manager
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * will only re-use XMLReaders that it created.
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param reader The XMLReader to be released.
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public void releaseXMLReader(XMLReader reader) {
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_readerManager != null) {
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_readerManager.releaseXMLReader(reader);
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the DTM object containing a representation of this node.
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeHandle DTM Handle indicating which node to retrieve
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return a reference to the DTM object containing this node.
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTM getDTM(int nodeHandle)
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Performance critical function.
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_dtms[nodeHandle >>> IDENT_DTM_NODE_BITS];
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch(java.lang.ArrayIndexOutOfBoundsException e)
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(nodeHandle==DTM.NULL)
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				return null;		// Accept as a special case.
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				throw e;		// Programming error; want to know about it.
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a DTM, find the ID number in the DTM tables which addresses
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the start of the document. If overflow addressing is in use, other
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * DTM IDs may also be assigned to this DTM.
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm The DTM which (hopefully) contains this node.
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The DTM ID (as the high bits of a NodeHandle, not as our
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * internal index), or -1 if the DTM doesn't belong to this manager.
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public int getDTMIdentity(DTM dtm)
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	// Shortcut using DTMDefaultBase's extension hooks
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	// %REVIEW% Should the lookup be part of the basic DTM API?
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	if(dtm instanceof DTMDefaultBase)
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	{
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		DTMDefaultBase dtmdb=(DTMDefaultBase)dtm;
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if(dtmdb.getManager()==this)
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return dtmdb.getDTMIDs().elementAt(0);
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		else
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return -1;
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = m_dtms.length;
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTM tdtm = m_dtms[i];
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (tdtm == dtm && m_dtm_offsets[i]==0)
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return i << IDENT_DTM_NODE_BITS;
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1;
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Release the DTMManager's reference(s) to a DTM, making it unmanaged.
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is typically done as part of returning the DTM to the heap after
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * we're done with it.
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm the DTM to be released.
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param shouldHardDelete If false, this call is a suggestion rather than an
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * order, and we may not actually release the DTM. This is intended to
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * support intelligent caching of documents... which is not implemented
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in this version of the DTM manager.
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the DTM was released, false if shouldHardDelete was set
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and we decided not to.
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public boolean release(DTM dtm, boolean shouldHardDelete)
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(DEBUG)
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("Releasing "+
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 (shouldHardDelete ? "HARD" : "soft")+
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 " dtm="+
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 // Following shouldn't need a nodeHandle, but does...
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 // and doesn't seem to report the intended value
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 dtm.getDocumentBaseURI()
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			 );
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (dtm instanceof SAX2DTM)
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ((SAX2DTM) dtm).clearCoRoutine();
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// Multiple DTM IDs may be assigned to a single DTM.
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// The Right Answer is to ask which (if it supports
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// extension, the DTM will need a list anyway). The
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// Wrong Answer, applied if the DTM can't help us,
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// is to linearly search them all; this may be very
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// painful.
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		//
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		// %REVIEW% Should the lookup move up into the basic DTM API?
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		if(dtm instanceof DTMDefaultBase)
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			org.apache.xml.utils.SuballocatedIntVector ids=((DTMDefaultBase)dtm).getDTMIDs();
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			for(int i=ids.size()-1;i>=0;--i)
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				m_dtms[ids.elementAt(i)>>>DTMManager.IDENT_DTM_NODE_BITS]=null;
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		else
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		{
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			int i = getDTMIdentity(dtm);
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		    if (i >= 0)
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			{
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson				m_dtms[i >>> DTMManager.IDENT_DTM_NODE_BITS] = null;
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			}
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    dtm.documentRelease();
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Method createDocumentFragment
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC (createDocumentFragment) @return
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTM createDocumentFragment()
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      dbf.setNamespaceAware(true);
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DocumentBuilder db = dbf.newDocumentBuilder();
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Document doc = db.newDocument();
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node df = doc.createDocumentFragment();
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return getDTM(new DOMSource(df), true, null, false, false);
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new DTMException(e);
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method createDTMIterator
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param whatToShow
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param filter
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param entityReferenceExpansion
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC (createDTMIterator) @return
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTMIterator createDTMIterator(int whatToShow, DTMFilter filter,
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       boolean entityReferenceExpansion)
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMManager abstract method */
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method createDTMIterator
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param xpathString
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param presolver
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC (createDTMIterator) @return
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTMIterator createDTMIterator(String xpathString,
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       PrefixResolver presolver)
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMManager abstract method */
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method createDTMIterator
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param node
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC (createDTMIterator) @return
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTMIterator createDTMIterator(int node)
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMManager abstract method */
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC Method createDTMIterator
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param xpathCompiler
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param pos
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC (createDTMIterator) @return
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  synchronized public DTMIterator createDTMIterator(Object xpathCompiler, int pos)
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** @todo: implement this org.apache.xml.dtm.DTMManager abstract method */
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * return the expanded name table.
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC @param dtm
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NEEDSDOC ($objectName$) @return
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ExpandedNameTable getExpandedNameTable(DTM dtm)
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_expandedNameTable;
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
860