| // *************************************************************************************************************************** |
| // * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * |
| // * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * |
| // * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * |
| // * with the License. You may obtain a copy of the License at * |
| // * * |
| // * http://www.apache.org/licenses/LICENSE-2.0 * |
| // * * |
| // * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * |
| // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * |
| // * specific language governing permissions and limitations under the License. * |
| // *************************************************************************************************************************** |
| package org.apache.juneau.xml; |
| |
| import java.io.*; |
| |
| import javax.xml.namespace.*; |
| import javax.xml.stream.*; |
| import javax.xml.stream.util.*; |
| |
| import org.apache.juneau.parser.*; |
| |
| /** |
| * Wrapper class around a {@link XMLStreamReader}. |
| * |
| * <p> |
| * The purpose is to encapsulate the reader with the {@link ParserPipe} object so that it can be retrieved for |
| * debugging purposes. |
| */ |
| public final class XmlReader implements XMLStreamReader, Positionable { |
| |
| private final ParserPipe pipe; |
| private final XMLStreamReader sr; |
| |
| /** |
| * Constructor. |
| * |
| * @param pipe The parser input. |
| * @param validating The value for the {@link XMLInputFactory#IS_VALIDATING} setting. |
| * @param reporter The value for the {@link XMLInputFactory#REPORTER} setting. |
| * @param resolver The value for the {@link XMLInputFactory#RESOLVER} setting. |
| * @param eventAllocator The value for the {@link XMLInputFactory#ALLOCATOR} setting. |
| * @throws IOException Thrown by underling |
| * @throws XMLStreamException Thrown by underlying XML stream. |
| */ |
| protected XmlReader(ParserPipe pipe, boolean validating, XMLReporter reporter, XMLResolver resolver, XMLEventAllocator eventAllocator) throws IOException, XMLStreamException { |
| this.pipe = pipe; |
| try { |
| @SuppressWarnings("resource") |
| Reader r = pipe.getBufferedReader(); |
| XMLInputFactory factory = XMLInputFactory.newInstance(); |
| factory.setProperty(XMLInputFactory.IS_VALIDATING, validating); |
| factory.setProperty(XMLInputFactory.IS_COALESCING, true); |
| factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); |
| factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); |
| if (factory.isPropertySupported(XMLInputFactory.REPORTER) && reporter != null) |
| factory.setProperty(XMLInputFactory.REPORTER, reporter); |
| if (factory.isPropertySupported(XMLInputFactory.RESOLVER) && resolver != null) |
| factory.setProperty(XMLInputFactory.RESOLVER, resolver); |
| if (factory.isPropertySupported(XMLInputFactory.ALLOCATOR) && eventAllocator != null) |
| factory.setProperty(XMLInputFactory.ALLOCATOR, eventAllocator); |
| sr = factory.createXMLStreamReader(r); |
| sr.nextTag(); |
| pipe.setPositionable(this); |
| } catch (Error e) { |
| throw new IOException(e.getLocalizedMessage()); |
| } |
| } |
| |
| /** |
| * Returns the pipe passed into the constructor. |
| * |
| * @return The pipe passed into the constructor. |
| */ |
| public ParserPipe getPipe() { |
| return pipe; |
| } |
| |
| @Override /* XMLStreamReader */ |
| public void close() throws XMLStreamException { |
| sr.close(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int getAttributeCount() { |
| return sr.getAttributeCount(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getAttributeLocalName(int index) { |
| return sr.getAttributeLocalName(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public QName getAttributeName(int index) { |
| return sr.getAttributeName(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getAttributeNamespace(int index) { |
| return sr.getAttributeNamespace(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getAttributePrefix(int index) { |
| return sr.getAttributePrefix(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getAttributeType(int index) { |
| return sr.getAttributeType(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getAttributeValue(int index) { |
| return sr.getAttributeValue(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getAttributeValue(String namespaceURI, String localName) { |
| return sr.getAttributeValue(namespaceURI, localName); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getCharacterEncodingScheme() { |
| return sr.getCharacterEncodingScheme(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getElementText() throws XMLStreamException { |
| return sr.getElementText(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getEncoding() { |
| return sr.getEncoding(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int getEventType() { |
| return sr.getEventType(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getLocalName() { |
| return sr.getLocalName(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public Location getLocation() { |
| return sr.getLocation(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public QName getName() { |
| return sr.getName(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public NamespaceContext getNamespaceContext() { |
| return sr.getNamespaceContext(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int getNamespaceCount() { |
| return sr.getNamespaceCount(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getNamespacePrefix(int index) { |
| return sr.getNamespacePrefix(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getNamespaceURI() { |
| return sr.getNamespaceURI(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getNamespaceURI(String prefix) { |
| return sr.getNamespaceURI(prefix); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getNamespaceURI(int index) { |
| return sr.getNamespaceURI(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getPIData() { |
| return sr.getPIData(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getPITarget() { |
| return sr.getPITarget(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getPrefix() { |
| return sr.getPrefix(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public Object getProperty(String name) throws IllegalArgumentException { |
| return sr.getProperty(name); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getText() { |
| return sr.getText(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public char[] getTextCharacters() { |
| return sr.getTextCharacters(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException { |
| return sr.getTextCharacters(sourceStart, target, targetStart, length); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int getTextLength() { |
| return sr.getTextLength(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int getTextStart() { |
| return sr.getTextStart(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public String getVersion() { |
| return sr.getVersion(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean hasName() { |
| return sr.hasName(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean hasNext() throws XMLStreamException { |
| return sr.hasNext(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean hasText() { |
| return sr.hasText(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean isAttributeSpecified(int index) { |
| return sr.isAttributeSpecified(index); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean isCharacters() { |
| return sr.isCharacters(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean isEndElement() { |
| return sr.isEndElement(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean isStandalone() { |
| return sr.isStandalone(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean isStartElement() { |
| return sr.isStartElement(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean isWhiteSpace() { |
| return sr.isWhiteSpace(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int next() throws XMLStreamException { |
| return sr.next(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public int nextTag() throws XMLStreamException { |
| return sr.nextTag(); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public void require(int type, String namespaceURI, String localName) throws XMLStreamException { |
| sr.require(type, namespaceURI, localName); |
| } |
| |
| @Override /* XMLStreamReader */ |
| public boolean standaloneSet() { |
| return sr.standaloneSet(); |
| } |
| |
| @Override /* Positionable */ |
| public Position getPosition() { |
| Location l = getLocation(); |
| return new Position(l.getLineNumber(), l.getColumnNumber()); |
| } |
| } |