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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Mar 28 15:08:35 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-03-28 15:08:35 -0400 (Wed, 28 Mar 2007)
New Revision: 10585

Modified:
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Deffunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Function.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/LispForm.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BaseFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BindFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/IfFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java
   labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java
Log:
JBRULES-720 Clips Parser
-Refactored addParamterCallback to received the FunctionCaller and add the parameter there, this allows in place element rewritting
-If now works with multiple lines and the optional "else" location is stored for fast lookup.

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Deffunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Deffunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Deffunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -51,8 +51,10 @@
     }
 
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
+        caller.addParameter( valueHandler );
         return valueHandler;
     }
 

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -40,6 +40,10 @@
         this.printoutRouters = printoutRouters;
     }
     
+    public void addPrintoutRouter(String identifier, PrintStream stream) {
+        this.printoutRouters.put( identifier, stream );
+    }
+    
     public PrintStream getPrintoutRouters(String identifier) {
         return ( PrintStream ) this.printoutRouters.get( identifier );
     }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Function.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Function.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/Function.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -1,5 +1,7 @@
 package org.drools.clp;
 
+import org.drools.clp.valuehandlers.FunctionCaller;
+
 public interface Function { //extends ValueHandler {
     public ValueHandler execute(ValueHandler[] args,
                                 ExecutionContext context);
@@ -9,7 +11,8 @@
     public void initCallback(ExecutionBuildContext context);
 
     public ValueHandler addParameterCallback(int index,
-                                             ValueHandler valueHandler,
+                                             FunctionCaller caller,
+                                             ValueHandler valueHandler,                                             
                                              ExecutionBuildContext context);
 
     public LispList createList(int index);

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -1,5 +1,7 @@
 package org.drools.clp;
 
+import org.drools.clp.valuehandlers.FunctionCaller;
+
 public class FunctionDelegator
     implements
     Function {
@@ -23,11 +25,18 @@
     }
 
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
-        return this.function.addParameterCallback( 0,
-                                                   valueHandler,
-                                                   context );
+        if ( this.function == null ) {
+            caller.addParameter( valueHandler );
+        } else {
+            valueHandler = this.function.addParameterCallback( 0,
+                                                               caller,
+                                                               valueHandler,
+                                                               context );
+        }
+        return valueHandler;
     }
 
     public void initCallback(ExecutionBuildContext context) {

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/LispForm.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/LispForm.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/LispForm.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -40,11 +40,12 @@
                 } else {
                     length = (this.caller == null) ? 0 : this.caller.getParameters().length;
                 }
-                valueHandler = delegator.getFunction().addParameterCallback( length,
-                                                                             valueHandler,
-                                                                             context );
+                delegator.getFunction().addParameterCallback( length,
+                                                              this.caller,
+                                                              valueHandler,
+                                                              context );
             }
-            this.caller.addParameter( valueHandler );
+            //this.caller.addParameter( valueHandler );
 
         }
     }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BaseFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BaseFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BaseFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -6,6 +6,7 @@
 import org.drools.clp.LispForm;
 import org.drools.clp.LispList;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
 
 public abstract class BaseFunction
     implements
@@ -16,8 +17,10 @@
     }
 
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
+        caller.addParameter( valueHandler );
         return valueHandler;
     }
 

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BindFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BindFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BindFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -4,6 +4,7 @@
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
 import org.drools.clp.valuehandlers.TempTokenVariable;
 
 public class BindFunction extends BaseFunction
@@ -16,6 +17,7 @@
     }
 
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
         // The first index in the 'bind' function is the variable
@@ -25,6 +27,8 @@
             valueHandler = context.createLocalVariable( temp.getIdentifier() );
         }
 
+        caller.addParameter( valueHandler );
+        
         return valueHandler;
     }
 

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -5,6 +5,7 @@
 import org.drools.clp.Function;
 import org.drools.clp.ValueHandler;
 import org.drools.clp.valuehandlers.BaseValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
 import org.drools.clp.valuehandlers.ListValueHandler;
 import org.drools.clp.valuehandlers.TempTokenVariable;
 
@@ -18,6 +19,7 @@
     }
     
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
         // The first index in the 'foreach' function is the variable
@@ -26,6 +28,8 @@
             TempTokenVariable temp = (TempTokenVariable) valueHandler;
             valueHandler = context.createLocalVariable( temp.getIdentifier() );
         }
+        
+        caller.addParameter( valueHandler );
 
         return valueHandler;
     }    

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/IfFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/IfFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/IfFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -1,11 +1,17 @@
 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.ValueHandler;
 import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.ListValueHandler;
