]
Crosson David updated DROOLS-4909:
----------------------------------
Affects Version/s: 7.31.0.Final
7.25.0.Final
Infinite recursion in drools after version change from v7.20 to
v7.21
---------------------------------------------------------------------
Key: DROOLS-4909
URL:
https://issues.redhat.com/browse/DROOLS-4909
Project: Drools
Issue Type: Bug
Components: core engine
Affects Versions: 7.21.0.Final, 7.22.0.Final, 7.23.0.Final, 7.25.0.Final,
7.31.0.Final
Environment: Both Mac and Windows
Reporter: Crosson David
Assignee: Mario Fusco
Priority: Major
Attachments: Screen Shot 2019-07-10 at 3.53.10 PM.png, Screen Shot 2019-07-10 at
5.56.32 PM.png, Screen Shot 2019-07-10 at 5.59.28 PM.png, error.png, pojo.png, static.png,
static_error.png
When there is a version change in drools-compiler from `7.20.0.Final` to `7.21.0.Final`
some rules are looping recursively.
*Code in github:*
[The working
version|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.20]
[The recursively looping
version|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.21]
[The change between working and looping
version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
*More details*
When I fire a rule whose `then` part modifies a fact that is already checked in the
`when` part:
{code:java}
rule "rule 1.1"
when
$sampleDomain: SampleDomain(instanceVariable2 == "Value of instance
variable")
then
System.out.println("Rule 1.1 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
{code}
it doesn't loop recursively.
But when I call another rule which call a static function from another class:
{code:java}
rule "rule 1.2"
when
$sampleDomain: SampleDomain(CoreUtils.anotherFunction())
then
System.out.println("Rule 1.2 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
{code}
it loops recursively.
The class with static function is
{code:java}
import com.drool_issue.domain.SampleDomain;
public class CoreUtils {
public static boolean anotherFunction() {
System.out.println("anotherFunction() inside CoreUtils");
return true;
}
public static boolean anotherFunction(SampleDomain sampleDomain) {
System.out.println("anotherFunction(SampleDomain sampleDomain) inside
CoreUtils");
return true;
}
}
{code}
My domain file is:
{code:java}
public class SampleDomain {
private int instanceVariable1;
private String instanceVariable2;
private int instanceVariable3;
public int getInstanceVariable1() {
return instanceVariable1;
}
public void setInstanceVariable1(int instanceVariable1) {
this.instanceVariable1 = instanceVariable1;
}
public String getInstanceVariable2() {
return instanceVariable2;
}
public void setInstanceVariable2(String instanceVariable2) {
this.instanceVariable2 = instanceVariable2;
}
public int getInstanceVariable3() {
return instanceVariable3;
}
public void setInstanceVariable3(int instanceVariable3) {
this.instanceVariable3 = instanceVariable3;
}
}
{code}
This is only caused after version change from `7.20.0.Final` to `7.21.0.Final`. Any
guess on what the problem might be?
When I further looked into the problem I saw this too.
When we add two functions into the `SampleDomain` class ie
{code:java}
public boolean anotherFunction() {
return true;
}
public boolean anotherFunction(SampleDomain sampleDomain) {
return true;
}
{code}
and use this in the rule like:
{code:java}
rule "rule 1.4"
when
$sampleDomain: SampleDomain(anotherFunction())
then
System.out.println("Rule 1.4 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
{code}
and
{code:java}
rule "rule 1.5"
when
$sampleDomain: SampleDomain(anotherFunction($sampleDomain))
then
System.out.println("Rule 1.5 fired");
modify($sampleDomain){
setInstanceVariable3(4)
}
end
{code}
these also loops recursively.
*Code in github:*
[The recursive looping when using non static
methods|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7....]
[The change between working and above
version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
Also when any of the static method is made non static then method from the domain class
is called even though the static method is specified in the rule.
*Code portions to be noted here are:*
[Rule where static method is
called.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b25...]
[Another rule which also call the static
method.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b25...]
[The static access modifier removed from the functions which where previously
static.|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
*Code in github:*
[Weird behaviour when removing static modifier for the
functions.|https://github.com/padippist/DroolsIssueReporting/tree/issue_v...]
[The change between working and above
version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v...]
*All this are caused in versions after `7.20.0.Final`, ie `7.21.0.Final`, `7.22.0.Final`
and `7.23.0.Final`*