[jboss-svn-commits] JBL Code SVN: r8732 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/compiler drools-compiler/src/main/java/org/drools/lang drools-compiler/src/main/java/org/drools/semantics/java drools-compiler/src/main/java/org/drools/semantics/java/builder drools-compiler/src/main/java/org/drools/xml drools-compiler/src/test/java/org/drools/compiler drools-compiler/src/test/java/org/drools/semantics/java drools-compiler/src/test/resources/org/drools drools-compiler/src/test/resources/org/drools/semantics drools-compiler/src/test/resources/org/drools/semantics/java drools-core/src/main/java/org/drools/rule

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Jan 6 13:33:16 EST 2007


Author: tirelli
Date: 2007-01-06 13:32:48 -0500 (Sat, 06 Jan 2007)
New Revision: 8732

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/GroupElementBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/RuleBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/java/
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/java/nestedConditionalElements.drl
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/RuleError.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/AccumulateBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildContext.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildUtils.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/CollectBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ColumnBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ConsequenceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/EvalBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/FromBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
Log:
JBRULES-218: adding GroupElement builder and simplifying RuleBuilder

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	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -368,6 +368,7 @@
                                                          this.src );
         ruleDescr.setClassName( ucFirst( ruleClassName ) );
 
+        // TODO: cache the builder!!!
         final RuleBuilder builder = new RuleBuilder( getTypeResolver(),
                                                      getFunctionFixer(),
                                                      this.classFieldExtractorCache );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/RuleError.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/RuleError.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/RuleError.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -22,7 +22,7 @@
 
 public class RuleError extends DroolsError {
     private Rule         rule;
-    private BaseDescr descr;
+    private BaseDescr    descr;
     private Object       object;
     private String       message;
 
@@ -72,5 +72,24 @@
         }
         return summary;
     }
+    
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append( this.message );
+        buf.append( " : " );
+        buf.append( this.rule );
+        buf.append( "\n" );
+        if( this.object instanceof CompilationProblem[] ) {
+            final CompilationProblem[] problem = (CompilationProblem[]) this.object;
+            for ( int i = 0; i < problem.length; i++ ) {
+                buf.append( "\t" );
+                buf.append( problem[i] );
+                buf.append( "\n" );
+            }
+        } else {
+            buf.append( this.object );
+        }
+        return buf.toString();
+    }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -236,7 +236,7 @@
             if ( rhs == null ) {
                 rhs = "\t then" + DrlDumper.eol + "\t";
             } else {
-                rhs = "\t then" + ruleDescr.getConsequence();
+                rhs = "\t then" + DrlDumper.eol + ruleDescr.getConsequence();
             }
 
             rule += attribute;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -32,7 +32,7 @@
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.rule.LineMappings;
 import org.drools.rule.Package;
-import org.drools.spi.AvailableVariables;
+import org.drools.spi.DeclarationScopeResolver;
 
 public class FunctionBuilder {
     private static final StringTemplateGroup functionGroup = new StringTemplateGroup( new InputStreamReader( FunctionBuilder.class.getResourceAsStream( "javaFunction.stg" ) ),
@@ -82,7 +82,7 @@
         }                   
         
         st.setAttribute( "text",
-                         fixer.fix( functionDescr.getText(), new AvailableVariables( new Map[] { params } ) ) );
+                         fixer.fix( functionDescr.getText(), new DeclarationScopeResolver( new Map[] { params } ) ) );
         
         String text = st.toString();
         

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -22,7 +22,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.drools.spi.AvailableVariables;
+import org.drools.spi.DeclarationScopeResolver;
 import org.drools.spi.FunctionResolver;
 import org.drools.rule.Package;
 
@@ -61,7 +61,7 @@
                     null );
     }
     
