示例#1
0
  public void testNewSessionDispose() throws Exception {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("sample.bpmn"), ResourceType.BPMN2);
    KnowledgeBase kbase = kbuilder.newKnowledgeBase();
    SessionManagerFactory factory = new NewSessionSessionManagerFactory(kbase);
    final SessionManager sessionManager = factory.getSessionManager();
    UserTransaction ut = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
    ut.begin();
    sessionManager.getKnowledgeSession().startProcess("com.sample.bpmn.hello", null);
    TransactionManagerServices.getTransactionManager()
        .getTransaction()
        .registerSynchronization(
            new Synchronization() {
              public void beforeCompletion() {}

              public void afterCompletion(int status) {
                try {
                  sessionManager.dispose();
                } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                }
              }
            });
    ut.commit();
    factory.dispose();
  }
示例#2
0
  public void testNewSessionFailBefore() throws Exception {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("sampleFailBefore.bpmn"), ResourceType.BPMN2);
    KnowledgeBase kbase = kbuilder.newKnowledgeBase();
    SessionManagerFactory factory = new NewSessionSessionManagerFactory(kbase);
    SessionManager sessionManager = factory.getSessionManager();

    try {
      ProcessInstance processInstance =
          sessionManager.getKnowledgeSession().startProcess("com.sample.bpmn.hello", null);
      fail("Started process instance " + processInstance.getId());
    } catch (RuntimeException e) {
      // do nothing
    }

    // TODO: whenever transaction fails, do we need to dispose? can we?
    // sessionManager.dispose();

    List<Status> statusses = new ArrayList<Status>();
    statusses.add(Status.Reserved);

    sessionManager = factory.getSessionManager();
    List<TaskSummary> tasks =
        sessionManager.getTaskService().getTasksAssignedAsPotentialOwner("mary", "en-UK");
    assertEquals(0, tasks.size());

    sessionManager.dispose();
    factory.dispose();
  }
  private KnowledgeBase buildKnowledgeBase(String... rules) {
    String str = "";
    str += "package org.kie \n";
    str += "import " + A.class.getCanonicalName() + "\n";
    str += "import " + B.class.getCanonicalName() + "\n";
    str += "import " + C.class.getCanonicalName() + "\n";
    str += "global java.util.List list \n";

    int i = 0;
    for (String lhs : rules) {
      str += "rule rule" + (i++) + "  when \n";
      str += lhs;
      str += "then \n";
      str += "end \n";
    }

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);

    assertFalse(kbuilder.getErrors().toString(), kbuilder.hasErrors());

    KieBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
    kconf.setOption(LRUnlinkingOption.ENABLED);

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kconf);
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
    return kbase;
  }
示例#4
0
 public void testProcessFactory() {
   RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.jbpm.process");
   factory
       // header
       .name("My process")
       .packageName("org.jbpm")
       // nodes
       .startNode(1)
       .name("Start")
       .done()
       .actionNode(2)
       .name("Action")
       .action("java", "System.out.println(\"Action\");")
       .done()
       .endNode(3)
       .name("End")
       .done()
       // connections
       .connection(1, 2)
       .connection(2, 3);
   RuleFlowProcess process = factory.validate().getProcess();
   KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
   kbuilder.add(
       ResourceFactory.newByteArrayResource(
           XmlBPMNProcessDumper.INSTANCE.dump(process).getBytes()),
       ResourceType.BPMN2);
   KnowledgeBase kbase = kbuilder.newKnowledgeBase();
   StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
   ksession.startProcess("org.jbpm.process");
 }
示例#5
0
  @Test
  public void testUpdateWithNonEffectiveActivations() throws Exception {
    // JBRULES-3604
    String str =
        "package inheritance\n"
            + "\n"
            + "import org.drools.Address\n"
            + "\n"
            + "rule \"Parent\"\n"
            + "    enabled false\n"
            + "    when \n"
            + "        $a : Address(suburb == \"xyz\")\n"
            + "    then \n"
            + "        System.out.println( $a ); \n"
            + "end \n"
            + "rule \"Child\" extends \"Parent\" \n"
            + "    when \n"
            + "        $b : Address( this == $a, street == \"123\")\n"
            + "    then \n"
            + "        System.out.println( $b ); \n"
            + "end";

    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();

    builder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);

    if (builder.hasErrors()) {
      throw new RuntimeException(builder.getErrors().toString());
    }
    KieBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
    kconf.setOption(LRUnlinkingOption.ENABLED);
    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(kconf);
    knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());

    StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();

    Address address = new Address();

    address.setSuburb("xyz");
    org.kie.runtime.rule.FactHandle addressHandle = ksession.insert(address);

    int rulesFired = ksession.fireAllRules();

    assertEquals(0, rulesFired);

    address.setStreet("123");

    ksession.update(addressHandle, address);

    rulesFired = ksession.fireAllRules();

    System.out.println(rulesFired);
    assertEquals(1, rulesFired);

    ksession.dispose();
  }