+import org.drools.clp.valuehandlers.LongValueHandler;
+import org.drools.clp.valuehandlers.ObjectValueHandler;
+import org.drools.clp.valuehandlers.TempTokenVariable;
 
 public class IfFunction extends BaseFunction
     implements
@@ -15,17 +21,55 @@
     public IfFunction() {
 
     }
+    
+    public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
+                                             ValueHandler valueHandler,
+                                             ExecutionBuildContext context) {
+        // We need to determine and store the 'else' location so that we don't have to "seach" for it at runtime
+        // we rewrite the conditional function into a list, the first element stores the original
+        
+        if ( index == 0 ) {
+            // we are at the conditional element, rewrite it so it can hold the 'else' position
+            ListValueHandler list = new ListValueHandler();
+            list.add( valueHandler );
+            valueHandler = list;
+        } else if ( valueHandler instanceof ObjectValueHandler ) {
+            String token = valueHandler.getStringValue( null );
+            if ( token.equals( "else" ) ) {
+                ((ListValueHandler) caller.getParameters()[0]).add( new LongValueHandler( index + 1 ) );
+            }
+        }
+        
+        caller.addParameter( valueHandler );
 
+        return valueHandler;
+    }    
+
     public ValueHandler 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 );
+        ValueHandler[] list = ((ListValueHandler)args[0]).getList();
+        
+         ValueHandler result = null;      
+        
+        int elseIndex = args.length;
+        if ( list.length == 2 ) {
+            elseIndex = list[1].getIntValue( context );
+        }
+        
+        if ( list[0].getBooleanValue( context ) ) {
+            for ( int i = 0; i < elseIndex; i++ ) {
+                result = args[i].getValue( context );
+            }
+        } else if ( elseIndex != args.length) {
+            for ( int i = elseIndex; i < args.length; i++ ) {
+                result = args[i].getValue( context );
+            }            
         } else {
-            return new BooleanValueHandler( result );
+            result = new BooleanValueHandler( false );
         }
+        
+        return result;
     }
 
     public String getName() {

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -1,15 +1,11 @@
 package org.drools.clp.functions;
 
-import java.io.OutputStream;
 import java.io.PrintStream;
 
 import org.drools.base.SimpleValueType;
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
-import org.drools.clp.FunctionDelegator;
 import org.drools.clp.ValueHandler;
-import org.drools.clp.valuehandlers.BaseValueHandler;
-import org.drools.clp.valuehandlers.BooleanValueHandler;
 import org.drools.clp.valuehandlers.ListValueHandler;
 
 public class PrintoutFunction extends BaseFunction
@@ -33,7 +29,7 @@
                     route.print( list[j].getStringValue( context ) );
                 }
             } else {
-                System.out.print( args[i].getStringValue( context ) );
+                route.print( args[i].getStringValue( context ) );
             }
         }
         

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -21,15 +21,19 @@
     }
 
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
         if ( index == 0 ) {
             // swap the element for an equality check        
-            FunctionCaller caller  = new FunctionCaller( context.getFunctionRegistry().getFunction( "eq" ) );
-            caller.addParameter( (ValueHandler) context.getProperty( "switch-variable"  ) );
-            caller.addParameter( valueHandler );
-            valueHandler = caller;
+            FunctionCaller switchCaller  = new FunctionCaller( context.getFunctionRegistry().getFunction( "eq" ) );
+            switchCaller.addParameter( (ValueHandler) context.getProperty( "switch-variable"  ) );
+            switchCaller.addParameter( valueHandler );
+            valueHandler = switchCaller;
         }
+        
+        caller.addParameter( valueHandler );
+        
         return valueHandler;
     }      
     

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -8,6 +8,7 @@
 import org.drools.clp.ValueHandler;
 import org.drools.clp.valuehandlers.BaseValueHandler;
 import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
 import org.drools.clp.valuehandlers.LocalVariableValue;
 import org.drools.clp.valuehandlers.TempTokenVariable;
 
@@ -21,6 +22,7 @@
     }
     
     public ValueHandler addParameterCallback(int index,
+                                             FunctionCaller caller,
                                              ValueHandler valueHandler,
                                              ExecutionBuildContext context) {
         if ( index == 0 ) {
@@ -31,6 +33,8 @@
                 context.setProperty( "switch-variable", valueHandler );
             }
         }
+        
+        caller.addParameter( valueHandler );
 
         return valueHandler;
     }     

Modified: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java	2007-03-28 18:42:59 UTC (rev 10584)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java	2007-03-28 19:08:35 UTC (rev 10585)
@@ -1,7 +1,9 @@
 package org.drools.clp;
 
+import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.PrintStream;
 import java.io.Reader;
 import java.math.BigDecimal;
 import java.util.HashMap;