-    public String fix(final String raw, final AvailableVariables variables) {
+    public String fix(final String raw, final DeclarationScopeResolver variables) {
         //return raw;
         return fix( raw,
                     FunctionFixer.FUNCTION,
@@ -70,7 +70,7 @@
 
     public String fix(final String raw,
                       final Pattern pattern,
-                      final AvailableVariables variables ) {
+                      final DeclarationScopeResolver variables ) {
         if ( raw == null ) {
             return null;
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -22,14 +22,12 @@
 import java.util.Map;
 
 import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.AttributeDescr;
-import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.CollectDescr;
-import org.drools.lang.descr.ColumnDescr;
-import org.drools.lang.descr.ConditionalElementDescr;
 import org.drools.lang.descr.EvalDescr;
 import org.drools.lang.descr.ExistsDescr;
 import org.drools.lang.descr.FromDescr;
@@ -37,10 +35,8 @@
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.QueryDescr;
 import org.drools.lang.descr.RuleDescr;
-import org.drools.rule.Column;
 import org.drools.rule.ConditionalElement;
 import org.drools.rule.GroupElement;
-import org.drools.rule.GroupElementFactory;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
 import org.drools.semantics.java.builder.AccumulateBuilder;
@@ -52,6 +48,7 @@
 import org.drools.semantics.java.builder.ConsequenceBuilder;
 import org.drools.semantics.java.builder.EvalBuilder;
 import org.drools.semantics.java.builder.FromBuilder;
+import org.drools.semantics.java.builder.GroupElementBuilder;
 import org.drools.semantics.java.builder.RuleClassBuilder;
 
 /**
@@ -73,25 +70,17 @@
     // the builder for columns
     private ColumnBuilder      columnBuilder;
 
+    // the builder for the consequence
     private ConsequenceBuilder consequenceBuilder;
     
+    // the builder for the rule class
     private RuleClassBuilder   classBuilder;
 
+    // Constructor
     public RuleBuilder(final TypeResolver typeResolver,
                        final FunctionFixer functionFixer,
                        final ClassFieldExtractorCache cache) {
-        this.utils = new BuildUtils( functionFixer,
-                                     new KnowledgeHelperFixer(),
-                                     new JavaExprAnalyzer(),
-                                     typeResolver,
-                                     cache );
 
-        this.columnBuilder = new ColumnBuilder();
-
-        this.consequenceBuilder = new ConsequenceBuilder();
-        
-        this.classBuilder = new RuleClassBuilder();
-
         // statically adding all builders to the map
         // but in the future we can move that to a configuration
         // if we want to
@@ -104,7 +93,29 @@
                       new CollectBuilder() );
         builders.put( AccumulateDescr.class,
                       new AccumulateBuilder() );
+        GroupElementBuilder gebuilder = new GroupElementBuilder();
+        builders.put( AndDescr.class,
+                      gebuilder);
+        builders.put( OrDescr.class,
+                      gebuilder);
+        builders.put( NotDescr.class,
+                      gebuilder);
+        builders.put( ExistsDescr.class,
+                      gebuilder);
+        
+        
+        this.utils = new BuildUtils( functionFixer,
+                                     new KnowledgeHelperFixer(),
+                                     new JavaExprAnalyzer(),
+                                     typeResolver,
+                                     cache,
+                                     builders );
 
+        this.columnBuilder = new ColumnBuilder();
+
+        this.consequenceBuilder = new ConsequenceBuilder();
+        
+        this.classBuilder = new RuleClassBuilder();
     }
 
     public Map getInvokers() {
@@ -141,6 +152,12 @@
         return this.context.getPkg();
     }
 
+    /**
+     * Build the give rule into the 
+     * @param pkg
+     * @param ruleDescr
+     * @return
+     */
     public synchronized Rule build(final Package pkg,
                                    final RuleDescr ruleDescr) {
         this.context = new BuildContext( pkg,
@@ -150,86 +167,12 @@
         setAttributes( this.context.getRule(),
                        ruleDescr.getAttributes() );
 
-        // Build the left hand side
-        // generate invokers
-        build( ruleDescr );
-
-        return this.context.getRule();
-    }
-
-    private void build(final RuleDescr ruleDescr) {
-
-        for ( final Iterator it = ruleDescr.getLhs().getDescrs().iterator(); it.hasNext(); ) {
-            final Object object = it.next();
-            if ( object instanceof ConditionalElementDescr ) {
-                if ( object.getClass() == AndDescr.class ) {
-                    final GroupElement and = GroupElementFactory.newAndInstance();
-                    build( this.context.getRule(),
-                           (ConditionalElementDescr) object,
-                           and,
-                           false, // do not decrement offset
-                           false ); // do not decrement first offset
-                    this.context.getRule().addPattern( and );
-                } else if ( object.getClass() == OrDescr.class ) {
-                    final GroupElement or = GroupElementFactory.newOrInstance();
-                    build( this.context.getRule(),
-                           (ConditionalElementDescr) object,
-                           or,
-                           true, // when OR is used, offset MUST be decremented
-                           false ); // do not decrement first offset
-                    this.context.getRule().addPattern( or );
-                } else if ( object.getClass() == NotDescr.class ) {
-                    // We cannot have declarations created inside a not visible outside it, so track no declarations so they can be removed
-                    context.setInnerDeclarations( new HashMap() );
-                    final GroupElement not = GroupElementFactory.newNotInstance();
-                    build( this.context.getRule(),
-                           (ConditionalElementDescr) object,
-                           not,
-                           true, // when NOT is used, offset MUST be decremented
-                           true ); // when NOT is used, offset MUST be decremented for first column
-                    this.context.getRule().addPattern( not );
-
-                    // remove declarations bound inside not node
-                    for ( final Iterator notIt = context.getInnerDeclarations().keySet().iterator(); notIt.hasNext(); ) {
-                        context.getDeclarations().remove( notIt.next() );
-                    }
-
-                    context.setInnerDeclarations( null );
-                } else if ( object.getClass() == ExistsDescr.class ) {
-                    // We cannot have declarations created inside exists visible outside it, 
-                    // so track declarations in a way they can be removed
-                    context.setInnerDeclarations( new HashMap() );
-                    final GroupElement exists = GroupElementFactory.newExistsInstance();
-                    build( this.context.getRule(),
-                           (ConditionalElementDescr) object,
-                           exists,
-                           true, // when EXIST is used, offset MUST be decremented
-                           true ); // when EXIST is used, offset MUST be decremented for first column
-                    // remove declarations bound inside not node
-                    for ( final Iterator notIt = context.getInnerDeclarations().keySet().iterator(); notIt.hasNext(); ) {
-                        context.getDeclarations().remove( notIt.next() );
-                    }
-
-                    context.setInnerDeclarations( null );
-                    this.context.getRule().addPattern( exists );
-                } else {
-                    ConditionalElementBuilder builder = (ConditionalElementBuilder) this.builders.get( object.getClass() );
-                    ConditionalElement ce = builder.build( this.context,
-                                                           this.utils,
-                                                           this.columnBuilder,
-                                                           (BaseDescr) object );
-                    if ( ce != null ) {
-                        this.context.getRule().addPattern( ce );
-                    }
-                }
-            } else if ( object.getClass() == ColumnDescr.class ) {
-                final Column column = this.columnBuilder.build( this.context,
-                                                                this.utils,
-                                                                (ColumnDescr) object );
-                if ( column != null ) {
-                    this.context.getRule().addPattern( column );
-                }
-            }
+        ConditionalElementBuilder builder = utils.getBuilder( ruleDescr.getLhs().getClass() );
+        if( builder != null ) {
+            GroupElement ce = (GroupElement) builder.build( this.context, this.utils, this.columnBuilder, ruleDescr.getLhs() );
+            this.context.getRule().setLhs( ce );
+        } else {
+            throw new RuntimeDroolsException("BUG: builder not found for descriptor class "+ruleDescr.getLhs().getClass() );
         }
 
         // Build the consequence and generate it's invoker/s
@@ -241,72 +184,17 @@
                                                       ruleDescr );
         }
         this.classBuilder.buildRule( this.context, this.utils, ruleDescr );
-    }
 
-    private void build(final Rule rule,
-                       final ConditionalElementDescr descr,
-                       final GroupElement group,
-                       final boolean decrementOffset,
-                       boolean decrementFirst) {
-        for ( final Iterator it = descr.getDescrs().iterator(); it.hasNext(); ) {
-            final Object object = it.next();
-            if ( object instanceof ConditionalElementDescr ) {
-                if ( object.getClass() == AndDescr.class ) {
-                    final GroupElement and = GroupElementFactory.newAndInstance();
-                    build( rule,
-                           (ConditionalElementDescr) object,
-                           and,
-                           false, // do not decrement offset
-                           false ); // do not decrement first offset
-                    group.addChild( and );
-                } else if ( object.getClass() == OrDescr.class ) {
-                    final GroupElement or = GroupElementFactory.newOrInstance();
-                    build( rule,
-                           (ConditionalElementDescr) object,
-                           or,
-                           true, // when OR is used, offset MUST be decremented
-                           false ); // do not decrement first offset
-                    group.addChild( or );
-                } else if ( object.getClass() == NotDescr.class ) {
-                    final GroupElement not = GroupElementFactory.newNotInstance();
-                    build( rule,
-                           (ConditionalElementDescr) object,
-                           not,
-                           true, // when NOT is used, offset MUST be decremented
-                           true ); // when NOT is used, offset MUST be decremented for first column
-                    group.addChild( not );
-                } else if ( object.getClass() == ExistsDescr.class ) {
-                    final GroupElement exists = GroupElementFactory.newExistsInstance();
-                    build( rule,
-                           (ConditionalElementDescr) object,
-                           exists,
-                           true, // when EXIST is used, offset MUST be decremented
-                           true ); // when EXIST is used, offset MUST be decremented for first column
-                    group.addChild( exists );
-                } else {
-                    ConditionalElementBuilder builder = (ConditionalElementBuilder) this.builders.get( object.getClass() );
-                    ConditionalElement ce = builder.build( this.context,
-                                                           this.utils,
-                                                           this.columnBuilder,
-                                                           (BaseDescr) object );
-                    if ( ce != null ) {
-                        this.context.getRule().addPattern( ce );
-                    }
-                }
-            } else if ( object.getClass() == ColumnDescr.class ) {
-                if ( decrementOffset && decrementFirst ) {
-                    this.context.setColumnOffset( this.context.getColumnOffset() - 1 );
-                } else {
-                    decrementFirst = true;
-                }
-                final Column column = this.columnBuilder.build( this.context, this.utils, (ColumnDescr) object );
-                if ( column != null ) {
-                    group.addChild( column );
-                }
-            }
-        }
+        return this.context.getRule();
     }
 
+
+    /**
+     * Sets rule Attributes
+     * 
+     * @param rule
+     * @param attributes
+     */
     private void setAttributes(final Rule rule,
                                final List attributes) {
         for ( final Iterator it = attributes.iterator(); it.hasNext(); ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -6,7 +6,7 @@
 
 import org.codehaus.jfdi.interpreter.TypeResolver;
 import org.drools.RuntimeDroolsException;
-import org.drools.spi.AvailableVariables;
+import org.drools.spi.DeclarationScopeResolver;
 import org.drools.spi.FunctionResolver;
 
 public class StaticMethodFunctionResolver
@@ -42,7 +42,7 @@
 
     public String resolveFunction(String functionName,
                                   String params,
-                                  AvailableVariables variables) {
+                                  DeclarationScopeResolver variables) {
         for ( Iterator it = this.functionImports.iterator(); it.hasNext(); ) {
             String functionImport = (String) it.next();
 
@@ -84,7 +84,7 @@
      * @param paramString
      * @return
      */
-    private Class[] determineParameterTypes(String paramString, AvailableVariables variables) {
+    private Class[] determineParameterTypes(String paramString, DeclarationScopeResolver variables) {
         if ( paramString.trim().equals( "" ) ) {
             return new Class[0];
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/AccumulateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/AccumulateBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/AccumulateBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -17,9 +17,7 @@
 package org.drools.semantics.java.builder;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.antlr.stringtemplate.StringTemplate;
 import org.drools.base.ClassObjectType;
@@ -48,8 +46,6 @@
 
         AccumulateDescr accumDescr = (AccumulateDescr) descr;
 
-        context.setInnerDeclarations( new HashMap() );
-
         Column sourceColumn = columnBuilder.build( context,
                                                    utils,
                                                    accumDescr.getSourceColumn() );
@@ -57,13 +53,7 @@
         if ( sourceColumn == null ) {
             return null;
         }
-        // remove declarations bound inside source column
-        context.getDeclarations().keySet().removeAll( context.getInnerDeclarations().keySet() );
-        Map sourceDeclarations = context.getInnerDeclarations();
-        context.setInnerDeclarations( null );
 
-        // decrementing offset as accumulate fills only one column
-        context.setColumnOffset( context.getColumnOffset() - 1 );
         Column resultColumn = columnBuilder.build( context,
                                                    utils,
                                                    accumDescr.getResultColumn() );
@@ -91,9 +81,9 @@
 
         final Declaration[] declarations = new Declaration[requiredDeclarations.size()];
         for ( int i = 0, size = requiredDeclarations.size(); i < size; i++ ) {
-            declarations[i] = (Declaration) context.getDeclarations().get( (String) requiredDeclarations.get( i ) );
+            declarations[i] = (Declaration) context.getDeclarationResolver().getDeclaration( (String) requiredDeclarations.get( i ) );
         }
-        final Declaration[] sourceDeclArr = (Declaration[]) sourceDeclarations.values().toArray( new Declaration[sourceDeclarations.size()] );
+        final Declaration[] sourceDeclArr = (Declaration[]) sourceColumn.getOuterDeclarations().values().toArray( new Declaration[0] );
 
         final String[] globals = (String[]) requiredGlobals.toArray( new String[requiredGlobals.size()] );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildContext.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildContext.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -20,13 +20,14 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Stack;
 
 import org.drools.lang.descr.QueryDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.rule.Package;
 import org.drools.rule.Query;
 import org.drools.rule.Rule;
-import org.drools.spi.AvailableVariables;
+import org.drools.spi.DeclarationScopeResolver;
 
 /**
  * A context for the current build
@@ -40,6 +41,10 @@
 
     // current rule
     private Rule               rule;
+    
+    // a stack for the rule building used
+    // for declarations resolution
+    private Stack              buildStack;
 
     // current Rule descriptor
     private RuleDescr          ruleDescr;
@@ -47,15 +52,9 @@
     // the class name for the rule
     private String             ruleClass;
 
-    // declarations made in the current context
-    private Map                declarations;
+    // available declarationResolver 
+    private DeclarationScopeResolver declarationResolver;
 
-    // helper map for inner declarations
-    private Map                innerDeclarations;
-
-    // available variables 
-    private AvailableVariables variables;
-
     // errors found when building the current context
     private List               errors;
 
@@ -75,11 +74,8 @@
     private int                counter;
 
     // a simple counter for columns
-    private int                columnCounter;
+    private int                columnId = -1;
 
-    // an offset counter for columns
-    private int                columnOffset;
-
     /**
      * Default constructor
      */
@@ -90,11 +86,10 @@
         this.methods = new ArrayList();
         this.invokers = new HashMap();
         this.invokerLookups = new HashMap();
-        this.declarations = new HashMap();
         this.descrLookups = new HashMap();
-        this.declarations = new HashMap();
         this.errors = new ArrayList();
-        this.variables = new AvailableVariables( new Map[]{this.declarations, this.pkg.getGlobals()} );
+        this.buildStack = new Stack();
+        this.declarationResolver = new DeclarationScopeResolver( new Map[]{this.pkg.getGlobals()}, this.buildStack );
         this.ruleDescr = ruleDescr;
 
         if ( ruleDescr instanceof QueryDescr ) {
@@ -106,14 +101,6 @@
     }
 
     /**
-     * Returns the map of declarations for the current context
-     * @return
-     */
-    public Map getDeclarations() {
-        return declarations;
-    }
-
-    /**
      * Returns the list of errors found while building the current context
      * @return
      */
@@ -146,19 +133,19 @@
     }
 
     /**
-     * Returns the available variables instance
+     * Returns the available declarationResolver instance
      * @return
      */
-    public AvailableVariables getVariables() {
-        return variables;
+    public DeclarationScopeResolver getDeclarationResolver() {
+        return declarationResolver;
     }
 
     /**
-     * Sets the available variables instance
-     * @param variables
+     * Sets the available declarationResolver instance
+     * @param declarationResolver
      */
-    public void setVariables(AvailableVariables variables) {
-        this.variables = variables;
+    public void setDeclarationResolver(DeclarationScopeResolver variables) {
+        this.declarationResolver = variables;
     }
 
     /**
@@ -221,30 +208,18 @@
         return counter++;
     }
 
-    public int getCurrentColumnId() {
-        return columnCounter;
+    public int getColumnId() {
+        return columnId;
     }
 
     public int getNextColumnId() {
-        return columnCounter++;
+        return ++columnId;
     }
 
-    public int getColumnOffset() {
-        return columnOffset;
+    public void setColumnId(int columnId) {
+        this.columnId = columnId;
     }
 
-    public void setColumnOffset( int offset ) {
-        this.columnOffset = offset;
-    }
-
-    public Map getInnerDeclarations() {
-        return innerDeclarations;
-    }
-
-    public void setInnerDeclarations(Map innerDeclarations) {
-        this.innerDeclarations = innerDeclarations;
-    }
-
     public String getRuleClass() {
         return ruleClass;
     }
@@ -253,4 +228,8 @@
         this.ruleClass = ruleClass;
     }
 
+    public Stack getBuildStack() {
+        return buildStack;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildUtils.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/BuildUtils.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -19,6 +19,7 @@
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.antlr.stringtemplate.StringTemplate;
@@ -57,17 +58,21 @@
     private final TypeResolver             typeResolver;
 
     private final ClassFieldExtractorCache classFieldExtractorCache;
+    
+    private final Map                      builders;
 
     public BuildUtils(final FunctionFixer functionFixer,
                       final KnowledgeHelperFixer knowledgeHelperFixer,
                       final JavaExprAnalyzer analyzer,
                       final TypeResolver typeResolver,
-                      final ClassFieldExtractorCache classFieldExtractorCache) {
+                      final ClassFieldExtractorCache classFieldExtractorCache,
+                      final Map builders ) {
         this.functionFixer = functionFixer;
         this.knowledgeHelperFixer = knowledgeHelperFixer;
         this.analyzer = analyzer;
         this.typeResolver = typeResolver;
         this.classFieldExtractorCache = classFieldExtractorCache;
+        this.builders = builders;
     }
 
     public List[] getUsedIdentifiers(final BuildContext context,
@@ -76,7 +81,7 @@
         List[] usedIdentifiers = null;
         try {
             usedIdentifiers = this.analyzer.analyzeExpression( text,
-                                                               new Set[]{context.getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
+                                                               new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
         } catch ( final Exception e ) {
             context.getErrors().add( new RuleError( context.getRule(),
                                                     descr,
@@ -92,7 +97,7 @@
         List[] usedIdentifiers = null;
         try {
             usedIdentifiers = this.analyzer.analyzeBlock( text,
-                                                          new Set[]{context.getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
+                                                          new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
         } catch ( final Exception e ) {
             context.getErrors().add( new RuleError( context.getRule(),
                                                     descr,
@@ -198,4 +203,21 @@
         return classFieldExtractorCache;
     }
 
+    /**
+     * Returns a map<Class, ConditionalElementBuilder> of builders
+     * @return
+     */
+    public Map getBuilders() {
+        return builders;
+    }
+
+    /**
+     * Returns the builder for the given descriptor class
+     * @param descr
+     * @return
+     */
+    public ConditionalElementBuilder getBuilder(Class descr) {
+        return (ConditionalElementBuilder) builders.get( descr );
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/CollectBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/CollectBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/CollectBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -16,8 +16,6 @@
 
 package org.drools.semantics.java.builder;
 
-import java.util.HashMap;
-
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.CollectDescr;
 import org.drools.rule.Collect;
@@ -42,19 +40,12 @@
         
         CollectDescr collectDescr = (CollectDescr) descr;
         
-        context.setInnerDeclarations( new HashMap() );
         Column sourceColumn = columnBuilder.build( context, utils, collectDescr.getSourceColumn() );
 
         if ( sourceColumn == null ) {
             return null;
         }
 
-        // remove declarations bound inside source column
-        context.getDeclarations().keySet().removeAll( context.getInnerDeclarations().keySet() );
-        context.setInnerDeclarations( null );
-
-        // decrementing offset as collect fills only one column
-        context.setColumnOffset( context.getColumnOffset() - 1 );
         Column resultColumn = columnBuilder.build( context, utils, collectDescr.getResultColumn() );
 
         final String className = "collect" + context.getNextId();

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ColumnBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ColumnBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ColumnBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -125,22 +125,18 @@
         Column column;
         if ( columnDescr.getIdentifier() != null && !columnDescr.getIdentifier().equals( "" ) ) {
             column = new Column( context.getNextColumnId(),
-                                 context.getColumnOffset(),
+                                 0, // offset is 0 by default
                                  objectType,
                                  columnDescr.getIdentifier() );
-            context.getDeclarations().put( column.getDeclaration().getIdentifier(),
-                                           column.getDeclaration() );
-
-            if ( context.getInnerDeclarations() != null ) {
-                context.getInnerDeclarations().put( column.getDeclaration().getIdentifier(),
-                                                    column.getDeclaration() );
-            }
         } else {
             column = new Column( context.getNextColumnId(),
-                                 context.getColumnOffset(),
+                                 0, // offset is 0 by default
                                  objectType,
                                  null );
         }
+        // adding the newly created column to the build stack
+        // this is necessary in case of local declaration usage
+        context.getBuildStack().push( column );
 
         for ( final Iterator it = columnDescr.getDescrs().iterator(); it.hasNext(); ) {
             final Object object = it.next();
@@ -161,6 +157,8 @@
                        (PredicateDescr) object );
             }
         }
+        // poping the column
+        context.getBuildStack().pop();
         return column;
     }
 
@@ -321,7 +319,7 @@
                        final Column column,
                        final FieldBindingDescr fieldBindingDescr) {
 
-        Declaration declaration = (Declaration) context.getDeclarations().get( fieldBindingDescr.getIdentifier() );
+        Declaration declaration = (Declaration) context.getDeclarationResolver().getDeclaration( fieldBindingDescr.getIdentifier() );
         if ( declaration != null ) {
             // This declaration already  exists, so throw an Exception
             context.getErrors().add( new RuleError( context.getRule(),
@@ -342,14 +340,6 @@
 
         declaration = column.addDeclaration( fieldBindingDescr.getIdentifier(),
                                              extractor );
-
-        context.getDeclarations().put( declaration.getIdentifier(),
-                                       declaration );
-
-        if ( context.getInnerDeclarations() != null ) {
-            context.getInnerDeclarations().put( declaration.getIdentifier(),
-                                                declaration );
-        }
     }
 
     private void build(final BuildContext context,
@@ -373,14 +363,6 @@
         final Declaration declaration = column.addDeclaration( predicateDescr.getDeclaration(),
                                                                extractor );
 
-        context.getDeclarations().put( declaration.getIdentifier(),
-                                       declaration );
-
-        if ( context.getInnerDeclarations() != null ) {
-            context.getInnerDeclarations().put( declaration.getIdentifier(),
-                                                declaration );
-        }
-
         final List[] usedIdentifiers = utils.getUsedIdentifiers( context,
                                                                  predicateDescr,
                                                                  predicateDescr.getText() );
@@ -390,7 +372,7 @@
         final List tupleDeclarations = new ArrayList();
         final List factDeclarations = new ArrayList();
         for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
-            Declaration decl = (Declaration) context.getDeclarations().get( (String) usedIdentifiers[0].get( i ) );
+            Declaration decl = (Declaration) context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
             if ( decl.getColumn() == column ) {
                 factDeclarations.add( decl );
             } else {
@@ -434,7 +416,7 @@
                          className );
 
         final String predicateText = utils.getFunctionFixer().fix( predicateDescr.getText(),
-                                                                   context.getVariables() );
+                                                                   context.getDeclarationResolver() );
         st.setAttribute( "text",
                          predicateText );
 
@@ -522,7 +504,7 @@
             return null;
         }
 
-        final Declaration declaration = (Declaration) context.getDeclarations().get( variableRestrictionDescr.getIdentifier() );
+        final Declaration declaration = (Declaration) context.getDeclarationResolver().getDeclaration( variableRestrictionDescr.getIdentifier() );
 
         if ( declaration == null ) {
             context.getErrors().add( new RuleError( context.getRule(),
@@ -613,7 +595,7 @@
         final List tupleDeclarations = new ArrayList();
         final List factDeclarations = new ArrayList();
         for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
-            Declaration declaration = (Declaration) context.getDeclarations().get( (String) usedIdentifiers[0].get( i ) );
+            Declaration declaration = (Declaration) context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
             if ( declaration.getColumn() == column ) {
                 factDeclarations.add( declaration );
             } else {
@@ -658,7 +640,7 @@
                          className );
 
         final String returnValueText = utils.getFunctionFixer().fix( returnValueRestrictionDescr.getText(),
-                                                                     context.getVariables() );
+                                                                     context.getDeclarationResolver() );
         st.setAttribute( "text",
                          returnValueText );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ConsequenceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ConsequenceBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/ConsequenceBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -33,6 +33,10 @@
     public void buildConsequence(final BuildContext context,
                                  final BuildUtils utils,
                                  final RuleDescr ruleDescr) {
+        
+        // pushing consequence LHS into the stack for variable resolution
+        context.getBuildStack().push( context.getRule().getLhs() );
+        
         // generate 
         // generate Invoker
         final String className = "consequence";
@@ -48,7 +52,7 @@
 
         final Declaration[] declarations = new Declaration[usedIdentifiers[0].size()];
         for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
-            declarations[i] = (Declaration) context.getDeclarations().get( (String) usedIdentifiers[0].get( i ) );
+            declarations[i] = (Declaration) context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
         }
 
         utils.setStringTemplateAttributes( context,
@@ -57,7 +61,7 @@
                                            (String[]) usedIdentifiers[1].toArray( new String[usedIdentifiers[1].size()] ) );
         st.setAttribute( "text",
                          utils.getFunctionFixer().fix( utils.getKnowledgeHelperFixer().fix( ruleDescr.getConsequence() ),
-                                                       context.getVariables() ) );
+                                                       context.getDeclarationResolver() ) );
 
         context.getMethods().add( st.toString() );
 
@@ -102,6 +106,9 @@
                                          context.getRule() );
         context.getDescrLookups().put( invokerClassName,
                                        ruleDescr );
+        
+        // popping Rule.getLHS() from the build stack
+        context.getBuildStack().pop();
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/EvalBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/EvalBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/EvalBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -60,7 +60,7 @@
 
         final Declaration[] declarations = new Declaration[usedIdentifiers[0].size()];
         for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
-            declarations[i] = (Declaration) context.getDeclarations().get( (String) usedIdentifiers[0].get( i ) );
+            declarations[i] = (Declaration) context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
         }
 
         final EvalCondition eval = new EvalCondition( declarations );
@@ -76,7 +76,7 @@
                          className );
 
         final String evalText = utils.getFunctionFixer().fix( evalDescr.getText(),
-                                                              context.getVariables() );
+                                                              context.getDeclarationResolver() );
         st.setAttribute( "text",
                          evalText );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/FromBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/FromBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/FromBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -66,7 +66,7 @@
             JFDIParser parser = createParser( utils,
                                               accessor.toString() );
             DroolsJFDIFactory factory = new DroolsJFDIFactory( utils.getTypeResolver() );
-            factory.setDeclarationMap( context.getDeclarations() );
+            factory.setDeclarationMap( context.getDeclarationResolver().getDeclarations() );
             factory.setGlobalsMap( context.getPkg().getGlobals() );
             parser.setValueHandlerFactory( factory );
 

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/GroupElementBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/GroupElementBuilder.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/GroupElementBuilder.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.semantics.java.builder;
+
+import java.util.Iterator;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.ColumnDescr;
+import org.drools.lang.descr.ConditionalElementDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.rule.Column;
+import org.drools.rule.ConditionalElement;
+import org.drools.rule.GroupElement;
+import org.drools.rule.GroupElementFactory;
+
+/**
+ * @author etirelli
+ *
+ */
+public class GroupElementBuilder
+    implements
+    ConditionalElementBuilder {
+
+    /* (non-Javadoc)
+     * @see org.drools.semantics.java.builder.ConditionalElementBuilder#build(org.drools.semantics.java.builder.BuildContext, org.drools.semantics.java.builder.BuildUtils, org.drools.semantics.java.builder.ColumnBuilder, org.drools.lang.descr.BaseDescr)
+     */
+    public ConditionalElement build(BuildContext context,
+                                    BuildUtils utils,
+                                    ColumnBuilder columnBuilder,
+                                    BaseDescr descr) {
+        ConditionalElementDescr cedescr = (ConditionalElementDescr) descr;
+
+        final GroupElement ge = this.newGroupElementFor( cedescr.getClass() );
+        context.getBuildStack().push( ge );
+
+        // iterate over child descriptors
+        for ( Iterator it = cedescr.getDescrs().iterator(); it.hasNext(); ) {
+            // gets child to build
+            BaseDescr child = (BaseDescr) it.next();
+
+            // gets corresponding builder
+            ConditionalElementBuilder cebuilder = utils.getBuilder( child.getClass() );
+
+            if ( cebuilder != null ) {
+                ConditionalElement ce = cebuilder.build( context,
+                                                         utils,
+                                                         columnBuilder,
+                                                         (BaseDescr) child );
+                ge.addChild( ce );
+            } else if ( child instanceof ColumnDescr ) {
+                final Column column = columnBuilder.build( context,
+                                                           utils,
+                                                           (ColumnDescr) child );
+                ge.addChild( column );
+
+            } else {
+                throw new RuntimeDroolsException("BUG: no builder found for descriptor class "+child.getClass() );
+            }
+
+        }
+
+        context.getBuildStack().pop();
+        
+        return ge;
+    }
+
+    private GroupElement newGroupElementFor(Class descr) {
+        if ( AndDescr.class.isAssignableFrom( descr ) ) {
+            return GroupElementFactory.newAndInstance();
+        } else if ( OrDescr.class.isAssignableFrom( descr ) ) {
+            return GroupElementFactory.newOrInstance();
+        } else if ( NotDescr.class.isAssignableFrom( descr ) ) {
+            return GroupElementFactory.newNotInstance();
+        } else if ( ExistsDescr.class.isAssignableFrom( descr ) ) {
+            return GroupElementFactory.newExistsInstance();
+        } else {
+            throw new RuntimeDroolsException( "BUG: Not able to create a group element for descriptor: " + descr.getName() );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/builder/GroupElementBuilder.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -197,7 +197,7 @@
                 lhs = "<lhs> </lhs>";
             }
 
-            final String rhs = "<rhs>\n" + replaceIllegalChars( ruleDescr.getConsequence() ) + "</rhs>" + XmlDumper.eol;
+            final String rhs = "<rhs>" + replaceIllegalChars( ruleDescr.getConsequence() ) + "</rhs>" + XmlDumper.eol;
             rule += attribute;
             rule += lhs;
             rule += rhs;

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -25,6 +25,7 @@
 import java.io.ObjectOutput;
 import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -105,8 +106,9 @@
                                 "java.util.Map" );
 
         FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
-        returnValue.addRestriction( new ReturnValueRestrictionDescr("==", "x") );                
-        
+        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
+                                                                     "x" ) );
+
         column.addDescr( returnValue );
 
         // There is no m this should produce errors.
@@ -147,7 +149,7 @@
         assertLength( 0,
                       builder.getErrors() );
 
-        final ReteooRuleBase ruleBase = ( ReteooRuleBase )RuleBaseFactory.newRuleBase();
+        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         ruleBase.getGlobals().put( "map",
                                    Map.class );
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
@@ -223,7 +225,7 @@
 
         final Rule newRule = newPkg.getRule( "rule-1" );
 
-        final ReteooRuleBase ruleBase = ( ReteooRuleBase )RuleBaseFactory.newRuleBase();
+        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         ruleBase.getGlobals().put( "map",
                                    Map.class );
         final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
@@ -280,8 +282,8 @@
             assertNotNull( e.getMessage() );
         }
     }
-    
-    public void testFactTemplate()  {
+
+    public void testFactTemplate() {
         final PackageBuilder builder = new PackageBuilder();
 
         final PackageDescr packageDescr = new PackageDescr( "p1" );
@@ -292,17 +294,20 @@
         ruleDescr.setLhs( lhs );
 
         FactTemplateDescr cheese = new FactTemplateDescr( "Cheese" );
-        cheese.addFieldTemplate( new FieldTemplateDescr( "name", "String" ) );
-        cheese.addFieldTemplate(new  FieldTemplateDescr( "price", "Integer" ) );
+        cheese.addFieldTemplate( new FieldTemplateDescr( "name",
+                                                         "String" ) );
+        cheese.addFieldTemplate( new FieldTemplateDescr( "price",
+                                                         "Integer" ) );
 
         packageDescr.addFactTemplate( cheese );
-        
+
         final ColumnDescr column = new ColumnDescr( "Cheese",
                                                     "stilton" );
         lhs.addDescr( column );
-        
+
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "name" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "stilton") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
 
         column.addDescr( literalDescr );
 
@@ -310,9 +315,9 @@
 
         builder.addPackage( packageDescr );
 
-        assertLength( 0,
-                      builder.getErrors() );
-        
+        assertFalse( Arrays.toString( builder.getErrors() ),
+                     builder.hasErrors() );
+
         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         Package pkg = builder.getPackage();
         try {
@@ -322,11 +327,13 @@
         }
         WorkingMemory workingMemory = ruleBase.newWorkingMemory();
         Fact stilton = pkg.getFactTemplate( "Cheese" ).createFact( 1 );
-        stilton.setFieldValue( "name", "stilton" );
-        stilton.setFieldValue( "price", new Integer( 200 ) );
-        workingMemory.assertObject( stilton );        
+        stilton.setFieldValue( "name",
+                               "stilton" );
+        stilton.setFieldValue( "price",
+                               new Integer( 200 ) );
+        workingMemory.assertObject( stilton );
         workingMemory.fireAllRules();
-        
+
     }
 
     public void testLiteral() throws Exception {
@@ -342,9 +349,10 @@
         final ColumnDescr column = new ColumnDescr( Cheese.class.getName(),
                                                     "stilton" );
         lhs.addDescr( column );
-        
+
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "stilton") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
 
         column.addDescr( literalDescr );
 
@@ -379,18 +387,19 @@
 
         packageDescr.addGlobal( "map",
                                 "java.util.Map" );
-        
+
         FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
-        returnValue.addRestriction( new ReturnValueRestrictionDescr("==", "(( (Integer) map.get( new Integer( x )) ).intValue() * y)") );  
-        
+        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
+                                                                     "(( (Integer) map.get( new Integer( x )) ).intValue() * y)" ) );
+
         column.addDescr( returnValue );
 
         ruleDescr.setConsequence( "modify(stilton);" );
 
         builder.addPackage( packageDescr );
 
-        assertLength( 0,
-                      builder.getErrors() );
+        assertFalse( Arrays.toString( builder.getErrors() ),
+                     builder.hasErrors() );
     }
 
     public void testReturnValueMethodCompare() {
@@ -659,96 +668,117 @@
     public void testNumbers() throws Exception {
         // test boolean
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "booleanPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "true") );            
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "true" ) );
         createLiteralRule( literalDescr );
 
         // test boolean
         literalDescr = new FieldConstraintDescr( "booleanPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "false") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "false" ) );
         createLiteralRule( literalDescr );
 
         // test char
         literalDescr = new FieldConstraintDescr( "charPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "a") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "a" ) );
         createLiteralRule( literalDescr );
 
         // test byte
         literalDescr = new FieldConstraintDescr( "bytePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "1") );            
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "bytePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") );         
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "bytePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "-1") );         
-        createLiteralRule( literalDescr);
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1" ) );
+        createLiteralRule( literalDescr );
 
         // test short
         literalDescr = new FieldConstraintDescr( "shortPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "1") );         
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "shortPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") ); 
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "shortPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "-1") );         
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1" ) );
         createLiteralRule( literalDescr );
 
         // test int
         literalDescr = new FieldConstraintDescr( "intPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "1") );         
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "intPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") ); 
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "intPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "-1") );         
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1" ) );
         createLiteralRule( literalDescr );
 
         // test long
         literalDescr = new FieldConstraintDescr( "longPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "1") );         
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "longPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") );          
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "longPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") );          
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         // test float
         literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "1.1") );          
