[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