[jboss-jira] [JBoss JIRA] (JBRULES-3617) NullpointerException in Accumulate when use query

Yingzhi Wang (JIRA) jira-events at lists.jboss.org
Thu Sep 6 02:56:33 EDT 2012


Yingzhi Wang created JBRULES-3617:
-------------------------------------

             Summary: 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: Minor


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