2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.io
.markup
;
11 import java
.util
.ArrayList
;
12 import java
.util
.List
;
14 import javax
.xml
.stream
.XMLEventReader
;
15 import javax
.xml
.stream
.XMLStreamException
;
16 import javax
.xml
.stream
.events
.StartElement
;
17 import javax
.xml
.stream
.events
.XMLEvent
;
19 import org
.apache
.log4j
.Logger
;
25 public class LookAheadEventReader
implements XMLEventReader
{
26 private static final Logger logger
= Logger
.getLogger(LookAheadEventReader
.class);
28 private XMLEventReader reader
;
30 private List
<XMLEvent
> cachedEvents
= new ArrayList
<>();
32 private List
<XMLEvent
> usedEvents
= new ArrayList
<>();
34 public LookAheadEventReader(StartElement startElement
, XMLEventReader parentReader
) throws XMLStreamException
{
36 this.reader
= parentReader
;
37 XMLEvent next
= parentReader
.nextEvent();
38 while (! next
.isEndElement() ||
39 ! next
.asEndElement().getName().equals(startElement
.getName()) ||
41 cachedEvents
.add(next
);
42 if (next
.isStartElement() && next
.asStartElement().getName().equals(startElement
.getName())){
44 }else if (next
.isEndElement() && next
.asEndElement().getName().equals(startElement
.getName())){
47 next
= reader
.nextEvent();
49 cachedEvents
.add(next
);
53 public Object
next() {
54 throw new RuntimeException("Iterator methods are not supported by this EventReader");
59 public void remove() {
60 throw new RuntimeException("Iterator methods are not supported by this EventReader");
65 public XMLEvent
nextEvent() throws XMLStreamException
{
66 if (! cachedEvents
.isEmpty()){
67 XMLEvent result
= cachedEvents
.get(0);
68 XMLEvent removedEvent
= cachedEvents
.remove(0);
69 usedEvents
.add(removedEvent
);
72 logger
.warn("LookAheadReader reads uncached data. This is not ");
73 throw new IllegalStateException("LookAheadReader reads uncached data. This is not ");
74 // return reader.nextEvent();
80 public boolean hasNext() {
81 return reader
.hasNext();
86 public XMLEvent
peek() throws XMLStreamException
{
91 public String
getElementText() throws XMLStreamException
{
92 return reader
.getElementText();
96 public XMLEvent
nextTag() throws XMLStreamException
{
97 return reader
.nextTag();
101 public Object
getProperty(String name
) throws IllegalArgumentException
{
102 return reader
.getProperty(name
);
106 public void close() throws XMLStreamException
{
110 public boolean previousWasEnd(String name
){
111 return hasStartElement(name
, -1, 0);
114 public boolean nextIsStart(String name
){
115 return hasStartElement(name
, 0, 1);
119 public boolean hasStartElement(String name
, int start
, int end
){
123 if (end
> cachedEvents
.size()){
124 end
= cachedEvents
.size();
126 for (int i
= start
; i
< end
; i
++){
128 XMLEvent ev
= cachedEvents
.get(i
);
129 if (ev
.isStartElement() && ev
.asStartElement().getName().getLocalPart().equals(name
)){
136 public boolean hasEndElement(String name
, int start
, int end
){
140 if (-start
> usedEvents
.size()){
141 start
= -cachedEvents
.size();
143 for (int i
= start
; i
< end
; i
++){
145 XMLEvent ev
= cachedEvents
.get( cachedEvents
.size() + i
);
146 if (ev
.isEndElement() && ev
.asEndElement().getName().getLocalPart().equals(name
)){
153 public List
<XMLEvent
> getCachedEvents(boolean onlyCharData
){
154 List
<XMLEvent
> result
= new ArrayList
<>();
155 for (XMLEvent event
: cachedEvents
){
156 if (!onlyCharData
|| event
.isCharacters()){