Description
If setting a null value for an artifact in the right hand side in the rule, for example:
$any.setTypeId(null);
This is executed after the rule is evaluated and fired.
When the audit log is enabled, the rule is evaluated again. However, the fact is already set as null which causes the NPE when accessing AnyType.getTypeId:
org.jboss.brms.test.RetractionTest testRetraction
SEVERE: java.lang.NullPointerException
java.lang.NullPointerException
at org.jboss.brms.test.RetractionTest$AnyType.getTypeId(RetractionTest.java:74)
at org.drools.base.org.jboss.brms.test.RetractionTest$AnyType21207783$getTypeId.getValue(Unknown Source)
at org.drools.core.base.ClassFieldReader.getValue(ClassFieldReader.java:91)
at org.drools.core.rule.Declaration.getValue(Declaration.java:253)
at org.drools.core.reteoo.RuleTerminalNodeLeftTuple.getDeclarationValue(RuleTerminalNodeLeftTuple.java:388)
at org.drools.core.audit.WorkingMemoryLogger.extractDeclarations(WorkingMemoryLogger.java:332)
at org.drools.core.audit.WorkingMemoryLogger.afterMatchFired(WorkingMemoryLogger.java:309)
at org.drools.core.event.AgendaEventSupport.fireAfterActivationFired(AgendaEventSupport.java:98)
at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1132)
at org.drools.core.phreak.RuleExecutor.fire(RuleExecutor.java:121)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:74)
at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1008)
at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1351)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1289)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1336)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1327)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1308)
at org.jboss.brms.test.RetractionTest.testRetraction(RetractionTest.java:164)
...
A proposed fix could be:
org.drools.core.reteoo.RuleTerminalNodeLeftTuple
getDeclarationValue method
from
return decl.getValue(null, handle.getObject());
To
if(handle.isValid())
return decl.getValue(null, handle.getObject());
else
return null;
This has been tested and works fine.