-        createLiteralRule( literalDescr);
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1.1" ) );
+        createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "-1.1") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1.1" ) );
         createLiteralRule( literalDescr );
 
         // test double
         literalDescr = new FieldConstraintDescr( "doublePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "1.1") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1.1" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "doublePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "0") );        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
         createLiteralRule( literalDescr );
 
         literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "-1.1") );        
-        createLiteralRule( literalDescr);
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1.1" ) );
+        createLiteralRule( literalDescr );
     }
 
     public void testNull() {
@@ -765,8 +795,9 @@
                                                          "stilton" );
 
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", null) );            
-        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  null ) );
+
         columnDescr.addDescr( literalDescr );
 
         ruleDescr.setConsequence( "" );
@@ -793,7 +824,8 @@
         ColumnDescr columnDescr = new ColumnDescr( Cheese.class.getName(),
                                                    "stilton" );
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", null) );    
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  null ) );
         columnDescr.addDescr( literalDescr );
         ruleDescr.setConsequence( "" );
 
@@ -806,7 +838,8 @@
         columnDescr = new ColumnDescr( Cheese.class.getName(),
                                        "stilton" );
         literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("!=", null) );    
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "!=",
+                                                                  null ) );
         columnDescr.addDescr( literalDescr );
         ruleDescr.setConsequence( "" );
 
