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