[jboss-svn-commits] JBL Code SVN: r15482 - in labs/jbossrules/trunk/drools-decisiontables/src: test/java/org/drools/decisiontable and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Oct 1 10:32:06 EDT 2007
Author: stevearoonie
Date: 2007-10-01 10:32:06 -0400 (Mon, 01 Oct 2007)
New Revision: 15482
Added:
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/AbstractColumn.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayCell.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateColumn.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongCell.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongColumn.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringCell.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringColumn.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateColumn.java
labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_template_conditions.drl
Removed:
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ArrayColumnTest.java
Modified:
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayColumn.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Cell.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Column.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ColumnFactory.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateContainer.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateRuleBase.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ExternalSheetListener.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Row.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/RuleTemplate.java
labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateContainer.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/SpreadsheetCompilerUnitTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ColumnFactoryTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultGeneratorTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateContainerTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateRuleBaseTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/RuleTemplateTest.java
labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_integration.drl
Log:
Add support for Array and Long types in rule templates. Also add condition rule generation based on cell values.
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/AbstractColumn.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/AbstractColumn.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/AbstractColumn.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,51 @@
+package org.drools.decisiontable.parser;
+
+import org.drools.util.StringUtils;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * Base column of in a decision table
+ */
+public abstract class AbstractColumn implements Column {
+ private String name;
+
+ public AbstractColumn(String n) {
+ this.name = n;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getCondition(String condition, int index) {
+ StringBuffer conditionString = new StringBuffer(getCellType());
+ conditionString.append("(row == r, column == $param");
+ if (index != -1) {
+ conditionString.append(", index == ").append(index);
+ }
+ if (!StringUtils.isEmpty(condition)) {
+ conditionString.append(", value ").append(condition);
+ }
+ conditionString.append(")");
+ return conditionString.toString();
+ }
+
+
+}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayCell.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayCell.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayCell.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * Cell containing an array of values
+ */
+package org.drools.decisiontable.parser;
+
+import java.util.Map;
+
+import org.drools.StatefulSession;
+import org.drools.util.StringUtils;
+
+public class ArrayCell implements Cell {
+ Row row;
+
+ String value;
+
+ ArrayColumn column;
+
+ private String[] values;
+
+ public ArrayCell(final Row r, final ArrayColumn c) {
+ row = r;
+ column = c;
+ }
+
+ public void addValue(Map vars) {
+ for (int i = 0; i < values.length; i++) {
+ vars.put(column.getName() + i, values[i]);
+ }
+ }
+
+ public Column getColumn() {
+ return column;
+ }
+
+ public Row getRow() {
+ return row;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void insert(StatefulSession session) {
+ session.insert(this);
+ for (int i = 0; i < values.length; i++) {
+ Cell cell = column.getType().createCell(row);
+ cell.setValue(values[i]);
+ cell.setIndex(i);
+ cell.insert(session);
+ }
+ }
+
+ public void setIndex(int i) {
+ throw new RuntimeException("You cannot call setIndex on an ArrayCell");
+ }
+
+ public int getIndex() {
+ return -1;
+ }
+
+ public void setValue(String v) {
+ value = v;
+ values = StringUtils.splitPreserveAllTokens(value, ",");
+ }
+
+ public boolean isEmpty() {
+ return StringUtils.isEmpty(value);
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayColumn.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayColumn.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ArrayColumn.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -16,8 +16,6 @@
* limitations under the License.
*/
-import java.util.Map;
-
import org.drools.util.StringUtils;
/**
* @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
@@ -25,22 +23,41 @@
* A column in a decision table that represents an array (comma-delimited)
* of values.
*/
-public class ArrayColumn extends Column {
+public class ArrayColumn extends AbstractColumn {
- public void addValue(Map vars, Object value) {
+ private Column type;
- String[] values = ((String[]) value);
- for (int i = 0; i < values.length; i++) {
- vars.put(getName() + i, values[i]);
- }
+ public ArrayColumn(String n, Column typeColumn) {
+ super(n);
+ this.type = typeColumn;
}
- public ArrayColumn(String n) {
- super(n);
+ public Cell createCell(Row row) {
+ return new ArrayCell(row, this);
}
- public Object getValue(String cellValue) {
- return StringUtils.splitPreserveAllTokens(cellValue, ",");
+ public String getCellType() {
+ return type.getCellType();
}
+
+ public Column getType() {
+ return type;
+ }
+ public String getCondition(String condition, int index) {
+ if (index == -1) {
+ StringBuffer conditionString = new StringBuffer("ArrayCell(row == r, column == $param");
+ if (!StringUtils.isEmpty(condition)) {
+ conditionString.append(", value ").append(condition);
+ }
+ conditionString.append(")");
+ return conditionString.toString();
+ }
+ else
+ {
+ return type.getCondition(condition, index);
+ }
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Cell.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Cell.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Cell.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -2,6 +2,8 @@
import java.util.Map;
+import org.drools.StatefulSession;
+
/*
* Copyright 2005 JBoss Inc
*
@@ -23,42 +25,20 @@
*
* A cell in a decision table
*/
-public class Cell {
- Row row;
+public interface Cell {
+ public Row getRow();
- Object value;
+ public Column getColumn();
+
+ public void setValue(String value);
- Column column;
+ public void addValue(Map vars);
+
+ public void insert(StatefulSession session);
- public Cell() {
-
- }
- Cell(Row r, Column c) {
- row = r;
- column = c;
- }
+ public void setIndex(int i);
- public void setValue(String v) {
- value = column.getValue(v);
- }
+ public int getIndex();
- public String toString() {
- return "Cell[" + column + ": " + value + "]";
- }
-
- public Row getRow() {
- return row;
- }
-
- public String getColumn() {
- return column.getName();
- }
-
- public Object getValue() {
- return value;
- }
-
- public void addValue(Map vars) {
- column.addValue(vars, value);
- }
+ public boolean isEmpty();
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Column.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Column.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Column.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -15,30 +15,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import java.util.Map;
/**
* @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
*
* A column in a decision table
*/
-public class Column {
- private String name;
+public interface Column {
+ String getName();
- public Column(String n) {
- this.name = n;
- }
+ Cell createCell(Row row);
- public String getName() {
- return name;
- }
+ String getCellType();
- public Object getValue(String cellValue) {
- return cellValue;
- }
+ String getCondition(String condition, int index);
- public void addValue(Map vars, Object value) {
- vars.put(name, value);
- }
-
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ColumnFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ColumnFactory.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ColumnFactory.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -1,5 +1,10 @@
package org.drools.decisiontable.parser;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/*
* Copyright 2005 JBoss Inc
*
@@ -22,11 +27,51 @@
* [] indicates a column that represents an array (comma-delimited) of values.
*/
public class ColumnFactory {
+ private final static Pattern PATTERN = Pattern.compile( "([a-zA-Z0-9_]*)(\\[\\])?(:\\s*([a-zA-Z]*)(\\[\\])?)?" );
- public Column getColumn(String value) {
- if (value.endsWith("[]")) {
- return new ArrayColumn(value.substring(0, value.length() - 2));
- }
- return new Column(value);
- }
+ public Column getColumn(String value) {
+ Matcher m = PATTERN.matcher( value );
+ if ( !m.matches() ) throw new IllegalArgumentException( "value " + value + " is not a valid column definition" );
+ String name = m.group( 1 );
+ String type = m.group( 4 );
+ type = type == null ? "String" : type;
+ boolean array = (m.group( 2 ) != null) || (m.group( 5 ) != null);
+ if ( array ) {
+ return new ArrayColumn( name,
+ createColumn( name,
+ type ) );
+ }
+ return createColumn( name,
+ type );
+ }
+
+ private Column createColumn(String name,
+ String type) {
+ try {
+ Class klass = Class.forName( this.getClass().getPackage().getName() + "." + type + "Column" );
+ Constructor constructor = klass.getConstructor( new Class[]{String.class} );
+ return (Column) constructor.newInstance( new Object[]{name} );
+ } catch ( SecurityException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ } catch ( NoSuchMethodException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ } catch ( ClassNotFoundException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ } catch ( IllegalArgumentException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ } catch ( InstantiationException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ } catch ( IllegalAccessException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ } catch ( InvocationTargetException e ) {
+ e.printStackTrace();
+ throw new RuntimeException( e );
+ }
+ }
}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateColumn.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateColumn.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateColumn.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,105 @@
+package org.drools.decisiontable.parser;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.drools.decisiontable.model.Condition;
+import org.drools.decisiontable.model.Rule;
+import org.drools.decisiontable.model.SnippetBuilder;
+import org.drools.util.StringUtils;
+
+/**
+ *
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * The default column condition for a rule template to be generated. If the
+ * conditon starts with "!" then the template will only be generated if the
+ * column condition does not exist. If there is no condition string then the
+ * template will be generated only if the column contains a value. The condition
+ * can be any valid rule condition.
+ */
+class DefaultTemplateColumn implements TemplateColumn {
+ private static final Pattern COLUMN_PATTERN = Pattern
+ .compile("^(!?)([a-zA-Z0-9_]*)(\\[([0-9]+)\\])?\\s*(.*)");
+
+ private boolean notCondition;
+
+ private String columnName;
+
+ private String condition;
+
+ private TemplateContainer templateContainer;
+
+ private int index = -1;
+
+ DefaultTemplateColumn(TemplateContainer tc, String columnString) {
+ templateContainer = tc;
+ Matcher matcher = COLUMN_PATTERN.matcher(columnString);
+ if (!matcher.matches())
+ throw new IllegalArgumentException("column " + columnString
+ + " is not valid");
+ notCondition = !StringUtils.isEmpty(matcher.group(1));
+ columnName = matcher.group(2);
+ String indexString = matcher.group(4);
+ condition = matcher.group(5);
+ if (!StringUtils.isEmpty(indexString)) {
+ index = Integer.parseInt(indexString);
+ }
+ }
+
+ private void createCellCondition(final Rule rule) {
+ StringBuffer conditionString = new StringBuffer();
+ Column column = templateContainer.getColumn(columnName);
+ column.getCondition(condition, index);
+
+ if (notCondition) {
+ conditionString.append("not ");
+ }
+ conditionString.append("exists ");
+ conditionString.append(column.getCondition(condition, index));
+ SnippetBuilder snip = new SnippetBuilder(conditionString.toString());
+ Condition condition = new Condition();
+ condition.setSnippet(snip.build(columnName));
+ rule.addCondition(condition);
+ }
+
+ private void createColumnCondition(final Rule rule, final String value) {
+ SnippetBuilder colSnip = new SnippetBuilder(
+ "$param : Column(name == \"$param\")");
+ Condition colCondition = new Condition();
+ colCondition.setSnippet(colSnip.build(value));
+ rule.addCondition(colCondition);
+ }
+
+ public void addCondition(Rule rule) {
+ createColumnCondition(rule, columnName);
+ createCellCondition(rule);
+ }
+
+ public String getName() {
+ return columnName;
+ }
+
+ public boolean isNotCondition() {
+ return notCondition;
+ }
+
+ public String getCondition() {
+ return condition;
+ }
+}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateContainer.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateContainer.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -28,13 +28,15 @@
*
* @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
*
- * Container for a set of templates (residing in one file).
- * This class will parse the template file.
- *
+ * Container for a set of templates (residing in one file). This class will
+ * parse the template file.
+ *
*/
public class DefaultTemplateContainer implements TemplateContainer {
private String header;
+ private Map columnMap = new HashMap();
+
private List columns = new ArrayList();
private Map templates = new HashMap();
@@ -55,7 +57,7 @@
if (templates.size() == 0) {
throw new DecisionTableParseException("Missing templates");
}
-
+
}
private void parseTemplate(final InputStream templateStream) {
@@ -79,7 +81,7 @@
String quotedName = line.substring(8).trim();
quotedName = quotedName.substring(1, quotedName
.length() - 1);
- template = new RuleTemplate(quotedName);
+ template = new RuleTemplate(quotedName, this);
addTemplate(template);
} else if (line.startsWith("package")) {
@@ -137,6 +139,7 @@
private void addColumn(Column c) {
columns.add(c);
+ columnMap.put(c.getName(), c);
}
/*
@@ -166,4 +169,8 @@
+ e.getMessage());
}
}
+
+ public Column getColumn(final String name) {
+ return (Column) columnMap.get(name);
+ }
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateRuleBase.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/DefaultTemplateRuleBase.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -32,7 +32,6 @@
import org.drools.decisiontable.model.Global;
import org.drools.decisiontable.model.Import;
import org.drools.decisiontable.model.Rule;
-import org.drools.decisiontable.model.SnippetBuilder;
import org.drools.rule.Package;
/**
@@ -51,8 +50,10 @@
* rule "template1"
* when
* r : Row()
- * Cell(row == r, column == "column1")
- * Cell(row == r, column == "column2")
+ * column1 : Column(name == "column1")
+ * Cell(row == r, column == column1)
+ * column2 : Column(name == "column2")
+ * Cell(row == r, column == column2, value == "xyz")
* then
* generator.generate( "template1", r);
* end
@@ -99,23 +100,15 @@
condition.setSnippet("r : Row()");
rule.addCondition(condition);
createColumnConditions(template, rule);
- createNotColumnConditions(template, rule);
rule.addConsequence(createConsequence(template));
p.addRule(rule);
}
- private void createNotColumnConditions(RuleTemplate template, Rule rule) {
- String[] templateNotColumns = template.getNotColumns();
- for (int j = 0; j < templateNotColumns.length; j++) {
- rule.addCondition(createNotCondition(templateNotColumns[j]));
- }
- }
-
private void createColumnConditions(RuleTemplate template, Rule rule) {
List templateColumns = template.getColumns();
- for (Iterator it1 = templateColumns.iterator(); it1.hasNext();) {
- String column = (String) it1.next();
- rule.addCondition(createCondition(column));
+ for (Iterator it = templateColumns.iterator(); it.hasNext();) {
+ TemplateColumn column = (TemplateColumn) it.next();
+ column.addCondition(rule);
}
}
@@ -145,26 +138,9 @@
return consequence;
}
- private Condition createCondition(final String value) {
- SnippetBuilder snip = new SnippetBuilder(
- "Cell(row == r, column == \"$param\")");
- String result = snip.build(value);
- Condition condition = new Condition();
- condition.setSnippet(result);
- return condition;
- }
-
- private Condition createNotCondition(final String value) {
- SnippetBuilder snip = new SnippetBuilder(
- "not Cell(row == r, column == \"$param\")");
- String result = snip.build(value);
- Condition condition = new Condition();
- condition.setSnippet(result);
- return condition;
- }
private RuleBase readRule(String drl) {
try {
- System.out.println(drl);
+// System.out.println(drl);
// read in the source
Reader source = new StringReader(drl);
PackageBuilder builder = new PackageBuilder();
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ExternalSheetListener.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ExternalSheetListener.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/ExternalSheetListener.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -19,6 +19,7 @@
import java.util.Properties;
import org.drools.StatefulSession;
+import org.drools.audit.WorkingMemoryFileLogger;
import org.drools.decisiontable.model.DRLOutput;
/**
@@ -44,6 +45,8 @@
private Generator generator;
+ private WorkingMemoryFileLogger logger;
+
public ExternalSheetListener(final int startRow, final int startCol,
final String template) {
this(startRow, startCol, new DefaultTemplateContainer(template));
@@ -68,10 +71,19 @@
columns = tc.getColumns();
this.templateContainer = tc;
session = ruleBase.newStatefulSession();
+ logger = new WorkingMemoryFileLogger(session);
+ logger.setFileName("log/event");
this.generator = generator;
session.setGlobal("generator", generator);
+ assertColumns();
}
+ private void assertColumns() {
+ for (int i = 0; i < columns.length; i++) {
+ session.insert(columns[i]);
+ }
+ }
+
public Properties getProperties() {
return null;
}
@@ -85,6 +97,7 @@
session.insert(currentRow);
}
session.fireAllRules();
+ logger.writeToDisk();
session.dispose();
}
@@ -95,13 +108,9 @@
int columnIndex = column - startCol;
// System.out.println("asserting cell " + row + ", " + column + ": "
// + value);
- //Column col = columns[columnIndex];
- //Cell cell = new Cell(currentRow, col, value);
- //currentRow.addCell(cell);
Cell cell = currentRow.getCell(columnIndex);
cell.setValue(value);
- session.insert(cell);
-
+ cell.insert(session);
}
}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongCell.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongCell.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongCell.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,79 @@
+package org.drools.decisiontable.parser;
+
+import java.util.Map;
+
+import org.drools.StatefulSession;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * A cell in a decision table containing a long value
+ */
+public class LongCell implements Cell {
+ Row row;
+
+ Long value;
+
+ Column column;
+
+ private int index;
+
+ public LongCell() {
+
+ }
+ LongCell(Row r, Column c) {
+ row = r;
+ column = c;
+ }
+
+ public String toString() {
+ return "Cell[" + column + ": " + value + "]";
+ }
+
+ public Row getRow() {
+ return row;
+ }
+
+ public Column getColumn() {
+ return column;
+ }
+
+ public Long getValue() {
+ return value;
+ }
+
+ public void addValue(Map vars) {
+ vars.put(column.getName(), value);
+ }
+ public void insert(StatefulSession session) {
+ session.insert(this);
+ }
+ public void setIndex(int i) {
+ index = i;
+ }
+ public int getIndex() {
+ return index;
+ }
+ public void setValue(String v) {
+ value = new Long(v);
+ }
+ public boolean isEmpty() {
+ return value == null;
+ }
+}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongColumn.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongColumn.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/LongColumn.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,43 @@
+package org.drools.decisiontable.parser;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * A column of type Long in a decision table
+ */
+public class LongColumn extends AbstractColumn {
+
+ public LongColumn(String n) {
+ super(n);
+ }
+
+ public void addValue(Map vars, Object value) {
+ vars.put(getName(), value);
+ }
+
+ public Cell createCell(Row row) {
+ return new LongCell(row, this);
+ }
+
+ public String getCellType() {
+ return "LongCell";
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Row.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Row.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/Row.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -34,7 +34,7 @@
Row(int r, Column[] columns) {
rowNum = r;
for (int i = 0; i < columns.length; i++) {
- cells.add(new Cell(this, columns[i]));
+ cells.add(columns[i].createCell(this));
}
}
@@ -50,7 +50,7 @@
boolean isEmpty() {
for (Iterator it = cells.iterator(); it.hasNext();) {
Cell cell = (Cell) it.next();
- if (cell.getValue() != null)
+ if (!cell.isEmpty())
{
return false;
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/RuleTemplate.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/RuleTemplate.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/RuleTemplate.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -19,6 +19,8 @@
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -28,67 +30,53 @@
/**
* @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
*
- * A rule template made up of a name, the decision table columns required,
- * the decision table columns that must be empty and the contents of the
- * rule.
+ * A rule template made up of a name, the decision table columns required, the
+ * decision table columns that must be empty and the contents of the rule.
*/
-public class RuleTemplate
-{
- private String name;
- private String contents;
- private List columns;
- private List notColumns;
+public class RuleTemplate {
+ private String name;
- public RuleTemplate(final String n)
- {
- name = n;
- columns = new ArrayList();
- notColumns = new ArrayList();
- }
+ private String contents;
- public String getName()
- {
- return name;
- }
+ private List columns;
- public List getColumns()
- {
- return columns;
- }
+ private TemplateContainer templateContainer;
- public String[] getNotColumns()
- {
- return (String[]) notColumns.toArray(new String[notColumns.size()]);
- }
-
- public String getContents()
- {
- return contents;
- }
+ public RuleTemplate(final String n, final TemplateContainer tc) {
+ name = n;
+ columns = new ArrayList();
+ templateContainer = tc;
+ }
- public void addColumn(String column)
- {
- if (column.startsWith("!"))
- {
- this.notColumns.add(column.substring(1));
- }
- else
- {
- this.columns.add(column);
- }
- }
+ public String getName() {
+ return name;
+ }
- public void setContents(String contents)
- {
- this.contents = replaceOptionals(contents);
- }
+ public List getColumns() {
+ return columns;
+ }
+ public String getContents() {
+ return contents;
+ }
+
+ public void addColumn(String columnString) {
+ TemplateColumn column = new DefaultTemplateColumn(templateContainer, columnString);
+ this.columns.add(column);
+ }
+
+ public void setContents(String contents) {
+ this.contents = replaceOptionals(contents);
+ }
+
/**
* @see java.lang.Object#toString()
*/
public String toString() {
- return "RuleTemplate[name,"+this.name+"notColumns,"+this.notColumns+"contents,"+this.columns+"columns";
+ return "RuleTemplate[name," + this.name + "contents," + this.columns
+ + "columns";
}
+
/*
* Replace the optional columns in the rule contents with an if statement.
* if (column is empty) do not show the line.
@@ -96,7 +84,7 @@
private String replaceOptionals(String contents) {
try {
final Pattern pattern = Pattern.compile("@\\{(.[^}]*)\\}");
- final List columns = new ArrayList(getColumns());
+ final Collection columns = getColumnNames();
columns.add("row.rowNumber");
final BufferedReader reader = new BufferedReader(new StringReader(
contents));
@@ -109,12 +97,12 @@
final String c = matcher.group(1);
if (!columns.contains(c)) {
newLine.append("@if{").append(matcher.group(1)).append(
- " != null} ");
+ " != null}");
optCols++;
}
}
newLine.append(line);
- newLine.append(StringUtils.repeat(" @end{}", optCols));
+ newLine.append(StringUtils.repeat("@end{}", optCols));
newLine.append("\n");
}
// System.out.println("newLine: " + newLine);
@@ -124,5 +112,14 @@
throw new RuntimeException(e);
}
}
-
+
+ private Collection getColumnNames() {
+ Collection columnNames = new ArrayList();
+ for (Iterator it = getColumns().iterator(); it.hasNext();) {
+ TemplateColumn column = (TemplateColumn) it.next();
+ columnNames.add(column.getName());
+ }
+ return columnNames;
+ }
+
}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringCell.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringCell.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringCell.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,80 @@
+package org.drools.decisiontable.parser;
+
+import java.util.Map;
+
+import org.drools.StatefulSession;
+import org.drools.util.StringUtils;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * A cell in a decision table containing a String value
+ */
+public class StringCell implements Cell {
+ Row row;
+
+ String value;
+
+ Column column;
+
+ private int index;
+
+ public StringCell() {
+
+ }
+ StringCell(Row r, Column c) {
+ row = r;
+ column = c;
+ }
+
+ public String toString() {
+ return "Cell[" + column + ": " + value + "]";
+ }
+
+ public Row getRow() {
+ return row;
+ }
+
+ public Column getColumn() {
+ return column;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void addValue(Map vars) {
+ vars.put(column.getName(), value);
+ }
+ public int getIndex() {
+ return index;
+ }
+ public void insert(StatefulSession session) {
+ session.insert(this);
+ }
+ public void setIndex(int i) {
+ index = i;
+ }
+ public void setValue(String v) {
+ value = v;
+ }
+ public boolean isEmpty() {
+ return StringUtils.isEmpty(value);
+ }
+}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringColumn.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringColumn.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/StringColumn.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,43 @@
+package org.drools.decisiontable.parser;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * A column of type String in a decision table
+ */
+public class StringColumn extends AbstractColumn {
+
+ public StringColumn(String n) {
+ super(n);
+ }
+
+ public void addValue(Map vars, Object value) {
+ vars.put(getName(), value);
+ }
+
+ public Cell createCell(Row row) {
+ return new StringCell(row, this);
+ }
+
+ public String getCellType() {
+ return "StringCell";
+ }
+
+}
Added: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateColumn.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateColumn.java (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateColumn.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,32 @@
+package org.drools.decisiontable.parser;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import org.drools.decisiontable.model.Rule;
+/**
+ *
+ * @author <a href="mailto:stevearoonie at gmail.com">Steven Williams</a>
+ *
+ * A column condition for a rule template to be generated.
+ */
+interface TemplateColumn {
+ void addCondition(final Rule rule);
+
+ String getName();
+
+ boolean isNotCondition();
+
+ String getCondition();
+}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateContainer.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/main/java/org/drools/decisiontable/parser/TemplateContainer.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -22,6 +22,8 @@
Map getTemplates();
Column[] getColumns();
+
+ Column getColumn(String name);
String getHeader();
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/SpreadsheetCompilerUnitTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/SpreadsheetCompilerUnitTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/SpreadsheetCompilerUnitTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -74,7 +74,7 @@
InputType.CSV );
assertNotNull( drl );
- System.out.println( drl );
+// System.out.println( drl );
assertTrue( drl.indexOf( "myObject.setIsValid(1, 2)" ) > 0 );
assertTrue( drl.indexOf( "myObject.size () > 50" ) > 0 );
Deleted: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ArrayColumnTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ArrayColumnTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ArrayColumnTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -1,58 +0,0 @@
-package org.drools.decisiontable.parser;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-public class ArrayColumnTest extends TestCase {
-
- public void testGetValueSingle() {
- ArrayColumn ac = new ArrayColumn("array column");
- String[] value = (String[]) ac.getValue("value1");
- assertEquals(1, value.length);
- assertEquals("value1", value[0]);
- }
-
- public void testGetValueTrailingComma() {
- ArrayColumn ac = new ArrayColumn("array column");
- String[] value = (String[]) ac.getValue("value1,");
- assertEquals(2, value.length);
- assertEquals("value1", value[0]);
- assertEquals("", value[1]);
- }
-
- public void testGetValueLeadingComma() {
- ArrayColumn ac = new ArrayColumn("array column");
- String[] value = (String[]) ac.getValue(",value2");
- assertEquals(2, value.length);
- assertEquals("value2", value[1]);
- }
-
- public void testGetValueMultiple() {
- ArrayColumn ac = new ArrayColumn("array column");
- String[] value = (String[]) ac.getValue("value1,value2,value3");
- assertEquals(3, value.length);
- assertEquals("value1", value[0]);
- assertEquals("value2", value[1]);
- assertEquals("value3", value[2]);
- }
-
- public void testAddValueSingle() {
- ArrayColumn ac = new ArrayColumn("array");
- String[] value = new String[] { "value" };
- Map vars = new HashMap();
- ac.addValue(vars, value);
- assertEquals("value", vars.get("array0"));
- }
-
- public void testAddValueMultiple() {
- ArrayColumn ac = new ArrayColumn("array");
- String[] value = new String[] { "value1", "value2" };
- Map vars = new HashMap();
- ac.addValue(vars, value);
- assertEquals("value1", vars.get("array0"));
- assertEquals("value2", vars.get("array1"));
- }
-
-}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ColumnFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ColumnFactoryTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ColumnFactoryTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -7,15 +7,50 @@
public void testGetColumn() {
ColumnFactory f = new ColumnFactory();
Column column = f.getColumn("column");
- assertTrue(!(column instanceof ArrayColumn));
+ assertTrue(column instanceof StringColumn);
assertEquals("column", column.getName());
}
+
+ public void testGetStringArrayColumn() {
+ ColumnFactory f = new ColumnFactory();
+ Column column = f.getColumn("column: String[]");
+ assertTrue(column instanceof ArrayColumn);
+ assertEquals("column", column.getName());
+ assertEquals("StringCell", ((ArrayColumn)column).getCellType());
+ }
- public void testGetArrayColumn() {
+ public void testGetLongArrayColumn() {
ColumnFactory f = new ColumnFactory();
+ Column column = f.getColumn("column: Long[]");
+ assertTrue(column instanceof ArrayColumn);
+ assertEquals("column", column.getName());
+ assertEquals("LongCell", ((ArrayColumn)column).getCellType());
+ }
+
+ public void testGetArrayColumnSimple() {
+ ColumnFactory f = new ColumnFactory();
Column column = f.getColumn("column[]");
assertTrue(column instanceof ArrayColumn);
assertEquals("column", column.getName());
+ assertEquals("StringCell", ((ArrayColumn)column).getCellType());
+
}
+ public void testGetLongColumn() {
+ ColumnFactory f = new ColumnFactory();
+ Column column = f.getColumn("column: Long");
+ assertTrue(column instanceof LongColumn);
+ assertEquals("column", column.getName());
+ }
+
+ public void testInvalidGetColumn() {
+ try {
+ ColumnFactory f = new ColumnFactory();
+ f.getColumn("column$");
+ fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException expected) {
+
+ }
+ }
+
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultGeneratorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultGeneratorTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultGeneratorTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -10,11 +10,34 @@
protected void setUp() throws Exception {
Map t = new HashMap();
- RuleTemplate rt1 = new RuleTemplate("rt1");
+ TemplateContainer tc = new TemplateContainer() {
+
+ public Column getColumn(String name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Column[] getColumns() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getHeader() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Map getTemplates() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ };
+ RuleTemplate rt1 = new RuleTemplate("rt1", tc);
rt1.setContents("Test template 1");
- RuleTemplate rt2 = new RuleTemplate("rt2");
+ RuleTemplate rt2 = new RuleTemplate("rt2", tc);
rt2.setContents("Test template 2");
- RuleTemplate rt3 = new RuleTemplate("rt3");
+ RuleTemplate rt3 = new RuleTemplate("rt3", tc);
rt3.addColumn("col1");
rt3.addColumn("col2");
rt3.setContents("@{row.rowNumber} @{col1} @{col2}");
@@ -38,12 +61,13 @@
}
public void testAddColumns() {
- Column[] columns = {new Column("col1"), new Column("col2")};
+ Column[] columns = {new StringColumn("col1"), new StringColumn("col2")};
Row r = new Row(1, columns);
r.getCell(0).setValue("value1");
r.getCell(1).setValue("value2");
-// r.addCell(new Cell(r, new Column("col1"), "value1"));
-// r.addCell(new Cell(r, new Column("col2"), "value2"));
+// Row r = new Row(1);
+// r.addCell(new StringCell(r, new StringColumn("col1"), "value1"));
+// r.addCell(new StringCell(r, new StringColumn("col2"), "value2"));
g.generate("rt3", r);
String drl = g.getDrl();
assertEquals("1 value1 value2\n\n", drl);
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateContainerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateContainerTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateContainerTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -7,135 +7,150 @@
import junit.framework.TestCase;
public class DefaultTemplateContainerTest extends TestCase {
- public void testParseTemplate() {
- InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_simple.drl" );
- DefaultTemplateContainer t = new DefaultTemplateContainer( is );
- assertEquals( "package This_is_a_ruleset;\n",
- t.getHeader() );
- assertEquals( 1,
- t.getColumns().length );
- assertEquals( "name",
- t.getColumns()[0].getName() );
- Map templates = t.getTemplates();
- assertEquals( 1,
- templates.size() );
- RuleTemplate template = (RuleTemplate) templates.get( "template1" );
- assertNotNull( template );
- List columns = template.getColumns();
- assertEquals( 1,
- columns.size() );
- assertEquals( "name",
- columns.get( 0 ) );
- String contents = template.getContents();
- assertTrue( contents.startsWith( "rule \"How cool is @{name} @{row.rowNumber}\"" ) );
- assertTrue( contents.endsWith( "then\nend\n" ) );
- }
+ public void testParseTemplate() {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_simple.drl");
+ DefaultTemplateContainer t = new DefaultTemplateContainer(is);
+ assertEquals("package This_is_a_ruleset;\n", t.getHeader());
+ assertEquals(1, t.getColumns().length);
+ assertEquals("name", t.getColumns()[0].getName());
+ Map templates = t.getTemplates();
+ assertEquals(1, templates.size());
+ RuleTemplate template = (RuleTemplate) templates.get("template1");
+ assertNotNull(template);
+ List columns = template.getColumns();
+ assertEquals(1, columns.size());
+ TemplateColumn column = (TemplateColumn) columns.get(0);
+ assertEquals("name", column.getName());
+ String contents = template.getContents();
+ assertTrue(contents
+ .startsWith("rule \"How cool is @{name} @{row.rowNumber}\""));
+ assertTrue(contents.endsWith("then\nend\n"));
+ }
- public void testParseTemplateNoHeader() {
- try {
- InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid1.drl" );
- new DefaultTemplateContainer( is );
- fail( "DecisionTableParseException expected" );
- } catch ( DecisionTableParseException expected ) {
- assertEquals( "Missing header",
- expected.getMessage() );
- }
- }
+ public void testParseTemplateConditions() {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_conditions.drl");
+ DefaultTemplateContainer t = new DefaultTemplateContainer(is);
+ assertEquals("package This_is_a_ruleset;\n", t.getHeader());
+ assertEquals(1, t.getColumns().length);
+ assertEquals("name", t.getColumns()[0].getName());
+ Map templates = t.getTemplates();
+ assertEquals(1, templates.size());
+ RuleTemplate template = (RuleTemplate) templates.get("template1");
+ assertNotNull(template);
+ List columns = template.getColumns();
+ assertEquals(1, columns.size());
+ TemplateColumn templateColumn = (TemplateColumn) columns.get(0);
+ assertEquals("name", templateColumn.getName());
+ assertEquals("== \"name1\"", templateColumn.getCondition());
+ String contents = template.getContents();
+ assertTrue(contents
+ .startsWith("rule \"How cool is @{name} @{row.rowNumber}\""));
+ assertTrue(contents.endsWith("then\nend\n"));
+ }
- public void testParseTemplateNoHeaderColumns() {
- try {
- InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid2.drl" );
- new DefaultTemplateContainer( is );
- fail( "DecisionTableParseException expected" );
- } catch ( DecisionTableParseException expected ) {
- assertEquals( "Missing header columns",
- expected.getMessage() );
- }
- }
+ public void testParseTemplateNoHeader() {
+ try {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_invalid1.drl");
+ new DefaultTemplateContainer(is);
+ fail("DecisionTableParseException expected");
+ } catch (DecisionTableParseException expected) {
+ assertEquals("Missing header", expected.getMessage());
+ }
+ }
- public void testParseTemplateNoTemplates() {
- try {
- InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid3.drl" );
- new DefaultTemplateContainer( is );
- fail( "DecisionTableParseException expected" );
- } catch ( DecisionTableParseException expected ) {
- assertEquals( "Missing templates",
- expected.getMessage() );
- }
- }
+ public void testParseTemplateNoHeaderColumns() {
+ try {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_invalid2.drl");
+ new DefaultTemplateContainer(is);
+ fail("DecisionTableParseException expected");
+ } catch (DecisionTableParseException expected) {
+ assertEquals("Missing header columns", expected.getMessage());
+ }
+ }
- public void testParseTemplateNoEndTemplate() {
- try {
- InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_invalid4.drl" );
- new DefaultTemplateContainer( is );
- fail( "DecisionTableParseException expected" );
- } catch ( DecisionTableParseException expected ) {
- assertEquals( "Missing end template",
- expected.getMessage() );
- }
- }
+ public void testParseTemplateNoTemplates() {
+ try {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_invalid3.drl");
+ new DefaultTemplateContainer(is);
+ fail("DecisionTableParseException expected");
+ } catch (DecisionTableParseException expected) {
+ assertEquals("Missing templates", expected.getMessage());
+ }
+ }
- public void testNullInputStream() {
- try {
- new DefaultTemplateContainer( (InputStream) null );
- fail( "NullPointerException expected" );
- } catch ( NullPointerException expected ) {
- }
- }
+ public void testParseTemplateNoEndTemplate() {
+ try {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_invalid4.drl");
+ new DefaultTemplateContainer(is);
+ fail("DecisionTableParseException expected");
+ } catch (DecisionTableParseException expected) {
+ assertEquals("Missing end template", expected.getMessage());
+ }
+ }
- public void testInvalidTemplatePath() {
- try {
- new DefaultTemplateContainer( "invalid path" );
- fail( "NullPointerException expected" );
- } catch ( NullPointerException expected ) {
- }
- }
+ public void testNullInputStream() {
+ try {
+ new DefaultTemplateContainer((InputStream) null);
+ fail("NullPointerException expected");
+ } catch (NullPointerException expected) {
+ }
+ }
- public void testParseComplexTemplate() {
- InputStream is = DefaultTemplateContainerTest.class.getResourceAsStream( "/templates/test_template_complex.drl" );
- DefaultTemplateContainer t = new DefaultTemplateContainer( is );
- assertEquals( "package This_is_a_ruleset;\n",
- t.getHeader() );
- Column[] columnList = t.getColumns();
- assertEquals( 5,
- columnList.length );
- assertEquals( "first_name",
- columnList[0].getName() );
- assertEquals( "last_name",
- columnList[1].getName() );
- assertEquals( "age",
- columnList[2].getName() );
- assertEquals( "city",
- columnList[3].getName() );
- assertEquals( "phone",
- columnList[4].getName() );
- Map templates = t.getTemplates();
- assertEquals( 2,
- templates.size() );
+ public void testInvalidTemplatePath() {
+ try {
+ new DefaultTemplateContainer("invalid path");
+ fail("NullPointerException expected");
+ } catch (NullPointerException expected) {
+ }
+ }
- RuleTemplate template = (RuleTemplate) templates.get( "template1" );
- assertNotNull( template );
- List columns = template.getColumns();
- assertEquals( 1,
- columns.size() );
- assertEquals( "first_name",
- columns.get( 0 ) );
- String contents = template.getContents();
- assertTrue( contents.startsWith( "rule \"How cool is @{first_name} @{row.rowNumber}\"" ) );
- assertTrue( contents.endsWith( "then\nend\n" ) );
+ public void testParseComplexTemplate() {
+ InputStream is = DefaultTemplateContainerTest.class
+ .getResourceAsStream("/templates/test_template_complex.drl");
+ DefaultTemplateContainer t = new DefaultTemplateContainer(is);
+ assertEquals("package This_is_a_ruleset;\n", t.getHeader());
+ Column[] columnList = t.getColumns();
+ assertEquals(5, columnList.length);
+ assertEquals("first_name", columnList[0].getName());
+ assertEquals("last_name", columnList[1].getName());
+ assertEquals("age", columnList[2].getName());
+ assertEquals("city", columnList[3].getName());
+ assertEquals("phone", columnList[4].getName());
+ assertEquals(columnList[1], t.getColumn("last_name"));
+ Map templates = t.getTemplates();
+ assertEquals(2, templates.size());
- template = (RuleTemplate) templates.get( "template2" );
- assertNotNull( template );
- columns = template.getColumns();
- assertEquals( 2,
- columns.size() );
- assertEquals( "first_name",
- columns.get( 0 ) );
- assertEquals( "last_name",
- columns.get( 1 ) );
- contents = template.getContents();
- assertTrue( contents.startsWith( "rule \"How uncool is @{first_name} @{row.rowNumber}\"" ) );
- assertTrue( contents.endsWith( "then\nend\n" ) );
+ RuleTemplate template = (RuleTemplate) templates.get("template1");
+ assertNotNull(template);
+ List columns = template.getColumns();
+ assertEquals(1, columns.size());
+ TemplateColumn column = (TemplateColumn) columns.get(0);
+ assertEquals("first_name", column.getName());
+
+ String contents = template.getContents();
+ assertTrue(contents
+ .startsWith("rule \"How cool is @{first_name} @{row.rowNumber}\""));
+ assertTrue(contents.endsWith("then\nend\n"));
- }
+ template = (RuleTemplate) templates.get("template2");
+ assertNotNull(template);
+ columns = template.getColumns();
+ assertEquals(2, columns.size());
+ column = (TemplateColumn) columns.get(0);
+ assertEquals("first_name", column.getName());
+ TemplateColumn column2 = (TemplateColumn) columns.get(1);
+ assertEquals("last_name", column2.getName());
+ contents = template.getContents();
+ assertTrue(contents
+ .startsWith("rule \"How uncool is @{first_name} @{row.rowNumber}\""));
+ assertTrue(contents.endsWith("then\nend\n"));
+
+
+ }
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateRuleBaseTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateRuleBaseTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/DefaultTemplateRuleBaseTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -9,18 +9,21 @@
import org.drools.rule.LiteralConstraint;
import org.drools.rule.Package;
import org.drools.rule.Rule;
+import org.drools.rule.VariableConstraint;
public class DefaultTemplateRuleBaseTest extends TestCase {
public void testSimpleTemplate() throws Exception
{
TemplateContainer tc = new TemplateContainer() {
-
+ private Column[] columns = new Column[] {
+ new LongColumn("column1"),
+ new LongColumn("column2"),
+ new StringColumn("column3")
+ };
+
public Column[] getColumns() {
- return new Column[] {
- new Column("column1"),
- new Column("column2")
- };
+ return columns;
}
public String getHeader() {
@@ -29,12 +32,17 @@
public Map getTemplates() {
Map templates = new HashMap();
- RuleTemplate ruleTemplate = new RuleTemplate("template1");
- ruleTemplate.addColumn("column1");
- ruleTemplate.addColumn("column2");
+ RuleTemplate ruleTemplate = new RuleTemplate("template1", this);
+ ruleTemplate.addColumn("column1 == 10");
+ ruleTemplate.addColumn("column2 < 5 || > 20");
+ ruleTemplate.addColumn("column3 == \"xyz\"");
templates.put("template1", ruleTemplate);
return templates;
}
+
+ public Column getColumn(String name) {
+ return columns[Integer.parseInt(name.substring(6)) - 1];
+ }
};
DefaultTemplateRuleBase ruleBase = new DefaultTemplateRuleBase(tc);
@@ -48,14 +56,42 @@
GroupElement lhs = rules[0].getLhs();
//when
// r : Row()
- // Cell(row == r, column == "column1")
- // Cell(row == r, column == "column2")
- assertEquals(3, lhs.getChildren().size());
+ // column1 : Column(name == "column1")
+ // exists LongCell(row == r, column == column1, value == 10)
+ // column2 : Column(name == "column2")
+ // exists LongCell(row == r, column == column2, value < 5 | > 20)
+ // column3 : Column(name == "column3")
+ // exists StringCell(row == r, column == column3, value == "xyz")
+ assertEquals(7, lhs.getChildren().size());
org.drools.rule.Pattern pattern = (org.drools.rule.Pattern) lhs.getChildren().get(1);
- LiteralConstraint constraint = (LiteralConstraint) pattern.getConstraints().get(1);
+ assertEquals(1, pattern.getConstraints().size());
+ LiteralConstraint constraint = (LiteralConstraint) pattern.getConstraints().get(0);
assertEquals("column1", constraint.getField().getValue());
- pattern = (org.drools.rule.Pattern) lhs.getChildren().get(2);
- constraint = (LiteralConstraint) pattern.getConstraints().get(1);
+ GroupElement exists = (GroupElement) lhs.getChildren().get(2);
+ pattern = (org.drools.rule.Pattern) exists.getChildren().get(0);
+ assertEquals(3, pattern.getConstraints().size());
+ VariableConstraint vconstraint = (VariableConstraint) pattern.getConstraints().get(1);
+ assertEquals(Column.class, vconstraint.getFieldExtractor().getExtractToClass());
+ assertEquals("column1", vconstraint.getRequiredDeclarations()[0].getIdentifier());
+ pattern = (org.drools.rule.Pattern) lhs.getChildren().get(3);
+ assertEquals(1, pattern.getConstraints().size());
+ constraint = (LiteralConstraint) pattern.getConstraints().get(0);
assertEquals("column2", constraint.getField().getValue());
+ exists = (GroupElement) lhs.getChildren().get(4);
+ pattern = (org.drools.rule.Pattern) exists.getChildren().get(0);
+ assertEquals(3, pattern.getConstraints().size());
+ vconstraint = (VariableConstraint) pattern.getConstraints().get(1);
+ assertEquals(Column.class, vconstraint.getFieldExtractor().getExtractToClass());
+ assertEquals("column2", vconstraint.getRequiredDeclarations()[0].getIdentifier());
+ pattern = (org.drools.rule.Pattern) lhs.getChildren().get(5);
+ assertEquals(1, pattern.getConstraints().size());
+ constraint = (LiteralConstraint) pattern.getConstraints().get(0);
+ assertEquals("column3", constraint.getField().getValue());
+ exists = (GroupElement) lhs.getChildren().get(6);
+ pattern = (org.drools.rule.Pattern) exists.getChildren().get(0);
+ assertEquals(3, pattern.getConstraints().size());
+ vconstraint = (VariableConstraint) pattern.getConstraints().get(1);
+ assertEquals(Column.class, vconstraint.getFieldExtractor().getExtractToClass());
+ assertEquals("column3", vconstraint.getRequiredDeclarations()[0].getIdentifier());
}
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -70,9 +70,9 @@
// first column is not part of the decision table
int i = 1;
for (Iterator it2 = cells.iterator(); it2.hasNext(); i++) {
- Cell cell = (Cell) it2.next();
+ StringCell cell = (StringCell) it2.next();
assertEquals("row" + row.getRowNumber() + "col" + i, cell.getValue());
- assertEquals("Pattern " + i, cell.getColumn());
+ assertEquals("Pattern " + i, cell.getColumn().getName());
}
}
}
@@ -126,7 +126,7 @@
if (fact instanceof Row) {
assertedRows.put(fact, currentRow);
currentRow = new ArrayList();
- } else {
+ } else if (fact instanceof Cell) {
currentRow.add(fact);
}
return null;
@@ -406,8 +406,8 @@
}
public Column[] getColumns() {
- return new Column[] { new Column("Pattern 1"),
- new Column("Pattern 2"), new Column("Pattern 3") };
+ return new Column[] { new StringColumn("Pattern 1"),
+ new StringColumn("Pattern 2"), new StringColumn("Pattern 3") };
}
public String getHeader() {
@@ -424,6 +424,10 @@
public void setTemplates(Map templates) {
}
+
+ public Column getColumn(String name) {
+ return null;
+ }
}
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/RuleTemplateTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/RuleTemplateTest.java 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/RuleTemplateTest.java 2007-10-01 14:32:06 UTC (rev 15482)
@@ -1,11 +1,70 @@
package org.drools.decisiontable.parser;
+import java.util.List;
+import java.util.Map;
+
import junit.framework.TestCase;
+import org.drools.util.StringUtils;
+
public class RuleTemplateTest extends TestCase {
public void testSetContents() {
- RuleTemplate rt = new RuleTemplate("rt1");
+ RuleTemplate rt = new RuleTemplate("rt1", getTemplateContainer());
rt.setContents("Test template");
assertEquals("Test template\n", rt.getContents());
}
+
+ private TemplateContainer getTemplateContainer() {
+ return new TemplateContainer() {
+
+ public Column getColumn(String name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Column[] getColumns() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getHeader() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Map getTemplates() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ };
+ }
+
+ public void testAddColumn() {
+ RuleTemplate rt = new RuleTemplate("rt1", getTemplateContainer());
+ rt.addColumn("StandardColumn");
+ rt.addColumn("!NotColumn");
+ rt.addColumn("ColumnCondition == \"test\"");
+ rt.addColumn("!NotColumnCondition == \"test2\"");
+ rt.addColumn("ArrayColumnCondition[0] == \"test2\"");
+ List columns = rt.getColumns();
+ assertEquals(5, columns.size());
+ TemplateColumn column1 = (TemplateColumn) columns.get(0);
+ assertEquals("StandardColumn", column1.getName());
+ assertFalse(column1.isNotCondition());
+ assertTrue(StringUtils.isEmpty(column1.getCondition()));
+ TemplateColumn column2 = (TemplateColumn) columns.get(1);
+ assertEquals("NotColumn", column2.getName());
+ assertTrue(column2.isNotCondition());
+ assertTrue(StringUtils.isEmpty(column2.getCondition()));
+ TemplateColumn column3 = (TemplateColumn) columns.get(2);
+ assertEquals("ColumnCondition", column3.getName());
+ assertFalse(column3.isNotCondition());
+ assertEquals("== \"test\"", column3.getCondition());
+ TemplateColumn column4 = (TemplateColumn) columns.get(3);
+ assertEquals("NotColumnCondition", column4.getName());
+ assertTrue(column4.isNotCondition());
+ assertEquals("== \"test2\"", column4.getCondition());
+
+ }
}
Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_integration.drl
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_integration.drl 2007-10-01 11:59:51 UTC (rev 15481)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_integration.drl 2007-10-01 14:32:06 UTC (rev 15482)
@@ -1,5 +1,5 @@
template header
-age
+age: Long
type
log
@@ -10,7 +10,7 @@
global java.util.List list;
template "cheesefans"
-age
+age > 21 && < 43
type
log
Added: labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_template_conditions.drl
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_template_conditions.drl (rev 0)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/resources/templates/test_template_conditions.drl 2007-10-01 14:32:06 UTC (rev 15482)
@@ -0,0 +1,14 @@
+template header
+name
+
+package This_is_a_ruleset;
+
+template "template1"
+name == "name1"
+rule "How cool is @{name} @{row.rowNumber}"
+ when
+ user.getName().equals("@{name}")
+ then
+end
+end template
+
More information about the jboss-svn-commits
mailing list