@@ -818,10 +851,11 @@
         ruleDescr.setLhs( lhs );
         columnDescr = new ColumnDescr( Cheese.class.getName(),
                                        "stilton" );
-        
+
         literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("!=", null ) );            
-        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "!=",
+                                                                  null ) );
+
         columnDescr.addDescr( literalDescr );
         ruleDescr.setConsequence( "" );
 
@@ -851,69 +885,78 @@
         lhs.addDescr( column1 );
 
         final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "type",
-                                                                           "$type" );        
-        
+                                                                           "$type" );
+
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "stilton") );            
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
 
         column1.addDescr( fieldBindingDescr );
         column1.addDescr( literalDescr );
-        
+
         final ColumnDescr column2 = new ColumnDescr( Cheese.class.getName() );
         lhs.addDescr( column2 );
         column2.addDescr( fieldBindingDescr );
 
         ruleDescr.setConsequence( "modify(stilton);" );
 
-        builder.addPackage( packageDescr );        
+        builder.addPackage( packageDescr );
 
         assertLength( 2,
                       builder.getErrors() );
     }
 
-    public void testCompilerConfiguration() throws  Exception {
+    public void testCompilerConfiguration() throws Exception {
         // test default is eclipse jdt core
-        PackageBuilder builder = new PackageBuilder( );;        
+        PackageBuilder builder = new PackageBuilder();;
         Field compilerField = builder.getClass().getDeclaredField( "compiler" );
-        compilerField.setAccessible(true);
-        JavaCompiler compiler = ( JavaCompiler ) compilerField.get( builder );
-        assertSame( EclipseJavaCompiler.class, compiler.getClass() );
-        
+        compilerField.setAccessible( true );
+        JavaCompiler compiler = (JavaCompiler) compilerField.get( builder );
+        assertSame( EclipseJavaCompiler.class,
+                    compiler.getClass() );
+
         // test JANINO with property settings
-        PackageBuilderConfiguration conf = new PackageBuilderConfiguration();       
+        PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
         conf.setCompiler( PackageBuilderConfiguration.JANINO );
-        builder = new PackageBuilder( conf );;      
-        compiler = ( JavaCompiler ) compilerField.get( builder );
-        assertSame( JaninoJavaCompiler.class, compiler.getClass() );
-        
+        builder = new PackageBuilder( conf );;
+        compiler = (JavaCompiler) compilerField.get( builder );
+        assertSame( JaninoJavaCompiler.class,
+                    compiler.getClass() );
+
         // test eclipse jdt core with property settings and default source level
-        conf = new PackageBuilderConfiguration();       
+        conf = new PackageBuilderConfiguration();
         conf.setCompiler( PackageBuilderConfiguration.ECLIPSE );
-        builder = new PackageBuilder( conf );;      
-        compiler = ( JavaCompiler ) compilerField.get( builder );
-        assertSame( EclipseJavaCompiler.class, compiler.getClass() );   
-        
-        EclipseJavaCompiler eclipseCompiler = ( EclipseJavaCompiler ) compiler;
-        Field settingsField  = eclipseCompiler.getClass().getDeclaredField( "settings" );
+        builder = new PackageBuilder( conf );;
+        compiler = (JavaCompiler) compilerField.get( builder );
+        assertSame( EclipseJavaCompiler.class,
+                    compiler.getClass() );
+
+        EclipseJavaCompiler eclipseCompiler = (EclipseJavaCompiler) compiler;
+        Field settingsField = eclipseCompiler.getClass().getDeclaredField( "settings" );
         settingsField.setAccessible( true );
-        EclipseJavaCompilerSettings settings = ( EclipseJavaCompilerSettings ) settingsField.get( eclipseCompiler );
-        assertEquals( "1.4", settings.getMap().get( "org.eclipse.jdt.core.compiler.codegen.targetPlatform" ) );
-        assertEquals( "1.4", settings.getMap().get( "org.eclipse.jdt.core.compiler.source" ) );
-        
+        EclipseJavaCompilerSettings settings = (EclipseJavaCompilerSettings) settingsField.get( eclipseCompiler );
+        assertEquals( "1.4",
+                      settings.getMap().get( "org.eclipse.jdt.core.compiler.codegen.targetPlatform" ) );
+        assertEquals( "1.4",
+                      settings.getMap().get( "org.eclipse.jdt.core.compiler.source" ) );
+
         // test eclipse jdt core with property settings and jdk1.5 source level
-        conf = new PackageBuilderConfiguration();       
+        conf = new PackageBuilderConfiguration();
         conf.setCompiler( PackageBuilderConfiguration.ECLIPSE );
         conf.setJavaLanguageLevel( "1.5" );
-        builder = new PackageBuilder( conf );;      
-        compiler = ( JavaCompiler ) compilerField.get( builder );
-        assertSame( EclipseJavaCompiler.class, compiler.getClass() );   
-        
-        eclipseCompiler = ( EclipseJavaCompiler ) compiler;
-        settings = ( EclipseJavaCompilerSettings ) settingsField.get( eclipseCompiler );
-        assertEquals( "1.5", settings.getMap().get( "org.eclipse.jdt.core.compiler.codegen.targetPlatform" ) );
-        assertEquals( "1.5", settings.getMap().get( "org.eclipse.jdt.core.compiler.source" ) );     
-    }    
-    
+        builder = new PackageBuilder( conf );;
+        compiler = (JavaCompiler) compilerField.get( builder );
+        assertSame( EclipseJavaCompiler.class,
+                    compiler.getClass() );
+
+        eclipseCompiler = (EclipseJavaCompiler) compiler;
+        settings = (EclipseJavaCompilerSettings) settingsField.get( eclipseCompiler );
+        assertEquals( "1.5",
+                      settings.getMap().get( "org.eclipse.jdt.core.compiler.codegen.targetPlatform" ) );
+        assertEquals( "1.5",
+                      settings.getMap().get( "org.eclipse.jdt.core.compiler.source" ) );
+    }
+
     private void createReturnValueRule(final PackageDescr packageDescr,
                                        final String expression) {
         final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
@@ -935,10 +978,11 @@
 
         packageDescr.addGlobal( "map",
                                 "java.util.Map" );
-       
+
         FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
-        returnValue.addRestriction( new ReturnValueRestrictionDescr("==", expression) );
-        
+        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
+                                                                     expression ) );
+
         column.addDescr( returnValue );
 
         ruleDescr.setConsequence( "modify(stilton);" );
