Skip to content

Commit

Permalink
[BZ-1069337] fix incremental compilation when multiple KieContainers …
Browse files Browse the repository at this point in the history
…use the same ReleaseId
  • Loading branch information
mariofusco committed Feb 26, 2014
1 parent fc80d17 commit 7c8746a
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 18 deletions.
Expand Up @@ -101,12 +101,16 @@ public ReleaseId getContainerReleaseId() {

public Results updateToVersion(ReleaseId newReleaseId) {
checkNotClasspathKieProject();
return update(kProject.getGAV(), newReleaseId);
return update(((KieModuleKieProject) kProject).getInternalKieModule(), newReleaseId);
}

public Results updateDependencyToVersion(ReleaseId currentReleaseId, ReleaseId newReleaseId) {
checkNotClasspathKieProject();
return update(currentReleaseId, newReleaseId);
// if the new and the current release are equal (a snapshot) check if there is an older version with the same releaseId
InternalKieModule currentKM = currentReleaseId.equals( newReleaseId ) ?
(InternalKieModule) ((KieRepositoryImpl)kr).getOldKieModule( currentReleaseId ) :
(InternalKieModule) kr.getKieModule( currentReleaseId );
return update(currentKM, newReleaseId);
}

private void checkNotClasspathKieProject() {
Expand All @@ -115,13 +119,8 @@ private void checkNotClasspathKieProject() {
}
}

private Results update(ReleaseId currentReleaseId, ReleaseId newReleaseId) {
// if the new and the current release are equal (a snapshot) check if there is an older version with the same releaseId
InternalKieModule currentKM = currentReleaseId.equals( newReleaseId ) && !currentReleaseId.equals(kr.getDefaultReleaseId()) ?
(InternalKieModule) ((KieRepositoryImpl)kr).getOldKieModule( currentReleaseId ) :
(InternalKieModule) kr.getKieModule( currentReleaseId );
private Results update(InternalKieModule currentKM, ReleaseId newReleaseId) {
InternalKieModule newKM = (InternalKieModule) kr.getKieModule( newReleaseId );

ChangeSetBuilder csb = new ChangeSetBuilder();
KieJarChangeSet cs = csb.build( currentKM, newKM );
List<String> modifiedClasses = getModifiedClasses(cs);
Expand Down
Expand Up @@ -93,6 +93,10 @@ public InternalKieModule getKieModuleForKBase(String kBaseName) {
return this.kJarFromKBaseName.get( kBaseName );
}

public InternalKieModule getInternalKieModule() {
return kieModule;
}

public ClassLoader getClassLoader() {
return this.cl;
}
Expand Down
Expand Up @@ -2,6 +2,7 @@

import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -772,11 +773,11 @@ public void testIncrementalCompilationWithRedeclares() {

KieBuilder kieBuilder = ks.newKieBuilder( kfs );

kfs.generateAndWritePomXML( id );
kfs.write( ks.getResources()
.newReaderResource( new StringReader( drl1 ) )
.setResourceType( ResourceType.DRL )
.setSourcePath( "drl1.drl" ) );
kfs.generateAndWritePomXML(id);
kfs.write(ks.getResources()
.newReaderResource(new StringReader(drl1))
.setResourceType(ResourceType.DRL)
.setSourcePath("drl1.drl"));

kieBuilder.buildAll();

Expand All @@ -786,19 +787,89 @@ public void testIncrementalCompilationWithRedeclares() {
ksession.setGlobal( "list", list );
ksession.fireAllRules();

kfs.write( ks.getResources()
.newReaderResource( new StringReader(drl2) )
.setResourceType(ResourceType.DRL)
.setSourcePath("drl2.txt") );
kfs.write(ks.getResources()
.newReaderResource(new StringReader(drl2))
.setResourceType(ResourceType.DRL)
.setSourcePath("drl2.txt"));

IncrementalResults results = ((InternalKieBuilder) kieBuilder).incrementalBuild();
assertEquals(0, results.getAddedMessages().size());

Results updateResults = kc.updateToVersion( id );
assertEquals(0, updateResults.getMessages().size());
}

@Test
public void testIncrementalCompilationWithModuleOverride() {
String drl1 = "package org.test.compiler; " +
"global java.util.List list; " +

"rule A when $s : String() then System.out.println( 'AAA' + $s ); list.add( 'A' + $s ); end " +
"";

String drl2 = "package totally.unrelated.pack; " +
"global java.util.List list; " +

"rule B when $s : String() then System.out.println( 'BBB' + $s ); list.add( 'B' + $s ); end " +
"";

String drl3 = "package totally.unrelated.pack; " +
"global java.util.List list; " +

"rule C when $s : String() then System.out.println( 'CCC' + $s ); list.add( 'C' + $s ); end " +
"";

KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem();
ReleaseId id = ks.newReleaseId( "org.test", "foo", "1.0-SNAPSHOT" );

KieBuilder kieBuilder = ks.newKieBuilder( kfs );
kfs.generateAndWritePomXML( id );
kfs.write( ks.getResources()
.newReaderResource(new StringReader(drl1))
.setResourceType(ResourceType.DRL)
.setSourcePath("drl1.drl") );

kieBuilder.buildAll();

KieContainer kc = ks.newKieContainer( id );
KieSession ksession = kc.newKieSession();
List<String> list = new ArrayList<String>();
ksession.setGlobal( "list", list );

ksession.insert("X");
ksession.fireAllRules();
assertEquals( 2, list.size() );
assertTrue( list.contains( "AX" ) );


KieFileSystem kfs2 = ks.newKieFileSystem();
KieBuilder kieBuilder2 = ks.newKieBuilder( kfs2 );
kfs2.generateAndWritePomXML( id );
kfs2.write( ks.getResources()
.newReaderResource( new StringReader( drl2 ) )
.setResourceType( ResourceType.DRL )
.setSourcePath( "drla.drl" ) );

kieBuilder2.buildAll();

KieContainer kc2 = ks.newKieContainer( id );
KieSession ksession2 = kc2.newKieSession();
ksession2.setGlobal( "list", list );

ksession2.insert( "X" );
ksession2.fireAllRules();

kfs2.write(ks.getResources()
.newReaderResource(new StringReader(drl3))
.setResourceType(ResourceType.DRL)
.setSourcePath("drlb.drl"));

IncrementalResults results = ((InternalKieBuilder) kieBuilder2).incrementalBuild();
assertEquals(0, results.getAddedMessages().size());

Results updateResults = kc2.updateToVersion( id );
ksession2.fireAllRules();

assertEquals( Arrays.asList("AX", "BX", "CX"), list );
}
}

0 comments on commit 7c8746a

Please sign in to comment.