Ejemplo n.º 1
0
  public void testSignalBetweenProcesses() {
    KnowledgeBase kbase =
        createKnowledgeBase(
            "BPMN2-IntermediateCatchSignalSingle.bpmn2",
            "BPMN2-IntermediateThrowEventSignal.bpmn2");
    StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
    TestWorkItemHandler handler = new TestWorkItemHandler();
    ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);

    ProcessInstance processInstance = ksession.startProcess("BPMN2-IntermediateCatchSignalSingle");
    ksession.getWorkItemManager().completeWorkItem(handler.getWorkItem().getId(), null);

    ProcessInstance processInstance2 = ksession.startProcess("SignalIntermediateEvent");
    assertProcessInstanceCompleted(processInstance2.getId(), ksession);

    assertProcessInstanceCompleted(processInstance.getId(), ksession);
  }
  public void endTheProcess() {
    try {
      KieSession ksession = kstore.loadKieSession(sessionId, kbase, null, getEnvironment());

      // Sleep to check if the timer continues executing.
      logger.info("\n\nSleeping to check that the timer is still running");
      Thread.sleep(5000);

      ksession
          .getWorkItemManager()
          .completeWorkItem(TestWorkItemHandler.getWorkItem().getId(), null);

      logger.info("\n\nSleeping to check that the timer is no longer running");
      Thread.sleep(3000);
      logger.info("Ok");

      ksession.dispose();

    } catch (InterruptedException ex) {
      throw new IllegalStateException("The endTheProcess method has been interrupted", ex);
    }
  }
  public void testWorkItem() {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    Reader source =
        new StringReader(
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                + "<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"
                + "         type=\"RuleFlow\" name=\"flow\" id=\"org.drools.actions\" package-name=\"org.drools\" version=\"1\" >\n"
                + "\n"
                + "  <header>\n"
                + "    <variables>\n"
                + "      <variable name=\"UserName\" >\n"
                + "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
                + "        <value>John Doe</value>\n"
                + "      </variable>\n"
                + "      <variable name=\"MyObject\" >\n"
                + "        <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n"
                + "      </variable>\n"
                + "    </variables>\n"
                + "  </header>\n"
                + "\n"
                + "  <nodes>\n"
                + "    <start id=\"1\" name=\"Start\" />\n"
                + "    <workItem id=\"2\" name=\"HumanTask\" >\n"
                + "      <work name=\"Human Task\" >\n"
                + "        <parameter name=\"ActorId\" >\n"
                + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
                + "          <value>#{UserName}</value>\n"
                + "        </parameter>\n"
                + "        <parameter name=\"TaskName\" >\n"
                + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
                + "          <value>Do something</value>\n"
                + "        </parameter>\n"
                + "        <parameter name=\"Priority\" >\n"
                + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
                + "        </parameter>\n"
                + "        <parameter name=\"Comment\" >\n"
                + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
                + "        </parameter>\n"
                + "        <parameter name=\"Attachment\" >\n"
                + "          <type name=\"org.drools.process.core.datatype.impl.type.ObjectDataType\" className=\"java.lang.Object\" />\n"
                + "        </parameter>\n"
                + "      </work>\n"
                + "      <mapping type=\"in\" from=\"MyObject\" to=\"Attachment\" />"
                + "      <mapping type=\"out\" from=\"Result\" to=\"MyObject\" />"
                + "    </workItem>\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), KnowledgeType.DRF);

    Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages();
    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kpkgs);
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    TestWorkItemHandler handler = new TestWorkItemHandler();
    ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
    ProcessInstance processInstance = ksession.startProcess("org.drools.actions");
    assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
    WorkItem workItem = handler.getWorkItem();
    assertNotNull(workItem);
    assertEquals("John Doe", workItem.getParameter("ActorId"));
    ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
    assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());

    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("UserName", "Jane Doe");
    parameters.put("MyObject", "SomeString");
    processInstance = ksession.startProcess("org.drools.actions", parameters);
    assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
    workItem = handler.getWorkItem();
    assertNotNull(workItem);
    assertEquals("Jane Doe", workItem.getParameter("ActorId"));
    assertEquals("SomeString", workItem.getParameter("Attachment"));
    Map<String, Object> results = new HashMap<String, Object>();
    results.put("Result", "SomeOtherString");
    ksession.getWorkItemManager().completeWorkItem(workItem.getId(), results);
    assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
    VariableScopeInstance variableScope =
        (VariableScopeInstance)
            ((org.drools.process.instance.ProcessInstance) processInstance)
                .getContextInstance(VariableScope.VARIABLE_SCOPE);
    assertEquals("SomeOtherString", variableScope.getVariable("MyObject"));
  }
