[jboss-jira] [JBoss JIRA] Commented: (JBRULES-515) java NullPointerException when using constraints between fields in same object
Edson Tirelli (JIRA)
jira-events at jboss.com
Tue Nov 14 12:06:41 EST 2006
[ http://jira.jboss.com/jira/browse/JBRULES-515?page=comments#action_12347009 ]
Edson Tirelli commented on JBRULES-515:
---------------------------------------
Just adding a sample DRL here for reference:
---------------------
package org.drools.integrationtests
import org.drools.Sensor;
global java.util.List sensors;
rule "BindsTest1_returnValue"
when
$sensor1 : Sensor( $temp1 : temperature, pressure < $temp1 )
$sensor2 : Sensor( $temp2 : temperature, pressure < ( $temp1 + $temp2 ) )
then
sensors.add( $sensor1 );
end
rule "BindsTest2_predicate"
when
$sensor1 : Sensor( $temp1 : temperature, pressure < $temp1 )
$sensor2 : Sensor( $temp2 : temperature, $p : pressure -> ( $p < ($temp1 + $temp2 ) ) )
then
sensors.add( $sensor1 );
end
rule "BindsTest3_eval"
when
$sensor1 : Sensor( $temp1 : temperature, pressure < $temp1 )
$sensor2 : Sensor( $temp2 : temperature, $p : pressure )
eval( $p < $temp1 + $temp2 )
then
sensors.add( $sensor1 );
end
> java NullPointerException when using constraints between fields in same object
> ------------------------------------------------------------------------------
>
> Key: JBRULES-515
> URL: http://jira.jboss.com/jira/browse/JBRULES-515
> Project: JBoss Rules
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Affects Versions: 3.0.4
> Environment: Linux
> Reporter: Sridhar Chandrasekharan
> Assigned To: Edson Tirelli
> Fix For: 3.1-m1
>
>
> Consider the following files:-
> 1) Foo.java
> package com.foo;
> public class Foo {
> private int a;
> private int b;
> public Foo(int a, int b) {
> super();
> this.a = a;
> this.b = b;
> }
> public boolean test()
> {
> return (a > b);
> }
> public int getA() {
> return a;
> }
> public int getB() {
> return b;
> }
>
> }
> ******************************************************************************
> 2) FooTest.java
> package com.foo;
> import java.io.InputStreamReader;
> import java.io.*;
>
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> import org.drools.WorkingMemory;
> import org.drools.compiler.PackageBuilder;
> import org.drools.rule.Package;
> public class FooTest {
>
>
> /**
> * This is a sample file to launch a rule package from a rule source file.
> */
> public static final void main(String[] args) {
> try {
>
> //load up the rulebase
> RuleBase ruleBase = readRule();
> WorkingMemory workingMemory = ruleBase.newWorkingMemory();
>
> //go !
>
> workingMemory.fireAllRules();
>
>
> } catch (Throwable t) {
> t.printStackTrace();
> }
> }
> /**
> * Please note that this is the "low level" rule assembly API.
> */
> private static RuleBase readRule() throws Exception {
> //read in the source
> Reader source = new InputStreamReader( FooTest.class.getResourceAsStream( "/Foo.drl" ) );
>
> //optionally read in the DSL (if you are using it).
> //Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
> //Use package builder to build up a rule package.
> //An alternative lower level class called "DrlParser" can also be used...
>
> PackageBuilder builder = new PackageBuilder();
> //this wil parse and compile in one step
> //NOTE: There are 2 methods here, the one argument one is for normal DRL.
> builder.addPackageFromDrl( source );
> //Use the following instead of above if you are using a DSL:
> //builder.addPackageFromDrl( source, dsl );
>
> //get the compiled package (which is serializable)
> Package pkg = builder.getPackage();
>
> //add the package to a rulebase (deploy the rule package).
> RuleBase ruleBase = RuleBaseFactory.newRuleBase();
> ruleBase.addPackage( pkg );
> return ruleBase;
> }
>
> }
> ***************************************************
> 3) Foo.drl
> package com.foo
> rule "Initialization rule"
> when
> #conditions
> then
> assert(new Foo(1,1));
> assert(new Foo(2,1));
> assert(new Foo(2,3));
> assert(new Foo(3,2));
> assert(new Foo(3,4));
> assert(new Foo(4,3));
> end
> rule "a greater than b"
> when
> f : Foo(x : a, b < x)
> then
> System.out.println("a=" + f.getA() + " b=" + f.getB() );
> end
> ******************************************
> I get the following error when running the program
> java.lang.NullPointerException
> at org.drools.rule.BoundVariableConstraint.isAllowed(Unknown Source)
> at org.drools.common.BetaNodeBinder.isAllowed(Unknown Source)
> at org.drools.reteoo.LeftInputAdapterNode.assertObject(Unknown Source)
> at org.drools.reteoo.ObjectSource.propagateAssertObject(Unknown Source)
> at org.drools.reteoo.ObjectTypeNode.assertObject(Unknown Source)
> at org.drools.reteoo.Rete.assertObject(Unknown Source)
> at org.drools.reteoo.ReteooRuleBase.assertObject(Unknown Source)
> at org.drools.reteoo.ReteooWorkingMemory.doAssertObject(Unknown Source)
> at org.drools.common.AbstractWorkingMemory.assertObject(Unknown Source)
> at org.drools.base.DefaultKnowledgeHelper.assertObject(Unknown Source)
> at org.drools.base.DefaultKnowledgeHelper.assertObject(Unknown Source)
> at com.foo.Rule_Initialization_rule_0.consequence(Rule_Initialization_rule_0.java:7)
> at com.foo.Rule_Initialization_rule_0ConsequenceInvoker.evaluate(Rule_Initialization_rule_0ConsequenceInvoker.java:18)
> at org.drools.common.DefaultAgenda.fireActivation(Unknown Source)
> at org.drools.common.DefaultAgenda.fireNextItem(Unknown Source)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(Unknown Source)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(Unknown Source)
> at com.foo.FooTest.main(FooTest.java:27)
> org.drools.spi.ConsequenceException: java.lang.NullPointerException
> at org.drools.common.DefaultAgenda.fireActivation(Unknown Source)
> at org.drools.common.DefaultAgenda.fireNextItem(Unknown Source)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(Unknown Source)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(Unknown Source)
> at com.foo.FooTest.main(FooTest.java:27)
> Caused by: java.lang.NullPointerException
> at org.drools.rule.BoundVariableConstraint.isAllowed(Unknown Source)
> at org.drools.common.BetaNodeBinder.isAllowed(Unknown Source)
> at org.drools.reteoo.LeftInputAdapterNode.assertObject(Unknown Source)
> at org.drools.reteoo.ObjectSource.propagateAssertObject(Unknown Source)
> at org.drools.reteoo.ObjectTypeNode.assertObject(Unknown Source)
> at org.drools.reteoo.Rete.assertObject(Unknown Source)
> at org.drools.reteoo.ReteooRuleBase.assertObject(Unknown Source)
> at org.drools.reteoo.ReteooWorkingMemory.doAssertObject(Unknown Source)
> at org.drools.common.AbstractWorkingMemory.assertObject(Unknown Source)
> at org.drools.base.DefaultKnowledgeHelper.assertObject(Unknown Source)
> at org.drools.base.DefaultKnowledgeHelper.assertObject(Unknown Source)
> at com.foo.Rule_Initialization_rule_0.consequence(Rule_Initialization_rule_0.java:7)
> at com.foo.Rule_Initialization_rule_0ConsequenceInvoker.evaluate(Rule_Initialization_rule_0ConsequenceInvoker.java:18)
> ... 5 more
> If I change the 2nd rule to
> rule "a greater than b"
> when
> f : Foo()
> and eval(f.test())
> then
> System.out.println("a=" + f.getA() + " b=" + f.getB() );
> end
> It works as expected.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list