[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