Michael,

Yes, this is certainly a bug. May I ask you please to open a JIRA for that and attach your sample code?

A comment about "no-loop": it only prevents the rule activating itself... it does not prevent the rule from activating other rules that already fired. You must add an explicit constraint to avoid the activation of the rules you don't want to activate when modifying objects that are part of the matching pattern.

  Thank you in advance.

   Edson


Anstis, Michael (M.) wrote:

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

------------------------------------------------------------------------

_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users


--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3124-6000
Mobile: +55 11 9218-4151
JBoss, a division of Red Hat @ www.jboss.com


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to