@@ -1027,8 +1071,9 @@
                                                          "stilton" );
 
         FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr("==", "stilton") );        
-        
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
+
         columnDescr.addDescr( literalDescr );
 
         ceDescr.addDescr( columnDescr );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -23,7 +23,7 @@
 
 import org.codehaus.jfdi.interpreter.TypeResolver;
 import org.codehaus.jfdi.interpreter.ClassTypeResolver;
-import org.drools.spi.AvailableVariables;
+import org.drools.spi.DeclarationScopeResolver;
 import org.drools.rule.Package;
 
 import junit.framework.TestCase;
@@ -56,7 +56,7 @@
         variables.put( "yyy", String.class );
         variables.put( "iii", String.class );
         assertEquals( "org.drools.Func.func(yyy, iii)",
-                      fixer.fix( "func(yyy, iii)", new AvailableVariables( new Map[] { variables }  ) ) );
+                      fixer.fix( "func(yyy, iii)", new DeclarationScopeResolver( new Map[] { variables }  ) ) );
     }
 
     public void testMoreComplex() {
@@ -64,7 +64,7 @@
         variables.put( "yyy", String.class );
         variables.put( "iii", String.class );        
         assertEquals( "xxx org.drools.Func.func(yyy, iii) yyy",
-                      fixer.fix( "xxx func(yyy, iii) yyy", new AvailableVariables( new Map[] { variables }  )  ) );
+                      fixer.fix( "xxx func(yyy, iii) yyy", new DeclarationScopeResolver( new Map[] { variables }  )  ) );
     }
 
     public void testLeaveAloneNew() {

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/RuleBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/RuleBuilderTest.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/RuleBuilderTest.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.semantics.java;
+
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.drools.base.ClassFieldExtractorCache;
+import org.drools.compiler.DrlParser;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.Declaration;
+import org.drools.rule.GroupElement;
+import org.drools.rule.Package;
+import org.drools.rule.Rule;
+import org.drools.spi.FunctionResolver;
+
+/**
+ * @author etirelli
+ *
+ */
+public class RuleBuilderTest extends TestCase {
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Test method for {@link org.drools.semantics.java.RuleBuilder#build(org.drools.rule.Package, org.drools.lang.descr.RuleDescr)}.
+     */
+    public void testBuild() {
+        try {
+            final DrlParser parser = new DrlParser();
+            final PackageDescr pkgDescr = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "nestedConditionalElements.drl" ) ) );
+
+            // just checking there is no parsing errors
+            Assert.assertFalse( parser.getErrors().toString(),
+                                parser.hasErrors() );
+
+            Package pkg = new Package( "org.drools" );
+
+            RuleDescr ruleDescr = (RuleDescr) pkgDescr.getRules().get( 0 );
+            final String ruleClassName = "RuleClassName.java";
+            ruleDescr.setClassName( ruleClassName );
+
+            TypeResolver typeResolver = new ClassTypeResolver( new ArrayList(),
+                                                               this.getClass().getClassLoader() );
+            // make an automatic import for the current package
+            typeResolver.addImport( pkgDescr.getName() + ".*" );
+            typeResolver.addImport( "java.lang.*" );
+
+            FunctionResolver functionResolver = new StaticMethodFunctionResolver( pkg.getFunctionImports(),
+                                                                                  typeResolver );
+
+            FunctionFixer functionFixer = new FunctionFixer( pkg,
+                                                             functionResolver );
+
+            final RuleBuilder builder = new RuleBuilder( typeResolver,
+                                                         functionFixer,
+                                                         new ClassFieldExtractorCache() );
+
+            builder.build( pkg,
+                           ruleDescr );
+
+            Assert.assertTrue( builder.getErrors().toString(),
+                               builder.getErrors().isEmpty() );
+
+            final Rule rule = builder.getRule();
+            
+            assertEquals( "There should be 2 rule level declarations", 2, rule.getDeclarations().length );
+            
+            // second GE should be a not
+            GroupElement not = (GroupElement) rule.getLhs().getChildren().get( 1 );
+            assertTrue( not.isNot() );
+            // not has no outer declarations
+            assertTrue( not.getOuterDeclarations().isEmpty() );
+            assertEquals( 1, not.getInnerDeclarations().size() );
+            assertTrue( not.getInnerDeclarations().keySet().contains( "$state" ) );
+            
+            // second not
+            GroupElement not2 = (GroupElement) ((GroupElement) not.getChildren().get( 0 )).getChildren().get( 1 );
+            assertTrue( not2.isNot() );
+            // not has no outer declarations
+            assertTrue( not2.getOuterDeclarations().isEmpty() );
+            assertEquals( 1, not2.getInnerDeclarations().size() );
+            assertTrue( not2.getInnerDeclarations().keySet().contains( "$likes" ) );
+            
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail( "This test is not supposed to throw any exception: " + e.getMessage() );
+        }
+
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/RuleBuilderTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -9,7 +9,7 @@
 
 import org.codehaus.jfdi.interpreter.TypeResolver;
 import org.codehaus.jfdi.interpreter.ClassTypeResolver;
-import org.drools.spi.AvailableVariables;
+import org.drools.spi.DeclarationScopeResolver;
 import org.drools.spi.FunctionResolver;
 
 public class StaticMethodFunctionResolverTest extends TestCase {
@@ -34,7 +34,7 @@
         assertEquals( "org.drools.StaticMethods",
                       functionResolver.resolveFunction( "getString1",
                                                         "a",
-                                                        new AvailableVariables( new Map[]{map} ) ) );
+                                                        new DeclarationScopeResolver( new Map[]{map} ) ) );
 
     }
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/java/nestedConditionalElements.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/java/nestedConditionalElements.drl	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/java/nestedConditionalElements.drl	2007-01-06 18:32:48 UTC (rev 8732)
@@ -0,0 +1,13 @@
+package org.drools;
+
+global java.util.List results
+
+rule "test nested CEs"	
+	when
+	    $st : State( $spstate : state == "SP" )
+	    not ( State( $state : state ) and
+	          not( Person( status == $state, $likes : likes ) and
+	               Cheese( type == $likes ) ) )
+	then 
+		results.add("OK");		
+end
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/semantics/java/nestedConditionalElements.drl
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2007-01-06 01:39:55 UTC (rev 8731)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2007-01-06 18:32:48 UTC (rev 8732)
@@ -44,48 +44,48 @@
     /**
      * 
      */
