# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# 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<String,Object> data;
 
-	public PropertiesVariableResolver(Properties data) {
+	public PropertiesVariableResolver(Map<String,Object> 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<String> 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<String, Object> 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 {