[jboss-svn-commits] JBL Code SVN: r17049 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/rule and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Dec 5 18:59:01 EST 2007


Author: mark.proctor at jboss.com
Date: 2007-12-05 18:59:00 -0500 (Wed, 05 Dec 2007)
New Revision: 17049

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ReturnValueConstraintEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ConstraintImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowSplitInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/nodes/split/ConstraintEvaluator.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
Log:
JBRULES-1352 Allow Constraints to also use dialectable expression evaluations
-constraints now working end to end with dialects and rules and code; includes integration test.

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -0,0 +1,69 @@
+package org.drools.base.mvel;
+
+import java.io.Serializable;
+
+import org.drools.WorkingMemory;
+import org.drools.spi.Action;
+import org.drools.spi.Consequence;
+import org.drools.spi.KnowledgeHelper;
+import org.drools.spi.ReturnValueEvaluator;
+import org.mvel.CompiledExpression;
+import org.mvel.MVEL;
+import org.mvel.debug.DebugTools;
+
+public class MVELReturnValueEvaluator
+    implements
+    ReturnValueEvaluator,
+    Serializable {
+    private static final long       serialVersionUID = 400L;
+
+    private final Serializable      expr;
+    private final DroolsMVELFactory factory;
+
+    public MVELReturnValueEvaluator(final Serializable expr,
+                      final DroolsMVELFactory factory) {
+        this.expr = expr;
+        this.factory = factory;
+    }
+    
+    public String getDialect() {
+        return "mvel";
+    }
+
+    public Object evaluate(final WorkingMemory workingMemory) throws Exception {
+        this.factory.setContext( null,
+                                 null,
+                                 null,
+                                 workingMemory,
+                                 null );
+        CompiledExpression compexpr = (CompiledExpression) this.expr;
+
+        //Receive breakpoints from debugger
+        MVELDebugHandler.prepare();
+
+        Object value;
+        if ( MVELDebugHandler.isDebugMode() ) {
+            if ( MVELDebugHandler.verbose ) {
+                System.out.println( DebugTools.decompile( compexpr ) );
+            }
+            value = MVEL.executeDebugger( compexpr,
+                                  null,
+                                  this.factory );
+        } else {
+            value = MVEL.executeExpression( compexpr,
+                                    null,
+                                    this.factory );
+        }
+        
+        if ( !(value instanceof Boolean) ) {
+            throw new RuntimeException("Constraints must return boolean values" );
+        }
+        return ((Boolean)value).booleanValue();        
+
+    }
+
+    public Serializable getCompExpr() {
+        return expr;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java	2007-12-05 19:08:13 UTC (rev 17048)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -39,10 +39,12 @@
 import org.drools.base.accumulators.JavaAccumulatorFunctionExecutor;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.ruleflow.core.impl.ActionNodeImpl;
+import org.drools.ruleflow.core.impl.ReturnValueConstraintEvaluator;
 import org.drools.spi.Accumulator;
 import org.drools.spi.Consequence;
 import org.drools.spi.EvalExpression;
 import org.drools.spi.PredicateExpression;
+import org.drools.spi.ReturnValueEvaluator;
 import org.drools.spi.ReturnValueExpression;
 
 public class PackageCompilationData
@@ -268,6 +270,8 @@
             ((JavaAccumulatorFunctionExecutor) invoker).setExpression( (ReturnValueExpression) clazz.newInstance() );
         } else if ( invoker instanceof ActionNodeImpl ) {
             ((ActionNodeImpl) invoker).setAction( clazz.newInstance() );
+        } else if ( invoker instanceof ReturnValueConstraintEvaluator ) {
+            ((ReturnValueConstraintEvaluator) invoker).setEvaluator( (ReturnValueEvaluator) clazz.newInstance() );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ConstraintImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ConstraintImpl.java	2007-12-05 19:08:13 UTC (rev 17048)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ConstraintImpl.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -19,7 +19,7 @@
 import java.io.Serializable;
 
 import org.drools.ruleflow.core.Constraint;
-import org.drools.ruleflow.nodes.split.ConstraintEvaluator;
+
 /**
  * Default implementation of a constraint.
  * 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ReturnValueConstraintEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ReturnValueConstraintEvaluator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/core/impl/ReturnValueConstraintEvaluator.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -0,0 +1,117 @@
+package org.drools.ruleflow.core.impl;
+
+/*
+ * 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.io.Serializable;
+import java.util.Iterator;
+
+import org.drools.common.RuleFlowGroupNode;
+import org.drools.ruleflow.core.Connection;
+import org.drools.ruleflow.core.Constraint;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
+import org.drools.ruleflow.nodes.split.ConstraintEvaluator;
+import org.drools.spi.Activation;
+import org.drools.spi.ReturnValueEvaluator;
+import org.drools.spi.RuleFlowGroup;
+
+/**
+ * Default implementation of a constraint.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ReturnValueConstraintEvaluator
+    implements
+    Constraint, ConstraintEvaluator,
+    Serializable {
+
+    private static final long  serialVersionUID = 400L;
+
+    private String             name;
+    private String             constraint;
+    private int                priority;
+    private String             dialect;
+    private String             type;       
+    
+    private ReturnValueEvaluator evaluator;
+    
+    public String getConstraint() {
+        return this.constraint;
+    }
+
+    public void setConstraint(final String constraint) {
+        this.constraint = constraint;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public String toString() {
+        return this.name;
+    }
+
+    public int getPriority() {
+        return this.priority;
+    }
+
+    public void setPriority(final int priority) {
+        this.priority = priority;
+    }
+
+    public String getDialect() {
+        return dialect;
+    }
+
+    public void setDialect(String dialect) {
+        this.dialect = dialect;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+    
+    
+    
+    public void setEvaluator(ReturnValueEvaluator evaluator) {
+        this.evaluator = evaluator;
+    }
+
+    public boolean evaluate(RuleFlowSplitInstanceImpl instance,
+                            Connection connection,
+                            Constraint constraint) {
+        Object value;
+        try {
+            value = this.evaluator.evaluate( instance.getProcessInstance().getWorkingMemory() );
+        } catch ( Exception e ) {
+            throw  new RuntimeException("unable to execute ReturnValueEvaluator", e);
+        }
+        if ( !(value instanceof Boolean) ) {
+            throw new RuntimeException("Constraints must return boolean values" );
+        }
+        return ((Boolean)value).booleanValue();
+    }    
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowSplitInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowSplitInstanceImpl.java	2007-12-05 19:08:13 UTC (rev 17048)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/instance/impl/RuleFlowSplitInstanceImpl.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -81,10 +81,10 @@
                         getProcessInstance().getNodeInstance( connection.getTo() ).trigger( this );
                         found = true;
                     }
-                    if ( !found ) {
-                        throw new IllegalArgumentException( "OR split could not find at least one valid outgoing connection for split " + getSplitNode().getName() );
-                    }
                 }
+                if ( !found ) {
+                    throw new IllegalArgumentException( "OR split could not find at least one valid outgoing connection for split " + getSplitNode().getName() );
+                }                
                 break;
             default :
                 throw new IllegalArgumentException( "Illegal split type " + split.getType() );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/nodes/split/ConstraintEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/nodes/split/ConstraintEvaluator.java	2007-12-05 19:08:13 UTC (rev 17048)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ruleflow/nodes/split/ConstraintEvaluator.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -5,8 +5,10 @@
 import org.drools.ruleflow.core.Split;
 import org.drools.ruleflow.instance.impl.RuleFlowSplitInstanceImpl;
 
-public interface ConstraintEvaluator extends Constraint {
+public interface ConstraintEvaluator
+    extends
+    Constraint {
     public boolean evaluate(RuleFlowSplitInstanceImpl instance,
-                         Connection connection,
-                         Constraint constraint);
+                            Connection connection,
+                            Constraint constraint);
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReturnValueEvaluator.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -0,0 +1,7 @@
+package org.drools.spi;
+
+import org.drools.WorkingMemory;
+
+public interface ReturnValueEvaluator {
+    Object evaluate(WorkingMemory workingMemory) throws Exception;
+}

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2007-12-05 19:08:13 UTC (rev 17048)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2007-12-05 23:59:00 UTC (rev 17049)
@@ -65,7 +65,7 @@
         };
 
         //workingMemory.addEventListener(listener );
-        final InputStream is = getClass().getResourceAsStream( "/manners64.dat" );
+        final InputStream is = getClass().getResourceAsStream( "/manners128.dat" );
         final List list = getInputObjects( is );
         for ( final Iterator it = list.iterator(); it.hasNext(); ) {
             final Object object = it.next();




More information about the jboss-svn-commits mailing list