Commit b8827db6 authored by Nico Mack's avatar Nico Mack

Bug Fixes in Coronas.

Added support for MapVariables to SQLExecutor.
Added new Declaration class to allow access to fields of maps and
indices of vectors in variable declarations in equation system
Added invoking flag allowing to disable equation trigger by individual
parameters.
parent 05a76f9a
...@@ -2,6 +2,7 @@ ABOVE_ELEMENT=above ...@@ -2,6 +2,7 @@ ABOVE_ELEMENT=above
BELOW_ELEMENT=below BELOW_ELEMENT=below
BLINK_ON_OUT_OF_RANGE_NODE=blinkOnOutOfRange BLINK_ON_OUT_OF_RANGE_NODE=blinkOnOutOfRange
CAPPED_DISPLAY_NODE=cappedDisplay CAPPED_DISPLAY_NODE=cappedDisplay
FACE_IS_TOUCHABLE_NODE=faceIsTouchable
ITEMS_VARIABLE_NODE=itemsVariable ITEMS_VARIABLE_NODE=itemsVariable
HTML_TEMPLATE_NODE=htmlTemplate HTML_TEMPLATE_NODE=htmlTemplate
LABEL_NODE=label LABEL_NODE=label
......
...@@ -18,6 +18,7 @@ INDEX_ATTRIBUTE=index ...@@ -18,6 +18,7 @@ INDEX_ATTRIBUTE=index
FORMAT_ATTRIBUTE=format FORMAT_ATTRIBUTE=format
FIELD_ATTRIBUTE=field FIELD_ATTRIBUTE=field
INVOKE_ELEMENT=invoke INVOKE_ELEMENT=invoke
INVOKING_ATTRIBUTE=invoking
EPSILON_ATTRIBUTE=epsilon EPSILON_ATTRIBUTE=epsilon
EXECUTOR_ATTRIBUTE=executor EXECUTOR_ATTRIBUTE=executor
NAME_ATTRIBUTE=name NAME_ATTRIBUTE=name
......
...@@ -37,6 +37,7 @@ public class Declaration implements Cloneable { ...@@ -37,6 +37,7 @@ public class Declaration implements Cloneable {
protected String format; protected String format;
protected int index; protected int index;
protected Variable<?> variable; protected Variable<?> variable;
protected boolean invoking;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// *************************************************************************** // ***************************************************************************
...@@ -47,6 +48,7 @@ public class Declaration implements Cloneable { ...@@ -47,6 +48,7 @@ public class Declaration implements Cloneable {
public Declaration(Variable<?> variable) { public Declaration(Variable<?> variable) {
this.variable = variable; this.variable = variable;
this.index = -1; this.index = -1;
this.invoking = true;
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
...@@ -56,6 +58,8 @@ public class Declaration implements Cloneable { ...@@ -56,6 +58,8 @@ public class Declaration implements Cloneable {
this.variable = variable; this.variable = variable;
this.field = field; this.field = field;
this.index = -1; this.index = -1;
this.invoking = true;
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
...@@ -64,6 +68,8 @@ public class Declaration implements Cloneable { ...@@ -64,6 +68,8 @@ public class Declaration implements Cloneable {
Preconditions.checkArgument((variable instanceof VectorVariable), StringUtils.build("Variable {} is not a VectorVariable!", variable.getName())); //$NON-NLS-1$ Preconditions.checkArgument((variable instanceof VectorVariable), StringUtils.build("Variable {} is not a VectorVariable!", variable.getName())); //$NON-NLS-1$
this.variable = variable; this.variable = variable;
this.index = index; this.index = index;
this.invoking = true;
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
...@@ -74,6 +80,7 @@ public class Declaration implements Cloneable { ...@@ -74,6 +80,7 @@ public class Declaration implements Cloneable {
this.equate = other.equate; this.equate = other.equate;
this.index = other.index; this.index = other.index;
this.format = other.format; this.format = other.format;
this.invoking = other.invoking;
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
...@@ -106,6 +113,18 @@ public class Declaration implements Cloneable { ...@@ -106,6 +113,18 @@ public class Declaration implements Cloneable {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
public void setInvoking(boolean invoking) {
this.invoking = invoking;
}
// ---------------------------------------------------------------------------
public boolean isInvoking() {
return this.invoking;
}
// ---------------------------------------------------------------------------
public void setFormat(String format) { public void setFormat(String format) {
this.format = format; this.format = format;
} }
......
...@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory; ...@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Map.Entry;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
...@@ -142,9 +143,8 @@ public class Equation { ...@@ -142,9 +143,8 @@ public class Equation {
} }
if (!isolated && consolidated && consolidatedListeners != null) { if (!isolated && consolidated && consolidatedListeners != null) {
for (InputChangeListener listener : consolidatedListeners.keySet()) { for (Entry<InputChangeListener, Variable<?>> entry : consolidatedListeners.entrySet()) {
Variable<?> variable = consolidatedListeners.get(listener); entry.getKey().inputChanged(new InputEvent(entry.getValue()));
listener.inputChanged(new InputEvent(variable));
} }
} }
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
package lu.list.itis.dkd.tui.cps.system; package lu.list.itis.dkd.tui.cps.system;
import lu.list.itis.dkd.dbc.annotation.NonNullByDefault; import lu.list.itis.dkd.dbc.annotation.NonNullByDefault;
import lu.list.itis.dkd.tui.cps.InputChangeListener;
import lu.list.itis.dkd.tui.cps.InputEvent;
import lu.list.itis.dkd.tui.cps.Phenomenon; import lu.list.itis.dkd.tui.cps.Phenomenon;
import lu.list.itis.dkd.tui.cps.system.executor.Executor; import lu.list.itis.dkd.tui.cps.system.executor.Executor;
import lu.list.itis.dkd.tui.cps.utility.EquationSystemBundle; import lu.list.itis.dkd.tui.cps.utility.EquationSystemBundle;
...@@ -30,6 +32,7 @@ import lu.list.itis.dkd.tui.utility.Point; ...@@ -30,6 +32,7 @@ import lu.list.itis.dkd.tui.utility.Point;
import lu.list.itis.dkd.tui.utility.StringUtils; import lu.list.itis.dkd.tui.utility.StringUtils;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.jgoodies.common.base.Preconditions;
import org.jdom2.Document; import org.jdom2.Document;
import org.jdom2.Element; import org.jdom2.Element;
...@@ -287,6 +290,9 @@ public class EquationSystemBuilder { ...@@ -287,6 +290,9 @@ public class EquationSystemBuilder {
attribute = this.getAttribute(element, EquationSystemBundle.FIELD_ATTRIBUTE); attribute = this.getAttribute(element, EquationSystemBundle.FIELD_ATTRIBUTE);
attributes.put(EquationSystemBundle.FIELD_ATTRIBUTE, attribute); attributes.put(EquationSystemBundle.FIELD_ATTRIBUTE, attribute);
attribute = this.getAttribute(element, EquationSystemBundle.INVOKING_ATTRIBUTE);
attributes.put(EquationSystemBundle.INVOKING_ATTRIBUTE, attribute);
attribute = this.getAttribute(element, EquationSystemBundle.DECIMALS_ATTRIBUTE); attribute = this.getAttribute(element, EquationSystemBundle.DECIMALS_ATTRIBUTE);
attributes.put(EquationSystemBundle.DECIMALS_ATTRIBUTE, attribute); attributes.put(EquationSystemBundle.DECIMALS_ATTRIBUTE, attribute);
...@@ -531,9 +537,17 @@ public class EquationSystemBuilder { ...@@ -531,9 +537,17 @@ public class EquationSystemBuilder {
for (Element parameter : parameters) { for (Element parameter : parameters) {
parameterAttributes = this.extractAttributesForVariables(parameter); parameterAttributes = this.extractAttributesForVariables(parameter);
String identifier = parameterAttributes.get(EquationSystemBundle.NAME_ATTRIBUTE); String identifier = parameterAttributes.get(EquationSystemBundle.NAME_ATTRIBUTE);
String invoking = parameterAttributes.get(EquationSystemBundle.INVOKING_ATTRIBUTE);
Variable<?> variable = this.getIndependentVariable(parameterAttributes); Variable<?> variable = this.getIndependentVariable(parameterAttributes);
if (variable != null) { if (variable != null) {
Declaration declaration = this.buildDeclaration(variable, parameterAttributes); Declaration declaration = this.buildDeclaration(variable, parameterAttributes);
if (!Strings.isNullOrEmpty(invoking)) {
Matcher regex = booleanPattern.matcher(invoking);
declaration.setInvoking(regex.matches());
}
declarations.add(declaration); declarations.add(declaration);
} else { } else {
String message = StringUtils.build("Undefined parameter {} encountered! Check equation file!", identifier); //$NON-NLS-1$ String message = StringUtils.build("Undefined parameter {} encountered! Check equation file!", identifier); //$NON-NLS-1$
...@@ -679,7 +693,6 @@ public class EquationSystemBuilder { ...@@ -679,7 +693,6 @@ public class EquationSystemBuilder {
} else { } else {
executor = DEFAULT_EXECUTOR; executor = DEFAULT_EXECUTOR;
} }
} }
Mapping variableMapping = new Mapping(equationInputs, equationOutputs); Mapping variableMapping = new Mapping(equationInputs, equationOutputs);
...@@ -693,7 +706,11 @@ public class EquationSystemBuilder { ...@@ -693,7 +706,11 @@ public class EquationSystemBuilder {
if (!periodic) { if (!periodic) {
for (Declaration declaration : equationInputs) { for (Declaration declaration : equationInputs) {
Variable<?> parameter = declaration.getVariable(); Variable<?> parameter = declaration.getVariable();
parameter.addListener(equationSystem); if (declaration.isInvoking()) {
parameter.addListener(equationSystem);
} else {
LOGGER.info("Parameter {} is non invoking and won't invoke equation {}!", declaration.getIdentifier(), equationName); //$NON-NLS-1$
}
} }
equations.put(equationName, equationSystem); equations.put(equationName, equationSystem);
} else { } else {
...@@ -753,6 +770,31 @@ public class EquationSystemBuilder { ...@@ -753,6 +770,31 @@ public class EquationSystemBuilder {
} }
} }
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Class Body *
// ***************************************************************************
// ---------------------------------------------------------------------------
public void atomicUpdate(List<Variable<?>> variables, List<Object> values) {
Preconditions.checkArgument(!variables.isEmpty(), "No variables to update!");
Preconditions.checkArgument(variables.size() == values.size(), "Sizes of variables and values lists must match!");
HashMap<InputChangeListener, Variable<?>> consolidated = new HashMap<>();
for (int i = 0; i < variables.size(); i++) {
Variable<?> variable = variables.get(i);
variable.suspendListenerNotification(true);
variable.setValueFromObject(values.get(i));
variable.suspendListenerNotification(false);
consolidated = variable.consolidateListeners(consolidated);
}
for (Entry<InputChangeListener, Variable<?>> entry : consolidated.entrySet()) {
entry.getKey().inputChanged(new InputEvent(entry.getValue()));
}
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** /**
* Method used to parse the file containing the XML representation of the equation system. * Method used to parse the file containing the XML representation of the equation system.
......
...@@ -145,7 +145,7 @@ public class Mapping { ...@@ -145,7 +145,7 @@ public class Mapping {
public boolean catersTo(Variable<?> variable) { public boolean catersTo(Variable<?> variable) {
for (Declaration declaration : independentVariables) { for (Declaration declaration : independentVariables) {
if (variable.equals(declaration.getVariable())) { if (variable.equals(declaration.getVariable())) {
return true; return declaration.isInvoking();
} }
} }
return false; return false;
......
...@@ -305,10 +305,14 @@ public class PythonExecutor extends Executor { ...@@ -305,10 +305,14 @@ public class PythonExecutor extends Executor {
PyObject item = array.__getitem__(index); PyObject item = array.__getitem__(index);
vector.set(index, (B) item.__tojava__(clazz)); vector.set(index, (B) item.__tojava__(clazz));
} else { } else {
if (vector.isEmpty()) {
clazz = null;
}
vector.suspendListenerNotification(true); vector.suspendListenerNotification(true);
vector.clear(); vector.clear();
for (PyObject item : array.asIterable()) { for (PyObject item : array.asIterable()) {
clazz = (clazz != null) ? clazz : TYPE_MAPPING.get(item.getType());
vector.add(item.__tojava__(clazz)); vector.add(item.__tojava__(clazz));
} }
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
package lu.list.itis.dkd.tui.cps.system.executor; package lu.list.itis.dkd.tui.cps.system.executor;
import lu.list.itis.dkd.tui.cps.system.Declaration; import lu.list.itis.dkd.tui.cps.system.Declaration;
import lu.list.itis.dkd.tui.cps.variable.MapVariable;
import lu.list.itis.dkd.tui.cps.variable.Variable; import lu.list.itis.dkd.tui.cps.variable.Variable;
import lu.list.itis.dkd.tui.cps.variable.VectorVariable; import lu.list.itis.dkd.tui.cps.variable.VectorVariable;
...@@ -36,6 +37,7 @@ import java.util.Date; ...@@ -36,6 +37,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
...@@ -53,6 +55,7 @@ public class SqlExecutor extends Executor { ...@@ -53,6 +55,7 @@ public class SqlExecutor extends Executor {
private String driverClass; private String driverClass;
private String userName; private String userName;
private String password; private String password;
private boolean autoCommit;
private List<Object[]> columnValues = null; private List<Object[]> columnValues = null;
private List<Integer> columnTypes = null; private List<Integer> columnTypes = null;
...@@ -62,8 +65,9 @@ public class SqlExecutor extends Executor { ...@@ -62,8 +65,9 @@ public class SqlExecutor extends Executor {
private static final String SQL_DRIVER_CLASS = "sql.driver.class"; //$NON-NLS-1$ private static final String SQL_DRIVER_CLASS = "sql.driver.class"; //$NON-NLS-1$
private static final String SQL_USER_NAME = "sql.user.name"; //$NON-NLS-1$ 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 String SQL_USER_PASSWORD = "sql.user.password"; //$NON-NLS-1$
private static final String SQL_AUTO_COMMIT = "sql.autoCommit"; //$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 final String SQL_PLACEHOLDER = "?"; //$NON-NLS-1$ private static final String SQL_PLACEHOLDER = "?"; //$NON-NLS-1$
private static final Logger LOGGER = LoggerFactory.getLogger(SqlExecutor.class.getSimpleName()); private static final Logger LOGGER = LoggerFactory.getLogger(SqlExecutor.class.getSimpleName());
...@@ -81,6 +85,7 @@ public class SqlExecutor extends Executor { ...@@ -81,6 +85,7 @@ public class SqlExecutor extends Executor {
private static final String SCALAR = "$"; //$NON-NLS-1$ private static final String SCALAR = "$"; //$NON-NLS-1$
private static final String VECTOR = "@"; //$NON-NLS-1$ private static final String VECTOR = "@"; //$NON-NLS-1$
private static final String MAP = "%"; //$NON-NLS-1$
// *************************************************************************** // ***************************************************************************
// * Constructor(s) * // * Constructor(s) *
...@@ -95,6 +100,7 @@ public class SqlExecutor extends Executor { ...@@ -95,6 +100,7 @@ public class SqlExecutor extends Executor {
driverClass = properties.getProperty(SQL_DRIVER_CLASS); driverClass = properties.getProperty(SQL_DRIVER_CLASS);
userName = properties.getProperty(SQL_USER_NAME); userName = properties.getProperty(SQL_USER_NAME);
password = properties.getProperty(SQL_USER_PASSWORD); password = properties.getProperty(SQL_USER_PASSWORD);
autoCommit = Boolean.parseBoolean(properties.getProperty(SQL_AUTO_COMMIT, "false"));
connectionPool = this.setupConnectionPool(); connectionPool = this.setupConnectionPool();
} }
...@@ -138,7 +144,7 @@ public class SqlExecutor extends Executor { ...@@ -138,7 +144,7 @@ public class SqlExecutor extends Executor {
do { do {
try { try {
connection = connectionPool.getConnection(); connection = connectionPool.getConnection();
connection.setAutoCommit(false); connection.setAutoCommit(autoCommit);
numberOfConnections = connectionPool.getNumConnections(); numberOfConnections = connectionPool.getNumConnections();
} catch (SQLException p_Exception) { } catch (SQLException p_Exception) {
LOGGER.warn("Failed to acquire connection from Connection Pool for Datasource {}! Reconnection pool...", connectionUrl); //$NON-NLS-1$ LOGGER.warn("Failed to acquire connection from Connection Pool for Datasource {}! Reconnection pool...", connectionUrl); //$NON-NLS-1$
...@@ -158,6 +164,15 @@ public class SqlExecutor extends Executor { ...@@ -158,6 +164,15 @@ public class SqlExecutor extends Executor {
return connection; return connection;
} }
// ---------------------------------------------------------------------------
private int appendPlaceholder(StringBuffer buffer, boolean positionalParameters, int positionalIndex) {
buffer.append(SQL_PLACEHOLDER);
if (positionalParameters)
buffer.append(positionalIndex++);
return positionalIndex;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** /**
* replaces every occurrence of the previously specified interpolation pattern with the previously * replaces every occurrence of the previously specified interpolation pattern with the previously
...@@ -200,9 +215,7 @@ public class SqlExecutor extends Executor { ...@@ -200,9 +215,7 @@ public class SqlExecutor extends Executor {
placeholders.add(variable); placeholders.add(variable);
if (SCALAR.equals(type)) { if (SCALAR.equals(type)) {
interpolated.append(SQL_PLACEHOLDER); index = this.appendPlaceholder(interpolated, positionalParameters, index);
if (positionalParameters)
interpolated.append(index++);
} }
if (VECTOR.equals(type)) { if (VECTOR.equals(type)) {
Object value = parameters.get(variable); Object value = parameters.get(variable);
...@@ -212,23 +225,45 @@ public class SqlExecutor extends Executor { ...@@ -212,23 +225,45 @@ public class SqlExecutor extends Executor {
if (!collection.isEmpty()) { if (!collection.isEmpty()) {
for (int count = 0; count < collection.size(); count++) { for (int count = 0; count < collection.size(); count++) {
interpolated.append(separator); interpolated.append(separator);
interpolated.append(SQL_PLACEHOLDER); index = this.appendPlaceholder(interpolated, positionalParameters, index);
if (positionalParameters)
interpolated.append(index++);
separator = ","; separator = ",";
} }
} else { } else {
interpolated.append(SQL_PLACEHOLDER); index = this.appendPlaceholder(interpolated, positionalParameters, index);
if (positionalParameters)
interpolated.append(index++);
} }
} else { } else {
interpolated.append(SQL_PLACEHOLDER); index = this.appendPlaceholder(interpolated, positionalParameters, index);
if (positionalParameters)
interpolated.append(index++);
} }
} }
if (MAP.equals(type)) {
Object value = parameters.get(variable);
if (value instanceof Map) {
Map<?, ?> map = (Map<?, ?>) value;
String separator = "";
if (!map.isEmpty()) {
for (int count = 0; count < map.size(); count++) {
interpolated.append(separator);
interpolated.append("(");
index = this.appendPlaceholder(interpolated, positionalParameters, index);
interpolated.append(",");
index = this.appendPlaceholder(interpolated, positionalParameters, index);
interpolated.append(")");
separator = ",";
}
} else {
interpolated.append("(");
index = this.appendPlaceholder(interpolated, positionalParameters, index);
interpolated.append(",");
index = this.appendPlaceholder(interpolated, positionalParameters, index);
interpolated.append(")");
}
} else {
index = this.appendPlaceholder(interpolated, positionalParameters, index);
}
}
} else { } else {
interpolated.append(interpolated.substring(interpolator.start(), interpolator.end())); interpolated.append(interpolated.substring(interpolator.start(), interpolator.end()));
} }
...@@ -248,13 +283,23 @@ public class SqlExecutor extends Executor { ...@@ -248,13 +283,23 @@ public class SqlExecutor extends Executor {
Object value = context.get(placeholder); Object value = context.get(placeholder);
if (value instanceof Collection) { if (value instanceof Collection) {
Collection<?> collection = (Collection<?>) value; Collection<?> collection = (Collection<?>) value;
if (collection.size() > 0) { if (!collection.isEmpty()) {
for (Object item : collection) { for (Object item : collection) {
statement.setObject(index++, item); statement.setObject(index++, item);
} }
} else { } else {
statement.setObject(index++, null); statement.setObject(index++, null);
} }
} else if (value instanceof Map) {
Map<?, ?> map = (Map<?, ?>) value;
if (!map.isEmpty()) {
for (Entry<?, ?> entry : map.entrySet()) {
statement.setObject(index++, entry.getKey());
statement.setObject(index++, entry.getValue());
}
} else {
statement.setObject(index++, null);
}
} else { } else {
statement.setObject(index++, value); statement.setObject(index++, value);
} }
...@@ -349,10 +394,25 @@ public class SqlExecutor extends Executor { ...@@ -349,10 +394,25 @@ public class SqlExecutor extends Executor {
public void set(Declaration declaration) { public void set(Declaration declaration) {
Variable<?> variable = declaration.getVariable(); Variable<?> variable = declaration.getVariable();
String identifier = (Strings.isNullOrEmpty(declaration.getEquate())) ? variable.getName() : declaration.getEquate(); String identifier = (Strings.isNullOrEmpty(declaration.getEquate())) ? variable.getName() : declaration.getEquate();
String field = declaration.getField();
int index = declaration.getIndex();
Object value;
if (!Strings.isNullOrEmpty(field) && (variable instanceof MapVariable<?, ?>)) {
MapVariable<?, ?> map = (MapVariable<?, ?>) declaration.getVariable();
value = map.get(field);
parameters.put(identifier, value);
} else if ((index >= 0) && (variable instanceof VectorVariable<?>)) {
VectorVariable<?> vector = (VectorVariable<?>) declaration.getVariable();
value = vector.get(index);
parameters.put(identifier, value);
} else {
value = variable.getValue();
parameters.put(identifier, value);
}
parameters.put(identifier, variable.getValue());
if (LOGGER.isInfoEnabled()) { if (LOGGER.isInfoEnabled()) {
LOGGER.info("Parameter -> {} = {}", variable.getName(), variable.getValue()); //$NON-NLS-1$ LOGGER.info("Parameter -> {} = {}", identifier, value); //$NON-NLS-1$
} }
} }
...@@ -471,7 +531,9 @@ public class SqlExecutor extends Executor { ...@@ -471,7 +531,9 @@ public class SqlExecutor extends Executor {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public void resetContext() { public void resetContext() {
// TODO Auto-generated method stub columnNames.clear();
columnTypes.clear();
columnValues.clear();
} }
} }
...@@ -48,6 +48,7 @@ public class EquationSystemBundle extends NLS { ...@@ -48,6 +48,7 @@ public class EquationSystemBundle extends NLS {
public static String INDEX_ATTRIBUTE; public static String INDEX_ATTRIBUTE;
public static String FORMAT_ATTRIBUTE; public static String FORMAT_ATTRIBUTE;
public static String FIELD_ATTRIBUTE; public static String FIELD_ATTRIBUTE;
public static String INVOKING_ATTRIBUTE;
public static String INVOKE_ELEMENT; public static String INVOKE_ELEMENT;
public static String EXECUTOR_ATTRIBUTE; public static String EXECUTOR_ATTRIBUTE;
public static String NAME_ATTRIBUTE; public static String NAME_ATTRIBUTE;
......