[jboss-svn-commits] JBL Code SVN: r9859 - in labs/jbossrules/trunk/drools-compiler: src/main/java/org/drools/rule/builder and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Feb 28 19:19:05 EST 2007


Author: mark.proctor at jboss.com
Date: 2007-02-28 19:19:05 -0500 (Wed, 28 Feb 2007)
New Revision: 9859

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/.classpath
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ConsequenceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java
Log:
JBRULES-708 MVEL Integration
-Consequences now work

Modified: labs/jbossrules/trunk/drools-compiler/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-compiler/.classpath	2007-02-28 23:29:06 UTC (rev 9858)
+++ labs/jbossrules/trunk/drools-compiler/.classpath	2007-03-01 00:19:05 UTC (rev 9859)
@@ -1,19 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry kind="src" path="src/main/resources"/>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/resources"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="src" path="/drools-core"/>
-	<classpathentry kind="var" path="M2_REPO/antlr/stringtemplate/3.0/stringtemplate-3.0.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.1.v_677_R32x/core-3.2.1.v_677_R32x.jar"/>
-	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/janino/janino/2.5.5/janino-2.5.5.jar" sourcepath="/M2_REPO/janino/janino/2.5.5/janino-src.jar"/>
-	<classpathentry kind="var" path="M2_REPO/xpp3/xpp3/1.1.3.4.O/xpp3-1.1.3.4.O.jar"/>
-	<classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.0b5/antlr-3.0b5.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/mvel/mvel14/1.2beta6/mvel14-1.2beta6.jar"/>
-	<classpathentry kind="var" path="M2_REPO/xstream/xstream/1.1.3/xstream-1.1.3.jar"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3/1.1.3.4.O/xpp3-1.1.3.4.O.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.1.v_677_R32x/core-3.2.1.v_677_R32x.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xstream/xstream/1.1.3/xstream-1.1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>
+  <classpathentry kind="var" path="M2_REPO/antlr/stringtemplate/3.0/stringtemplate-3.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.5/janino-2.5.5.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel14/1.2beta13/mvel14-1.2beta13.jar"/>
+  <classpathentry kind="src" path="/drools-core"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.0b5/antlr-3.0b5.jar"/>
+</classpath>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ConsequenceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ConsequenceBuilder.java	2007-02-28 23:29:06 UTC (rev 9858)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ConsequenceBuilder.java	2007-03-01 00:19:05 UTC (rev 9859)
@@ -5,8 +5,8 @@
 
 public interface ConsequenceBuilder {
 
-    public void buildConsequence(final BuildContext context,
-                                 final BuildUtils utils,
-                                 final RuleDescr ruleDescr);
+    public void build(final BuildContext context,
+                      final BuildUtils utils,
+                      final RuleDescr ruleDescr);
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java	2007-02-28 23:29:06 UTC (rev 9858)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java	2007-03-01 00:19:05 UTC (rev 9859)
@@ -72,7 +72,7 @@
 
     // the builder for the consequence
     private ConsequenceBuilder consequenceBuilder;
-    
+
     // the builder for the rule class
     private RuleClassBuilder   classBuilder;
 
@@ -96,15 +96,14 @@
                       new ForallBuilder() );
         GroupElementBuilder gebuilder = new GroupElementBuilder();
         builders.put( AndDescr.class,
-                      gebuilder);
+                      gebuilder );
         builders.put( OrDescr.class,
-                      gebuilder);
+                      gebuilder );
         builders.put( NotDescr.class,
-                      gebuilder);
+                      gebuilder );
         builders.put( ExistsDescr.class,
-                      gebuilder);
-        
-        
+                      gebuilder );
+
         this.utils = new BuildUtils( new KnowledgeHelperFixer(),
                                      new DeclarationTypeFixer(),
                                      new JavaExprAnalyzer(),
@@ -115,7 +114,7 @@
         this.columnBuilder = new ColumnBuilder();
 
         this.consequenceBuilder = new JavaConsequenceBuilder();
-        
+
         this.classBuilder = new RuleClassBuilder();
     }
 
@@ -169,27 +168,31 @@
                        ruleDescr.getAttributes() );
 
         ConditionalElementBuilder builder = utils.getBuilder( ruleDescr.getLhs().getClass() );
