package org.odata4j.stax2.staximpl; /* * #%L * interaction-odata4j-ext * %% * Copyright (C) 2012 - 2016 Temenos Holdings N.V. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.io.Reader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Characters; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.Namespace; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import org.core4j.Enumerable; import org.odata4j.core.Throwables; import org.odata4j.stax2.Attribute2; import org.odata4j.stax2.Characters2; import org.odata4j.stax2.EndElement2; import org.odata4j.stax2.Namespace2; import org.odata4j.stax2.QName2; import org.odata4j.stax2.StartElement2; import org.odata4j.stax2.XMLEvent2; import org.odata4j.stax2.XMLEventReader2; import org.odata4j.stax2.XMLInputFactory2; /** * Copy of StaxXMLInputFactory2 from StaxXMLFactoryProvider2 * This class can be removed when Stax allows options/attributes in the default factory implementation. */ public class StaxXMLInputFactory2Ext implements XMLInputFactory2 { private final XMLInputFactory factory; public StaxXMLInputFactory2Ext(XMLInputFactory factory) { this.factory = factory; } @Override public XMLEventReader2 createXMLEventReader(Reader reader) { try { XMLEventReader real = factory.createXMLEventReader(reader); return new StaxXMLEventReader2(real); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } private static class StaxXMLEventReader2 implements XMLEventReader2 { private final XMLEventReader real; public StaxXMLEventReader2(XMLEventReader real) { this.real = real; } @Override public String getElementText() { try { return real.getElementText(); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } @Override public boolean hasNext() { return real.hasNext(); } @Override public XMLEvent2 nextEvent() { try { return new StaxXMLEvent2(real.nextEvent()); } catch (XMLStreamException e) { throw Throwables.propagate(e); } } } private static class StaxXMLEvent2 implements XMLEvent2 { private final XMLEvent real; public StaxXMLEvent2(XMLEvent real) { this.real = real; } @Override public String toString() { return String.format("%s[%s]", StaxXMLEvent2.class.getSimpleName(), getEventTypeName()); } private String getEventTypeName() { switch (real.getEventType()) { case XMLStreamConstants.START_ELEMENT: return "START_ELEMENT"; case XMLStreamConstants.END_ELEMENT: return "END_ELEMENT"; case XMLStreamConstants.CHARACTERS: return "CHARACTERS"; case XMLStreamConstants.ATTRIBUTE: return "ATTRIBUTE"; case XMLStreamConstants.NAMESPACE: return "NAMESPACE"; case XMLStreamConstants.PROCESSING_INSTRUCTION: return "PROCESSING_INSTRUCTION"; case XMLStreamConstants.COMMENT: return "COMMENT"; case XMLStreamConstants.START_DOCUMENT: return "START_DOCUMENT"; case XMLStreamConstants.END_DOCUMENT: return "END_DOCUMENT"; case XMLStreamConstants.DTD: return "DTD"; default: return "UNKNOWN TYPE " + real.getEventType(); } } public XMLEvent getXMLEvent() { return real; } @Override public EndElement2 asEndElement() { return new StaxEndElement2(real.asEndElement()); } @Override public StartElement2 asStartElement() { return new StaxStartElement2(real.asStartElement()); } @Override public Characters2 asCharacters() { return new StaxCharacters2(real.asCharacters()); } @Override public boolean isEndElement() { return real.isEndElement(); } @Override public boolean isStartElement() { return real.isStartElement(); } @Override public boolean isCharacters() { return real.isCharacters(); } } private static class StaxEndElement2 implements EndElement2 { private final EndElement real; public StaxEndElement2(EndElement real) { this.real = real; } @Override public QName2 getName() { return new QName2(real.getName().getNamespaceURI(), real.getName().getLocalPart()); } } public static class StaxStartElement2 implements StartElement2 { public final StartElement real; public StaxStartElement2(StartElement real) { this.real = real; } @Override public QName2 getName() { return new QName2(real.getName().getNamespaceURI(), real.getName().getLocalPart()); } @Override public Attribute2 getAttributeByName(String name) { return getAttributeByName(new QName2(name)); } @Override public Attribute2 getAttributeByName(QName2 name) { Attribute att = real.getAttributeByName(StaxXMLFactoryProvider2.toQName(name)); if (att == null) return null; return new StaxAttribute2(att); } @Override public Enumerable<Attribute2> getAttributes() { Iterator i = real.getAttributes(); List<Attribute2> atts = new ArrayList<Attribute2>(); while (i.hasNext()) { atts.add(new StaxAttribute2((Attribute) i.next())); } return Enumerable.create(atts); } @Override public Enumerable<Namespace2> getNamespaces() { Iterator i = real.getNamespaces(); List<Namespace2> namespaces = new ArrayList<Namespace2>(); while (i.hasNext()) { namespaces.add(new StaxNamespace2((Namespace) i.next())); } return Enumerable.create(namespaces); } } private static class StaxNamespace2 extends StaxAttribute2 implements Namespace2 { public StaxNamespace2(Namespace real) { super(real); } @Override public String getNamespaceURI() { return ((Namespace) real).getNamespaceURI(); } @Override public String getPrefix() { return ((Namespace) real).getPrefix(); } @Override public boolean isDefaultNamespaceDeclaration() { return ((Namespace) real).isDefaultNamespaceDeclaration(); } } private static class StaxAttribute2 implements Attribute2 { protected final Attribute real; public StaxAttribute2(Attribute real) { this.real = real; } @Override public String getValue() { return real.getValue(); } @Override public QName2 getName() { return new QName2(real.getName().getNamespaceURI(), real.getName().getLocalPart(), real.getName() .getPrefix()); } } private static class StaxCharacters2 implements Characters2 { protected final Characters real; public StaxCharacters2(Characters real) { this.real = real; } @Override public String getData() { return real.getData(); } } }