Ejemplo n.º 4
0
  public void test2() throws Exception {
    String process =
        "<?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=\"ruleflow\" id=\"org.test.ruleflow\" package-name=\"org.test\" >\n"
            + "  <header>\n"
            + "    <variables>\n"
            + "      <variable name=\"myVariable\" >\n"
            + "        <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "        <value>OldValue</value>\n"
            + "      </variable>\n"
            + "    </variables>\n"
            + "  </header>\n"
            + "  <nodes>\n"
            + "    <start id=\"1\" name=\"Start\" />\n"
            + "    <workItem id=\"2\" name=\"Email\" >\n"
            + "      <work name=\"Email\" >\n"
            + "        <parameter name=\"Subject\" >\n"
            + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "          <value>Mail</value>\n"
            + "        </parameter>\n"
            + "        <parameter name=\"Text\" >\n"
            + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "          <value>This is an email</value>\n"
            + "        </parameter>\n"
            + "        <parameter name=\"To\" >\n"
            + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "          <value>[email protected]</value>\n"
            + "        </parameter>\n"
            + "        <parameter name=\"From\" >\n"
            + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "          <value>[email protected]</value>\n"
            + "        </parameter>\n"
            + "      </work>\n"
            + "    </workItem>\n"
            + "    <end id=\"3\" name=\"End\" />\n"
            + "  </nodes>\n"
            + "  <connections>\n"
            + "    <connection from=\"1\" to=\"2\"/>\n"
            + "    <connection from=\"2\" to=\"3\"/>\n"
            + "  </connections>\n"
            + "</process>";
    final PackageBuilder builder = new PackageBuilder();
    builder.addProcessFromXml(new StringReader(process));
    final Package pkg = builder.getPackage();

    final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    ruleBase.addPackage(pkg);

    StatefulSession session = ruleBase.newStatefulSession();
    TestWorkItemHandler handler = new TestWorkItemHandler();
    session.getWorkItemManager().registerWorkItemHandler("Email", handler);
    Map<String, Object> variables = new HashMap<String, Object>();
    variables.put("myVariable", "ThisIsMyValue");
    session.startProcess("org.test.ruleflow", variables);

    assertEquals(1, session.getProcessInstances().size());
    assertTrue(handler.getWorkItem() != null);

    session = getSerialisedStatefulSession(session);
    assertEquals(1, session.getProcessInstances().size());
    VariableScopeInstance variableScopeInstance =
        (VariableScopeInstance)
            ((ProcessInstance) session.getProcessInstances().iterator().next())
                .getContextInstance(VariableScope.VARIABLE_SCOPE);
    assertEquals("ThisIsMyValue", variableScopeInstance.getVariable("myVariable"));

    session.getWorkItemManager().completeWorkItem(handler.getWorkItem().getId(), null);

    assertEquals(0, session.getProcessInstances().size());
  }
