/*
* SAXTraverser.java
*
* Created on February 9, 2001, 3:02 PM
*/
package org.freehep.xml.util;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
/**
* A utility for working with SAX parsers. A heirarchy of SAXTraversers can be
* used to maintain state while parsing an XML file.
*
* @author tonyj
* @version $Id: SAXTraverser.java,v 1.4 2009-06-22 02:18:23 hohenwarter Exp $
*/
public class SAXTraverser extends DefaultHandler {
/**
* Attach an XMLReader to this traverser. Registers this SAXTraverser as the
* content handler for the reader.
*/
public void setReader(XMLReader reader) {
this.parser = reader;
reader.setContentHandler(this);
}
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes attrs) throws SAXException {
qName = qName.intern();
SAXTraverser newHandler = handleElement(qName, attrs);
if (newHandler != this) {
newHandler.handleElementAttributes(attrs);
newHandler.previous = this;
newHandler.parser = parser;
parser.setContentHandler(newHandler);
} else {
stack++;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (stack == 0) {
handleEndElement(localName);
previous.handleSubElement(this);
parser.setContentHandler(previous);
} else {
stack--;
}
}
/**
* Override to handle node attributes
*/
protected void handleElementAttributes(Attributes atts)
throws SAXException {
}
/**
* Override this to handle the end of an element
*/
protected void handleEndElement(String name) throws SAXException {
}
/**
* Override this to be notified of sub nodes of the current node
*/
protected void handleSubElement(SAXTraverser sub) throws SAXException {
}
/**
* Override this to handle the start of new sub elements Return the
* SAXTraverser to be used for the sub node, or <code>this</code> to
* continue using the current traverser.
*
* @return The SAXTraverser to be used as the content handler for the sub
* node
*/
protected SAXTraverser handleElement(String name, Attributes attrs)
throws SAXException {
throw new BadXMLException("Unhandled element " + name);
}
/**
* Utility routine to convert a String to a boolean
*/
public boolean toBoolean(String value) throws BadXMLException {
if (value.equalsIgnoreCase("true")) {
return true;
} else if (value.equalsIgnoreCase("false")) {
return false;
} else {
throw new BadXMLException("Bad boolean value " + value);
}
}
/**
* Utility routine to convert a String to a double
*/
public double toDouble(String value) throws SAXException {
try {
return new Double(value).doubleValue();
} catch (Throwable x) {
throw new BadXMLException("Bad double value " + value);
}
}
/**
* Utility routine to convert a String to a float
*/
public float toFloat(String value) throws SAXException {
try {
return Float.parseFloat(value);
} catch (Throwable x) {
throw new BadXMLException("Bad float value " + value);
}
}
/**
* Utility routine to convert a String to an int
*/
public int toInt(String value) throws SAXException {
try {
return Integer.parseInt(value);
} catch (Throwable x) {
throw new BadXMLException("Bad integer value " + value);
}
}
/**
* Utility routine to convert a String to a short
*/
public short toShort(String value) throws SAXException {
try {
return Short.parseShort(value);
} catch (Throwable x) {
throw new BadXMLException("Bad short value " + value);
}
}
/**
* Utility routine to convert a String to a long
*/
public long toLong(String value) throws SAXException {
try {
return Long.parseLong(value);
} catch (Throwable x) {
throw new BadXMLException("Bad long value " + value);
}
}
/**
* Utility routine to convert a String to a byte
*/
public byte toByte(String value) throws SAXException {
try {
return Byte.parseByte(value);
} catch (Throwable x) {
throw new BadXMLException("Bad byte value " + value);
}
}
private SAXTraverser previous;
private XMLReader parser;
private int stack = 0;
}