DomXPathExpression.java [plain text]
package gnu.xml.dom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.xpath.XPathException;
import org.w3c.dom.xpath.XPathNSResolver;
import org.w3c.dom.xpath.XPathResult;
import gnu.xml.xpath.DocumentOrderComparator;
class DomXPathExpression
implements org.w3c.dom.xpath.XPathExpression
{
final DomDocument doc;
final XPathExpression expression;
final XPathNSResolver resolver;
DomXPathExpression(DomDocument doc, String expression,
XPathNSResolver resolver)
throws XPathException
{
this.doc = doc;
this.resolver = resolver;
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
if (resolver != null)
{
xpath.setNamespaceContext(new DomNSResolverContext(resolver));
}
try
{
this.expression = xpath.compile(expression);
}
catch (XPathExpressionException e)
{
throw new XPathException(XPathException.INVALID_EXPRESSION_ERR,
e.getMessage ());
}
}
public Object evaluate(Node contextNode, short type, Object result)
throws XPathException, DOMException
{
try
{
QName typeName = null;
switch (type)
{
case XPathResult.BOOLEAN_TYPE:
typeName = XPathConstants.BOOLEAN;
break;
case XPathResult.NUMBER_TYPE:
typeName = XPathConstants.NUMBER;
break;
case XPathResult.STRING_TYPE:
typeName = XPathConstants.STRING;
break;
case XPathResult.ANY_UNORDERED_NODE_TYPE:
case XPathResult.FIRST_ORDERED_NODE_TYPE:
typeName = XPathConstants.NODE;
break;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:
case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
typeName = XPathConstants.NODESET;
break;
default:
throw new XPathException(XPathException.TYPE_ERR, null);
}
Object val = expression.evaluate(contextNode, typeName);
switch (type)
{
case XPathResult.ORDERED_NODE_ITERATOR_TYPE:
case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:
List ns = new ArrayList((Collection) val);
Collections.sort(ns, new DocumentOrderComparator());
val = ns;
}
return new DomXPathResult(val, type);
}
catch (javax.xml.xpath.XPathException e)
{
throw new XPathException(XPathException.TYPE_ERR, e.getMessage());
}
}
public String toString ()
{
return getClass ().getName () + "[expression=" + expression + "]";
}
}