blob: 0d28572068c34f8d6f8392c0b21abb6e8c6b8227 [file] [log] [blame]
// ***************************************************************************************************************************
// * 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());
}
}