[jboss-svn-commits] JBL Code SVN: r18356 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/lang/descr and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Feb 6 22:58:30 EST 2008


Author: mark.proctor at jboss.com
Date: 2008-02-06 22:58:30 -0500 (Wed, 06 Feb 2008)
New Revision: 18356

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderErrors.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/OrDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java
   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/MVELDialect.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialectConfiguration.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/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/MVELReturnValueEvaluatorBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
Log:
JBRULES-720 Clips Parser
-Refactored functions so all functions are now added by the PackageBuilder into the RuleBase
-All functions now live in the MAIN namespace and the factory is always retrieved from there.

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -32,6 +32,7 @@
 import org.drools.facttemplates.FactTemplateImpl;
 import org.drools.facttemplates.FieldTemplate;
 import org.drools.facttemplates.FieldTemplateImpl;
+import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
@@ -79,7 +80,7 @@
 
     private Dialect                     dialect;
 
-    private DialectRegistry             dialectRegistry;    
+    private DialectRegistry             dialectRegistry;
 
     /**
      * Use this when package is starting from scratch.
@@ -146,7 +147,6 @@
 
         this.dialect = this.dialectRegistry.getDialect( this.configuration.getDefaultDialect() );
 
-        
         if ( this.pkg != null ) {
             this.dialectRegistry.initAll( this );
         }
@@ -177,7 +177,7 @@
      */
     public void addPackageFromXml(final Reader reader) throws DroolsParserException,
                                                       IOException {
-        final XmlPackageReader xmlReader = new XmlPackageReader(  this.configuration.getSemanticModules() );
+        final XmlPackageReader xmlReader = new XmlPackageReader( this.configuration.getSemanticModules() );
 
         try {
             xmlReader.read( reader );
@@ -214,7 +214,7 @@
      */
     public void addRuleFlow(Reader processSource) {
         ProcessBuilder processBuilder = new ProcessBuilder( this );
-        
+
         try {
             processBuilder.addProcessFromFile( processSource );
             this.results.addAll( processBuilder.getErrors() );
@@ -224,29 +224,29 @@
             }
             this.results.add( new RuleFlowLoadError( "Unable to load the rule flow.",
                                                      e ) );
-        } 
+        }
 
-        this.results = this.dialectRegistry.addResults( this.results );        
+        this.results = this.dialectRegistry.addResults( this.results );
     }
-    
-    public void addProcessFromXml(Reader reader) {        
+
+    public void addProcessFromXml(Reader reader) {
         ProcessBuilder processBuilder = new ProcessBuilder( this );
         XmlProcessReader xmlReader = new XmlProcessReader( this.configuration.getSemanticModules() );
         try {
-            Process process = xmlReader.read(  reader );
+            Process process = xmlReader.read( reader );
             processBuilder.buildProcess( process );
-            this.results.addAll( processBuilder.getErrors() );            
+            this.results.addAll( processBuilder.getErrors() );
         } catch ( Exception e ) {
             if ( e instanceof RuntimeException ) {
                 throw (RuntimeException) e;
             }
             this.results.add( new RuleFlowLoadError( "Unable to load the rule flow.",
                                                      e ) );
-        } 
+        }
 
-        this.results = this.dialectRegistry.addResults( this.results ); 
+        this.results = this.dialectRegistry.addResults( this.results );
     }
-    
+
     private void addSemanticModules() {
         //this.configuration.getSemanticModules();
     }
@@ -260,24 +260,20 @@
         validateUniqueRuleNames( packageDescr );
 
         String dialectName = null;
