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(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}