package net.jhorstmann.i18n.tools.xml;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.LexicalHandler;
public class NestedContentHandler extends DefaultContentHandler {
static class HandlerChain {
ContentHandler handler;
HandlerChain parent;
HandlerChain(ContentHandler handler) {
this.handler = handler;
}
HandlerChain(ContentHandler handler, HandlerChain parent) {
this.handler = handler;
this.parent = parent;
}
}
private final XMLReader xmlreader;
private HandlerChain handlers;
public NestedContentHandler(NestedContentHandler parent) {
this(parent.xmlreader);
}
public NestedContentHandler(XMLReader xmlreader, ContentHandler handler) {
this.xmlreader = xmlreader;
this.handlers = new HandlerChain(handler);
}
public NestedContentHandler(XMLReader xmlreader) {
this.xmlreader = xmlreader;
}
public final XMLReader getXMLReader() {
return xmlreader;
}
public final void pushHandler(ContentHandler handler) {
handlers = new HandlerChain(handler, handlers);
xmlreader.setContentHandler(handler);
if (handler instanceof LexicalHandler) {
try {
xmlreader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
} catch (SAXNotSupportedException ex) {
} catch (SAXNotRecognizedException ex) {
}
}
}
public final void popHandler() {
if (handlers == null) {
throw new IllegalStateException("No handlers on stack");
}
handlers = handlers.parent;
xmlreader.setContentHandler(handlers.handler);
}
}