[jboss-jira] [JBoss JIRA] (DROOLS-4909) Infinite recursion in drools after version change from v7.20 to v7.21

Crosson David (Jira) issues at jboss.org
Wed Jan 8 04:18:01 EST 2020


Crosson David created DROOLS-4909:
-------------------------------------

             Summary: 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
         Environment: Both Mac and Windows
            Reporter: Crosson David
            Assignee: Mario Fusco
             Fix For: 7.25.0.Final
         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_7.20...issue_v_7.21]



*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.20_non_static_methodes]

[The change between working and above version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.20_non_static_methodes]

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/bde2804b250babf11cf5d3cf48640d9e6c88f5b3/src/main/resources/rules/rule1.drl#L21]

[Another rule which also call the static method.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b250babf11cf5d3cf48640d9e6c88f5b3/src/main/resources/rules/rule1.drl#L32]

[The static access modifier removed from the functions which where previously static.|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21_weird_behaviors#diff-4e0f238b1184e2267cb5663b9afeaa6fL7]

*Code in github:*

[Weird behaviour when removing static modifier for the functions.|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.21_weird_behaviors]

[The change between working and above version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21_weird_behaviors]


*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`*



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list