1 /*
2 * Copyright 2006 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.springframework.xml.transform;
18
19 import javax.xml.stream.XMLEventReader;
20 import javax.xml.stream.XMLStreamReader;
21 import javax.xml.transform.sax.SAXSource;
22
23 import org.xml.sax.InputSource;
24 import org.xml.sax.XMLReader;
25
26 import org.springframework.xml.stream.StaxEventXmlReader;
27 import org.springframework.xml.stream.StaxStreamXmlReader;
28
29 /**
30 * Implementation of the <code>Source</code> tagging interface for StAX readers. Can be constructed with a
31 * <code>XMLEventReader</code> or a <code>XMLStreamReader</code>.
32 * <p/>
33 * This class is necessary because there is no implementation of <code>Source</code> for StAX Readers in JAXP 1.3. There
34 * is a <code>StAXSource</code> in JAXP 1.4 (JDK 1.6), but this class is kept around for back-ward compatibility
35 * reasons.
36 * <p/>
37 * Even though <code>StaxSource</code> extends from <code>SAXSource</code>, calling the methods of
38 * <code>SAXSource</code> is <strong>not supported</strong>. In general, the only supported operation on this class is
39 * to use the <code>XMLReader</code> obtained via {@link #getXMLReader()} to parse the input source obtained via {@link
40 * #getInputSource()}. Calling {@link #setXMLReader(org.xml.sax.XMLReader)} or {@link
41 * #setInputSource(org.xml.sax.InputSource)} will result in <code>UnsupportedOperationException</code>s.
42 *
43 * @author Arjen Poutsma
44 * @see XMLEventReader
45 * @see XMLStreamReader
46 * @see javax.xml.transform.Transformer
47 * @since 1.0.0
48 */
49 public class StaxSource extends SAXSource {
50
51 private XMLEventReader eventReader;
52
53 private XMLStreamReader streamReader;
54
55 /**
56 * Constructs a new instance of the <code>StaxSource</code> with the specified <code>XMLStreamReader</code>. The
57 * supplied stream reader must be in <code>XMLStreamConstants.START_DOCUMENT</code> or
58 * <code>XMLStreamConstants.START_ELEMENT</code> state.
59 *
60 * @param streamReader the <code>XMLStreamReader</code> to read from
61 * @throws IllegalStateException if the reader is not at the start of a document or element
62 */
63 public StaxSource(XMLStreamReader streamReader) {
64 super(new StaxStreamXmlReader(streamReader), new InputSource());
65 this.streamReader = streamReader;
66 }
67
68 /**
69 * Constructs a new instance of the <code>StaxSource</code> with the specified <code>XMLEventReader</code>. The
70 * supplied event reader must be in <code>XMLStreamConstants.START_DOCUMENT</code> or
71 * <code>XMLStreamConstants.START_ELEMENT</code> state.
72 *
73 * @param eventReader the <code>XMLEventReader</code> to read from
74 * @throws IllegalStateException if the reader is not at the start of a document or element
75 */
76 public StaxSource(XMLEventReader eventReader) {
77 super(new StaxEventXmlReader(eventReader), new InputSource());
78 this.eventReader = eventReader;
79 }
80
81 /**
82 * Returns the <code>XMLEventReader</code> used by this <code>StaxSource</code>. If this <code>StaxSource</code> was
83 * created with an <code>XMLStreamReader</code>, the result will be <code>null</code>.
84 *
85 * @return the StAX event reader used by this source
86 * @see StaxSource#StaxSource(javax.xml.stream.XMLEventReader)
87 */
88 public XMLEventReader getXMLEventReader() {
89 return eventReader;
90 }
91
92 /**
93 * Returns the <code>XMLStreamReader</code> used by this <code>StaxSource</code>. If this <code>StaxSource</code>
94 * was created with an <code>XMLEventReader</code>, the result will be <code>null</code>.
95 *
96 * @return the StAX event reader used by this source
97 * @see StaxSource#StaxSource(javax.xml.stream.XMLEventReader)
98 */
99 public XMLStreamReader getXMLStreamReader() {
100 return streamReader;
101 }
102
103 /**
104 * Throws a <code>UnsupportedOperationException</code>.
105 *
106 * @throws UnsupportedOperationException always
107 */
108 public void setInputSource(InputSource inputSource) {
109 throw new UnsupportedOperationException("setInputSource is not supported");
110 }
111
112 /**
113 * Throws a <code>UnsupportedOperationException</code>.
114 *
115 * @throws UnsupportedOperationException always
116 */
117 public void setXMLReader(XMLReader reader) {
118 throw new UnsupportedOperationException("setXMLReader is not supported");
119 }
120 }