/**
* Copyright 2010 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.
*/
package org.drools.runtime.pipeline.impl;
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.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.pipeline.Action;
import org.drools.runtime.pipeline.Pipeline;
import org.drools.runtime.pipeline.PipelineFactory;
import org.drools.runtime.pipeline.ResultHandler;
import junit.framework.TestCase;
public class StatefulKnowledgeSessionPipelineTest extends TestCase {
public void testInsertObject() {
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
StatefulKnowledgeSessionInsertStage insertStage = new StatefulKnowledgeSessionInsertStage();
insertStage.setReceiver( executeResultHandler );
Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline(ksession);
pipeline.setReceiver( insertStage );
assertEquals( 0, ksession.getObjects().size() );
ResultHandlerImpl resultHanadle = new ResultHandlerImpl();
pipeline.insert( "Hello", resultHanadle );
assertEquals( 1, resultHanadle.getHandles().size() );
}
public void testInsertObject2() {
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
org.drools.runtime.pipeline.KnowledgeRuntimeCommand insertStage = PipelineFactory.newStatefulKnowledgeSessionInsert();
ExecuteResultHandler resultHandlerStage = new ExecuteResultHandler();
insertStage.setReceiver( resultHandlerStage );
Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline(ksession);
pipeline.setReceiver( insertStage );
assertEquals( 0, ksession.getObjects().size() );
ResultHandlerImpl resultHanadle = new ResultHandlerImpl();
pipeline.insert( "Hello", resultHanadle );
assertEquals( 1, resultHanadle.getHandles().size() );
}
public void testStartProcess() {
// This also tests setGlobal
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
Reader source = new StringReader(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<process xmlns=\"http://drools.org/drools-5.0/process\"\n" +
" xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n" +
" type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n" +
"\n" +
" <header>\n" +
" <globals>\n" +
" <global identifier=\"list\" type=\"java.util.List\" />\n" +
" </globals>\n" +
" </header>\n" +
"\n" +
" <nodes>\n" +
" <start id=\"1\" name=\"Start\" />\n" +
" <actionNode id=\"2\" name=\"MyActionNode\" >\n" +
" <action type=\"expression\" dialect=\"java\" >" +
" String variable = (String) context.getVariable(\"variable\");\n" +
" list.add(variable);\n" +
" </action>\n" +
" </actionNode>\n" +
" <end id=\"3\" name=\"End\" />\n" +
" </nodes>\n" +
"\n" +
" <connections>\n" +
" <connection from=\"1\" to=\"2\" />\n" +
" <connection from=\"2\" to=\"3\" />\n" +
" </connections>\n" +
"\n" +
"</process>");
kbuilder.add( ResourceFactory.newReaderResource( source ), ResourceType.DRF );
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (!errors.isEmpty()) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
fail("Errors while building package");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
List<String> list = new ArrayList<String>();
Map globals = new HashMap();
globals.put("list", list);
StatefulKnowledgeSessionSetGlobalStage setGlobal = new StatefulKnowledgeSessionSetGlobalStage();
StatefulKnowledgeSessionPipelineImpl pipeline = new StatefulKnowledgeSessionPipelineImpl(ksession);
pipeline.setReceiver( setGlobal );
pipeline.insert( globals, null );
Map vars = new HashMap();
vars.put( "variable", "SomeText" );
StatefulKnowledgeSessionStartProcessStage startProcess = new StatefulKnowledgeSessionStartProcessStage("org.drools.actions");
pipeline = new StatefulKnowledgeSessionPipelineImpl(ksession);
pipeline.setReceiver( startProcess );
pipeline.insert( vars, null );
assertEquals(1, list.size());
assertEquals("SomeText", list.get(0));
}
public void testSignalEvent() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
Reader source = new StringReader(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<process xmlns=\"http://drools.org/drools-5.0/process\"\n" +
" xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xs:schemaLocation=\"http://drools.org/drools-5.0/process drools-processes-5.0.xsd\"\n" +
" type=\"RuleFlow\" name=\"flow\" id=\"org.drools.event\" package-name=\"org.drools\" version=\"1\" >\n" +
"\n" +
" <header>\n" +
" <globals>\n" +
" <global identifier=\"list\" type=\"java.util.List\" />\n" +
" </globals>\n" +
" <variables>\n" +
" <variable name=\"MyVar\" >\n" +
" <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n" +
" <value>SomeText</value>\n" +
" </variable>\n" +
" </variables>\n" +
" </header>\n" +
"\n" +
" <nodes>\n" +
" <start id=\"1\" name=\"Start\" />\n" +
" <eventNode id=\"2\" name=\"Event\" variableName=\"MyVar\" >\n" +
" <eventFilters>\n" +
" <eventFilter type=\"eventType\" eventType=\"MyEvent\" />\n" +
" </eventFilters>\n" +
" </eventNode>\n" +
" <actionNode id=\"3\" name=\"MyActionNode\" >\n" +
" <action type=\"expression\" dialect=\"java\" >" +
" String variable = (String) context.getVariable(\"MyVar\");\n" +
" list.add(variable);\n" +
" </action>\n" +
" </actionNode>\n" +
" <join id=\"4\" name=\"Join\" type=\"1\" />\n" +
" <end id=\"5\" name=\"End\" />\n" +
" </nodes>\n" +
"\n" +
" <connections>\n" +
" <connection from=\"1\" to=\"4\" />\n" +
" <connection from=\"2\" to=\"3\" />\n" +
" <connection from=\"3\" to=\"4\" />\n" +
" <connection from=\"4\" to=\"5\" />\n" +
" </connections>\n" +
"\n" +
"</process>");
kbuilder.add( ResourceFactory.newReaderResource( source ), ResourceType.DRF );
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (!errors.isEmpty()) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
fail("Errors while building package");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
List<String> list = new ArrayList<String>();
Map globals = new HashMap();
globals.put("list", list);
StatefulKnowledgeSessionSetGlobalStage setGlobal = new StatefulKnowledgeSessionSetGlobalStage();
StatefulKnowledgeSessionPipelineImpl pipeline = new StatefulKnowledgeSessionPipelineImpl(ksession);
pipeline.setReceiver( setGlobal );
pipeline.insert( globals, null );
org.drools.runtime.process.ProcessInstance instance = ksession.startProcess("org.drools.event");
StatefulKnowledgeSessionSignalEventStage signalEvent = new StatefulKnowledgeSessionSignalEventStage( "MyEvent",
instance.getId());
pipeline = new StatefulKnowledgeSessionPipelineImpl(ksession);
pipeline.setReceiver( signalEvent );
pipeline.insert( "MyValue", null );
assertEquals(1, list.size());
assertEquals("MyValue", list.get(0));
}
public static class ResultHandlerImpl implements ResultHandler {
Map handles;
public void handleResult(Object object) {
this.handles = ( Map ) object;
}
public Map getHandles() {
return this.handles;
}
}
}