diff --git a/CPS/pom.xml b/CPS/pom.xml
index 45c625e4f82e45929e6f1bf0052d800d86239a25..4d2db947332f026e593ac1ae5564471a9a49095d 100644
--- a/CPS/pom.xml
+++ b/CPS/pom.xml
@@ -2,7 +2,7 @@
4.0.0
lu.list.itis.dkd.tui
tulip-cps
- 1.4.0
+ 1.5.0
TULIP Complex Problem Solving
@@ -47,7 +47,7 @@
lu.list.itis.dkd.tui
tulip
- 2.4.0
+ 2.5.0
maven2.dk.ange
@@ -67,12 +67,12 @@
org.apache.logging.log4j
log4j-api
- 2.8
+ 2.8.1
org.apache.logging.log4j
log4j-core
- 2.8
+ 2.8.1
org.apache.logging.log4j
diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java
index 0e05c314cfad65f4a9b0b36f4b447179301e499f..c81ff6bba000ba14c03c0d58421b4d4c987c1939 100644
--- a/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java
+++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java
@@ -211,6 +211,8 @@ public class EquationSystemBuilder {
variable = (Variable) Class.forName(variableClass)
.getConstructor(String.class, String.class)
.newInstance(name, value);
+ if (!Strings.isNullOrEmpty(value))
+ variable.setValue(variable.valueFromString(value));
break;
case Externalization.SPATIAL_TYPE:
@@ -230,6 +232,8 @@ public class EquationSystemBuilder {
variable = (Variable) Class.forName(variableClass)
.getConstructor(String.class, String.class)
.newInstance(name, unit);
+ if (!Strings.isNullOrEmpty(value))
+ variable.setValue(variable.valueFromString(value));
break;
}
diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java
index 1a2aae5e84ac06b6d8212fb5938ff2d79748a39d..12beccacfe6d7dc90255dfbc5dca073aa201f9fa 100644
--- a/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java
+++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java
@@ -22,13 +22,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.PropertyVetoException;
-import java.sql.Array;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
+import java.sql.Time;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -59,11 +61,24 @@ public class SqlExecutor extends Executor {
private static final String SQL_USER_NAME = "sql.user.name"; //$NON-NLS-1$
private static final String SQL_USER_PASSWORD = "sql.user.password"; //$NON-NLS-1$
- private static final Pattern SQL_VAR_PATTERN = Pattern.compile("\\$\\{([a-z0-9\\-_]+)\\}", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
+ private static final Pattern SQL_VAR_PATTERN = Pattern.compile("([\\$@])\\{([a-z0-9\\-_]+)\\}", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
private static Logger LOGGER = LoggerFactory.getLogger(SqlExecutor.class.getSimpleName());
private static final int MAX_CONNECTION_ATTEMPTS = 3;
+ private static HashMap, String> JavaToJdbcMapping = new HashMap<>();
+ static {
+ JavaToJdbcMapping.put(String.class, "varchar"); //$NON-NLS-1$
+ JavaToJdbcMapping.put(Integer.class, "integer"); //$NON-NLS-1$
+ JavaToJdbcMapping.put(Double.class, "double"); //$NON-NLS-1$
+ JavaToJdbcMapping.put(Float.class, "real"); //$NON-NLS-1$
+ JavaToJdbcMapping.put(Date.class, "timestamp"); //$NON-NLS-1$
+ JavaToJdbcMapping.put(Time.class, "time"); //$NON-NLS-1$
+ }
+
+ private static final String SCALAR = "$"; //$NON-NLS-1$
+ private static final String VECTOR = "@"; //$NON-NLS-1$
+
// ***************************************************************************
// * Constructor(s) *
// ***************************************************************************
@@ -160,11 +175,13 @@ public class SqlExecutor extends Executor {
*/
// ---------------------------------------------------------------------------
- private String interpolate(String query, List placeholders, boolean positionalParameters) {
+ private String interpolate(String query, List placeholders, Map parameters, boolean positionalParameters) {
Matcher interpolator;
+ String type;
String variable;
int position = 0;
StringBuffer interpolated;
+ int index = 1;
placeholders.clear();
interpolator = SQL_VAR_PATTERN.matcher(query);
@@ -173,13 +190,42 @@ public class SqlExecutor extends Executor {
while (interpolator.find()) {
interpolated.append(query.substring(position, interpolator.start()));
position = interpolator.start();
- variable = interpolator.group(1);
+ type = interpolator.group(1);
+ variable = interpolator.group(2);
if ((variable != null) && (variable.length() > 0)) {
placeholders.add(variable);
- interpolated.append("?"); //$NON-NLS-1$
- if (positionalParameters)
- interpolated.append(placeholders.size());
+
+ if (SCALAR.equals(type)) {
+ interpolated.append("?"); //$NON-NLS-1$
+ if (positionalParameters)
+ interpolated.append(index++);
+ }
+ if (VECTOR.equals(type)) {
+ Object value = parameters.get(variable);
+ if (value instanceof Collection) {
+ Collection> collection = (Collection>) value;
+ String separator = "";
+ if (collection.size() > 0) {
+ for (int count = 0; count < collection.size(); count++) {
+ interpolated.append(separator);
+ interpolated.append("?");
+ if (positionalParameters)
+ interpolated.append(index++);
+ separator = ",";
+ }
+ } else {
+ interpolated.append("?"); //$NON-NLS-1$
+ if (positionalParameters)
+ interpolated.append(index++);
+ }
+ } else {
+ interpolated.append("?"); //$NON-NLS-1$
+ if (positionalParameters)
+ interpolated.append(index++);
+ }
+
+ }
} else {
interpolated.append(interpolated.substring(interpolator.start(), interpolator.end()));
}
@@ -197,14 +243,22 @@ public class SqlExecutor extends Executor {
for (String placeholder : placeholders) {
if (context.containsKey(placeholder)) {
Object value = context.get(placeholder);
- if (value instanceof Array)
- statement.setArray(index, (Array) value);
- else
- statement.setObject(index, value);
+ if (value instanceof Collection) {
+ Collection> collection = (Collection>) value;
+ if (collection.size() > 0) {
+ for (Object item : collection) {
+ statement.setObject(index++, item);
+ }
+ } else {
+ statement.setObject(index++, null);
+ }
+ } else {
+ statement.setObject(index++, value);
+ }
} else {
LOGGER.warn("Query requires the parameter {} which is not available in context!", placeholder); //$NON-NLS-1$
}
- index++;
+
}
return statement;
}
@@ -304,7 +358,7 @@ public class SqlExecutor extends Executor {
long elapsed = System.currentTimeMillis();
Connection connection = this.getConnectionFromPool();
List variables = new ArrayList();
- String queryString = this.interpolate(script, variables, false);
+ String queryString = this.interpolate(script, variables, this.parameters, false);
boolean success = false;
if (connection != null) {
diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/variable/VectorVariable.java b/CPS/src/lu/list/itis/dkd/tui/cps/variable/VectorVariable.java
index 1590da3b6b22d6744d7108bac1fb2d0603e9635c..b251967f13960be30c066bffa8290facbc82c5f9 100644
--- a/CPS/src/lu/list/itis/dkd/tui/cps/variable/VectorVariable.java
+++ b/CPS/src/lu/list/itis/dkd/tui/cps/variable/VectorVariable.java
@@ -21,6 +21,7 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
+import java.util.regex.Pattern;
/**
* @author mack
@@ -28,13 +29,40 @@ import java.util.Vector;
* @version [major].[minor].[micro]
* @param
*/
+// ***************************************************************************
+// * Class Definition and Members *
+// ***************************************************************************
+
public class VectorVariable extends Variable> implements Collection {
+ private static final Pattern VECTOR_PATTERN = Pattern.compile("\\[\\s*(.*?)\\s*\\]", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
+ private static final Pattern VECTOR_SPLITTER_PATTERN = Pattern.compile("([+-]?[a-z0-9\\._]+)(\\s*,[+-]?[a-z0-9\\._]+)*", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
+
+
+ // ---------------------------------------------------------------------------
+ // ***************************************************************************
+ // * Constructor(s) *
+ // ***************************************************************************
+ // ---------------------------------------------------------------------------
+
public VectorVariable(String name, String unit) {
super(Externalization.VECTOR_TYPE, name, unit);
value = new ArrayList();
}
+ // ---------------------------------------------------------------------------
+ // ***************************************************************************
+ // * Primitives *
+ // ***************************************************************************
+ // ---------------------------------------------------------------------------
+
+
+ // ---------------------------------------------------------------------------
+ // ***************************************************************************
+ // * Class Body *
+ // ***************************************************************************
+ // ---------------------------------------------------------------------------
+
public Class> getClassOfValues() {
if (!value.isEmpty()) {
return value.get(0).getClass();
@@ -160,8 +188,23 @@ public class VectorVariable extends Variable> implements Collection valueFromString(String stringValue) {
- // TODO Auto-generated method stub
- return null;
+ if (stringValue == null)
+ return null;
+
+ List values = new ArrayList<>();
+
+ // First check whether string complies with array string representation.
+ // Matcher arrayMatcher = VECTOR_PATTERN.matcher(stringValue);
+ // if (arrayMatcher.matches()) {
+ // Matcher arraySplitter = VECTOR_SPLITTER_PATTERN.matcher(arrayMatcher.group(1));
+ // if (arraySplitter.matches()) {
+ // for (int i = 0; i < arraySplitter.groupCount(); i++) {
+ // values.add((B) arraySplitter.group(i));
+ // }
+ // }
+ // }
+
+ return values;
}
/** {@inheritDoc} */
diff --git a/CPS/test/lu/list/itis/dkd/tui/cps/variable/VectorVariableTest.java b/CPS/test/lu/list/itis/dkd/tui/cps/variable/VectorVariableTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e44d460026dcfebc05116817ac91d4d78c2cf1ec
--- /dev/null
+++ b/CPS/test/lu/list/itis/dkd/tui/cps/variable/VectorVariableTest.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright Luxembourg Institute of Science and Technology, 2017. All rights reserved. If you wish
+ * to use this code for any purpose, please contact the author(s).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package lu.list.itis.dkd.tui.cps.variable;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * @author mack
+ * @since [major].[minor]
+ * @version [major].[minor].[micro]
+ */
+public class VectorVariableTest {
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {}
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDown() throws Exception {}
+
+ @Test
+ public void test() {
+ VectorVariable variable = new VectorVariable<>("test", "n/a");
+ List fromString = variable.valueFromString("[ 1, 2, 3.5, -0.443503]");
+ assertEquals(4, fromString.size());
+ assertEquals(1d, fromString.get(0).doubleValue(), 0.0001);
+ assertEquals(2d, fromString.get(1).doubleValue(), 0.0001);
+ assertEquals(3.5d, fromString.get(2).doubleValue(), 0.0001);
+ assertEquals(-0.443503d, fromString.get(3).doubleValue(), 0.0001);
+ }
+
+}