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: SourceTreeManager.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.IOException; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.URIResolver; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXSource; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.stream.StreamSource; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SystemIDResolver; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.XMLReader; 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.XMLReaderFactory; 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class bottlenecks all management of source trees. The methods 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in this class should allow easy garbage collection of source 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * trees (not yet!), and should centralize parsing for those source trees. 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class SourceTreeManager 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Vector of SourceTree objects that this manager manages. */ 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private Vector m_sourceTree = new Vector(); 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Reset the list of SourceTree objects that this manager manages. 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void reset() 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_sourceTree = new Vector(); 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The TrAX URI resolver used to obtain source trees. */ 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson URIResolver m_uriResolver; 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set an object that will be used to resolve URIs used in 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * document(), etc. 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param resolver An object that implements the URIResolver interface, 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or null. 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setURIResolver(URIResolver resolver) 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_uriResolver = resolver; 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the object that will be used to resolve URIs used in 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * document(), etc. 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return An object that implements the URIResolver interface, 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or null. 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public URIResolver getURIResolver() 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_uriResolver; 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a document, find the URL associated with that document. 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param owner Document that was previously processed by this liaison. 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The base URI of the owner argument. 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String findURIFromDoc(int owner) 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_sourceTree.size(); 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SourceTree sTree = (SourceTree) m_sourceTree.elementAt(i); 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (owner == sTree.m_root) 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return sTree.m_url; 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This will be called by the processor when it encounters 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an xsl:include, xsl:import, or document() function. 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param base The base URI that should be used. 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param urlString Value from an xsl:import or xsl:include's href attribute, 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or a URI specified in the document() function. 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a Source that can be used to process the resource. 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws IOException 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Source resolveURI( 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String base, String urlString, SourceLocator locator) 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException, IOException 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Source source = null; 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_uriResolver) 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson source = m_uriResolver.resolve(urlString, base); 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == source) 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String uri = SystemIDResolver.getAbsoluteURI(urlString, base); 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson source = new StreamSource(uri); 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return source; 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** JJK: Support <?xalan:doc_cache_off?> kluge in ElemForEach. 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: This function is highly dangerous. Cache management must be improved. 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param n The node to remove. 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void removeDocumentFromCache(int n) 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DTM.NULL ==n) 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for(int i=m_sourceTree.size()-1;i>=0;--i) 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SourceTree st=(SourceTree)m_sourceTree.elementAt(i); 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(st!=null && st.m_root==n) 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_sourceTree.removeElementAt(i); 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Put the source tree root node in the document cache. 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: This function needs to be a LOT more sophisticated. 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param n The node to cache. 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param source The Source object to cache. 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void putDocumentInCache(int n, Source source) 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int cachedNode = getNode(source); 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (DTM.NULL != cachedNode) 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!(cachedNode == n)) 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new RuntimeException( 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "Programmer's Error! " 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson + "putDocumentInCache found reparse of doc: " 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson + source.getSystemId()); 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != source.getSystemId()) 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_sourceTree.addElement(new SourceTree(n, source.getSystemId())); 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a Source object, find the node associated with it. 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param source The Source object to act as the key. 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The node that is associated with the Source, or null if not found. 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getNode(Source source) 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// if (source instanceof DOMSource) 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// return ((DOMSource) source).getNode(); 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // TODO: Not sure if the BaseID is really the same thing as the ID. 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String url = source.getSystemId(); 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == url) 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return DTM.NULL; 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_sourceTree.size(); 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getNode: "+n); 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SourceTree sTree = (SourceTree) m_sourceTree.elementAt(i); 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getNode - url: "+url); 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getNode - sTree.m_url: "+sTree.m_url); 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (url.equals(sTree.m_url)) 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return sTree.m_root; 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getNode - returning: "+node); 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return DTM.NULL; 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the source tree from the a base URL and a URL string. 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param base The base URI to use if the urlString is relative. 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param urlString An absolute or relative URL string. 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param locator The location of the caller, for diagnostic purposes. 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return should be a non-null reference to the node identified by the 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * base and urlString. 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException If the URL can not resolve to a node. 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getSourceTree( 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String base, String urlString, SourceLocator locator, XPathContext xctxt) 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getSourceTree"); 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Source source = this.resolveURI(base, urlString, locator); 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getSourceTree - base: "+base+", urlString: "+urlString+", source: "+source.getSystemId()); 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getSourceTree(source, locator, xctxt); 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (IOException ioe) 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerException(ioe.getMessage(), locator, ioe); 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* catch (TransformerException te) 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerException(te.getMessage(), locator, te); 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson }*/ 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the source tree from the input source. 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param source The Source object that should identify the desired node. 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param locator The location of the caller, for diagnostic purposes. 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return non-null reference to a node. 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException if the Source argument can't be resolved to 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * a node. 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getSourceTree(Source source, SourceLocator locator, XPathContext xctxt) 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = getNode(source); 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (DTM.NULL != n) 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return n; 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson n = parseToNode(source, locator, xctxt); 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (DTM.NULL != n) 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson putDocumentInCache(n, source); 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return n; 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Try to create a DOM source tree from the input source. 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param source The Source object that identifies the source node. 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param locator The location of the caller, for diagnostic purposes. 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return non-null reference to node identified by the source argument. 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException if the source argument can not be resolved 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to a source node. 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int parseToNode(Source source, SourceLocator locator, XPathContext xctxt) 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Object xowner = xctxt.getOwnerObject(); 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm; 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != xowner && xowner instanceof org.apache.xml.dtm.DTMWSFilter) 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dtm = xctxt.getDTM(source, false, 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (org.apache.xml.dtm.DTMWSFilter)xowner, false, true); 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dtm = xctxt.getDTM(source, false, null, false, true); 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return dtm.getDocument(); 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (Exception e) 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //e.printStackTrace(); 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerException(e.getMessage(), locator, e); 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This method returns the SAX2 parser to use with the InputSource 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * obtained from this URI. 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * It may return null if any SAX2-conformant XML parser can be used, 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or if getInputSource() will also return null. The parser must 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * be free for use (i.e. 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * not currently in use for another parse(). 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param inputSource The value returned from the URIResolver. 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a SAX2 XMLReader to use to resolve the inputSource argument. 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param locator The location of the original caller, for diagnostic purposes. 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException if the reader can not be created. 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static XMLReader getXMLReader(Source inputSource, SourceLocator locator) 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLReader reader = (inputSource instanceof SAXSource) 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? ((SAXSource) inputSource).getXMLReader() : null; 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == reader) 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try { 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson javax.xml.parsers.SAXParserFactory factory= 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson javax.xml.parsers.SAXParserFactory.newInstance(); 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson factory.setNamespaceAware( true ); 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson javax.xml.parsers.SAXParser jaxpParser= 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson factory.newSAXParser(); 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson reader=jaxpParser.getXMLReader(); 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } catch( javax.xml.parsers.ParserConfigurationException ex ) { 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new org.xml.sax.SAXException( ex ); 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) { 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new org.xml.sax.SAXException( ex1.toString() ); 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } catch( NoSuchMethodError ex2 ) { 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (AbstractMethodError ame){} 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null == reader) 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson reader = XMLReaderFactory.createXMLReader(); 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson reader.setFeature("http://xml.org/sax/features/namespace-prefixes", 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson true); 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (org.xml.sax.SAXException se) 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // What can we do? 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // TODO: User diagnostics. 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return reader; 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (org.xml.sax.SAXException se) 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerException(se.getMessage(), locator, se); 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 391