[jboss-svn-commits] JBL Code SVN: r23836 - in labs/jbossrules/trunk/drools-compiler/src: main/resources/org/drools/xml and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Nov 12 10:24:47 EST 2008


Author: KrisVerlaenen
Date: 2008-11-12 10:24:47 -0500 (Wed, 12 Nov 2008)
New Revision: 23836

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/xml/processes/
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/xml/processes/RuleFlowFrom4To5.xsl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/ruleflow40.rfm
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java
Log:
JBRULES-1797: Migrate Ruleflow from 4.0 to 5.0 during compilation
 - committed provided patch that does automatic conversion from drools4 to drools5 ruleflows

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2008-11-12 11:08:25 UTC (rev 23835)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2008-11-12 15:24:47 UTC (rev 23836)
@@ -1,297 +1,400 @@
-package org.drools.compiler;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.drools.definition.process.Connection;
-import org.drools.definition.process.Node;
-import org.drools.definition.process.NodeContainer;
-import org.drools.definition.process.Process;
-import org.drools.definition.process.WorkflowProcess;
-import org.drools.lang.descr.ActionDescr;
-import org.drools.lang.descr.ProcessDescr;
-import org.drools.process.builder.ProcessNodeBuilder;
-import org.drools.process.builder.ProcessNodeBuilderRegistry;
-import org.drools.process.core.Context;
-import org.drools.process.core.ContextContainer;
-import org.drools.process.core.context.exception.ActionExceptionHandler;
-import org.drools.process.core.context.exception.ExceptionHandler;
-import org.drools.process.core.context.exception.ExceptionScope;
-import org.drools.process.core.validation.ProcessValidationError;
-import org.drools.process.core.validation.ProcessValidator;
-import org.drools.rule.builder.ProcessBuildContext;
-import org.drools.ruleflow.core.RuleFlowProcess;
-import org.drools.ruleflow.core.validation.RuleFlowProcessValidator;
-import org.drools.workflow.core.Constraint;
-import org.drools.workflow.core.impl.DroolsConsequenceAction;
-import org.drools.workflow.core.impl.WorkflowProcessImpl;
-import org.drools.workflow.core.node.ConstraintTrigger;
-import org.drools.workflow.core.node.MilestoneNode;
-import org.drools.workflow.core.node.Split;
-import org.drools.workflow.core.node.StartNode;
-import org.drools.workflow.core.node.Trigger;
-import org.drools.xml.XmlProcessReader;
-
-/**
- * A ProcessBuilder can be used to build processes based on XML files
- * containing a process definition.
- * 
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class ProcessBuilder {
-
-    private PackageBuilder packageBuilder;
-    private final List<DroolsError> errors = new ArrayList<DroolsError>();
-    private Map<String, ProcessValidator> processValidators = new HashMap<String, ProcessValidator>();;
-
-    public ProcessBuilder(PackageBuilder packageBuilder) {
-        this.packageBuilder = packageBuilder;
-        this.processValidators.put(RuleFlowProcess.RULEFLOW_TYPE, RuleFlowProcessValidator.getInstance());
-    }
-
-    public List<DroolsError> getErrors() {
-        return errors;
-    }
-
-    public void buildProcess(final Process process, String url) {
-        ((org.drools.process.core.Process) process).setURL( url );
-        boolean hasErrors = false;
-        ProcessValidator validator = processValidators.get(((Process)process).getType());
-        if (validator == null) {
-            System.out.println("Could not find validator for process " + ((Process)process).getType() + ".");
-            System.out.println("Continuing without validation of the process " + process.getName() + "[" + process.getId() + "]");
-        } else {
-            ProcessValidationError[] errors = validator.validateProcess( (WorkflowProcess) process );
-            if ( errors.length != 0 ) {
-                hasErrors = true;
-                for ( int i = 0; i < errors.length; i++ ) {
-                    this.errors.add( new ParserError( errors[i].toString(),
-                                                      -1,
-                                                      -1 ) );
-                }
-            }
-        }
-        if ( !hasErrors ) {
-            // generate and add rule for process
-            String rules = generateRules( process );
-            try {
-                packageBuilder.addPackageFromDrl( new StringReader( rules ) );
-            } catch ( IOException e ) {
-                // should never occur
-                e.printStackTrace( System.err );
-            } catch ( DroolsParserException e ) {
-                // should never occur
-                e.printStackTrace( System.err );
-            }
-            
-            ProcessDescr processDescr = new ProcessDescr();
-            processDescr.setName(process.getPackageName());
-            processDescr.setUrl( url );
-            PackageRegistry pkgRegistry = this.packageBuilder.getPackageRegistry( this.packageBuilder.getPackage().getName() );
-            DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();           
-            Dialect dialect = dialectRegistry.getDialect( "java" );
-            dialect.init(processDescr);
-
-            ProcessBuildContext buildContext = new ProcessBuildContext(
-        		this.packageBuilder,
-                this.packageBuilder.getPackage(),
-                process,
-                processDescr,
-                dialectRegistry,
-                dialect);
-
-            buildContexts( ( ContextContainer ) process, buildContext );
-            if (process instanceof WorkflowProcess) {
-            	buildNodes( (WorkflowProcess) process, buildContext );
-            }
-            this.packageBuilder.getPackage().addProcess( process );
-
-            pkgRegistry.compileAll();                
-            pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
-        }
-    }
-
-    public void buildContexts(ContextContainer contextContainer, ProcessBuildContext buildContext) {
-    	List<Context> exceptionScopes = contextContainer.getContexts(ExceptionScope.EXCEPTION_SCOPE);
-    	if (exceptionScopes != null) {
-    		for (Context context: exceptionScopes) {
-    			ExceptionScope exceptionScope = (ExceptionScope) context;
-    			for (ExceptionHandler exceptionHandler: exceptionScope.getExceptionHandlers().values()) {
-    				if (exceptionHandler instanceof ActionExceptionHandler) {
-    					DroolsConsequenceAction action = (DroolsConsequenceAction) 
-    						((ActionExceptionHandler) exceptionHandler).getAction();
-    					ActionDescr actionDescr = new ActionDescr();
-    			        actionDescr.setText( action.getConsequence() );   
-    			        Dialect dialect = buildContext.getDialectRegistry().getDialect( action.getDialect() );            
-    			        dialect.getActionBuilder().build( buildContext, action, actionDescr );
-    				}
-    			}
-    		}
-    	}
-    }
-    
-    @SuppressWarnings("unchecked")
-	public void buildNodes(WorkflowProcess process, ProcessBuildContext context) {
-    	ProcessNodeBuilderRegistry nodeBuilderRegistry = packageBuilder.getPackageBuilderConfiguration().getProcessNodeBuilderRegistry();
-        processNodes(process.getNodes(), process, context.getProcessDescr(), context, nodeBuilderRegistry);
-        if ( !context.getErrors().isEmpty() ) {
-            this.errors.addAll( context.getErrors() );
-        }
-        context.getDialectRegistry().addProcess( context );
-    }
-    
-    private void processNodes(
-            Node[] nodes, Process process, ProcessDescr processDescr, 
-            ProcessBuildContext context, ProcessNodeBuilderRegistry nodeBuilderRegistry) {
-        for ( Node node : nodes ) {
-            ProcessNodeBuilder builder = nodeBuilderRegistry.getNodeBuilder( node );
-            if ( builder != null ) {
-                // only build if there is a registered builder for this node type
-                builder.build( process,
-                               processDescr,
-                               context,
-                               node );
-            }
-            if (node instanceof NodeContainer) {
-                processNodes(((NodeContainer) node).getNodes(), process, processDescr, context, nodeBuilderRegistry);
-            }
-            if (node instanceof ContextContainer) {
-            	buildContexts((ContextContainer) node, context); 
-            }
-        }
-    }
-
-    public void addProcessFromFile(final Reader reader, final String url) throws Exception {
-        PackageBuilderConfiguration configuration = packageBuilder.getPackageBuilderConfiguration();
-        XmlProcessReader xmlReader = new XmlProcessReader( configuration.getSemanticModules() );
-        
-        final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
-        final ClassLoader newLoader = this.getClass().getClassLoader();
-        try {
-            Thread.currentThread().setContextClassLoader( newLoader );
-            Process process = xmlReader.read(reader);
-            buildProcess( process, url );
-        } finally {
-            Thread.currentThread().setContextClassLoader( oldLoader );
-        }
-        reader.close();
-    }
-
-    private String generateRules(final Process process) {
-        StringBuilder builder = new StringBuilder();
-
-        if ( process instanceof WorkflowProcessImpl ) {
-            WorkflowProcessImpl ruleFlow = (WorkflowProcessImpl) process;
-            builder.append( "package " + ruleFlow.getPackageName() + "\n" );
-            List<String> imports = ruleFlow.getImports();
-            if ( imports != null ) {
-                for ( String importString: imports ) {
-                    builder.append( "import " + importString + ";\n" );
-                }
-            }
-            List<String> functionImports = ruleFlow.getFunctionImports();
-            if ( functionImports != null ) {
-                for ( String importString: functionImports ) {
-                    builder.append( "import function " + importString + ";\n" );
-                }
-            }
-            Map<String, String> globals = ruleFlow.getGlobals();
-            if ( globals != null ) {
-                for ( Map.Entry<String, String> entry: globals.entrySet()) {
-                    builder.append( "global " + entry.getValue() + " " + entry.getKey() + ";\n" );
-                }
-            }
-
-            Node[] nodes = ruleFlow.getNodes();
-            for ( int i = 0; i < nodes.length; i++ ) {
-                if ( nodes[i] instanceof Split ) {
-                    Split split = (Split) nodes[i];
-                    if ( split.getType() == Split.TYPE_XOR || split.getType() == Split.TYPE_OR ) {
-                        for ( Connection connection: split.getDefaultOutgoingConnections() ) {
-                            Constraint constraint = split.getConstraint( connection );
-                            if ( "rule".equals( constraint.getType() ) ) {
-                                builder.append( createSplitRule( process,
-                                                                 connection,
-                                                                 split.getConstraint( connection ).getConstraint() ) );
-                            }
-                        }
-                    }
-                } else if ( nodes[i] instanceof MilestoneNode ) {
-                    MilestoneNode milestone = (MilestoneNode) nodes[i];
-                    builder.append( createMilestoneRule( process,
-                                                         milestone ) );
-                } else if ( nodes[i] instanceof StartNode ) {
-                	StartNode startNode = (StartNode) nodes[i];
-                	List<Trigger> triggers = startNode.getTriggers();
-                	if (triggers != null) {
-                		for (Trigger trigger: triggers) {
-                			if (trigger instanceof ConstraintTrigger) {
-                				builder.append( createStartConstraintRule( process,
-            						(ConstraintTrigger) trigger ));
-                			}
-                		}
-                	}
-                }
-            }
-        }
-        return builder.toString();
-    }
-
-    private String createSplitRule(Process process,
-                                   Connection connection,
-                                   String constraint) {
-        return "rule \"RuleFlow-Split-" + process.getId() + "-" + connection.getFrom().getId() + "-" + connection.getTo().getId() + "\" \n" + "      ruleflow-group \"DROOLS_SYSTEM\" \n" + "    when \n" + "      " + constraint + "\n" + "    then \n"
-               + "end \n\n";
-    }
-
-    private String createMilestoneRule(Process process,
-                                       MilestoneNode milestone) {
-        return "rule \"RuleFlow-Milestone-" + process.getId() + "-" + milestone.getId() + "\" \n" + "      ruleflow-group \"DROOLS_SYSTEM\" \n" + "    when \n" + "      " + milestone.getConstraint() + "\n" + "    then \n" + "end \n\n";
-    }
-    
-    private String createStartConstraintRule(Process process,
-    										 ConstraintTrigger trigger) {
-    	String result =
-    		"rule \"RuleFlow-Start-" + process.getId() + "\" \n" +
-    		"    when\n" +
-			"        " + trigger.getConstraint() + "\n" +
-			"    then\n";
-    	Map<String, String> inMappings = trigger.getInMappings();
-    	if (inMappings != null && !inMappings.isEmpty()) {
-    		result += "        java.util.Map params = new java.util.HashMap();\n";
-    		for (Map.Entry<String, String> entry: inMappings.entrySet()) {
-	    		result += "        params.put(\"" + entry.getKey() + "\", " + entry.getValue() + ");\n";
-	    	}
-	    	result += 
-				"        drools.getWorkingMemory().startProcess(\"" + process.getId() + "\", params);\n" +
-			   	"end\n\n";
-    	} else {
-    		result += 
-				"        drools.getWorkingMemory().startProcess(\"" + process.getId() + "\");\n" +
-			   	"end\n\n";
-    	}
-		return result;
-    }
-    
-}
+package org.drools.compiler;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.drools.definition.process.Connection;
+import org.drools.definition.process.Node;
+import org.drools.definition.process.NodeContainer;
+import org.drools.definition.process.Process;
+import org.drools.definition.process.WorkflowProcess;
+import org.drools.lang.descr.ActionDescr;
+import org.drools.lang.descr.ProcessDescr;
+import org.drools.process.builder.ProcessNodeBuilder;
+import org.drools.process.builder.ProcessNodeBuilderRegistry;
+import org.drools.process.core.Context;
+import org.drools.process.core.ContextContainer;
+import org.drools.process.core.context.exception.ActionExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionHandler;
+import org.drools.process.core.context.exception.ExceptionScope;
+import org.drools.process.core.validation.ProcessValidationError;
+import org.drools.process.core.validation.ProcessValidator;
+import org.drools.rule.builder.ProcessBuildContext;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.ruleflow.core.validation.RuleFlowProcessValidator;
+import org.drools.workflow.core.Constraint;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.impl.WorkflowProcessImpl;
+import org.drools.workflow.core.node.ConstraintTrigger;
+import org.drools.workflow.core.node.MilestoneNode;
+import org.drools.workflow.core.node.Split;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.Trigger;
+import org.drools.xml.XmlProcessReader;
+
+/**
+ * A ProcessBuilder can be used to build processes based on XML files
+ * containing a process definition.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class ProcessBuilder {
+
+    private PackageBuilder                packageBuilder;
+    private final List<DroolsError>       errors                         = new ArrayList<DroolsError>();
+    private Map<String, ProcessValidator> processValidators              = new HashMap<String, ProcessValidator>();
+    private static final String           XSL_FROM_4_TO_5                = "/org/drools/xml/processes/RuleFlowFrom4To5.xsl";
+    private static final String           PROCESS_ELEMENT_WITH_NAMESPACE = "<process xmlns=\"http://drools.org/drools-4.0/process\"\n" + "    xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+                                                                           + "    xs:schemaLocation=\"http://drools.org/drools-4.0/process drools-processes-4.0.xsd\"\n";
+
+    public ProcessBuilder(PackageBuilder packageBuilder) {
+        this.packageBuilder = packageBuilder;
+        this.processValidators.put( RuleFlowProcess.RULEFLOW_TYPE,
+                                    RuleFlowProcessValidator.getInstance() );
+    }
+
+    public List<DroolsError> getErrors() {
+        return errors;
+    }
+
+    public void buildProcess(final Process process, String url) {
+        ((org.drools.process.core.Process) process).setURL( url );
+        boolean hasErrors = false;
+        ProcessValidator validator = processValidators.get(((Process)process).getType());
+        if (validator == null) {
+            System.out.println("Could not find validator for process " + ((Process)process).getType() + ".");
+            System.out.println("Continuing without validation of the process " + process.getName() + "[" + process.getId() + "]");
+        } else {
+            ProcessValidationError[] errors = validator.validateProcess( (WorkflowProcess) process );
+            if ( errors.length != 0 ) {
+                hasErrors = true;
+                for ( int i = 0; i < errors.length; i++ ) {
+                    this.errors.add( new ParserError( errors[i].toString(),
+                                                      -1,
+                                                      -1 ) );
+                }
+            }
+        }
+        if ( !hasErrors ) {
+            // generate and add rule for process
+            String rules = generateRules( process );
+            try {
+                packageBuilder.addPackageFromDrl( new StringReader( rules ) );
+            } catch ( IOException e ) {
+                // should never occur
+                e.printStackTrace( System.err );
+            } catch ( DroolsParserException e ) {
+                // should never occur
+                e.printStackTrace( System.err );
+            }
+            
+            ProcessDescr processDescr = new ProcessDescr();
+            processDescr.setName(process.getPackageName());
+            processDescr.setUrl( url );
+            PackageRegistry pkgRegistry = this.packageBuilder.getPackageRegistry( this.packageBuilder.getPackage().getName() );
+            DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();           
+            Dialect dialect = dialectRegistry.getDialect( "java" );
+            dialect.init(processDescr);
+
+            ProcessBuildContext buildContext = new ProcessBuildContext(
+        		this.packageBuilder,
+                this.packageBuilder.getPackage(),
+                process,
+                processDescr,
+                dialectRegistry,
+                dialect);
+
+            buildContexts( ( ContextContainer ) process, buildContext );
+            if (process instanceof WorkflowProcess) {
+            	buildNodes( (WorkflowProcess) process, buildContext );
+            }
+            this.packageBuilder.getPackage().addProcess( process );
+
+            pkgRegistry.compileAll();                
+            pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
+        }
+    }
+
+    public void buildContexts(ContextContainer contextContainer, ProcessBuildContext buildContext) {
+    	List<Context> exceptionScopes = contextContainer.getContexts(ExceptionScope.EXCEPTION_SCOPE);
+    	if (exceptionScopes != null) {
+    		for (Context context: exceptionScopes) {
+    			ExceptionScope exceptionScope = (ExceptionScope) context;
+    			for (ExceptionHandler exceptionHandler: exceptionScope.getExceptionHandlers().values()) {
+    				if (exceptionHandler instanceof ActionExceptionHandler) {
+    					DroolsConsequenceAction action = (DroolsConsequenceAction) 
+    						((ActionExceptionHandler) exceptionHandler).getAction();
+    					ActionDescr actionDescr = new ActionDescr();
+    			        actionDescr.setText( action.getConsequence() );   
+    			        Dialect dialect = buildContext.getDialectRegistry().getDialect( action.getDialect() );            
+    			        dialect.getActionBuilder().build( buildContext, action, actionDescr );
+    				}
+    			}
+    		}
+    	}
+    }
+    
+    @SuppressWarnings("unchecked")
+	public void buildNodes(WorkflowProcess process, ProcessBuildContext context) {
+    	ProcessNodeBuilderRegistry nodeBuilderRegistry = packageBuilder.getPackageBuilderConfiguration().getProcessNodeBuilderRegistry();
+        processNodes(process.getNodes(), process, context.getProcessDescr(), context, nodeBuilderRegistry);
+        if ( !context.getErrors().isEmpty() ) {
+            this.errors.addAll( context.getErrors() );
+        }
+        context.getDialectRegistry().addProcess( context );
+    }
+    
+    private void processNodes(
+            Node[] nodes, Process process, ProcessDescr processDescr, 
+            ProcessBuildContext context, ProcessNodeBuilderRegistry nodeBuilderRegistry) {
+        for ( Node node : nodes ) {
+            ProcessNodeBuilder builder = nodeBuilderRegistry.getNodeBuilder( node );
+            if ( builder != null ) {
+                // only build if there is a registered builder for this node type
+                builder.build( process,
+                               processDescr,
+                               context,
+                               node );
+            }
+            if ( node instanceof NodeContainer ) {
+                processNodes( ((NodeContainer) node).getNodes(),
+                              process,
+                              processDescr,
+                              context,
+                              nodeBuilderRegistry );
+            }
+            if ( node instanceof ContextContainer ) {
+                buildContexts( (ContextContainer) node,
+                               context );
+            }
+        }
+    }
+
+    public void addProcessFromFile(final Reader reader, final String url) throws Exception {
+        PackageBuilderConfiguration configuration = packageBuilder.getPackageBuilderConfiguration();
+        XmlProcessReader xmlReader = new XmlProcessReader( configuration.getSemanticModules() );
+        
+        final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+        final ClassLoader newLoader = this.getClass().getClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader( newLoader );
+            String portRuleFlow = System.getProperty( "drools.ruleflow.port", "false" );
+            Reader portedReader = null;
+            if ( portRuleFlow.equalsIgnoreCase( "true" ) ) {
+                portedReader = portToCurrentVersion( reader );
+            } else {
+                portedReader = reader;
+            }
+            Process process = xmlReader.read(portedReader);
+            buildProcess( process, url );
+        } finally {
+            Thread.currentThread().setContextClassLoader( oldLoader );
+        }
+        reader.close();
+    }
+
+    private Reader portToCurrentVersion(final Reader reader) throws Exception {
+        String xml = convertReaderToString( reader );
+        if ( xml.indexOf( "<org.drools.ruleflow.core.impl.RuleFlowProcessImpl " ) >= 0 ) {
+            // Not a current version convert it.
+            String version5XML = XSLTransformation.transform( XSL_FROM_4_TO_5,
+                                                              xml,
+                                                              null );
+            // Add the namespace attribute to the process element as it is not added by the XSL transformation.
+            version5XML = version5XML.replaceAll( "<process ",
+                                                  PROCESS_ELEMENT_WITH_NAMESPACE );
+            return new StringReader( version5XML );
+        }
+        return reader;
+    }
+
+    private String convertReaderToString(Reader reader) throws IOException {
+        final StringBuffer text = new StringBuffer();
+
+        final char[] buf = new char[1024];
+        int len = 0;
+
+        while ( (len = reader.read( buf )) >= 0 ) {
+            text.append( buf,
+                         0,
+                         len );
+        }
+        return text.toString();
+    }
+
+    private String generateRules(final Process process) {
+        StringBuilder builder = new StringBuilder();
+
+        if ( process instanceof WorkflowProcessImpl ) {
+            WorkflowProcessImpl ruleFlow = (WorkflowProcessImpl) process;
+            builder.append( "package " + ruleFlow.getPackageName() + "\n" );
+            List<String> imports = ruleFlow.getImports();
+            if ( imports != null ) {
+                for ( String importString: imports ) {
+                    builder.append( "import " + importString + ";\n" );
+                }
+            }
+            List<String> functionImports = ruleFlow.getFunctionImports();
+            if ( functionImports != null ) {
+                for ( String importString: functionImports ) {
+                    builder.append( "import function " + importString + ";\n" );
+                }
+            }
+            Map<String, String> globals = ruleFlow.getGlobals();
+            if ( globals != null ) {
+                for ( Map.Entry<String, String> entry: globals.entrySet()) {
+                    builder.append( "global " + entry.getValue() + " " + entry.getKey() + ";\n" );
+                }
+            }
+
+            Node[] nodes = ruleFlow.getNodes();
+            for ( int i = 0; i < nodes.length; i++ ) {
+                if ( nodes[i] instanceof Split ) {
+                    Split split = (Split) nodes[i];
+                    if ( split.getType() == Split.TYPE_XOR || split.getType() == Split.TYPE_OR ) {
+                        for ( Connection connection : split.getDefaultOutgoingConnections() ) {
+                            Constraint constraint = split.getConstraint( connection );
+                            if ( "rule".equals( constraint.getType() ) ) {
+                                builder.append( createSplitRule( process,
+                                                                 connection,
+                                                                 split.getConstraint( connection ).getConstraint() ) );
+                            }
+                        }
+                    }
+                } else if ( nodes[i] instanceof MilestoneNode ) {
+                    MilestoneNode milestone = (MilestoneNode) nodes[i];
+                    builder.append( createMilestoneRule( process,
+                                                         milestone ) );
+                } else if ( nodes[i] instanceof StartNode ) {
+                    StartNode startNode = (StartNode) nodes[i];
+                    List<Trigger> triggers = startNode.getTriggers();
+                    if ( triggers != null ) {
+                        for ( Trigger trigger : triggers ) {
+                            if ( trigger instanceof ConstraintTrigger ) {
+                                builder.append( createStartConstraintRule( process,
+                                                                           (ConstraintTrigger) trigger ) );
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return builder.toString();
+    }
+
+    private String createSplitRule(Process process,
+                                   Connection connection,
+                                   String constraint) {
+        return "rule \"RuleFlow-Split-" + process.getId() + "-" + connection.getFrom().getId() + "-" + connection.getTo().getId() + "\" \n" + "      ruleflow-group \"DROOLS_SYSTEM\" \n" + "    when \n" + "      " + constraint + "\n" + "    then \n"
+               + "end \n\n";
+    }
+
+    private String createMilestoneRule(Process process,
+                                       MilestoneNode milestone) {
+        return "rule \"RuleFlow-Milestone-" + process.getId() + "-" + milestone.getId() + "\" \n" + "      ruleflow-group \"DROOLS_SYSTEM\" \n" + "    when \n" + "      " + milestone.getConstraint() + "\n" + "    then \n" + "end \n\n";
+    }
+
+    private String createStartConstraintRule(Process process,
+                                             ConstraintTrigger trigger) {
+        String result = "rule \"RuleFlow-Start-" + process.getId() + "\" \n" + "    when\n" + "        " + trigger.getConstraint() + "\n" + "    then\n";
+        Map<String, String> inMappings = trigger.getInMappings();
+        if ( inMappings != null && !inMappings.isEmpty() ) {
+            result += "        java.util.Map params = new java.util.HashMap();\n";
+            for ( Map.Entry<String, String> entry : inMappings.entrySet() ) {
+                result += "        params.put(\"" + entry.getKey() + "\", " + entry.getValue() + ");\n";
+            }
+            result += "        drools.getWorkingMemory().startProcess(\"" + process.getId() + "\", params);\n" + "end\n\n";
+        } else {
+            result += "        drools.getWorkingMemory().startProcess(\"" + process.getId() + "\");\n" + "end\n\n";
+        }
+        return result;
+    }
+
+    private static class XSLTransformation {
+        public static String transform(String stylesheet,
+                                       String srcXMLString,
+                                       HashMap<String, String> params) throws Exception {
+            StringWriter writer = new StringWriter();
+            StreamResult result = new StreamResult( writer );
+            Source src = new StreamSource( new StringReader( srcXMLString ) );
+            transform( stylesheet,
+                       src,
+                       result,
+                       params );
+            return writer.toString();
+        }
+
+        public static void transform(String stylesheet,
+                                     Source src,
+                                     Result res,
+                                     HashMap<String, String> params) throws Exception {
+
+            Transformer transformer = getTransformer( stylesheet );
+
+            transformer.clearParameters();
+
+            if ( params != null && params.size() > 0 ) {
+                Iterator<String> itKeys = params.keySet().iterator();
+
+                while ( itKeys.hasNext() ) {
+                    String key = itKeys.next();
+                    String value = params.get( key );
+                    transformer.setParameter( key,
+                                              value );
+                }
+            }
+
+            transformer.transform( src,
+                                   res );
+        }
+
+        private static Transformer getTransformer(String stylesheet) throws Exception {
+            Transformer transformer = null;
+            InputStream xslStream = null;
+
+            try {
+                InputStream in = XSLTransformation.class.getResourceAsStream( stylesheet );
+                xslStream = new BufferedInputStream( in );
+                StreamSource src = new StreamSource( xslStream );
+                src.setSystemId( stylesheet );
+                transformer = TransformerFactory.newInstance().newTransformer( src );
+            } finally {
+                if ( xslStream != null ) xslStream.close();
+            }
+
+            return transformer;
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/xml/processes/RuleFlowFrom4To5.xsl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/xml/processes/RuleFlowFrom4To5.xsl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/xml/processes/RuleFlowFrom4To5.xsl	2008-11-12 15:24:47 UTC (rev 23836)
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+	<xsl:output method="xml" indent="yes" />
+	<!-- How to get the first node so the the implementing class need not be mentioned here.-->
+	<xsl:variable name="type">RuleFlow</xsl:variable>
+	<xsl:variable name="name"><xsl:value-of select="./org.drools.ruleflow.core.impl.RuleFlowProcessImpl/name"/></xsl:variable>
+	<xsl:variable name="id"><xsl:value-of select="./org.drools.ruleflow.core.impl.RuleFlowProcessImpl/id"/></xsl:variable>
+	<xsl:variable name="packageName"><xsl:value-of select="./org.drools.ruleflow.core.impl.RuleFlowProcessImpl/packageName"/></xsl:variable>
+	<xsl:param name="generateTypes">false</xsl:param>
+	<xsl:param name="generateImports">false</xsl:param>
+	<xsl:param name="generateIncludes">false</xsl:param>
+	<xsl:param name="defaultIncludeFile">false</xsl:param>
+	<xsl:template match="/">
+		<!-- If we do not add the namespace then 5.0 Eclipse editor does not recognize the process 
+		node if there are more than 2 sub processes defined in the ruleflow! 
+		If we put the namespace then it gets reflected in child elements like ruleSet, join etc.-->
+		<xsl:element name="process">
+			<xsl:attribute name="type"><xsl:value-of select="$type"/></xsl:attribute>
+			<xsl:attribute name="name"><xsl:value-of select="$name"/></xsl:attribute>
+			<xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+			<xsl:attribute name="package-name"><xsl:value-of select="$packageName"/></xsl:attribute>
+			<!-- TODO Could not add other namespace related attributes on the element node especially for schema location. -->
+			<xsl:element name="nodes">
+				<xsl:call-template name="processNodes"/>
+			</xsl:element>
+			<xsl:element name="connections">
+				<xsl:call-template name="formConnections" />
+			</xsl:element>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="processNodes">
+		<xsl:for-each select="//nodes/entry[1]/child::node()">
+			<xsl:choose>
+				<xsl:when test="(starts-with(name(.), 'org.drools.ruleflow'))">
+					<xsl:call-template name="printNodes"><xsl:with-param name="className"><xsl:value-of select = "name(.)"/></xsl:with-param></xsl:call-template>
+				</xsl:when>
+			</xsl:choose>
+			
+		</xsl:for-each>
+		<!-- Only those from or to nodes that have id. When there is reference it means that the node was already declared as id earlier or would come later.-->
+		<xsl:for-each select="//from[@id != '']|//to[@id != '']">
+			<xsl:call-template name="printNodes"><xsl:with-param name="className"><xsl:value-of select = "@class"/></xsl:with-param></xsl:call-template>
+		</xsl:for-each>
+	</xsl:template>
+
+	<xsl:template name="printNodes">
+		<xsl:param name="className"/>
+		<xsl:choose>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.RuleSetNodeImpl'">
+				<xsl:call-template name="RenderRuleSetNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.ActionNodeImpl'">
+				<xsl:call-template name="RenderActionNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.SplitImpl'">
+				<xsl:call-template name="RenderSplitNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.JoinImpl'">
+				<xsl:call-template name="RenderJoinNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.SubFlowNodeImpl'">
+				<xsl:call-template name="RenderSubflowNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.StartNodeImpl'">
+				<xsl:call-template name="RenderStartNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.EndNodeImpl'">
+				<xsl:call-template name="RenderEndNode"/>
+			</xsl:when>
+			<xsl:when test="$className = 'org.drools.ruleflow.core.impl.MilestoneNodeImpl'">
+				<xsl:call-template name="RenderMilestoneNode"/>
+			</xsl:when>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="RenderSplitNode">
+		<xsl:element name="split">
+			<xsl:attribute name="type"><xsl:value-of select = "./type"/></xsl:attribute>
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+			<!-- Add constraints element if XOR or OR type of Split Node i.e. it is not AND node-->
+			<xsl:choose>
+				<xsl:when test="./type != '1'">
+					<xsl:element name="constraints">
+						<xsl:for-each select="constraints/entry/org.drools.ruleflow.core.impl.ConstraintImpl">
+							<xsl:call-template name="RenderConstraintNode"></xsl:call-template>
+						</xsl:for-each>
+					</xsl:element>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="RenderConstraintNode">
+		<xsl:element name="constraint">
+			<xsl:attribute name="toNodeId">
+				<xsl:choose>
+					<xsl:when test="../org.drools.ruleflow.core.impl.ConnectionImpl[@id != '']">
+						<xsl:for-each select = "../org.drools.ruleflow.core.impl.ConnectionImpl/to">
+							<xsl:call-template name="printReferenceOrId"/>
+						</xsl:for-each>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:variable name="constraintReference"><xsl:value-of select="../org.drools.ruleflow.core.impl.ConnectionImpl/@reference"/></xsl:variable>
+						<xsl:for-each select = "//org.drools.ruleflow.core.impl.ConnectionImpl[@id = $constraintReference]/to">
+							<xsl:call-template name="printReferenceOrId"/>
+						</xsl:for-each>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:attribute>
+			<xsl:attribute name="toType"><xsl:value-of select = "'DROOLS_DEFAULT'"/></xsl:attribute>
+			<xsl:attribute name="priority"><xsl:value-of select = "./priority"/></xsl:attribute>
+			<xsl:attribute name="type"><xsl:value-of select = "'rule'"/></xsl:attribute>
+			<xsl:attribute name="dialect"><xsl:value-of select = "'mvel'"/></xsl:attribute>
+			<xsl:attribute name="name"><xsl:value-of select = "./name"/></xsl:attribute>
+			<xsl:value-of select = "./constraint"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="RenderSubflowNode">
+		<xsl:element name="subProcess">
+			<xsl:attribute name="processId"><xsl:value-of select = "./processId"/></xsl:attribute>
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="RenderJoinNode">
+		<xsl:element name="join">
+			<xsl:attribute name="type"><xsl:value-of select = "./type"/></xsl:attribute>
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="RenderRuleSetNode">
+		<xsl:element name="ruleSet">
+			<xsl:attribute name="ruleFlowGroup"><xsl:value-of select = "./ruleFlowGroup"/></xsl:attribute>
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="RenderActionNode">
+		<xsl:element name="actionNode">
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+			<xsl:element name="action">
+			<!-- Hard coding type as expression and dialect as mvel. Not sure how this can be understood in the 4.0 format.
++-->
+				<xsl:attribute name="type"><xsl:value-of select = "'expression'"/></xsl:attribute>
+				<xsl:attribute name="dialect"><xsl:value-of select = "'mvel'"/></xsl:attribute>
+				<xsl:value-of select = "./action/consequence"/>
+			</xsl:element>
+		</xsl:element>
+	</xsl:template>
+	
+	<xsl:template name="RenderStartNode">
+		<xsl:element name="start">
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+		</xsl:element>
+	</xsl:template>
+	
+	<xsl:template name="RenderEndNode">
+		<xsl:element name="end">
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="RenderMilestoneNode">
+		<xsl:element name="milestone">
+			<xsl:call-template name="renderIdAndNameAttribute"/>
+			<xsl:element name="constraint">
+				<!-- Hard coded the type and dialect as in 4.0 it was assumed to be mvel. -->
+				<xsl:attribute name="type"><xsl:value-of select="'rule'"/></xsl:attribute>
+				<xsl:attribute name="dialect"><xsl:value-of select="'mvel'"/></xsl:attribute>
+				<xsl:value-of select="./constraint"/>
+			</xsl:element>
+		</xsl:element>
+	</xsl:template>
+
+	<xsl:template name="renderIdAndNameAttribute">
+		<xsl:attribute name="id"><xsl:value-of select = "./@id"/></xsl:attribute>
+		<xsl:attribute name="name"><xsl:value-of select = "./name"/></xsl:attribute>
+	</xsl:template>
+	
+	<xsl:template name="formConnections">
+		<xsl:for-each select="//from">
+			<xsl:element name="connection">
+				<xsl:attribute name="from"><xsl:apply-templates select="current()"/></xsl:attribute>
+				<xsl:attribute name="to"><xsl:apply-templates select="../to"/></xsl:attribute>
+			</xsl:element>
+		</xsl:for-each>
+	</xsl:template>
+	<xsl:template match="to">
+		<xsl:call-template name="printReferenceOrId"/>
+	</xsl:template>
+	<xsl:template match="from">
+		<xsl:call-template name="printReferenceOrId"/>
+	</xsl:template>
+	<xsl:template name="printReferenceOrId">
+		<xsl:for-each select="@*">
+			<xsl:choose>
+				<xsl:when test="(name() = 'reference') or (name() = 'id')">
+					<xsl:value-of select="."/>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+</xsl:stylesheet>
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2008-11-12 11:08:25 UTC (rev 23835)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2008-11-12 15:24:47 UTC (rev 23836)
@@ -1,1625 +1,1670 @@
-package org.drools.compiler;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.lang.reflect.Field;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.drools.Cheese;
-import org.drools.DroolsTestCase;
-import org.drools.FactHandle;
-import org.drools.Primitives;
-import org.drools.QueryResults;
-import org.drools.RuleBase;
-import org.drools.RuleBaseFactory;
-import org.drools.StatefulSession;
-import org.drools.StockTick;
-import org.drools.WorkingMemory;
-import org.drools.base.ClassObjectType;
-import org.drools.base.DefaultKnowledgeHelper;
-import org.drools.common.ActivationGroupNode;
-import org.drools.common.InternalFactHandle;
-import org.drools.common.LogicalDependency;
-import org.drools.common.RuleFlowGroupNode;
-import org.drools.commons.jci.compilers.EclipseJavaCompiler;
-import org.drools.commons.jci.compilers.JaninoJavaCompiler;
-import org.drools.commons.jci.compilers.JavaCompiler;
-import org.drools.facttemplates.Fact;
-import org.drools.integrationtests.SerializationHelper;
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.BaseDescr;
-import org.drools.lang.descr.ConditionalElementDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.FactTemplateDescr;
-import org.drools.lang.descr.FieldBindingDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.FieldTemplateDescr;
-import org.drools.lang.descr.GlobalDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.QueryDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.drools.lang.descr.SlidingWindowDescr;
-import org.drools.lang.descr.TypeDeclarationDescr;
-import org.drools.lang.descr.TypeFieldDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-import org.drools.process.core.Context;
-import org.drools.process.core.Process;
-import org.drools.reteoo.ReteooRuleBase;
-import org.drools.rule.Behavior;
-import org.drools.rule.CompositeClassLoader;
-import org.drools.rule.Declaration;
-import org.drools.rule.EvalCondition;
-import org.drools.rule.GroupElement;
-import org.drools.rule.JavaDialectRuntimeData;
-import org.drools.rule.LiteralConstraint;
-import org.drools.rule.Package;
-import org.drools.rule.Pattern;
-import org.drools.rule.PredicateConstraint;
-import org.drools.rule.ReturnValueConstraint;
-import org.drools.rule.Rule;
-import org.drools.rule.SlidingTimeWindow;
-import org.drools.rule.TypeDeclaration;
-import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
-import org.drools.spi.Activation;
-import org.drools.spi.AgendaGroup;
-import org.drools.spi.CompiledInvoker;
-import org.drools.spi.PropagationContext;
-import org.drools.spi.Tuple;
-import org.drools.util.DroolsStreamUtils;
-import org.drools.util.LinkedList;
-import org.drools.workflow.core.impl.WorkflowProcessImpl;
-
-public class PackageBuilderTest extends DroolsTestCase {
-
-    public void testErrors() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
-                                                                     "x" );
-        pattern.addConstraint( fieldBindingDescr );
-        fieldBindingDescr = new FieldBindingDescr( "price",
-                                                   "y" );
-        pattern.addConstraint( fieldBindingDescr );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
-        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
-                                                                     "x" ) );
-
-        pattern.addConstraint( returnValue );
-
-        // There is no m this should produce errors.
-        ruleDescr.setConsequence( "update(m);" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 1,
-                      builder.getErrors().getErrors() );
-    }
-
-    public void testErrorsInParser() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( this.getClass().getResourceAsStream( "bad_rule.drl" ) ) );
-        assertTrue( builder.hasErrors() );
-    }
-
-    public void testReload() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        ruleDescr.setConsequence( "map.put(\"value\", new Integer(1) );" );
-
-        builder.addPackage( packageDescr );
-
-        Package pkg = builder.getPackage();
-        Rule rule = pkg.getRule( "rule-1" );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
-        ruleBase.getGlobals().put( "map",
-                                   Map.class );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final HashMap map = new HashMap();
-        workingMemory.setGlobal( "map",
-                                 map );
-
-        final Tuple tuple = new MockTuple( new HashMap() );
-        final Activation activation = new MockActivation( rule,
-                                                          0,
-                                                          rule.getLhs(),
-                                                          tuple );
-
-        DefaultKnowledgeHelper knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( workingMemory );
-        knowledgeHelper.setActivation( activation );
-
-        rule.getConsequence().evaluate( knowledgeHelper,
-                                        workingMemory );
-        assertEquals( new Integer( 1 ),
-                      map.get( "value" ) );
-
-        ruleDescr.setConsequence( "map.put(\"value\", new Integer(2) );" );
-        pkg.removeRule( rule );
-
-        // Make sure the compiled classes are also removed
-        assertEquals( 0,
-                      ((JavaDialectRuntimeData) pkg.getDialectRuntimeRegistry().getDialectData( "java" )).list().length );
-
-        builder.addPackage( packageDescr );
-
-        pkg = builder.getPackage();
-
-        rule = pkg.getRule( "rule-1" );
-
-        knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( workingMemory );
-        knowledgeHelper.setActivation( activation );
-
-        rule.getConsequence().evaluate( knowledgeHelper,
-                                        workingMemory );
-        assertEquals( new Integer( 2 ),
-                      map.get( "value" ) );
-
-    }
-
-    public void testSerializable() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        ruleDescr.setConsequence( "map.put(\"value\", new Integer(1) );" );
-        //check that packageDescr is serializable
-        final PackageDescr back = (PackageDescr) SerializationHelper.serializeObject( packageDescr );
-        assertNotNull( back );
-        assertEquals( "p1",
-                      back.getName() );
-
-        builder.addPackage( packageDescr );
-        final Package pkg = builder.getPackage();
-        final Rule rule = pkg.getRule( "rule-1" );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        final Package newPkg = SerializationHelper.serializeObject( pkg );
-        final Rule newRule = newPkg.getRule( "rule-1" );
-
-        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
-
-        // It's been serialised so we have to simulate the re-wiring process
-        newPkg.getDialectRuntimeRegistry().onAdd( ruleBase.getRootClassLoader() );
-        newPkg.getDialectRuntimeRegistry().onBeforeExecute();
-        
-        ruleBase.getGlobals().put( "map",
-                                   Map.class );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final HashMap map = new HashMap();
-
-        workingMemory.setGlobal( "map",
-                                 map );
-
-        final Tuple tuple = new MockTuple( new HashMap() );
-        final Activation activation = new MockActivation( newRule,
-                                                          0,
-                                                          newRule.getLhs(),
-                                                          tuple );
-
-        final DefaultKnowledgeHelper knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( workingMemory );
-        knowledgeHelper.setActivation( activation );
-
-        newRule.getConsequence().evaluate( knowledgeHelper,
-                                           workingMemory );
-        assertEquals( new Integer( 1 ),
-                      map.get( "value" ) );
-    }
-
-    public void FIXMEtestNoPackageName() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        try {
-            builder.addPackage( new PackageDescr( null ) );
-            fail( "should have errored here." );
-        } catch ( final RuntimeException e ) {
-            assertNotNull( e.getMessage() );
-        }
-        try {
-            builder.addPackage( new PackageDescr( "" ) );
-            fail( "should have errored here." );
-        } catch ( final RuntimeException e ) {
-            assertNotNull( e.getMessage() );
-        }
-
-        builder.addPackageFromDrl( new StringReader( "package foo" ) );
-        builder.addPackageFromDrl( new StringReader( "rule x then end" ) );
-
-    }
-
-    public void testErrorReset() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        builder.addPackageFromDrl( new StringReader( "package foo \n rule ORB" ) );
-        assertTrue( builder.hasErrors() );
-
-        builder.resetErrors();
-        assertFalse( builder.hasErrors() );
-
-        builder.addPackageFromDrl( new StringReader( "package foo \n rule ORB" ) );
-        assertTrue( builder.hasErrors() );
-    }
-
-    public void testFactTemplate() {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final FactTemplateDescr cheese = new FactTemplateDescr( "Cheese" );
-        cheese.addFieldTemplate( new FieldTemplateDescr( "name",
-                                                         "String" ) );
-        cheese.addFieldTemplate( new FieldTemplateDescr( "price",
-                                                         "Integer" ) );
-
-        packageDescr.addFactTemplate( cheese );
-
-        final PatternDescr pattern = new PatternDescr( "Cheese",
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "name" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "stilton" ) );
-
-        pattern.addConstraint( literalDescr );
-
-        ruleDescr.setConsequence( "String result = stilton.getFieldValue( \"name\" ) + \" \" + stilton.getFieldValue( \"price\" );" );
-
-        builder.addPackage( packageDescr );
-
-        //        assertFalse( Arrays.toString( builder.getErrors() ),
-        //                     builder.hasErrors() );
-
-        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        final Package pkg = builder.getPackage();
-        try {
-            ruleBase.addPackage( pkg );
-        } catch ( final Exception e ) {
-            e.printStackTrace();
-        }
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        final Fact stilton = pkg.getFactTemplate( "Cheese" ).createFact( 1 );
-        stilton.setFieldValue( "name",
-                               "stilton" );
-        stilton.setFieldValue( "price",
-                               new Integer( 200 ) );
-        workingMemory.insert( stilton );
-        workingMemory.fireAllRules();
-
-    }
-
-    public void testLiteral() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "stilton" ) );
-
-        pattern.addConstraint( literalDescr );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-    }
-
-    public void testReturnValue() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
-                                                                     "x" );
-        pattern.addConstraint( fieldBindingDescr );
-        fieldBindingDescr = new FieldBindingDescr( "price",
-                                                   "y" );
-        pattern.addConstraint( fieldBindingDescr );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
-        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
-                                                                     "(( (Integer) map.get( new Integer( x )) ).intValue() * y)" ) );
-
-        pattern.addConstraint( returnValue );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-
-        builder.addPackage( packageDescr );
-
-        assertEquals( "Should not have any errors",
-                      0,
-                      builder.getErrors().getErrors().length );
-    }
-
-    public void testReturnValueMethodCompare() {
-        final PackageBuilder builder1 = new PackageBuilder();
-        final PackageDescr packageDescr1 = new PackageDescr( "package1" );
-        createReturnValueRule( packageDescr1,
-                               " x + y " );
-        builder1.addPackage( packageDescr1 );
-        final Pattern pattern1 = (Pattern) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-        final ReturnValueConstraint returnValue1 = (ReturnValueConstraint) pattern1.getConstraints().get( 2 );
-
-        final PackageBuilder builder2 = new PackageBuilder();
-        final PackageDescr packageDescr2 = new PackageDescr( "package2" );
-        createReturnValueRule( packageDescr2,
-                               " x + y " );
-        builder2.addPackage( packageDescr2 );
-        final Pattern pattern2 = (Pattern) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-        final ReturnValueConstraint returnValue2 = (ReturnValueConstraint) pattern2.getConstraints().get( 2 );
-
-        final PackageBuilder builder3 = new PackageBuilder();
-        final PackageDescr packageDescr3 = new PackageDescr( "package3" );
-        createReturnValueRule( packageDescr3,
-                               " x - y " );
-        builder3.addPackage( packageDescr3 );
-        final Pattern pattern3 = (Pattern) builder3.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-        final ReturnValueConstraint returnValue3 = (ReturnValueConstraint) pattern3.getConstraints().get( 2 );
-
-        assertEquals( returnValue1,
-                      returnValue2 );
-        assertFalse( returnValue1.equals( returnValue3 ) );
-        assertFalse( returnValue2.equals( returnValue3 ) );
-    }
-
-    public void testPredicate() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
-                                                                           "x" );
-        pattern.addConstraint( fieldBindingDescr );
-
-        final FieldBindingDescr fieldBindingDescr2 = new FieldBindingDescr( "price",
-                                                                            "y" );
-        pattern.addConstraint( fieldBindingDescr2 );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final PredicateDescr predicate = new PredicateDescr( "( ( Integer )map.get( new Integer(x) ) ).intValue() == y" );
-        pattern.addConstraint( predicate );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-    }
-
-    public void testPredicateMethodCompare() {
-        final PackageBuilder builder1 = new PackageBuilder();
-        final PackageDescr packageDescr1 = new PackageDescr( "package1" );
-        createPredicateRule( packageDescr1,
-                             "x==y" );
-        builder1.addPackage( packageDescr1 );
-        final Pattern pattern1 = (Pattern) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-        final PredicateConstraint predicate1 = (PredicateConstraint) pattern1.getConstraints().get( 2 );
-
-        final PackageBuilder builder2 = new PackageBuilder();
-        final PackageDescr packageDescr2 = new PackageDescr( "package2" );
-        createPredicateRule( packageDescr2,
-                             "x==y" );
-        builder2.addPackage( packageDescr2 );
-        final Pattern pattern2 = (Pattern) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-        final PredicateConstraint predicate2 = (PredicateConstraint) pattern2.getConstraints().get( 2 );
-
-        final PackageBuilder builder3 = new PackageBuilder();
-        final PackageDescr packageDescr3 = new PackageDescr( "package3" );
-        createPredicateRule( packageDescr3,
-                             "x!=y" );
-        builder3.addPackage( packageDescr3 );
-        final Pattern pattern3 = (Pattern) builder3.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-        final PredicateConstraint predicate3 = (PredicateConstraint) pattern3.getConstraints().get( 2 );
-
-        assertEquals( predicate1,
-                      predicate2 );
-        assertFalse( predicate1.equals( predicate3 ) );
-        assertFalse( predicate2.equals( predicate3 ) );
-    }
-
-    public void testEval() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
-                                                                     "x" );
-        pattern.addConstraint( fieldBindingDescr );
-        fieldBindingDescr = new FieldBindingDescr( "price",
-                                                   "y" );
-        pattern.addConstraint( fieldBindingDescr );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final EvalDescr evalDescr = new EvalDescr( "( ( Integer )map.get( new Integer(x) ) ).intValue() == y" );
-        lhs.addDescr( evalDescr );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        final Package pkg = builder.getPackage();
-        final Rule rule = pkg.getRule( "rule-1" );
-        final EvalCondition eval = (EvalCondition) rule.getLhs().getChildren().get( 1 );
-        final CompiledInvoker invoker = (CompiledInvoker) eval.getEvalExpression();
-        final List list = invoker.getMethodBytecode();
-    }
-
-    public void testEvalMethodCompare() {
-        final PackageBuilder builder1 = new PackageBuilder();
-        final PackageDescr packageDescr1 = new PackageDescr( "package1" );
-        createEvalRule( packageDescr1,
-                        "1==1" );
-        builder1.addPackage( packageDescr1 );
-        final EvalCondition eval1 = (EvalCondition) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-
-        final PackageBuilder builder2 = new PackageBuilder();
-        final PackageDescr packageDescr2 = new PackageDescr( "package2" );
-        createEvalRule( packageDescr2,
-                        "1==1" );
-        builder2.addPackage( packageDescr2 );
-        final EvalCondition eval2 = (EvalCondition) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-
-        final PackageBuilder builder3 = new PackageBuilder();
-        final PackageDescr packageDescr3 = new PackageDescr( "package3" );
-        createEvalRule( packageDescr3,
-                        "1==3" );
-        builder3.addPackage( packageDescr3 );
-        final EvalCondition eval3 = (EvalCondition) builder3.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
-
-        assertEquals( eval1,
-                      eval2 );
-        assertFalse( eval1.equals( eval3 ) );
-        assertFalse( eval2.equals( eval3 ) );
-    }
-
-    public void testOr() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        final Rule rule = createRule( new OrDescr(),
-                                      builder,
-                                      "update(stilton);" );
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        final GroupElement lhs = rule.getLhs();
-        assertLength( 1,
-                      lhs.getChildren() );
-
-        final GroupElement or = (GroupElement) lhs.getChildren().get( 0 );
-        assertLength( 1,
-                      or.getChildren() );
-        final Pattern pattern = (Pattern) or.getChildren().get( 0 );
-
-        final LiteralConstraint literalConstarint = (LiteralConstraint) pattern.getConstraints().get( 0 );
-    }
-
-    public void testAnd() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        final Rule rule = createRule( new AndDescr(),
-                                      builder,
-                                      "update(stilton);" );
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        final GroupElement lhs = rule.getLhs();
-        assertLength( 1,
-                      lhs.getChildren() );
-
-        final GroupElement and = (GroupElement) lhs.getChildren().get( 0 );
-        assertLength( 1,
-                      and.getChildren() );
-        final Pattern pattern = (Pattern) and.getChildren().get( 0 );
-
-        final LiteralConstraint literalConstraint = (LiteralConstraint) pattern.getConstraints().get( 0 );
-    }
-
-    public void testNot() throws Exception {
-        PackageBuilder builder = new PackageBuilder();
-
-        // Make sure we can't accessa  variable bound inside the not node
-        Rule rule = createRule( new NotDescr(),
-                                builder,
-                                "update(stilton);" );
-        assertEquals( 1,
-                      builder.getErrors().getErrors().length );
-
-        builder = new PackageBuilder();
-        rule = createRule( new NotDescr(),
-                           builder,
-                           "" );
-        assertEquals( 0,
-                      builder.getErrors().getErrors().length );
-
-        final GroupElement lhs = rule.getLhs();
-        assertLength( 1,
-                      lhs.getChildren() );
-
-        final GroupElement not = (GroupElement) lhs.getChildren().get( 0 );
-        assertLength( 1,
-                      not.getChildren() );
-        final Pattern pattern = (Pattern) not.getChildren().get( 0 );
-
-        final LiteralConstraint literalConstarint = (LiteralConstraint) pattern.getConstraints().get( 0 );
-    }
-
-    public void testExists() throws Exception {
-        PackageBuilder builder = new PackageBuilder();
-
-        // Make sure we can't accessa  variable bound inside the not node
-        Rule rule = createRule( new ExistsDescr(),
-                                builder,
-                                "update(stilton);" );
-        assertEquals( 1,
-                      builder.getErrors().getErrors().length );
-
-        builder = new PackageBuilder();
-        rule = createRule( new ExistsDescr(),
-                           builder,
-                           "" );
-        assertEquals( 0,
-                      builder.getErrors().getErrors().length );
-
-        final GroupElement lhs = rule.getLhs();
-        assertLength( 1,
-                      lhs.getChildren() );
-
-        final GroupElement exists = (GroupElement) lhs.getChildren().get( 0 );
-        assertLength( 1,
-                      exists.getChildren() );
-        final Pattern pattern = (Pattern) exists.getChildren().get( 0 );
-
-        final LiteralConstraint literalConstarint = (LiteralConstraint) pattern.getConstraints().get( 0 );
-    }
-
-    public void testNumbers() throws Exception {
-        // test boolean
-        FieldConstraintDescr literalDescr = new FieldConstraintDescr( "booleanPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "true" ) );
-        createLiteralRule( literalDescr );
-
-        // test boolean
-        literalDescr = new FieldConstraintDescr( "booleanPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "false" ) );
-        createLiteralRule( literalDescr );
-
-        // test char
-        literalDescr = new FieldConstraintDescr( "charPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "a" ) );
-        createLiteralRule( literalDescr );
-
-        // test byte
-        literalDescr = new FieldConstraintDescr( "bytePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "1" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "bytePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "bytePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "-1" ) );
-        createLiteralRule( literalDescr );
-
-        // test short
-        literalDescr = new FieldConstraintDescr( "shortPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "1" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "shortPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "shortPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "-1" ) );
-        createLiteralRule( literalDescr );
-
-        // test int
-        literalDescr = new FieldConstraintDescr( "intPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "1" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "intPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "intPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "-1" ) );
-        createLiteralRule( literalDescr );
-
-        // test long
-        literalDescr = new FieldConstraintDescr( "longPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "1" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "longPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "longPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        // test float
-        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "1.1" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "-1.1" ) );
-        createLiteralRule( literalDescr );
-
-        // test double
-        literalDescr = new FieldConstraintDescr( "doublePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "1.1" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "doublePrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "0" ) );
-        createLiteralRule( literalDescr );
-
-        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "-1.1" ) );
-        createLiteralRule( literalDescr );
-    }
-
-    public void testNull() {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(),
-                                                            "stilton" );
-
-        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  null ) );
-
-        patternDescr.addConstraint( literalDescr );
-
-        ruleDescr.setConsequence( "" );
-
-        builder.addPackage( packageDescr );
-
-        final Package pkg = (Package) builder.getPackage();
-        final Rule rule = pkg.getRule( "rule-1" );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-    }
-
-    public void testQuery() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final QueryDescr queryDescr = new QueryDescr( "query1" );
-        queryDescr.setParameters( new String[]{"$type"} );
-        queryDescr.setParameterTypes( new String[]{"String"} );
-
-        packageDescr.addRule( queryDescr );
-
-        final AndDescr lhs = new AndDescr();
-        queryDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new VariableRestrictionDescr( "==",
-                                                                   "$type" ) );
-
-        pattern.addConstraint( literalDescr );
-
-        queryDescr.setConsequence( "update(stilton);" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-
-        StatefulSession session = ruleBase.newStatefulSession();
-
-        session.insert( new Cheese( "stilton",
-                                    15 ) );
-
-        QueryResults results = session.getQueryResults( "query1",
-                                                        new Object[]{"stilton"} );
-        assertEquals( 1,
-                      results.size() );
-        Object object = results.get( 0 ).get( 0 );
-        assertEquals( new Cheese( "stilton",
-                                  15 ),
-                      object );
-
-        results = session.getQueryResults( "query1",
-                                           new Object[]{"cheddar"} );
-    }
-
-    public void testDuplicateRuleNames() throws Exception {
-
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-
-        RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-        AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-        PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(),
-                                                      "stilton" );
-        FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  null ) );
-        patternDescr.addConstraint( literalDescr );
-        ruleDescr.setConsequence( "" );
-
-        ruleDescr = new RuleDescr( "rule-1" );
-        ruleDescr.setLocation( 42,
-                               43 );
-        packageDescr.addRule( ruleDescr );
-        lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-        patternDescr = new PatternDescr( Cheese.class.getName(),
-                                         "stilton" );
-        literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "!=",
-                                                                  null ) );
-        patternDescr.addConstraint( literalDescr );
-        ruleDescr.setConsequence( "" );
-
-        ruleDescr = new RuleDescr( "rule-2" );
-        ruleDescr.setLocation( 42,
-                               43 );
-        packageDescr.addRule( ruleDescr );
-        lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-        patternDescr = new PatternDescr( Cheese.class.getName(),
-                                         "stilton" );
-
-        literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "!=",
-                                                                  null ) );
-
-        patternDescr.addConstraint( literalDescr );
-        ruleDescr.setConsequence( "" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 1,
-                      builder.getErrors().getErrors() );
-        final ParserError err = (ParserError) builder.getErrors().getErrors()[0];
-        assertEquals( 42,
-                      err.getRow() );
-        assertEquals( 43,
-                      err.getCol() );
-
-    }
-
-    public void testDuplicateDeclaration() {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern1 = new PatternDescr( Cheese.class.getName() );
-        lhs.addDescr( pattern1 );
-
-        final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "type",
-                                                                           "$type" );
-
-        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "stilton" ) );
-
-        pattern1.addConstraint( fieldBindingDescr );
-        pattern1.addConstraint( literalDescr );
-
-        final PatternDescr pattern2 = new PatternDescr( Cheese.class.getName() );
-        lhs.addDescr( pattern2 );
-        pattern2.addConstraint( fieldBindingDescr );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 2,
-                      builder.getErrors().getErrors() );
-    }
-
-    public void testCompilerConfiguration() throws Exception {
-        // test default is eclipse jdt core
-        PackageBuilder builder = new PackageBuilder();
-        PackageDescr pkgDescr = new PackageDescr( "org.test" );
-        builder.addPackage( pkgDescr );
-        DialectCompiletimeRegistry reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
-
-
-        final Field dialectField = builder.getClass().getDeclaredField( "defaultDialect" );
-        dialectField.setAccessible( true );
-        String dialectName = (String) dialectField.get( builder );
-
-        reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
-        Dialect dialect = reg.getDialect( dialectName );
-
-        final Field compilerField = dialect.getClass().getDeclaredField( "compiler" );
-        compilerField.setAccessible( true );
-        JavaCompiler compiler = (JavaCompiler) compilerField.get( dialect );
-        assertSame( EclipseJavaCompiler.class,
-                    compiler.getClass() );
-
-        // test JANINO with property settings
-        PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
-        JavaDialectConfiguration javaConf = (JavaDialectConfiguration) conf.getDialectConfiguration( "java" );
-        javaConf.setCompiler( JavaDialectConfiguration.JANINO );
-        builder = new PackageBuilder( conf );
-        builder.addPackage( pkgDescr );
-
-        dialectName = (String) dialectField.get( builder );
-        reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
-        dialect = reg.getDialect( dialectName );
-        compiler = (JavaCompiler) compilerField.get( dialect );
-        assertSame( JaninoJavaCompiler.class,
-                    compiler.getClass() );
-
-        // test eclipse jdt core with property settings and default source level
-        conf = new PackageBuilderConfiguration();
-        javaConf = (JavaDialectConfiguration) conf.getDialectConfiguration( "java" );
-        javaConf.setCompiler( JavaDialectConfiguration.ECLIPSE );
-        builder = new PackageBuilder( conf );
-        builder.addPackage( pkgDescr );
-
-        dialectName = (String) dialectField.get( builder );
-        reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
-        dialect = reg.getDialect( dialectName );
-        compiler = (JavaCompiler) compilerField.get( dialect );
-        assertSame( EclipseJavaCompiler.class,
-                    compiler.getClass() );
-    }
-
-    public void testTypeDeclaration() throws Exception {
-        PackageDescr pkgDescr = new PackageDescr( "org.test" );
-        TypeDeclarationDescr typeDescr = new TypeDeclarationDescr( "StockTick" );
-        typeDescr.addMetaAttribute( TypeDeclaration.Role.ID,
-                                    "event" );
-        typeDescr.addMetaAttribute( TypeDeclaration.ATTR_CLASS,
-                                    "org.drools.StockTick" );
-        pkgDescr.addTypeDeclaration( typeDescr );
-
-        PackageBuilder builder = new PackageBuilder();
-        builder.addPackage( pkgDescr );
-
-        Package pkg = builder.getPackage();
-        assertEquals( 1,
-                      pkg.getTypeDeclarations().size() );
-
-        TypeDeclaration type = pkg.getTypeDeclaration( "StockTick" );
-        assertEquals( "StockTick",
-                      type.getTypeName() );
-        assertEquals( TypeDeclaration.Role.EVENT,
-                      type.getRole() );
-        assertEquals( StockTick.class,
-                      type.getTypeClass() );
-    }
-
-    public void testTypeDeclarationNewBean() throws Exception {
-        PackageDescr pkgDescr = new PackageDescr( "org.test" );
-        TypeDeclarationDescr typeDescr = new TypeDeclarationDescr( "NewBean" );
-
-        TypeFieldDescr f1 = new TypeFieldDescr("name", new PatternDescr("String"));
-        TypeFieldDescr f2 = new TypeFieldDescr("age", new PatternDescr("int"));
-
-        typeDescr.addField(f1);
-        typeDescr.addField(f2);
-
-        pkgDescr.addTypeDeclaration( typeDescr );
-
-        PackageBuilder builder = new PackageBuilder();
-        builder.addPackage( pkgDescr );
-
-        Package pkg = builder.getPackage();
-        assertEquals( 1,
-                      pkg.getTypeDeclarations().size() );
-
-        TypeDeclaration type = pkg.getTypeDeclaration( "NewBean" );
-        assertEquals( "NewBean",
-                      type.getTypeName() );
-        assertEquals( TypeDeclaration.Role.FACT,
-                      type.getRole() );
-        assertEquals( "org.test.NewBean",
-                      type.getTypeClass().getName() );
-        assertFalse(builder.hasErrors());
-
-        Package bp = builder.getPackage();
-        CompositeClassLoader rootClassloader = new CompositeClassLoader( Thread.currentThread().getContextClassLoader() );
-        JavaDialectRuntimeData dialectData = ( JavaDialectRuntimeData ) bp.getDialectRuntimeRegistry().getDialectData( "java" );
-        dialectData.onAdd( bp.getDialectRuntimeRegistry(), rootClassloader );
-        
-        Class newBean = rootClassloader.loadClass("org.test.NewBean");
-        assertNotNull(newBean);
-    }
-
-
-    public void testPackageMerge() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        try {
-            builder.addPackage( new PackageDescr( "org.drools" ) );
-
-            builder.addPackageFromDrl( new StringReader( "package org.drools\n" + "function boolean testIt() {\n" + "  return true;\n" + "}\n" ) );
-        } catch ( RuntimeException e ) {
-            fail( "Should not raise any exception: " + e.getMessage() );
-        }
-    }
-
-    private void createReturnValueRule(final PackageDescr packageDescr,
-                                       final String expression) {
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
-                                                                     "x" );
-        pattern.addConstraint( fieldBindingDescr );
-        fieldBindingDescr = new FieldBindingDescr( "price",
-                                                   "y" );
-        pattern.addConstraint( fieldBindingDescr );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
-        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
-                                                                     expression ) );
-
-        pattern.addConstraint( returnValue );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-    }
-
-    private void createPredicateRule(final PackageDescr packageDescr,
-                                     final String expression) {
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
-                                                       "stilton" );
-        lhs.addDescr( pattern );
-
-        final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
-                                                                           "x" );
-        pattern.addConstraint( fieldBindingDescr );
-
-        final FieldBindingDescr fieldBindingDescr2 = new FieldBindingDescr( "price",
-                                                                            "y" );
-        pattern.addConstraint( fieldBindingDescr2 );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final PredicateDescr predicate = new PredicateDescr( expression );
-        pattern.addConstraint( predicate );
-
-        ruleDescr.setConsequence( "update(stilton);" );
-    }
-
-    private void createEvalRule(final PackageDescr packageDescr,
-                                final String expression) {
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        packageDescr.addGlobal( new GlobalDescr( "map",
-                                                 "java.util.Map" ) );
-
-        final EvalDescr evalDescr = new EvalDescr( expression );
-        lhs.addDescr( evalDescr );
-
-        ruleDescr.setConsequence( "" );
-    }
-
-    private void createLiteralRule(final FieldConstraintDescr literalDescr) {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr pattern = new PatternDescr( Primitives.class.getName() );
-        lhs.addDescr( pattern );
-
-        pattern.addConstraint( literalDescr );
-
-        ruleDescr.setConsequence( "" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-    }
-
-    private Rule createRule(final ConditionalElementDescr ceDescr,
-                            final PackageBuilder builder,
-                            final String consequence) throws Exception {
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        lhs.addDescr( (BaseDescr) ceDescr );
-
-        final PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(),
-                                                            "stilton" );
-
-        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
-        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
-                                                                  "stilton" ) );
-
-        patternDescr.addConstraint( literalDescr );
-
-        ceDescr.addDescr( patternDescr );
-
-        ruleDescr.setConsequence( consequence );
-
-        builder.addPackage( packageDescr );
-
-        final Package pkg = (Package) builder.getPackage();
-        final Rule rule = pkg.getRule( "rule-1" );
-
-        assertEquals( "rule-1",
-                      rule.getName() );
-
-        return rule;
-    }
-
-    public void testRuleFlow() throws Exception {
-        PackageBuilder builder = new PackageBuilder();
-
-        InputStream in = this.getClass().getResourceAsStream( "/org/drools/integrationtests/ruleflow.rfm" );
-        assertNotNull( in );
-
-        builder.addPackage( new PackageDescr( "com.sample" ) );
-
-        builder.addRuleFlow( new InputStreamReader( in ) );
-        Package pkg = builder.getPackage();
-        assertNotNull( pkg );
-
-        Map flows = pkg.getRuleFlows();
-        assertNotNull( flows );
-        assertEquals( 1,
-                      flows.size() );
-
-        assertTrue( flows.containsKey( "0" ) );
-
-        Process p = (Process) flows.get( "0" );
-        assertTrue( p instanceof WorkflowProcessImpl );
-
-        //now serialization
-        Package pkg2 = (Package) DroolsStreamUtils.streamIn( DroolsStreamUtils.streamOut( pkg ) );
-        assertNotNull( pkg2 );
-
-        flows = pkg2.getRuleFlows();
-        assertNotNull( flows );
-        assertEquals( 1,
-                      flows.size() );
-        assertTrue( flows.containsKey( "0" ) );
-        p = (Process) flows.get( "0" );
-        assertTrue( p instanceof WorkflowProcessImpl );
-    }
-
-    public void testPackageRuleFlows() throws Exception {
-        Package pkg = new Package( "boo" );
-        Process rf = new MockRuleFlow( "1" );
-        pkg.addProcess( rf );
-        assertTrue( pkg.getRuleFlows().containsKey( "1" ) );
-        assertSame( rf,
-                    pkg.getRuleFlows().get( "1" ) );
-
-        Process rf2 = new MockRuleFlow( "2" );
-        pkg.addProcess( rf2 );
-        assertTrue( pkg.getRuleFlows().containsKey( "1" ) );
-        assertSame( rf,
-                    pkg.getRuleFlows().get( "1" ) );
-        assertTrue( pkg.getRuleFlows().containsKey( "2" ) );
-        assertSame( rf2,
-                    pkg.getRuleFlows().get( "2" ) );
-
-        pkg.removeRuleFlow( "1" );
-        assertTrue( pkg.getRuleFlows().containsKey( "2" ) );
-        assertSame( rf2,
-                    pkg.getRuleFlows().get( "2" ) );
-        assertFalse( pkg.getRuleFlows().containsKey( "1" ) );
-
-    }
-
-    public void testJaninoWithStaticImports() throws Exception {
-        PackageBuilderConfiguration cfg = new PackageBuilderConfiguration();
-        JavaDialectConfiguration javaConf = (JavaDialectConfiguration) cfg.getDialectConfiguration( "java" );
-        javaConf.setCompiler( JavaDialectConfiguration.JANINO );
-
-        PackageBuilder bldr = new PackageBuilder( cfg );
-        bldr.addPackageFromDrl( new StringReader( "package testBuilderPackageConfig \n import java.util.List" ) );
-        bldr.addPackageFromDrl( new StringReader( "function void doSomething() {\n System.err.println(List.class.toString()); }" ) );
-
-        assertFalse( bldr.hasErrors() );
-    }
-
-    public void testSinglePackage() throws Exception {
-        PackageBuilderConfiguration cfg = new PackageBuilderConfiguration();
-        cfg.setAllowMultipleNamespaces(false);
-        PackageBuilder bldr = new PackageBuilder( cfg );
-    	bldr.addPackageFromDrl(new StringReader("package whee\n import org.drools.Cheese"));
-    	assertFalse(bldr.hasErrors());
-    	bldr.addPackageFromDrl(new StringReader("package whee\n import org.drools.Person"));
-    	assertFalse(bldr.hasErrors());
-    	bldr.addPackageFromDrl(new StringReader("package whee2\n import org.drools.Person"));
-    	assertFalse(bldr.hasErrors());
-
-    	assertEquals(1, bldr.getPackages().length);
-
-    	cfg = new PackageBuilderConfiguration();
-    	assertEquals(true, cfg.isAllowMultipleNamespaces());
-    	bldr = new PackageBuilder( cfg );
-    	bldr.addPackageFromDrl(new StringReader("package whee\n import org.drools.Cheese"));
-    	assertFalse(bldr.hasErrors());
-    	bldr.addPackageFromDrl(new StringReader("import org.drools.Person"));
-    	assertFalse(bldr.hasErrors());
-    	bldr.addPackageFromDrl(new StringReader("package whee2\n import org.drools.Person"));
-    	assertFalse(bldr.hasErrors());
-
-    	assertEquals(2, bldr.getPackages().length);
-    }
-
-    public void testTimeWindowBehavior() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-
-        final PackageDescr packageDescr = new PackageDescr( "p1" );
-        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
-        packageDescr.addRule( ruleDescr );
-
-        final AndDescr lhs = new AndDescr();
-        ruleDescr.setLhs( lhs );
-
-        final PatternDescr patternDescr = new PatternDescr( StockTick.class.getName(),
-                                                            "$tick" );
-        final SlidingWindowDescr windowDescr = new SlidingWindowDescr( "time",
-                                                                       "60000" );
-        patternDescr.addBehavior( windowDescr );
-
-        lhs.addDescr( patternDescr );
-
-        ruleDescr.setConsequence( "System.out.println( $tick );" );
-
-        builder.addPackage( packageDescr );
-
-        assertLength( 0,
-                      builder.getErrors().getErrors() );
-
-        final Package pkg = builder.getPackage();
-        final Rule rule = pkg.getRule( "rule-1" );
-        assertNotNull( rule );
-
-        final Pattern pattern = (Pattern) rule.getLhs().getChildren().get( 0 );
-        assertEquals( StockTick.class.getName(),
-                      ((ClassObjectType)pattern.getObjectType()).getClassType().getName() );
-        final Behavior window = pattern.getBehaviors().get( 0 );
-        assertEquals( Behavior.BehaviorType.TIME_WINDOW,
-                      window.getType() );
-        assertEquals( 60000,
-                      ((SlidingTimeWindow) window).getSize() );
-    }
-
-    class MockRuleFlow
-        implements
-        Process {
-
-        private String id;
-
-        MockRuleFlow(String id) {
-            this.id = id;
-        }
-
-        public String getId() {
-            return id;
-        }
-
-        public String getName() {
-            return null;
-        }
-
-        public String getType() {
-            return null;
-        }
-
-        public String getVersion() {
-            return null;
-        }
-
-        public String getPackageName() {
-            return null;
-        }
-
-        public void setId(String id) {
-        }
-
-        public void setName(String name) {
-        }
-
-        public void setType(String type) {
-        }
-
-        public void setVersion(String version) {
-        }
-
-        public void setPackageName(String packageName) {
-        }
-
-        public void addContext(Context context) {
-        }
-
-        public List<Context> getContexts(String contextId) {
-            return null;
-        }
-
-        public Context getDefaultContext(String contextId) {
-            return null;
-        }
-
-        public void setDefaultContext(Context context) {
-        }
-
-        public Context getContext(String contextType,
-                                  long id) {
-            return null;
-        }
-
-        public Object getMetaData(String name) {
-            return null;
-        }
-
-        public void setMetaData(String name,
-                                Object value) {
-        }
-
-        public String getURL() {
-            return null;
-        }
-
-        public void setURL(String url) {
-        }
-
-		public String[] getGlobalNames() {
-			return null;
-		}
-
-		public Map<String, String> getGlobals() {
-			return null;
-		}
-
-		public List<String> getImports() {
-			return null;
-		}
-
-		public void setGlobals(Map<String, String> globals) {
-		}
-
-		public void setImports(List<String> imports) {
-		}
-
-		public List<String> getFunctionImports() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public void setFunctionImports(List<String> functionImports) {
-			// TODO Auto-generated method stub
-			
-		}
-
-    }
-
-    class MockActivation
-        implements
-        Activation {
-        private Rule               rule;
-        private int                salience;
-        private final GroupElement subrule;
-        private Tuple              tuple;
-
-        public MockActivation(final Rule rule,
-                              int salience,
-                              final GroupElement subrule,
-                              final Tuple tuple) {
-            this.rule = rule;
-            this.salience = salience;
-            this.tuple = tuple;
-            this.subrule = subrule;
-        }
-
-        public Rule getRule() {
-            return this.rule;
-        }
-
-        public int getSalience() {
-            return this.salience;
-        }
-
-        public Tuple getTuple() {
-            return this.tuple;
-        }
-
-        public PropagationContext getPropagationContext() {
-            return null;
-        }
-
-        public long getActivationNumber() {
-            return 0;
-        }
-
-        public void remove() {
-        }
-
-        public void addLogicalDependency(final LogicalDependency node) {
-        }
-
-        public LinkedList getLogicalDependencies() {
-            return null;
-        }
-
-        public boolean isActivated() {
-            return false;
-        }
-
-        public void setActivated(final boolean activated) {
-        }
-
-        public ActivationGroupNode getActivationGroupNode() {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        public void setActivationGroupNode(final ActivationGroupNode activationGroupNode) {
-            // TODO Auto-generated method stub
-
-        }
-
-        public GroupElement getSubRule() {
-            return this.subrule;
-        }
-
-        public AgendaGroup getAgendaGroup() {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        public RuleFlowGroupNode getRuleFlowGroupNode() {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        public void setRuleFlowGroupNode(final RuleFlowGroupNode ruleFlowGroupNode) {
-            // TODO Auto-generated method stub
-
-        }
-
-        public void setLogicalDependencies(LinkedList justified) {
-            // TODO Auto-generated method stub
-
-        }
-
-        public Collection<FactHandle> getFactHandles() {
-            // TODO Auto-generated method stub
-            return null;
-        }
-    }
-
-    class MockTuple
-        implements
-        Tuple {
-        private Map declarations;
-
-        public MockTuple(final Map declarations) {
-            this.declarations = declarations;
-        }
-
-        public InternalFactHandle get(final int patern) {
-            return null;
-        }
-
-        public InternalFactHandle get(final Declaration declaration) {
-            return (InternalFactHandle) this.declarations.get( declaration );
-        }
-
-        public InternalFactHandle[] getFactHandles() {
-            return (InternalFactHandle[]) this.declarations.values().toArray( new FactHandle[0] );
-        }
-
-        public boolean dependsOn(final FactHandle handle) {
-            return false;
-        }
-
-        public void setActivation(final Activation activation) {
-        }
-
-        public long getRecency() {
-            // TODO Auto-generated method stub
-            return 0;
-        }
-
-        public int size() {
-            // TODO Auto-generated method stub
-            return 0;
-        }
-
-    }
+package org.drools.compiler;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.Cheese;
+import org.drools.DroolsTestCase;
+import org.drools.FactHandle;
+import org.drools.Primitives;
+import org.drools.QueryResults;
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.StockTick;
+import org.drools.WorkingMemory;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DefaultKnowledgeHelper;
+import org.drools.common.ActivationGroupNode;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.LogicalDependency;
+import org.drools.common.RuleFlowGroupNode;
+import org.drools.commons.jci.compilers.EclipseJavaCompiler;
+import org.drools.commons.jci.compilers.JaninoJavaCompiler;
+import org.drools.commons.jci.compilers.JavaCompiler;
+import org.drools.facttemplates.Fact;
+import org.drools.integrationtests.SerializationHelper;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.ConditionalElementDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.FieldTemplateDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.PatternDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.QueryDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.SlidingWindowDescr;
+import org.drools.lang.descr.TypeDeclarationDescr;
+import org.drools.lang.descr.TypeFieldDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+import org.drools.process.core.Context;
+import org.drools.process.core.Process;
+import org.drools.reteoo.ReteooRuleBase;
+import org.drools.rule.Behavior;
+import org.drools.rule.CompositeClassLoader;
+import org.drools.rule.Declaration;
+import org.drools.rule.EvalCondition;
+import org.drools.rule.GroupElement;
+import org.drools.rule.JavaDialectRuntimeData;
+import org.drools.rule.LiteralConstraint;
+import org.drools.rule.Package;
+import org.drools.rule.Pattern;
+import org.drools.rule.PredicateConstraint;
+import org.drools.rule.ReturnValueConstraint;
+import org.drools.rule.Rule;
+import org.drools.rule.SlidingTimeWindow;
+import org.drools.rule.TypeDeclaration;
+import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
+import org.drools.spi.Activation;
+import org.drools.spi.AgendaGroup;
+import org.drools.spi.CompiledInvoker;
+import org.drools.spi.PropagationContext;
+import org.drools.spi.Tuple;
+import org.drools.util.DroolsStreamUtils;
+import org.drools.util.LinkedList;
+import org.drools.workflow.core.impl.WorkflowProcessImpl;
+
+public class PackageBuilderTest extends DroolsTestCase {
+
+    public void testErrors() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
+                                                                     "x" );
+        pattern.addConstraint( fieldBindingDescr );
+        fieldBindingDescr = new FieldBindingDescr( "price",
+                                                   "y" );
+        pattern.addConstraint( fieldBindingDescr );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
+        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
+                                                                     "x" ) );
+
+        pattern.addConstraint( returnValue );
+
+        // There is no m this should produce errors.
+        ruleDescr.setConsequence( "update(m);" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 1,
+                      builder.getErrors().getErrors() );
+    }
+
+    public void testErrorsInParser() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( this.getClass().getResourceAsStream( "bad_rule.drl" ) ) );
+        assertTrue( builder.hasErrors() );
+    }
+
+    public void testReload() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        ruleDescr.setConsequence( "map.put(\"value\", new Integer(1) );" );
+
+        builder.addPackage( packageDescr );
+
+        Package pkg = builder.getPackage();
+        Rule rule = pkg.getRule( "rule-1" );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+        ruleBase.getGlobals().put( "map",
+                                   Map.class );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final HashMap map = new HashMap();
+        workingMemory.setGlobal( "map",
+                                 map );
+
+        final Tuple tuple = new MockTuple( new HashMap() );
+        final Activation activation = new MockActivation( rule,
+                                                          0,
+                                                          rule.getLhs(),
+                                                          tuple );
+
+        DefaultKnowledgeHelper knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( workingMemory );
+        knowledgeHelper.setActivation( activation );
+
+        rule.getConsequence().evaluate( knowledgeHelper,
+                                        workingMemory );
+        assertEquals( new Integer( 1 ),
+                      map.get( "value" ) );
+
+        ruleDescr.setConsequence( "map.put(\"value\", new Integer(2) );" );
+        pkg.removeRule( rule );
+
+        // Make sure the compiled classes are also removed
+        assertEquals( 0,
+                      ((JavaDialectRuntimeData) pkg.getDialectRuntimeRegistry().getDialectData( "java" )).list().length );
+
+        builder.addPackage( packageDescr );
+
+        pkg = builder.getPackage();
+
+        rule = pkg.getRule( "rule-1" );
+
+        knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( workingMemory );
+        knowledgeHelper.setActivation( activation );
+
+        rule.getConsequence().evaluate( knowledgeHelper,
+                                        workingMemory );
+        assertEquals( new Integer( 2 ),
+                      map.get( "value" ) );
+
+    }
+
+    public void testSerializable() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        ruleDescr.setConsequence( "map.put(\"value\", new Integer(1) );" );
+        //check that packageDescr is serializable
+        final PackageDescr back = (PackageDescr) SerializationHelper.serializeObject( packageDescr );
+        assertNotNull( back );
+        assertEquals( "p1",
+                      back.getName() );
+
+        builder.addPackage( packageDescr );
+        final Package pkg = builder.getPackage();
+        final Rule rule = pkg.getRule( "rule-1" );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        final Package newPkg = SerializationHelper.serializeObject( pkg );
+        final Rule newRule = newPkg.getRule( "rule-1" );
+
+        final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+
+        // It's been serialised so we have to simulate the re-wiring process
+        newPkg.getDialectRuntimeRegistry().onAdd( ruleBase.getRootClassLoader() );
+        newPkg.getDialectRuntimeRegistry().onBeforeExecute();
+
+        ruleBase.getGlobals().put( "map",
+                                   Map.class );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final HashMap map = new HashMap();
+
+        workingMemory.setGlobal( "map",
+                                 map );
+
+        final Tuple tuple = new MockTuple( new HashMap() );
+        final Activation activation = new MockActivation( newRule,
+                                                          0,
+                                                          newRule.getLhs(),
+                                                          tuple );
+
+        final DefaultKnowledgeHelper knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( workingMemory );
+        knowledgeHelper.setActivation( activation );
+
+        newRule.getConsequence().evaluate( knowledgeHelper,
+                                           workingMemory );
+        assertEquals( new Integer( 1 ),
+                      map.get( "value" ) );
+    }
+
+    public void FIXMEtestNoPackageName() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        try {
+            builder.addPackage( new PackageDescr( null ) );
+            fail( "should have errored here." );
+        } catch ( final RuntimeException e ) {
+            assertNotNull( e.getMessage() );
+        }
+        try {
+            builder.addPackage( new PackageDescr( "" ) );
+            fail( "should have errored here." );
+        } catch ( final RuntimeException e ) {
+            assertNotNull( e.getMessage() );
+        }
+
+        builder.addPackageFromDrl( new StringReader( "package foo" ) );
+        builder.addPackageFromDrl( new StringReader( "rule x then end" ) );
+
+    }
+
+    public void testErrorReset() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        builder.addPackageFromDrl( new StringReader( "package foo \n rule ORB" ) );
+        assertTrue( builder.hasErrors() );
+
+        builder.resetErrors();
+        assertFalse( builder.hasErrors() );
+
+        builder.addPackageFromDrl( new StringReader( "package foo \n rule ORB" ) );
+        assertTrue( builder.hasErrors() );
+    }
+
+    public void testFactTemplate() {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final FactTemplateDescr cheese = new FactTemplateDescr( "Cheese" );
+        cheese.addFieldTemplate( new FieldTemplateDescr( "name",
+                                                         "String" ) );
+        cheese.addFieldTemplate( new FieldTemplateDescr( "price",
+                                                         "Integer" ) );
+
+        packageDescr.addFactTemplate( cheese );
+
+        final PatternDescr pattern = new PatternDescr( "Cheese",
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "name" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
+
+        pattern.addConstraint( literalDescr );
+
+        ruleDescr.setConsequence( "String result = stilton.getFieldValue( \"name\" ) + \" \" + stilton.getFieldValue( \"price\" );" );
+
+        builder.addPackage( packageDescr );
+
+        //        assertFalse( Arrays.toString( builder.getErrors() ),
+        //                     builder.hasErrors() );
+
+        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        final Package pkg = builder.getPackage();
+        try {
+            ruleBase.addPackage( pkg );
+        } catch ( final Exception e ) {
+            e.printStackTrace();
+        }
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final Fact stilton = pkg.getFactTemplate( "Cheese" ).createFact( 1 );
+        stilton.setFieldValue( "name",
+                               "stilton" );
+        stilton.setFieldValue( "price",
+                               new Integer( 200 ) );
+        workingMemory.insert( stilton );
+        workingMemory.fireAllRules();
+
+    }
+
+    public void testLiteral() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
+
+        pattern.addConstraint( literalDescr );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+    }
+
+    public void testReturnValue() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
+                                                                     "x" );
+        pattern.addConstraint( fieldBindingDescr );
+        fieldBindingDescr = new FieldBindingDescr( "price",
+                                                   "y" );
+        pattern.addConstraint( fieldBindingDescr );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
+        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
+                                                                     "(( (Integer) map.get( new Integer( x )) ).intValue() * y)" ) );
+
+        pattern.addConstraint( returnValue );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+
+        builder.addPackage( packageDescr );
+
+        assertEquals( "Should not have any errors",
+                      0,
+                      builder.getErrors().getErrors().length );
+    }
+
+    public void testReturnValueMethodCompare() {
+        final PackageBuilder builder1 = new PackageBuilder();
+        final PackageDescr packageDescr1 = new PackageDescr( "package1" );
+        createReturnValueRule( packageDescr1,
+                               " x + y " );
+        builder1.addPackage( packageDescr1 );
+        final Pattern pattern1 = (Pattern) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+        final ReturnValueConstraint returnValue1 = (ReturnValueConstraint) pattern1.getConstraints().get( 2 );
+
+        final PackageBuilder builder2 = new PackageBuilder();
+        final PackageDescr packageDescr2 = new PackageDescr( "package2" );
+        createReturnValueRule( packageDescr2,
+                               " x + y " );
+        builder2.addPackage( packageDescr2 );
+        final Pattern pattern2 = (Pattern) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+        final ReturnValueConstraint returnValue2 = (ReturnValueConstraint) pattern2.getConstraints().get( 2 );
+
+        final PackageBuilder builder3 = new PackageBuilder();
+        final PackageDescr packageDescr3 = new PackageDescr( "package3" );
+        createReturnValueRule( packageDescr3,
+                               " x - y " );
+        builder3.addPackage( packageDescr3 );
+        final Pattern pattern3 = (Pattern) builder3.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+        final ReturnValueConstraint returnValue3 = (ReturnValueConstraint) pattern3.getConstraints().get( 2 );
+
+        assertEquals( returnValue1,
+                      returnValue2 );
+        assertFalse( returnValue1.equals( returnValue3 ) );
+        assertFalse( returnValue2.equals( returnValue3 ) );
+    }
+
+    public void testPredicate() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
+                                                                           "x" );
+        pattern.addConstraint( fieldBindingDescr );
+
+        final FieldBindingDescr fieldBindingDescr2 = new FieldBindingDescr( "price",
+                                                                            "y" );
+        pattern.addConstraint( fieldBindingDescr2 );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final PredicateDescr predicate = new PredicateDescr( "( ( Integer )map.get( new Integer(x) ) ).intValue() == y" );
+        pattern.addConstraint( predicate );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+    }
+
+    public void testPredicateMethodCompare() {
+        final PackageBuilder builder1 = new PackageBuilder();
+        final PackageDescr packageDescr1 = new PackageDescr( "package1" );
+        createPredicateRule( packageDescr1,
+                             "x==y" );
+        builder1.addPackage( packageDescr1 );
+        final Pattern pattern1 = (Pattern) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+        final PredicateConstraint predicate1 = (PredicateConstraint) pattern1.getConstraints().get( 2 );
+
+        final PackageBuilder builder2 = new PackageBuilder();
+        final PackageDescr packageDescr2 = new PackageDescr( "package2" );
+        createPredicateRule( packageDescr2,
+                             "x==y" );
+        builder2.addPackage( packageDescr2 );
+        final Pattern pattern2 = (Pattern) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+        final PredicateConstraint predicate2 = (PredicateConstraint) pattern2.getConstraints().get( 2 );
+
+        final PackageBuilder builder3 = new PackageBuilder();
+        final PackageDescr packageDescr3 = new PackageDescr( "package3" );
+        createPredicateRule( packageDescr3,
+                             "x!=y" );
+        builder3.addPackage( packageDescr3 );
+        final Pattern pattern3 = (Pattern) builder3.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+        final PredicateConstraint predicate3 = (PredicateConstraint) pattern3.getConstraints().get( 2 );
+
+        assertEquals( predicate1,
+                      predicate2 );
+        assertFalse( predicate1.equals( predicate3 ) );
+        assertFalse( predicate2.equals( predicate3 ) );
+    }
+
+    public void testEval() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
+                                                                     "x" );
+        pattern.addConstraint( fieldBindingDescr );
+        fieldBindingDescr = new FieldBindingDescr( "price",
+                                                   "y" );
+        pattern.addConstraint( fieldBindingDescr );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final EvalDescr evalDescr = new EvalDescr( "( ( Integer )map.get( new Integer(x) ) ).intValue() == y" );
+        lhs.addDescr( evalDescr );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        final Package pkg = builder.getPackage();
+        final Rule rule = pkg.getRule( "rule-1" );
+        final EvalCondition eval = (EvalCondition) rule.getLhs().getChildren().get( 1 );
+        final CompiledInvoker invoker = (CompiledInvoker) eval.getEvalExpression();
+        final List list = invoker.getMethodBytecode();
+    }
+
+    public void testEvalMethodCompare() {
+        final PackageBuilder builder1 = new PackageBuilder();
+        final PackageDescr packageDescr1 = new PackageDescr( "package1" );
+        createEvalRule( packageDescr1,
+                        "1==1" );
+        builder1.addPackage( packageDescr1 );
+        final EvalCondition eval1 = (EvalCondition) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+
+        final PackageBuilder builder2 = new PackageBuilder();
+        final PackageDescr packageDescr2 = new PackageDescr( "package2" );
+        createEvalRule( packageDescr2,
+                        "1==1" );
+        builder2.addPackage( packageDescr2 );
+        final EvalCondition eval2 = (EvalCondition) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+
+        final PackageBuilder builder3 = new PackageBuilder();
+        final PackageDescr packageDescr3 = new PackageDescr( "package3" );
+        createEvalRule( packageDescr3,
+                        "1==3" );
+        builder3.addPackage( packageDescr3 );
+        final EvalCondition eval3 = (EvalCondition) builder3.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
+
+        assertEquals( eval1,
+                      eval2 );
+        assertFalse( eval1.equals( eval3 ) );
+        assertFalse( eval2.equals( eval3 ) );
+    }
+
+    public void testOr() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        final Rule rule = createRule( new OrDescr(),
+                                      builder,
+                                      "update(stilton);" );
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        final GroupElement lhs = rule.getLhs();
+        assertLength( 1,
+                      lhs.getChildren() );
+
+        final GroupElement or = (GroupElement) lhs.getChildren().get( 0 );
+        assertLength( 1,
+                      or.getChildren() );
+        final Pattern pattern = (Pattern) or.getChildren().get( 0 );
+
+        final LiteralConstraint literalConstarint = (LiteralConstraint) pattern.getConstraints().get( 0 );
+    }
+
+    public void testAnd() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        final Rule rule = createRule( new AndDescr(),
+                                      builder,
+                                      "update(stilton);" );
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        final GroupElement lhs = rule.getLhs();
+        assertLength( 1,
+                      lhs.getChildren() );
+
+        final GroupElement and = (GroupElement) lhs.getChildren().get( 0 );
+        assertLength( 1,
+                      and.getChildren() );
+        final Pattern pattern = (Pattern) and.getChildren().get( 0 );
+
+        final LiteralConstraint literalConstraint = (LiteralConstraint) pattern.getConstraints().get( 0 );
+    }
+
+    public void testNot() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+
+        // Make sure we can't accessa  variable bound inside the not node
+        Rule rule = createRule( new NotDescr(),
+                                builder,
+                                "update(stilton);" );
+        assertEquals( 1,
+                      builder.getErrors().getErrors().length );
+
+        builder = new PackageBuilder();
+        rule = createRule( new NotDescr(),
+                           builder,
+                           "" );
+        assertEquals( 0,
+                      builder.getErrors().getErrors().length );
+
+        final GroupElement lhs = rule.getLhs();
+        assertLength( 1,
+                      lhs.getChildren() );
+
+        final GroupElement not = (GroupElement) lhs.getChildren().get( 0 );
+        assertLength( 1,
+                      not.getChildren() );
+        final Pattern pattern = (Pattern) not.getChildren().get( 0 );
+
+        final LiteralConstraint literalConstarint = (LiteralConstraint) pattern.getConstraints().get( 0 );
+    }
+
+    public void testExists() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+
+        // Make sure we can't accessa  variable bound inside the not node
+        Rule rule = createRule( new ExistsDescr(),
+                                builder,
+                                "update(stilton);" );
+        assertEquals( 1,
+                      builder.getErrors().getErrors().length );
+
+        builder = new PackageBuilder();
+        rule = createRule( new ExistsDescr(),
+                           builder,
+                           "" );
+        assertEquals( 0,
+                      builder.getErrors().getErrors().length );
+
+        final GroupElement lhs = rule.getLhs();
+        assertLength( 1,
+                      lhs.getChildren() );
+
+        final GroupElement exists = (GroupElement) lhs.getChildren().get( 0 );
+        assertLength( 1,
+                      exists.getChildren() );
+        final Pattern pattern = (Pattern) exists.getChildren().get( 0 );
+
+        final LiteralConstraint literalConstarint = (LiteralConstraint) pattern.getConstraints().get( 0 );
+    }
+
+    public void testNumbers() throws Exception {
+        // test boolean
+        FieldConstraintDescr literalDescr = new FieldConstraintDescr( "booleanPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "true" ) );
+        createLiteralRule( literalDescr );
+
+        // test boolean
+        literalDescr = new FieldConstraintDescr( "booleanPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "false" ) );
+        createLiteralRule( literalDescr );
+
+        // test char
+        literalDescr = new FieldConstraintDescr( "charPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "a" ) );
+        createLiteralRule( literalDescr );
+
+        // test byte
+        literalDescr = new FieldConstraintDescr( "bytePrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "bytePrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "bytePrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1" ) );
+        createLiteralRule( literalDescr );
+
+        // test short
+        literalDescr = new FieldConstraintDescr( "shortPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "shortPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "shortPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1" ) );
+        createLiteralRule( literalDescr );
+
+        // test int
+        literalDescr = new FieldConstraintDescr( "intPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "intPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "intPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1" ) );
+        createLiteralRule( literalDescr );
+
+        // test long
+        literalDescr = new FieldConstraintDescr( "longPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "longPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "longPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        // test float
+        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1.1" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1.1" ) );
+        createLiteralRule( literalDescr );
+
+        // test double
+        literalDescr = new FieldConstraintDescr( "doublePrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "1.1" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "doublePrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "0" ) );
+        createLiteralRule( literalDescr );
+
+        literalDescr = new FieldConstraintDescr( "floatPrimitive" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "-1.1" ) );
+        createLiteralRule( literalDescr );
+    }
+
+    public void testNull() {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(),
+                                                            "stilton" );
+
+        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  null ) );
+
+        patternDescr.addConstraint( literalDescr );
+
+        ruleDescr.setConsequence( "" );
+
+        builder.addPackage( packageDescr );
+
+        final Package pkg = (Package) builder.getPackage();
+        final Rule rule = pkg.getRule( "rule-1" );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+    }
+
+    public void testQuery() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final QueryDescr queryDescr = new QueryDescr( "query1" );
+        queryDescr.setParameters( new String[]{"$type"} );
+        queryDescr.setParameterTypes( new String[]{"String"} );
+
+        packageDescr.addRule( queryDescr );
+
+        final AndDescr lhs = new AndDescr();
+        queryDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new VariableRestrictionDescr( "==",
+                                                                   "$type" ) );
+
+        pattern.addConstraint( literalDescr );
+
+        queryDescr.setConsequence( "update(stilton);" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+
+        session.insert( new Cheese( "stilton",
+                                    15 ) );
+
+        QueryResults results = session.getQueryResults( "query1",
+                                                        new Object[]{"stilton"} );
+        assertEquals( 1,
+                      results.size() );
+        Object object = results.get( 0 ).get( 0 );
+        assertEquals( new Cheese( "stilton",
+                                  15 ),
+                      object );
+
+        results = session.getQueryResults( "query1",
+                                           new Object[]{"cheddar"} );
+    }
+
+    public void testDuplicateRuleNames() throws Exception {
+
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+
+        RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+        AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+        PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(),
+                                                      "stilton" );
+        FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  null ) );
+        patternDescr.addConstraint( literalDescr );
+        ruleDescr.setConsequence( "" );
+
+        ruleDescr = new RuleDescr( "rule-1" );
+        ruleDescr.setLocation( 42,
+                               43 );
+        packageDescr.addRule( ruleDescr );
+        lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+        patternDescr = new PatternDescr( Cheese.class.getName(),
+                                         "stilton" );
+        literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "!=",
+                                                                  null ) );
+        patternDescr.addConstraint( literalDescr );
+        ruleDescr.setConsequence( "" );
+
+        ruleDescr = new RuleDescr( "rule-2" );
+        ruleDescr.setLocation( 42,
+                               43 );
+        packageDescr.addRule( ruleDescr );
+        lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+        patternDescr = new PatternDescr( Cheese.class.getName(),
+                                         "stilton" );
+
+        literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "!=",
+                                                                  null ) );
+
+        patternDescr.addConstraint( literalDescr );
+        ruleDescr.setConsequence( "" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 1,
+                      builder.getErrors().getErrors() );
+        final ParserError err = (ParserError) builder.getErrors().getErrors()[0];
+        assertEquals( 42,
+                      err.getRow() );
+        assertEquals( 43,
+                      err.getCol() );
+
+    }
+
+    public void testDuplicateDeclaration() {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern1 = new PatternDescr( Cheese.class.getName() );
+        lhs.addDescr( pattern1 );
+
+        final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "type",
+                                                                           "$type" );
+
+        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
+
+        pattern1.addConstraint( fieldBindingDescr );
+        pattern1.addConstraint( literalDescr );
+
+        final PatternDescr pattern2 = new PatternDescr( Cheese.class.getName() );
+        lhs.addDescr( pattern2 );
+        pattern2.addConstraint( fieldBindingDescr );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 2,
+                      builder.getErrors().getErrors() );
+    }
+
+    public void testCompilerConfiguration() throws Exception {
+        // test default is eclipse jdt core
+        PackageBuilder builder = new PackageBuilder();
+        PackageDescr pkgDescr = new PackageDescr( "org.test" );
+        builder.addPackage( pkgDescr );
+        DialectCompiletimeRegistry reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
+
+        final Field dialectField = builder.getClass().getDeclaredField( "defaultDialect" );
+        dialectField.setAccessible( true );
+        String dialectName = (String) dialectField.get( builder );
+
+        reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
+        Dialect dialect = reg.getDialect( dialectName );
+
+        final Field compilerField = dialect.getClass().getDeclaredField( "compiler" );
+        compilerField.setAccessible( true );
+        JavaCompiler compiler = (JavaCompiler) compilerField.get( dialect );
+        assertSame( EclipseJavaCompiler.class,
+                    compiler.getClass() );
+
+        // test JANINO with property settings
+        PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
+        JavaDialectConfiguration javaConf = (JavaDialectConfiguration) conf.getDialectConfiguration( "java" );
+        javaConf.setCompiler( JavaDialectConfiguration.JANINO );
+        builder = new PackageBuilder( conf );
+        builder.addPackage( pkgDescr );
+
+        dialectName = (String) dialectField.get( builder );
+        reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
+        dialect = reg.getDialect( dialectName );
+        compiler = (JavaCompiler) compilerField.get( dialect );
+        assertSame( JaninoJavaCompiler.class,
+                    compiler.getClass() );
+
+        // test eclipse jdt core with property settings and default source level
+        conf = new PackageBuilderConfiguration();
+        javaConf = (JavaDialectConfiguration) conf.getDialectConfiguration( "java" );
+        javaConf.setCompiler( JavaDialectConfiguration.ECLIPSE );
+        builder = new PackageBuilder( conf );
+        builder.addPackage( pkgDescr );
+
+        dialectName = (String) dialectField.get( builder );
+        reg = builder.getPackageRegistry( pkgDescr.getName() ).getDialectCompiletimeRegistry();
+        dialect = reg.getDialect( dialectName );
+        compiler = (JavaCompiler) compilerField.get( dialect );
+        assertSame( EclipseJavaCompiler.class,
+                    compiler.getClass() );
+    }
+
+    public void testTypeDeclaration() throws Exception {
+        PackageDescr pkgDescr = new PackageDescr( "org.test" );
+        TypeDeclarationDescr typeDescr = new TypeDeclarationDescr( "StockTick" );
+        typeDescr.addMetaAttribute( TypeDeclaration.Role.ID,
+                                    "event" );
+        typeDescr.addMetaAttribute( TypeDeclaration.ATTR_CLASS,
+                                    "org.drools.StockTick" );
+        pkgDescr.addTypeDeclaration( typeDescr );
+
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackage( pkgDescr );
+
+        Package pkg = builder.getPackage();
+        assertEquals( 1,
+                      pkg.getTypeDeclarations().size() );
+
+        TypeDeclaration type = pkg.getTypeDeclaration( "StockTick" );
+        assertEquals( "StockTick",
+                      type.getTypeName() );
+        assertEquals( TypeDeclaration.Role.EVENT,
+                      type.getRole() );
+        assertEquals( StockTick.class,
+                      type.getTypeClass() );
+    }
+
+    public void testTypeDeclarationNewBean() throws Exception {
+        PackageDescr pkgDescr = new PackageDescr( "org.test" );
+        TypeDeclarationDescr typeDescr = new TypeDeclarationDescr( "NewBean" );
+
+        TypeFieldDescr f1 = new TypeFieldDescr( "name",
+                                                new PatternDescr( "String" ) );
+        TypeFieldDescr f2 = new TypeFieldDescr( "age",
+                                                new PatternDescr( "int" ) );
+
+        typeDescr.addField( f1 );
+        typeDescr.addField( f2 );
+
+        pkgDescr.addTypeDeclaration( typeDescr );
+
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackage( pkgDescr );
+
+        Package pkg = builder.getPackage();
+        assertEquals( 1,
+                      pkg.getTypeDeclarations().size() );
+
+        TypeDeclaration type = pkg.getTypeDeclaration( "NewBean" );
+        assertEquals( "NewBean",
+                      type.getTypeName() );
+        assertEquals( TypeDeclaration.Role.FACT,
+                      type.getRole() );
+        assertEquals( "org.test.NewBean",
+                      type.getTypeClass().getName() );
+        assertFalse( builder.hasErrors() );
+
+        Package bp = builder.getPackage();
+        CompositeClassLoader rootClassloader = new CompositeClassLoader( Thread.currentThread().getContextClassLoader() );
+        JavaDialectRuntimeData dialectData = (JavaDialectRuntimeData) bp.getDialectRuntimeRegistry().getDialectData( "java" );
+        dialectData.onAdd( bp.getDialectRuntimeRegistry(),
+                           rootClassloader );
+
+        Class newBean = rootClassloader.loadClass( "org.test.NewBean" );
+        assertNotNull( newBean );
+    }
+
+    public void testPackageMerge() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        try {
+            builder.addPackage( new PackageDescr( "org.drools" ) );
+
+            builder.addPackageFromDrl( new StringReader( "package org.drools\n" + "function boolean testIt() {\n" + "  return true;\n" + "}\n" ) );
+        } catch ( RuntimeException e ) {
+            fail( "Should not raise any exception: " + e.getMessage() );
+        }
+    }
+
+    private void createReturnValueRule(final PackageDescr packageDescr,
+                                       final String expression) {
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
+                                                                     "x" );
+        pattern.addConstraint( fieldBindingDescr );
+        fieldBindingDescr = new FieldBindingDescr( "price",
+                                                   "y" );
+        pattern.addConstraint( fieldBindingDescr );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final FieldConstraintDescr returnValue = new FieldConstraintDescr( "price" );
+        returnValue.addRestriction( new ReturnValueRestrictionDescr( "==",
+                                                                     expression ) );
+
+        pattern.addConstraint( returnValue );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+    }
+
+    private void createPredicateRule(final PackageDescr packageDescr,
+                                     final String expression) {
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Cheese.class.getName(),
+                                                       "stilton" );
+        lhs.addDescr( pattern );
+
+        final FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
+                                                                           "x" );
+        pattern.addConstraint( fieldBindingDescr );
+
+        final FieldBindingDescr fieldBindingDescr2 = new FieldBindingDescr( "price",
+                                                                            "y" );
+        pattern.addConstraint( fieldBindingDescr2 );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final PredicateDescr predicate = new PredicateDescr( expression );
+        pattern.addConstraint( predicate );
+
+        ruleDescr.setConsequence( "update(stilton);" );
+    }
+
+    private void createEvalRule(final PackageDescr packageDescr,
+                                final String expression) {
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        packageDescr.addGlobal( new GlobalDescr( "map",
+                                                 "java.util.Map" ) );
+
+        final EvalDescr evalDescr = new EvalDescr( expression );
+        lhs.addDescr( evalDescr );
+
+        ruleDescr.setConsequence( "" );
+    }
+
+    private void createLiteralRule(final FieldConstraintDescr literalDescr) {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr pattern = new PatternDescr( Primitives.class.getName() );
+        lhs.addDescr( pattern );
+
+        pattern.addConstraint( literalDescr );
+
+        ruleDescr.setConsequence( "" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+    }
+
+    private Rule createRule(final ConditionalElementDescr ceDescr,
+                            final PackageBuilder builder,
+                            final String consequence) throws Exception {
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        lhs.addDescr( (BaseDescr) ceDescr );
+
+        final PatternDescr patternDescr = new PatternDescr( Cheese.class.getName(),
+                                                            "stilton" );
+
+        final FieldConstraintDescr literalDescr = new FieldConstraintDescr( "type" );
+        literalDescr.addRestriction( new LiteralRestrictionDescr( "==",
+                                                                  "stilton" ) );
+
+        patternDescr.addConstraint( literalDescr );
+
+        ceDescr.addDescr( patternDescr );
+
+        ruleDescr.setConsequence( consequence );
+
+        builder.addPackage( packageDescr );
+
+        final Package pkg = (Package) builder.getPackage();
+        final Rule rule = pkg.getRule( "rule-1" );
+
+        assertEquals( "rule-1",
+                      rule.getName() );
+
+        return rule;
+    }
+
+    public void testRuleFlow() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+
+        InputStream in = this.getClass().getResourceAsStream( "/org/drools/integrationtests/ruleflow.rfm" );
+        assertNotNull( in );
+
+        builder.addPackage( new PackageDescr( "com.sample" ) );
+
+        builder.addRuleFlow( new InputStreamReader( in ) );
+        Package pkg = builder.getPackage();
+        assertNotNull( pkg );
+
+        Map flows = pkg.getRuleFlows();
+        assertNotNull( flows );
+        assertEquals( 1,
+                      flows.size() );
+
+        assertTrue( flows.containsKey( "0" ) );
+
+        Process p = (Process) flows.get( "0" );
+        assertTrue( p instanceof WorkflowProcessImpl );
+
+        //now serialization
+        Package pkg2 = (Package) DroolsStreamUtils.streamIn( DroolsStreamUtils.streamOut( pkg ) );
+        assertNotNull( pkg2 );
+
+        flows = pkg2.getRuleFlows();
+        assertNotNull( flows );
+        assertEquals( 1,
+                      flows.size() );
+        assertTrue( flows.containsKey( "0" ) );
+        p = (Process) flows.get( "0" );
+        assertTrue( p instanceof WorkflowProcessImpl );
+    }
+
+    public void testRuleFlowUpgrade() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+        // Set the system property so that automatic conversion can happen
+        System.setProperty( "drools.ruleflow.port",
+                            "true" );
+
+        InputStream in = this.getClass().getResourceAsStream( "/org/drools/integrationtests/ruleflow40.rfm" );
+        assertNotNull( in );
+
+        builder.addPackage( new PackageDescr( "com.sample" ) );
+
+        builder.addRuleFlow( new InputStreamReader( in ) );
+        Package pkg = builder.getPackage();
+        assertNotNull( pkg );
+
+        Map flows = pkg.getRuleFlows();
+        assertNotNull( flows );
+        assertEquals( 1,
+                      flows.size() );
+
+        assertTrue( flows.containsKey( "0" ) );
+
+        Process p = (Process) flows.get( "0" );
+        assertTrue( p instanceof WorkflowProcessImpl );
+
+        //now serialization
+        Package pkg2 = (Package) DroolsStreamUtils.streamIn( DroolsStreamUtils.streamOut( pkg ) );
+        assertNotNull( pkg2 );
+
+        flows = pkg2.getRuleFlows();
+        assertNotNull( flows );
+        assertEquals( 1,
+                      flows.size() );
+        assertTrue( flows.containsKey( "0" ) );
+        p = (Process) flows.get( "0" );
+        assertTrue( p instanceof WorkflowProcessImpl );
+        // Reset the system property so that automatic conversion should not happen
+        System.setProperty( "drools.ruleflow.port",
+                            "false" );
+    }
+
+    public void testPackageRuleFlows() throws Exception {
+        Package pkg = new Package( "boo" );
+        Process rf = new MockRuleFlow( "1" );
+        pkg.addProcess( rf );
+        assertTrue( pkg.getRuleFlows().containsKey( "1" ) );
+        assertSame( rf,
+                    pkg.getRuleFlows().get( "1" ) );
+
+        Process rf2 = new MockRuleFlow( "2" );
+        pkg.addProcess( rf2 );
+        assertTrue( pkg.getRuleFlows().containsKey( "1" ) );
+        assertSame( rf,
+                    pkg.getRuleFlows().get( "1" ) );
+        assertTrue( pkg.getRuleFlows().containsKey( "2" ) );
+        assertSame( rf2,
+                    pkg.getRuleFlows().get( "2" ) );
+
+        pkg.removeRuleFlow( "1" );
+        assertTrue( pkg.getRuleFlows().containsKey( "2" ) );
+        assertSame( rf2,
+                    pkg.getRuleFlows().get( "2" ) );
+        assertFalse( pkg.getRuleFlows().containsKey( "1" ) );
+
+    }
+
+    public void testJaninoWithStaticImports() throws Exception {
+        PackageBuilderConfiguration cfg = new PackageBuilderConfiguration();
+        JavaDialectConfiguration javaConf = (JavaDialectConfiguration) cfg.getDialectConfiguration( "java" );
+        javaConf.setCompiler( JavaDialectConfiguration.JANINO );
+
+        PackageBuilder bldr = new PackageBuilder( cfg );
+        bldr.addPackageFromDrl( new StringReader( "package testBuilderPackageConfig \n import java.util.List" ) );
+        bldr.addPackageFromDrl( new StringReader( "function void doSomething() {\n System.err.println(List.class.toString()); }" ) );
+
+        assertFalse( bldr.hasErrors() );
+    }
+
+    public void testSinglePackage() throws Exception {
+        PackageBuilderConfiguration cfg = new PackageBuilderConfiguration();
+        cfg.setAllowMultipleNamespaces( false );
+        PackageBuilder bldr = new PackageBuilder( cfg );
+        bldr.addPackageFromDrl( new StringReader( "package whee\n import org.drools.Cheese" ) );
+        assertFalse( bldr.hasErrors() );
+        bldr.addPackageFromDrl( new StringReader( "package whee\n import org.drools.Person" ) );
+        assertFalse( bldr.hasErrors() );
+        bldr.addPackageFromDrl( new StringReader( "package whee2\n import org.drools.Person" ) );
+        assertFalse( bldr.hasErrors() );
+
+        assertEquals( 1,
+                      bldr.getPackages().length );
+
+        cfg = new PackageBuilderConfiguration();
+        assertEquals( true,
+                      cfg.isAllowMultipleNamespaces() );
+        bldr = new PackageBuilder( cfg );
+        bldr.addPackageFromDrl( new StringReader( "package whee\n import org.drools.Cheese" ) );
+        assertFalse( bldr.hasErrors() );
+        bldr.addPackageFromDrl( new StringReader( "import org.drools.Person" ) );
+        assertFalse( bldr.hasErrors() );
+        bldr.addPackageFromDrl( new StringReader( "package whee2\n import org.drools.Person" ) );
+        assertFalse( bldr.hasErrors() );
+
+        assertEquals( 2,
+                      bldr.getPackages().length );
+    }
+
+    public void testTimeWindowBehavior() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+
+        final PackageDescr packageDescr = new PackageDescr( "p1" );
+        final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
+        packageDescr.addRule( ruleDescr );
+
+        final AndDescr lhs = new AndDescr();
+        ruleDescr.setLhs( lhs );
+
+        final PatternDescr patternDescr = new PatternDescr( StockTick.class.getName(),
+                                                            "$tick" );
+        final SlidingWindowDescr windowDescr = new SlidingWindowDescr( "time",
+                                                                       "60000" );
+        patternDescr.addBehavior( windowDescr );
+
+        lhs.addDescr( patternDescr );
+
+        ruleDescr.setConsequence( "System.out.println( $tick );" );
+
+        builder.addPackage( packageDescr );
+
+        assertLength( 0,
+                      builder.getErrors().getErrors() );
+
+        final Package pkg = builder.getPackage();
+        final Rule rule = pkg.getRule( "rule-1" );
+        assertNotNull( rule );
+
+        final Pattern pattern = (Pattern) rule.getLhs().getChildren().get( 0 );
+        assertEquals( StockTick.class.getName(),
+                      ((ClassObjectType) pattern.getObjectType()).getClassType().getName() );
+        final Behavior window = pattern.getBehaviors().get( 0 );
+        assertEquals( Behavior.BehaviorType.TIME_WINDOW,
+                      window.getType() );
+        assertEquals( 60000,
+                      ((SlidingTimeWindow) window).getSize() );
+    }
+
+    class MockRuleFlow
+        implements
+        Process {
+
+        private String id;
+
+        MockRuleFlow(String id) {
+            this.id = id;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public String getName() {
+            return null;
+        }
+
+        public String getType() {
+            return null;
+        }
+
+        public String getVersion() {
+            return null;
+        }
+
+        public String getPackageName() {
+            return null;
+        }
+
+        public void setId(String id) {
+        }
+
+        public void setName(String name) {
+        }
+
+        public void setType(String type) {
+        }
+
+        public void setVersion(String version) {
+        }
+
+        public void setPackageName(String packageName) {
+        }
+
+        public void addContext(Context context) {
+        }
+
+        public List<Context> getContexts(String contextId) {
+            return null;
+        }
+
+        public Context getDefaultContext(String contextId) {
+            return null;
+        }
+
+        public void setDefaultContext(Context context) {
+        }
+
+        public Context getContext(String contextType,
+                                  long id) {
+            return null;
+        }
+
+        public Object getMetaData(String name) {
+            return null;
+        }
+
+        public void setMetaData(String name,
+                                Object value) {
+        }
+
+        public String getURL() {
+            return null;
+        }
+
+        public void setURL(String url) {
+        }
+
+		public String[] getGlobalNames() {
+			return null;
+		}
+
+		public Map<String, String> getGlobals() {
+			return null;
+		}
+
+		public List<String> getImports() {
+			return null;
+		}
+
+		public void setGlobals(Map<String, String> globals) {
+		}
+
+		public void setImports(List<String> imports) {
+		}
+
+		public List<String> getFunctionImports() {
+			// TODO Auto-generated method stub
+			return null;
+		}
+
+		public void setFunctionImports(List<String> functionImports) {
+			// TODO Auto-generated method stub
+			
+		}
+
+    }
+
+    class MockActivation
+        implements
+        Activation {
+        private Rule               rule;
+        private int                salience;
+        private final GroupElement subrule;
+        private Tuple              tuple;
+
+        public MockActivation(final Rule rule,
+                              int salience,
+                              final GroupElement subrule,
+                              final Tuple tuple) {
+            this.rule = rule;
+            this.salience = salience;
+            this.tuple = tuple;
+            this.subrule = subrule;
+        }
+
+        public Rule getRule() {
+            return this.rule;
+        }
+
+        public int getSalience() {
+            return this.salience;
+        }
+
+        public Tuple getTuple() {
+            return this.tuple;
+        }
+
+        public PropagationContext getPropagationContext() {
+            return null;
+        }
+
+        public long getActivationNumber() {
+            return 0;
+        }
+
+        public void remove() {
+        }
+
+        public void addLogicalDependency(final LogicalDependency node) {
+        }
+
+        public LinkedList getLogicalDependencies() {
+            return null;
+        }
+
+        public boolean isActivated() {
+            return false;
+        }
+
+        public void setActivated(final boolean activated) {
+        }
+
+        public ActivationGroupNode getActivationGroupNode() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public void setActivationGroupNode(final ActivationGroupNode activationGroupNode) {
+            // TODO Auto-generated method stub
+
+        }
+
+        public GroupElement getSubRule() {
+            return this.subrule;
+        }
+
+        public AgendaGroup getAgendaGroup() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public RuleFlowGroupNode getRuleFlowGroupNode() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public void setRuleFlowGroupNode(final RuleFlowGroupNode ruleFlowGroupNode) {
+            // TODO Auto-generated method stub
+
+        }
+
+        public void setLogicalDependencies(LinkedList justified) {
+            // TODO Auto-generated method stub
+
+        }
+
+        public Collection<FactHandle> getFactHandles() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    }
+
+    class MockTuple
+        implements
+        Tuple {
+        private Map declarations;
+
+        public MockTuple(final Map declarations) {
+            this.declarations = declarations;
+        }
+
+        public InternalFactHandle get(final int patern) {
+            return null;
+        }
+
+        public InternalFactHandle get(final Declaration declaration) {
+            return (InternalFactHandle) this.declarations.get( declaration );
+        }
+
+        public InternalFactHandle[] getFactHandles() {
+            return (InternalFactHandle[]) this.declarations.values().toArray( new FactHandle[0] );
+        }
+
+        public boolean dependsOn(final FactHandle handle) {
+            return false;
+        }
+
+        public void setActivation(final Activation activation) {
+        }
+
+        public long getRecency() {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int size() {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java	2008-11-12 11:08:25 UTC (rev 23835)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java	2008-11-12 15:24:47 UTC (rev 23836)
@@ -1,1063 +1,1155 @@
-package org.drools.integrationtests;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.drools.Alarm;
-import org.drools.Cell;
-import org.drools.Cheese;
-import org.drools.FactHandle;
-import org.drools.Message;
-import org.drools.Neighbor;
-import org.drools.Person;
-import org.drools.PersonInterface;
-import org.drools.RuleBase;
-import org.drools.RuleBaseConfiguration;
-import org.drools.RuleBaseFactory;
-import org.drools.StatefulSession;
-import org.drools.WorkingMemory;
-import org.drools.common.DefaultAgenda;
-import org.drools.common.InternalWorkingMemoryActions;
-import org.drools.common.RuleFlowGroupImpl;
-import org.drools.compiler.DrlParser;
-import org.drools.compiler.DroolsParserException;
-import org.drools.compiler.PackageBuilder;
-import org.drools.compiler.PackageBuilder.PackageMergeException;
-import org.drools.event.ActivationCancelledEvent;
-import org.drools.event.ActivationCreatedEvent;
-import org.drools.event.AgendaEventListener;
-import org.drools.event.DefaultAgendaEventListener;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.rule.Package;
-import org.drools.spi.Activation;
-import org.drools.spi.ActivationGroup;
-import org.drools.spi.AgendaGroup;
-
-public class ExecutionFlowControlTest extends TestCase {
-    protected RuleBase getRuleBase() throws Exception {
-
-        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
-                                            null );
-    }
-
-    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
-
-        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
-                                            config );
-    }
-
-    public void testRuleFlowConstraintDialects() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ConstraintDialects.rfm" ) ) );
-
-        System.err.print( builder.getErrors() );
-
-        assertEquals( 0, builder.getErrors().getErrors().length );
-
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-
-        StatefulSession session = ruleBase.newStatefulSession();
-        List inList = new ArrayList();
-        List outList = new ArrayList();
-        session.setGlobal( "inList", inList );
-        session.setGlobal( "outList", outList );
-
-        inList.add( 1 );
-        inList.add( 3 );
-        inList.add( 6 );
-        inList.add( 25 );
-
-        FactHandle handle = session.insert( inList );
-        session.startProcess( "ConstraintDialects" );
-        assertEquals( 4, outList.size() );
-        assertEquals( "MVELCodeConstraint was here", outList.get( 0 ));
-        assertEquals( "JavaCodeConstraint was here", outList.get( 1 ));
-        assertEquals( "MVELRuleConstraint was here", outList.get( 2 ));
-        assertEquals( "JavaRuleConstraint was here", outList.get( 3 ));
-
-        outList.clear();
-        inList.remove( new Integer( 1 ) );
-        session.update( handle, inList );
-        session.startProcess( "ConstraintDialects" );
-        assertEquals( 3, outList.size() );
-        assertEquals( "JavaCodeConstraint was here", outList.get( 0 ));
-        assertEquals( "MVELRuleConstraint was here", outList.get( 1 ));
-        assertEquals( "JavaRuleConstraint was here", outList.get( 2 ));
-
-        outList.clear();
-        inList.remove( new Integer( 6 ) );
-        session.update( handle, inList );
-        session.startProcess( "ConstraintDialects" );
-        assertEquals( 2, outList.size() );
-        assertEquals( "JavaCodeConstraint was here", outList.get( 0 ));
-        assertEquals( "JavaRuleConstraint was here", outList.get( 1 ));
-
-        outList.clear();
-        inList.remove( new Integer( 3 ) );
-        session.update( handle, inList );
-        session.startProcess( "ConstraintDialects" );
-        assertEquals( 1, outList.size() );
-        assertEquals( "JavaRuleConstraint was here", outList.get( 0 ));
-
-        outList.clear();
-        inList.remove( new Integer( 25 ) );
-        session.update( handle, inList );
-        try {
-            session.startProcess( "ConstraintDialects" );
-            fail("This should have thrown an exception" );
-        } catch ( Exception e ) {
-        }
-    }
-
-    public void testSalienceInteger() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_salienceIntegerRule.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final PersonInterface person = new Person( "Edson",
-                                                   "cheese" );
-        workingMemory.insert( person );
-
-        workingMemory.fireAllRules();
-
-        Assert.assertEquals( "Two rules should have been fired",
-                             2,
-                             list.size() );
-        Assert.assertEquals( "Rule 3 should have been fired first",
-                             "Rule 3",
-                             list.get( 0 ) );
-        Assert.assertEquals( "Rule 2 should have been fired second",
-                             "Rule 2",
-                             list.get( 1 ) );
-    }
-     
-    public void testSalienceExpression() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_salienceExpressionRule.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final PersonInterface person10 = new Person( "bob",
-                                                   "cheese",
-                                                   10);
-        workingMemory.insert( person10 );
-        
-        final PersonInterface person20 = new Person( "mic",
-                                                     "cheese",
-                                                     20);
-          workingMemory.insert( person20 );        
-
-        workingMemory.fireAllRules();
-
-        Assert.assertEquals( "Two rules should have been fired",
-                             2,
-                             list.size() );
-        Assert.assertEquals( "Rule 3 should have been fired first",
-                             "Rule 3",
-                             list.get( 0 ) );
-        Assert.assertEquals( "Rule 2 should have been fired second",
-                             "Rule 2",
-                             list.get( 1 ) );
-    }    
-
-    public void testNoLoop() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "no-loop.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        Assert.assertEquals( "Should not loop  and thus size should be 1",
-                             1,
-                             list.size() );
-
-    }
-
-    public void testLockOnActive() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LockOnActive.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        // AgendaGroup "group1" is not active, so should receive activation
-        final Cheese brie12 = new Cheese( "brie",
-                                          12 );
-        workingMemory.insert( brie12 );
-        DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
-        final AgendaGroup group1 = agenda.getAgendaGroup( "group1" );
-        assertEquals( 1,
-                      group1.size() );
-
-        workingMemory.setFocus( "group1" );
-        // AgendaqGroup "group1" is now active, so should not receive activations
-        final Cheese brie10 = new Cheese( "brie",
-                                          10 );
-        workingMemory.insert( brie10 );
-        assertEquals( 1,
-                      group1.size() );
-
-        final Cheese cheddar20 = new Cheese( "cheddar",
-                                             20 );
-        workingMemory.insert( cheddar20 );
-        final AgendaGroup group2 = agenda.getAgendaGroup( "group1" );
-        assertEquals( 1,
-                      group2.size() );
-
-        final RuleFlowGroupImpl rfg = (RuleFlowGroupImpl) agenda.getRuleFlowGroup( "ruleflow2" );
-        rfg.setActive( true );
-        final Cheese cheddar17 = new Cheese( "cheddar",
-                                             17 );
-        workingMemory.insert( cheddar17 );
-        assertEquals( 1,
-                      group2.size() );
-    }
-
-    public void testLockOnActiveWithModify() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LockOnActiveWithUpdate.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory wm = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        wm.setGlobal( "list",
-                      list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        13 );
-
-        final Person bob = new Person( "bob" );
-        bob.setCheese( brie );
-
-        final Person mic = new Person( "mic" );
-        mic.setCheese( brie );
-
-        final Person mark = new Person( "mark" );
-        mark.setCheese( brie );
-
-        final FactHandle brieHandle = wm.insert( brie );
-        wm.insert( bob );
-        wm.insert( mic );
-        wm.insert( mark );
-
-        final DefaultAgenda agenda = (DefaultAgenda) wm.getAgenda();
-        final AgendaGroup group1 = agenda.getAgendaGroup( "group1" );
-        agenda.setFocus( group1 );
-        assertEquals( 3,
-                      group1.size() );
-        agenda.fireNextItem( null );
-        assertEquals( 2,
-                      group1.size() );
-        wm.update( brieHandle,
-                         brie );
-        assertEquals( 2,
-                      group1.size() );
-
-        AgendaGroup group2 = agenda.getAgendaGroup( "group2" );
-        agenda.setFocus( group2 );
-
-        RuleFlowGroupImpl rfg = (RuleFlowGroupImpl) ((DefaultAgenda)wm.getAgenda()).getRuleFlowGroup( "ruleflow2" );
-        assertEquals( 3,
-                      rfg.size() );
-
-        agenda.activateRuleFlowGroup( "ruleflow2" );
-        agenda.fireNextItem( null );
-        assertEquals( 2,
-                      rfg.size() );
-        wm.update( brieHandle,
-                         brie );
-        assertEquals( 2,
-                      group2.size() );
-    }
-
-    public void testLockOnActiveWithModify2() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LockOnActiveWithModify.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final StatefulSession session = ruleBase.newStatefulSession();
-//        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
-//        logger.setFileName( "conway" );
-
-        // populating working memory
-        final int size = 3;
-        
-        Cell[][] cells = new Cell[size][];
-        FactHandle[][] handles = new FactHandle[size][];
-        for( int row = 0; row < size; row++ ) {
-            cells[row] = new Cell[size];
-            handles[row] = new FactHandle[size];
-            for( int col = 0; col < size; col++ ) {
-                cells[row][col] = new Cell(Cell.DEAD, row, col);
-                handles[row][col] = session.insert( cells[row][col] );
-                if( row >= 1 && col >=1 ) {
-                    // northwest
-                    session.insert( new Neighbor( cells[row-1][col-1], cells[row][col] ) );
-                    session.insert( new Neighbor( cells[row][col], cells[row-1][col-1] ) );
-                }
-                if( row >= 1 ) {
-                    // north
-                    session.insert( new Neighbor( cells[row-1][col], cells[row][col] ) );
-                    session.insert( new Neighbor( cells[row][col], cells[row-1][col] ) );
-                }
-                if( row >= 1 && col < (size-1) ) {
-                    // northeast
-                    session.insert( new Neighbor( cells[row-1][col+1], cells[row][col] ) );
-                    session.insert( new Neighbor( cells[row][col], cells[row-1][col+1] ) );
-                }
-                if( col >= 1 ) {
-                    // west
-                    session.insert( new Neighbor( cells[row][col-1], cells[row][col] ) );
-                    session.insert( new Neighbor( cells[row][col], cells[row][col-1] ) );
-                }
-            }
-        }
-
-        session.clearAgendaGroup( "calculate" );
-        
-        // now, start playing
-        int fired = session.fireAllRules(100);
-        assertEquals( 0, fired );
-
-        session.setFocus( "calculate" );
-        fired = session.fireAllRules(100);
-//        logger.writeToDisk();
-        assertEquals( 0, fired );
-        assertEquals( "MAIN", session.getAgenda().getFocusName() );
-        
-        // on the fifth day God created the birds and sea creatures
-        session.modifyRetract( handles[0][0] );
-        cells[0][0].setState( Cell.LIVE );
-        session.modifyInsert( handles[0][0], cells[0][0] );
-        session.setFocus( "birth" );
-        session.setFocus( "calculate" );
-        fired = session.fireAllRules(100);
-        
-//        logger.writeToDisk();
-        int[][] expected = new int[][]{{0,1,0},{1,1,0},{0,0,0}};
-        assertEqualsMatrix( size,
-                            cells,
-                            expected );
-        assertEquals( "MAIN", session.getAgenda().getFocusName() );
-        
-        // on the sixth day God created the animals that walk over the land and the Man
-        session.modifyRetract( handles[1][1] );
-        cells[1][1].setState( Cell.LIVE );
-        session.modifyInsert( handles[1][1], cells[1][1] );
-        session.setFocus( "calculate" );
-        session.fireAllRules(100);
-//        logger.writeToDisk();
-        
-        expected = new int[][]{{1,2,1},{2,1,1},{1,1,1}};
-        assertEqualsMatrix( size,
-                            cells,
-                            expected );
-        assertEquals( "MAIN", session.getAgenda().getFocusName() );
-        
-        session.setFocus( "birth" );
-        session.fireAllRules(100);
-        expected = new int[][]{{1,2,1},{2,1,1},{1,1,1}};
-        assertEqualsMatrix( size,
-                            cells,
-                            expected );
-        assertEquals( "MAIN", session.getAgenda().getFocusName() );
-
-        session.setFocus( "calculate" );
-        session.fireAllRules(100);
-//        logger.writeToDisk();
-//        printMatrix( cells );
-        
-        expected = new int[][]{{3,3,2},{3,3,2},{2,2,1}};
-        assertEqualsMatrix( size,
-                            cells,
-                            expected );
-        assertEquals( "MAIN", session.getAgenda().getFocusName() );
-
-        // on the seventh day, while God rested, man start killing them all
-        session.modifyRetract( handles[0][0] );
-        cells[0][0].setState( Cell.DEAD );
-        session.modifyInsert( handles[0][0], cells[0][0] );
-        session.setFocus( "calculate" );
-        session.fireAllRules(100);
-        
-        expected = new int[][]{{3,2,2},{2,2,2},{2,2,1}};
-        assertEqualsMatrix( size,
-                            cells,
-                            expected );
-        assertEquals( "MAIN", session.getAgenda().getFocusName() );
-        
-    }
-
-//    private void printMatrix(Cell[][] cells) {
-//        System.out.println("----------");
-//        for( int row = 0; row < cells.length; row++) {
-//            for( int col = 0; col < cells[row].length; col++ ) {
-//                System.out.print( cells[row][col].getValue() + ((cells[row][col].getState()==Cell.LIVE)?"L  ":".  ") );
-//            }
-//            System.out.println();
-//        }
-//        System.out.println("----------");
-//    }
-
-    private void assertEqualsMatrix(final int size,
-                                    Cell[][] cells,
-                                    int[][] expected) {
-        for( int row = 0; row < size; row++) {
-            for( int col = 0; col < size; col++ ) {
-                assertEquals( "Wrong value at "+row+","+col+": ", expected[row][col], cells[row][col].getValue() );
-            }
-        }
-    }
-
-    public void testAgendaGroups() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_AgendaGroups.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        assertEquals( 7,
-                      list.size() );
-
-        assertEquals( "group3",
-                      list.get( 0 ) );
-        assertEquals( "group4",
-                      list.get( 1 ) );
-        assertEquals( "group3",
-                      list.get( 2 ) );
-        assertEquals( "MAIN",
-                      list.get( 3 ) );
-        assertEquals( "group1",
-                      list.get( 4 ) );
-        assertEquals( "group1",
-                      list.get( 5 ) );
-        assertEquals( "MAIN",
-                      list.get( 6 ) );
-
-        workingMemory.setFocus( "group2" );
-        workingMemory.fireAllRules();
-
-        assertEquals( 8,
-                      list.size() );
-        assertEquals( "group2",
-                      list.get( 7 ) );
-    }
-
-    public void testActivationGroups() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ActivationGroups.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        workingMemory.insert( brie );
-
-        DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
-        final ActivationGroup activationGroup0 = agenda.getActivationGroup( "activation-group-0" );
-        assertEquals( 2,
-                      activationGroup0.size() );
-
-        final ActivationGroup activationGroup3 = agenda.getActivationGroup( "activation-group-3" );
-        assertEquals( 1,
-                      activationGroup3.size() );
-
-        final AgendaGroup agendaGroup3 = agenda.getAgendaGroup( "agenda-group-3" );
-        assertEquals( 1,
-                      agendaGroup3.size() );
-
-        final AgendaGroup agendaGroupMain = agenda.getAgendaGroup( "MAIN" );
-        assertEquals( 3,
-                      agendaGroupMain.size() );
-
-        workingMemory.clearAgendaGroup( "agenda-group-3" );
-        assertEquals( 0,
-                      activationGroup3.size() );
-        assertEquals( 0,
-                      agendaGroup3.size() );
-
-        workingMemory.fireAllRules();
-
-        assertEquals( 0,
-                      activationGroup0.size() );
-
-        assertEquals( 2,
-                      list.size() );
-        assertEquals( "rule0",
-                      list.get( 0 ) );
-        assertEquals( "rule2",
-                      list.get( 1 ) );
-
-    }
-
-    public void testDuration() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 0,
-                      list.size() );
-
-        // sleep for 300ms
-        Thread.sleep( 300 );
-
-        // now check for update
-        assertEquals( 1,
-                      list.size() );
-
-    }
-
-    public void testInsertRetractNoloop() throws Exception {
-        // read in the source
-        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Insert_Retract_Noloop.drl" ) );
-        RuleBase ruleBase = loadRuleBase( reader );
-
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory wm = ruleBase.newStatefulSession();
-        wm.insert( new Cheese( "stilton",
-                                     15 ) );
-
-        wm.fireAllRules();
-    }
-
-    public void testDurationWithNoLoop() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration_with_NoLoop.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 0,
-                      list.size() );
-
-        // sleep for 300ms
-        Thread.sleep( 300 );
-
-        // now check for update
-        assertEquals( 1,
-                      list.size() );
-    }
-    
-    public void testDurationMemoryLeakonRepeatedUpdate() throws Exception {
-        String str = "package org.drools.test\n" +
-        "import org.drools.Alarm\n" +
-        "global java.util.List list;" +
-        "rule \"COMPTEUR\"\n" +
-        "  duration 50\n" +
-        "  when\n" +        
-        "    $alarm : Alarm( number < 5 )\n" +
-        "  then\n" +
-        "    $alarm.incrementNumber();\n" +
-        "    list.add( $alarm );\n" +
-        "    update($alarm);\n" +
-        "end\n";
-        
-        PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( str ) );
-        
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-        
-        StatefulSession session = ruleBase.newStatefulSession();
-        List list = new ArrayList();
-        session.setGlobal( "list", list );
-        session.insert( new Alarm() );
-        
-        session.fireAllRules();
-        
-        Thread.sleep( 1000 );
-        
-        assertEquals( 5, list.size() );
-        assertEquals(0, session.getAgenda().getScheduledActivations().length );                        
-    }    
-
-    public void testFireRuleAfterDuration() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FireRuleAfterDuration.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 0,
-                      list.size() );
-
-        // sleep for 300ms
-        Thread.sleep( 300 );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 2,
-                      list.size() );
-
-    }
-
-    public void testUpdateNoLoop() throws Exception {
-        // JBRULES-780, throws a NullPointer or infinite loop if there is an issue
-        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_UpdateNoloop.drl" ) );
-        RuleBase ruleBase = loadRuleBase( reader );
-
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final WorkingMemory wm = ruleBase.newStatefulSession();
-        wm.insert( new Cheese( "stilton",
-                                     15 ) );
-
-        wm.fireAllRules();
-    }
-
-    public void testUpdateActivationCreationNoLoop() throws Exception {
-        // JBRULES-787, no-loop blocks all dependant tuples for update 
-        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_UpdateActivationCreationNoLoop.drl" ) );
-        RuleBase ruleBase = loadRuleBase( reader );
-
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-        final InternalWorkingMemoryActions wm = (InternalWorkingMemoryActions) ruleBase.newStatefulSession();
-        final List created = new ArrayList();
-        final List cancelled = new ArrayList();
-        final AgendaEventListener l = new DefaultAgendaEventListener() {
-            public void activationCreated(ActivationCreatedEvent event,
-                                          WorkingMemory workingMemory) {
-                created.add( event );
-            }
-
-            public void activationCancelled(ActivationCancelledEvent event,
-                                            WorkingMemory workingMemory) {
-                cancelled.add( event );
-            }
-
-        };
-
-        wm.addEventListener( l );
-
-        final Cheese stilton = new Cheese( "stilton",
-                                           15 );
-        final FactHandle stiltonHandle = wm.insert( stilton );
-
-        final Person p1 = new Person( "p1" );
-        p1.setCheese( stilton );
-        wm.insert( p1 );
-
-        final Person p2 = new Person( "p2" );
-        p2.setCheese( stilton );
-        wm.insert( p2 );
-
-        final Person p3 = new Person( "p3" );
-        p3.setCheese( stilton );
-        wm.insert( p3 );
-
-        assertEquals( 3,
-                      created.size() );
-        assertEquals( 0,
-                      cancelled.size() );
-
-        final Activation item = ((ActivationCreatedEvent) created.get( 2 )).getActivation();
-
-        // simulate a modify inside a consequence
-        wm.update( stiltonHandle,
-                         stilton,
-                         item.getRule(),
-                         item );
-
-        // the two of the three tuples should re-activate
-        assertEquals( 5,
-                      created.size() );
-        assertEquals( 3,
-                      cancelled.size() );
-    }
-
-    public void testRuleFlowGroup() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflowgroup.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        workingMemory.insert( "Test" );
-        workingMemory.fireAllRules();
-        assertEquals( 0,
-                      list.size() );
-
-        workingMemory.getAgenda().activateRuleFlowGroup( "Group1" );
-        workingMemory.fireAllRules();
-
-        assertEquals( 1,
-                      list.size() );
-    }
-
-    public void testRuleFlow() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
-        final Package pkg = builder.getPackage();
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        workingMemory.fireAllRules();
-        assertEquals( 0,
-                      list.size() );
-
-        final ProcessInstance processInstance = workingMemory.startProcess( "0" );
-        assertEquals( ProcessInstance.STATE_ACTIVE,
-                      processInstance.getState() );
-        workingMemory.fireAllRules();
-        assertEquals( 4,
-                      list.size() );
-        assertEquals( "Rule1",
-                      list.get( 0 ) );
-        assertEquals( "Rule3",
-                      list.get( 1 ) );
-        assertEquals( "Rule2",
-                      list.get( 2 ) );
-        assertEquals( "Rule4",
-                      list.get( 3 ) );
-        assertEquals( ProcessInstance.STATE_COMPLETED,
-                      processInstance.getState() );
-    }
-    
-    public void testRuleFlowClear() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ruleflowClear.drl" ) ) );
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ruleflowClear.rfm" ) ) );
-        final Package pkg = builder.getPackage();
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-        
-        final List activations = new ArrayList();
-        AgendaEventListener listener = new DefaultAgendaEventListener() {            
-            public void activationCancelled(ActivationCancelledEvent event,
-                                            WorkingMemory workingMemory) {
-                activations.add( event.getActivation() );
-            }
-        };
-        
-        workingMemory.addEventListener( listener );
-        DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda(); 
-        assertEquals( 0 , agenda.getRuleFlowGroup( "flowgroup-1" ).size() );
-        
-        // We need to call fireAllRules here to get the InitialFact into the system, to the eval(true)'s kick in
-        workingMemory.fireAllRules();
-        
-        // Now we have 4 in the RuleFlow, but not yet in the agenda
-        assertEquals( 4 , agenda.getRuleFlowGroup( "flowgroup-1" ).size() );
-        
-        // Check they aren't in the Agenda
-        assertEquals( 0, agenda.getAgendaGroup( "MAIN" ).size() );
-        
-        // Start the process, which shoudl populate the Agenda
-        final ProcessInstance processInstance = workingMemory.startProcess( "ruleFlowClear" );
-        assertEquals( 4, agenda.getAgendaGroup( "MAIN" ).size() );
-        
-        
-        // Check we have 0 activation cancellation events
-        assertEquals( 0, activations.size() );
-        
-        workingMemory.getAgenda().clearAndCancelRuleFlowGroup( "flowgroup-1" );
-        
-        // Check the AgendaGroup and RuleFlowGroup  are now empty
-        assertEquals( 0, agenda.getAgendaGroup( "MAIN" ).size() );
-        assertEquals( 0 , agenda.getRuleFlowGroup( "flowgroup-1" ).size() );
-        
-        // Check we have four activation cancellation events
-        assertEquals( 4, activations.size() );              
-    }
-    
-    public void testRuleFlowInPackage() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        workingMemory.fireAllRules();
-        assertEquals( 0,
-                      list.size() );
-
-        final ProcessInstance processInstance = workingMemory.startProcess( "0" );
-        assertEquals( ProcessInstance.STATE_ACTIVE,
-                      processInstance.getState() );
-        workingMemory.fireAllRules();
-        assertEquals( 4,
-                      list.size() );
-        assertEquals( "Rule1",
-                      list.get( 0 ) );
-        assertEquals( "Rule3",
-                      list.get( 1 ) );
-        assertEquals( "Rule2",
-                      list.get( 2 ) );
-        assertEquals( "Rule4",
-                      list.get( 3 ) );
-        assertEquals( ProcessInstance.STATE_COMPLETED,
-                      processInstance.getState() );
-        
-    }
-    
-    public void testLoadingRuleFlowInPackage1() throws Exception {
-    	// adding ruleflow before adding package
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
-        builder.getPackage();
-    }
-
-    public void testLoadingRuleFlowInPackage2() throws Exception {
-    	// only adding ruleflow
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
-        builder.getPackage();
-    }
-
-    public void testLoadingRuleFlowInPackage3() throws Exception {
-    	// only adding ruleflow without any generated rules
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
-        builder.getPackage();
-    }
-
-    public void FIXME_testLoadingRuleFlowInPackage4() throws Exception {
-    	// adding ruleflows of different package
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
-        try {
-        	builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
-        	throw new Exception("An exception should have been thrown.");
-        } catch (PackageMergeException e) {
-        	// do nothing
-        }
-    }
-
-    public void FIXME_testLoadingRuleFlowInPackage5() throws Exception {
-    	// adding ruleflow of different package than rules
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
-        try {
-        	builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
-        	throw new Exception("An exception should have been thrown.");
-        } catch (PackageMergeException e) {
-        	// do nothing
-        }
-    }
-
-    public void FIXME_testLoadingRuleFlowInPackage6() throws Exception {
-    	// adding rules of different package than ruleflow
-        final PackageBuilder builder = new PackageBuilder();
-    	builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
-        try {
-            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
-        	throw new Exception("An exception should have been thrown.");
-        } catch (PackageMergeException e) {
-        	// do nothing
-        }
-    }
-    
-    public void testRuleFlowActionDialects() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ActionDialects.rfm" ) ) ); 
-        
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-        ruleBase = SerializationHelper.serializeObject(ruleBase);
-
-        StatefulSession session = ruleBase.newStatefulSession();
-        List list = new ArrayList();
-        session.setGlobal( "list", list );
-        
-        session.startProcess( "ActionDialects" );
-        
-        assertEquals( 2, list.size() );
-        assertEquals( "mvel was here", list.get( 0 ) );
-        assertEquals( "java was here", list.get( 1 ) );
-    }
-    
-    public void testLoadingRuleFlowInPackage7() throws Exception {
-    	// loading a ruleflow with errors
-        final PackageBuilder builder = new PackageBuilder();
-    	builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "error_ruleflow.rfm" ) ) );
-    	assertEquals(1, builder.getErrors().getErrors().length);
-    }
-
-    private RuleBase loadRuleBase(final Reader reader) throws IOException,
-                                                      DroolsParserException,
-                                                      Exception {
-        final DrlParser parser = new DrlParser();
-        final PackageDescr packageDescr = parser.parse( reader );
-        if ( parser.hasErrors() ) {
-            Assert.fail( "Error messages in parser, need to sort this our (or else collect error messages)" );
-        }
-        // pre build the package
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackage( packageDescr );
-        final Package pkg = builder.getPackage();
-
-        // add the package to a rulebase
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        // load up the rulebase
-        return ruleBase;
-    }
-
-    public void testDateEffective() throws Exception {
-        // read in the source
-        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_EffectiveDate.drl" ) );
-        RuleBase ruleBase = loadRuleBase( reader );
-        ruleBase    = SerializationHelper.serializeObject(ruleBase);
-
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        // go !
-        final Message message = new Message( "hola" );
-        workingMemory.insert( message );
-        workingMemory.fireAllRules();
-        assertFalse( message.isFired() );
-
-    }    
-}
+package org.drools.integrationtests;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.drools.Alarm;
+import org.drools.Cell;
+import org.drools.Cheese;
+import org.drools.FactHandle;
+import org.drools.Message;
+import org.drools.Neighbor;
+import org.drools.Person;
+import org.drools.PersonInterface;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.WorkingMemory;
+import org.drools.common.DefaultAgenda;
+import org.drools.common.InternalWorkingMemoryActions;
+import org.drools.common.RuleFlowGroupImpl;
+import org.drools.compiler.DrlParser;
+import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.PackageBuilder.PackageMergeException;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.ActivationCreatedEvent;
+import org.drools.event.AgendaEventListener;
+import org.drools.event.DefaultAgendaEventListener;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.rule.Package;
+import org.drools.spi.Activation;
+import org.drools.spi.ActivationGroup;
+import org.drools.spi.AgendaGroup;
+
+public class ExecutionFlowControlTest extends TestCase {
+    protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+
+    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+
+    public void testRuleFlowConstraintDialects() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ConstraintDialects.rfm" ) ) );
+
+        System.err.print( builder.getErrors() );
+
+        assertEquals( 0,
+                      builder.getErrors().getErrors().length );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List inList = new ArrayList();
+        List outList = new ArrayList();
+        session.setGlobal( "inList",
+                           inList );
+        session.setGlobal( "outList",
+                           outList );
+
+        inList.add( 1 );
+        inList.add( 3 );
+        inList.add( 6 );
+        inList.add( 25 );
+
+        FactHandle handle = session.insert( inList );
+        session.startProcess( "ConstraintDialects" );
+        assertEquals( 4,
+                      outList.size() );
+        assertEquals( "MVELCodeConstraint was here",
+                      outList.get( 0 ) );
+        assertEquals( "JavaCodeConstraint was here",
+                      outList.get( 1 ) );
+        assertEquals( "MVELRuleConstraint was here",
+                      outList.get( 2 ) );
+        assertEquals( "JavaRuleConstraint was here",
+                      outList.get( 3 ) );
+
+        outList.clear();
+        inList.remove( new Integer( 1 ) );
+        session.update( handle,
+                        inList );
+        session.startProcess( "ConstraintDialects" );
+        assertEquals( 3,
+                      outList.size() );
+        assertEquals( "JavaCodeConstraint was here",
+                      outList.get( 0 ) );
+        assertEquals( "MVELRuleConstraint was here",
+                      outList.get( 1 ) );
+        assertEquals( "JavaRuleConstraint was here",
+                      outList.get( 2 ) );
+
+        outList.clear();
+        inList.remove( new Integer( 6 ) );
+        session.update( handle,
+                        inList );
+        session.startProcess( "ConstraintDialects" );
+        assertEquals( 2,
+                      outList.size() );
+        assertEquals( "JavaCodeConstraint was here",
+                      outList.get( 0 ) );
+        assertEquals( "JavaRuleConstraint was here",
+                      outList.get( 1 ) );
+
+        outList.clear();
+        inList.remove( new Integer( 3 ) );
+        session.update( handle,
+                        inList );
+        session.startProcess( "ConstraintDialects" );
+        assertEquals( 1,
+                      outList.size() );
+        assertEquals( "JavaRuleConstraint was here",
+                      outList.get( 0 ) );
+
+        outList.clear();
+        inList.remove( new Integer( 25 ) );
+        session.update( handle,
+                        inList );
+        try {
+            session.startProcess( "ConstraintDialects" );
+            fail( "This should have thrown an exception" );
+        } catch ( Exception e ) {
+        }
+    }
+
+    public void testSalienceInteger() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_salienceIntegerRule.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final PersonInterface person = new Person( "Edson",
+                                                   "cheese" );
+        workingMemory.insert( person );
+
+        workingMemory.fireAllRules();
+
+        Assert.assertEquals( "Two rules should have been fired",
+                             2,
+                             list.size() );
+        Assert.assertEquals( "Rule 3 should have been fired first",
+                             "Rule 3",
+                             list.get( 0 ) );
+        Assert.assertEquals( "Rule 2 should have been fired second",
+                             "Rule 2",
+                             list.get( 1 ) );
+    }
+
+    public void testSalienceExpression() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_salienceExpressionRule.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final PersonInterface person10 = new Person( "bob",
+                                                     "cheese",
+                                                     10 );
+        workingMemory.insert( person10 );
+
+        final PersonInterface person20 = new Person( "mic",
+                                                     "cheese",
+                                                     20 );
+        workingMemory.insert( person20 );
+
+        workingMemory.fireAllRules();
+
+        Assert.assertEquals( "Two rules should have been fired",
+                             2,
+                             list.size() );
+        Assert.assertEquals( "Rule 3 should have been fired first",
+                             "Rule 3",
+                             list.get( 0 ) );
+        Assert.assertEquals( "Rule 2 should have been fired second",
+                             "Rule 2",
+                             list.get( 1 ) );
+    }
+
+    public void testNoLoop() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "no-loop.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        Assert.assertEquals( "Should not loop  and thus size should be 1",
+                             1,
+                             list.size() );
+
+    }
+
+    public void testLockOnActive() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LockOnActive.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        // AgendaGroup "group1" is not active, so should receive activation
+        final Cheese brie12 = new Cheese( "brie",
+                                          12 );
+        workingMemory.insert( brie12 );
+        DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
+        final AgendaGroup group1 = agenda.getAgendaGroup( "group1" );
+        assertEquals( 1,
+                      group1.size() );
+
+        workingMemory.setFocus( "group1" );
+        // AgendaqGroup "group1" is now active, so should not receive activations
+        final Cheese brie10 = new Cheese( "brie",
+                                          10 );
+        workingMemory.insert( brie10 );
+        assertEquals( 1,
+                      group1.size() );
+
+        final Cheese cheddar20 = new Cheese( "cheddar",
+                                             20 );
+        workingMemory.insert( cheddar20 );
+        final AgendaGroup group2 = agenda.getAgendaGroup( "group1" );
+        assertEquals( 1,
+                      group2.size() );
+
+        final RuleFlowGroupImpl rfg = (RuleFlowGroupImpl) agenda.getRuleFlowGroup( "ruleflow2" );
+        rfg.setActive( true );
+        final Cheese cheddar17 = new Cheese( "cheddar",
+                                             17 );
+        workingMemory.insert( cheddar17 );
+        assertEquals( 1,
+                      group2.size() );
+    }
+
+    public void testLockOnActiveWithModify() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LockOnActiveWithUpdate.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory wm = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        wm.setGlobal( "list",
+                      list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        13 );
+
+        final Person bob = new Person( "bob" );
+        bob.setCheese( brie );
+
+        final Person mic = new Person( "mic" );
+        mic.setCheese( brie );
+
+        final Person mark = new Person( "mark" );
+        mark.setCheese( brie );
+
+        final FactHandle brieHandle = wm.insert( brie );
+        wm.insert( bob );
+        wm.insert( mic );
+        wm.insert( mark );
+
+        final DefaultAgenda agenda = (DefaultAgenda) wm.getAgenda();
+        final AgendaGroup group1 = agenda.getAgendaGroup( "group1" );
+        agenda.setFocus( group1 );
+        assertEquals( 3,
+                      group1.size() );
+        agenda.fireNextItem( null );
+        assertEquals( 2,
+                      group1.size() );
+        wm.update( brieHandle,
+                   brie );
+        assertEquals( 2,
+                      group1.size() );
+
+        AgendaGroup group2 = agenda.getAgendaGroup( "group2" );
+        agenda.setFocus( group2 );
+
+        RuleFlowGroupImpl rfg = (RuleFlowGroupImpl) ((DefaultAgenda) wm.getAgenda()).getRuleFlowGroup( "ruleflow2" );
+        assertEquals( 3,
+                      rfg.size() );
+
+        agenda.activateRuleFlowGroup( "ruleflow2" );
+        agenda.fireNextItem( null );
+        assertEquals( 2,
+                      rfg.size() );
+        wm.update( brieHandle,
+                   brie );
+        assertEquals( 2,
+                      group2.size() );
+    }
+
+    public void testLockOnActiveWithModify2() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LockOnActiveWithModify.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final StatefulSession session = ruleBase.newStatefulSession();
+        //        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
+        //        logger.setFileName( "conway" );
+
+        // populating working memory
+        final int size = 3;
+
+        Cell[][] cells = new Cell[size][];
+        FactHandle[][] handles = new FactHandle[size][];
+        for ( int row = 0; row < size; row++ ) {
+            cells[row] = new Cell[size];
+            handles[row] = new FactHandle[size];
+            for ( int col = 0; col < size; col++ ) {
+                cells[row][col] = new Cell( Cell.DEAD,
+                                            row,
+                                            col );
+                handles[row][col] = session.insert( cells[row][col] );
+                if ( row >= 1 && col >= 1 ) {
+                    // northwest
+                    session.insert( new Neighbor( cells[row - 1][col - 1],
+                                                  cells[row][col] ) );
+                    session.insert( new Neighbor( cells[row][col],
+                                                  cells[row - 1][col - 1] ) );
+                }
+                if ( row >= 1 ) {
+                    // north
+                    session.insert( new Neighbor( cells[row - 1][col],
+                                                  cells[row][col] ) );
+                    session.insert( new Neighbor( cells[row][col],
+                                                  cells[row - 1][col] ) );
+                }
+                if ( row >= 1 && col < (size - 1) ) {
+                    // northeast
+                    session.insert( new Neighbor( cells[row - 1][col + 1],
+                                                  cells[row][col] ) );
+                    session.insert( new Neighbor( cells[row][col],
+                                                  cells[row - 1][col + 1] ) );
+                }
+                if ( col >= 1 ) {
+                    // west
+                    session.insert( new Neighbor( cells[row][col - 1],
+                                                  cells[row][col] ) );
+                    session.insert( new Neighbor( cells[row][col],
+                                                  cells[row][col - 1] ) );
+                }
+            }
+        }
+
+        session.clearAgendaGroup( "calculate" );
+
+        // now, start playing
+        int fired = session.fireAllRules( 100 );
+        assertEquals( 0,
+                      fired );
+
+        session.setFocus( "calculate" );
+        fired = session.fireAllRules( 100 );
+        //        logger.writeToDisk();
+        assertEquals( 0,
+                      fired );
+        assertEquals( "MAIN",
+                      session.getAgenda().getFocusName() );
+
+        // on the fifth day God created the birds and sea creatures
+        session.modifyRetract( handles[0][0] );
+        cells[0][0].setState( Cell.LIVE );
+        session.modifyInsert( handles[0][0],
+                              cells[0][0] );
+        session.setFocus( "birth" );
+        session.setFocus( "calculate" );
+        fired = session.fireAllRules( 100 );
+
+        //        logger.writeToDisk();
+        int[][] expected = new int[][]{{0, 1, 0}, {1, 1, 0}, {0, 0, 0}};
+        assertEqualsMatrix( size,
+                            cells,
+                            expected );
+        assertEquals( "MAIN",
+                      session.getAgenda().getFocusName() );
+
+        // on the sixth day God created the animals that walk over the land and the Man
+        session.modifyRetract( handles[1][1] );
+        cells[1][1].setState( Cell.LIVE );
+        session.modifyInsert( handles[1][1],
+                              cells[1][1] );
+        session.setFocus( "calculate" );
+        session.fireAllRules( 100 );
+        //        logger.writeToDisk();
+
+        expected = new int[][]{{1, 2, 1}, {2, 1, 1}, {1, 1, 1}};
+        assertEqualsMatrix( size,
+                            cells,
+                            expected );
+        assertEquals( "MAIN",
+                      session.getAgenda().getFocusName() );
+
+        session.setFocus( "birth" );
+        session.fireAllRules( 100 );
+        expected = new int[][]{{1, 2, 1}, {2, 1, 1}, {1, 1, 1}};
+        assertEqualsMatrix( size,
+                            cells,
+                            expected );
+        assertEquals( "MAIN",
+                      session.getAgenda().getFocusName() );
+
+        session.setFocus( "calculate" );
+        session.fireAllRules( 100 );
+        //        logger.writeToDisk();
+        //        printMatrix( cells );
+
+        expected = new int[][]{{3, 3, 2}, {3, 3, 2}, {2, 2, 1}};
+        assertEqualsMatrix( size,
+                            cells,
+                            expected );
+        assertEquals( "MAIN",
+                      session.getAgenda().getFocusName() );
+
+        // on the seventh day, while God rested, man start killing them all
+        session.modifyRetract( handles[0][0] );
+        cells[0][0].setState( Cell.DEAD );
+        session.modifyInsert( handles[0][0],
+                              cells[0][0] );
+        session.setFocus( "calculate" );
+        session.fireAllRules( 100 );
+
+        expected = new int[][]{{3, 2, 2}, {2, 2, 2}, {2, 2, 1}};
+        assertEqualsMatrix( size,
+                            cells,
+                            expected );
+        assertEquals( "MAIN",
+                      session.getAgenda().getFocusName() );
+
+    }
+
+    //    private void printMatrix(Cell[][] cells) {
+    //        System.out.println("----------");
+    //        for( int row = 0; row < cells.length; row++) {
+    //            for( int col = 0; col < cells[row].length; col++ ) {
+    //                System.out.print( cells[row][col].getValue() + ((cells[row][col].getState()==Cell.LIVE)?"L  ":".  ") );
+    //            }
+    //            System.out.println();
+    //        }
+    //        System.out.println("----------");
+    //    }
+
+    private void assertEqualsMatrix(final int size,
+                                    Cell[][] cells,
+                                    int[][] expected) {
+        for ( int row = 0; row < size; row++ ) {
+            for ( int col = 0; col < size; col++ ) {
+                assertEquals( "Wrong value at " + row + "," + col + ": ",
+                              expected[row][col],
+                              cells[row][col].getValue() );
+            }
+        }
+    }
+
+    public void testAgendaGroups() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_AgendaGroups.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 7,
+                      list.size() );
+
+        assertEquals( "group3",
+                      list.get( 0 ) );
+        assertEquals( "group4",
+                      list.get( 1 ) );
+        assertEquals( "group3",
+                      list.get( 2 ) );
+        assertEquals( "MAIN",
+                      list.get( 3 ) );
+        assertEquals( "group1",
+                      list.get( 4 ) );
+        assertEquals( "group1",
+                      list.get( 5 ) );
+        assertEquals( "MAIN",
+                      list.get( 6 ) );
+
+        workingMemory.setFocus( "group2" );
+        workingMemory.fireAllRules();
+
+        assertEquals( 8,
+                      list.size() );
+        assertEquals( "group2",
+                      list.get( 7 ) );
+    }
+
+    public void testActivationGroups() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ActivationGroups.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        workingMemory.insert( brie );
+
+        DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
+        final ActivationGroup activationGroup0 = agenda.getActivationGroup( "activation-group-0" );
+        assertEquals( 2,
+                      activationGroup0.size() );
+
+        final ActivationGroup activationGroup3 = agenda.getActivationGroup( "activation-group-3" );
+        assertEquals( 1,
+                      activationGroup3.size() );
+
+        final AgendaGroup agendaGroup3 = agenda.getAgendaGroup( "agenda-group-3" );
+        assertEquals( 1,
+                      agendaGroup3.size() );
+
+        final AgendaGroup agendaGroupMain = agenda.getAgendaGroup( "MAIN" );
+        assertEquals( 3,
+                      agendaGroupMain.size() );
+
+        workingMemory.clearAgendaGroup( "agenda-group-3" );
+        assertEquals( 0,
+                      activationGroup3.size() );
+        assertEquals( 0,
+                      agendaGroup3.size() );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 0,
+                      activationGroup0.size() );
+
+        assertEquals( 2,
+                      list.size() );
+        assertEquals( "rule0",
+                      list.get( 0 ) );
+        assertEquals( "rule2",
+                      list.get( 1 ) );
+
+    }
+
+    public void testDuration() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 0,
+                      list.size() );
+
+        // sleep for 300ms
+        Thread.sleep( 300 );
+
+        // now check for update
+        assertEquals( 1,
+                      list.size() );
+
+    }
+
+    public void testInsertRetractNoloop() throws Exception {
+        // read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Insert_Retract_Noloop.drl" ) );
+        RuleBase ruleBase = loadRuleBase( reader );
+
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory wm = ruleBase.newStatefulSession();
+        wm.insert( new Cheese( "stilton",
+                               15 ) );
+
+        wm.fireAllRules();
+    }
+
+    public void testDurationWithNoLoop() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration_with_NoLoop.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 0,
+                      list.size() );
+
+        // sleep for 300ms
+        Thread.sleep( 300 );
+
+        // now check for update
+        assertEquals( 1,
+                      list.size() );
+    }
+
+    public void testDurationMemoryLeakonRepeatedUpdate() throws Exception {
+        String str = "package org.drools.test\n" + "import org.drools.Alarm\n" + "global java.util.List list;" + "rule \"COMPTEUR\"\n" + "  duration 50\n" + "  when\n" + "    $alarm : Alarm( number < 5 )\n" + "  then\n"
+                     + "    $alarm.incrementNumber();\n" + "    list.add( $alarm );\n" + "    update($alarm);\n" + "end\n";
+
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( str ) );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+        session.insert( new Alarm() );
+
+        session.fireAllRules();
+
+        Thread.sleep( 1000 );
+
+        assertEquals( 5,
+                      list.size() );
+        assertEquals( 0,
+                      session.getAgenda().getScheduledActivations().length );
+    }
+
+    public void testFireRuleAfterDuration() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FireRuleAfterDuration.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 0,
+                      list.size() );
+
+        // sleep for 300ms
+        Thread.sleep( 300 );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 2,
+                      list.size() );
+
+    }
+
+    public void testUpdateNoLoop() throws Exception {
+        // JBRULES-780, throws a NullPointer or infinite loop if there is an issue
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_UpdateNoloop.drl" ) );
+        RuleBase ruleBase = loadRuleBase( reader );
+
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory wm = ruleBase.newStatefulSession();
+        wm.insert( new Cheese( "stilton",
+                               15 ) );
+
+        wm.fireAllRules();
+    }
+
+    public void testUpdateActivationCreationNoLoop() throws Exception {
+        // JBRULES-787, no-loop blocks all dependant tuples for update 
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_UpdateActivationCreationNoLoop.drl" ) );
+        RuleBase ruleBase = loadRuleBase( reader );
+
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final InternalWorkingMemoryActions wm = (InternalWorkingMemoryActions) ruleBase.newStatefulSession();
+        final List created = new ArrayList();
+        final List cancelled = new ArrayList();
+        final AgendaEventListener l = new DefaultAgendaEventListener() {
+            public void activationCreated(ActivationCreatedEvent event,
+                                          WorkingMemory workingMemory) {
+                created.add( event );
+            }
+
+            public void activationCancelled(ActivationCancelledEvent event,
+                                            WorkingMemory workingMemory) {
+                cancelled.add( event );
+            }
+
+        };
+
+        wm.addEventListener( l );
+
+        final Cheese stilton = new Cheese( "stilton",
+                                           15 );
+        final FactHandle stiltonHandle = wm.insert( stilton );
+
+        final Person p1 = new Person( "p1" );
+        p1.setCheese( stilton );
+        wm.insert( p1 );
+
+        final Person p2 = new Person( "p2" );
+        p2.setCheese( stilton );
+        wm.insert( p2 );
+
+        final Person p3 = new Person( "p3" );
+        p3.setCheese( stilton );
+        wm.insert( p3 );
+
+        assertEquals( 3,
+                      created.size() );
+        assertEquals( 0,
+                      cancelled.size() );
+
+        final Activation item = ((ActivationCreatedEvent) created.get( 2 )).getActivation();
+
+        // simulate a modify inside a consequence
+        wm.update( stiltonHandle,
+                   stilton,
+                   item.getRule(),
+                   item );
+
+        // the two of the three tuples should re-activate
+        assertEquals( 5,
+                      created.size() );
+        assertEquals( 3,
+                      cancelled.size() );
+    }
+
+    public void testRuleFlowGroup() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflowgroup.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        workingMemory.insert( "Test" );
+        workingMemory.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        workingMemory.getAgenda().activateRuleFlowGroup( "Group1" );
+        workingMemory.fireAllRules();
+
+        assertEquals( 1,
+                      list.size() );
+    }
+
+    public void testRuleFlow() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
+        final Package pkg = builder.getPackage();
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        workingMemory.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        final ProcessInstance processInstance = workingMemory.startProcess( "0" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        workingMemory.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+        assertEquals( "Rule1",
+                      list.get( 0 ) );
+        assertEquals( "Rule3",
+                      list.get( 1 ) );
+        assertEquals( "Rule2",
+                      list.get( 2 ) );
+        assertEquals( "Rule4",
+                      list.get( 3 ) );
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+    }
+
+    public void testRuleFlowUpgrade() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        // Set the system property so that automatic conversion can happen
+        System.setProperty( "drools.ruleflow.port",
+                            "true" );
+
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow40.rfm" ) ) );
+        final Package pkg = builder.getPackage();
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        workingMemory.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        final ProcessInstance processInstance = workingMemory.startProcess( "0" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        workingMemory.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+        assertEquals( "Rule1",
+                      list.get( 0 ) );
+        assertEquals( "Rule3",
+                      list.get( 1 ) );
+        assertEquals( "Rule2",
+                      list.get( 2 ) );
+        assertEquals( "Rule4",
+                      list.get( 3 ) );
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+        // Reset the system property so that automatic conversion should not happen
+        System.setProperty( "drools.ruleflow.port",
+                            "false" );
+    }
+
+    public void testRuleFlowClear() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_ruleflowClear.drl" ) ) );
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ruleflowClear.rfm" ) ) );
+        final Package pkg = builder.getPackage();
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final List activations = new ArrayList();
+        AgendaEventListener listener = new DefaultAgendaEventListener() {
+            public void activationCancelled(ActivationCancelledEvent event,
+                                            WorkingMemory workingMemory) {
+                activations.add( event.getActivation() );
+            }
+        };
+
+        workingMemory.addEventListener( listener );
+        DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
+        assertEquals( 0,
+                      agenda.getRuleFlowGroup( "flowgroup-1" ).size() );
+
+        // We need to call fireAllRules here to get the InitialFact into the system, to the eval(true)'s kick in
+        workingMemory.fireAllRules();
+
+        // Now we have 4 in the RuleFlow, but not yet in the agenda
+        assertEquals( 4,
+                      agenda.getRuleFlowGroup( "flowgroup-1" ).size() );
+
+        // Check they aren't in the Agenda
+        assertEquals( 0,
+                      agenda.getAgendaGroup( "MAIN" ).size() );
+
+        // Start the process, which shoudl populate the Agenda
+        final ProcessInstance processInstance = workingMemory.startProcess( "ruleFlowClear" );
+        assertEquals( 4,
+                      agenda.getAgendaGroup( "MAIN" ).size() );
+
+        // Check we have 0 activation cancellation events
+        assertEquals( 0,
+                      activations.size() );
+
+        workingMemory.getAgenda().clearAndCancelRuleFlowGroup( "flowgroup-1" );
+
+        // Check the AgendaGroup and RuleFlowGroup  are now empty
+        assertEquals( 0,
+                      agenda.getAgendaGroup( "MAIN" ).size() );
+        assertEquals( 0,
+                      agenda.getRuleFlowGroup( "flowgroup-1" ).size() );
+
+        // Check we have four activation cancellation events
+        assertEquals( 4,
+                      activations.size() );
+    }
+
+    public void testRuleFlowInPackage() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        workingMemory.fireAllRules();
+        assertEquals( 0,
+                      list.size() );
+
+        final ProcessInstance processInstance = workingMemory.startProcess( "0" );
+        assertEquals( ProcessInstance.STATE_ACTIVE,
+                      processInstance.getState() );
+        workingMemory.fireAllRules();
+        assertEquals( 4,
+                      list.size() );
+        assertEquals( "Rule1",
+                      list.get( 0 ) );
+        assertEquals( "Rule3",
+                      list.get( 1 ) );
+        assertEquals( "Rule2",
+                      list.get( 2 ) );
+        assertEquals( "Rule4",
+                      list.get( 3 ) );
+        assertEquals( ProcessInstance.STATE_COMPLETED,
+                      processInstance.getState() );
+
+    }
+
+    public void testLoadingRuleFlowInPackage1() throws Exception {
+        // adding ruleflow before adding package
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
+        builder.getPackage();
+    }
+
+    public void testLoadingRuleFlowInPackage2() throws Exception {
+        // only adding ruleflow
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
+        builder.getPackage();
+    }
+
+    public void testLoadingRuleFlowInPackage3() throws Exception {
+        // only adding ruleflow without any generated rules
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
+        builder.getPackage();
+    }
+
+    public void FIXME_testLoadingRuleFlowInPackage4() throws Exception {
+        // adding ruleflows of different package
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
+        try {
+            builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.rfm" ) ) );
+            throw new Exception( "An exception should have been thrown." );
+        } catch ( PackageMergeException e ) {
+            // do nothing
+        }
+    }
+
+    public void FIXME_testLoadingRuleFlowInPackage5() throws Exception {
+        // adding ruleflow of different package than rules
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
+        try {
+            builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
+            throw new Exception( "An exception should have been thrown." );
+        } catch ( PackageMergeException e ) {
+            // do nothing
+        }
+    }
+
+    public void FIXME_testLoadingRuleFlowInPackage6() throws Exception {
+        // adding rules of different package than ruleflow
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "empty_ruleflow.rfm" ) ) );
+        try {
+            builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "ruleflow.drl" ) ) );
+            throw new Exception( "An exception should have been thrown." );
+        } catch ( PackageMergeException e ) {
+            // do nothing
+        }
+    }
+
+    public void testRuleFlowActionDialects() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "test_ActionDialects.rfm" ) ) );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+
+        session.startProcess( "ActionDialects" );
+
+        assertEquals( 2,
+                      list.size() );
+        assertEquals( "mvel was here",
+                      list.get( 0 ) );
+        assertEquals( "java was here",
+                      list.get( 1 ) );
+    }
+
+    public void testLoadingRuleFlowInPackage7() throws Exception {
+        // loading a ruleflow with errors
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addRuleFlow( new InputStreamReader( getClass().getResourceAsStream( "error_ruleflow.rfm" ) ) );
+        assertEquals( 1,
+                      builder.getErrors().getErrors().length );
+    }
+
+    private RuleBase loadRuleBase(final Reader reader) throws IOException,
+                                                      DroolsParserException,
+                                                      Exception {
+        final DrlParser parser = new DrlParser();
+        final PackageDescr packageDescr = parser.parse( reader );
+        if ( parser.hasErrors() ) {
+            Assert.fail( "Error messages in parser, need to sort this our (or else collect error messages)" );
+        }
+        // pre build the package
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackage( packageDescr );
+        final Package pkg = builder.getPackage();
+
+        // add the package to a rulebase
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        // load up the rulebase
+        return ruleBase;
+    }
+
+    public void testDateEffective() throws Exception {
+        // read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_EffectiveDate.drl" ) );
+        RuleBase ruleBase = loadRuleBase( reader );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        // go !
+        final Message message = new Message( "hola" );
+        workingMemory.insert( message );
+        workingMemory.fireAllRules();
+        assertFalse( message.isFired() );
+
+    }
+}

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/ruleflow40.rfm
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/ruleflow40.rfm	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/ruleflow40.rfm	2008-11-12 15:24:47 UTC (rev 23836)
@@ -0,0 +1,151 @@
+<org.drools.ruleflow.core.impl.RuleFlowProcessImpl id="1">
+  <nodes id="2">
+    <entry>
+      <long>2</long>
+      <org.drools.ruleflow.core.impl.RuleSetNodeImpl id="3">
+        <ruleFlowGroup>flowgroup-1</ruleFlowGroup>
+        <id>2</id>
+        <name>RuleSet1</name>
+        <incomingConnections id="4">
+          <org.drools.ruleflow.core.impl.ConnectionImpl id="5">
+            <type>1</type>
+            <from class="org.drools.ruleflow.core.impl.StartNodeImpl" id="6">
+              <id>1</id>
+              <name>Start</name>
+              <incomingConnections id="7"/>
+              <outgoingConnections id="8">
+                <org.drools.ruleflow.core.impl.ConnectionImpl reference="5"/>
+              </outgoingConnections>
+            </from>
+            <to class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" reference="3"/>
+          </org.drools.ruleflow.core.impl.ConnectionImpl>
+        </incomingConnections>
+        <outgoingConnections id="9">
+          <org.drools.ruleflow.core.impl.ConnectionImpl id="10">
+            <type>1</type>
+            <from class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" reference="3"/>
+            <to class="org.drools.ruleflow.core.impl.SplitImpl" id="11">
+              <type>1</type>
+              <constraints id="12"/>
+              <id>5</id>
+              <name>Split</name>
+              <incomingConnections id="13">
+                <org.drools.ruleflow.core.impl.ConnectionImpl reference="10"/>
+              </incomingConnections>
+              <outgoingConnections id="14">
+                <org.drools.ruleflow.core.impl.ConnectionImpl id="15">
+                  <type>1</type>
+                  <from class="org.drools.ruleflow.core.impl.SplitImpl" reference="11"/>
+                  <to class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" id="16">
+                    <ruleFlowGroup>flowgroup-2</ruleFlowGroup>
+                    <id>3</id>
+                    <name>RuleSet2</name>
+                    <incomingConnections id="17">
+                      <org.drools.ruleflow.core.impl.ConnectionImpl reference="15"/>
+                    </incomingConnections>
+                    <outgoingConnections id="18">
+                      <org.drools.ruleflow.core.impl.ConnectionImpl id="19">
+                        <type>1</type>
+                        <from class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" reference="16"/>
+                        <to class="org.drools.ruleflow.core.impl.JoinImpl" id="20">
+                          <type>1</type>
+                          <id>6</id>
+                          <name>Join</name>
+                          <incomingConnections id="21">
+                            <org.drools.ruleflow.core.impl.ConnectionImpl id="22">
+                              <type>1</type>
+                              <from class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" id="23">
+                                <ruleFlowGroup>flowgroup-3</ruleFlowGroup>
+                                <id>4</id>
+                                <name>RuleSet3</name>
+                                <incomingConnections id="24">
+                                  <org.drools.ruleflow.core.impl.ConnectionImpl id="25">
+                                    <type>1</type>
+                                    <from class="org.drools.ruleflow.core.impl.SplitImpl" reference="11"/>
+                                    <to class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" reference="23"/>
+                                  </org.drools.ruleflow.core.impl.ConnectionImpl>
+                                </incomingConnections>
+                                <outgoingConnections id="26">
+                                  <org.drools.ruleflow.core.impl.ConnectionImpl reference="22"/>
+                                </outgoingConnections>
+                              </from>
+                              <to class="org.drools.ruleflow.core.impl.JoinImpl" reference="20"/>
+                            </org.drools.ruleflow.core.impl.ConnectionImpl>
+                            <org.drools.ruleflow.core.impl.ConnectionImpl reference="19"/>
+                          </incomingConnections>
+                          <outgoingConnections id="27">
+                            <org.drools.ruleflow.core.impl.ConnectionImpl id="28">
+                              <type>1</type>
+                              <from class="org.drools.ruleflow.core.impl.JoinImpl" reference="20"/>
+                              <to class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" id="29">
+                                <ruleFlowGroup>flowgroup-4</ruleFlowGroup>
+                                <id>7</id>
+                                <name>RuleSet4</name>
+                                <incomingConnections id="30">
+                                  <org.drools.ruleflow.core.impl.ConnectionImpl reference="28"/>
+                                </incomingConnections>
+                                <outgoingConnections id="31">
+                                  <org.drools.ruleflow.core.impl.ConnectionImpl id="32">
+                                    <type>1</type>
+                                    <from class="org.drools.ruleflow.core.impl.RuleSetNodeImpl" reference="29"/>
+                                    <to class="org.drools.ruleflow.core.impl.EndNodeImpl" id="33">
+                                      <id>8</id>
+                                      <name>End</name>
+                                      <incomingConnections id="34">
+                                        <org.drools.ruleflow.core.impl.ConnectionImpl reference="32"/>
+                                      </incomingConnections>
+                                      <outgoingConnections id="35"/>
+                                    </to>
+                                  </org.drools.ruleflow.core.impl.ConnectionImpl>
+                                </outgoingConnections>
+                              </to>
+                            </org.drools.ruleflow.core.impl.ConnectionImpl>
+                          </outgoingConnections>
+                        </to>
+                      </org.drools.ruleflow.core.impl.ConnectionImpl>
+                    </outgoingConnections>
+                  </to>
+                </org.drools.ruleflow.core.impl.ConnectionImpl>
+                <org.drools.ruleflow.core.impl.ConnectionImpl reference="25"/>
+              </outgoingConnections>
+            </to>
+          </org.drools.ruleflow.core.impl.ConnectionImpl>
+        </outgoingConnections>
+      </org.drools.ruleflow.core.impl.RuleSetNodeImpl>
+    </entry>
+    <entry>
+      <long>4</long>
+      <org.drools.ruleflow.core.impl.RuleSetNodeImpl reference="23"/>
+    </entry>
+    <entry>
+      <long>8</long>
+      <org.drools.ruleflow.core.impl.EndNodeImpl reference="33"/>
+    </entry>
+    <entry>
+      <long>6</long>
+      <org.drools.ruleflow.core.impl.JoinImpl reference="20"/>
+    </entry>
+    <entry>
+      <long>1</long>
+      <org.drools.ruleflow.core.impl.StartNodeImpl reference="6"/>
+    </entry>
+    <entry>
+      <long>3</long>
+      <org.drools.ruleflow.core.impl.RuleSetNodeImpl reference="16"/>
+    </entry>
+    <entry>
+      <long>7</long>
+      <org.drools.ruleflow.core.impl.RuleSetNodeImpl reference="29"/>
+    </entry>
+    <entry>
+      <long>5</long>
+      <org.drools.ruleflow.core.impl.SplitImpl reference="11"/>
+    </entry>
+  </nodes>
+  <variables id="36"/>
+  <lastNodeId>8</lastNodeId>
+  <id>0</id>
+  <name>flow</name>
+  <type>Workflow</type>
+  <packageName>com.sample</packageName>
+</org.drools.ruleflow.core.impl.RuleFlowProcessImpl>
\ No newline at end of file




More information about the jboss-svn-commits mailing list