-    private static final long  serialVersionUID  = 320;
+    private static final long serialVersionUID  = 320;
 
     /**   */
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
     /** The parent pkg */
-    private String             pkg;
+    private String            pkg;
 
     /** Name of the rule. */
-    private final String       name;
+    private final String      name;
 
     /** Salience value. */
-    private int                salience;
+    private int               salience;
 
-    private boolean            dirty             = false;
-    private Map                declarations;
-    private Declaration[]      declarationArray;
+    private boolean           dirty             = false;
+    private Map               declarations;
+    private Declaration[]     declarationArray;
 
-    private final GroupElement lhsRoot           = new GroupElement( GroupElement.AND );
+    private GroupElement      lhsRoot;
 
-    private String             agendaGroup;
+    private String            agendaGroup;
 
     /** Consequence. */
-    private Consequence        consequence;
+    private Consequence       consequence;
 
     /** Truthness duration. */
-    private Duration           duration;
+    private Duration          duration;
 
     /** Load order in Package */
-    private long               loadOrder;
+    private long              loadOrder;
 
     /** Is recursion of this rule allowed */
-    private boolean            noLoop;
+    private boolean           noLoop;
 
     /** makes the rule's much the current focus */
-    private boolean            autoFocus;
+    private boolean           autoFocus;
 
