FileDocCategorySizeDatePackage
SourceTreeManager.javaAPI DocJava SE 5 API11081Fri Aug 26 14:56:06 BST 2005com.sun.org.apache.xpath.internal

SourceTreeManager

public class SourceTreeManager extends Object
This class bottlenecks all management of source trees. The methods in this class should allow easy garbage collection of source trees (not yet!), and should centralize parsing for those source trees.

Fields Summary
private Vector
m_sourceTree
Vector of SourceTree objects that this manager manages.
URIResolver
m_uriResolver
The TrAX URI resolver used to obtain source trees.
Constructors Summary
Methods Summary
public java.lang.StringfindURIFromDoc(int owner)
Given a document, find the URL associated with that document.

param
owner Document that was previously processed by this liaison.
return
The base URI of the owner argument.

    int n = m_sourceTree.size();

    for (int i = 0; i < n; i++)
    {
      SourceTree sTree = (SourceTree) m_sourceTree.elementAt(i);

      if (owner == sTree.m_root)
        return sTree.m_url;
    }

    return null;
  
public intgetNode(javax.xml.transform.Source source)
Given a Source object, find the node associated with it.

param
source The Source object to act as the key.
return
The node that is associated with the Source, or null if not found.


//    if (source instanceof DOMSource)
//      return ((DOMSource) source).getNode();

    // TODO: Not sure if the BaseID is really the same thing as the ID.
    String url = source.getSystemId();

    if (null == url)
      return DTM.NULL;

    int n = m_sourceTree.size();

    // System.out.println("getNode: "+n);
    for (int i = 0; i < n; i++)
    {
      SourceTree sTree = (SourceTree) m_sourceTree.elementAt(i);

      // System.out.println("getNode -         url: "+url);
      // System.out.println("getNode - sTree.m_url: "+sTree.m_url);
      if (url.equals(sTree.m_url))
        return sTree.m_root;
    }

    // System.out.println("getNode - returning: "+node);
    return DTM.NULL;
  
public intgetSourceTree(javax.xml.transform.Source source, javax.xml.transform.SourceLocator locator, com.sun.org.apache.xpath.internal.XPathContext xctxt)
Get the source tree from the input source.

param
source The Source object that should identify the desired node.
param
locator The location of the caller, for diagnostic purposes.
return
non-null reference to a node.
throws
TransformerException if the Source argument can't be resolved to a node.


    int n = getNode(source);

    if (DTM.NULL != n)
      return n;

    n = parseToNode(source, locator, xctxt);

    if (DTM.NULL != n)
      putDocumentInCache(n, source);

    return n;
  
public intgetSourceTree(java.lang.String base, java.lang.String urlString, javax.xml.transform.SourceLocator locator, com.sun.org.apache.xpath.internal.XPathContext xctxt)
Get the source tree from the a base URL and a URL string.

param
base The base URI to use if the urlString is relative.
param
urlString An absolute or relative URL string.
param
locator The location of the caller, for diagnostic purposes.
return
should be a non-null reference to the node identified by the base and urlString.
throws
TransformerException If the URL can not resolve to a node.


    // System.out.println("getSourceTree");
    try
    {
      Source source = this.resolveURI(base, urlString, locator);

      // System.out.println("getSourceTree - base: "+base+", urlString: "+urlString+", source: "+source.getSystemId());
      return getSourceTree(source, locator, xctxt);
    }
    catch (IOException ioe)
    {
      throw new TransformerException(ioe.getMessage(), locator, ioe);
    }

    /* catch (TransformerException te)
     {
       throw new TransformerException(te.getMessage(), locator, te);
     }*/
  
public javax.xml.transform.URIResolvergetURIResolver()
Get the object that will be used to resolve URIs used in document(), etc.

return
An object that implements the URIResolver interface, or null.

    return m_uriResolver;
  
