[jboss-svn-commits] JBL Code SVN: r32282 - in labs/jbossrules/trunk/drools-factconstraint: src/main/java/org/drools/factconstraints/client and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Mar 29 14:05:49 EDT 2010
Author: eaa
Date: 2010-03-29 14:05:47 -0400 (Mon, 29 Mar 2010)
New Revision: 32282
Added:
labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultMultiRulesConstraintImpl.java
labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintSingleOperatorTest.java
Modified:
labs/jbossrules/trunk/drools-factconstraint/pom.xml
labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultConstraintImpl.java
labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/predefined/RangeConstraint.java
Log:
Added dependencies to drools-core and drools-verifier
Initial support for multiple operators.
Modified RangeConstraint to create multiple rules.
Modified: labs/jbossrules/trunk/drools-factconstraint/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/pom.xml 2010-03-29 18:01:03 UTC (rev 32281)
+++ labs/jbossrules/trunk/drools-factconstraint/pom.xml 2010-03-29 18:05:47 UTC (rev 32282)
@@ -21,7 +21,12 @@
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-verifier</artifactId>
- <scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-core</artifactId>
+ <version>5.1.0.SNAPSHOT</version>
+ <type>jar</type>
+ </dependency>
</dependencies>
</project>
Modified: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultConstraintImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultConstraintImpl.java 2010-03-29 18:01:03 UTC (rev 32281)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultConstraintImpl.java 2010-03-29 18:05:47 UTC (rev 32282)
@@ -1,9 +1,11 @@
package org.drools.factconstraints.client;
-
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.drools.base.evaluators.Operator;
+import org.drools.verifier.report.components.Severity;
/**
*
@@ -15,19 +17,18 @@
private String factType;
private String fieldName;
private Map<String, String> arguments = new HashMap<String, String>();
- /*
- private String verifierPackageTemplate = "";
- private String verifierImportsTemplate = "";
- private String verifierGlobalsTemplate = "";
- private String verifierRuleNameTemplate = "";
- private String verifierRuleWhenTemplate = "";
- private String verifierFieldPatternTemplate = "";
- private String verifierRestrictionPatternTemplate = "";
- private String verifierRuleThenTemplate = "";
- private String verifierActionTemplate = "";
- private String verifierRuleEndTemplate = "";
- */
+
+ public static List<Operator> supportedOperators = new ArrayList<Operator>();
+ static{
+ supportedOperators.add(Operator.EQUAL);
+ supportedOperators.add(Operator.NOT_EQUAL);
+ supportedOperators.add(Operator.GREATER);
+ supportedOperators.add(Operator.GREATER_OR_EQUAL);
+ supportedOperators.add(Operator.LESS);
+ supportedOperators.add(Operator.LESS_OR_EQUAL);
+ }
+
public DefaultConstraintImpl() {
}
@@ -78,9 +79,9 @@
protected String createVerifierRuleTemplate(String ruleName, List<String> constraints, String message) {
if (ruleName == null) {
ruleName = "Constraint_rule";
-
+
}
- ruleName += "_" + ruleNum++;
+ ruleName += "_" + ruleNum++;
String rule = this.concatRule().replace("${ruleName}", ruleName);
rule = rule.replace("${factType}", this.getFactType());
rule = rule.replace("${fieldName}", this.getFieldName());
@@ -156,28 +157,43 @@
public String getConstraintName() {
return getClass().getName().substring(getClass().getName().lastIndexOf('.') + 1);
}
-
+
/* Action */
protected String getVerifierActionTemplate() {
StringBuilder verifierActionTemplate = new StringBuilder();
- verifierActionTemplate.append(" Map<String,String> impactedRules = new HashMap<String,String>();\n");
-// verifierActionTemplate.append(" impactedRules.put( $restriction.getPath(), $restriction.getRuleName());\n");
-// verifierActionTemplate.append(" impactedRules.put( $r.getPath(), $r.getName());\n");
- verifierActionTemplate.append(" result.add(new VerifierMessage(\n");
- verifierActionTemplate.append(" impactedRules,\n");
- verifierActionTemplate.append(" Severity.ERROR,\n");
- verifierActionTemplate.append(" MessageType.NOT_SPECIFIED,\n");
- verifierActionTemplate.append(" $restriction,\n");
- verifierActionTemplate.append(" \"${message}\" ) );\n");
+ //by default, add an ERROR
+ verifierActionTemplate.append(this.addResult(Severity.ERROR));
+
// verifierActionTemplate.append(" System.out.println(\"doubleValue= \"+$restriction.getDoubleValue());\n");
// verifierActionTemplate.append(" System.out.println(\"intValue= \"+$restriction.getIntValue());\n");
return verifierActionTemplate.toString();
}
+ protected String addResult(Severity severity){
+ StringBuilder addString = new StringBuilder();
+ addString.append(" result.add(new VerifierMessage(\n");
+ addString.append(" impactedRules,\n");
+ if (severity.compareTo(Severity.ERROR) == 0){
+ addString.append(" Severity.ERROR,\n");
+ }else if(severity.compareTo(Severity.NOTE) == 0){
+ addString.append(" Severity.NOTE,\n");
+ }else if(severity.compareTo(Severity.WARNING) == 0){
+ addString.append(" Severity.WARNING,\n");
+ }
+ addString.append(" MessageType.NOT_SPECIFIED,\n");
+ addString.append(" $restriction,\n");
+ addString.append(" \"${message}\" ) );\n");
+ return addString.toString();
+ }
+
protected String getVerifierActionPrefixTemplate() {
- return "";
+ StringBuilder verifierActionPrefixTemplate = new StringBuilder();
+ verifierActionPrefixTemplate.append(" Map<String,String> impactedRules = new HashMap<String,String>();\n");
+// verifierActionTemplate.append(" impactedRules.put( $restriction.getPath(), $restriction.getRuleName());\n");
+// verifierActionTemplate.append(" impactedRules.put( $r.getPath(), $r.getName());\n");
+ return verifierActionPrefixTemplate.toString();
}
protected String getVerifierActionSufixTemplate() {
@@ -257,7 +273,7 @@
verifierRestrictionPatternTemplate.append(" fieldPath == $field.path,\n");
verifierRestrictionPatternTemplate.append(" ${constraints}\n");
verifierRestrictionPatternTemplate.append(" )\n");
-
+
return verifierRestrictionPatternTemplate.toString();
}
@@ -301,5 +317,5 @@
return " when\n";
}
-
+
}
Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultMultiRulesConstraintImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultMultiRulesConstraintImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/DefaultMultiRulesConstraintImpl.java 2010-03-29 18:05:47 UTC (rev 32282)
@@ -0,0 +1,94 @@
+package org.drools.factconstraints.client;
+
+/**
+ * Default implementation for constraints that creates more than one rule
+ * in its {@link #getVerifierRule()} method.
+ * This class contains an internal counter to avoid multiple declaration of
+ * package, imports and globals.
+ * The counter must be handled by subclasses.
+ * @author esteban.aliverti at gmail.com
+ */
+public class DefaultMultiRulesConstraintImpl extends DefaultConstraintImpl {
+
+ private int ruleCount;
+
+ protected void resetRuleCount(){
+ this.ruleCount = 0;
+ }
+
+ protected void incrementRuleCount(){
+ this.ruleCount++;
+ }
+
+ @Override
+ protected String getVerifierGlobalsPrefixTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierGlobalsPrefixTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierGlobalsSufixTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierGlobalsSufixTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierGlobalsTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierGlobalsTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierImportsPrefixTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierImportsPrefixTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierImportsSufixTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierImportsSufixTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierImportsTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierImportsTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierPackagePrefixTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierPackagePrefixTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierPackageSufixTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierPackageSufixTemplate();
+ }
+ return "";
+ }
+
+ @Override
+ protected String getVerifierPackageTemplate() {
+ if (ruleCount == 0) {
+ return super.getVerifierPackageTemplate();
+ }
+ return "";
+ }
+}
Modified: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/predefined/RangeConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/predefined/RangeConstraint.java 2010-03-29 18:01:03 UTC (rev 32281)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraints/client/predefined/RangeConstraint.java 2010-03-29 18:05:47 UTC (rev 32282)
@@ -1,18 +1,22 @@
package org.drools.factconstraints.client.predefined;
+import org.drools.base.evaluators.Operator;
import org.drools.factconstraints.client.ArgumentNotSetException;
-import org.drools.factconstraints.client.DefaultConstraintImpl;
+import org.drools.factconstraints.client.DefaultMultiRulesConstraintImpl;
import org.drools.factconstraints.client.ValidationResult;
+import org.drools.verifier.report.components.Severity;
/**
*
* @author esteban.aliverti at gmail.com
*/
-public class RangeConstraint extends DefaultConstraintImpl {
+public class RangeConstraint extends DefaultMultiRulesConstraintImpl {
public static final String RANGE_CONSTRAINT_MIN = "Min.value";
public static final String RANGE_CONSTRAINT_MAX = "Max.value";
+ private Operator currentOperator;
+
public RangeConstraint() {
//set default values
this.setArgumentValue(RANGE_CONSTRAINT_MIN, "0");
@@ -21,9 +25,27 @@
@Override
public String getVerifierRule() {
- return this.createVerifierRuleTemplate("Range_Field_Constraint", null, "The value must be between " + getMin() + " and " + getMax()); //I18N
+
+ this.resetRuleCount();
+
+ StringBuilder rules = new StringBuilder();
+ for (Operator operator : RangeConstraint.supportedOperators) {
+ this.currentOperator = operator;
+ rules.append(this.createVerifierRuleTemplate("Range_Field_Constraint_"+this.currentOperator.getOperatorString(), null, this.getResultMessage()));
+ this.incrementRuleCount();
+ }
+
+ return rules.toString();
}
+ private String getResultMessage(){
+ if (this.currentOperator.getOperatorString().equals(Operator.NOT_EQUAL.getOperatorString())){
+ return "The value must be between " + getMin() + " and " + getMax(); //I18N
+ }else{
+ return "The value must be between " + getMin() + " and " + getMax(); //I18N
+ }
+ }
+
@Override
public ValidationResult validate(Object value) {
ValidationResult result = new ValidationResult();
@@ -37,7 +59,7 @@
result.setMessage("Invalid value type " + value.getClass().getName()); //TODO: I18N
}
} else {
- double min = Double.parseDouble(getMin()) ;
+ double min = Double.parseDouble(getMin());
double max = Double.parseDouble(getMax());
double d = Double.parseDouble(value.toString());
result.setSuccess(d > min && d < max);
@@ -54,36 +76,63 @@
}
public String getMin() {
- try {
- return (String) this.getMandatoryArgument(RANGE_CONSTRAINT_MIN);
- } catch (ArgumentNotSetException e) {
- throw new IllegalStateException(e);
- }
+ try {
+ return (String) this.getMandatoryArgument(RANGE_CONSTRAINT_MIN);
+ } catch (ArgumentNotSetException e) {
+ throw new IllegalStateException(e);
+ }
}
-
+
public String getMax() {
- try {
- return (String) this.getMandatoryArgument(RANGE_CONSTRAINT_MAX);
- } catch (ArgumentNotSetException e) {
- throw new IllegalStateException(e);
- }
+ try {
+ return (String) this.getMandatoryArgument(RANGE_CONSTRAINT_MAX);
+ } catch (ArgumentNotSetException e) {
+ throw new IllegalStateException(e);
+ }
}
-
+
@Override
protected String getVerifierRestrictionPatternTemplate() {
StringBuilder restrictionPattern = new StringBuilder();
restrictionPattern.append(" ($restriction :LiteralRestriction(\n");
restrictionPattern.append(" fieldPath == $field.path,\n");
- restrictionPattern.append(" valueType == Field.INT,\n");
- restrictionPattern.append(" intValue < " + getMin() + " || > " + getMax() + "\n");
- restrictionPattern.append(" ) OR\n");
- restrictionPattern.append(" $restriction :LiteralRestriction(\n");
- restrictionPattern.append(" fieldPath == $field.path,\n");
- restrictionPattern.append(" valueType == Field.DOUBLE,\n");
- restrictionPattern.append(" doubleValue < " + getMin() + " || > " + getMax() + "\n");
- restrictionPattern.append(" ))\n");
+ restrictionPattern.append(this.getOperatorPattern());
+ restrictionPattern.append(" ((valueType == Field.INT && (intValue < " + getMin() + " || > " + getMax() + ")) ");
+ restrictionPattern.append(" || ");
+ restrictionPattern.append(" (valueType == Field.DOUBLE && (doubleValue < " + getMin() + " || > " + getMax() + ")) ");
+ restrictionPattern.append(" )))\n");
return restrictionPattern.toString();
}
+
+ private String getOperatorPattern() {
+ return " operator.operatorString == '"+this.currentOperator.getOperatorString()+"',\n";
+ }
+
+ @Override
+ protected String getVerifierActionTemplate() {
+ StringBuilder verifierActionTemplate = new StringBuilder();
+
+
+ if (this.currentOperator.getOperatorString().equals(Operator.EQUAL.getOperatorString())){
+ verifierActionTemplate.append(this.addResult(Severity.ERROR));
+ } else if (this.currentOperator.getOperatorString().equals(Operator.NOT_EQUAL.getOperatorString())){
+ verifierActionTemplate.append(this.addResult(Severity.WARNING));
+ } else{
+ return super.getVerifierActionTemplate();
+ }
+
+ return verifierActionTemplate.toString();
+ }
+
+// @Override
+// protected String getVerifierImportsSufixTemplate() {
+// return "import org.drools.base.evaluators.Operator;\n";
+// }
+//
+// @Override
+// protected String getVerifierActionSufixTemplate() {
+// return "System.out.println(\"OPERATOR= \"+$restriction.getOperator().getOperatorString()+\". Operator.EQUAL= \"+Operator.EQUAL.getOperatorString());\n";
+// }
}
Added: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintSingleOperatorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintSingleOperatorTest.java (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintSingleOperatorTest.java 2010-03-29 18:05:47 UTC (rev 32282)
@@ -0,0 +1,176 @@
+package org.drools.factconstraint;
+
+import java.util.Collection;
+import org.drools.builder.ResourceType;
+import org.drools.factconstraints.client.Constraint;
+import org.drools.factconstraints.client.predefined.RangeConstraint;
+import org.drools.io.ResourceFactory;
+import org.drools.verifier.Verifier;
+import org.drools.verifier.VerifierConfiguration;
+import org.drools.verifier.VerifierConfigurationImpl;
+import org.drools.verifier.VerifierError;
+import org.drools.verifier.builder.VerifierBuilder;
+import org.drools.verifier.builder.VerifierBuilderFactory;
+import org.drools.verifier.data.VerifierReport;
+import org.drools.verifier.report.components.Severity;
+import org.drools.verifier.report.components.VerifierMessageBase;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class RangeConstraintSingleOperatorTest {
+
+ private Verifier verifier;
+ private Constraint cons;
+
+ @Before
+ public void setup() {
+ cons = new RangeConstraint();
+ cons.setFactType("Person");
+ cons.setFieldName("age");
+
+ System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+ }
+
+ @After
+ public void dispose(){
+ if (verifier != null){
+ verifier.dispose();
+ }
+ }
+
+ @Test
+ public void testEq() {
+
+ //age constraint
+ cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MIN, "0");
+ cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MAX, "120");
+ System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+
+ String rulesToVerify = "";
+ int fail = 0;
+
+ //FAIL
+ rulesToVerify += "package org.drools.factconstraint.test\n\n";
+ rulesToVerify += "import org.drools.factconstraint.model.*\n";
+ rulesToVerify += "rule \"rule1\"\n";
+ rulesToVerify += " when\n";
+ rulesToVerify += " Person(age == -5)\n";
+ rulesToVerify += " then\n";
+ rulesToVerify += " System.out.println(\"Rule fired\");\n";
+ rulesToVerify += "end\n\n";
+ fail++;
+
+ //OK
+ rulesToVerify += "rule \"rule2\"\n";
+ rulesToVerify += " when\n";
+ rulesToVerify += " Person(age == 10)\n";
+ rulesToVerify += " then\n";
+ rulesToVerify += " System.out.println(\"Rule fired\");\n";
+ rulesToVerify += "end\n\n";
+
+ //FAIL
+ rulesToVerify += "rule \"rule3\"\n";
+ rulesToVerify += " when\n";
+ rulesToVerify += " Person(age == 130)\n";
+ rulesToVerify += " then\n";
+ rulesToVerify += " System.out.println(\"Rule fired\");\n";
+ rulesToVerify += "end\n";
+ fail++;
+
+ VerifierReport result = this.verify(rulesToVerify);
+
+ Collection<VerifierMessageBase> errors = result.getBySeverity(Severity.ERROR);
+
+ System.out.println(errors);
+
+ Assert.assertEquals(fail, errors.size());
+ }
+
+ @Test
+ public void testNotEq() {
+
+ //age constraint
+ cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MIN, "0");
+ cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MAX, "120");
+ System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+
+ String rulesToVerify = "";
+ int fail = 0;
+ int warning = 0;
+
+ //FAIL
+ rulesToVerify += "package org.drools.factconstraint.test\n\n";
+ rulesToVerify += "import org.drools.factconstraint.model.*\n";
+ rulesToVerify += "rule \"rule1\"\n";
+ rulesToVerify += " when\n";
+ rulesToVerify += " Person(age != -5)\n";
+ rulesToVerify += " then\n";
+ rulesToVerify += " System.out.println(\"Rule fired\");\n";
+ rulesToVerify += "end\n\n";
+ warning++;
+
+ //OK
+ rulesToVerify += "rule \"rule2\"\n";
+ rulesToVerify += " when\n";
+ rulesToVerify += " Person(age != 10)\n";
+ rulesToVerify += " then\n";
+ rulesToVerify += " System.out.println(\"Rule fired\");\n";
+ rulesToVerify += "end\n\n";
+
+ //FAIL
+ rulesToVerify += "rule \"rule3\"\n";
+ rulesToVerify += " when\n";
+ rulesToVerify += " Person(age != 130)\n";
+ rulesToVerify += " then\n";
+ rulesToVerify += " System.out.println(\"Rule fired\");\n";
+ rulesToVerify += "end\n";
+ warning++;
+
+ VerifierReport result = this.verify(rulesToVerify);
+
+ Collection<VerifierMessageBase> warnings = result.getBySeverity(Severity.WARNING);
+
+ System.out.println(warnings);
+
+ Assert.assertEquals(warning, warnings.size());
+ }
+
+ private VerifierReport verify(String rulesToVerify){
+ VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
+
+ //VerifierConfiguration conf = new DefaultVerifierConfiguration();
+ VerifierConfiguration conf = new VerifierConfigurationImpl();
+
+ conf.getVerifyingResources().put(ResourceFactory.newByteArrayResource(cons.getVerifierRule().getBytes()), ResourceType.DRL);
+
+ verifier = vBuilder.newVerifier(conf);
+
+ verifier.addResourcesToVerify(ResourceFactory.newByteArrayResource(rulesToVerify.getBytes()),
+ ResourceType.DRL);
+
+ if (verifier.hasErrors()) {
+ for (VerifierError error : verifier.getErrors()) {
+ System.out.println(error.getMessage());
+ }
+ throw new RuntimeException("Error building verifier");
+ }
+
+ Assert.assertFalse(verifier.hasErrors());
+
+ boolean noProblems = verifier.fireAnalysis();
+ Assert.assertTrue(noProblems);
+
+ return verifier.getResult();
+
+ }
+
+}
More information about the jboss-svn-commits
mailing list