[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