diff --git a/drools-core/src/main/java/org/drools/core/common/PhreakPropagationContext.java b/drools-core/src/main/java/org/drools/core/common/PhreakPropagationContext.java index 9ed03254444..981ae9108ec 100644 --- a/drools-core/src/main/java/org/drools/core/common/PhreakPropagationContext.java +++ b/drools-core/src/main/java/org/drools/core/common/PhreakPropagationContext.java @@ -233,7 +233,7 @@ public PropagationContext adaptModificationMaskForObjectType(ObjectType type, Re Class classType = classObjectType.getClassType(); String pkgName = classType.getPackage().getName(); - if (classType == modifiedClass || "java.lang".equals(pkgName) || !(classType.isInterface() || modifiedClass.isInterface())) { + if (classType == modifiedClass || "java.lang".equals(pkgName)) { if (typeBit) { modificationMask = modificationMask.set(PropertySpecificUtil.TRAITABLE_BIT); } diff --git a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/PropertyReactivityTest.java b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/PropertyReactivityTest.java index 220014fde2b..7ff893c6728 100644 --- a/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/PropertyReactivityTest.java +++ b/drools-test-coverage/test-compiler-integration/src/test/java/org/drools/mvel/integrationtests/PropertyReactivityTest.java @@ -1931,4 +1931,183 @@ public void testComment(KieBaseTestConfiguration kieBaseTestConfiguration) { assertThat(ksession.fireAllRules()).isEqualTo(2); } + + public static class MyPerson { + + private String name; + private int age; + private String address; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + } + + public static class MyWorker extends MyPerson { + + @Override + public String getAddress() { + return super.getAddress(); + } + } + + @ParameterizedTest(name = "KieBase type={0}") + @MethodSource("parameters") + @Timeout(10000) + void getterOverrideSuperToSub(KieBaseTestConfiguration kieBaseTestConfiguration) { + final String drl = + "package rules.basic.common;\n" + + "import " + MyPerson.class.getCanonicalName() + ";\n" + + "import " + MyWorker.class.getCanonicalName() + ";\n" + + "rule R1\n" + + "salience 1\n" + + "when\n" + + " $fact : MyPerson( address == null )\n" + + "then\n" + + " modify($fact) {\n" + + " setAddress(\"ROME\")\n" + + " }\n" + + "end\n" + + "rule R2\n" + + "when\n" + + " $fact : MyWorker( $address: address != null )\n" + + "then\n" + + " modify($fact) {\n" + + " setName(\"PIPPO\")\n" + + " }\n" + + "end\n"; + + KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("test", kieBaseTestConfiguration, drl); + KieSession ksession = kbase.newKieSession(); + MyWorker myWorker = new MyWorker(); + ksession.insert(myWorker); + ksession.fireAllRules(); + assertThat(myWorker.getName()).isEqualTo("PIPPO"); + } + + @ParameterizedTest(name = "KieBase type={0}") + @MethodSource("parameters") + @Timeout(10000) + void getterOverrideSubToSuper(KieBaseTestConfiguration kieBaseTestConfiguration) { + final String drl = + "package rules.basic.common;\n" + + "import " + MyPerson.class.getCanonicalName() + ";\n" + + "import " + MyWorker.class.getCanonicalName() + ";\n" + + "rule R1\n" + + "salience 1\n" + + "when\n" + + " $fact : MyWorker( address == null )\n" + + "then\n" + + " modify($fact) {\n" + + " setAddress(\"ROME\")\n" + + " }\n" + + "end\n" + + "rule R2\n" + + "when\n" + + " $fact : MyPerson( $address: address != null )\n" + + "then\n" + + " modify($fact) {\n" + + " setName(\"PIPPO\")\n" + + " }\n" + + "end\n"; + + KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("test", kieBaseTestConfiguration, drl); + KieSession ksession = kbase.newKieSession(); + MyWorker myWorker = new MyWorker(); + ksession.insert(myWorker); + ksession.fireAllRules(); + assertThat(myWorker.getName()).isEqualTo("PIPPO"); + } + + @ParameterizedTest(name = "KieBase type={0}") + @MethodSource("parameters") + @Timeout(10000) + void getterOverrideSuperToSubBeta(KieBaseTestConfiguration kieBaseTestConfiguration) { + final String drl = + "package rules.basic.common;\n" + + "import " + MyPerson.class.getCanonicalName() + ";\n" + + "import " + MyWorker.class.getCanonicalName() + ";\n" + + "rule R1\n" + + "salience 1\n" + + "when\n" + + " $fact : MyPerson( address == null )\n" + + "then\n" + + " modify($fact) {\n" + + " setAddress(\"ROME\")\n" + + " }\n" + + "end\n" + + "rule R2\n" + + "when\n" + + " $checkAddress: String()\n" + + " $fact : MyWorker( $address: address == $checkAddress )\n" + + "then\n" + + " modify($fact) {\n" + + " setName(\"PIPPO\")\n" + + " }\n" + + "end\n"; + + KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("test", kieBaseTestConfiguration, drl); + KieSession ksession = kbase.newKieSession(); + MyWorker myWorker = new MyWorker(); + ksession.insert(myWorker); + ksession.insert("ROME"); + ksession.fireAllRules(); + assertThat(myWorker.getName()).isEqualTo("PIPPO"); + } + + @ParameterizedTest(name = "KieBase type={0}") + @MethodSource("parameters") + @Timeout(10000) + void getterOverrideSubToSuperBeta(KieBaseTestConfiguration kieBaseTestConfiguration) { + final String drl = + "package rules.basic.common;\n" + + "import " + MyPerson.class.getCanonicalName() + ";\n" + + "import " + MyWorker.class.getCanonicalName() + ";\n" + + "rule R1\n" + + "salience 1\n" + + "when\n" + + " $fact : MyWorker( address == null )\n" + + "then\n" + + " modify($fact) {\n" + + " setAddress(\"ROME\")\n" + + " }\n" + + "end\n" + + "rule R2\n" + + "when\n" + + " $checkAddress: String()\n" + + " $fact : MyPerson( $address: address == $checkAddress )\n" + + "then\n" + + " modify($fact) {\n" + + " setName(\"PIPPO\")\n" + + " }\n" + + "end\n"; + + KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("test", kieBaseTestConfiguration, drl); + KieSession ksession = kbase.newKieSession(); + MyWorker myWorker = new MyWorker(); + ksession.insert(myWorker); + ksession.insert("ROME"); + ksession.fireAllRules(); + assertThat(myWorker.getName()).isEqualTo("PIPPO"); + } }