# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1410046087 -7200
# Node ID a72d55ff30c97250ccb8e87156c8323964146159
# Parent  9ca02f0f6751bbcdaa1a1c3230f49e6355958be0
out-xpath: optional variable resolver for environment variables – can be used together with those from command line

diff -r 9ca02f0f6751 -r a72d55ff30c9 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/CompoundVariableResolver.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/CompoundVariableResolver.java	Sun Sep 07 01:28:07 2014 +0200
@@ -0,0 +1,45 @@
+/**
+ * Alt2XML
+ * Copyright © 2014 František Kučera (frantovo.cz)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package cz.frantovo.alt2xml.out.xpath;
+
+import javax.xml.namespace.QName;
+import javax.xml.xpath.XPathVariableResolver;
+
+/**
+ *
+ * @author Ing. František Kučera (frantovo.cz)
+ */
+public class CompoundVariableResolver implements XPathVariableResolver {
+
+	private final XPathVariableResolver[] resolvers;
+
+	public CompoundVariableResolver(XPathVariableResolver... resolvers) {
+		this.resolvers = resolvers;
+	}
+
+	@Override
+	public Object resolveVariable(QName variableName) {
+		for (XPathVariableResolver r : resolvers) {
+			Object value = r.resolveVariable(variableName);
+			if (value != null) {
+				return value;
+			}
+		}
+		return null;
+	}
+}
diff -r 9ca02f0f6751 -r a72d55ff30c9 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/EnvironmentVariableResolver.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/EnvironmentVariableResolver.java	Sun Sep 07 01:28:07 2014 +0200
@@ -0,0 +1,33 @@
+/**
+ * Alt2XML
+ * Copyright © 2014 František Kučera (frantovo.cz)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package cz.frantovo.alt2xml.out.xpath;
+
+import javax.xml.namespace.QName;
+import javax.xml.xpath.XPathVariableResolver;
+
+/**
+ *
+ * @author Ing. František Kučera (frantovo.cz)
+ */
+public class EnvironmentVariableResolver implements XPathVariableResolver {
+
+	@Override
+	public Object resolveVariable(QName variableName) {
+		return System.getenv(variableName.getLocalPart());
+	}
+}
diff -r 9ca02f0f6751 -r a72d55ff30c9 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	Sun Sep 07 00:26:38 2014 +0200
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java	Sun Sep 07 01:28:07 2014 +0200
@@ -30,6 +30,7 @@
 import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathVariableResolver;
 
 /**
  *
@@ -39,8 +40,10 @@
 
 	public static final String PARAMETER_TYPED_PARAMETERS = "typed-parameters";
 	public static final String PARAMETER_LINE_BREAK = "line-break";
+	public static final String PARAMETER_ENVIRONMENT_VARIABLES = "environment-variables";
 	private final boolean typedParameters;
 	private final boolean lineBreak;
+	private final boolean environmentVariables;
 	private final XPathFactory xpathFactory;
 	private final XPath xpath;
 	private final String expressionString;
@@ -59,6 +62,7 @@
 
 			typedParameters = Boolean.parseBoolean(actionContext.getActionProperties().getProperty(PARAMETER_TYPED_PARAMETERS));
 			lineBreak = Boolean.parseBoolean(actionContext.getActionProperties().getProperty(PARAMETER_LINE_BREAK, Boolean.TRUE.toString()));
+			environmentVariables = Boolean.parseBoolean(actionContext.getActionProperties().getProperty(PARAMETER_ENVIRONMENT_VARIABLES, Boolean.FALSE.toString()));
 
 			Map<String, Object> xpathParameters = new HashMap<>();
 
@@ -69,7 +73,10 @@
 				xpathParameters.put(parameterName, parameterValue);
 			}
 
-			xpath.setXPathVariableResolver(new PropertiesVariableResolver(xpathParameters));
+			XPathVariableResolver cliVariableResolver = new PropertiesVariableResolver(xpathParameters);
+			XPathVariableResolver variableResolver = environmentVariables ? new CompoundVariableResolver(cliVariableResolver, new EnvironmentVariableResolver()) : cliVariableResolver;
+
+			xpath.setXPathVariableResolver(variableResolver);
 
 			expressionString = actionData.get(0);
 			try {