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