001package arcommon.xml;
002
003import java.util.Stack;
004
005import org.xml.sax.Attributes;
006import org.xml.sax.SAXException;
007import org.xml.sax.helpers.DefaultHandler;
008
009public abstract class AbstractSaxParser extends DefaultHandler {
010    private String currentTag;
011    private Stack<String> tagStack = new Stack<String>();
012    private StringBuilder currentTagContent;
013    private Stack<StringBuilder> contentStack = new Stack<StringBuilder>();
014    private int currentChildIndex;
015    private Stack<Integer> childIndexStack = new Stack<Integer>();
016
017    @Override
018    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
019        if (currentTag != null) {
020            tagStack.push(currentTag);
021            contentStack.push(currentTagContent);
022            currentChildIndex++;
023            childIndexStack.push(currentChildIndex);
024        }
025        
026        startElement(qName, attributes, currentChildIndex);
027        
028        currentTag = qName;
029        currentTagContent = new StringBuilder();
030        currentChildIndex = -1;
031    }
032    
033    public abstract void startElement(String qName, Attributes attributes, int childIndex);
034    
035    public int getTagLevel() {
036        return tagStack.size();
037    }
038
039    @Override
040    public void endElement(String uri, String localName, String qName) throws SAXException {
041        endElement(currentTag, currentTagContent.toString(), currentChildIndex + 1);
042        if (tagStack.size() > 0) {
043            currentTag = tagStack.pop();
044            currentTagContent = contentStack.pop();
045            currentChildIndex = childIndexStack.pop();
046        }
047    }
048    
049    public abstract void endElement(String qName, String content, int childTags);
050
051    @Override
052    public void endDocument() throws SAXException {
053        super.endDocument();
054        endOfDocumentReached();
055    }
056    
057    public abstract void endOfDocumentReached();
058    
059    @Override
060    public void characters(char[] ch, int start, int length) throws SAXException {
061        currentTagContent.append(ch, start, length);
062    }
063    
064    @Override
065    public String toString() {
066        return "Current tag: \"" + currentTag + "\" value: \"" + currentTagContent.toString() + "\" " + tagStack;
067    }
068}