[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