Project

General

Profile

Download (3.88 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy 
4
* http://www.e-taxonomy.eu
5
* 
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.
8
*/
9
package eu.etaxonomy.cdm.io.markup;
10

    
11
import java.util.ArrayList;
12
import java.util.List;
13

    
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;
18

    
19
import org.apache.log4j.Logger;
20

    
21
/**
22
 * @author a.mueller
23
 * @date 28.06.2011
24
 *
25
 */
26
public class LookAheadEventReader implements XMLEventReader {
27
	private static final Logger logger = Logger.getLogger(LookAheadEventReader.class);
28

    
29
	private XMLEventReader reader;
30
	
31
	private List<XMLEvent> cachedEvents = new ArrayList<XMLEvent>();
32
	
33
	private List<XMLEvent> usedEvents = new ArrayList<XMLEvent>();
34
	
35
	public LookAheadEventReader(StartElement startElement, XMLEventReader parentReader) throws XMLStreamException{
36
		int depth = 0;
37
		this.reader = parentReader;
38
		XMLEvent next = parentReader.nextEvent();
39
		while (! next.isEndElement() || 
40
				 ! next.asEndElement().getName().equals(startElement.getName()) ||
41
				 depth > 0){
42
			cachedEvents.add(next);
43
			if (next.isStartElement() && next.asStartElement().getName().equals(startElement.getName())){
44
				depth++;
45
			}else if (next.isEndElement() && next.asEndElement().getName().equals(startElement.getName())){
46
				depth--;
47
			}
48
			next = reader.nextEvent();
49
		}
50
		cachedEvents.add(next);
51
	}
52
	
53
	@Override
54
	public Object next() {
55
		throw new RuntimeException("Iterator methods are not supported by this EventReader");
56
	}
57

    
58

    
59
	@Override
60
	public void remove() {
61
		throw new RuntimeException("Iterator methods are not supported by this EventReader");
62
	}
63

    
64

    
65
	@Override
66
	public XMLEvent nextEvent() throws XMLStreamException {
67
		if (! cachedEvents.isEmpty()){
68
			XMLEvent result = cachedEvents.get(0);
69
			XMLEvent removedEvent = cachedEvents.remove(0);
70
			usedEvents.add(removedEvent);
71
			return result;
72
		}else{
73
			logger.warn("LookAheadReader reads uncached data. This is not ");
74
			throw new IllegalStateException("LookAheadReader reads uncached data. This is not ");
75
//			return reader.nextEvent();
76
		}
77
	}
78

    
79

    
80
	@Override
81
	public boolean hasNext() {
82
		return reader.hasNext();
83
	}
84

    
85

    
86
	@Override
87
	public XMLEvent peek() throws XMLStreamException {
88
		return reader.peek();
89
	}
90

    
91
	@Override
92
	public String getElementText() throws XMLStreamException {
93
		return reader.getElementText();
94
	}
95

    
96
	@Override
97
	public XMLEvent nextTag() throws XMLStreamException {
98
		return reader.nextTag();
99
	}
100

    
101
	@Override
102
	public Object getProperty(String name) throws IllegalArgumentException {
103
		return reader.getProperty(name);
104
	}
105

    
106
	@Override
107
	public void close() throws XMLStreamException {
108
		reader.close();
109
	}
110

    
111
	public boolean previousWasEnd(String name){
112
		return hasStartElement(name, -1, 0);
113
	}
114
	
115
	public boolean nextIsStart(String name){
116
		return hasStartElement(name, 0, 1);
117
	}
118

    
119
	
120
	public boolean hasStartElement(String name, int start, int end){
121
		if (start < 0 ){
122
			start = 0;
123
		}
124
		if (end > cachedEvents.size()){
125
			end = cachedEvents.size();
126
		}
127
		for (int i = start; i < end; i++){
128
			
129
			XMLEvent ev = cachedEvents.get(i);
130
			if (ev.isStartElement() && ev.asStartElement().getName().getLocalPart().equals(name)){
131
				return true;
132
			}
133
		}
134
		return false;
135
	}
136
	
137
	public boolean hasEndElement(String name, int start, int end){
138
		if (end > 0 ){
139
			end = 0;
140
		}
141
		if (-start > usedEvents.size()){
142
			start = -cachedEvents.size();
143
		}
144
		for (int i = start; i < end; i++){
145
			
146
			XMLEvent ev = cachedEvents.get( cachedEvents.size() + i );
147
			if (ev.isEndElement() && ev.asEndElement().getName().getLocalPart().equals(name)){
148
				return true;
149
			}
150
		}
151
		return false;
152
	}
153

    
154
}
(5-5/19)