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}