# HG changeset patch # User František Kučera # Date 1409846203 -7200 # Node ID f9c73ee492877d9e0e778262af4bf4b6684a35fa # Parent b814f45b6beb6695238ca983273ba9ba7fb0bac7 out-xpath: XPath parameters are following „--“ and the expression; can be typed (which is specified by an action property) diff -r b814f45b6beb -r f9c73ee49287 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/PropertiesVariableResolver.java --- a/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/PropertiesVariableResolver.java Thu Sep 04 16:56:47 2014 +0200 +++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/PropertiesVariableResolver.java Thu Sep 04 17:56:43 2014 +0200 @@ -17,7 +17,7 @@ */ package cz.frantovo.alt2xml.out.xpath; -import java.util.Properties; +import java.util.Map; import javax.xml.namespace.QName; import javax.xml.xpath.XPathVariableResolver; @@ -27,15 +27,15 @@ */ public class PropertiesVariableResolver implements XPathVariableResolver { - private Properties data; + private Map data; - public PropertiesVariableResolver(Properties data) { + public PropertiesVariableResolver(Map data) { this.data = data; } @Override public Object resolveVariable(QName variableName) { - return data.getProperty(variableName.getLocalPart()); + return data.get(variableName.getLocalPart()); } } diff -r b814f45b6beb -r f9c73ee49287 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java --- a/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java Thu Sep 04 16:56:47 2014 +0200 +++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java Thu Sep 04 17:56:43 2014 +0200 @@ -21,6 +21,9 @@ import cz.frantovo.alt2xml.out.ActionContext; import cz.frantovo.alt2xml.out.OutputActionException; import java.io.PrintWriter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.xml.transform.dom.DOMResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; @@ -33,6 +36,7 @@ */ public class XPathAction extends AbstractDOMAction { + public static final String PARAMETER_TYPED_PARAMETERS = "typed-parameters"; private final XPathFactory xpathFactory; private final XPath xpath; private final String expressionString; @@ -43,22 +47,40 @@ xpathFactory = XPathFactory.newInstance(); xpath = xpathFactory.newXPath(); - if (!actionContext.getActionProperties().isEmpty()) { - xpath.setXPathVariableResolver(new PropertiesVariableResolver(actionContext.getActionProperties())); - } + final List actionData = getActionContext().getActionData(); - if (getActionContext().getActionData().size() == 1) { - expressionString = getActionContext().getActionData().get(0); + if (actionData.size() < 1) { + throw new OutputActionException("Please specify the XPath expression as action data"); + } else { + + boolean typedParameters = Boolean.parseBoolean(actionContext.getActionProperties().getProperty(PARAMETER_TYPED_PARAMETERS)); + + Map xpathParameters = new HashMap<>(); + + for (int i = 1; i < actionData.size(); i++) { + String parameterName = actionData.get(i++); + String parameterType = typedParameters ? actionData.get(i++) : "string"; + Object parameterValue = parseParameterValue(parameterType, actionData.get(i++)); + xpathParameters.put(parameterName, parameterValue); + } + + xpath.setXPathVariableResolver(new PropertiesVariableResolver(xpathParameters)); + + expressionString = actionData.get(0); try { xpathExpression = xpath.compile(expressionString); } catch (XPathExpressionException e) { throw new OutputActionException("Unable to compile XPath: " + expressionString, e); } - } else { - throw new OutputActionException("Please specify the XPath expression as action data"); + } } + private static Object parseParameterValue(String type, String value) { + // TODO: support more types + return value; + } + @Override public void run(DOMResult domResult) throws OutputActionException { try {