[jboss-jira] [JBoss JIRA] (DROOLS-4288) Infinite recursion in drools after version change from v7.20 to v7.21
Geogie Tom (Jira)
issues at jboss.org
Wed Jul 3 14:53:00 EDT 2019
[ https://issues.jboss.org/browse/DROOLS-4288?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Geogie Tom updated DROOLS-4288:
-------------------------------
Description:
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:
[link title|http://example.com]
[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]
[link title|http://example.com]
[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:
```
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
```
it doesn't loop recursively.
But when I call another rule which call a static function from another class:
```
rule "rule 1.2"
when
$sampleDomain: SampleDomain(CoreUtils.anotherFunction())
then
System.out.println("Rule 1.2 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
```
it loops recursively.
The class with static function is
```
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;
}
}
```
My domain file is:
```
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;
}
}
```
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
```
public boolean anotherFunction() {
return true;
}
public boolean anotherFunction(SampleDomain sampleDomain) {
return true;
}
```
and use this in the rule like:
```
rule "rule 1.4"
when
$sampleDomain: SampleDomain(anotherFunction())
then
System.out.println("Rule 1.4 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
```
and
```
rule "rule 1.5"
when
$sampleDomain: SampleDomain(anotherFunction($sampleDomain))
then
System.out.println("Rule 1.5 fired");
modify($sampleDomain){
setInstanceVariable3(4)
}
end
```
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`
was:
**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:
```
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
```
it doesn't loop recursively.
But when I call another rule which call a static function from another class:
```
rule "rule 1.2"
when
$sampleDomain: SampleDomain(CoreUtils.anotherFunction())
then
System.out.println("Rule 1.2 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
```
it loops recursively.
The class with static function is
```
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;
}
}
```
My domain file is:
```
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;
}
}
```
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
```
public boolean anotherFunction() {
return true;
}
public boolean anotherFunction(SampleDomain sampleDomain) {
return true;
}
```
and use this in the rule like:
```
rule "rule 1.4"
when
$sampleDomain: SampleDomain(anotherFunction())
then
System.out.println("Rule 1.4 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
```
and
```
rule "rule 1.5"
when
$sampleDomain: SampleDomain(anotherFunction($sampleDomain))
then
System.out.println("Rule 1.5 fired");
modify($sampleDomain){
setInstanceVariable3(4)
}
end
```
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`
> Infinite recursion in drools after version change from v7.20 to v7.21
> ---------------------------------------------------------------------
>
> Key: DROOLS-4288
> URL: https://issues.jboss.org/browse/DROOLS-4288
> 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: Geogie Tom
> Assignee: Mario Fusco
> Priority: Major
>
> 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:
> [link title|http://example.com]
> [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]
> [link title|http://example.com]
> [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:
> ```
> 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
> ```
> it doesn't loop recursively.
> But when I call another rule which call a static function from another class:
> ```
> rule "rule 1.2"
> when
> $sampleDomain: SampleDomain(CoreUtils.anotherFunction())
> then
> System.out.println("Rule 1.2 fired");
> modify($sampleDomain){
> setInstanceVariable1(3)
> }
> end
> ```
> it loops recursively.
> The class with static function is
> ```
> 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;
> }
> }
> ```
> My domain file is:
> ```
> 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;
> }
>
>
> }
> ```
> 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
> ```
> public boolean anotherFunction() {
> return true;
> }
>
> public boolean anotherFunction(SampleDomain sampleDomain) {
> return true;
> }
> ```
> and use this in the rule like:
> ```
> rule "rule 1.4"
> when
> $sampleDomain: SampleDomain(anotherFunction())
> then
> System.out.println("Rule 1.4 fired");
> modify($sampleDomain){
> setInstanceVariable1(3)
> }
> end
> ```
> and
> ```
> rule "rule 1.5"
> when
> $sampleDomain: SampleDomain(anotherFunction($sampleDomain))
> then
> System.out.println("Rule 1.5 fired");
> modify($sampleDomain){
> setInstanceVariable3(4)
> }
> end
> ```
> 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.12.1#712002)
More information about the jboss-jira
mailing list