Search code examples
androiddrools

Trouble with nested objects: org.drools.RuntimeDroolsException: Exception executing predicate


So I have been dabbling with Drools on Android for a couple of weeks, and I always get an error when I'm implementing a predicate with nested objects.

I have the following two classes:

public final class InterventionFunction{
   private String interventionFunctionName;

   // public getter and setter
}

public class Notification{
   private InterventionFunction interventionFunction;
   private String type;

   // public getter and setter
}

And I have the following rule:

rule "Education"
    when
        $n : Notification( interventionFunction.interventionFunctionName.equals("Education") )
    then
        modify ( $n ) { setType("hello") };
end

When I run my application, I get the following error:

org.drools.runtime.rule.ConsequenceException: rule: Education
        at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:916)
        at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:845)
        at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1056)
        at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:733)
        at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:699)
        at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:218)
        at com.example.jeanineharb.reasoning.DroolsTest.rules(DroolsTest.java:20)
        at ch.heiafr.pegaso.companion.TriggerSimulationActivity.sendTrigger(TriggerSimulationActivity.java:107)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at android.view.View$1.onClick(View.java:4015)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
 Caused by: org.drools.RuntimeDroolsException: Exception executing predicate interventionFunction.interventionFunctionName.equals("Education")
        at org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:298)
        at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:145)
        at org.drools.reteoo.SingleObjectSinkAdapter.propagateModifyObject(SingleObjectSinkAdapter.java:68)
        at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:266)
        at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:218)
        at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:455)
        at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:360)
        at org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:210)
        at org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:218)
        at org.drools.base.ModifyInterceptor.doAfter(ModifyInterceptor.java:59)
        at org.mvel2.ast.InterceptorWrapper.getReducedValueAccelerated(InterceptorWrapper.java:40)
        at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
        at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123)
        at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119)
        at org.mvel2.MVEL.executeExpression(MVEL.java:930)
        at org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:105)
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:906)
            at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:845)
            at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1056)
            at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:733)
            at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:699)
            at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:218)
            at com.example.jeanineharb.reasoning.DroolsTest.rules(DroolsTest.java:20)
            at ch.heiafr.pegaso.companion.TriggerSimulationActivity.sendTrigger(TriggerSimulationActivity.java:107)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4015)
            at android.view.View.performClick(View.java:4780)
            at android.view.View$PerformClick.run(View.java:19866)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
 Caused by: [Error: can't load this type of class file]
[Near : {... interventionFunction.intervent ....}]
^
[Line: 1, Column: 1]
        at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:904)
        at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.optimizeAccessor(ASMAccessorOptimizer.java:268)
        at org.mvel2.optimizers.dynamic.DynamicGetAccessor.optimize(DynamicGetAccessor.java:95)
        at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:65)
        at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
        at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
        at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123)
        at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119)
        at org.mvel2.MVEL.executeExpression(MVEL.java:930)
        at org.drools.base.mvel.MVELPredicateExpression.evaluate(MVELPredicateExpression.java:101)
        at org.drools.rule.PredicateConstraint.isAllowed(Predic

(In that same rules file, I have another rule that uses the Notification class but works instead on the type property. It works flawlessly and does not emit any type of exception.)

Does anyone know what's the issue here?

NB: I am using Drools 5.2.0.


Solution

  • Found it.

    For some reason, this does not work:

    rule "Education"
        when
            $n : Notification( getInterventionFunction().getInterventionFunctionName().equals("Education") )
        then
            modify ( $n ) { setType("hello") };
    end
    

    But this does:

    rule "Education"
        when
            $n : Notification( getType() == "trigger" && getInterventionFunction().getInterventionFunctionName().equals("Education") )
        then
            modify ( $n ) { setType("hello") };
    end
    

    Does anyone know why the first code snippet refuses to work?