When an XPath pattern is following a not pattern, the evaluation can trigger an ArrayIndexOutOfBoundsException.
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.