Hi - me again :-(
Unfortunately I receive a NPE (3.1-M1) as follows (a complete JAR illustrating the problem is available):-
**Java
Man man=new Man();
Machine machine=new Machine();
Process p = new Process();
wm.assertObject(man);
wm.assertObject(machine);
wm.assertObject(p);
**Rules
package drools.debug
rule "Rule-1"
no-loop true
when
$p : Process()
then
System.out.println("DEBUG [Rule-1]---> Add ProcessAlternative to Process");
ProcessAlternative pa = new ProcessAlternative();
$p.addProcessAlternative(pa);
assert(pa);
modify($p);
end
rule "Rule-2"
no-loop true
when
$m : Machine()
then
System.out.println("DEBUG [Rule-2]---> Add Machine to MachineEntry");
MachineEntry me = new MachineEntry();
me.setMachine($m);
assert(me);
end
rule "Rule-3"
no-loop true
when
$me : MachineEntry()
$pa : ProcessAlternative()
then
System.out.println("DEBUG [Rule-3]---> Add MachineEntry to ProcessAlternative");
$pa.addMachineEntry($me);
modify($pa);
end
//rule "Rule-4 (Null Pointer Exception)"
//no-loop true
//when
// $h : Man ( )
// $m : Machine ( )
// $mte : MachineEntry ( machine == $m )
//then
// System.out.println("DEBUG [Rule 4]---> Assigned resource");
// $m.setManualResource($h);
// modify($m);
//end
**Output
DEBUG [Rule-1]---> Add ProcessAlternative to Process
DEBUG [Rule-2]---> Add Machine to MachineEntry
DEBUG [Rule-3]---> Add MachineEntry to ProcessAlternative
This is what I'd expect. If however rule "Rule-4" is uncommented the output is:-
DEBUG [Rule-1]---> Add ProcessAlternative to Process
DEBUG [Rule-2]---> Add Machine to MachineEntry
DEBUG [Rule-3]---> Add MachineEntry to ProcessAlternative
DEBUG [Rule 4]---> Assigned resource
DEBUG [Rule-2]---> Add Machine to MachineEntry <-- Why activated? no-loop is true
DEBUG [Rule 4]---> Assigned resource <-- Presumably activated as a consequence of above
And I receive a NPE with the following stack trace:-
java.lang.NullPointerException
at org.drools.reteoo.RuleTerminalNode.retractTuple(RuleTerminalNode.java:267)
at org.drools.reteoo.SingleTupleSinkAdapter.propagateRetractTuple(SingleTupleSinkAdapter.java:38)
at org.drools.reteoo.JoinNode.retractTuple(JoinNode.java:217)
at org.drools.reteoo.SingleTupleSinkAdapter.propagateRetractTuple(SingleTupleSinkAdapter.java:38)
at org.drools.reteoo.JoinNode.retractObject(JoinNode.java:183)
at org.drools.reteoo.CompositeObjectSinkAdapter.propagateRetractObject(CompositeObjectSinkAdapter.java:369)
at org.drools.reteoo.ObjectTypeNode.retractObject(ObjectTypeNode.java:189)
at org.drools.reteoo.Rete.retractObject(Rete.java:171)
at org.drools.reteoo.ReteooRuleBase.retractObject(ReteooRuleBase.java:215)
at org.drools.reteoo.ReteooWorkingMemory.doRetract(ReteooWorkingMemory.java:76)
at org.drools.common.AbstractWorkingMemory.modifyObject(AbstractWorkingMemory.java:940)
at org.drools.base.DefaultKnowledgeHelper.modifyObject(DefaultKnowledgeHelper.java:95)
at drools.debug.Rule_Rule_4__Null_Pointer_Exception__0.consequence(Rule_Rule_4__Null_Pointer_Exception__0.java:8)
at drools.debug.Rule_Rule_4__Null_Pointer_Exception__0ConsequenceInvoker.evaluate(Rule_Rule_4__Null_Pointer_Exception__0ConsequenceInvoker.java:24)
at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:467)
at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:431)
at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:360)
I have also encountered NPE in "org.drools.reteoo.AlphaNode.retractObject" when using my actual rules other than these simplifications put together to demonstrate the error (both are caused by a call to "final Activation activation = tuple.getActivation();" returning NULL so I suspect the root cause to be common). Is this a case for a new JIRA entry or have I done something idiotic?
With kind regards,
Mike