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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jul 8 23:07:18 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-07-08 23:07:18 -0400 (Sun, 08 Jul 2007)
New Revision: 13252

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java
Log:
-updates to get MVEL working with type safe mode

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -161,16 +161,17 @@
                              object,
                              null );
         }
-        
-        if( patternDescr.getSource() != null ) {
+
+        if ( patternDescr.getSource() != null ) {
             // we have a pattern source, so build it
             RuleConditionBuilder builder = context.getDialect().getBuilder( patternDescr.getSource().getClass() );
-            
-            PatternSource source = (PatternSource) builder.build( context, patternDescr.getSource() );
-            
+
+            PatternSource source = (PatternSource) builder.build( context,
+                                                                  patternDescr.getSource() );
+
             pattern.setSource( source );
         }
-        
+
         // poping the pattern
         context.getBuildStack().pop();
         return pattern;
@@ -319,10 +320,10 @@
         dumper.visitFieldConstraintDescr( fieldConstraintDescr );
         predicateDescr.setContent( dumper.getTemplate() );
 
-        this.build( context,
-                    pattern,
-                    predicateDescr,
-                    container );
+        build( context,
+               pattern,
+               predicateDescr,
+               container );
 
         // fall back to original dialect
         context.setDialect( dialect );
@@ -474,9 +475,9 @@
         for ( int i = 0, size = unboundIdentifiers.size(); i < size; i++ ) {
             final String identifier = (String) unboundIdentifiers.get( i );
 
-            Declaration declaration = this.createDeclarationObject( context,
-                                                                    identifier,
-                                                                    pattern );
+            Declaration declaration = createDeclarationObject( context,
+                                                               identifier,
+                                                               pattern );
 
             if ( declaration != null ) {
                 factDeclarations.add( declaration );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -1,8 +1,10 @@
 package org.drools.rule.builder.dialect.mvel;
 
+import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -39,7 +41,10 @@
 import org.drools.rule.builder.RuleClassBuilder;
 import org.drools.rule.builder.RuleConditionBuilder;
 import org.drools.rule.builder.SalienceBuilder;
+import org.drools.spi.DeclarationScopeResolver;
 import org.mvel.AbstractParser;
+import org.mvel.ExpressionCompiler;
+import org.mvel.ParserContext;
 import org.mvel.integration.impl.ClassImportResolverFactory;
 import org.mvel.integration.impl.StaticMethodImportResolverFactory;
 
@@ -211,7 +216,8 @@
                                                     Object content) {
         Dialect.AnalysisResult result = null;
         try {
-            result = this.analyzer.analyzeExpression( (String) content,
+            result = this.analyzer.analyzeExpression( context,
+                                                      (String) content,
                                                       new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
         } catch ( final Exception e ) {
             context.getErrors().add( new RuleError( context.getRule(),
@@ -227,7 +233,8 @@
                                                String text) {
         Dialect.AnalysisResult result = null;
         try {
-            result = this.analyzer.analyzeExpression( text,
+            result = this.analyzer.analyzeExpression( context,
+                                                      text,
                                                       new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
         } catch ( final Exception e ) {
             context.getErrors().add( new RuleError( context.getRule(),
@@ -237,6 +244,28 @@
         }
         return result;
     }
+    
+    public Serializable compile(final String text, final Dialect.AnalysisResult analysis, final RuleBuildContext context) {
+        final ParserContext parserContext = new ParserContext( getClassImportResolverFactory().getImportedClasses(), null, null);
+        parserContext.setStrictTypeEnforcement( true );
+        
+        List list[] = analysis.getBoundIdentifiers();
+        DeclarationScopeResolver resolver = context.getDeclarationResolver();
+        for ( Iterator it = list[0].iterator(); it.hasNext(); ) {
+            String identifier = (String) it.next();
+            Class cls = resolver.getDeclaration( identifier ).getExtractor().getExtractToClass();
+            parserContext.addInput( identifier, cls );
+        }
+        
+        Map globalTypes = context.getPkg().getGlobals();
+        for ( Iterator it = list[1].iterator(); it.hasNext(); ) {
+            String identifier = (String) it.next();
+            parserContext.addInput( identifier, ( Class ) globalTypes.get( identifier ) );
+        }                
+        
+        ExpressionCompiler compiler = new ExpressionCompiler( text );
+        return compiler.compile( parserContext );
+    }
 
     public RuleConditionBuilder getBuilder(final Class clazz) {
         return (RuleConditionBuilder) this.builders.get( clazz );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -17,7 +17,9 @@
 package org.drools.rule.builder.dialect.mvel;
 
 import java.io.Serializable;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import org.drools.base.mvel.DroolsMVELFactory;
 import org.drools.base.mvel.MVELEvalExpression;
@@ -31,7 +33,11 @@
 import org.drools.rule.builder.Dialect;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.RuleConditionBuilder;
+import org.drools.spi.DeclarationScopeResolver;
+import org.mvel.ExpressionCompiler;
 import org.mvel.MVEL;
+import org.mvel.ParserContext;
+import org.mvel.util.ParseTools;
 
 /**
  * @author etirelli
@@ -80,9 +86,9 @@
                 declarations[i] = context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
             }
 
-            final EvalCondition eval = new EvalCondition( declarations );
-            final Serializable expr = MVEL.compileExpression( (String) evalDescr.getContent(),
-                                                              ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+            final EvalCondition eval = new EvalCondition( declarations );                        
+            
+            Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) evalDescr.getContent(), analysis, context );
 
             eval.setEvalExpression( new MVELEvalExpression( expr,
                                                             factory ) );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -17,13 +17,17 @@
  */
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
 import org.antlr.runtime.RecognitionException;
+import org.drools.rule.builder.RuleBuildContext;
 import org.mvel.ExpressionCompiler;
+import org.mvel.ParserContext;
+import org.mvel.integration.impl.MapVariableResolver;
 
 /**
  * Expression analyzer.
@@ -51,11 +55,18 @@
      * @throws RecognitionException 
      *             If an error occurs in the parser.
      */
-    public MVELAnalysisResult analyzeExpression(final String expr,
-                                    final Set[] availableIdentifiers) throws RecognitionException {
+    public MVELAnalysisResult analyzeExpression(final RuleBuildContext context,
+                                                final String expr,
+                                                final Set[] availableIdentifiers) throws RecognitionException {
         ExpressionCompiler compiler = new ExpressionCompiler( expr);
-        compiler.compile();  
         
+        ParserContext parserContext = new ParserContext();
+        parserContext.setStrictTypeEnforcement( false );       
+        MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
+        parserContext.setImports( dialect.getClassImportResolverFactory().getImportedClasses() );        
+        
+        compiler.compile(parserContext);  
+        
         return analyze( compiler.getParserContextState().getInputs().keySet(),
                         availableIdentifiers );
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -27,10 +27,13 @@
 import org.drools.rule.From;
 import org.drools.rule.Pattern;
 import org.drools.rule.RuleConditionElement;
+import org.drools.rule.builder.Dialect;
 import org.drools.rule.builder.FromBuilder;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.spi.DataProvider;
+import org.mvel.ExpressionCompiler;
 import org.mvel.MVEL;
+import org.mvel.ParserContext;
 import org.mvel.integration.impl.ClassImportResolverFactory;
 
 /**
@@ -62,14 +65,21 @@
                                                                      context.getPkg().getGlobals() );
 
             // This builder is re-usable in other dialects, so specify by name
-            final ClassImportResolverFactory classImportResolverFactory = ((MVELDialect) context.getDialect( "mvel" )).getClassImportResolverFactory();
+            MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
+
+            final ClassImportResolverFactory classImportResolverFactory = dialect.getClassImportResolverFactory();
             factory.setNextFactory( classImportResolverFactory );
 
-            //parser.setValueHandlerFactory( factory );
-            final Serializable compiled = MVEL.compileExpression( accessor.toString(),
-                                                                  classImportResolverFactory.getImportedClasses() );
+            String text = (String) accessor.toString();
+            Dialect.AnalysisResult analysis = dialect.analyzeExpression( context,
+                                                                         descr,
+                                                                         text );
 
-            dataProvider = new MVELDataProvider( compiled,
+            final Serializable expr = dialect.compile( text,
+                                                       analysis,
+                                                       context );
+
+            dataProvider = new MVELDataProvider( expr,
                                                  factory );
         } catch ( final Exception e ) {
             context.getErrors().add( new RuleError( context.getRule(),

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -27,9 +27,12 @@
 import org.drools.lang.descr.PredicateDescr;
 import org.drools.rule.Declaration;
 import org.drools.rule.PredicateConstraint;
+import org.drools.rule.builder.Dialect;
 import org.drools.rule.builder.PredicateBuilder;
 import org.drools.rule.builder.RuleBuildContext;
+import org.mvel.ExpressionCompiler;
 import org.mvel.MVEL;
+import org.mvel.ParserContext;
 
 /**
  * @author etirelli
@@ -62,9 +65,16 @@
                                                                      localMap,
                                                                      context.getPkg().getGlobals() );
             factory.setNextFactory( ((MVELDialect) context.getDialect()).getClassImportResolverFactory() );
-
-            final Serializable expr = MVEL.compileExpression( (String) predicateDescr.getContent(),
-                                                              ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+            
+            final ParserContext parserContext = new ParserContext(((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses(), null, null);
+            parserContext.setStrictTypeEnforcement( true );           
+            
+            Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
+                                                                                      predicateDescr,
+                                                                                      predicateDescr.getContent() );
+            
+            final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) predicateDescr.getContent(), analysis, context );            
+            
             predicate.setPredicateExpression( new MVELPredicateExpression( expr,
                                                                            factory ) );
         } catch ( final Exception e ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -26,9 +26,12 @@
 import org.drools.lang.descr.ReturnValueRestrictionDescr;
 import org.drools.rule.Declaration;
 import org.drools.rule.ReturnValueRestriction;
+import org.drools.rule.builder.Dialect;
 import org.drools.rule.builder.ReturnValueBuilder;
 import org.drools.rule.builder.RuleBuildContext;
+import org.mvel.ExpressionCompiler;
 import org.mvel.MVEL;
+import org.mvel.ParserContext;
 
 /**
  * @author etirelli
@@ -60,7 +63,18 @@
         final DroolsMVELFactory factory = new DroolsMVELFactory(previousMap, localMap,  context.getPkg().getGlobals() );
         factory.setNextFactory( ((MVELDialect)context.getDialect()).getClassImportResolverFactory() );
 
-        final Serializable expr = MVEL.compileExpression( (String) returnValueRestrictionDescr.getContent(), ((MVELDialect)context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+        final ParserContext parserContext = new ParserContext(((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses(), null, null);
+        parserContext.setStrictTypeEnforcement( true );
+        
+//        ExpressionCompiler compiler = new ExpressionCompiler( (String) returnValueRestrictionDescr.getContent() );
+//        final Serializable expr = compiler.compile( parserContext );
+        
+        Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
+                                                                                  returnValueRestrictionDescr,
+                                                                                  returnValueRestrictionDescr.getContent() );
+        
+        final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) returnValueRestrictionDescr.getContent(), analysis, context );        
+        
         returnValueRestriction.setReturnValueExpression( new MVELReturnValueExpression( expr,
                                                                                         factory ) );
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -5,9 +5,12 @@
 import org.drools.base.mvel.DroolsMVELFactory;
 import org.drools.base.mvel.MVELSalienceExpression;
 import org.drools.compiler.RuleError;
+import org.drools.rule.builder.Dialect;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.SalienceBuilder;
+import org.mvel.ExpressionCompiler;
 import org.mvel.MVEL;
+import org.mvel.ParserContext;
 import org.mvel.integration.impl.ClassImportResolverFactory;
 
 public class MVELSalienceBuilder
@@ -22,13 +25,19 @@
             final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
                                                                      null,
                                                                      context.getPkg().getGlobals() );
+            MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
             // This builder is re-usable in other dialects, so specify by name
-            final ClassImportResolverFactory classImportResolverFactory = ((MVELDialect) context.getDialect( "mvel" )).getClassImportResolverFactory();
+            final ClassImportResolverFactory classImportResolverFactory = dialect.getClassImportResolverFactory();
             factory.setNextFactory( classImportResolverFactory );
 
-            final Serializable expr = MVEL.compileExpression( (String) context.getRuleDescr().getSalience(),
-                                                              classImportResolverFactory.getImportedClasses() );
+            Dialect.AnalysisResult analysis = dialect.analyzeExpression( context,
+                                                                         context.getRuleDescr(),
+                                                                         (String) context.getRuleDescr().getSalience() );
 
+            final Serializable expr = dialect.compile( (String) context.getRuleDescr().getSalience(),
+                                                                                    analysis,
+                                                                                    context );
+
             MVELSalienceExpression salience = new MVELSalienceExpression( expr,
                                                                           factory );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -35,7 +35,7 @@
 
         MVELDialect mvelDialect = new MVELDialect( new PackageBuilder( pkg ) );
         DialectRegistry registry = new DialectRegistry();
-        registry.addDialect( "default",
+        registry.addDialect( "mvel",
                              mvelDialect );
         final PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -38,7 +38,7 @@
 
         MVELDialect mvelDialect = new MVELDialect( new PackageBuilder( pkg ) );
         DialectRegistry registry = new DialectRegistry();
-        registry.addDialect( "default",
+        registry.addDialect( "mvel",
                              mvelDialect );
         final PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2007-07-09 03:04:50 UTC (rev 13251)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2007-07-09 03:07:18 UTC (rev 13252)
@@ -40,7 +40,7 @@
 
         MVELDialect mvelDialect = new MVELDialect( new PackageBuilder( pkg ) );
         DialectRegistry registry = new DialectRegistry();
-        registry.addDialect( "default",
+        registry.addDialect( "mvel",
                              mvelDialect );
         final PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
 
@@ -116,9 +116,6 @@
         tuple = new ReteTuple( tuple,
                                f1 );
 
-        final PredicateContextEntry predicateContext = new PredicateContextEntry();
-        predicateContext.leftTuple = tuple;
-
         final Cheese brie = new Cheese( "brie",
                                         20 );
         assertTrue( returnValue.isAllowed( extractor,




More information about the jboss-svn-commits mailing list