示例#6
0
  private static StatefulKnowledgeSession getSession(String drl) {

    KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kBuilder.add(new ClassPathResource("org/drools/examples/traits/" + drl), ResourceType.DRL);

    if (kBuilder.hasErrors()) {
      System.err.println(kBuilder.getErrors().toString());
    }

    KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
    kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());

    return kBase.newStatefulKnowledgeSession();
  }
示例#7
0
 public void testSingletonSessionMemory() throws Exception {
   for (int i = 0; i < 1000; i++) {
     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
     kbuilder.add(ResourceFactory.newClassPathResource("sample.bpmn"), ResourceType.BPMN2);
     KnowledgeBase kbase = kbuilder.newKnowledgeBase();
     SessionManagerFactory factory = new SingletonSessionManagerFactory(kbase);
     SessionManager sessionManager = factory.getSessionManager();
     sessionManager.dispose();
     factory.dispose();
     System.gc();
     Thread.sleep(100);
     System.gc();
     System.out.println(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
   }
 }
示例#8
0
  public void testSingleActionNode() throws Exception {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(
        new ClassPathResource("ActionNodeTest.xml", ActionNodeTest.class), ResourceType.DRF);
    KnowledgeBase kbase = kbuilder.newKnowledgeBase();

    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    List<String> list = new ArrayList<String>();
    ksession.setGlobal("list", list);

    ksession.startProcess("process name");

    assertEquals(1, list.size());
    assertEquals("action node was here", list.get(0));
  }
示例#9
0
  @Test
  public void testCompilationMustFailComparingAClassLiteral() {
    // DROOLS-20
    String str =
        "import org.drools.integrationtests.MiscTest2.Answer\n"
            + "import org.drools.integrationtests.MiscTest2.AnswerGiver\n"
            + "rule \"Test Rule\"\n"
            + "when\n"
            + "   AnswerGiver(Answer == Answer.YES)\n"
            + "then\n"
            + "end";

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);
    assertTrue(kbuilder.hasErrors());
  }
示例#10
0
  @Test
  public void testClassNotFoundAfterDeserialization() throws Exception {
    // JBRULES-3670
    String drl =
        "package completely.other.deal;\n"
            + "\n"
            + "declare Person\n"
            + "   firstName : String\n"
            + "   lastName : String\n"
            + "end\n"
            + "\n"
            + "rule \"now use it B\"\n"
            + "   when\n"
            + "       Person( $christianName, $surname; )\n"
            + "   then\n"
            + "       insert( new Person( $christianName, null ) );\n"
            + "end";

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL);

    if (kbuilder.hasErrors()) {
      throw new RuntimeException("" + kbuilder.getErrors());
    }

    FileManager fileManager = new FileManager().setUp();

    try {
      File root = fileManager.getRootDirectory();

      ObjectOutputStream out =
          new ObjectOutputStream(new FileOutputStream(new File(root, "test.drl.compiled")));
      out.writeObject(kbuilder.getKnowledgePackages());
      out.close();

      KieBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
      kconf.setOption(LRUnlinkingOption.ENABLED);
      KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kconf);

      ObjectInputStream in =
          new ObjectInputStream(new FileInputStream(new File(root, "test.drl.compiled")));
      kbase.addKnowledgePackages((Collection<KnowledgePackage>) in.readObject());
      in.close();
    } finally {
      fileManager.tearDown();
    }
  }