-        //MN: not needed as overrides are done in the compiler before here
-        //as we can have mixed dialect types - still not quite right here.       
-        //        for ( Iterator it = packageDescr.getAttributes().iterator(); it.hasNext(); ) {
-        //            AttributeDescr value = ( AttributeDescr ) it.next();
-        //            if ( "dialect".equals( value.getName() )) {   
-        //                dialectName = value.getValue();
-        //                break;
-        //            }
-        //        }
-
-        // The Package does not have a default dialect, so set it
-        if ( dialectName == null && this.dialect == null ) {
-            this.dialect = this.dialectRegistry.getDialect( this.configuration.getDefaultDialect() );
+       
+        for ( Iterator it = packageDescr.getAttributes().iterator(); it.hasNext(); ) {
+            AttributeDescr value = (AttributeDescr) it.next();
+            if ( "dialect".equals( value.getName() ) ) {
+                dialectName = value.getValue();
+                break;
+            }
         }
 
+        // If the PackageDescr specifies a dialect then set it.
         if ( dialectName != null ) {
             this.dialect = this.dialectRegistry.getDialect( dialectName );
         } else if ( this.dialect == null ) {
+            // If a dialect is not specified and one is not set, then set from the configuration
             this.dialect = this.dialectRegistry.getDialect( this.configuration.getDefaultDialect() );
         }
 
@@ -296,30 +292,16 @@
             }
 
             if ( !packageDescr.getFunctions().isEmpty() ) {
-                // add static imports for all functions
-                for ( final Iterator it = packageDescr.getFunctions().iterator(); it.hasNext(); ) {
-                    FunctionDescr functionDescr = (FunctionDescr) it.next();
-                    final String functionClassName = this.pkg.getName() + "." + ucFirst( functionDescr.getName() );
-                    functionDescr.setClassName( functionClassName );
-                    this.pkg.addStaticImport( functionClassName + "." + functionDescr.getName() );
-                }
-
                 // iterate and compile
                 for ( final Iterator it = packageDescr.getFunctions().iterator(); it.hasNext(); ) {
                     // inherit the dialect from the package
                     FunctionDescr functionDescr = (FunctionDescr) it.next();
                     functionDescr.setDialect( this.dialect.getId() );
-                    addFunction(  functionDescr );
+                    addFunction( functionDescr );
                 }
 
-                // We need to compile all the functions, so scripting languages like mvel can find them
+                // We need to compile all the functions now, so scripting languages like mvel can find them
                 this.dialectRegistry.compileAll();
-
-                for ( final Iterator it = packageDescr.getFunctions().iterator(); it.hasNext(); ) {
-                    FunctionDescr functionDescr = (FunctionDescr) it.next();
-                    final String functionClassName = this.pkg.getName() + "." + ucFirst( functionDescr.getName() );
-                    this.dialectRegistry.addStaticImport( functionClassName + "." + functionDescr.getName() );
-                }
             }
 
             // iterate and compile
@@ -329,8 +311,6 @@
         }
 
         this.dialectRegistry.compileAll();
-        
-        
 
         // some of the rules and functions may have been redefined
         this.pkg.getDialectDatas().reloadDirty();
