/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.wordpress.salaboy.procedures; import com.wordpress.salaboy.acc.FirefighterDeparmtmentDistanceCalculator; import java.util.Date; import java.util.List; import org.drools.KnowledgeBase; import org.drools.builder.KnowledgeBuilder; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import com.wordpress.salaboy.api.HumanTaskService; import com.wordpress.salaboy.api.HumanTaskServiceFactory; import com.wordpress.salaboy.conf.HumanTaskServiceConfiguration; import com.wordpress.salaboy.messaging.MessageServerSingleton; import com.wordpress.salaboy.model.Call; import com.wordpress.salaboy.model.Emergency; import com.wordpress.salaboy.model.FireTruck; import com.wordpress.salaboy.model.FirefightersDepartment; import com.wordpress.salaboy.model.Location; import com.wordpress.salaboy.model.events.EmergencyEndsEvent; import com.wordpress.salaboy.model.events.VehicleHitsEmergencyEvent; import com.wordpress.salaboy.model.messages.EmergencyEndsMessage; import com.wordpress.salaboy.services.HumanTaskServerService; import com.wordpress.salaboy.services.ProceduresMGMTService; import com.wordpress.salaboy.smarttasks.jbpm5wrapper.conf.JBPM5HornetQHumanTaskClientConfiguration; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.IOUtils; import org.drools.KnowledgeBaseConfiguration; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilderConfiguration; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.builder.conf.AccumulateFunctionOption; import org.drools.conf.EventProcessingOption; import org.drools.io.impl.ByteArrayResource; import org.drools.io.impl.ClassPathResource; import org.drools.runtime.StatefulKnowledgeSession; import org.example.ws_ht.api.TTaskAbstract; import org.jbpm.task.service.hornetq.CommandBasedHornetQWSHumanTaskHandler; import org.junit.Assert; import org.junit.Test; /** * * @author esteban */ public class DefaultFireProcedureStandaloneTest { private KnowledgeBase kbase; private HumanTaskService humanTaskServiceClient; public DefaultFireProcedureStandaloneTest() { } @BeforeClass public static void setUpClass() throws Exception { HumanTaskServerService.getInstance().initTaskServer(); } @AfterClass public static void tearDownClass() throws Exception { HumanTaskServerService.getInstance().stopTaskServer(); } private Emergency emergency = null; private FireTruck fireTruck = null; private Call call = null; private FirefightersDepartment firefightersDepartment = null; @Before public void setUp() throws Exception { emergency = new Emergency(); emergency.setId("Emergency1"); fireTruck = new FireTruck(); fireTruck.setId("FireTruck1"); call = new Call(1, 2, new Date()); call.setId("Call1"); emergency.setCall(call); emergency.setLocation(new Location(1, 2)); emergency.setType(Emergency.EmergencyType.FIRE); emergency.setNroOfPeople(1); firefightersDepartment = new FirefightersDepartment( "Firefighter Department 1", 12, 1); MessageServerSingleton.getInstance().start(); HumanTaskServiceConfiguration taskClientConf = new HumanTaskServiceConfiguration(); taskClientConf.addHumanTaskClientConfiguration("jBPM5-HT-Client", new JBPM5HornetQHumanTaskClientConfiguration( "127.0.0.1", 5446)); humanTaskServiceClient = HumanTaskServiceFactory.newHumanTaskService(taskClientConf); humanTaskServiceClient.initializeService(); initKBase(); } @After public void tearDown() throws Exception { MessageServerSingleton.getInstance().stop(); this.humanTaskServiceClient.cleanUpService(); } @Test public void standaloneTest() throws Exception { StatefulKnowledgeSession ksession = this.getNewKSession(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("call", call); parameters.put("emergency", emergency); parameters.put("vehicle", fireTruck); ksession.startProcess("com.wordpress.salaboy.bpmn2.DefaultFireProcedure",parameters); // The fire truck doesn't reach the emergency yet. No task for // the firefighter. humanTaskServiceClient.setAuthorizedEntityId("firefighter"); List<TTaskAbstract> taskAbstracts = humanTaskServiceClient.getMyTaskAbstracts("", "firefighter", "", null, "", "", "", 0, 0); Assert.assertTrue(taskAbstracts.isEmpty()); // Now the fire truck arrives to the emergency ksession.signalEvent( "com.wordpress.salaboy.model.events.VehicleHitsEmergencyEvent", new VehicleHitsEmergencyEvent(emergency.getId(), fireTruck.getId(), new Date()) ); Thread.sleep(2000); // A new task for the firefighter should be there now taskAbstracts = humanTaskServiceClient.getMyTaskAbstracts("", "firefighter", "", null, "", "", "", 0, 0); Assert.assertEquals(1, taskAbstracts.size()); TTaskAbstract firefighterTask = taskAbstracts.get(0); // The firefighter completes the task Map<String, Object> info = new HashMap<String, Object>(); info.put("emergency.priority", 1); humanTaskServiceClient.start(firefighterTask.getId()); humanTaskServiceClient.complete(firefighterTask.getId(), info); Thread.sleep(2000); // TODO: validate that the process is still running // Becasuse the fire truck still got enough water, no "Water Refill" // task exists taskAbstracts = humanTaskServiceClient.getMyTaskAbstracts("", "firefighter", "", null, "", "", "", 0, 0); Assert.assertTrue(taskAbstracts.isEmpty()); // Ok, the emregency ends ksession.signalEvent( "com.wordpress.salaboy.model.events.EmergencyEndsEvent", new EmergencyEndsEvent(emergency.getId(), new Date()) ); // TODO: validate that the process has finished } private StatefulKnowledgeSession getNewKSession() { StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); session.getWorkItemManager().registerWorkItemHandler("Human Task", new CommandBasedHornetQWSHumanTaskHandler(session)); return session; } private void initKBase() throws Exception { KnowledgeBuilderConfiguration kbuilderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(); kbuilderConf.setOption(AccumulateFunctionOption.get("firefighterDeparmtmentDistanceCalculator", new FirefighterDeparmtmentDistanceCalculator())); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConf); KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbaseConf.setOption(EventProcessingOption.STREAM); kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConf); kbuilder.add(new ByteArrayResource(IOUtils.toByteArray(new ClassPathResource("processes/procedures/MultiVehicleProcedure.bpmn").getInputStream())), ResourceType.BPMN2); kbuilder.add(new ByteArrayResource(IOUtils.toByteArray(new ClassPathResource("processes/procedures/DefaultFireProcedure.bpmn").getInputStream())), ResourceType.BPMN2); kbuilder.add(new ByteArrayResource(IOUtils.toByteArray(new ClassPathResource("rules/select_water_refill_destination.drl").getInputStream())), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors != null && errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.out.println(">>>>>>> Error: " + error.getMessage()); } throw new IllegalStateException("Failed to parse knowledge!"); } kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); } }