[jboss-jira] [JBoss JIRA] (DROOLS-185) ClassCastException at ConditionEvaluator

Gurinder Randhawa (JIRA) jira-events at lists.jboss.org
Wed Oct 16 13:24:02 EDT 2013


    [ https://issues.jboss.org/browse/DROOLS-185?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12815482#comment-12815482 ] 

Gurinder Randhawa commented on DROOLS-185:
------------------------------------------

Davide I have resolved this issue.The rule below is run as soon as RefData(code == "TRIP") is inserted into session (as you mentioned), it has a condition with 3 constraints on RateFactorGroup. Looks like method matchInput(Long inputValue) takes in a Long but is passed an integer. I have wrapped it with a new Long(...) across rule base and seems to solve this issue.

Thanks for the help, I never would have narrowed down problem with your help! Hopefully this can be fixed in 5.6.0, I attempted to try 6.x but there are major API changes, more than we are prepared to deal with at this time. Thanks!

rule "20510_DefaultFactor_TRIP_multi_trip_medical"
    no-loop
    salience 7000
when
    $tripRateFactorCode: RefData(code == "TRIP")
    $trip: Trip(getDuration()!=null)
    $rateGroup: RateStandardGroup()
    $plan: Plan(rateGroups contains $rateGroup)
    $insuredPlan: InsuredPlan(planRefId == $plan.refId, planCode in ("PL-MMED-1","PL-MMED-2","PL-MMED-3","PL-MMED-4","PL-MMED-5"), getConfiguredParameterByGroupCode("TRIP")==null)
    $rateFactorGroup: RateFactorGroup(factorType == $tripRateFactorCode, parentGroupRefId == $rateGroup.refId, matchInput($trip.getDuration())!=null)
    $factorValue : RateFactorValue() from $rateFactorGroup.matchInput($trip.getDuration())
then
    RateFactorParameter parameter = new RateFactorParameter($factorValue, $trip.getDuration().toString());
    $insuredPlan.addConfiguredParameter(parameter);
    System.out.println("20510-Create TRIP Factor plan parameter   |code=" + $insuredPlan.getPlanCode() + "|value="+$factorValue.getValue()+"|min="+$factorValue.getMinValue()+"|max="+$factorValue.getMaxValue()+"|days="+$trip.getDuration());    
end
                
> ClassCastException at ConditionEvaluator
> ----------------------------------------
>
>                 Key: DROOLS-185
>                 URL: https://issues.jboss.org/browse/DROOLS-185
>             Project: Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 5.5.0.Final
>            Reporter: Sergey Alaev
>            Assignee: Mario Fusco
>
> Stacktrace:
> Caused by: java.lang.ClassCastException: ***** cannot be cast to ******
> 	at ConditionEvaluator443abf2927ca4f64a4ad86407ae34799.evaluate(Unknown Source)
> 	at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200)
> 	at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157)
> 	at org.drools.reteoo.FromNode.checkConstraintsAndPropagate(FromNode.java:318)
> 	at org.drools.reteoo.FromNode.assertLeftTuple(FromNode.java:164)
> 	at org.drools.reteoo.CompositeLeftTupleSinkAdapter.doPropagateAssertLeftTuple(CompositeLeftTupleSinkAdapter.java:232)
> 	at org.drools.reteoo.CompositeLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(CompositeLeftTupleSinkAdapter.java:116)
> 	at org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:154)
> 	at org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:59)
> Reason:
> ConditionEvaluator seems to be using lazy initializing and then caches generated class to evaluate this expression with another arguments.
> Given following:
> interface A {
>    String getString();
> }
> interface B {
>    String getString();
> }
> class X implements B, A {}
> class Y implements A{}
> rule "test rule"
> when:
>      A(string != null)
> then:
> end
> When rule engine is called for the first time with instance of class X, ConditionEvaluator will bind itself to first found interface implementing method getString(), i.e. interface B.
> Thus second call with instance of class Y will cause ClassCastException of casting Y to B.
> Solution: force MVEL to bind bytecode generated methods to class/interface declared in the rule explicitly, in our case - to interface A.
> Quickfix: use following declaration of class X:
> class X implements A, B {}
> Because ConditionEvaluator binds to first available interface, it will bind now to correct interface - to interface A.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the jboss-jira mailing list