When an XPath pattern is following a not pattern, the evaluation can trigger an ArrayIndexOutOfBoundsException.

Solution Unverified - Updated -

Issue

When an XPath pattern is following a not pattern, the evaluation can trigger an ArrayIndexOutOfBoundsException.
For example, when I run a rule like (*1) below by sending a request like (*2) to the rule engine,

(*1) Example rule

unit FactRuleUnit;

query facts
    $f : /facts
end

rule "Rule 1"
    when
        $f : /facts[ $errorMessageList : errorMessageList ]
        not ErrorMessage( errorCode == "ERR007" ) from $errorMessageList    // ..... (*1-1) a not pattern
        $i : /facts.factInfo[ age < 20 ]                        // ..... (*1-2) an XPath pattern following a not pattern (*1-1)
    then
        ErrorMessage $em = new ErrorMessage();
        $em.setErrorCode("ERR007");
        $em.setErrorType("prohibition");
        $em.setErrorMessage("Alcoholic beverages cannot be served to customers under 20 years of age.");
        $f.getErrorMessageList().add($em);
        update($f);
end

(*2) POST request for the rule (*1)

$ curl -X POST http://localhost:8080/facts -H 'content-type: application/json' -H 'accept: application/json' -d '{ "facts": [ { "factInfo": { "name": "Iyo", "age": 16 } } ] }'

the rule is not executed successfully and an ArrayIndexOutOfBoundsException like (*3) below occurs.

(*3) ArrayIndexOutOfBoundsException

    Caused by: java.lang.ArrayIndexOutOfBoundsException: arraycopy: last source index 2 out of bounds for object array[1]
        at java.base/java.lang.System.arraycopy(Native Method)
        at org.drools.core.reteoo.ReactiveFromNodeLeftTuple.<init>(ReactiveFromNodeLeftTuple.java:49)
        at org.drools.core.reteoo.ReactiveFromNode.createLeftTuple(ReactiveFromNode.java:110)
        at org.drools.core.phreak.PhreakJoinNode.insertChildLeftTuple(PhreakJoinNode.java:482)
        at org.drools.core.phreak.PhreakJoinNode.doLeftInserts(PhreakJoinNode.java:110)
        at org.drools.core.phreak.PhreakJoinNode.doNode(PhreakJoinNode.java:71)
        at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:572)
        at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:558)
        at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:385)
        at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:345)
        at org.drools.core.phreak.RuleNetworkEvaluator.evalStackEntry(RuleNetworkEvaluator.java:243)
        at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:186)
        at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:139)
        at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:235)
        at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:91)
        at org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:33)
        at org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43)
        at org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:869)
        at org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:816)
        at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:808)
        at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1343)
        at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1334)
        at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1318)
        at org.kie.kogito.rules.units.AbstractRuleUnitInstance.fire(AbstractRuleUnitInstance.java:46)
        at org.kie.kogito.rules.units.AbstractRuleUnitInstance.executeQuery(AbstractRuleUnitInstance.java:56)
        at com.example.reproducer.FactRuleUnitQueryFacts.execute(FactRuleUnitQueryFacts.java:33)
        at com.example.reproducer.FactRuleUnitQueryFacts.execRuleUnitQueryFacts.java:1)
        at org.kie.kogito.rules.units.AbstractRuleUnitInstance.executeQuery(AbstractRuleUnitInstance.java:62)
        at com.example.reproducer.FactRuleUnitQueryFactsEndpoint.executeQuery(FactRuleUnitQueryFactsEndpoint.java:48)
            :
            :

Environment

  • Red Hat Decision Manager (RHDM)
    • 7.11.0 - 7.12.1

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content