[jboss-svn-commits] JBL Code SVN: r10516 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/clp/functions and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Mar 24 10:25:50 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-03-24 10:25:50 -0400 (Sat, 24 Mar 2007)
New Revision: 10516

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BaseFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/IfFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPLexer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPParser.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Deffunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionBuildContext.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionContext.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Function.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionCaller.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispData.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispForm.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispList.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/AddFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BindFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/LessThanFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ModifyFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/MultiplyFunction.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/CLP.g
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/BlockExecutionTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/ClpParserTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/FunctionFactoryTest.java
Log:
JBRULES-720 Clips Parser
-Function now has full control on child element creation and validation/rewriting
-Added 'if' and 'while' function implementations with unit tests.

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPLexer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPLexer.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPLexer.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0b7 C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g 2007-03-24 03:23:58
+// $ANTLR 3.0b7 C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g 2007-03-24 14:22:23
 
 	package org.drools.clp;
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPParser.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPParser.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/CLPParser.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0b7 C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g 2007-03-24 03:23:58
+// $ANTLR 3.0b7 C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g 2007-03-24 14:22:23
 
 	package org.drools.clp;
 	import java.util.List;
@@ -595,7 +595,7 @@
 
 
     // $ANTLR start rhs
-    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:312:1: rhs returns [ExecutionEngine engine] : (fc= lisp_list[context, new LispForm(context, functionRegistry) ] )* ;
+    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:312:1: rhs returns [ExecutionEngine engine] : (fc= lisp_list[context, new LispForm(context) ] )* ;
     public ExecutionEngine rhs() throws RecognitionException {
         ExecutionEngine engine = null;
 
@@ -604,13 +604,13 @@
 
         
         	        engine = new BlockExecutionEngine();
-        			ExecutionBuildContext context = new ExecutionBuildContext( engine );  	
+        			ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );  	
         	
         try {
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:3: ( (fc= lisp_list[context, new LispForm(context, functionRegistry) ] )* )
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:3: (fc= lisp_list[context, new LispForm(context, functionRegistry) ] )*
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:3: ( (fc= lisp_list[context, new LispForm(context) ] )* )
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:3: (fc= lisp_list[context, new LispForm(context) ] )*
             {
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:3: (fc= lisp_list[context, new LispForm(context, functionRegistry) ] )*
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:3: (fc= lisp_list[context, new LispForm(context) ] )*
             loop5:
             do {
                 int alt5=2;
@@ -622,10 +622,10 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:4: fc= lisp_list[context, new LispForm(context, functionRegistry) ]
+            	    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:319:4: fc= lisp_list[context, new LispForm(context) ]
             	    {
             	    pushFollow(FOLLOW_lisp_list_in_rhs331);
-            	    fc=lisp_list(context,  new LispForm(context,  functionRegistry) );
+            	    fc=lisp_list(context,  new LispForm(context) );
             	    _fsp--;
 
             	     context.addFunction( (FunctionCaller) fc ); 
@@ -854,7 +854,7 @@
 
 
     // $ANTLR start eval_ce
-    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:374:1: eval_ce[ConditionalElementDescr in_ce] : LEFT_PAREN TEST fc= lisp_list[context, new LispForm(context, functionRegistry)] RIGHT_PAREN ;
+    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:374:1: eval_ce[ConditionalElementDescr in_ce] : LEFT_PAREN TEST fc= lisp_list[context, new LispForm(context)] RIGHT_PAREN ;
     public void eval_ce(ConditionalElementDescr in_ce) throws RecognitionException {
         ValueHandler fc = null;
 
@@ -862,11 +862,11 @@
         
                 EvalDescr evalDescr= null;    
            		ExecutionEngine engine = new CLPEval();     
-        		ExecutionBuildContext context = new ExecutionBuildContext( engine );   		         
+        		ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );   		         
             
         try {
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:380:4: ( LEFT_PAREN TEST fc= lisp_list[context, new LispForm(context, functionRegistry)] RIGHT_PAREN )
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:380:4: LEFT_PAREN TEST fc= lisp_list[context, new LispForm(context, functionRegistry)] RIGHT_PAREN
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:380:4: ( LEFT_PAREN TEST fc= lisp_list[context, new LispForm(context)] RIGHT_PAREN )
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:380:4: LEFT_PAREN TEST fc= lisp_list[context, new LispForm(context)] RIGHT_PAREN
             {
             match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_eval_ce550); 
             match(input,TEST,FOLLOW_TEST_in_eval_ce555); 
@@ -875,7 +875,7 @@
             		    in_ce.addDescr( evalDescr );
             		
             pushFollow(FOLLOW_lisp_list_in_eval_ce563);
-            fc=lisp_list(context,  new LispForm(context,  functionRegistry));
+            fc=lisp_list(context,  new LispForm(context));
             _fsp--;
 
             					
@@ -1260,22 +1260,22 @@
 
 
     // $ANTLR start predicate_constraint
-    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:472:1: predicate_constraint[String op, ColumnDescr column] : COLON fc= lisp_list[context, new LispForm(context, functionRegistry)] ;
+    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:472:1: predicate_constraint[String op, ColumnDescr column] : COLON fc= lisp_list[context, new LispForm(context)] ;
     public void predicate_constraint(String op, ColumnDescr column) throws RecognitionException {
         ValueHandler fc = null;
 
 
         
            		ExecutionEngine engine = new CLPPredicate();
-        		ExecutionBuildContext context = new ExecutionBuildContext( engine );    
+        		ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );    
             
         try {
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:477:4: ( COLON fc= lisp_list[context, new LispForm(context, functionRegistry)] )
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:477:4: COLON fc= lisp_list[context, new LispForm(context, functionRegistry)]
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:477:4: ( COLON fc= lisp_list[context, new LispForm(context)] )
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:477:4: COLON fc= lisp_list[context, new LispForm(context)]
             {
             match(input,COLON,FOLLOW_COLON_in_predicate_constraint916); 
             pushFollow(FOLLOW_lisp_list_in_predicate_constraint922);
-            fc=lisp_list(context,  new LispForm(context,  functionRegistry));
+            fc=lisp_list(context,  new LispForm(context));
             _fsp--;
 
             	
@@ -1298,22 +1298,22 @@
 
 
     // $ANTLR start return_value_restriction
-    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:486:1: return_value_restriction[String op, FieldConstraintDescr fc] : EQUALS func= lisp_list[context, new LispForm(context, functionRegistry)] ;
+    // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:486:1: return_value_restriction[String op, FieldConstraintDescr fc] : EQUALS func= lisp_list[context, new LispForm(context)] ;
     public void return_value_restriction(String op, FieldConstraintDescr fc) throws RecognitionException {
         ValueHandler func = null;
 
 
         
         		ExecutionEngine engine = new CLPReturnValue();
-        		ExecutionBuildContext context = new ExecutionBuildContext( engine );
+        		ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );
         	
         try {
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:491:4: ( EQUALS func= lisp_list[context, new LispForm(context, functionRegistry)] )
-            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:491:4: EQUALS func= lisp_list[context, new LispForm(context, functionRegistry)]
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:491:4: ( EQUALS func= lisp_list[context, new LispForm(context)] )
+            // C:\\dev\\jbossrules\\trunk\\drools-compiler\\src\\main\\resources\\org\\drools\\clp\\CLP.g:491:4: EQUALS func= lisp_list[context, new LispForm(context)]
             {
             match(input,EQUALS,FOLLOW_EQUALS_in_return_value_restriction948); 
             pushFollow(FOLLOW_lisp_list_in_return_value_restriction955);
-            func=lisp_list(context,  new LispForm(context,  functionRegistry));
+            func=lisp_list(context,  new LispForm(context));
             _fsp--;
 
             					

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Deffunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Deffunction.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Deffunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,59 +1,81 @@
 package org.drools.clp;
 
-public class Deffunction implements Function {
-    private final String name;
+public class Deffunction
+    implements
+    Function {
+    private final String     name;
     private FunctionCaller[] functions;
-  
-    private ValueHandler[] parameters;
-    
+
+    private ValueHandler[]   parameters;
+
     public Deffunction(String name) {
         this.name = name;
     }
-    
+
     public void addParameter(ValueHandler parameter) {
-        if (parameters == null) {
-            this.parameters = new ValueHandler[] { parameter };
+        if ( parameters == null ) {
+            this.parameters = new ValueHandler[]{parameter};
         } else {
-            ValueHandler[] temp =  new ValueHandler[ parameters.length + 1 ];
-            System.arraycopy( this.parameters, 0, temp, 0, this.parameters.length );
-            temp[ temp.length - 1] = parameter;
-            this.parameters = temp;             
-        }                
+            ValueHandler[] temp = new ValueHandler[parameters.length + 1];
+            System.arraycopy( this.parameters,
+                              0,
+                              temp,
+                              0,
+                              this.parameters.length );
+            temp[temp.length - 1] = parameter;
+            this.parameters = temp;
+        }
     }
-    
+
     public void addFunction(FunctionCaller function) {
-        if (functions == null) {
-            this.functions = new FunctionCaller[] { function};
+        if ( functions == null ) {
+            this.functions = new FunctionCaller[]{function};
         } else {
-            FunctionCaller[] temp =  new FunctionCaller[ functions.length + 1 ];
-            System.arraycopy( this.functions, 0, temp, 0, this.functions.length );
-            temp[ temp.length - 1] = function;
-            this.functions = temp;             
-        }                
-    }    
-    
+            FunctionCaller[] temp = new FunctionCaller[functions.length + 1];
+            System.arraycopy( this.functions,
+                              0,
+                              temp,
+                              0,
+                              this.functions.length );
+            temp[temp.length - 1] = function;
+            this.functions = temp;
+        }
+    }
+
     public ValueHandler[] getParameters() {
         return this.parameters;
-    }    
-    
+    }
 
+    public ValueHandler addParameterCallback(int index,
+                                             ValueHandler valueHandler,
+                                             ExecutionBuildContext context) {
+        return valueHandler;
+    }
+
+    public void initCallback(ExecutionBuildContext context) {
+    }
+
     public Object execute(ValueHandler[] args,
                           ExecutionContext context) {
-        ExecutionContext newContext = initContext(args, context);
-        
+        ExecutionContext newContext = initContext( args,
+                                                   context );
+
         Object returnValue = null;
-        
+
         for ( int i = 0, length = this.functions.length; i < length; i++ ) {
-            returnValue = this.functions[i].getValue( newContext ); 
+            returnValue = this.functions[i].getValue( newContext );
         }
         return returnValue;
     }
-    
+
     private ExecutionContext initContext(ValueHandler[] args,
-                             ExecutionContext context) {
-        ExecutionContext newContext = new ExecutionContext(context.getWorkingMemory(), context.getTuple(), args.length );
+                                         ExecutionContext context) {
+        ExecutionContext newContext = new ExecutionContext( context.getWorkingMemory(),
+                                                            context.getTuple(),
+                                                            args.length );
         for ( int i = 0, length = args.length; i < length; i++ ) {
-            newContext.setLocalVariable( i, args[i].getValue( context ) );
+            newContext.setLocalVariable( i,
+                                         args[i].getValue( context ) );
         }
         return newContext;
     }
@@ -61,8 +83,8 @@
     public String getName() {
         return this.name;
     }
-    
+
     public LispList createList(int index) {
         return new LispForm();
-    }    
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionBuildContext.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionBuildContext.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,35 +1,59 @@
 package org.drools.clp;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 public class ExecutionBuildContext {
-    private Map vars = new HashMap();
-    private ExecutionEngine engine;
-    
-    public ExecutionBuildContext(ExecutionEngine engine) {
+    private Map              vars       = new HashMap();
+    private Map              properties = Collections.EMPTY_MAP;
+    private ExecutionEngine  engine;
+    private FunctionRegistry registry;
+
+    public ExecutionBuildContext(ExecutionEngine engine,
+                                 FunctionRegistry registry) {
         this.engine = engine;
+        this.registry = registry;
     }
+
+    public FunctionRegistry getFunctionRegistry() {
+        return this.registry;
+    }
     
     public void addFunction(FunctionCaller function) {
         this.engine.addFunction( function );
+    }    
+
+    public Object setProperty(Object key,
+                              Object value) {
+        if ( this.properties == Collections.EMPTY_MAP ) {
+            this.properties = new HashMap();
+        }
+        return this.properties.put( key,
+                                    value );
     }
-    
+
+    public Object getProperty(Object key) {
+        return this.properties.get( key );
+    }
+
     public ValueHandler createLocalVariable(String identifier) {
-        ValueHandler var = ( ValueHandler ) this.vars.get( identifier ) ;
-        if (  var == null ) {
-            var = new LocalVariableValue(identifier, this.engine.getNextIndex() );
-            this.vars.put( identifier, var );
+        ValueHandler var = (ValueHandler) this.vars.get( identifier );
+        if ( var == null ) {
+            var = new LocalVariableValue( identifier,
+                                          this.engine.getNextIndex() );
+            this.vars.put( identifier,
+                           var );
         }
         return var;
     }
-    
+
     public ValueHandler getVariableValueHandler(String identifier) {
-        ValueHandler var = ( ValueHandler ) this.vars.get( identifier ) ;
-        if (  var == null ) {
-            var = new TempTokenVariable(identifier);
+        ValueHandler var = (ValueHandler) this.vars.get( identifier );
+        if ( var == null ) {
+            var = new TempTokenVariable( identifier );
         }
         return var;
     }
-    
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionContext.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/ExecutionContext.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -5,48 +5,48 @@
 
 public class ExecutionContext {
     private InternalWorkingMemory workingMemory;
-    private ReteTuple tuple;
-    private Object object;
-    private Object[] localVariables;
-    
+    private ReteTuple             tuple;
+    private Object                object;
+    private Object[]              localVariables;
+
     public ExecutionContext(InternalWorkingMemory workingMemory,
-                         ReteTuple tuple,
-                         int localVariableSize) {
-        this( workingMemory, tuple, null, localVariableSize );
+                            ReteTuple tuple,
+                            int localVariableSize) {
+        this( workingMemory,
+              tuple,
+              null,
+              localVariableSize );
     }
-    
+
     public ExecutionContext(InternalWorkingMemory workingMemory,
-                         ReteTuple tuple,
-                         Object object,
-                         int localVariableSize) {
+                            ReteTuple tuple,
+                            Object object,
+                            int localVariableSize) {
         this.workingMemory = workingMemory;
         this.tuple = tuple;
         this.object = object;
-        this.localVariables = new Object[ localVariableSize ];
-    }    
-    
+        this.localVariables = new Object[localVariableSize];
+    }
+
     public ReteTuple getTuple() {
         return tuple;
     }
-    
+
     public InternalWorkingMemory getWorkingMemory() {
         return workingMemory;
     }
-    
+
     public Object getObject() {
         return this.object;
     }
 
     public Object getLocalVariable(int index) {
         return localVariables[index];
-    }    
+    }
 
-    public void setLocalVariable(int index, Object object) {
+    public void setLocalVariable(int index,
+                                 Object object) {
         this.localVariables[index] = object;
     }
-    
-    
-    
-    
-    
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Function.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Function.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/Function.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -6,9 +6,9 @@
     
     public String getName();    
     
-    public LispList createList(int index);
+    public void initCallback(ExecutionBuildContext context);
     
-    //public void addParameter(ValueHandler valueHandler);
+    public ValueHandler addParameterCallback(int index, ValueHandler valueHandler, ExecutionBuildContext context );
     
-    //public ValueHandler[] getParameters();                
+    public LispList createList(int index);               
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionCaller.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionCaller.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionCaller.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -33,7 +33,7 @@
     
     public void addParameter(ValueHandler valueHandler) {
         if (this.parameters == null) {
-            this.parameters = new ValueHandler[] { valueHandler};
+            this.parameters = new ValueHandler[] { valueHandler};            
         } else {
             ValueHandler[] temp =  new ValueHandler[ parameters.length + 1 ];
             System.arraycopy( this.parameters, 0, temp, 0, this.parameters.length );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,21 +1,35 @@
 package org.drools.clp;
 
-public class FunctionDelegator implements Function {    
+public class FunctionDelegator
+    implements
+    Function {
     private Function function;
-    private String name;
-    
-    public FunctionDelegator( String name ) {
+    private String   name;
+
+    public FunctionDelegator(String name) {
         this.name = name;
     }
 
     public FunctionDelegator(Function function) {
         this.function = function;
     }
-    
+
     public void setFunction(Function function) {
         this.function = function;
     }
 
+    public ValueHandler addParameterCallback(int index,
+                                             ValueHandler valueHandler,
+                                             ExecutionBuildContext context) {
+        return this.function.addParameterCallback( 0,
+                                                   valueHandler,
+                                                   context );
+    }
+
+    public void initCallback(ExecutionBuildContext context) {
+        this.function.initCallback( context );
+    }
+
     public Object execute(ValueHandler[] args,
                           ExecutionContext context) {
         return function.execute( args,
@@ -25,11 +39,11 @@
     public String getName() {
         return this.function == null ? this.name : function.getName();
     }
-    
+
     public LispList createList(int index) {
         return this.function.createList( index );
-    }    
-    
+    }
+
     public String toString() {
         return "[FunctionDelegate " + this.function + "]";
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispData.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispData.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispData.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -5,7 +5,6 @@
     LispList {
     
     private ListValueHandler list;
-    private FunctionRegistry registry;
     private ExecutionBuildContext context;
     
     public LispData() {
@@ -20,7 +19,6 @@
         LispList list = new LispForm( );
         
         list.setContext( this.context );
-        list.setRegistry( this.registry );
         
         return list;
     }
@@ -33,11 +31,6 @@
         this.context = context;
     }
 
-
-    public void setRegistry(FunctionRegistry registry) {
-        this.registry = registry;
-    }    
-
     public ValueHandler[] toArray() {
         return this.list.getList();
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispForm.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispForm.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispForm.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,13 +1,11 @@
 package org.drools.clp;
 
 public class LispForm implements LispList {    
-    private FunctionRegistry registry;
     private ExecutionBuildContext context;
     private FunctionCaller caller;
 
-    public LispForm(ExecutionBuildContext context, FunctionRegistry registry) {
+    public LispForm(ExecutionBuildContext context) {
         this.context = context;
-        this.registry = registry;
     }
     
     public LispForm() {
@@ -20,17 +18,32 @@
     public void add(ValueHandler valueHandler) {
         // we know this is a string literal, so can use null for the context
         if ( this.caller == null ) {
-            this.caller = new FunctionCaller( this.registry.getFunction( valueHandler.getStringValue( null ) ) );
+            this.caller = new FunctionCaller( this.context.getFunctionRegistry().getFunction( valueHandler.getStringValue( null ) ) );
+            this.caller.getFunction().initCallback( context );
         } else {
+            int length;
+            if ( this.caller == null || this.caller.getParameters() == null ) {
+                length = 0;
+            } else {
+                length = ( this.caller == null ) ? 0 : this.caller.getParameters().length;
+            }
+            valueHandler = this.caller.getFunction().addParameterCallback( length, valueHandler, context );
             this.caller.addParameter( valueHandler );
+            
         }
     }
 
     public LispList createList() {
-        LispList list = this.caller.createList( this.caller.getParameters().length );
+        int length;
+        if ( this.caller == null || this.caller.getParameters() == null ) {
+            length = 0;
+        } else {
+            length = ( this.caller == null ) ? 0 : this.caller.getParameters().length;
+        }
         
+        LispList list = this.caller.createList( length );
+        
         list.setContext( this.context );
-        list.setRegistry( this.registry );
         
         return list; 
     }
@@ -38,10 +51,5 @@
     public void setContext(ExecutionBuildContext context) {
         this.context = context;
     }
-
-
-    public void setRegistry(FunctionRegistry registry) {
-        this.registry = registry;
-    }
         
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispList.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispList.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/LispList.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -8,8 +8,5 @@
     public ValueHandler getValueHandler();
     
     public void setContext(ExecutionBuildContext context);
-
-
-    public void setRegistry(FunctionRegistry registry);
     
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/AddFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/AddFunction.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/AddFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -8,7 +8,7 @@
 import org.drools.clp.LispList;
 import org.drools.clp.ValueHandler;
 
-public class AddFunction implements Function {
+public class AddFunction extends BaseFunction implements Function {
     private static final String name = "+";
 
     public AddFunction() {
@@ -26,14 +26,5 @@
     
     public String getName() {
         return name;
-    }
-    
-    public LispList createList(int index) {
-        return new LispForm();
-    }
-    
-    public String toString() {
-        return "[Function '" + getName() + "']";
-    }
-
+    }    
 }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BaseFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BaseFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BaseFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -0,0 +1,26 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionBuildContext;
+import org.drools.clp.Function;
+import org.drools.clp.LispForm;
+import org.drools.clp.LispList;
+import org.drools.clp.ValueHandler;
+
+public abstract class BaseFunction implements Function {  
+    
+    public void initCallback(ExecutionBuildContext context) {
+        
+    }
+    
+    public ValueHandler addParameterCallback(int index, ValueHandler valueHandler, ExecutionBuildContext context ) {
+        return valueHandler;
+    }
+    
+    public LispList createList(int index) {
+        return new LispForm();
+    }
+    
+    public String toString() {
+        return "[Function '" + getName() + "']";
+    }
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BindFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BindFunction.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/BindFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,31 +1,39 @@
 package org.drools.clp.functions;
 
+import org.drools.clp.ExecutionBuildContext;
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
 import org.drools.clp.LispForm;
 import org.drools.clp.LispList;
+import org.drools.clp.TempTokenVariable;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.VariableValueHandler;
 
-public class BindFunction implements Function {
+public class BindFunction extends BaseFunction implements Function {
     private static final String name = "bind";
 
     public BindFunction() {
         
     }
+
+    public ValueHandler addParameterCallback(int index, ValueHandler valueHandler, ExecutionBuildContext context ) {
+        // The first index in the 'bind' function is the variable
+        // register the variable, if it doesn't already exist, will be a TempTokenVariable if it does not already exist
+        if ( index == 0 && ( valueHandler instanceof TempTokenVariable ) ) {
+            TempTokenVariable temp = ( TempTokenVariable ) valueHandler;
+            valueHandler= context.createLocalVariable( temp.getIdentifier() );
+        } 
+        
+        return valueHandler;
+    }
+    
     public Object execute(ValueHandler[] args, ExecutionContext context) {
         args[0].setValue( context, args[1].getValue( context ) );        
         return args[0];    
     }
     
-    public LispList createList(int index) {
-        return new LispForm();
-    }    
-    
     public String getName() {
         return name;
     }
 
-    public String toString() {
-        return "[Function '" + getName() + "']";
-    }
 }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/IfFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/IfFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/IfFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -0,0 +1,39 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.LispForm;
+import org.drools.clp.LispList;
+import org.drools.clp.ValueHandler;
+
+public class IfFunction extends BaseFunction  implements Function {
+    private static final String name = "if";
+
+    public IfFunction() {
+        
+    }
+    
+    public Object execute(ValueHandler[] args, ExecutionContext context) {
+        boolean result = args[0].getBooleanValue( context );
+        if ( result ) {
+            return args[2].getValue( context );
+        } else if ( args[3] != null && args[4] != null ) {
+            return args[4].getValue( context );
+        }   else {
+            return new Boolean( result );
+        }
+    }    
+    
+    
+    public String getName() {
+        return name;
+    }    
+    
+    public LispList createList(int index) {
+        return new LispForm();
+    }
+    
+    public String toString() {
+        return "[Function '" + getName() + "']";
+    }
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/LessThanFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/LessThanFunction.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/LessThanFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -6,7 +6,7 @@
 import org.drools.clp.LispList;
 import org.drools.clp.ValueHandler;
 
-public class LessThanFunction implements Function {
+public class LessThanFunction extends BaseFunction  implements Function {
     private static final String name = "<";
 
     public LessThanFunction() {
@@ -14,18 +14,11 @@
     }   
 
     public Object execute(ValueHandler[] args, ExecutionContext context) {
-        return new Boolean( args[1].getBigDecimalValue( context ).compareTo( args[2].getBigDecimalValue( context ) ) < 0 );    
+        return new Boolean( args[0].getBigDecimalValue( context ).compareTo( args[1].getBigDecimalValue( context ) ) < 0 );    
     }
     
     public String getName() {
         return name;
     }
     
-    public LispList createList(int index) {
-        return new LispForm();
-    }
-    
-    public String toString() {
-        return "[Function '" + getName() + "']";
-    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ModifyFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ModifyFunction.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/ModifyFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -7,7 +7,7 @@
 import org.drools.clp.ValueHandler;
 import org.mvel.PropertyAccessor;
 
-public class ModifyFunction  implements Function {
+public class ModifyFunction  extends BaseFunction  implements Function {
     private static final String name = "modify";    
     
     public ModifyFunction() {
@@ -32,8 +32,4 @@
     public String getName() {
         return name;
     }
-
-    public String toString() {
-        return "[Function '" + getName() + "']";
-    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/MultiplyFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/MultiplyFunction.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/MultiplyFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -8,7 +8,7 @@
 import org.drools.clp.LispList;
 import org.drools.clp.ValueHandler;
 
-public class MultiplyFunction implements Function {
+public class MultiplyFunction extends BaseFunction  implements Function {
     private static final String name = "*";
 
     public MultiplyFunction() {
@@ -26,14 +26,6 @@
     
     public String getName() {
         return name;
-    }
-    
-    public LispList createList(int index) {
-        return new LispForm();
     }    
-    
-    public String toString() {
-        return "[Function '" + getName() + "']";
-    }
 
 }

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/clp/functions/WhileFunction.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -0,0 +1,33 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.LispForm;
+import org.drools.clp.LispList;
+import org.drools.clp.ValueHandler;
+
+public class WhileFunction extends BaseFunction implements Function {
+    private static final String name = "while";
+
+    public WhileFunction() {
+        
+    }
+    
+    public Object execute(ValueHandler[] args, ExecutionContext context) {
+        Object result = null;
+        
+        ValueHandler doHandler = args[ args.length - 1 ];
+        
+        while( args[0].getBooleanValue( context ) ) {
+            result = doHandler.getValue( context );
+        }
+
+        return result;
+    }    
+    
+    
+    public String getName() {
+        return name;
+    }    
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/CLP.g
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/CLP.g	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/CLP.g	2007-03-24 14:25:50 UTC (rev 10516)
@@ -312,11 +312,11 @@
 rhs returns[ExecutionEngine engine]
 	@init {
 	        engine = new BlockExecutionEngine();
-			ExecutionBuildContext context = new ExecutionBuildContext( engine );  	
+			ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );  	
 	}
 	
 	:
-		(fc=lisp_list[context, new LispForm(context, functionRegistry) ] { context.addFunction( (FunctionCaller) fc ); })*
+		(fc=lisp_list[context, new LispForm(context) ] { context.addFunction( (FunctionCaller) fc ); })*
 	;	
 	
 and_ce[ConditionalElementDescr in_ce]
@@ -375,14 +375,14 @@
     @init {
         EvalDescr evalDescr= null;    
    		ExecutionEngine engine = new CLPEval();     
-		ExecutionBuildContext context = new ExecutionBuildContext( engine );   		         
+		ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );   		         
     }
 	:	LEFT_PAREN	
 		TEST {
 		    evalDescr = new EvalDescr();
 		    in_ce.addDescr( evalDescr );
 		}
-		fc=lisp_list[context, new LispForm(context, functionRegistry)] {					
+		fc=lisp_list[context, new LispForm(context)] {					
 		    engine.addFunction( (FunctionCaller) fc );		
 			evalDescr.setContent( engine );			
 		}			 
@@ -472,10 +472,10 @@
 predicate_constraint[String op, ColumnDescr column]	
     @init {
    		ExecutionEngine engine = new CLPPredicate();
-		ExecutionBuildContext context = new ExecutionBuildContext( engine );    
+		ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );    
     }
 	:	COLON
-		fc=lisp_list[context, new LispForm(context, functionRegistry)] {	
+		fc=lisp_list[context, new LispForm(context)] {	
 		    engine.addFunction( (FunctionCaller) fc );
 			column.addDescr( new PredicateDescr( engine ) );
 		}	
@@ -486,10 +486,10 @@
 return_value_restriction[String op, FieldConstraintDescr fc]
 	@init {
 		ExecutionEngine engine = new CLPReturnValue();
-		ExecutionBuildContext context = new ExecutionBuildContext( engine );
+		ExecutionBuildContext context = new ExecutionBuildContext( engine, functionRegistry );
 	}
 	:	EQUALS 
-		func=lisp_list[context, new LispForm(context, functionRegistry)] {					
+		func=lisp_list[context, new LispForm(context)] {					
    		    engine.addFunction( (FunctionCaller) func );
 			fc.addRestriction( new ReturnValueRestrictionDescr (op, engine ) );
 		}		

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/clp/functions.conf	2007-03-24 14:25:50 UTC (rev 10516)
@@ -1,4 +1,6 @@
 org.drools.clp.functions.AddFunction
+org.drools.clp.functions.IfFunction
+org.drools.clp.functions.WhileFunction
 org.drools.clp.functions.LessThanFunction
 org.drools.clp.functions.BindFunction
 org.drools.clp.functions.ModifyFunction
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/BlockExecutionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/BlockExecutionTest.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/BlockExecutionTest.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -10,9 +10,16 @@
 import org.drools.clp.functions.ModifyFunction;
 
 public class BlockExecutionTest extends TestCase {
+    
+    FunctionRegistry registry;
+    
+    public void setUp() {
+        this.registry = new FunctionRegistry( BuiltinFunctions.getInstance() );
+    }    
+    
     public void testAddWithModify() {
         BlockExecutionEngine engine = new BlockExecutionEngine();        
-        ExecutionBuildContext build = new ExecutionBuildContext(engine);                
+        ExecutionBuildContext build = new ExecutionBuildContext(engine, this.registry );                
         
         FunctionCaller addCaller = new FunctionCaller( new AddFunction() );
         addCaller.addParameter( new ObjectLiteralValue( new BigDecimal( 20) ) );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/ClpParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/ClpParserTest.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/ClpParserTest.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -31,14 +31,20 @@
 
     private CLPParser parser;
     
+    FunctionRegistry registry;
+    
+    public void setUp() {
+        this.registry = new FunctionRegistry( BuiltinFunctions.getInstance() );
+    }
+    
     protected void tearDown() throws Exception {
         super.tearDown();
         this.parser = null;
     }
 
-    public void testParseFunction() throws Exception {
-        ExecutionBuildContext context = new ExecutionBuildContext( new CLPPredicate() );
-        FunctionCaller fc = ( FunctionCaller ) parse( "(< 1 2)" ).lisp_list( context, new LispForm(context, new FunctionRegistry( BuiltinFunctions.getInstance() ) ) );
+    public void testParseFunction() throws Exception {        
+        ExecutionBuildContext context = new ExecutionBuildContext( new CLPPredicate(), this.registry );
+        FunctionCaller fc = ( FunctionCaller ) parse( "(< 1 2)" ).lisp_list( context, new LispForm(context) );
         
         assertEquals( "<", fc.getName() );        
         assertEquals( new LongLiteralValue( 1 ), fc.getParameters()[0] );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/CompiledParserTest.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -3,6 +3,7 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -19,15 +20,13 @@
    private CLPParser parser;
    
     public void test1() throws Exception { 
-        BlockExecutionEngine engine = ( BlockExecutionEngine ) parse("(bind ?x (+ 20 11) )(modify ?p (age ?x) )").rhs();
+        BlockExecutionEngine engine = ( BlockExecutionEngine ) parse("(bind ?x (+ 20 11) ) (modify ?p (age ?x) )").rhs();
         ExecutionContext context = new ExecutionContext(null, null, 2);
         
         Person p = new Person("mark");        
         Map vars = new HashMap();
-        
-        // CONAN, is this correct?
-        vars.put( "?x", new LocalVariableValue( "?x", 0 ) );
-        
+                
+        //vars.put( "?x", new LocalVariableValue( "?x", 0 ) );        
         vars.put( "?p", new ObjectLiteralValue( p ) );
         engine.replaceTempTokens( vars );
         
@@ -36,6 +35,45 @@
         assertEquals( 31, p.getAge() );
     }
     
+    public void testIf() throws Exception {
+        BlockExecutionEngine engine = ( BlockExecutionEngine ) parse("(if (< ?x ?y ) then (modify ?p (age 15) ) else (modify ?p (age 5)))").rhs();
+        ExecutionContext context = new ExecutionContext(null, null, 2);
+        
+        Person p = new Person("mark");        
+        Map vars = new HashMap();
+        
+        vars.put( "?x", new LongLiteralValue( 10 ) );
+        vars.put( "?y", new LocalVariableValue( "?y", 0 ) );     
+        vars.put( "?p", new ObjectLiteralValue( p ) );
+        engine.replaceTempTokens( vars );
+        
+        context.setLocalVariable( 0, new Long( 20 ) );
+        
+        engine.execute( context );        
+        assertEquals( 15, p.getAge() );
+        
+        context.setLocalVariable( 0, new Long( 7 ) );
+        engine.execute( context );
+        assertEquals( 5, p.getAge() );
+    }
+    
+    public void testWhile() throws Exception {
+        BlockExecutionEngine engine = ( BlockExecutionEngine ) parse("(while (< ?x ?y) do (bind ?x (+ ?x 1) ) )").rhs();
+        ExecutionContext context = new ExecutionContext(null, null, 2);
+        
+        Map vars = new HashMap();
+        
+        vars.put( "?x", new LocalVariableValue( "?x", 0 ) );  
+        vars.put( "?y", new LocalVariableValue( "?y", 1 ) );     
+        engine.replaceTempTokens( vars );
+        
+        context.setLocalVariable( 0, new Long( 0 ) );
+        context.setLocalVariable( 1, new Long( 10 ) );
+        
+        engine.execute( context );        
+        assertEquals( new BigDecimal(10), context.getLocalVariable( 0 ) );
+    }    
+    
     private CLPParser parse(final String text) throws Exception {
         this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
         return this.parser;
@@ -55,8 +93,6 @@
     }
 
     private CLPParser parseResource(final String name) throws Exception {
-
-        //        System.err.println( getClass().getResource( name ) );
         Reader reader = getReader( name );
 
         final StringBuffer text = new StringBuffer();

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/FunctionFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/FunctionFactoryTest.java	2007-03-24 03:26:59 UTC (rev 10515)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/clp/FunctionFactoryTest.java	2007-03-24 14:25:50 UTC (rev 10516)
@@ -5,9 +5,10 @@
 public class FunctionFactoryTest extends TestCase {
     public void testInit() {
         FunctionRegistry factory = new FunctionRegistry( BuiltinFunctions.getInstance() );
-        assertEquals( 4, factory.getFunctionSize() );
         
+        // make sure some core functions are there
         assertSame( "+", factory.getFunction( "+" ).getName() );
         assertSame( "bind" , factory.getFunction( "bind" ).getName() );
+        assertSame( "modify" , factory.getFunction( "modify" ).getName() );
     }
 }




More information about the jboss-svn-commits mailing list