Added XPath utilities and updated the javadocs.
[utils] / support / general / src / main / java / org / wamblee / xml / XPathExpression.java
diff --git a/support/general/src/main/java/org/wamblee/xml/XPathExpression.java b/support/general/src/main/java/org/wamblee/xml/XPathExpression.java
new file mode 100644 (file)
index 0000000..fa1e4ed
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2005-2011 the original author or authors.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.wamblee.xml;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * XPath expression. 
+ * 
+ * @author Erik Brakkee
+ */
+public class XPathExpression {
+    private String expressionString;
+    private javax.xml.xpath.XPathExpression expression;
+
+    /**
+     * Constructs the expression. Users typically use {@link XPathContext#createExpression(String)} instead
+     * of this constructor.
+     * 
+     * @param aXpath Xpath interface.
+     * @param aExpression Expression.
+     * @throws XMLException In case of problems. 
+     */
+    public XPathExpression(XPath aXpath, String aExpression)
+        throws XMLException {
+        expressionString = aExpression;
+        try {
+            expression = aXpath.compile(aExpression);
+        } catch (XPathExpressionException e) {
+            throw new XMLException("Could not compile xpath expression '" +
+                aExpression + "'", e);
+        }
+    }
+
+    /**
+     * Evaluates the xpath expression to a string. 
+     * @param aDocument Document
+     * @return Value.
+     * @throws XMLException In case of problems. 
+     */
+    public String stringEval(XMLDocument aDocument) throws XMLException {
+        return (String)evaluateImpl(aDocument, XPathConstants.STRING);
+    }
+    
+    /**
+     * Evaluates the xpath expression to a boolean. 
+     * @param aDocument Document
+     * @return Value.
+     * @throws XMLException In case of problems. 
+     */
+    public boolean booleanEval(XMLDocument aDocument) throws XMLException {
+        return (Boolean)evaluateImpl(aDocument, XPathConstants.BOOLEAN);
+    }
+    
+    /**
+     * Evaluates the xpath expression to a node list. 
+     * @param aDocument Document
+     * @return Value.
+     * @throws XMLException In case of problems. 
+     */
+    public NodeList nodelistEval(XMLDocument aDocument) throws XMLException {
+        return (NodeList)evaluateImpl(aDocument, XPathConstants.NODESET);
+    }
+    
+    /**
+     * Evaluates the xpath expression to a Node. 
+     * @param aDocument Document
+     * @return Value.
+     * @throws XMLException In case of problems. 
+     */
+    public Node nodeEval(XMLDocument aDocument) throws XMLException {
+        return (Node)evaluateImpl(aDocument, XPathConstants.NODE);
+    }
+    
+    /**
+     * Evaluates the xpath expression to a number. 
+     * @param aDocument Document
+     * @return Value.
+     * @throws XMLException In case of problems. 
+     */
+    public Double numberEval(XMLDocument aDocument) throws XMLException {
+        return (Double)evaluateImpl(aDocument, XPathConstants.NUMBER);
+    }
+    
+    /**
+     * @return Low-level xpath expression object.
+     */
+    public javax.xml.xpath.XPathExpression getExpression() {
+        return expression;
+    }
+    
+    /**
+     * @return XPath expression. 
+     */
+    public String getExpressionString() {
+        return expressionString;
+    }
+    
+
+    private Object evaluateImpl(XMLDocument aDocument, QName aResultType) throws XMLException {
+        try {
+            return expression.evaluate(aDocument.getDocument(),
+                aResultType);
+        } catch (XPathExpressionException e) {
+            throw new XMLException("Problem evaluating expression '" +
+                expressionString + "' on document '" + aDocument.print(true) +
+                "'", e);
+        }
+    }
+    
+}