-        if( builder != null ) {
-            GroupElement ce = (GroupElement) builder.build( this.context, this.utils, this.columnBuilder, ruleDescr.getLhs() );
+        if ( builder != null ) {
+            GroupElement ce = (GroupElement) builder.build( this.context,
+                                                            this.utils,
+                                                            this.columnBuilder,
+                                                            ruleDescr.getLhs() );
             this.context.getRule().setLhs( ce );
         } else {
-            throw new RuntimeDroolsException("BUG: builder not found for descriptor class "+ruleDescr.getLhs().getClass() );
+            throw new RuntimeDroolsException( "BUG: builder not found for descriptor class " + ruleDescr.getLhs().getClass() );
         }
 
         // Build the consequence and generate it's invoker/s
         // generate the main rule from the previously generated s.
         if ( !(ruleDescr instanceof QueryDescr) ) {
             // do not build the consequence if we have a query
-            this.consequenceBuilder.buildConsequence( this.context,
-                                                      this.utils,
-                                                      ruleDescr );
+            this.consequenceBuilder.build( this.context,
+                                           this.utils,
+                                           ruleDescr );
         }
-        this.classBuilder.buildRule( this.context, this.utils, ruleDescr );
+        this.classBuilder.buildRule( this.context,
+                                     this.utils,
+                                     ruleDescr );
 
         return this.context.getRule();
     }
 
