# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1409848414 -7200
# Node ID 4ba54a632eb85094e97fbbceb9a3303de4644afb
# Parent  75556166817a1a52151548b2d51fa06e9ef28cc3
out-xpath: support parameter types: [STRING, BOOLEAN, INTEGER, LONG, DOUBLE]

diff -r 75556166817a -r 4ba54a632eb8 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 18:16:33 2014 +0200
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java	Thu Sep 04 18:33:34 2014 +0200
@@ -21,6 +21,7 @@
 import cz.frantovo.alt2xml.out.ActionContext;
 import cz.frantovo.alt2xml.out.OutputActionException;
 import java.io.PrintWriter;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -59,7 +60,7 @@
 
 			for (int i = 1; i < actionData.size(); i++) {
 				String parameterName = actionData.get(i++);
-				String parameterType = typedParameters ? actionData.get(i++) : "string";
+				String parameterType = typedParameters ? actionData.get(i++) : PARAMETER_TYPE.STRING.name();
 				Object parameterValue = parseParameterValue(parameterType, actionData.get(i));
 				xpathParameters.put(parameterName, parameterValue);
 			}
@@ -76,9 +77,61 @@
 		}
 	}
 
-	private static Object parseParameterValue(String type, String value) {
-		// TODO: support more types
-		return value;
+	private enum PARAMETER_TYPE {
+
+		// TODO: wait for Java 8 widespread and rewrite with lambdas :-)
+		STRING {
+					@Override
+					public Object parse(String value) {
+						return value;
+					}
+				},
+		BOOLEAN {
+					@Override
+					public Object parse(String value) {
+						return Boolean.valueOf(value);
+					}
+				},
+		INTEGER {
+					@Override
+					public Object parse(String value) {
+						return Integer.parseInt(value);
+					}
+				},
+		LONG {
+					@Override
+					public Object parse(String value) {
+						return Long.parseLong(value);
+					}
+				},
+		DOUBLE {
+					@Override
+					public Object parse(String value) {
+						return Double.parseDouble(value);
+					}
+				};
+
+		public abstract Object parse(String value);
+
+	}
+
+	private static Object parseParameterValue(String type, String value) throws OutputActionException {
+
+		try {
+			PARAMETER_TYPE parameterType = PARAMETER_TYPE.valueOf(type.toUpperCase());
+
+			try {
+				return parameterType.parse(value);
+			} catch (IllegalArgumentException e) {
+				throw new OutputActionException("Unable to parse value: „" + value + "“ as " + parameterType.name());
+			}
+		} catch (IllegalArgumentException e) {
+			throw new OutputActionException(
+					"Invalid XPath parameter type: „" + type
+					+ "“. Possible values are: " + Arrays.toString(PARAMETER_TYPE.values())
+					+ " and are case insensitive.",
+					e);
+		}
 	}
 
 	@Override