Example #1
0
  public void testEvent1() {
    RuleFlowProcess process = new RuleFlowProcess();
    process.setId("org.drools.process.event");
    process.setName("Event Process");

    List<Variable> variables = new ArrayList<Variable>();
    Variable variable = new Variable();
    variable.setName("event");
    ObjectDataType personDataType = new ObjectDataType();
    personDataType.setClassName("org.drools.Person");
    variable.setType(personDataType);
    variables.add(variable);
    process.getVariableScope().setVariables(variables);

    StartNode startNode = new StartNode();
    startNode.setName("Start");
    startNode.setId(1);
    process.addNode(startNode);

    MilestoneNode milestoneNode = new MilestoneNode();
    milestoneNode.setName("Milestone");
    milestoneNode.setConstraint("eval(false)");
    milestoneNode.setId(2);
    process.addNode(milestoneNode);
    new ConnectionImpl(
        startNode, Node.CONNECTION_DEFAULT_TYPE,
        milestoneNode, Node.CONNECTION_DEFAULT_TYPE);

    EventNode eventNode = new EventNode();
    EventTypeFilter eventFilter = new EventTypeFilter();
    eventFilter.setType("myEvent");
    eventNode.addEventFilter(eventFilter);
    eventNode.setVariableName("event");
    eventNode.setId(3);
    process.addNode(eventNode);

    final List<String> myList = new ArrayList<String>();
    ActionNode actionNode = new ActionNode();
    actionNode.setName("Print");
    DroolsAction action = new DroolsConsequenceAction("java", null);
    action.setMetaData(
        "Action",
        new Action() {
          public void execute(ProcessContext context) throws Exception {
            System.out.println(
                "Detected event for person " + ((Person) context.getVariable("event")).getName());
            myList.add("Executed action");
          }
        });
    actionNode.setAction(action);
    actionNode.setId(4);
    process.addNode(actionNode);
    new ConnectionImpl(
        eventNode, Node.CONNECTION_DEFAULT_TYPE,
        actionNode, Node.CONNECTION_DEFAULT_TYPE);

    Join join = new Join();
    join.setName("XOR Join");
    join.setType(Join.TYPE_XOR);
    join.setId(5);
    process.addNode(join);
    new ConnectionImpl(
        milestoneNode, Node.CONNECTION_DEFAULT_TYPE,
        join, Node.CONNECTION_DEFAULT_TYPE);
    new ConnectionImpl(
        actionNode, Node.CONNECTION_DEFAULT_TYPE,
        join, Node.CONNECTION_DEFAULT_TYPE);

    EndNode endNode = new EndNode();
    endNode.setName("EndNode");
    endNode.setId(6);
    process.addNode(endNode);
    new ConnectionImpl(
        join, Node.CONNECTION_DEFAULT_TYPE,
        endNode, Node.CONNECTION_DEFAULT_TYPE);

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    ((AbstractRuleBase) ((InternalKnowledgeBase) kbase).getRuleBase()).addProcess(process);
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    ProcessInstance processInstance = ksession.startProcess("org.drools.process.event");
    assertEquals(0, myList.size());
    Person jack = new Person();
    jack.setName("Jack");
    processInstance.signalEvent("myEvent", jack);
    assertEquals(1, myList.size());
    assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
  }
  @Test
  public void testProcessEventListener() throws Exception {
    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

    // create a simple package with one process to test the events
    final InternalKnowledgePackage pkg = new KnowledgePackageImpl("org.drools.test");
    RuleFlowProcess process = new RuleFlowProcess();
    process.setId("org.drools.core.process.event");
    process.setName("Event Process");

    StartNode startNode = new StartNode();
    startNode.setName("Start");
    startNode.setId(1);
    process.addNode(startNode);

    ActionNode actionNode = new ActionNode();
    actionNode.setName("Print");
    DroolsAction action = new DroolsConsequenceAction("java", null);
    action.setMetaData(
        "Action",
        new Action() {
          public void execute(ProcessContext context) throws Exception {
            logger.info("Executed action");
          }
        });
    actionNode.setAction(action);
    actionNode.setId(2);
    process.addNode(actionNode);
    new ConnectionImpl(
        startNode, Node.CONNECTION_DEFAULT_TYPE,
        actionNode, Node.CONNECTION_DEFAULT_TYPE);

    EndNode endNode = new EndNode();
    endNode.setName("End");
    endNode.setId(3);
    process.addNode(endNode);
    new ConnectionImpl(
        actionNode, Node.CONNECTION_DEFAULT_TYPE,
        endNode, Node.CONNECTION_DEFAULT_TYPE);

    pkg.addProcess(process);
    List<KnowledgePackage> pkgs = new ArrayList<KnowledgePackage>();
    pkgs.add(pkg);
    kbase.addKnowledgePackages(pkgs);

    StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession();
    final List<ProcessEvent> processEventList = new ArrayList<ProcessEvent>();
    final ProcessEventListener processEventListener =
        new ProcessEventListener() {

          public void afterNodeLeft(ProcessNodeLeftEvent event) {
            processEventList.add(event);
          }

          public void afterNodeTriggered(ProcessNodeTriggeredEvent event) {
            processEventList.add(event);
          }

          public void afterProcessCompleted(ProcessCompletedEvent event) {
            processEventList.add(event);
          }

          public void afterProcessStarted(ProcessStartedEvent event) {
            processEventList.add(event);
          }

          public void beforeNodeLeft(ProcessNodeLeftEvent event) {
            processEventList.add(event);
          }

          public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
            processEventList.add(event);
          }

          public void beforeProcessCompleted(ProcessCompletedEvent event) {
            processEventList.add(event);
          }

          public void beforeProcessStarted(ProcessStartedEvent event) {
            processEventList.add(event);
          }

          public void beforeVariableChanged(ProcessVariableChangedEvent event) {
            processEventList.add(event);
          }

          public void afterVariableChanged(ProcessVariableChangedEvent event) {
            processEventList.add(event);
          }
        };
    session.addEventListener(processEventListener);

    // execute the process
    session.startProcess("org.drools.core.process.event");
    assertEquals(16, processEventList.size());
    assertEquals(
        "org.drools.core.process.event",
        ((ProcessStartedEvent) processEventList.get(0)).getProcessInstance().getProcessId());
    assertEquals(
        "Start",
        ((ProcessNodeTriggeredEvent) processEventList.get(1)).getNodeInstance().getNodeName());
    assertEquals(
        "Start", ((ProcessNodeLeftEvent) processEventList.get(2)).getNodeInstance().getNodeName());
    assertEquals(
        "Print",
        ((ProcessNodeTriggeredEvent) processEventList.get(3)).getNodeInstance().getNodeName());
    assertEquals(
        "Print", ((ProcessNodeLeftEvent) processEventList.get(4)).getNodeInstance().getNodeName());
    assertEquals(
        "End",
        ((ProcessNodeTriggeredEvent) processEventList.get(5)).getNodeInstance().getNodeName());
    assertEquals(
        "End", ((ProcessNodeLeftEvent) processEventList.get(6)).getNodeInstance().getNodeName());
    assertEquals(
        "org.drools.core.process.event",
        ((ProcessCompletedEvent) processEventList.get(7)).getProcessInstance().getProcessId());
    assertEquals(
        "org.drools.core.process.event",
        ((ProcessCompletedEvent) processEventList.get(8)).getProcessInstance().getProcessId());
    assertEquals(
        "End", ((ProcessNodeLeftEvent) processEventList.get(9)).getNodeInstance().getNodeName());
    assertEquals(
        "End",
        ((ProcessNodeTriggeredEvent) processEventList.get(10)).getNodeInstance().getNodeName());
    assertEquals(
        "Print", ((ProcessNodeLeftEvent) processEventList.get(11)).getNodeInstance().getNodeName());
    assertEquals(
        "Print",
        ((ProcessNodeTriggeredEvent) processEventList.get(12)).getNodeInstance().getNodeName());
    assertEquals(
        "Start", ((ProcessNodeLeftEvent) processEventList.get(13)).getNodeInstance().getNodeName());
    assertEquals(
        "Start",
        ((ProcessNodeTriggeredEvent) processEventList.get(14)).getNodeInstance().getNodeName());
    assertEquals(
        "org.drools.core.process.event",
        ((ProcessStartedEvent) processEventList.get(15)).getProcessInstance().getProcessId());
  }