/* * SAXTraverser.java * * Created on February 9, 2001, 3:02 PM */ package org.freehep.xml.util; import org.xml.sax.*; 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 8584 2006-08-10 23:06:37Z duns $ */ 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); } 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++; } 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; }