[jboss-jira] [JBoss JIRA] (JBRULES-3617) NullpointerException in Accumulate when use query
Yingzhi Wang (JIRA)
jira-events at lists.jboss.org
Fri Sep 7 00:27:32 EDT 2012
[ https://issues.jboss.org/browse/JBRULES-3617?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Yingzhi Wang updated JBRULES-3617:
----------------------------------
Priority: Critical (was: Minor)
> NullpointerException in Accumulate when use query
> -------------------------------------------------
>
> Key: JBRULES-3617
> URL: https://issues.jboss.org/browse/JBRULES-3617
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: drools-core (expert)
> Affects Versions: 5.4.0.Final
> Environment: OS: Windows xp
> IDE: Eclipse
> JRE: 1.6
> Reporter: Yingzhi Wang
> Assignee: Mark Proctor
> Priority: Critical
> Labels: Accumulate, query, reverse
>
> FACT: Person
> package test;
> public class Persion {
>
> private String firstname;
> private String secondname;
> private String address;
>
> public Persion() {
> }
>
> public String getFirstname() {
> return firstname;
> }
> public void setFirstname(String firstname) {
> this.firstname = firstname;
> }
> public String getSecondname() {
> return secondname;
> }
> public void setSecondname(String secondname) {
> this.secondname = secondname;
> }
> public String getAddress() {
> return address;
> }
> public void setAddress(String address) {
> this.address = address;
> }
>
> }
> r1.drl:
> package test1
> import test.Persion
> import java.util.HashSet
> query find(String $first, String $second)
> p: Persion(firstname == "111", secondname==$second)
> end
> rule "test"
> no-loop true
> when
> $list: HashSet( size >= 0 )
> from accumulate (
> Persion($addr: address, firstname=="Tom", secondname=="Cat"),
> init ( HashSet set = new HashSet(); ),
> action ( set.add($addr); ),
> reverse ( set.remove($addr); ),
> result(set) )
> then
> System.out.println("It' OK~!");
> end
> Test.java
> package test;
> import java.util.Collection;
> import org.drools.KnowledgeBase;
> import org.drools.KnowledgeBaseFactory;
> import org.drools.builder.KnowledgeBuilder;
> import org.drools.builder.KnowledgeBuilderError;
> import org.drools.builder.KnowledgeBuilderErrors;
> import org.drools.builder.KnowledgeBuilderFactory;
> import org.drools.builder.ResourceType;
> import org.drools.definition.KnowledgePackage;
> import org.drools.io.ResourceFactory;
> import org.drools.runtime.StatefulKnowledgeSession;
> import org.drools.runtime.rule.FactHandle;
> public class Test {
> public static void main(String[] args) throws Exception {
> new Test().test();
> }
>
> public void test() throws Exception {
> KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase();
> StatefulKnowledgeSession s = base.newStatefulKnowledgeSession();
> new Th(s).start();
> Thread.sleep(2000);
>
> KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> builder.add(ResourceFactory.newClassPathResource("r1.drl", getClass()), ResourceType.DRL);
> KnowledgeBuilderErrors errs = builder.getErrors();
> if (!errs.isEmpty()) {
> for (KnowledgeBuilderError e: errs) {
> System.out.println(e.toString());
> }
> }
> Collection<KnowledgePackage> col = builder.getKnowledgePackages();
> base.addKnowledgePackages(col);
> }
>
> class Th extends Thread {
> StatefulKnowledgeSession s;
> public Th(StatefulKnowledgeSession s) {
> this.s = s;
> }
> public void run() {
> Persion p = new Persion();
> p.setFirstname("Tom");
> p.setSecondname("Cat");
> p.setAddress("Mars");
> FactHandle fact = s.insert(p);
> int i=0;
> while (true) {
> s.update(fact, p);
> s.fireAllRules();
> try {
> Thread.sleep(1000);
> } catch (InterruptedException e) {}
> i++;
> }
> }
> }
> }
> Run Test.java, will throws Exception:
> Exception in thread "Thread-0" org.drools.RuntimeDroolsException: java.lang.NullPointerException
> at org.drools.rule.Accumulate.reverse(Accumulate.java:212)
> at org.drools.reteoo.AccumulateNode.removeMatch(AccumulateNode.java:902)
> at org.drools.reteoo.AccumulateNode.modifyRightTuple(AccumulateNode.java:537)
> at org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:531)
> at org.drools.reteoo.SingleObjectSinkAdapter.propagateModifyObject(SingleObjectSinkAdapter.java:68)
> at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157)
> at org.drools.reteoo.SingleObjectSinkAdapter.propagateModifyObject(SingleObjectSinkAdapter.java:68)
> at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157)
> at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507)
> at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:421)
> at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314)
> at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265)
> at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:470)
> at org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:960)
> at org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:933)
> at org.drools.impl.StatefulKnowledgeSessionImpl.update(StatefulKnowledgeSessionImpl.java:284)
> at test.Test$Th.run(Test.java:53)
> Caused by: java.lang.NullPointerException
> at test1.Rule_test_b59970efe0844a8d8797758b863454b1$Accumulate0.reverse(Rule_test_b59970efe0844a8d8797758b863454b1.java:52)
> at test1.Rule_test_b59970efe0844a8d8797758b863454b1Accumulate0Invoker.reverse(Rule_test_b59970efe0844a8d8797758b863454b1Accumulate0Invoker.java:69)
> at org.drools.rule.Accumulate.reverse(Accumulate.java:203)
> ... 16 more
> But, if I change the query to like this:
> query find(String $first, String $second)
> p: Persion(firstname == "111", secondname==$second)
> end
> It will be ok.
> However if I change the query to like this:
> query find(String $first, String $second)
> p: Persion(firstname == "Tom", secondname==$second)
> end
> It will throws Exception again.
> firstname=="Tom" is a condition of rule "test"
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list