public static org.xml.sax.XMLReadergetXMLReader(javax.xml.transform.Source inputSource, javax.xml.transform.SourceLocator locator)
This method returns the SAX2 parser to use with the InputSource obtained from this URI. It may return null if any SAX2-conformant XML parser can be used, or if getInputSource() will also return null. The parser must be free for use (i.e. not currently in use for another parse().

param
inputSource The value returned from the URIResolver.
returns
a SAX2 XMLReader to use to resolve the inputSource argument.
param
locator The location of the original caller, for diagnostic purposes.
return
non-null XMLReader reference ready to parse.
throws
TransformerException if the reader can not be created.


    try
    {
      XMLReader reader = (inputSource instanceof SAXSource)
                         ? ((SAXSource) inputSource).getXMLReader() : null;
                         
      if (null == reader)
      {
        try {
          javax.xml.parsers.SAXParserFactory factory=
              javax.xml.parsers.SAXParserFactory.newInstance();
          factory.setNamespaceAware( true );
          javax.xml.parsers.SAXParser jaxpParser=
              factory.newSAXParser();
          reader=jaxpParser.getXMLReader();
          
        } catch( javax.xml.parsers.ParserConfigurationException ex ) {
          throw new org.xml.sax.SAXException( ex );
        } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {
            throw new org.xml.sax.SAXException( ex1.toString() );
        } catch( NoSuchMethodError ex2 ) {
        }
        catch (AbstractMethodError ame){}
        if(null == reader)
          reader = XMLReaderFactory.createXMLReader();
      }

      try
      {
        reader.setFeature("http://xml.org/sax/features/namespace-prefixes",
                          true);
      }
      catch (org.xml.sax.SAXException se)
      {

        // What can we do?
        // TODO: User diagnostics.
      }

      return reader;
    }
    catch (org.xml.sax.SAXException se)
    {
      throw new TransformerException(se.getMessage(), locator, se);
    }
  
public intparseToNode(javax.xml.transform.Source source, javax.xml.transform.SourceLocator locator, com.sun.org.apache.xpath.internal.XPathContext xctxt)
Try to create a DOM source tree from the input source.

param
source The Source object that identifies the source node.
param
locator The location of the caller, for diagnostic purposes.
return
non-null reference to node identified by the source argument.
throws
TransformerException if the source argument can not be resolved to a source node.


    try
    {      
      Object xowner = xctxt.getOwnerObject();
      DTM dtm;
      if(null != xowner && xowner instanceof com.sun.org.apache.xml.internal.dtm.DTMWSFilter)
      {
        dtm = xctxt.getDTM(source, false, 
                          (com.sun.org.apache.xml.internal.dtm.DTMWSFilter)xowner, false, true);
      }
      else
      {
        dtm = xctxt.getDTM(source, false, null, false, true);
      }
      return dtm.getDocument();
    }
    catch (Exception e)
    {
      //e.printStackTrace();
      throw new TransformerException(e.getMessage(), locator, e);
    }

  
public voidputDocumentInCache(int n, javax.xml.transform.Source source)
Put the source tree root node in the document cache. TODO: This function needs to be a LOT more sophisticated.

param
n The node to cache.
param
source The Source object to cache.


    int cachedNode = getNode(source);

    if (DTM.NULL != cachedNode)
    {
      if (!(cachedNode == n))
        throw new RuntimeException(
          "Programmer's Error!  "
          + "putDocumentInCache found reparse of doc: "
          + source.getSystemId());
      return;
    }
    if (null != source.getSystemId())
    {
      m_sourceTree.addElement(new SourceTree(n, source.getSystemId()));
    }
  
public voidremoveDocumentFromCache(int n)
JJK: Support kluge in ElemForEach. TODO: This function is highly dangerous. Cache management must be improved.

param
n The node to remove.

    if(DTM.NULL ==n)
      return;
    for(int i=m_sourceTree.size()-1;i>=0;--i)
    {
      SourceTree st=(SourceTree)m_sourceTree.elementAt(i);
      if(st!=null && st.m_root==n)
      {
	m_sourceTree.removeElementAt(i);
	return;
      }
    }
  
public voidreset()
Reset the list of SourceTree objects that this manager manages.


               
    
  
    m_sourceTree = new Vector();
  
public javax.xml.transform.SourceresolveURI(java.lang.String base, java.lang.String urlString, javax.xml.transform.SourceLocator locator)
This will be called by the processor when it encounters an xsl:include, xsl:import, or document() function.

param
base The base URI that should be used.
param
urlString Value from an xsl:import or xsl:include's href attribute, or a URI specified in the document() function.
return
a Source that can be used to process the resource.
throws
IOException
throws
TransformerException


    Source source = null;

    if (null != m_uriResolver)
    {
      source = m_uriResolver.resolve(urlString, base);
    }

    if (null == source)
    {
      String uri = SystemIDResolver.getAbsoluteURI(urlString, base);

      source = new StreamSource(uri);
    }

    return source;
  
public voidsetURIResolver(javax.xml.transform.URIResolver resolver)
Set an object that will be used to resolve URIs used in document(), etc.

param
resolver An object that implements the URIResolver interface, or null.

    m_uriResolver = resolver;