package jas.util.xml;
import jas.util.ColorConverter;
import java.awt.Color;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
/**
* Utility class for traversing XML DOM trees
*/
public abstract class XMLNodeTraverser
{
public void traverse(Node node) throws BadXMLException
{
if (node instanceof Element)
{
handleElementAttributes((Element) node);
}
for (Node n = node.getFirstChild(); n != null; n = n.getNextSibling())
{
handleSubNode(n,n.getNodeName());
}
}
protected void handleSubNode(Node node, String name) throws BadXMLException
{
int type = node.getNodeType();
switch (type)
{
case Node.ELEMENT_NODE:
handleElement((Element) node,name);
break;
case Node.TEXT_NODE:
handleTextNode((Text) node,name);
break;
default:
handleOtherNode(node,name);
}
}
protected void handleElementAttributes(Element node) throws BadXMLException
{
NamedNodeMap nnm = node.getAttributes();
for (int i=0; i<nnm.getLength(); i++)
{
Attr attr = (Attr) nnm.item(i);
handleAttributeNode(attr,attr.getName(),attr.getValue());
}
}
protected void handleElement(Element node, String name) throws BadXMLException
{
throw new BadXMLException("Unhandled Element node "+node);
}
protected void handleTextNode(Text node, String name) throws BadXMLException
{
// Just ignore unhandled text
//throw new BadXMLException("Unhandled Text node "+node);
}
protected void handleAttributeNode(Attr node, String name, String value) throws BadXMLException
{
throw new BadXMLException("Unhandled Attribute node "+node);
}
protected void handleOtherNode(Node node, String name) throws BadXMLException
{
throw new BadXMLException("Unhandled Other node "+node+" type="+node.getNodeType());
}
public int toInt(String value) throws BadXMLException
{
try
{
return Integer.parseInt(value);
}
catch (Throwable x)
{
throw new BadXMLException("Bad integer value "+value);
}
}
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);
}
public double toDouble(String value) throws BadXMLException
{
try
{
if( value.equals("NaN")) return Double.NaN;
else return new Double(value).doubleValue();
}
catch (Throwable x)
{
throw new BadXMLException("Bad double value "+value);
}
}
public Color toColor(String value) throws BadXMLException
{
try
{
return ColorConverter.stringToHTMLColor(value);
}
catch (ColorConverter.ColorConversionException x)
{
throw new BadXMLException(x.getMessage());
}
}
/**
* Exception to throw for any kind of XML problem
*/
public static class BadXMLException extends Exception
{
public BadXMLException() { super(); }
public BadXMLException(String s) { super(s); }
}
}