[jboss-svn-commits] JBL Code SVN: r13271 - in labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src: main/java/org/drools/rule/builder/dialect/java and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 9 15:20:21 EDT 2007


Author: pombredanne
Date: 2007-07-09 15:20:21 -0400 (Mon, 09 Jul 2007)
New Revision: 13271

Added:
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseComplex.xml
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_complex.drl
Modified:
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTest.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTestHelper.java
   labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml
Log:
Ported r13267 from trunk to branch mvel-tooling-2007-06-30

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -233,12 +233,11 @@
 
     public void visitNotDescr(final NotDescr descr) {
         this.template = new String();
-        if ( descr.getDescrs().isEmpty() ) {
-            this.template = "\t   not " + processDescrList( descr.getDescrs() );
+        if ( !descr.getDescrs().isEmpty() ) {
+            this.template = "\t   not ( " + processDescrList( descr.getDescrs() ) +")";
         } else {
             this.template = "";
         }
-
     }
 
     public void visitOrDescr(final OrDescr descr) {
@@ -283,13 +282,22 @@
 
     public void visitQueryDescr(final QueryDescr descr) {
         this.template = new String();
-        this.template = "<query name=\"" + descr.getName() + "\">" + "<lhs>" + processDescrList( descr.getLhs().getDescrs() ) + "</lhs>" + "</query>";
+        this.template = "query \"" + descr.getName() + "\"" + processDescrList( descr.getLhs().getDescrs() )  + "end";
     }
+    
 
     private String processRules(final List rules) {
         String ruleList = "";
+        Object ruleobj;
         for ( final Iterator iterator = rules.iterator(); iterator.hasNext(); ) {
-            final RuleDescr ruleDescr = (RuleDescr) iterator.next();
+        	ruleobj = iterator.next();
+        	if ( ruleobj instanceof QueryDescr ) {
+        		visitQueryDescr((QueryDescr) ruleobj);
+        		ruleList += this.template;
+        		break;
+        	}
+
+        	final RuleDescr ruleDescr = (RuleDescr) ruleobj;
             String rule = "rule \"" + ruleDescr.getName() + "\" " + DrlDumper.eol;
             final String attribute = processAttribute( ruleDescr.getAttributes() );
             String lhs = "";

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -48,15 +48,15 @@
     AccumulateBuilder {
 
     public RuleConditionElement build(final RuleBuildContext context,
-                                    final BaseDescr descr) {
+                                      final BaseDescr descr) {
         return build( context,
                       descr,
                       null );
     }
 
     public RuleConditionElement build(final RuleBuildContext context,
-                                    final BaseDescr descr,
-                                    final Pattern prefixPattern) {
+                                      final BaseDescr descr,
+                                      final Pattern prefixPattern) {
 
         final AccumulateDescr accumDescr = (AccumulateDescr) descr;
 
@@ -119,24 +119,32 @@
             final String className = "Accumulate" + context.getNextId();
             accumDescr.setClassName( className );
 
-            final JavaAnalysisResult analysis1 = (JavaAnalysisResult) context.getDialect().analyzeBlock( context,
+            final JavaAnalysisResult initCodeAnalysis = (JavaAnalysisResult) context.getDialect().analyzeBlock( context,
                                                                                                          accumDescr,
                                                                                                          accumDescr.getInitCode() );
-            final Dialect.AnalysisResult analysis2 = context.getDialect().analyzeBlock( context,
+            final Dialect.AnalysisResult actionCodeAnalysis = context.getDialect().analyzeBlock( context,
                                                                                         accumDescr,
                                                                                         accumDescr.getActionCode() );
-            final Dialect.AnalysisResult analysis3 = context.getDialect().analyzeExpression( context,
+            final Dialect.AnalysisResult resultCodeAnalysis = context.getDialect().analyzeExpression( context,
                                                                                              accumDescr,
                                                                                              accumDescr.getResultCode() );
 
-            final List requiredDeclarations = new ArrayList( analysis1.getBoundIdentifiers()[0] );
-            requiredDeclarations.addAll( analysis2.getBoundIdentifiers()[0] );
-            requiredDeclarations.addAll( analysis3.getBoundIdentifiers()[0] );
+            final List requiredDeclarations = new ArrayList( initCodeAnalysis.getBoundIdentifiers()[0] );
+            requiredDeclarations.addAll( actionCodeAnalysis.getBoundIdentifiers()[0] );
+            requiredDeclarations.addAll( resultCodeAnalysis.getBoundIdentifiers()[0] );
 
-            final List requiredGlobals = new ArrayList( analysis1.getBoundIdentifiers()[1] );
-            requiredGlobals.addAll( analysis2.getBoundIdentifiers()[1] );
-            requiredGlobals.addAll( analysis3.getBoundIdentifiers()[1] );
+            final List requiredGlobals = new ArrayList( initCodeAnalysis.getBoundIdentifiers()[1] );
+            requiredGlobals.addAll( actionCodeAnalysis.getBoundIdentifiers()[1] );
+            requiredGlobals.addAll( resultCodeAnalysis.getBoundIdentifiers()[1] );
 
+            if ( accumDescr.getReverseCode() != null ) {
+                final Dialect.AnalysisResult reverseCodeAnalysis = context.getDialect().analyzeBlock( context,
+                                                                                                      accumDescr,
+                                                                                                      accumDescr.getActionCode() );
+                requiredDeclarations.addAll( reverseCodeAnalysis.getBoundIdentifiers()[0] );
+                requiredGlobals.addAll( reverseCodeAnalysis.getBoundIdentifiers()[1] );
+            }
+
             final Declaration[] declarations = new Declaration[requiredDeclarations.size()];
             for ( int i = 0, size = requiredDeclarations.size(); i < size; i++ ) {
                 declarations[i] = context.getDeclarationResolver().getDeclaration( (String) requiredDeclarations.get( i ) );
@@ -157,15 +165,15 @@
             map.put( "innerDeclarations",
                      sourceDeclArr );
 
-            final String initCode = this.fixInitCode( analysis1,
+            final String initCode = this.fixInitCode( initCodeAnalysis,
                                                       accumDescr.getInitCode() );
             final String actionCode = accumDescr.getActionCode();
             final String resultCode = accumDescr.getResultCode();
 
-            String[] attributesTypes = new String[analysis1.getLocalVariablesMap().size()];
-            String[] attributes = new String[analysis1.getLocalVariablesMap().size()];
+            String[] attributesTypes = new String[initCodeAnalysis.getLocalVariablesMap().size()];
+            String[] attributes = new String[initCodeAnalysis.getLocalVariablesMap().size()];
             int index = 0;
-            for ( Iterator it = analysis1.getLocalVariablesMap().entrySet().iterator(); it.hasNext(); ) {
+            for ( Iterator it = initCodeAnalysis.getLocalVariablesMap().entrySet().iterator(); it.hasNext(); ) {
                 Map.Entry entry = (Map.Entry) it.next();
                 attributes[index] = (String) entry.getKey();
                 attributesTypes[index] = ((JavaLocalDeclarationDescr) entry.getValue()).getType();

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -69,13 +69,15 @@
         if ( sourcePattern == null ) {
             return null;
         }
+        
+        MVELDialect dialect = (MVELDialect) context.getDialect();
 
         final Declaration[] sourceDeclArr = (Declaration[]) sourcePattern.getOuterDeclarations().values().toArray( new Declaration[0] );
 
         final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
                                                                  sourcePattern.getOuterDeclarations(),
                                                                  context.getPkg().getGlobals() );
-        factory.setNextFactory( ((MVELDialect) context.getDialect()).getClassImportResolverFactory() );
+        factory.setNextFactory( dialect.getClassImportResolverFactory() );
 
         Accumulator accumulator = null;
         Declaration[] declarations = null;
@@ -102,37 +104,53 @@
                                                                function );
         } else {
             // it is a custom accumulate
-            final Dialect.AnalysisResult analysis1 = context.getDialect().analyzeBlock( context,
+            final Dialect.AnalysisResult initCodeAnalysis = context.getDialect().analyzeBlock( context,
                                                                                         accumDescr,
                                                                                         accumDescr.getInitCode() );
-            final Dialect.AnalysisResult analysis2 = context.getDialect().analyzeBlock( context,
+            final Dialect.AnalysisResult actionCodeAnalysis = context.getDialect().analyzeBlock( context,
                                                                                         accumDescr,
                                                                                         accumDescr.getActionCode() );
-            final Dialect.AnalysisResult analysis3 = context.getDialect().analyzeExpression( context,
+            final Dialect.AnalysisResult resultCodeAnalysis = context.getDialect().analyzeExpression( context,
                                                                                              accumDescr,
                                                                                              accumDescr.getResultCode() );
 
-            final List requiredDeclarations = new ArrayList( analysis1.getBoundIdentifiers()[0] );
-            requiredDeclarations.addAll( analysis2.getBoundIdentifiers()[0] );
-            requiredDeclarations.addAll( analysis3.getBoundIdentifiers()[0] );
+            final List requiredDeclarations = new ArrayList( initCodeAnalysis.getBoundIdentifiers()[0] );
+            requiredDeclarations.addAll( actionCodeAnalysis.getBoundIdentifiers()[0] );
+            requiredDeclarations.addAll( resultCodeAnalysis.getBoundIdentifiers()[0] );
 
+            if ( accumDescr.getReverseCode() != null ) {
+                final Dialect.AnalysisResult reverseCodeAnalysis = context.getDialect().analyzeBlock( context,
+                                                                                                      accumDescr,
+                                                                                                      accumDescr.getActionCode() );
+                requiredDeclarations.addAll( reverseCodeAnalysis.getBoundIdentifiers()[0] );
+            }
+
             declarations = new Declaration[requiredDeclarations.size()];
             for ( int i = 0, size = requiredDeclarations.size(); i < size; i++ ) {
                 declarations[i] = context.getDeclarationResolver().getDeclaration( (String) requiredDeclarations.get( i ) );
             }
+            
+            final Serializable init = dialect.compile( (String) accumDescr.getInitCode(), initCodeAnalysis, null, context );
+            final Serializable action = dialect.compile((String) accumDescr.getActionCode(), actionCodeAnalysis, null, context );
 
-            final Serializable init = MVEL.compileExpression( (String) accumDescr.getInitCode(),
-                                                              ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
-            final Serializable action = MVEL.compileExpression( (String) accumDescr.getActionCode(),
-                                                                ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+            
+           
+
+//            final Serializable init = MVEL.compileExpression( (String) accumDescr.getInitCode(),
+//                                                              ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+//            final Serializable action = MVEL.compileExpression( (String) accumDescr.getActionCode(),
+//                                                                ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
             Serializable reverse = null;
             if ( accumDescr.getReverseCode() != null ) {
-                reverse = MVEL.compileExpression( (String) accumDescr.getReverseCode(),
-                                                  ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+//                reverse = MVEL.compileExpression( (String) accumDescr.getReverseCode(),
+//                                                  ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+                reverse = dialect.compile( (String) accumDescr.getReverseCode(), resultCodeAnalysis, null, context );
             }
-            final Serializable result = MVEL.compileExpression( (String) accumDescr.getResultCode(),
-                                                                ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
+//            final Serializable result = MVEL.compileExpression( (String) accumDescr.getResultCode(),
+//                                                                ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses() );
 
+            final Serializable result = dialect.compile((String) accumDescr.getResultCode(), resultCodeAnalysis, null, context );
+            
             accumulator = new MVELAccumulator( factory,
                                                init,
                                                action,

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -9,6 +9,7 @@
 import org.drools.base.mvel.MVELConsequence;
 import org.drools.compiler.RuleError;
 import org.drools.rule.builder.ConsequenceBuilder;
+import org.drools.rule.builder.Dialect;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.spi.KnowledgeHelper;
 import org.mvel.ASTNode;
@@ -27,15 +28,12 @@
 
     //private final Interceptor assertInterceptor;
     //private final Interceptor modifyInterceptor;
-    private final Map         interceptors;
+
     private final Map macros;
 
     public MVELConsequenceBuilder() {
-        this.interceptors = new HashMap(1);
-        this.interceptors.put( "Modify", new ModifyInterceptor() );
+        macros = new HashMap( 4 );
 
-         macros = new HashMap(4);
-
         macros.put( "insert",
                     new Macro() {
                         public String doMacro() {
@@ -70,38 +68,48 @@
         context.getBuildStack().push( context.getRule().getLhs() );
 
         try {
+            MVELDialect dialect = (MVELDialect) context.getDialect();
             final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
                                                                      null,
                                                                      context.getPkg().getGlobals() );
-            MVELDialect dialect = (MVELDialect) context.getDialect();
-			factory.setNextFactory( dialect.getClassImportResolverFactory() );
 
+            factory.setNextFactory( dialect.getClassImportResolverFactory() );
+
             MacroProcessor macroProcessor = new MacroProcessor();
             macroProcessor.setMacros( macros );
 
-//MVEL: Compiler change
-//            final Serializable expr = MVEL.compileExpression( macroProcessor.parse( delimitExpressions( (String) context.getRuleDescr().getConsequence() )),
-//                                                              ((MVELDialect) context.getDialect()).getClassImportResolverFactory().getImportedClasses(), this.interceptors );
+            //MVEL: Compiler change (commented after incomming changes from r13267 port
+//            String pkg = "";
+//            if (context.getPkg()!= null && context.getPkg().getName()!= null
+//            		&& context.getPkg().getName().length()>0) {
+//                pkg = context.getPkg().getName()+".";
+//            }
+//            String sourceFile = pkg + context.getRuleDescr().getClassName();
+//
+//			ParserContext parserContext = new ParserContext();
+//			parserContext.setImports(dialect.getClassImportResolverFactory().getImportedClasses());
+//
+//			parserContext.setInterceptors(this.interceptors);
+//			parserContext.setSourceFile(sourceFile);
+//			parserContext.setDebugSymbols( true );
+//
+//			ExpressionCompiler parser = new ExpressionCompiler(macroProcessor.parse( delimitExpressions( (String) context.getRuleDescr().getConsequence() )));
+//			CompiledExpression cExpr = parser.compile();
+//
+//            final Serializable expr = cExpr;
 
-            String pkg = "";
-            if (context.getPkg()!= null && context.getPkg().getName()!= null
-            		&& context.getPkg().getName().length()>0) {
-                pkg = context.getPkg().getName()+".";
-            }
-            String sourceFile = pkg + context.getRuleDescr().getClassName();
+            String text = macroProcessor.parse( delimitExpressions( (String) context.getRuleDescr().getConsequence() ) );
 
-			ParserContext parserContext = new ParserContext();
-			parserContext.setImports(dialect.getClassImportResolverFactory().getImportedClasses());
+            Dialect.AnalysisResult analysis = dialect.analyzeBlock( context,
+                                                                    context.getRuleDescr(),
+                                                                    dialect.getInterceptors(),
+                                                                    text );
 
-			parserContext.setInterceptors(this.interceptors);
-			parserContext.setSourceFile(sourceFile);
-			parserContext.setDebugSymbols( true );
+            final Serializable expr = dialect.compile( text,
+                                                       analysis,
+                                                       dialect.getInterceptors(),
+                                                       context );
 
-			ExpressionCompiler parser = new ExpressionCompiler(macroProcessor.parse( delimitExpressions( (String) context.getRuleDescr().getConsequence() )));
-			CompiledExpression cExpr = parser.compile();
-
-            final Serializable expr = cExpr;
-
             context.getRule().setConsequence( new MVELConsequence( expr,
                                                                    factory ) );
         } catch ( final Exception e ) {
@@ -165,44 +173,5 @@
         return result.toString();
     }
 
-    public static class AssertInterceptor
-        implements
-        Interceptor {
-        public int doBefore(ASTNode node,
-                            VariableResolverFactory factory) {
-            return 0;
         }
 
-        public int doAfter(Object value,
-                           ASTNode node,
-                           VariableResolverFactory factory) {
-            ((DroolsMVELFactory) factory).getWorkingMemory().insert( value );
-            return 0;
-        }
-    }
-
-    public static class ModifyInterceptor
-        implements
-        Interceptor {
-        public int doBefore(ASTNode node,
-                            VariableResolverFactory factory) {
-            Object object = ((WithNode) node). getNestedStatement().getValue( null,
-                                                                              factory );
-
-            DroolsMVELKnowledgeHelper resolver = ( DroolsMVELKnowledgeHelper ) factory.getVariableResolver( "drools" );
-            KnowledgeHelper helper = ( KnowledgeHelper ) resolver.getValue();
-            helper.modifyRetract( object );
-            return 0;
-        }
-
-        public int doAfter(Object value,
-                           ASTNode node,
-                           VariableResolverFactory factory) {
-            DroolsMVELKnowledgeHelper resolver = ( DroolsMVELKnowledgeHelper ) factory.getVariableResolver( "drools" );
-            KnowledgeHelper helper = ( KnowledgeHelper ) resolver.getValue();
-            helper.modifyInsert( value );
-            return 0;
-        }
-    }
-
-}

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -11,6 +11,8 @@
 
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.TypeResolver;
+import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.DroolsMVELKnowledgeHelper;
 import org.drools.commons.jci.readers.MemoryResourceReader;
 import org.drools.compiler.ImportError;
 import org.drools.compiler.PackageBuilder;
@@ -45,10 +47,15 @@
 import org.drools.rule.builder.SalienceBuilder;
 import org.drools.rule.builder.dialect.java.JavaDialect;
 import org.drools.spi.DeclarationScopeResolver;
+import org.drools.spi.KnowledgeHelper;
 import org.drools.util.StringUtils;
+import org.mvel.ASTNode;
 import org.mvel.AbstractParser;
 import org.mvel.ExpressionCompiler;
 import org.mvel.ParserContext;
+import org.mvel.ast.WithNode;
+import org.mvel.integration.Interceptor;
+import org.mvel.integration.VariableResolverFactory;
 import org.mvel.integration.impl.ClassImportResolverFactory;
 import org.mvel.integration.impl.StaticMethodImportResolverFactory;
 
@@ -73,6 +80,8 @@
     //private final JavaRuleClassBuilder            rule        = new JavaRuleClassBuilder();
     private final MVELFromBuilder                   from                    = new MVELFromBuilder();
 
+    private final Map interceptors;
+
     private Map                            lineMappings;
 
     private List                                    results;
@@ -99,7 +108,7 @@
     private Map builders;
 
     public MVELDialect(final PackageBuilder builder) {
-        AbstractParser.setLanguageLevel(4);
+        AbstractParser.setLanguageLevel( 4 );
 
         this.pkg = builder.getPackage();
         this.configuration = builder.getPackageBuilderConfiguration();
@@ -116,6 +125,10 @@
 
         initBuilder();
 
+        this.interceptors = new HashMap( 1 );
+        this.interceptors.put( "Modify",
+                               new ModifyInterceptor() );
+
         this.importFactory = new ClassImportResolverFactory();
         this.staticImportFactory = new StaticMethodImportResolverFactory();
         this.importFactory.setNextFactory( this.staticImportFactory );
@@ -155,6 +168,8 @@
 
         this.builders.put( EvalDescr.class,
                            getEvalBuilder() );
+
+
     }
 
     public void init(Package pkg) {
@@ -265,6 +280,16 @@
     public Dialect.AnalysisResult analyzeBlock(RuleBuildContext context,
                                                BaseDescr descr,
                                                String text) {
+        return analyzeBlock( context,
+                             descr,
+                             null,
+                             text );
+    }
+
+    public Dialect.AnalysisResult analyzeBlock(RuleBuildContext context,
+                                               BaseDescr descr,
+                                               Map interceptors,
+                                               String text) {
         Dialect.AnalysisResult result = null;
         try {
             result = this.analyzer.analyzeExpression( context,
@@ -279,24 +304,36 @@
         return result;
     }
 
-    public Serializable compile(final String text, final Dialect.AnalysisResult analysis, final RuleBuildContext context) {
-        final ParserContext parserContext = new ParserContext( getClassImportResolverFactory().getImportedClasses(), null, null);
+    public Serializable compile(final String text,
+                                final Dialect.AnalysisResult analysis,
+                                final Map interceptors,
+                                final RuleBuildContext context) {
+        final ParserContext parserContext = new ParserContext( getClassImportResolverFactory().getImportedClasses(),
+                                                               null,
+                                                               null );
         parserContext.setStrictTypeEnforcement( true );
+        if ( interceptors != null ) {
+            parserContext.setInterceptors( interceptors );
+        }
 
         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 );
+            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 ) );
+            parserContext.addInput( identifier,
+            						(Class) globalTypes.get( identifier ) );
         }
 
+        parserContext.addInput( "drools", KnowledgeHelper.class );
+
         ExpressionCompiler compiler = new ExpressionCompiler( text );
         return compiler.compile( parserContext );
     }
@@ -366,9 +403,52 @@
         return this.typeResolver;
     }
 
+    public Map getInterceptors() {
+        return this.interceptors;
+    }
+
     public String getId() {
     	//MVEL: Compiler change
         return ID;
     }
 
+    public static class AssertInterceptor
+    implements
+    Interceptor {
+    public int doBefore(ASTNode node,
+                        VariableResolverFactory factory) {
+        return 0;
+    }
+
+    public int doAfter(Object value,
+                       ASTNode node,
+                       VariableResolverFactory factory) {
+        ((DroolsMVELFactory) factory).getWorkingMemory().insert( value );
+        return 0;
+    }
 }
+
+public static class ModifyInterceptor
+    implements
+    Interceptor {
+    public int doBefore(ASTNode node,
+                        VariableResolverFactory factory) {
+        Object object = ((WithNode) node).getNestedStatement().getValue( null,
+                                                                         factory );
+
+        DroolsMVELKnowledgeHelper resolver = (DroolsMVELKnowledgeHelper) factory.getVariableResolver( "drools" );
+        KnowledgeHelper helper = (KnowledgeHelper) resolver.getValue();
+        helper.modifyRetract( object );
+        return 0;
+    }
+
+    public int doAfter(Object value,
+                       ASTNode node,
+                       VariableResolverFactory factory) {
+        DroolsMVELKnowledgeHelper resolver = (DroolsMVELKnowledgeHelper) factory.getVariableResolver( "drools" );
+        KnowledgeHelper helper = (KnowledgeHelper) resolver.getValue();
+        helper.modifyInsert( value );
+        return 0;
+    }
+}
+}

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -88,7 +88,7 @@
 
             final EvalCondition eval = new EvalCondition( declarations );                        
             
-            Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) evalDescr.getContent(), analysis, context );
+            Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) evalDescr.getContent(), analysis, null, context );
 
             eval.setEvalExpression( new MVELEvalExpression( expr,
                                                             factory ) );

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -56,13 +56,15 @@
     public MVELAnalysisResult analyzeExpression(final RuleBuildContext context,
                                                 final String expr,
                                                 final Set[] availableIdentifiers) throws RecognitionException {
-        ExpressionCompiler compiler = new ExpressionCompiler( expr);
+        ExpressionCompiler compiler = new ExpressionCompiler( expr );
+
         ParserContext parserContext = new ParserContext();
         parserContext.setStrictTypeEnforcement( false );
         MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
         parserContext.setImports( dialect.getClassImportResolverFactory().getImportedClasses() );
+        parserContext.setInterceptors( dialect.getInterceptors() );
 
-        compiler.compile(parserContext);
+        compiler.compile( parserContext );
 
         return analyze( compiler.getParserContextState().getInputs().keySet(),
                         availableIdentifiers );
@@ -82,7 +84,7 @@
      *             If an error occurs in the parser.
      */
     private MVELAnalysisResult analyze(final Set identifiers,
-                           final Set[] availableIdentifiers) throws RecognitionException {
+                                       final Set[] availableIdentifiers) throws RecognitionException {
 
         MVELAnalysisResult result = new MVELAnalysisResult();
         result.setIdentifiers( new ArrayList( identifiers ) );

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -77,6 +77,7 @@
 
             final Serializable expr = dialect.compile( text,
                                                        analysis,
+                                                       null,
                                                        context );
 
             dataProvider = new MVELDataProvider( expr,

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -73,7 +73,7 @@
                                                                                       predicateDescr,
                                                                                       predicateDescr.getContent() );
             
-            final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) predicateDescr.getContent(), analysis, context );            
+            final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) predicateDescr.getContent(), analysis, null, context );            
             
             predicate.setPredicateExpression( new MVELPredicateExpression( expr,
                                                                            factory ) );

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -73,7 +73,7 @@
                                                                                   returnValueRestrictionDescr,
                                                                                   returnValueRestrictionDescr.getContent() );
         
-        final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) returnValueRestrictionDescr.getContent(), analysis, context );        
+        final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) returnValueRestrictionDescr.getContent(), analysis, null, context );        
         
         returnValueRestriction.setReturnValueExpression( new MVELReturnValueExpression( expr,
                                                                                         factory ) );

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -36,6 +36,7 @@
 
             final Serializable expr = dialect.compile( (String) context.getRuleDescr().getSalience(),
                                                                                     analysis,
+                                                                                    null,
                                                                                     context );
 
             MVELSalienceExpression salience = new MVELSalienceExpression( expr,

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/integrationtests/AccumulateTest.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -473,7 +473,7 @@
                              results.size() );
 
     }
-    
+
     public void testAccumulateMax() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_AccumulateMax.drl" ) );
@@ -487,11 +487,11 @@
 
         final Cheese[] cheese = new Cheese[]{new Cheese( "stilton",
                                                          4 ), new Cheese( "stilton",
-                                                                           2 ), new Cheese( "stilton",
-                                                                                            3 ), new Cheese( "brie",
-                                                                                                              15 ), new Cheese( "brie",
-                                                                                                                                17 ), new Cheese( "provolone",
-                                                                                                                                                  8 )};
+                                                                          2 ), new Cheese( "stilton",
+                                                                                           3 ), new Cheese( "brie",
+                                                                                                            15 ), new Cheese( "brie",
+                                                                                                                              17 ), new Cheese( "provolone",
+                                                                                                                                                8 )};
         final Person bob = new Person( "Bob",
                                        "stilton" );
 
@@ -542,7 +542,7 @@
                              results.size() );
 
     }
-    
+
     public void testAccumulateMin() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_AccumulateMin.drl" ) );
@@ -556,11 +556,11 @@
 
         final Cheese[] cheese = new Cheese[]{new Cheese( "stilton",
                                                          8 ), new Cheese( "stilton",
-                                                                           10 ), new Cheese( "stilton",
+                                                                          10 ), new Cheese( "stilton",
                                                                                             9 ), new Cheese( "brie",
-                                                                                                              4 ), new Cheese( "brie",
-                                                                                                                                1 ), new Cheese( "provolone",
-                                                                                                                                                  8 )};
+                                                                                                             4 ), new Cheese( "brie",
+                                                                                                                              1 ), new Cheese( "provolone",
+                                                                                                                                               8 )};
         final Person bob = new Person( "Bob",
                                        "stilton" );
 
@@ -611,7 +611,7 @@
                              results.size() );
 
     }