示例#11
0
  public void testNewSessionFailAfter() throws Exception {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("sampleFailAfter.bpmn"), ResourceType.BPMN2);
    KnowledgeBase kbase = kbuilder.newKnowledgeBase();
    SessionManagerFactory factory = new NewSessionSessionManagerFactory(kbase);
    SessionManager sessionManager = factory.getSessionManager();

    ProcessInstance processInstance =
        sessionManager.getKnowledgeSession().startProcess("com.sample.bpmn.hello", null);
    long workItemId =
        ((HumanTaskNodeInstance)
                ((WorkflowProcessInstance) processInstance).getNodeInstances().iterator().next())
            .getWorkItemId();
    long taskId = sessionManager.getTaskService().getTaskByWorkItemId(workItemId).getId();
    sessionManager.getTaskService().claim(taskId, "mary");

    List<Status> statusses = new ArrayList<Status>();
    statusses.add(Status.Reserved);

    List<TaskSummary> tasks =
        sessionManager.getTaskService().getTasksOwned("mary", statusses, "en-UK");
    assertEquals(1, tasks.size());

    taskId = tasks.get(0).getId();
    UserTransaction ut = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
    try {
      ut.begin();
      sessionManager.getTaskService().start(taskId, "mary");
      sessionManager.getTaskService().complete(taskId, "mary", null);
      fail("Task completed");
    } catch (RuntimeException e) {
      // do nothing
    }
    ut.rollback();

    // TODO: whenever transaction fails, do we need to dispose? can we?
    // sessionManager.dispose();

    sessionManager = factory.getSessionManager();
    tasks = sessionManager.getTaskService().getTasksOwned("mary", statusses, "en-UK");
    assertEquals(1, tasks.size());

    sessionManager.dispose();
    factory.dispose();
  }
示例#12
0
 public void testNewSession() throws Exception {
   KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
   kbuilder.add(ResourceFactory.newClassPathResource("sample.bpmn"), ResourceType.BPMN2);
   KnowledgeBase kbase = kbuilder.newKnowledgeBase();
   SessionManagerFactory factory = new NewSessionSessionManagerFactory(kbase);
   completedStart = 0;
   for (int i = 0; i < nbThreadsProcess; i++) {
     new StartProcessRunnable(factory, i).run();
   }
   completedTask = 0;
   for (int i = 0; i < nbThreadsTask; i++) {
     new Thread(new CompleteTaskRunnable(factory, i)).start();
   }
   while (completedStart < nbThreadsProcess || completedTask < nbThreadsTask) {
     Thread.sleep(100);
   }
   factory.dispose();
   System.out.println("Done");
 }
  public static void main(final String[] args) {

    final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(
        ResourceFactory.newClassPathResource(
            "WorkItemConsequence1.drl", WorkItemConsequenceExample1.class),
        ResourceType.DRL);

    final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    if (kbuilder.hasErrors()) {
      throw new RuntimeException("Compilation error.\n" + kbuilder.getErrors().toString());
    }

    final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    ksession
        .getWorkItemManager()
        .registerWorkItemHandler("EmailWorkItemHandler", new EmailWorkItemHandler());

    //        KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession,
    // "log/WorkItemConsequence.log");

    // Brains does not cause concern
    PersonLocation brains = new PersonLocation("Brains", 5);
    ksession.insert(brains);
    ksession.fireAllRules();

    // Gargamel is too far away to care
    PersonLocation gargamel = new PersonLocation("Gargamel", 10);
    FactHandle gargamelFactHandle = ksession.insert(gargamel);
    ksession.fireAllRules();

    // Uh oh, Gargamel moves closer
    gargamel.setDistance(5);
    ksession.update(gargamelFactHandle, gargamel);
    ksession.fireAllRules();

    //        logger.close();

    ksession.dispose(); // Stateful rule session must always be disposed when finished
  }
示例#14
0
  @Test
  public void testMVELForLoop() throws Exception {
    // JBRULES-3717
    String str =
        "rule demo\n"
            + "dialect \"mvel\"\n"
            + "when\n"
            + "then\n"
            + "   for ( int i = 1; i <= 3; i++ ) {\n"
            + "       insert( \"foo\" + i );\n"
            + "   }\n"
            + "end";

    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();

    builder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);

    if (builder.hasErrors()) {
      throw new RuntimeException(builder.getErrors().toString());
    }
  }