@@ -364,7 +344,7 @@
     private void newPackage(final PackageDescr packageDescr) {
         this.pkg = new Package( packageDescr.getName(),
                                 this.configuration.getClassLoader() );
-        
+
         this.typeResolver.addImport( this.pkg.getName() + ".*" );
 
         this.dialectRegistry.initAll( this );
@@ -376,9 +356,10 @@
         final List imports = packageDescr.getImports();
         for ( final Iterator it = imports.iterator(); it.hasNext(); ) {
             ImportDescr importEntry = (ImportDescr) it.next();
-            ImportDeclaration importDecl = new ImportDeclaration( importEntry.getTarget(), importEntry.isEvent() );
+            ImportDeclaration importDecl = new ImportDeclaration( importEntry.getTarget(),
+                                                                  importEntry.isEvent() );
             pkg.addImport( importDecl );
-            this.typeResolver.addImport( importDecl.getTarget() );            
+            this.typeResolver.addImport( importDecl.getTarget() );
             this.dialectRegistry.addImport( importDecl.getTarget() );
         }
 
@@ -398,7 +379,7 @@
             try {
                 clazz = typeResolver.resolveType( className );
                 this.pkg.addGlobal( identifier,
-                               clazz );
+                                    clazz );
             } catch ( final ClassNotFoundException e ) {
                 this.results.add( new GlobalError( identifier,
                                                    global.getLine() ) );
@@ -497,7 +478,7 @@
 
     public Dialect getDefaultDialect() {
         return this.dialect;
-    }   
+    }
 
     /**
      * Return the ClassFieldExtractorCache, this should only be used internally, and is subject to change

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderErrors.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderErrors.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderErrors.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -12,6 +12,10 @@
         return errors;
     }
     
+    public boolean isEmpty() {
+        return this.errors.length == 0;
+    }
+    
     public String toString() {
         final StringBuffer buf = new StringBuffer();
         for ( int i = 0, length = this.errors.length; i < length; i++) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -43,6 +43,11 @@
 
     public void insertBeforeLast(final Class clazz,
                                  final BaseDescr baseDescr) {
+        if ( this.descrs.isEmpty() ) {
+            addDescr( baseDescr );
+            return;
+        }
+        
         for ( int i = this.descrs.size() - 1; i >= 0; i-- ) {
             if ( clazz.isInstance( this.descrs.get( i ) ) ) {
                 insertDescr( i,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/OrDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/OrDescr.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/OrDescr.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -31,8 +31,12 @@
     public OrDescr() {
     }
     
-    public void insertBeforeLast(final Class clazz ,final BaseDescr baseDescr ) {        
+    public void insertBeforeLast(final Class clazz ,final BaseDescr baseDescr ) {
         if(clazz.isInstance( baseDescr )) {
+            if ( this.descrs.isEmpty() ) {
+                addDescr( baseDescr );
+                return;
+            }
             for ( int i = this.descrs.size()-1; i >= 0; i-- ) {
                 if ( this.descrs.get( i ) instanceof FieldConstraintDescr ) {
                     insertDescr( i-1, baseDescr );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RuleDescr.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -60,6 +60,10 @@
     public String getDialect() {
         return this.dialect;
     }
+    
+    public void setDialect(String dialect) {
+        this.dialect = dialect;
+    }
 
     public String getSalience() {
         return salience;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -12,6 +12,7 @@
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.dialect.mvel.MVELDialect;
 import org.drools.util.StringUtils;
+import org.mvel.MVEL;
 import org.mvel.MVELTemplateRegistry;
 import org.mvel.TemplateInterpreter;
 import org.mvel.TemplateRegistry;
@@ -22,9 +23,9 @@
     protected static final TemplateRegistry INVOKER_REGISTRY = new MVELTemplateRegistry();
 
     static {
+        MVEL.setThreadSafe( true );        
         RULE_REGISTRY.registerTemplate( new InputStreamReader( AbstractJavaProcessBuilder.class.getResourceAsStream( "javaRule.mvel" ) ) );
         INVOKER_REGISTRY.registerTemplate( new InputStreamReader( AbstractJavaProcessBuilder.class.getResourceAsStream( "javaInvokers.mvel" ) ) );
-        MVELDialect.setLanguageLevel( 4 );
 
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -24,7 +24,6 @@
 
     static {
         MVEL.setThreadSafe( true );
-        MVELDialect.setLanguageLevel( 4 );   
         OptimizerFactory.setDefaultOptimizer( "reflective" );
         RULE_REGISTRY.registerTemplate( new InputStreamReader( AbstractJavaRuleBuilder.class.getResourceAsStream( "javaRule.mvel" ) ) );
         INVOKER_REGISTRY.registerTemplate( new InputStreamReader( AbstractJavaRuleBuilder.class.getResourceAsStream( "javaInvokers.mvel" ) ) );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -80,7 +80,7 @@
 
     public static final String                ID                          = "java";
 
-    private final static String               EXPRESSION_DIALECT_NAME     = "MVEL";
+    private final static String               EXPRESSION_DIALECT_NAME     = "mvel";
     // builders
     private static final PatternBuilder              pattern                     = new PatternBuilder();
     private static final QueryBuilder                query                       = new QueryBuilder();
@@ -114,18 +114,20 @@
     private PackageStore                      packageStoreWrapper;
     private Map                               errorHandlers;
     private List                              results;
+    private PackageBuilder                    packageBuilder;
 
     private TypeResolver                      typeResolver;
     private ClassFieldExtractorCache          classFieldExtractorCache;
 
     // a map of registered builders
-    private Map                               builders;
+    private static Map                               builders;
 
     public JavaDialect() {
 
     }
 
     public void init(PackageBuilder builder) {
+        this.packageBuilder = builder;
         this.pkg = builder.getPackage();
         this.configuration = (JavaDialectConfiguration) builder.getPackageBuilderConfiguration().getDialectConfiguration( "java" );
         this.typeResolver = builder.getTypeResolver();
@@ -139,7 +141,9 @@
             init( pkg );
         }
 
-        initBuilder();
+        if ( this.builders == null ) {
+            initBuilder();
+        }
 
         loadCompiler();
     }
@@ -203,9 +207,10 @@
         this.src = new MemoryResourceReader();
 
         this.generatedClassList = new ArrayList();
+        
+        JavaDialectData data = new JavaDialectData( this.pkg.getDialectDatas() );
+        this.pkg.getDialectDatas().setDialectData( ID, data );
 
-        JavaDialectData data = (JavaDialectData) this.pkg.getDialectDatas().getDialectData( this.ID );
-
         this.packageStoreWrapper = new PackageStore( data,
                                                      this.results );
     }
@@ -545,6 +550,7 @@
         JavaDialectData data = (JavaDialectData) this.pkg.getDialectDatas().getDialectData( this.ID );
         //System.out.println( functionDescr + " : " + typeResolver );
         final String functionClassName = this.pkg.getName() + "." + StringUtils.ucFirst( functionDescr.getName() );
+        functionDescr.setClassName( functionClassName );
         Function function = new Function( functionDescr.getName(),
                                           this.ID );
         this.pkg.addFunction( function );
@@ -567,6 +573,11 @@
         mapping.setOffset( functionDescr.getOffset() );
         this.pkg.getDialectDatas().getLineMappings().put( functionClassName,
                                                           mapping );
+        
+
+        this.pkg.addStaticImport( functionClassName + "." + functionDescr.getName() );   
+        
+        this.packageBuilder.getDialectRegistry().addStaticImport( functionClassName + "." + functionDescr.getName() );
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -30,6 +30,7 @@
 import org.drools.lang.descr.BaseDescr;
 import org.drools.rule.Accumulate;
 import org.drools.rule.Declaration;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.Pattern;
 import org.drools.rule.RuleConditionElement;
 import org.drools.rule.builder.AccumulateBuilder;
@@ -80,6 +81,9 @@
         final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
                                                                  source.getOuterDeclarations(),
                                                                  context.getPkg().getGlobals() );
+        
+        MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+        factory.setNextFactory( data.getFunctionFactory() );        
 
         Accumulator accumulator = null;
         Declaration[] declarations = null;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -12,6 +12,7 @@
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DescrBuildError;
 import org.drools.lang.descr.ActionDescr;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.builder.ActionBuilder;
 import org.drools.rule.builder.ConsequenceBuilder;
 import org.drools.rule.builder.PackageBuildContext;
@@ -56,6 +57,9 @@
                                                                      context.getPkg().getGlobals(),
                                                                      analysis.getBoundIdentifiers() );
             
+            MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+            factory.setNextFactory( data.getFunctionFactory() );            
+            
             actionNode.setAction( new MVELAction( expr, factory )  );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),

Modified: 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	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -9,6 +9,7 @@
 import org.drools.base.mvel.MVELConsequence;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DescrBuildError;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.builder.ConsequenceBuilder;
 import org.drools.rule.builder.RuleBuildContext;
 import org.mvel.Macro;
@@ -90,6 +91,7 @@
                                                                      null,
                                                                      context.getPkg().getGlobals(),
                                                                      analysis.getBoundIdentifiers() );
+            
 
             context.getRule().setConsequence( new MVELConsequence( expr,
                                                                    factory ) );

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	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -15,11 +15,10 @@
 import org.drools.base.TypeResolver;
 import org.drools.base.mvel.MVELDebugHandler;
 import org.drools.commons.jci.readers.MemoryResourceReader;
-import org.drools.compiler.ActionError;
+import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.ImportError;
 import org.drools.compiler.PackageBuilder;
-import org.drools.compiler.DescrBuildError;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.BaseDescr;
@@ -37,7 +36,9 @@
 import org.drools.lang.descr.QueryDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.rule.Declaration;
+import org.drools.rule.JavaDialectData;
 import org.drools.rule.LineMappings;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.Package;
 import org.drools.rule.builder.AccumulateBuilder;
 import org.drools.rule.builder.ActionBuilder;
@@ -63,20 +64,23 @@
 import org.drools.spi.DeclarationScopeResolver;
 import org.drools.spi.KnowledgeHelper;
 import org.drools.util.StringUtils;
+import org.mvel.MVEL;
+import org.mvel.ParserContext;
 import org.mvel.compiler.AbstractParser;
+import org.mvel.compiler.CompiledExpression;
 import org.mvel.compiler.ExpressionCompiler;
-import org.mvel.MVEL;
-import org.mvel.ParserContext;
+import org.mvel.debug.DebugTools;
 import org.mvel.optimizers.OptimizerFactory;
+import org.mvel.util.CompilerTools;
 import org.mvel.util.ParseTools;
 
 public class MVELDialect
     implements
     Dialect {
 
-    public final static String                    ID                          = "mvel";
+    public final static String                           ID                          = "mvel";
 
-    private final static String                   EXPRESSION_DIALECT_NAME     = "MVEL";
+    private final static String                          EXPRESSION_DIALECT_NAME     = "MVEL";
 
     private static final PatternBuilder                  pattern                     = new PatternBuilder();
     private static final QueryBuilder                    query                       = new QueryBuilder();
@@ -95,34 +99,29 @@
     private static final ForallBuilder                   forall                      = new ForallBuilder();
     private static final EntryPointBuilder               entrypoint                  = new EntryPointBuilder();
 
-    private Map                                   interceptors;
+    private Map                                          interceptors;
 
-    private List                                  results;
+    protected List                                       results;
     //private final JavaFunctionBuilder             function    = new JavaFunctionBuilder();
 
-    private MemoryResourceReader                  src;
+    protected MemoryResourceReader                       src;
 
-    private Package                               pkg;
-    private MVELDialectConfiguration              configuration;
-    private TypeResolver                          typeResolver;
-    private ClassFieldExtractorCache              classFieldExtractorCache;
-    private MVELExprAnalyzer                      analyzer;
+    protected Package                                    pkg;
+    protected MVELDialectData                            data;
+    private MVELDialectConfiguration                     configuration;
+    private TypeResolver                                 typeResolver;
+    private ClassFieldExtractorCache                     classFieldExtractorCache;
+    private MVELExprAnalyzer                             analyzer;
 
-    private Map                                   imports;
-    private Map                                   packageImports;
+    private Map                                          imports;
+    private Map                                          packageImports;
 
-    private boolean                               strictMode;
+    private boolean                                      strictMode;
 
-    private static Boolean                        languageSet                 = new Boolean( false );
+    private static Boolean                               languageSet                 = new Boolean( false );
 
-    public void addFunction(FunctionDescr functionDescr,
-                            TypeResolver typeResolver) {
-        throw new UnsupportedOperationException( "MVEL does not support functions" );
-
-    }
-
     // a map of registered builders
-    private Map builders;
+    private static Map                                   builders;
 
     public MVELDialect() {
     }
@@ -130,7 +129,7 @@
     public static void setLanguageLevel(int level) {
         synchronized ( languageSet ) {
             // this synchronisation is needed as setLanguageLevel is now thread safe
-            // and we do not want ot be calling this while something else is being parsed.
+            // and we do not want to be calling this while something else is being parsed.
             // the flag ensures it is just called once and no more.
             if ( languageSet.booleanValue() == false ) {
                 languageSet = new Boolean( true );
@@ -140,9 +139,9 @@
     }
 
     public void init(PackageBuilder builder) {
-        setLanguageLevel( 4 );
         this.pkg = builder.getPackage();
         this.configuration = (MVELDialectConfiguration) builder.getPackageBuilderConfiguration().getDialectConfiguration( "mvel" );
+        setLanguageLevel( this.configuration.getLangLevel() );
         this.typeResolver = builder.getTypeResolver();
         this.classFieldExtractorCache = builder.getClassFieldExtractorCache();
         this.strictMode = this.configuration.isStrict();
@@ -166,7 +165,9 @@
             init( pkg );
         }
 
-        initBuilder();
+        if ( this.builders == null ) {
+            initBuilder();
+        }
     }
 
     public void initBuilder() {
@@ -219,6 +220,9 @@
 
     public void init(Package pkg) {
         this.pkg = pkg;
+        this.data = new MVELDialectData( this.pkg.getDialectDatas() );
+        this.pkg.getDialectDatas().setDialectData( ID,
+                                                   this.data );
         this.results = new ArrayList();
         this.src = new MemoryResourceReader();
         if ( this.pkg != null ) {
@@ -263,7 +267,7 @@
         mapping.setOffset( ruleDescr.getConsequenceOffset() );
 
         context.getPkg().getDialectDatas().getLineMappings().put( name,
-                                                                            mapping );
+                                                                  mapping );
 
     }
 
@@ -271,6 +275,16 @@
         // @TODO setup line mappings
     }
 
+    public void addFunction(FunctionDescr functionDescr,
+                            TypeResolver typeResolver) {
+        ExpressionCompiler compiler = new ExpressionCompiler( (String) functionDescr.getContent() );
+        Serializable s1 = compiler.compile();
+        Map<String, org.mvel.ast.Function> map = CompilerTools.extractAllDeclaredFunctions( (CompiledExpression) s1 );
+        for ( org.mvel.ast.Function function : map.values() ) {
+            this.data.addFunction( function );
+        }
+    }
+
     public void addImport(String importEntry) {
         if ( importEntry.endsWith( ".*" ) ) {
             importEntry = importEntry.substring( 0,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialectConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialectConfiguration.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialectConfiguration.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -21,6 +21,8 @@
     private PackageBuilderConfiguration conf;
 
     private boolean                     strict;
+    
+    private int                         langLevel;
 
     public Dialect getDialect() {
         return new MVELDialect();
@@ -28,7 +30,8 @@
 
     public void init(PackageBuilderConfiguration conf) {
         this.conf = conf;
-        setStrict( getStrict() );
+        setStrict( determineStrict() );
+        setLangLevel( determineLangLevel() );
     }
 
     public PackageBuilderConfiguration getPackageBuilderConfiguration() {
@@ -42,12 +45,25 @@
     public boolean isStrict() {
         return this.strict;
     }
+    
+    public void setLangLevel(int langLevel) {
+        this.langLevel = langLevel;
+    }
+    
+    public int getLangLevel() {
+        return this.langLevel;
+    }
 
-    private boolean getStrict() {
+    private boolean determineStrict() {
         final String prop = this.conf.getChainedProperties().getProperty( "drools.dialect.mvel.strict",
                                                                           "true" );
         return Boolean.valueOf( prop ).booleanValue();
-
     }
+    
+    private int determineLangLevel() {
+        final String prop = this.conf.getChainedProperties().getProperty( "drools.dialect.mvel.langLevel",
+                                                                          "4" );
+        return Integer.valueOf( prop ).intValue();
+    }    
 
 }

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	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -30,6 +30,7 @@
 import org.drools.lang.descr.EvalDescr;
 import org.drools.rule.Declaration;
 import org.drools.rule.EvalCondition;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.Pattern;
 import org.drools.rule.RuleConditionElement;
 import org.drools.rule.builder.RuleBuildContext;
@@ -75,7 +76,10 @@
         try {
             final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
                                                                      null,
-                                                                     context.getPkg().getGlobals() );            
+                                                                     context.getPkg().getGlobals() );      
+            
+            MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+            factory.setNextFactory( data.getFunctionFactory() );            
 
             Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                       evalDescr,

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	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -28,6 +28,7 @@
 import org.drools.compiler.DescrBuildError;
 import org.drools.lang.descr.PredicateDescr;
 import org.drools.rule.Declaration;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.PredicateConstraint;
 import org.drools.rule.builder.PredicateBuilder;
 import org.drools.rule.builder.RuleBuildContext;
@@ -66,6 +67,9 @@
             final DroolsMVELFactory factory = new DroolsMVELFactory( previousMap,
                                                                      localMap,
                                                                      context.getPkg().getGlobals() );
+            
+            MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+            factory.setNextFactory( data.getFunctionFactory() );            
 
             Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                       predicateDescr,

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	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -27,6 +27,7 @@
 import org.drools.compiler.Dialect;
 import org.drools.lang.descr.ReturnValueRestrictionDescr;
 import org.drools.rule.Declaration;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.ReturnValueRestriction;
 import org.drools.rule.builder.ReturnValueBuilder;
 import org.drools.rule.builder.RuleBuildContext;
@@ -65,6 +66,9 @@
         final DroolsMVELFactory factory = new DroolsMVELFactory( previousMap,
                                                                  localMap,
                                                                  context.getPkg().getGlobals() );
+        
+        MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+        factory.setNextFactory( data.getFunctionFactory() );        
 
         Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                   returnValueRestrictionDescr,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -14,6 +14,7 @@
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.ReturnValueDescr;
 import org.drools.lang.descr.ActionDescr;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.builder.ActionBuilder;
 import org.drools.rule.builder.ConsequenceBuilder;
 import org.drools.rule.builder.PackageBuildContext;
@@ -61,6 +62,9 @@
                                                                      context.getPkg().getGlobals(),
                                                                      analysis.getBoundIdentifiers() );
             
+            MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+            factory.setNextFactory( data.getFunctionFactory() );            
+            
             constraintNode.setEvaluator( new MVELReturnValueEvaluator( expr, factory ) );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),

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	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -7,6 +7,7 @@
 import org.drools.base.mvel.MVELSalienceExpression;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DescrBuildError;
+import org.drools.rule.MVELDialectData;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.SalienceBuilder;
 import org.mvel.compiler.AbstractParser;
@@ -27,6 +28,9 @@
             final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
                                                                      null,
                                                                      context.getPkg().getGlobals() );
+            
+            MVELDialectData data = (MVELDialectData) context.getPkg().getDialectDatas().getDialectData( "mvel" );
+            factory.setNextFactory( data.getFunctionFactory() );            
 
             // This builder is re-usable in other dialects, so specify by name            
             MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf	2008-02-07 03:58:30 UTC (rev 18356)
@@ -4,6 +4,7 @@
 
 drools.dialect.mvel = org.drools.rule.builder.dialect.mvel.MVELDialectConfiguration
 drools.dialect.mvel.strict = true
+drools.dialect.mvel.langLevel = 4
 
 drools.accumulate.function.average = org.drools.base.accumulators.AverageAccumulateFunction
 drools.accumulate.function.max = org.drools.base.accumulators.MaxAccumulateFunction

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2008-02-06 22:08:32 UTC (rev 18355)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2008-02-07 03:58:30 UTC (rev 18356)
@@ -14,11 +14,6 @@
 
 public class MockRuleBase implements RuleBase {
 
-	public void addPackage(Package pkg) throws Exception {
-		// TODO Auto-generated method stub
-
-	}
-
 	public int getAdditionsSinceLock() {
 		// TODO Auto-generated method stub
 		return 0;
@@ -127,4 +122,9 @@
         return null;
     }
 
+    public void addPackage(Package pkg) {
+        // TODO Auto-generated method stub
+        
+    }
+
 }




More information about the jboss-svn-commits mailing list