/** * 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 */ public Source resolveURI(String base, String urlString, SourceLocator locator) throws TransformerException, IOException { 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 void setSystemId(String systemId) { if (systemId != null) { _systemId = SystemIDResolver.getAbsoluteURI(systemId); } }
/** * Get an instance of a DTM, loaded with the content from the specified source. If the unique flag * is true, a new instance will always be returned. Otherwise it is up to the DTMManager to return * a new instance or an instance that it already created and may be being used by someone else. (I * think more parameters will need to be added for error handling, and entity resolution). * * @param source the specification of the source object. * @param unique true if the returned DTM must be unique, probably because it is going to be * mutated. * @param whiteSpaceFilter Enables filtering of whitespace nodes, and may be null. * @param incremental true if the DTM should be built incrementally, if possible. * @param doIndexing true if the caller considers it worth it to use indexing schemes. * @param hasUserReader true if <code>source</code> is a <code>SAXSource</code> object that has an * <code>XMLReader</code>, that was specified by the user. * @param size Specifies initial size of tables that represent the DTM * @param buildIdIndex true if the id index table should be built. * @param newNameTable true if we want to use a separate ExpandedNameTable for this DTM. * @return a non-null DTM reference. */ public DTM getDTM( Source source, boolean unique, DTMWSFilter whiteSpaceFilter, boolean incremental, boolean doIndexing, boolean hasUserReader, int size, boolean buildIdIndex, boolean newNameTable) { if (DEBUG && null != source) { System.out.println( "Starting " + (unique ? "UNIQUE" : "shared") + " source: " + source.getSystemId()); } int dtmPos = getFirstFreeDTMID(); int documentID = dtmPos << IDENT_DTM_NODE_BITS; if ((null != source) && source instanceof StAXSource) { final StAXSource staxSource = (StAXSource) source; StAXEvent2SAX staxevent2sax = null; StAXStream2SAX staxStream2SAX = null; if (staxSource.getXMLEventReader() != null) { final XMLEventReader xmlEventReader = staxSource.getXMLEventReader(); staxevent2sax = new StAXEvent2SAX(xmlEventReader); } else if (staxSource.getXMLStreamReader() != null) { final XMLStreamReader xmlStreamReader = staxSource.getXMLStreamReader(); staxStream2SAX = new StAXStream2SAX(xmlStreamReader); } SAXImpl dtm; if (size <= 0) { dtm = new SAXImpl( this, source, documentID, whiteSpaceFilter, null, doIndexing, DTMDefaultBase.DEFAULT_BLOCKSIZE, buildIdIndex, newNameTable); } else { dtm = new SAXImpl( this, source, documentID, whiteSpaceFilter, null, doIndexing, size, buildIdIndex, newNameTable); } dtm.setDocumentURI(source.getSystemId()); addDTM(dtm, dtmPos, 0); try { if (staxevent2sax != null) { staxevent2sax.setContentHandler(dtm); staxevent2sax.parse(); } else if (staxStream2SAX != null) { staxStream2SAX.setContentHandler(dtm); staxStream2SAX.parse(); } } catch (RuntimeException re) { throw re; } catch (Exception e) { throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(e); } return dtm; } else if ((null != source) && source instanceof DOMSource) { final DOMSource domsrc = (DOMSource) source; final org.w3c.dom.Node node = domsrc.getNode(); final DOM2SAX dom2sax = new DOM2SAX(node); SAXImpl dtm; if (size <= 0) { dtm = new SAXImpl( this, source, documentID, whiteSpaceFilter, null, doIndexing, DTMDefaultBase.DEFAULT_BLOCKSIZE, buildIdIndex, newNameTable); } else { dtm = new SAXImpl( this, source, documentID, whiteSpaceFilter, null, doIndexing, size, buildIdIndex, newNameTable); } dtm.setDocumentURI(source.getSystemId()); addDTM(dtm, dtmPos, 0); dom2sax.setContentHandler(dtm); try { dom2sax.parse(); } catch (RuntimeException re) { throw re; } catch (Exception e) { throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(e); } return dtm; } else { boolean isSAXSource = (null != source) ? (source instanceof SAXSource) : true; boolean isStreamSource = (null != source) ? (source instanceof StreamSource) : false; if (isSAXSource || isStreamSource) { XMLReader reader; InputSource xmlSource; if (null == source) { xmlSource = null; reader = null; hasUserReader = false; // Make sure the user didn't lie } else { reader = getXMLReader(source); xmlSource = SAXSource.sourceToInputSource(source); String urlOfSource = xmlSource.getSystemId(); if (null != urlOfSource) { try { urlOfSource = SystemIDResolver.getAbsoluteURI(urlOfSource); } catch (Exception e) { // %REVIEW% Is there a better way to send a warning? System.err.println("Can not absolutize URL: " + urlOfSource); } xmlSource.setSystemId(urlOfSource); } } // Create the basic SAX2DTM. SAXImpl dtm; if (size <= 0) { dtm = new SAXImpl( this, source, documentID, whiteSpaceFilter, null, doIndexing, DTMDefaultBase.DEFAULT_BLOCKSIZE, buildIdIndex, newNameTable); } else { dtm = new SAXImpl( this, source, documentID, whiteSpaceFilter, null, doIndexing, size, buildIdIndex, newNameTable); } // Go ahead and add the DTM to the lookup table. This needs to be // done before any parsing occurs. Note offset 0, since we've just // created a new DTM. addDTM(dtm, dtmPos, 0); if (null == reader) { // Then the user will construct it themselves. return dtm; } reader.setContentHandler(dtm.getBuilder()); if (!hasUserReader || null == reader.getDTDHandler()) { reader.setDTDHandler(dtm); } if (!hasUserReader || null == reader.getErrorHandler()) { reader.setErrorHandler(dtm); } try { reader.setProperty("http://xml.org/sax/properties/lexical-handler", dtm); } catch (SAXNotRecognizedException e) { } catch (SAXNotSupportedException e) { } try { reader.parse(xmlSource); } catch (RuntimeException re) { throw re; } catch (Exception e) { throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(e); } finally { if (!hasUserReader) { releaseXMLReader(reader); } } if (DUMPTREE) { System.out.println("Dumping SAX2DOM"); dtm.dumpDTM(System.err); } return dtm; } else { // It should have been handled by a derived class or the caller // made a mistake. throw new DTMException( XMLMessages.createXMLMessage( XMLErrorResources.ER_NOT_SUPPORTED, new Object[] {source})); } } }