-    
+
     public void testAccumulateCount() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_AccumulateCount.drl" ) );
@@ -625,11 +625,11 @@
 
         final Cheese[] cheese = new Cheese[]{new Cheese( "stilton",
                                                          8 ), new Cheese( "stilton",
-                                                                           10 ), new Cheese( "stilton",
+                                                                          10 ), new Cheese( "stilton",
                                                                                             9 ), new Cheese( "brie",
-                                                                                                              4 ), new Cheese( "brie",
-                                                                                                                                1 ), new Cheese( "provolone",
-                                                                                                                                                  8 )};
+                                                                                                             4 ), new Cheese( "brie",
+                                                                                                                              1 ), new Cheese( "provolone",
+                                                                                                                                               8 )};
         final Person bob = new Person( "Bob",
                                        "stilton" );
 
@@ -681,7 +681,7 @@
                              results.size() );
 
     }
-    
+
     public void testAccumulateWithFromChaining() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_AccumulateWithFromChaining.drl" ) );
@@ -695,20 +695,20 @@
 
         final Cheese[] cheese = new Cheese[]{new Cheese( "stilton",
                                                          8 ), new Cheese( "stilton",
-                                                                           10 ), new Cheese( "stilton",
+                                                                          10 ), new Cheese( "stilton",
                                                                                             9 ), new Cheese( "brie",
-                                                                                                              4 ), new Cheese( "brie",
-                                                                                                                                1 ), new Cheese( "provolone",
-                                                                                                                                                  8 )};
+                                                                                                             4 ), new Cheese( "brie",
+                                                                                                                              1 ), new Cheese( "provolone",
+                                                                                                                                               8 )};
 
         Cheesery cheesery = new Cheesery();
