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