From 8809c601ab226c677db336d444d1ba382519090b Mon Sep 17 00:00:00 2001 From: Mario Fusco Date: Sat, 25 Jun 2016 12:12:44 +0200 Subject: [PATCH] [DROOLS-1219] fix ClassObjectTypes rewiring during packages merge (#818) --- .../compiler/integrationtests/Misc2Test.java | 73 +++++++++++++++++++ .../core/base/ClassFieldAccessorStore.java | 8 +- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/drools-compiler/src/test/java/org/drools/compiler/integrationtests/Misc2Test.java b/drools-compiler/src/test/java/org/drools/compiler/integrationtests/Misc2Test.java index b96fd4b4e91..47bce6d3b79 100644 --- a/drools-compiler/src/test/java/org/drools/compiler/integrationtests/Misc2Test.java +++ b/drools-compiler/src/test/java/org/drools/compiler/integrationtests/Misc2Test.java @@ -8645,4 +8645,77 @@ public void testCCEAfterDeserialization() throws Exception { ksession2.insert( "test" ); assertEquals(1, ksession2.fireAllRules()); } + + @Test + public void testWiringClassOnPackageMerge() throws Exception { + String drl_init = + "package init;\n" + + "import org.kie.test.TestObject\n" + + "rule RInit when\n" + + "then\n" + + " TestObject obj1 = new TestObject();\n" + + " TestObject obj2 = new TestObject();" + + " obj1.add(obj2);" + + " insert(obj1);\n" + + "end"; + + String drl1 = + "package p1;\n" + + "import org.kie.test.TestObject\n" + + "global java.util.List list;\n" + + "rule R1 when\n" + + " $obj : TestObject( $objs : objects )\n" + + " $s : Object() from $objs\n" + + "then\n" + + " list.add(\"R1\");\n" + + "end"; + + String drl2 = + "package p2;\n" + + "import org.kie.test.TestObject\n" + + "global java.util.List list;\n" + + "rule R2 when\n" + + " $obj : TestObject( $objs : objects )\n" + + " $s : TestObject() from $objs\n" + + "then\n" + + " list.add(\"R2\");\n" + + "end"; + + String javaSrc = + "package org.kie.test;\n" + + "import java.util.*;\n" + + "\n" + + "public class TestObject {\n" + + " private final List objects = new ArrayList();\n" + + "\n" + + " public List getObjects() {\n" + + " return objects;\n" + + " }\n" + + " public void add(TestObject obj) {\n" + + " objects.add(obj);" + + " }" + + "}\n"; + + String path = "org/kie/test/MyRuleUnit"; + + KieServices ks = KieServices.Factory.get(); + KieFileSystem kfs = ks.newKieFileSystem(); + kfs.writeKModuleXML(ks.newKieModuleModel().toXML()) + .write("src/main/resources/a.drl", drl_init) + .write("src/main/resources/b.drl", drl1) + .write("src/main/resources/c.drl", drl2) + .write("src/main/java/org/kie/test/TestObject.java", javaSrc); + + ks.newKieBuilder( kfs ).buildAll(); + KieContainer kcontainer = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()); + KieSession kSession = kcontainer.newKieSession(); + + List list = new ArrayList(); + kSession.setGlobal( "list", list ); + kSession.fireAllRules(); + + assertEquals( 2, list.size() ); + assertTrue( list.contains( "R1" ) ); + assertTrue( list.contains( "R2" ) ); + } } \ No newline at end of file diff --git a/drools-core/src/main/java/org/drools/core/base/ClassFieldAccessorStore.java b/drools-core/src/main/java/org/drools/core/base/ClassFieldAccessorStore.java index de4a2a721ac..5176de6a804 100644 --- a/drools-core/src/main/java/org/drools/core/base/ClassFieldAccessorStore.java +++ b/drools-core/src/main/java/org/drools/core/base/ClassFieldAccessorStore.java @@ -263,9 +263,11 @@ public void merge(ClassFieldAccessorStore other) { ClassObjectTypeLookupEntry lookupEntry = (ClassObjectTypeLookupEntry) this.lookup.get( entry.getKey() ); if ( lookupEntry == null ) { // Create new entry with correct ClassObjectType and targets - lookupEntry = new ClassObjectTypeLookupEntry( cache.getClassObjectType( ((ClassObjectTypeLookupEntry) entry.getValue()).getClassObjectType(), true ) ); - this.lookup.put( entry.getKey(), lookupEntry ); - + ClassObjectType oldObjectType = ((ClassObjectTypeLookupEntry) entry.getValue()).getClassObjectType(); + ClassObjectType newObjectType = cache.getClassObjectType( oldObjectType, true ); + this.lookup.put( entry.getKey(), new ClassObjectTypeLookupEntry( newObjectType ) ); + // also rewire the class of the old ClassObjectType in case it is still in use + oldObjectType.setClassType( newObjectType.getClassType() ); } } }