@@ -23,6 +25,25 @@
 public class CompiledFunctionsTest extends TestCase {
     private CLPParser parser;
 
+    public void testPrintout() throws Exception {        
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(printout d xx (eq 1 1) ?c (create$ (+ 1 1) x y) zzz)" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         1 );
+
+        Map vars = new HashMap();
+        vars.put( "?c",
+                  new ObjectValueHandler( "brie" ) );
+        engine.replaceTempTokens( vars );
+
+        ByteArrayOutputStream bais = new ByteArrayOutputStream();                
+        context.addPrintoutRouter( "d", new PrintStream(bais) );
+        
+        engine.execute( context );
+        
+        assertEquals( "xxtruebrie2xyzzz", new String( bais.toByteArray() ) );
+    }
+    
     public void testBindAndModify() throws Exception {
         BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (+ 20 11) ) (modify ?p (age ?x) )" ).rhs();
         ExecutionContext context = new ExecutionContext( null,
@@ -109,7 +130,7 @@
     }
 
     public void testIf() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(if (< ?x ?y ) then (modify ?p (age 15) ) else (modify ?p (age 5)))" ).rhs();
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(if (< ?x ?y ) then (modify ?p (age 15) ) (printout d 15) else (modify ?p (age 5)) (printout d 5) )" ).rhs();
         ExecutionContext context = new ExecutionContext( null,
                                                          null,
                                                          2 );
@@ -127,21 +148,27 @@
         engine.replaceTempTokens( vars );
 
         context.setLocalVariable( 0,
-                                  new LongValueHandler( 20 ) );
-
+                                  new LongValueHandler( 20 ) );        
+        ByteArrayOutputStream bais = new ByteArrayOutputStream();                
+        context.addPrintoutRouter( "d", new PrintStream(bais) );        
         engine.execute( context );
         assertEquals( 15,
                       p.getAge() );
-
+        assertEquals( "15", new String( bais.toByteArray() ) );
+        
+        
         context.setLocalVariable( 0,
                                   new LongValueHandler( 7 ) );
+        bais = new ByteArrayOutputStream();                
+        context.addPrintoutRouter( "d", new PrintStream(bais) );          
         engine.execute( context );
         assertEquals( 5,
                       p.getAge() );
+        assertEquals( "5", new String( bais.toByteArray() ) );
     }
 
-    public void testWhile() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(while (< ?x ?y) do (bind ?x (+ ?x 1) ) )" ).rhs();
+    public void testWhile() throws Exception {               
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(while (< ?x ?y) do (bind ?x (+ ?x 1)) (printout d ?x \" \") )" ).rhs();
         ExecutionContext context = new ExecutionContext( null,
                                                          null,
                                                          2 );
@@ -160,24 +187,35 @@
                                   new LongValueHandler( 0 ) );
         context.setLocalVariable( 1,
                                   new LongValueHandler( 10 ) );
+        
+        ByteArrayOutputStream bais = new ByteArrayOutputStream();              
+        context.addPrintoutRouter( "d", new PrintStream(bais) );                                
 
         engine.execute( context );
         assertEquals( new BigDecimal( 10 ),
                       context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+        
+        assertEquals( "1 2 3 4 5 6 7 8 9 10 ", new String( bais.toByteArray() ) );        
     }
 
     public void testForeach() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x 0) (foreach ?e (create$ 1 2 3) (bind ?x (+ ?x ?e) ) )" ).rhs();
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x 0) (foreach ?e (create$ 1 2 3) (bind ?x (+ ?x ?e) ) (printout d ?x \" \") )" ).rhs();
         ExecutionContext context = new ExecutionContext( null,
                                                          null,
                                                          2 );
+        
+        ByteArrayOutputStream bais = new ByteArrayOutputStream();              
+        context.addPrintoutRouter( "d", new PrintStream(bais) );         
+        
         engine.execute( context );
         assertEquals( new BigDecimal( 6 ),
                       context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+        
+        assertEquals( "1 3 6 ", new String( bais.toByteArray() ) );          
     }
     
     public void testSwitch() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?cheese ?var) (switch ?cheese (case stilton then (bind ?x ?cheese ) (printout t xxx (eq 1 1) (create$ x y) zzz) (break) ) (case cheddar then (bind ?x ?cheese ) (break) ) (default (bind ?x \"default\" ) ) )" ).rhs();
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?cheese ?var) (switch ?cheese (case stilton then (bind ?x ?cheese ) (break) ) (case cheddar then (bind ?x ?cheese ) (break) ) (default (bind ?x \"default\" ) ) )" ).rhs();
         ExecutionContext context = new ExecutionContext( null,
                                                          null,
                                                          3 );




More information about the jboss-svn-commits mailing list