DomXPathResult.java [plain text]
package gnu.xml.dom;
import java.util.Collection;
import java.util.Iterator;
import org.w3c.dom.Node;
import org.w3c.dom.xpath.XPathException;
import org.w3c.dom.xpath.XPathResult;
class DomXPathResult
implements XPathResult
{
final Object value;
final short type;
Iterator iterator;
DomXPathResult (Object value, short requestedType)
{
this.value = value;
if (value instanceof Boolean)
{
type = XPathResult.BOOLEAN_TYPE;
}
else if (value instanceof Double)
{
type = XPathResult.NUMBER_TYPE;
}
else if (value instanceof String)
{
type = XPathResult.STRING_TYPE;
}
else if (value instanceof Collection)
{
Collection ns = (Collection) value;
switch (requestedType)
{
case XPathResult.ANY_TYPE:
case XPathResult.ANY_UNORDERED_NODE_TYPE:
type = (ns.size () == 1) ? XPathResult.FIRST_ORDERED_NODE_TYPE :
XPathResult.ORDERED_NODE_ITERATOR_TYPE;
break;
default:
type = requestedType;
}
iterator = ns.iterator ();
}
else
{
throw new IllegalArgumentException ();
}
}
public boolean getBooleanValue()
{
if (type == XPathResult.BOOLEAN_TYPE)
{
return ((Boolean) value).booleanValue ();
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public boolean getInvalidIteratorState()
{
return iterator == null;
}
public double getNumberValue()
{
if (type == XPathResult.NUMBER_TYPE)
{
return ((Double) value).doubleValue ();
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public short getResultType()
{
return type;
}
public Node getSingleNodeValue()
{
switch (type)
{
case XPathResult.FIRST_ORDERED_NODE_TYPE:
case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
Collection ns = (Collection) value;
if (ns.isEmpty ())
{
return null;
}
else
{
return (Node) ns.iterator ().next ();
}
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public int getSnapshotLength()
{
switch (type)
{
case XPathResult.FIRST_ORDERED_NODE_TYPE:
case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
return ((Collection) value).size ();
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public String getStringValue()
{
if (type == XPathResult.STRING_TYPE)
{
return (String) value;
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public Node iterateNext()
{
if (iterator != null)
{
if (iterator.hasNext ())
{
return (Node) iterator.next ();
}
else
{
iterator = null;
return null;
}
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public Node snapshotItem(int index)
{
switch (type)
{
case XPathResult.FIRST_ORDERED_NODE_TYPE:
case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
Collection ns = (Collection) value;
Node[] nodes = new Node[ns.size ()];
ns.toArray (nodes);
return nodes[index];
}
throw new XPathException (XPathException.TYPE_ERR, value.toString ());
}
public String toString ()
{
return getClass ().getName () + "[type=" + typeName (type) + ",value=" +
value + ']';
}
private String typeName (short type)
{
switch (type)
{
case XPathResult.BOOLEAN_TYPE:
return "BOOLEAN_TYPE";
case XPathResult.NUMBER_TYPE:
return "NUMBER_TYPE";
case XPathResult.STRING_TYPE:
return "STRING_TYPE";
case XPathResult.FIRST_ORDERED_NODE_TYPE:
return "FIRST_ORDERED_NODE_TYPE";
case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
return "ORDERED_NODE_ITERATOR_TYPE";
case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
return "ORDERED_NODE_SNAPSHOT_TYPE";
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
return "UNORDERED_NODE_ITERATOR_TYPE";
case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
return "UNORDERED_NODE_SNAPSHOT_TYPE";
default:
return "(unknown)";
}
}
}