Пример #1
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();
  }
  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
  }