001// ***************************************************************************************************************************
002// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
003// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
004// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
005// * with the License.  You may obtain a copy of the License at                                                              *
006// *                                                                                                                         *
007// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
008// *                                                                                                                         *
009// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
010// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
011// * specific language governing permissions and limitations under the License.                                              *
012// ***************************************************************************************************************************
013package org.apache.juneau.xml;
014
015import java.io.*;
016
017import javax.xml.namespace.*;
018import javax.xml.stream.*;
019import javax.xml.stream.util.*;
020
021import org.apache.juneau.parser.*;
022
023/**
024 * Wrapper class around a {@link XMLStreamReader}.
025 *
026 * <p>
027 * The purpose is to encapsulate the reader with the {@link ParserPipe} object so that it can be retrieved for
028 * debugging purposes.
029 */
030public final class XmlReader implements XMLStreamReader, Positionable {
031
032   private final ParserPipe pipe;
033   private final XMLStreamReader sr;
034
035   /**
036    * Constructor.
037    *
038    * @param pipe The parser input.
039    * @param validating The value for the {@link XMLInputFactory#IS_VALIDATING} setting.
040    * @param reporter The value for the {@link XMLInputFactory#REPORTER} setting.
041    * @param resolver The value for the {@link XMLInputFactory#RESOLVER} setting.
042    * @param eventAllocator The value for the {@link XMLInputFactory#ALLOCATOR} setting.
043    * @throws Exception
044    */
045   protected XmlReader(ParserPipe pipe, boolean validating, XMLReporter reporter, XMLResolver resolver, XMLEventAllocator eventAllocator) throws Exception {
046      this.pipe = pipe;
047      try {
048         @SuppressWarnings("resource")
049         Reader r = pipe.getBufferedReader();
050         XMLInputFactory factory = XMLInputFactory.newInstance();
051         factory.setProperty(XMLInputFactory.IS_VALIDATING, validating);
052         factory.setProperty(XMLInputFactory.IS_COALESCING, true);
053         factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
054         factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
055         if (factory.isPropertySupported(XMLInputFactory.REPORTER) && reporter != null)
056            factory.setProperty(XMLInputFactory.REPORTER, reporter);
057         if (factory.isPropertySupported(XMLInputFactory.RESOLVER) && resolver != null)
058            factory.setProperty(XMLInputFactory.RESOLVER, resolver);
059         if (factory.isPropertySupported(XMLInputFactory.ALLOCATOR) && eventAllocator != null)
060            factory.setProperty(XMLInputFactory.ALLOCATOR, eventAllocator);
061         sr = factory.createXMLStreamReader(r);
062         sr.nextTag();
063         pipe.setPositionable(this);
064      } catch (Error e) {
065         throw new ParseException(e.getLocalizedMessage());
066      } catch (XMLStreamException e) {
067         throw new ParseException((Throwable)e);
068      }
069   }
070
071   /**
072    * Returns the pipe passed into the constructor.
073    *
074    * @return The pipe passed into the constructor.
075    */
076   public ParserPipe getPipe() {
077      return pipe;
078   }
079
080   @Override /* XMLStreamReader */
081   public void close() throws XMLStreamException {
082      sr.close();
083   }
084
085   @Override /* XMLStreamReader */
086   public int getAttributeCount() {
087      return sr.getAttributeCount();
088   }
089
090   @Override /* XMLStreamReader */
091   public String getAttributeLocalName(int index) {
092      return sr.getAttributeLocalName(index);
093   }
094
095   @Override /* XMLStreamReader */
096   public QName getAttributeName(int index) {
097      return sr.getAttributeName(index);
098   }
099
100   @Override /* XMLStreamReader */
101   public String getAttributeNamespace(int index) {
102      return sr.getAttributeNamespace(index);
103   }
104
105   @Override /* XMLStreamReader */
106   public String getAttributePrefix(int index) {
107      return sr.getAttributePrefix(index);
108   }
109
110   @Override /* XMLStreamReader */
111   public String getAttributeType(int index) {
112      return sr.getAttributeType(index);
113   }
114
115   @Override /* XMLStreamReader */
116   public String getAttributeValue(int index) {
117      return sr.getAttributeValue(index);
118   }
119
120   @Override /* XMLStreamReader */
121   public String getAttributeValue(String namespaceURI, String localName) {
122      return sr.getAttributeValue(namespaceURI, localName);
123   }
124
125   @Override /* XMLStreamReader */
126   public String getCharacterEncodingScheme() {
127      return sr.getCharacterEncodingScheme();
128   }
129
130   @Override /* XMLStreamReader */
131   public String getElementText() throws XMLStreamException {
132      return sr.getElementText();
133   }
134
135   @Override /* XMLStreamReader */
136   public String getEncoding() {
137      return sr.getEncoding();
138   }
139
140   @Override /* XMLStreamReader */
141   public int getEventType() {
142      return sr.getEventType();
143   }
144
145   @Override /* XMLStreamReader */
146   public String getLocalName() {
147      return sr.getLocalName();
148   }
149
150   @Override /* XMLStreamReader */
151   public Location getLocation() {
152      return sr.getLocation();
153   }
154
155   @Override /* XMLStreamReader */
156   public QName getName() {
157      return sr.getName();
158   }
159
160   @Override /* XMLStreamReader */
161   public NamespaceContext getNamespaceContext() {
162      return sr.getNamespaceContext();
163   }
164
165   @Override /* XMLStreamReader */
166   public int getNamespaceCount() {
167      return sr.getNamespaceCount();
168   }
169
170   @Override /* XMLStreamReader */
171   public String getNamespacePrefix(int index) {
172      return sr.getNamespacePrefix(index);
173   }
174
175   @Override /* XMLStreamReader */
176   public String getNamespaceURI() {
177      return sr.getNamespaceURI();
178   }
179
180   @Override /* XMLStreamReader */
181   public String getNamespaceURI(String prefix) {
182      return sr.getNamespaceURI(prefix);
183   }
184
185   @Override /* XMLStreamReader */
186   public String getNamespaceURI(int index) {
187      return sr.getNamespaceURI(index);
188   }
189
190   @Override /* XMLStreamReader */
191   public String getPIData() {
192      return sr.getPIData();
193   }
194
195   @Override /* XMLStreamReader */
196   public String getPITarget() {
197      return sr.getPITarget();
198   }
199
200   @Override /* XMLStreamReader */
201   public String getPrefix() {
202      return sr.getPrefix();
203   }
204
205   @Override /* XMLStreamReader */
206   public Object getProperty(String name) throws IllegalArgumentException {
207      return sr.getProperty(name);
208   }
209
210   @Override /* XMLStreamReader */
211   public String getText() {
212      return sr.getText();
213   }
214
215   @Override /* XMLStreamReader */
216   public char[] getTextCharacters() {
217      return sr.getTextCharacters();
218   }
219
220   @Override /* XMLStreamReader */
221   public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException {
222      return sr.getTextCharacters(sourceStart, target, targetStart, length);
223   }
224
225   @Override /* XMLStreamReader */
226   public int getTextLength() {
227      return sr.getTextLength();
228   }
229
230   @Override /* XMLStreamReader */
231   public int getTextStart() {
232      return sr.getTextStart();
233   }
234
235   @Override /* XMLStreamReader */
236   public String getVersion() {
237      return sr.getVersion();
238   }
239
240   @Override /* XMLStreamReader */
241   public boolean hasName() {
242      return sr.hasName();
243   }
244
245   @Override /* XMLStreamReader */
246   public boolean hasNext() throws XMLStreamException {
247      return sr.hasNext();
248   }
249
250   @Override /* XMLStreamReader */
251   public boolean hasText() {
252      return sr.hasText();
253   }
254
255   @Override /* XMLStreamReader */
256   public boolean isAttributeSpecified(int index) {
257      return sr.isAttributeSpecified(index);
258   }
259
260   @Override /* XMLStreamReader */
261   public boolean isCharacters() {
262      return sr.isCharacters();
263   }
264
265   @Override /* XMLStreamReader */
266   public boolean isEndElement() {
267      return sr.isEndElement();
268   }
269
270   @Override /* XMLStreamReader */
271   public boolean isStandalone() {
272      return sr.isStandalone();
273   }
274
275   @Override /* XMLStreamReader */
276   public boolean isStartElement() {
277      return sr.isStartElement();
278   }
279
280   @Override /* XMLStreamReader */
281   public boolean isWhiteSpace() {
282      return sr.isWhiteSpace();
283   }
284
285   @Override /* XMLStreamReader */
286   public int next() throws XMLStreamException {
287      return sr.next();
288   }
289
290   @Override /* XMLStreamReader */
291   public int nextTag() throws XMLStreamException {
292      return sr.nextTag();
293   }
294
295   @Override /* XMLStreamReader */
296   public void require(int type, String namespaceURI, String localName) throws XMLStreamException {
297      sr.require(type, namespaceURI, localName);
298   }
299
300   @Override /* XMLStreamReader */
301   public boolean standaloneSet() {
302      return sr.standaloneSet();
303   }
304
305   @Override /* Positionable */
306   public Position getPosition() {
307      Location l = getLocation();
308      return new Position(l.getLineNumber(), l.getColumnNumber());
309   }
310}