Ejemplo n.º 5
0
  public void test3() throws Exception {
    String process1 =
        "<?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=\"ruleflow\" id=\"com.sample.ruleflow\" package-name=\"com.sample\" >\n"
            + "\n"
            + "  <header>\n"
            + "    <imports>\n"
            + "      <import name=\"org.jbpm.Person\" />\n"
            + "    </imports>\n"
            + "    <swimlanes>\n"
            + "      <swimlane name=\"swimlane\" />\n"
            + "    </swimlanes>\n"
            + "  </header>\n"
            + "\n"
            + "  <nodes>\n"
            + "    <start id=\"1\" name=\"Start\" />\n"
            + "    <end id=\"4\" name=\"End\" />\n"
            + "    <split id=\"5\" name=\"AND\" type=\"1\" />\n"
            + "    <subProcess id=\"6\" name=\"SubProcess\" processId=\"com.sample.subflow\" />\n"
            + "    <actionNode id=\"7\" name=\"Action\" >\n"
            + "      <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Executing action 1\");</action>\n"
            + "	 </actionNode>\n"
            + "    <join id=\"8\" name=\"AND\" type=\"1\" />\n"
            + "    <actionNode id=\"9\" name=\"Action\" >\n"
            + "      <action type=\"expression\" dialect=\"mvel\" >System.out.println(\"Executing action 2\");</action>\n"
            + "    </actionNode>\n"
            + "    <ruleSet id=\"10\" name=\"RuleSet\" ruleFlowGroup=\"flowgroup\" />\n"
            + "    <milestone id=\"11\" name=\"Event Wait\" >\n"
            + "      <constraint type=\"rule\" dialect=\"mvel\" >Person( )</constraint>\n"
            + "    </milestone>\n"
            + "    <workItem id=\"12\" name=\"Log\" >\n"
            + "      <work name=\"Log\" >\n"
            + "        <parameter name=\"Message\" >\n"
            + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "          <value>This is a log message</value>\n"
            + "        </parameter>\n"
            + "      </work>\n"
            + "    </workItem>\n"
            + "    <composite id=\"13\" name=\"CompositeNode\" >\n"
            + "      <variables>\n"
            + "        <variable name=\"x\" >\n"
            + "          <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "          <value>x-value</value>\n"
            + "        </variable>\n"
            + "      </variables>\n"
            + "      <nodes>\n"
            + "        <humanTask id=\"1\" name=\"Human Task\" swimlane=\"swimlane\" >\n"
            + "          <work name=\"Human Task\" >\n"
            + "            <parameter name=\"ActorId\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "              <value>John Doe</value>\n"
            + "            </parameter>\n"
            + "            <parameter name=\"Priority\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "            </parameter>\n"
            + "            <parameter name=\"TaskName\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "              <value>Do something !</value>\n"
            + "            </parameter>\n"
            + "            <parameter name=\"Comment\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "            </parameter>\n"
            + "          </work>\n"
            + "        </humanTask>\n"
            + "        <humanTask id=\"2\" name=\"Human Task\" swimlane=\"swimlane\" >\n"
            + "          <work name=\"Human Task\" >\n"
            + "            <parameter name=\"ActorId\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "            </parameter>\n"
            + "            <parameter name=\"Priority\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "            </parameter>\n"
            + "            <parameter name=\"TaskName\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "              <value>Do something else !</value>\n"
            + "            </parameter>\n"
            + "            <parameter name=\"Comment\" >\n"
            + "              <type name=\"org.drools.process.core.datatype.impl.type.StringDataType\" />\n"
            + "            </parameter>\n"
            + "          </work>\n"
            + "          <mapping type=\"in\" from=\"x\" to=\"Priority\" />\n"
            + "        </humanTask>\n"
            + "      </nodes>\n"
            + "      <connections>\n"
            + "        <connection from=\"1\" to=\"2\" />\n"
            + "      </connections>\n"
            + "      <in-ports>\n"
            + "        <in-port type=\"DROOLS_DEFAULT\" nodeId=\"1\" nodeInType=\"DROOLS_DEFAULT\" />\n"
            + "      </in-ports>\n"
            + "      <out-ports>\n"
            + "        <out-port type=\"DROOLS_DEFAULT\" nodeId=\"2\" nodeOutType=\"DROOLS_DEFAULT\" />\n"
            + "      </out-ports>\n"
            + "    </composite>\n"
            + "  </nodes>\n"
            + "\n"
            + "  <connections>\n"
            + "    <connection from=\"9\" to=\"4\" />\n"
            + "    <connection from=\"1\" to=\"5\" />\n"
            + "    <connection from=\"5\" to=\"6\" />\n"
            + "    <connection from=\"5\" to=\"7\" />\n"
            + "    <connection from=\"7\" to=\"8\" />\n"
            + "    <connection from=\"6\" to=\"8\" />\n"
            + "    <connection from=\"10\" to=\"8\" />\n"
            + "    <connection from=\"11\" to=\"8\" />\n"
            + "    <connection from=\"12\" to=\"8\" />\n"
            + "    <connection from=\"13\" to=\"8\" />\n"
            + "    <connection from=\"8\" to=\"9\" />\n"
            + "    <connection from=\"5\" to=\"10\" />\n"
            + "    <connection from=\"5\" to=\"11\" />\n"
            + "    <connection from=\"5\" to=\"12\" />\n"
            + "    <connection from=\"5\" to=\"13\" />\n"
            + "  </connections>\n"
            + "\n"
            + "</process>\n";
    final PackageBuilder builder = new PackageBuilder();
    builder.addProcessFromXml(new StringReader(process1));

    String process2 =
        "<?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=\"com.sample.subflow\" package-name=\"com.sample\" >\n"
            + "\n"
            + "  <header>\n"
            + "    <imports>\n"
            + "      <import name=\"org.jbpm.Person\" />\n"
            + "    </imports>\n"
            + "  </header>\n"
            + "\n"
            + "  <nodes>\n"
            + "    <start id=\"1\" name=\"Start\" />\n"
            + "    <milestone id=\"2\" name=\"Event Wait\" >\n"
            + "      <constraint type=\"rule\" dialect=\"mvel\" >Person( )</constraint>\n"
            + "    </milestone>\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>\n";
    builder.addProcessFromXml(new StringReader(process2));

    String rule =
        "package com.sample\n"
            + "import org.jbpm.Person;\n"
            + "rule \"Hello\" ruleflow-group \"flowgroup\"\n"
            + "    when\n"
            + "    then\n"
            + "        System.out.println( \"Hello\" );\n"
            + "end";
    builder.addPackageFromDrl(new StringReader(rule));

    final Package pkg = builder.getPackage();
    final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    ruleBase.addPackage(pkg);

    StatefulSession session = ruleBase.newStatefulSession();
    TestWorkItemHandler handler1 = new TestWorkItemHandler();
    session.getWorkItemManager().registerWorkItemHandler("Log", handler1);
    TestWorkItemHandler handler2 = new TestWorkItemHandler();
    session.getWorkItemManager().registerWorkItemHandler("Human Task", handler2);
    session.startProcess("com.sample.ruleflow");

    assertEquals(2, session.getProcessInstances().size());
    assertTrue(handler1.getWorkItem() != null);
    long workItemId = handler2.getWorkItem().getId();
    assertTrue(workItemId != -1);

    session = getSerialisedStatefulSession(session);
    session.getWorkItemManager().registerWorkItemHandler("Human Task", handler2);
    assertEquals(2, session.getProcessInstances().size());

    handler2.reset();
    session.getWorkItemManager().completeWorkItem(workItemId, null);
    assertTrue(handler2.getWorkItem() != null);
    assertEquals("John Doe", handler2.getWorkItem().getParameter("ActorId"));
    assertEquals("x-value", handler2.getWorkItem().getParameter("Priority"));

    session.getWorkItemManager().completeWorkItem(handler1.getWorkItem().getId(), null);
    session.getWorkItemManager().completeWorkItem(handler2.getWorkItem().getId(), null);
    session.insert(new Person());
    session.fireAllRules();

    assertEquals(0, session.getProcessInstances().size());
  }
  @Test
  public void testPersistenceSubProcess() {
    final Environment env = KnowledgeBaseFactory.newEnvironment();
    env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
    env.set(
        EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());

    final Properties properties = new Properties();
    properties.setProperty("drools.commandService", SingleSessionCommandService.class.getName());
    properties.setProperty(
        "drools.processInstanceManagerFactory", JPAProcessInstanceManagerFactory.class.getName());
    properties.setProperty(
        "drools.workItemManagerFactory", JPAWorkItemManagerFactory.class.getName());
    properties.setProperty(
        "drools.processSignalManagerFactory", JPASignalManagerFactory.class.getName());
    properties.setProperty("drools.timerService", JpaJDKTimerService.class.getName());
    final SessionConfiguration config = new SessionConfiguration(properties);

    final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    final Package pkg = getProcessSubProcess();
    ruleBase.addPackage(pkg);

    SingleSessionCommandService service = new SingleSessionCommandService(ruleBase, config, env);
    final int sessionId = service.getSessionId();
    final StartProcessCommand startProcessCommand = new StartProcessCommand();
    startProcessCommand.setProcessId("org.drools.test.TestProcess");
    RuleFlowProcessInstance processInstance =
        (RuleFlowProcessInstance) service.execute(startProcessCommand);
    System.out.println("Started process instance " + processInstance.getId());
    final long processInstanceId = processInstance.getId();

    final TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
    final WorkItem workItem = handler.getWorkItem();
    assertNotNull(workItem);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, ruleBase, config, env);
    GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
    processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
    assertNotNull(processInstance);

    final Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
    assertEquals(1, nodeInstances.size());
    final SubProcessNodeInstance subProcessNodeInstance =
        (SubProcessNodeInstance) nodeInstances.iterator().next();
    final long subProcessInstanceId = subProcessNodeInstance.getProcessInstanceId();
    getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
    RuleFlowProcessInstance subProcessInstance =
        (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
    assertNotNull(subProcessInstance);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, ruleBase, config, env);
    final CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
    completeWorkItemCommand.setWorkItemId(workItem.getId());
    service.execute(completeWorkItemCommand);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, ruleBase, config, env);
    getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
    subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
    assertNull(subProcessInstance);

    getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
    processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
    assertNull(processInstance);
    service.dispose();
  }
  @Test
  public void testPersistenceWorkItemsUserTransaction() throws Exception {
    final Environment env = KnowledgeBaseFactory.newEnvironment();
    env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
    env.set(
        EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());

    final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    final Collection<KnowledgePackage> kpkgs = getProcessWorkItems();
    kbase.addKnowledgePackages(kpkgs);

    final Properties properties = new Properties();
    properties.setProperty("drools.commandService", SingleSessionCommandService.class.getName());
    properties.setProperty(
        "drools.processInstanceManagerFactory", JPAProcessInstanceManagerFactory.class.getName());
    properties.setProperty(
        "drools.workItemManagerFactory", JPAWorkItemManagerFactory.class.getName());
    properties.setProperty(
        "drools.processSignalManagerFactory", JPASignalManagerFactory.class.getName());
    properties.setProperty("drools.timerService", JpaJDKTimerService.class.getName());
    final SessionConfiguration config = new SessionConfiguration(properties);

    SingleSessionCommandService service = new SingleSessionCommandService(kbase, config, env);
    final int sessionId = service.getSessionId();

    final UserTransaction ut =
        (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
    ut.begin();
    final StartProcessCommand startProcessCommand = new StartProcessCommand();
    startProcessCommand.setProcessId("org.drools.test.TestProcess");
    ProcessInstance processInstance = service.execute(startProcessCommand);
    System.out.println("Started process instance " + processInstance.getId());
    ut.commit();

    final TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
    WorkItem workItem = handler.getWorkItem();
    assertNotNull(workItem);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
    processInstance = service.execute(getProcessInstanceCommand);
    assertNotNull(processInstance);
    ut.commit();
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
    completeWorkItemCommand.setWorkItemId(workItem.getId());
    service.execute(completeWorkItemCommand);
    ut.commit();

    workItem = handler.getWorkItem();
    assertNotNull(workItem);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
    processInstance = service.execute(getProcessInstanceCommand);
    ut.commit();
    assertNotNull(processInstance);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    completeWorkItemCommand = new CompleteWorkItemCommand();
    completeWorkItemCommand.setWorkItemId(workItem.getId());
    service.execute(completeWorkItemCommand);
    ut.commit();

    workItem = handler.getWorkItem();
    assertNotNull(workItem);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
    processInstance = service.execute(getProcessInstanceCommand);
    ut.commit();
    assertNotNull(processInstance);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    completeWorkItemCommand = new CompleteWorkItemCommand();
    completeWorkItemCommand.setWorkItemId(workItem.getId());
    service.execute(completeWorkItemCommand);
    ut.commit();

    workItem = handler.getWorkItem();
    assertNull(workItem);
    service.dispose();

    service = new SingleSessionCommandService(sessionId, kbase, config, env);
    ut.begin();
    getProcessInstanceCommand = new GetProcessInstanceCommand();
    getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
    processInstance = service.execute(getProcessInstanceCommand);
    ut.commit();
    assertNull(processInstance);
    service.dispose();
  }
  @Test
  public void testPersistenceVariables()
      throws NamingException, NotSupportedException, SystemException, IllegalStateException,
          RollbackException, HeuristicMixedException, HeuristicRollbackException {
    MyEntity myEntity = new MyEntity("This is a test Entity with annotation in fields");
    MyEntityMethods myEntityMethods =
        new MyEntityMethods("This is a test Entity with annotations in methods");
    MyEntityOnlyFields myEntityOnlyFields =
        new MyEntityOnlyFields(
            "This is a test Entity with annotations in fields and without accesors methods");
    MyVariableSerializable myVariableSerializable =
        new MyVariableSerializable("This is a test SerializableObject");
    EntityManager em = ((EntityManagerFactory) ctx.getBean("myEmf")).createEntityManager();

    em.getTransaction().begin();
    em.persist(myEntity);
    em.persist(myEntityMethods);
    em.persist(myEntityOnlyFields);
    em.getTransaction().commit();
    em.close();

    log.info("---> get bean jpaSingleSessionCommandService");
    StatefulKnowledgeSession service =
        (StatefulKnowledgeSession) ctx.getBean("jpaSingleSessionCommandService");

    int sessionId = service.getId();
    log.info("---> created SingleSessionCommandService id: " + sessionId);

    log.info("### Starting process ###");
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("x", "SomeString");
    parameters.put("y", myEntity);
    parameters.put("m", myEntityMethods);
    parameters.put("f", myEntityOnlyFields);
    parameters.put("z", myVariableSerializable);
    WorkflowProcessInstance processInstance =
        (WorkflowProcessInstance) service.startProcess("com.sample.ruleflow", parameters);
    log.info("Started process instance {}", processInstance.getId());

    TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
    WorkItem workItem = handler.getWorkItem();
    assertNotNull(workItem);
    service.dispose();

    EntityManagerFactory emf = (EntityManagerFactory) ctx.getBean("myEmf");

    //        List< ? > result = emf.createEntityManager().createQuery( "select i from
    // VariableInstanceInfo i" ).getResultList();
    //        assertEquals( 5,
    //                      result.size() );
    log.info("### Retrieving process instance ###");

    /*        Environment env = KnowledgeBaseFactory.newEnvironment();
            env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                     emf );
            env.set( EnvironmentName.TRANSACTION_MANAGER,
                     ctx.getBean( "txManager" ) );
            env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES,
                     new ObjectMarshallingStrategy[]{
                                                                      //  new JPAPlaceholderResolverStrategy(env),
                                                                      new SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT )
                                                                    } );
    */
    final Environment env = (Environment) ctx.getBean("env2");
    KnowledgeStoreService kstore = (KnowledgeStoreService) ctx.getBean("kstore1");
    KnowledgeBase kbase1 = (KnowledgeBase) ctx.getBean("kbase1");
    service = kstore.loadStatefulKnowledgeSession(sessionId, kbase1, null, env);

    processInstance = (WorkflowProcessInstance) service.getProcessInstance(processInstance.getId());
    assertNotNull(processInstance);

    assertNotNull(processInstance);
    assertEquals("SomeString", processInstance.getVariable("x"));
    assertEquals(
        "This is a test Entity with annotation in fields",
        ((MyEntity) processInstance.getVariable("y")).getTest());
    assertEquals(
        "This is a test Entity with annotations in methods",
        ((MyEntityMethods) processInstance.getVariable("m")).getTest());
    assertEquals(
        "This is a test Entity with annotations in fields and without accesors methods",
        ((MyEntityOnlyFields) processInstance.getVariable("f")).test);
    assertEquals(
        "This is a test SerializableObject",
        ((MyVariableSerializable) processInstance.getVariable("z")).getText());
    assertNull(processInstance.getVariable("a"));
    assertNull(processInstance.getVariable("b"));
    assertNull(processInstance.getVariable("c"));

    service.dispose();
  }