-
     /**
      * Sets rule Attributes
      * 
@@ -197,8 +200,8 @@
      * @param attributes
      */
     public void setAttributes(final Rule rule,
-                               final List attributes) {
-        
+                              final List attributes) {
+
         for ( final Iterator it = attributes.iterator(); it.hasNext(); ) {
             final AttributeDescr attributeDescr = (AttributeDescr) it.next();
             final String name = attributeDescr.getName();
@@ -225,21 +228,21 @@
             } else if ( name.equals( "duration" ) ) {
                 rule.setDuration( Long.parseLong( attributeDescr.getValue() ) );
                 rule.setAgendaGroup( "" );
-            } else if (name.equals( "enabled" )){
-                if (attributeDescr.getValue() == null) {
+            } else if ( name.equals( "enabled" ) ) {
+                if ( attributeDescr.getValue() == null ) {
                     rule.setEnabled( true );
                 } else {
-                    rule.setEnabled( Boolean.valueOf( attributeDescr.getValue() ).booleanValue());
+                    rule.setEnabled( Boolean.valueOf( attributeDescr.getValue() ).booleanValue() );
                 }
-            } else if (name.equals( "date-effective" )) {                
+            } else if ( name.equals( "date-effective" ) ) {
                 Calendar cal = Calendar.getInstance();
                 cal.setTime( DateFactory.parseDate( attributeDescr.getValue() ) );
                 rule.setDateEffective( cal );
-            } else if (name.equals( "date-expires" )) {     
+            } else if ( name.equals( "date-expires" ) ) {
                 Calendar cal = Calendar.getInstance();
                 cal.setTime( DateFactory.parseDate( attributeDescr.getValue() ) );
                 rule.setDateExpires( cal );
-                
+
             } else if ( name.equals( "language" ) ) {
                 //@todo: we don't currently  support multiple languages
             }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java	2007-02-28 23:29:06 UTC (rev 9858)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilder.java	2007-03-01 00:19:05 UTC (rev 9859)
@@ -30,18 +30,20 @@
  * @author etirelli
  *
  */
-public class JavaConsequenceBuilder implements ConsequenceBuilder {
+public class JavaConsequenceBuilder
+    implements
+    ConsequenceBuilder {
 
     /* (non-Javadoc)
      * @see org.drools.semantics.java.builder.ConsequenceBuilder#buildConsequence(org.drools.semantics.java.builder.BuildContext, org.drools.semantics.java.builder.BuildUtils, org.drools.lang.descr.RuleDescr)
      */
-    public void buildConsequence(final BuildContext context,
-                                 final BuildUtils utils,
-                                 final RuleDescr ruleDescr) {
-        
+    public void build(final BuildContext context,
+                      final BuildUtils utils,
+                      final RuleDescr ruleDescr) {
+
         // pushing consequence LHS into the stack for variable resolution
         context.getBuildStack().push( context.getRule().getLhs() );
-        
+
         // generate 
         // generate Invoker
         final String className = "consequence";
@@ -110,7 +112,7 @@
                                          context.getRule() );
         context.getDescrLookups().put( invokerClassName,
                                        ruleDescr );
-        
+
         // popping Rule.getLHS() from the build stack
         context.getBuildStack().pop();
     }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2007-03-01 00:19:05 UTC (rev 9859)
@@ -0,0 +1,36 @@
+package org.drools.rule.builder.dialect.mvel;
+
+import java.io.Serializable;
+
+import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELConsequence;
+import org.drools.base.mvel.MVELEvalExpression;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.EvalCondition;
+import org.drools.rule.builder.BuildContext;
+import org.drools.rule.builder.ConsequenceBuilder;
+import org.drools.rule.builder.dialect.java.BuildUtils;
+import org.drools.spi.Consequence;
+import org.mvel.MVEL;
+
+public class MVELConsequenceBuilder
+    implements
+    ConsequenceBuilder {
+
+    public void build(BuildContext context,
+                      BuildUtils utils,
+                      RuleDescr ruleDescr) {
+        // pushing consequence LHS into the stack for variable resolution
+        context.getBuildStack().push( context.getRule().getLhs() );
+
+        DroolsMVELFactory factory = new DroolsMVELFactory();
+        factory.setPreviousDeclarationMap( context.getDeclarationResolver().getDeclarations() );
+        factory.setGlobalsMap( context.getPkg().getGlobals() );
+
+        Serializable expr = MVEL.compileExpression( ruleDescr.getConsequence() );
+
+        context.getRule().setConsequence( new MVELConsequence( expr,
+                                                               factory ) );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	2007-03-01 00:19:05 UTC (rev 9859)
@@ -0,0 +1,118 @@
+package org.drools.rule.builder.dialect.mvel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.drools.Cheese;
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldExtractor;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DefaultKnowledgeHelper;
+import org.drools.common.AgendaItem;
+import org.drools.common.InternalFactHandle;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.reteoo.ReteTuple;
+import org.drools.rule.Column;
+import org.drools.rule.Declaration;
+import org.drools.rule.EvalCondition;
+import org.drools.rule.Package;
+import org.drools.rule.Rule;
+import org.drools.rule.builder.BuildContext;
+import org.drools.rule.builder.dialect.mvel.MVELEvalBuilder;
+import org.drools.spi.ColumnExtractor;
+import org.drools.spi.DeclarationScopeResolver;
+import org.drools.spi.FieldExtractor;
+import org.drools.spi.ObjectType;
+
+public class MVELConsequenceBuilderTest extends TestCase {
+
+    public void setUp() {
+    }
+
+    public void testSimpleExpression() throws Exception {
+        Package pkg = new Package( "pkg1" );
+        RuleDescr ruleDescr = new RuleDescr( "rule 1" );
+        ruleDescr.setConsequence( "cheese.setPrice( 5 );" );
+
+        InstrumentedBuildContent context = new InstrumentedBuildContent( pkg,
+                                                                         ruleDescr );
+        
+        InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
+        
+        ObjectType cheeseObjeectType = new ClassObjectType( Cheese.class );
+        
+        Column column = new Column( 0,
+                                    cheeseObjeectType );
+        
+        ColumnExtractor extractor = new ColumnExtractor( cheeseObjeectType );
+        
+        Declaration declaration = new Declaration( "cheese",
+                                                   extractor,
+                                                   column );
+        Map map = new HashMap();
+        map.put( "cheese",
+                 declaration );
+        declarationResolver.setDeclarations( map );
+        context.setDeclarationResolver( declarationResolver );
+
+        MVELConsequenceBuilder builder = new MVELConsequenceBuilder();
+        builder.build( context,
+                       null,
+                       ruleDescr );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        WorkingMemory wm = ruleBase.newWorkingMemory();
+
+        Cheese cheddar = new Cheese( "cheddar",
+                                     10 );
+        InternalFactHandle f0 = (InternalFactHandle) wm.assertObject( cheddar );
+        ReteTuple tuple = new ReteTuple( f0 );
+
+        AgendaItem item = new AgendaItem(0, tuple, null, context.getRule(), null);
+        DefaultKnowledgeHelper kbHelper = new DefaultKnowledgeHelper(item, wm);
+        context.getRule().getConsequence().evaluate( kbHelper, wm );
+        
+        assertEquals( 5, cheddar.getPrice() );
+    }
+
+    public static class InstrumentedDeclarationScopeResolver extends DeclarationScopeResolver {
+        private Map declarations;
+
+        public InstrumentedDeclarationScopeResolver() {
+            super( null );
+        }
+
+        public void setDeclarations(Map map) {
+            this.declarations = map;
+        }
+
+        public Map getDeclarations() {
+            return this.declarations;
+        }
+    }
+
+    public static class InstrumentedBuildContent extends BuildContext {
+        private DeclarationScopeResolver declarationScopeResolver;
+
+        public InstrumentedBuildContent(Package pkg,
+                                        RuleDescr ruleDescr) {
+            super( pkg,
+                   ruleDescr );
+        }
+
+        public void setDeclarationResolver(DeclarationScopeResolver declarationScopeResolver) {
+            this.declarationScopeResolver = declarationScopeResolver;
+        }
+
+        public DeclarationScopeResolver getDeclarationResolver() {
+            return this.declarationScopeResolver;
+        }
+
+    }
+
+}




More information about the jboss-svn-commits mailing list