1320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/* 2320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one or more 3320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * contributor license agreements. See the NOTICE file distributed with 4320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * this work for additional information regarding copyright ownership. 5320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The ASF licenses this file to You under the Apache License, Version 2.0 6320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * (the "License"); you may not use this file except in compliance with 7320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * the License. You may obtain a copy of the License at 8320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 9320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 10320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 11320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Unless required by applicable law or agreed to in writing, software 12320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 13320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * See the License for the specific language governing permissions and 15320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * limitations under the License. 16320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 17320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 18320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson// $Id: SAXSource.java 446598 2006-09-15 12:55:40Z jeremias $ 19320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 20320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpackage javax.xml.transform.sax; 21320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 22320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport javax.xml.transform.Source; 23320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport javax.xml.transform.stream.StreamSource; 24320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport org.xml.sax.InputSource; 25320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport org.xml.sax.XMLReader; 26320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 27320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/** 28320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Acts as an holder for SAX-style Source.</p> 29f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 30320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Note that XSLT requires namespace support. Attempting to transform an 31320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * input source that is not 32320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * generated with a namespace-aware parser may result in errors. 33320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Parsers can be made namespace aware by calling the 34320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * {@link javax.xml.parsers.SAXParserFactory#setNamespaceAware(boolean awareness)} method.</p> 35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 36320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @author <a href="mailto:Jeff.Suttor@Sun.com">Jeff Suttor</a> 37320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @version $Revision: 446598 $, $Date: 2006-09-15 05:55:40 -0700 (Fri, 15 Sep 2006) $ 38320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 39320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpublic class SAXSource implements Source { 40320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 41320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 42320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * If {@link javax.xml.transform.TransformerFactory#getFeature} 43320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * returns true when passed this value as an argument, 44320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * the Transformer supports Source input of this type. 45320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 46320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public static final String FEATURE = 47320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson "http://javax.xml.transform.sax.SAXSource/feature"; 48320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 49320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 50320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Zero-argument default constructor. If this constructor is used, and 51320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * no SAX source is set using 52320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * {@link #setInputSource(InputSource inputSource)} , then the 53320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <code>Transformer</code> will 54320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * create an empty source {@link org.xml.sax.InputSource} using 55320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * {@link org.xml.sax.InputSource#InputSource() new InputSource()}.</p> 56320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 57320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @see javax.xml.transform.Transformer#transform(Source xmlSource, Result outputTarget) 58320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 59320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public SAXSource() { } 60320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 61320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 62320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Create a <code>SAXSource</code>, using an {@link org.xml.sax.XMLReader} 63320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * and a SAX InputSource. The {@link javax.xml.transform.Transformer} 64320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * or {@link javax.xml.transform.sax.SAXTransformerFactory} will set itself 65320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * to be the reader's {@link org.xml.sax.ContentHandler}, and then will call 66320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * reader.parse(inputSource). 67320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 68320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param reader An XMLReader to be used for the parse. 69320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param inputSource A SAX input source reference that must be non-null 70320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * and that will be passed to the reader parse method. 71320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 72320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public SAXSource(XMLReader reader, InputSource inputSource) { 73320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson this.reader = reader; 74320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson this.inputSource = inputSource; 75320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 76320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 77320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 78320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Create a <code>SAXSource</code>, using a SAX <code>InputSource</code>. 79320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The {@link javax.xml.transform.Transformer} or 80320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * {@link javax.xml.transform.sax.SAXTransformerFactory} creates a 81320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * reader via {@link org.xml.sax.helpers.XMLReaderFactory} 82320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * (if setXMLReader is not used), sets itself as 83320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * the reader's {@link org.xml.sax.ContentHandler}, and calls 84320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * reader.parse(inputSource). 85320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 86320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param inputSource An input source reference that must be non-null 87320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * and that will be passed to the parse method of the reader. 88320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 89320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public SAXSource(InputSource inputSource) { 90320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson this.inputSource = inputSource; 91320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 92320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 93320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 94320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Set the XMLReader to be used for the Source. 95320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 96320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param reader A valid XMLReader or XMLFilter reference. 97320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 98320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public void setXMLReader(XMLReader reader) { 99320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson this.reader = reader; 100320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 101320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 102320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 103320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Get the XMLReader to be used for the Source. 104320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 105320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @return A valid XMLReader or XMLFilter reference, or null. 106320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 107320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public XMLReader getXMLReader() { 108320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return reader; 109320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 110320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 111320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 112320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Set the SAX InputSource to be used for the Source. 113320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 114320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param inputSource A valid InputSource reference. 115320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 116320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public void setInputSource(InputSource inputSource) { 117320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson this.inputSource = inputSource; 118320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 119320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 120320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 121320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Get the SAX InputSource to be used for the Source. 122320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 123320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @return A valid InputSource reference, or null. 124320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 125320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public InputSource getInputSource() { 126320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return inputSource; 127320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 128320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 129320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 130320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Set the system identifier for this Source. If an input source 131320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * has already been set, it will set the system ID or that 132320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * input source, otherwise it will create a new input source. 133320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 134320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>The system identifier is optional if there is a byte stream 135320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * or a character stream, but it is still useful to provide one, 136320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * since the application can use it to resolve relative URIs 137320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * and can include it in error messages and warnings (the parser 138320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * will attempt to open a connection to the URI only if 139320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * no byte stream or character stream is specified).</p> 140320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 141320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param systemId The system identifier as a URI string. 142320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 143320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public void setSystemId(String systemId) { 144320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 145320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson if (null == inputSource) { 146320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson inputSource = new InputSource(systemId); 147320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } else { 148320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson inputSource.setSystemId(systemId); 149320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 150320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 151320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 152320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 153320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Get the base ID (URI or system ID) from where URIs 154320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * will be resolved.</p> 155320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 156320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @return Base URL for the <code>Source</code>, or <code>null</code>. 157320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 158320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public String getSystemId() { 159320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 160320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson if (inputSource == null) { 161320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return null; 162320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } else { 163320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return inputSource.getSystemId(); 164320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 165320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 166320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 167320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 168320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The XMLReader to be used for the source tree input. May be null. 169320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 170320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson private XMLReader reader; 171320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 172320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 173320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>The SAX InputSource to be used for the source tree input. 174320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Should not be <code>null<code>.</p> 175320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 176320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson private InputSource inputSource; 177320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 178320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson /** 179320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Attempt to obtain a SAX InputSource object from a Source 180320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * object. 181320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 182320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @param source Must be a non-null Source reference. 183320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * 184320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @return An InputSource, or null if Source can not be converted. 185320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */ 186320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson public static InputSource sourceToInputSource(Source source) { 187320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 188320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson if (source instanceof SAXSource) { 189320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return ((SAXSource) source).getInputSource(); 190320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } else if (source instanceof StreamSource) { 191320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson StreamSource ss = (StreamSource) source; 192320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson InputSource isource = new InputSource(ss.getSystemId()); 193320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 194320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson isource.setByteStream(ss.getInputStream()); 195320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson isource.setCharacterStream(ss.getReader()); 196320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson isource.setPublicId(ss.getPublicId()); 197320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 198320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return isource; 199320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } else { 200320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson return null; 201320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 202320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson } 203320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson} 204320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson 205