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 {
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, true);  // This usually has no effect anyway.
054         if (factory.isPropertySupported(XMLInputFactory.REPORTER) && reporter != null)
055            factory.setProperty(XMLInputFactory.REPORTER, reporter);
056         if (factory.isPropertySupported(XMLInputFactory.RESOLVER) && resolver != null)
057            factory.setProperty(XMLInputFactory.RESOLVER, resolver);
058         if (factory.isPropertySupported(XMLInputFactory.ALLOCATOR) && eventAllocator != null)
059            factory.setProperty(XMLInputFactory.ALLOCATOR, eventAllocator);
060         sr = factory.createXMLStreamReader(r);
061         sr.nextTag();
062      } catch (Error e) {
063         throw new ParseException(e.getLocalizedMessage());
064      } catch (XMLStreamException e) {
065         throw new ParseException(e);
066      }
067   }
068
069   /**
070    * Returns the pipe passed into the constructor.
071    * 
072    * @return The pipe passed into the constructor.
073    */
074   public ParserPipe getPipe() {
075      return pipe;
076   }
077
078   @Override /* XMLStreamReader */
079   public void close() throws XMLStreamException {
080      sr.close();
081   }
082
083   @Override /* XMLStreamReader */
084   public int getAttributeCount() {
085      return sr.getAttributeCount();
086   }
087
088   @Override /* XMLStreamReader */
089   public String getAttributeLocalName(int index) {
090      return sr.getAttributeLocalName(index);
091   }
092
093   @Override /* XMLStreamReader */
094   public QName getAttributeName(int index) {
095      return sr.getAttributeName(index);
096   }
097
098   @Override /* XMLStreamReader */
099   public String getAttributeNamespace(int index) {
100      return sr.getAttributeNamespace(index);
101   }
102
103   @Override /* XMLStreamReader */
104   public String getAttributePrefix(int index) {
105      return sr.getAttributePrefix(index);
106   }
107
108   @Override /* XMLStreamReader */
109   public String getAttributeType(int index) {
110      return sr.getAttributeType(index);
111   }
112
113   @Override /* XMLStreamReader */
114   public String getAttributeValue(int index) {
115      return sr.getAttributeValue(index);
116   }
117
118   @Override /* XMLStreamReader */
119   public String getAttributeValue(String namespaceURI, String localName) {
120      return sr.getAttributeValue(namespaceURI, localName);
121   }
122
123   @Override /* XMLStreamReader */
124   public String getCharacterEncodingScheme() {
125      return sr.getCharacterEncodingScheme();
126   }
127
128   @Override /* XMLStreamReader */
129   public String getElementText() throws XMLStreamException {
130      return sr.getElementText();
131   }
132
133   @Override /* XMLStreamReader */
134   public String getEncoding() {
135      return sr.getEncoding();
136   }
137
138   @Override /* XMLStreamReader */
139   public int getEventType() {
140      return sr.getEventType();
141   }
142
143   @Override /* XMLStreamReader */
144   public String getLocalName() {
145      return sr.getLocalName();
146   }
147
148   @Override /* XMLStreamReader */
149   public Location getLocation() {
150      return sr.getLocation();
151   }
152
153   @Override /* XMLStreamReader */
154   public QName getName() {
155      return sr.getName();
156   }
157
158   @Override /* XMLStreamReader */
159   public NamespaceContext getNamespaceContext() {
160      return sr.getNamespaceContext();
161   }
162
163   @Override /* XMLStreamReader */
164   public int getNamespaceCount() {
165      return sr.getNamespaceCount();
166   }
167
168   @Override /* XMLStreamReader */
169   public String getNamespacePrefix(int index) {
170      return sr.getNamespacePrefix(index);
171   }
172
173   @Override /* XMLStreamReader */
174   public String getNamespaceURI() {
175      return sr.getNamespaceURI();
176   }
177
178   @Override /* XMLStreamReader */
179   public String getNamespaceURI(String prefix) {
180      return sr.getNamespaceURI(prefix);
181   }
182
183   @Override /* XMLStreamReader */
184   public String getNamespaceURI(int index) {
185      return sr.getNamespaceURI(index);
186   }
187
188   @Override /* XMLStreamReader */
189   public String getPIData() {
190      return sr.getPIData();
191   }
192
193   @Override /* XMLStreamReader */
194   public String getPITarget() {
195      return sr.getPITarget();
196   }
197
198   @Override /* XMLStreamReader */
199   public String getPrefix() {
200      return sr.getPrefix();
201   }
202
203   @Override /* XMLStreamReader */
204   public Object getProperty(String name) throws IllegalArgumentException {
205      return sr.getProperty(name);
206   }
207
208   @Override /* XMLStreamReader */
209   public String getText() {
210      return sr.getText();
211   }
212
213   @Override /* XMLStreamReader */
214   public char[] getTextCharacters() {
215      return sr.getTextCharacters();
216   }
217
218   @Override /* XMLStreamReader */
219   public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException {
220      return sr.getTextCharacters(sourceStart, target, targetStart, length);
221   }
222
223   @Override /* XMLStreamReader */
224   public int getTextLength() {
225      return sr.getTextLength();
226   }
227
228   @Override /* XMLStreamReader */
229   public int getTextStart() {
230      return sr.getTextStart();
231   }
232
233   @Override /* XMLStreamReader */
234   public String getVersion() {
235      return sr.getVersion();
236   }
237
238   @Override /* XMLStreamReader */
239   public boolean hasName() {
240      return sr.hasName();
241   }
242
243   @Override /* XMLStreamReader */
244   public boolean hasNext() throws XMLStreamException {
245      return sr.hasNext();
246   }
247
248   @Override /* XMLStreamReader */
249   public boolean hasText() {
250      return sr.hasText();
251   }
252
253   @Override /* XMLStreamReader */
254   public boolean isAttributeSpecified(int index) {
255      return sr.isAttributeSpecified(index);
256   }
257
258   @Override /* XMLStreamReader */
259   public boolean isCharacters() {
260      return sr.isCharacters();
261   }
262
263   @Override /* XMLStreamReader */
264   public boolean isEndElement() {
265      return sr.isEndElement();
266   }
267
268   @Override /* XMLStreamReader */
269   public boolean isStandalone() {
270      return sr.isStandalone();
271   }
272
273   @Override /* XMLStreamReader */
274   public boolean isStartElement() {
275      return sr.isStartElement();
276   }
277
278   @Override /* XMLStreamReader */
279   public boolean isWhiteSpace() {
280      return sr.isWhiteSpace();
281   }
282
283   @Override /* XMLStreamReader */
284   public int next() throws XMLStreamException {
285      return sr.next();
286   }
287
288   @Override /* XMLStreamReader */
289   public int nextTag() throws XMLStreamException {
290      return sr.nextTag();
291   }
292
293   @Override /* XMLStreamReader */
294   public void require(int type, String namespaceURI, String localName) throws XMLStreamException {
295      sr.require(type, namespaceURI, localName);
296   }
297
298   @Override /* XMLStreamReader */
299   public boolean standaloneSet() {
300      return sr.standaloneSet();
301   }
302}