[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