package org.handwerkszeug.common.util; import java.io.BufferedInputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.handwerkszeug.common.exception.XMLStreamRuntimeException; public class XMLEventParser { protected Map<String, Handler> handlers = new HashMap<String, Handler>(); protected XMLStreamReader reader; public XMLEventParser() { } public XMLEventParser(InputStream in) { this(); this.reader = createStreamParser(in); } public XMLEventParser(XMLStreamReader reader) { this.reader = reader; } protected XMLStreamReader createStreamParser(InputStream in) { try { XMLInputFactory factory = XMLInputFactory.newInstance(); factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE); BufferedInputStream stream = new BufferedInputStream(in); XMLStreamReader reader = factory.createXMLStreamReader(stream); return reader; } catch (XMLStreamException e) { throw new XMLStreamRuntimeException(e); } } public void add(Handler handler) { if (handler != null) { this.handlers.put(handler.getTagName(), handler); } } public void parse() { parse(null); } public void parse(String end) { try { if (reader == null) { return; } for (; reader.hasNext();) { int event = reader.next(); if (XMLStreamConstants.START_ELEMENT == event) { String localname = reader.getLocalName(); Handler handler = handlers.get(localname); if (handler == null) { skipTo(reader, localname); } else { handler.handle(reader); } } else if (XMLStreamConstants.END_ELEMENT == event && reader.getLocalName().equals(end)) { return; } } } catch (XMLStreamException e) { throw new XMLStreamRuntimeException(e); } } protected void skipTo(XMLStreamReader reader, String end) throws XMLStreamException { for (; reader.hasNext();) { if (XMLStreamConstants.END_ELEMENT == reader.next()) { if (end.equals(reader.getLocalName())) { break; } } } } public interface Handler { String getTagName(); void handle(XMLStreamReader reader) throws XMLStreamException; } public static class DefaultHandler implements Handler { protected String tag; public DefaultHandler(String tag) { this.tag = tag; } public String getTagName() { return tag; } public void handle(XMLStreamReader reader) throws XMLStreamException { } } }