-    private String             ActivationGroup;
+    private String            ActivationGroup;
 
     /** indicates that the rule is semantically correct. */
-    private boolean            semanticallyValid = true;
+    private boolean           semanticallyValid = true;
 
     // ------------------------------------------------------------
     // Constructors
@@ -104,6 +104,7 @@
         this.name = name;
         this.pkg = pkg;
         this.agendaGroup = agendaGroup;
+        this.lhsRoot = GroupElementFactory.newAndInstance();
     }
 
     /**
@@ -115,15 +116,11 @@
      */
     public Rule(final String name,
                 final String agendaGroup) {
-        this.name = name;
-        this.pkg = null;
-        this.agendaGroup = agendaGroup;
+        this( name, null, agendaGroup );
     }
 
     public Rule(final String name) {
-        this.name = name;
-        this.pkg = null;
-        this.agendaGroup = AgendaGroup.MAIN;
+        this( name, null, AgendaGroup.MAIN );
     }
 
     /**
@@ -314,6 +311,10 @@
         return this.lhsRoot;
     }
 
+    public void setLhs( GroupElement lhsRoot ) {
+        this.lhsRoot = lhsRoot;
+    }
+
     /**
      * Uses the LogicTransformer to process the Rule patters - if no ORs are
      * used this will return an array of a single AND element. If there are Ors




More information about the jboss-svn-commits mailing list