[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