| package aQute.libg.sax.filters; |
| |
| import org.xml.sax.Attributes; |
| import org.xml.sax.SAXException; |
| |
| import aQute.libg.sax.ContentFilterImpl; |
| |
| public abstract class ElementSelectionFilter extends ContentFilterImpl{ |
| |
| int depth = 0; |
| int hiddenDepth = -1; |
| |
| protected abstract boolean select(int depth, String uri, String localName, String qName, Attributes attribs); |
| |
| @Override |
| public final void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { |
| if (hiddenDepth < 0) { |
| boolean allow = select(depth, uri, localName, qName, atts); |
| if (allow) |
| super.startElement(uri, localName, qName, atts); |
| else |
| hiddenDepth = 0; |
| } else { |
| hiddenDepth ++; |
| } |
| depth++; |
| } |
| |
| @Override |
| public final void endElement(String uri, String localName, String qName) throws SAXException { |
| if (hiddenDepth < 0) { |
| super.endElement(uri, localName, qName); |
| } else { |
| hiddenDepth --; |
| } |
| depth --; |
| } |
| |
| @Override |
| public void characters(char[] ch, int start, int length) throws SAXException { |
| if (hiddenDepth < 0) super.characters(ch, start, length); |
| } |
| |
| @Override |
| public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { |
| if (hiddenDepth < 0) super.ignorableWhitespace(ch, start, length); |
| } |
| |
| } |