-        
-        for( int i = 0; i < cheese.length; i++ ) {
+
+        for ( int i = 0; i < cheese.length; i++ ) {
             cheesery.addCheese( cheese[i] );
         }
-        
+
         FactHandle cheeseryHandle = wm.insert( cheesery );
-        
+
         final Person bob = new Person( "Bob",
                                        "stilton" );
 

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -36,7 +36,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/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTest.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTest.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTest.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -11,7 +11,6 @@
 
 public class DumperTest extends TestCase {
 
-
     // Xml Dumper test
     
     public void testRoundTripAccumulateXml() throws Exception {
@@ -21,7 +20,7 @@
     public void testRoundTripCollectXml() throws Exception {
         DumperTestHelper.XmlFile( "test_ParseCollect.xml" );
     }
-
+    
     public void testRoundTripExistsXml() throws Exception {
         DumperTestHelper.XmlFile( "test_ParseExists.xml" );
     }
@@ -67,4 +66,15 @@
     public void testRoundTripSimpleRuleDrl() throws Exception {
         DumperTestHelper.DrlFile( "test_simplerule.drl" );
     }
+
+    public void testRoundTripPComplexDrl() throws Exception {
+        DumperTestHelper.DrlFile( "test_complex.drl" );
+    }
+    
+    public void testRoundTripPComplexXml() throws Exception {
+        DumperTestHelper.XmlFile( "test_ParseComplex.xml" );
+    }
+    
+
+    
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTestHelper.java
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTestHelper.java	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/java/org/drools/xml/DumperTestHelper.java	2007-07-09 19:20:21 UTC (rev 13271)
@@ -27,8 +27,9 @@
 
         final XmlDumper dumper = new XmlDumper();
         final String result = dumper.dump( pkgOriginal );
-
+        
         String buffer = readFile( filename );
+        
         assertEqualsIgnoreWhitespace( buffer,
                                       result );
         assertNotNull( result );

Copied: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseComplex.xml (from rev 13267, labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_ParseComplex.xml)
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseComplex.xml	                        (rev 0)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseComplex.xml	2007-07-09 19:20:21 UTC (rev 13271)
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package name="pt.inescporto.cec.rules"
+    xmlns="http://drools.org/drools-4.0"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://drools.org/drools-4.0 drools-4.0.xsd">
+    <import name="pt.inescporto.cec.entities.SetupInUse"/>
+    <import name="pt.inescporto.cec.entities.SetupUse"/>
+    <import name="pt.inescporto.cec.entities.ArtigoProducao"/>
+    <import name="pt.inescporto.cec.entities.Parameter"/>
+    <import name="pt.inescporto.cec.entities.BestParms"/>
+    <import name="pt.inescporto.cec.entities.AccaoInspeccaoOperacao"/>
+    <import name="pt.inescporto.cec.entities.MelhorEmNaoConformidades"/>
+    <import name="pt.inescporto.cec.entities.OtherInspectionMethod"/>
+    <import name="pt.inescporto.cec.entities.AccaoInspeccao"/>
+    <rule name="ruleBestProductionOrderCreator">
+        <lhs>
+            <pattern object-type="AccaoInspeccao">
+                <field-binding field-name="recursoID" identifier="resource"/>
+                <field-constraint field-name="artigoID">
+                    <literal-restriction evaluator="==" value="3"/>
+                </field-constraint>
+                <field-binding field-name="operacaoID" identifier="operation"/>
+                <field-binding field-name="ordemProducaoID" identifier="ProductionOrder"/>
+                <field-binding field-name="recursoID" identifier="resourceID"/>
+                <field-binding field-name="accaoInspeccaoID" identifier="InspectionAction"/>
+            </pattern>
+            <pattern object-type="AccaoInspeccaoOperacao">
+                <field-binding field-name="inspAccaoOperacaoID" identifier="inspectionActionOperation"/>
+                <field-constraint field-name="inspectionActionID">
+                    <variable-restriction evaluator="==" identifier="InspectionAction"/>
+                </field-constraint>
+            </pattern>
+            <pattern object-type="OtherInspectionMethod">
+                <field-binding field-name="numeroNaoConformidades" identifier="NCNumber"/>
+                <field-constraint field-name="inspAccaoOperacaoID">
+                    <variable-restriction evaluator="==" identifier="inspectionActionOperation"/>
+                </field-constraint>
+            </pattern>
+            <not>
+                <pattern object-type="MelhorEmNaoConformidades">
+                    <field-constraint field-name="operacaoID">
+                        <variable-restriction evaluator="==" identifier="operation"/>
+                    </field-constraint>
+                    <field-constraint field-name="recursoID">
+                        <variable-restriction evaluator="==" identifier="resource"/>
+                    </field-constraint>
+                </pattern>
+            </not>
+        </lhs>
+        <rhs>insert(new MelhorEmNaoConformidades(ProductionOrder,NCNumber,operation,resource));</rhs>
+    </rule>
+    <rule name="Best Checker">
+        <lhs>
+            <pattern object-type="AccaoInspeccao">
+                <field-constraint field-name="artigoID">
+                    <literal-restriction evaluator="==" value="3"/>
+                </field-constraint>
+                <field-binding field-name="recursoID" identifier="resource"/>
+                <field-binding field-name="operacaoID" identifier="operation"/>
+                <field-binding field-name="ordemProducaoID" identifier="ProductionOrder"/>
+                <field-binding field-name="recursoID" identifier="resourceID"/>
+                <field-binding field-name="accaoInspeccaoID" identifier="InspectionAction"/>
+            </pattern>
+            <pattern object-type="AccaoInspeccaoOperacao">
+                <field-binding field-name="inspAccaoOperacaoID" identifier="inspectionActionOperation"/>
+                <field-constraint field-name="inspectionActionID">
+                    <variable-restriction evaluator="==" identifier="InspectionAction"/>
+                </field-constraint>
+            </pattern>
+            <pattern object-type="OtherInspectionMethod">
+                <field-binding field-name="numeroNaoConformidades" identifier="NCNumber"/>
+                <field-constraint field-name="inspAccaoOperacaoID">
+                    <variable-restriction evaluator="==" identifier="inspectionActionOperation"/>
+                </field-constraint>
+            </pattern>
+            <pattern identifier="TheBest" object-type="MelhorEmNaoConformidades">
+                <field-constraint field-name="operacaoID">
+                    <variable-restriction evaluator="==" identifier="operation"/>
+                </field-constraint>
+                <field-constraint field-name="recursoID">
+                    <variable-restriction evaluator="==" identifier="resource"/>
+                </field-constraint>
+                <field-constraint field-name="numeroDefeitos">
+                    <variable-restriction evaluator="&gt;" identifier="NCNumber"/>
+                </field-constraint>
+            </pattern>
+        </lhs>
+        <rhs>TheBest.setNumeroDefeitos(NCNumber);
+TheBest.setOrdemProducaoID(ProductionOrder);
+update(TheBest);
+</rhs>
+    </rule>
+    <rule name="ruleBestParametersCreator">
+        <rule-attribute name="salience" value="-100"/>
+        <lhs>
+            <pattern object-type="MelhorEmNaoConformidades">
+                <field-binding field-name="ordemProducaoID" identifier="$poID"/>
+                <field-binding field-name="numeroDefeitos" identifier="$NC"/>
+            </pattern>
+            <pattern object-type="SetupInUse">
+                <field-binding field-name="setupUseID" identifier="$setup"/>
+                <field-constraint field-name="productionOrderID">
+                    <variable-restriction evaluator="==" identifier="$poID"/>
+                </field-constraint>
+            </pattern>
+            <pattern identifier="$p" object-type="Parameter">
+                <field-binding field-name="parameterID" identifier="$parID"/>
+                <field-constraint field-name="setupUseID">
+                    <variable-restriction evaluator="==" identifier="$setup"/>
+                </field-constraint>
+            </pattern>
+            <not>
+                <pattern object-type="BestParms">
+                    <field-constraint field-name="parameterID">
+                        <variable-restriction evaluator="==" identifier="$parID"/>
+                    </field-constraint>
+                </pattern>
+            </not>
+        </lhs>
+        <rhs>BestParms newBest=new BestParms();
+newBest.setParameterID($parID);
+newBest.setNominalValue(new Float($p.getNominalValue()));
+newBest.setMaxLimit(new Float($p.getMaxLimit()));
+newBest.setMinLimit(new Float($p.getMinLimit()));
+newBest.setMaxLimitAlarm(new Float($p.getMaxLimitAlarm()));
+newBest.setMinLimitAlarm(new Float($p.getMinLimitAlarm()));
+newBest.setNonConformities(new Float($NC));
+insert(newBest);
+</rhs>
+    </rule>
+    <rule name="ruleBestParametersChecker">
+        <rule-attribute name="salience" value="-100"/>
+        <lhs>
+            <pattern object-type="MelhorEmNaoConformidades">
+                <field-binding field-name="ordemProducaoID" identifier="$poID"/>
+                <field-binding field-name="numeroDefeitos" identifier="$NC"/>
+            </pattern>
+            <pattern object-type="SetupInUse">
+                <field-binding field-name="setupUseID" identifier="$setup"/>
+                <field-constraint field-name="productionOrderID">
+                    <variable-restriction evaluator="==" identifier="$poID"/>
+                </field-constraint>
+            </pattern>
+            <pattern identifier="$p" object-type="Parameter">
+                <field-binding field-name="parameterID" identifier="$parID"/>
+                <field-constraint field-name="setupUseID">
+                    <variable-restriction evaluator="==" identifier="$setup"/>
+                </field-constraint>
+            </pattern>
+            <pattern identifier="$newBest" object-type="Parameter">
+                <field-constraint field-name="parameterID">
+                    <variable-restriction evaluator="==" identifier="$parID"/>
+                </field-constraint>
+                <field-constraint field-name="nonConformities">
+                    <variable-restriction evaluator="&gt;" identifier="$NC"/>
+                </field-constraint>
+            </pattern>
+        </lhs>
+        <rhs>$newBest.setNominalValue(new Float(p.getNominalValue()));
+$newBest.setMaxLimit(new Float(p.getMaxLimit()));
+$newBest.setMinLimit(new Float(p.getMinLimit()));
+$newBest.setMaxLimitAlarm(new Float(p.getMaxLimitAlarm()));
+$newBest.setMinLimitAlarm(new Float(p.getMinLimitAlarm()));
+$newBest.setNonConformities(new Float($NC));
+update($newBest);
+</rhs>
+    </rule>
+    <rule name="print">
+        <rule-attribute name="salience" value="-110"/>
+        <lhs>
+            <pattern identifier="bp" object-type="BestParms"> </pattern>
+        </lhs>
+        <rhs>System.out.println("Parameter: "+bp.getParameterID()+" Value: "+bp.getNominalValue()+" NC: "+bp.getNonConformities());
+</rhs>
+    </rule>
+</package>

Modified: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml	2007-07-09 19:14:49 UTC (rev 13270)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_ParseRule.xml	2007-07-09 19:20:21 UTC (rev 13271)
@@ -10,7 +10,7 @@
 
 	<global identifier="x" type="com.sample.X" />
 	<global identifier="yada" type="com.sample.Yada" />
-	
+
 	<function return-type="void" name="myFunc">
 	    <parameter identifier="foo" type="Bar" />
 	    <parameter identifier="bada" type="Bing" />
@@ -85,7 +85,7 @@
                     <field-constraint field-name="likes">
                         <variable-restriction evaluator="==" identifier="type"/>
                     </field-constraint>
-                </pattern>                
+                </pattern>
             </exists>
         </not>
 
@@ -123,7 +123,7 @@
                         org.drools.Bar.BAR_ENUM_VALUE
                     </qualified-identifier-restriction>
                 </or-restriction-connective>
-            </field-constraint>            
+            </field-constraint>
         </pattern>
 
         <pattern identifier="foo6" object-type="Bar" >

Copied: labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_complex.drl (from rev 13267, labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_complex.drl)
===================================================================
--- labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_complex.drl	                        (rev 0)
+++ labs/jbossrules/branches/mvel-tooling-2007-06-30/drools-compiler/src/test/resources/org/drools/xml/test_complex.drl	2007-07-09 19:20:21 UTC (rev 13271)
@@ -0,0 +1,83 @@
+package rules;
+
+
+import pt.inescporto.cec.entities.SetupUse;
+import pt.inescporto.cec.entities.SetupInUse;
+import pt.inescporto.cec.entities.Parameter;
+import pt.inescporto.cec.entities.OrdemFabrico;
+import pt.inescporto.cec.entities.AccaoInspeccao;
+import pt.inescporto.cec.entities.AccaoInspeccaoOperacao;
+import pt.inescporto.cec.entities.MelhorEmNaoConformidades;
+import pt.inescporto.cec.entities.OtherInspectionMethod;
+import pt.inescporto.cec.entities.BestParms;
+
+
+rule "ruleBestProductionOrderCreator"
+when
+		AccaoInspeccao( artigoID == 3 , $operID: operacaoID , $resourceID: recursoID, $ProdOrderID: ordemProducaoID, $IAID: accaoInspeccaoID  )
+		AccaoInspeccaoOperacao( inspectionActionID == $IAID, $tmp: inspAccaoOperacaoID  )
+		OtherInspectionMethod(inspActionOperacaoID == $tmp, $NCNumber: numeroNaoConformidades   )
+		not (MelhorEmNaoConformidades( operacaoID == $operID, recursoID == $resourceID ) ) 
+	then
+		insert(new MelhorEmNaoConformidades($ProdOrderID,$NCNumber,$operID,$resourceID));
+end
+	
+rule "ruleBestProductionOrderChecker"
+when
+		AccaoInspeccao( artigoID ==3 , $operID: operacaoID, $resourceID: recursoID, $ProdOrderID: ordemProducaoID, $IAID: accaoInspeccaoID  )
+		AccaoInspeccaoOperacao( inspectionActionID == $IAID, $tmp: inspAccaoOperacaoID  )
+		OtherInspectionMethod( inspActionOperacaoID == $tmp, $NCNumber: numeroNaoConformidades   )
+		$t: MelhorEmNaoConformidades( operacaoID == $operID, recursoID == $resourceID, numeroDefeitos > $NCNumber )
+	then
+		$t.setNumeroDefeitos($NCNumber);
+		$t.setOrdemProducaoID($ProdOrderID);
+		update($t);
+end
+
+rule "ruleBestParametersCreator"
+salience -100
+when
+	MelhorEmNaoConformidades($poID: ordemProducaoID, $nonConformities: numeroDefeitos )	
+	SetupInUse( $setup: setupUseID , productionOrderID == $poID )
+	p: Parameter( $parID: parameterID,  setupUseID == $setup )
+	not (BestParms( parameterID == $parID ))
+then
+	BestParms newBest=new BestParms();
+	newBest.setParameterID($parID);
+	newBest.setNominalValue(new Float(p.getNominalValue()));
+	newBest.setMaxLimit(new Float(p.getMaxLimit()));
+	newBest.setMinLimit(new Float(p.getMinLimit()));
+	newBest.setMaxLimitAlarm(new Float(p.getMaxLimitAlarm()));
+	newBest.setMinLimitAlarm(new Float(p.getMinLimitAlarm()));
+	newBest.setNonConformities($nonConformities);
+	insert(newBest);
+end
+
+rule "ruleBestParametersChecker"
+salience -10
+when
+	MelhorEmNaoConformidades($poID: ordemProducaoID, $NC: numeroDefeitos )	
+	SetupInUse( $setup: setupUseID , productionOrderID == $poID )
+	p: Parameter( $parID: parameterID,  setupUseID == $setup )
+	newBest: BestParms( parameterID == $parID, nonConformities > $NC )
+then
+	newBest.setNominalValue(new Float(p.getNominalValue()));
+	newBest.setMaxLimit(new Float(p.getMaxLimit()));
+	newBest.setMinLimit(new Float(p.getMinLimit()));
+	newBest.setMaxLimitAlarm(new Float(p.getMaxLimitAlarm()));
+	newBest.setMinLimitAlarm(new Float(p.getMinLimitAlarm()));
+	newBest.setNonConformities($NC);
+	update(newBest);
+end
+
+rule "print"
+salience -20
+when 
+	bp: BestParms(  )
+then
+	System.out.println("Parameter: "+bp.getParameterID()+" Value: "+bp.getNominalValue()+" NC: "+bp.getNonConformities());
+end
+
+query "get results"
+		mnc: BestParms(  )
+end
\ No newline at end of file




More information about the jboss-svn-commits mailing list