示例#15
0
  @Test
  public void testDynamicAddRule() {
    // DROOLS-17
    String str =
        "import org.drools.integrationtests.MiscTest2.A\n"
            + "rule r1 when\n"
            + "    $a : A( f1 == 1 )\n"
            + "then\n"
            + "end\n"
            + "\n"
            + "rule r2 when\n"
            + "    $a : A( f2 == 1 )\n"
            + "then\n"
            + "end\n"
            + "\n"
            + "rule r3 when\n"
            + "    $a : A( f3 == 1 )"
            + "then\n"
            + "end";

    String str2 =
        "import org.drools.integrationtests.MiscTest2.A\n"
            + "rule r4 when\n"
            + "    $a : A( f2 == 1, f4 == 1 )"
            + "then\n"
            + "end";

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL);

    if (kbuilder.hasErrors()) {
      fail(kbuilder.getErrors().toString());
    }

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    FactHandle fh = ksession.insert(new A(1, 1, 1, 1));

    ksession.fireAllRules();

    kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(str2.getBytes()), ResourceType.DRL);

    if (kbuilder.hasErrors()) {
      fail(kbuilder.getErrors().toString());
    }
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    ksession.fireAllRules();

    // this second insert forces the regeneration of the otnIds
    ksession.insert(new A(2, 2, 2, 2));

    LeftTuple leftTuple = ((DefaultFactHandle) fh).getFirstLeftTuple();
    ObjectTypeNode.Id letTupleOtnId = leftTuple.getLeftTupleSink().getLeftInputOtnId();
    leftTuple = leftTuple.getLeftParentNext();
    while (leftTuple != null) {
      assertTrue(letTupleOtnId.before(leftTuple.getLeftTupleSink().getLeftInputOtnId()));
      letTupleOtnId = leftTuple.getLeftTupleSink().getLeftInputOtnId();
      leftTuple = leftTuple.getLeftParentNext();
    }
  }
  @Test
  public void testGlobal() throws Exception {
    Options xjcOpts = new Options();
    xjcOpts.setSchemaLanguage(Language.XMLSCHEMA);
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

    JaxbConfiguration jaxbConf = KnowledgeBuilderFactory.newJaxbConfiguration(xjcOpts, "xsd");

    kbuilder.add(
        ResourceFactory.newClassPathResource("order.xsd", getClass()), ResourceType.XSD, jaxbConf);

    assertFalse(kbuilder.hasErrors());

    kbuilder.add(
        ResourceFactory.newClassPathResource("test_Jaxb.drl", getClass()), ResourceType.DRL);

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

    assertFalse(kbuilder.hasErrors());

    assertFalse(kbuilder.hasErrors());

    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    KnowledgeRuntimeCommand setGlobalStage =
        PipelineFactory.newStatefulKnowledgeSessionSetGlobal("order");

    JAXBContext jaxbCtx =
        KnowledgeBuilderHelper.newJAXBContext(
            jaxbConf.getClasses().toArray(new String[jaxbConf.getClasses().size()]), kbase);

    Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
    Transformer transformer = PipelineFactory.newJaxbFromXmlTransformer(unmarshaller);
    transformer.setReceiver(setGlobalStage);

    Pipeline pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline(ksession);
    pipeline.setReceiver(transformer);

    String xml =
        StringUtils.readFileAsString(
            new InputStreamReader(getClass().getResourceAsStream("order.xml")));

    ResultHandlerImpl resultHandler = new ResultHandlerImpl();
    pipeline.insert(xml, resultHandler);

    // now round trip that global
    Action executeResult = PipelineFactory.newExecuteResultHandler();

    Action assignAsResult = PipelineFactory.newAssignObjectAsResult();
    assignAsResult.setReceiver(executeResult);

    // transformer = PipelineFactory.newXStreamToXmlTransformer( xstream );
    Marshaller marshaller = jaxbCtx.createMarshaller();
    transformer = PipelineFactory.newJaxbToXmlTransformer(marshaller);
    transformer.setReceiver(assignAsResult);

    KnowledgeRuntimeCommand getGlobalStage = PipelineFactory.newStatefulKnowledgeSessionGetGlobal();
    getGlobalStage.setReceiver(transformer);

    pipeline = PipelineFactory.newStatefulKnowledgeSessionPipeline(ksession);
    pipeline.setReceiver(getGlobalStage);

    resultHandler = new ResultHandlerImpl();
    pipeline.insert("order", resultHandler);

    assertEqualsIgnoreWhitespace(xml, (String) resultHandler.getObject());
  }