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

Yingzhi Wang (JIRA) jira-events at lists.jboss.org
Mon Sep 24 02:23:34 EDT 2012


     [ https://issues.jboss.org/browse/JBRULES-3617?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Yingzhi Wang updated JBRULES-3617:
----------------------------------

    Description: 
FACT: Person
package test;

public class Person {
	
	private String firstname;
	private String secondname;
	private String address;
	
	public Person() {
	}
	
	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.Person
import java.util.HashSet

query find(String $first, String $second)
	p: Person(firstname == "111", secondname==$second)
end

rule "test"
	no-loop true    	
    when
    	$list: HashSet( size >= 0 ) 
    		from accumulate (
    			Person($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() {
			Person p = new Person();
			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: Person(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: Person(firstname == "Tom", secondname==$second)
end
It will throws Exception again.
firstname=="Tom" is a condition of rule "test"


  was:
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"



    
> 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 Person {
> 	
> 	private String firstname;
> 	private String secondname;
> 	private String address;
> 	
> 	public Person() {
> 	}
> 	
> 	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.Person
> import java.util.HashSet
> query find(String $first, String $second)
> 	p: Person(firstname == "111", secondname==$second)
> end
> rule "test"
> 	no-loop true    	
>     when
>     	$list: HashSet( size >= 0 ) 
>     		from accumulate (
>     			Person($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() {
> 			Person p = new Person();
> 			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: Person(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: Person(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