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); + } + +}