blob: b1476e7339e9d21edfa7980ec5b217845a694c34 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 Standards for Technology in Automotive Retail and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* David Carver (STAR) - bug 226245 - initial API and implementation
* Jesper Steen Moller - bug 343804 - Updated API information
* Jesper Steen Moller - bug 348737 - Hook up default namespace from context
*******************************************************************************/
package org.eclipse.wst.xml.xpath.core.util;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import javax.xml.xpath.XPathExpressionException;
import org.eclipse.wst.xml.xpath2.api.XPath2Expression;
import org.eclipse.wst.xml.xpath2.processor.Engine;
import org.eclipse.wst.xml.xpath2.processor.JFlexCupParser;
import org.eclipse.wst.xml.xpath2.processor.StaticError;
import org.eclipse.wst.xml.xpath2.processor.XPathParser;
import org.eclipse.wst.xml.xpath2.processor.XPathParserException;
import org.eclipse.wst.xml.xpath2.processor.util.DynamicContextBuilder;
import org.eclipse.wst.xml.xpath2.processor.util.StaticContextBuilder;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @since 1.0
*/
public class XPath20Helper {
public XPath20Helper() {
}
public static void compile(String xpathExp) throws XPathExpressionException {
try {
XPathParser xpathParser = new JFlexCupParser();
xpathParser.parse(xpathExp);
} catch (XPathParserException ex) {
throw new XPathExpressionException(ex.getMessage());
}
}
/**
* @since 1.2
*/
public static class XPath2Engine implements SimpleXPathEngine {
private NamespaceContext namespaceContext;
private StaticContextBuilder staticContextBuilder = new StaticContextBuilder() {
@Override
public NamespaceContext getNamespaceContext() {
return namespaceContext;
}
public String getDefaultNamespace() {
return namespaceContext.getNamespaceURI(XMLConstants.DEFAULT_NS_PREFIX);
};
};
private XPath2Expression xPathExpression;
public void parse(String expression) throws XPathExpressionException {
xPathExpression = null;
try {
xPathExpression = new Engine().parseExpression(expression, staticContextBuilder);
} catch (StaticError se) {
throw new XPathExpressionException(se.getMessage() + " (" + se.code() + ")");
}
}
public boolean isValid() {
return xPathExpression != null;
}
public NodeList execute(Node contextNode) {
DynamicContextBuilder dynContext = new DynamicContextBuilder(staticContextBuilder);
org.eclipse.wst.xml.xpath2.api.ResultSequence rs = xPathExpression.evaluate(dynContext, new Object[] { contextNode });
return new NodeListImpl(rs);
}
public void setNamespaceContext(NamespaceContext namespaceContext) {
this.namespaceContext = namespaceContext;
// if (namespaceContext != null) {
// namespaceContext.dc.add_namespace("xs", "http://www.w3.org/2001/XMLSchema");
}
}
}