Skip to content

Commit

Permalink
[BZ-1310261] fix incremental compilation when a rule makes reference …
Browse files Browse the repository at this point in the history
…to a global defined in a .gdrl file
  • Loading branch information
mariofusco committed Feb 22, 2016
1 parent 870febb commit b271fc9
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 7 deletions.
Expand Up @@ -165,7 +165,7 @@ private Results update(final InternalKieModule currentKM, final ReleaseId newRel
final KieJarChangeSet cs = csb.build( currentKM, newKM );

final List<String> modifiedClasses = getModifiedClasses(cs);
final List<String> dslFiles = getUnchangedDslFiles(newKM, cs);
final List<String> unchangedResources = getUnchangedResources( newKM, cs );

((KieModuleKieProject) kProject).updateToModule( newKM );

Expand All @@ -184,15 +184,15 @@ private Results update(final InternalKieModule currentKM, final ReleaseId newRel
boolean locked = kBase.tryLock();
if (locked) {
try {
updateKBase( kBase, currentKM, newReleaseId, newKM, cs, modifiedClasses, dslFiles, results, kieBaseModel );
updateKBase( kBase, currentKM, newReleaseId, newKM, cs, modifiedClasses, unchangedResources, results, kieBaseModel );
} finally {
kBase.unlock();
}
} else {
kBase.enqueueModification( new Runnable() {
@Override
public void run() {
updateKBase( kBase, currentKM, newReleaseId, newKM, cs, modifiedClasses, dslFiles, results, kieBaseModel );
updateKBase( kBase, currentKM, newReleaseId, newKM, cs, modifiedClasses, unchangedResources, results, kieBaseModel );
}
} );
}
Expand Down Expand Up @@ -222,7 +222,9 @@ public void run() {
return results;
}

private void updateKBase( InternalKnowledgeBase kBase, InternalKieModule currentKM, ReleaseId newReleaseId, InternalKieModule newKM, KieJarChangeSet cs, List<String> modifiedClasses, List<String> dslFiles, ResultsImpl results, KieBaseModel kieBaseModel ) {
private void updateKBase( InternalKnowledgeBase kBase, InternalKieModule currentKM, ReleaseId newReleaseId,
InternalKieModule newKM, KieJarChangeSet cs, List<String> modifiedClasses, List<String> unchangedResources,
ResultsImpl results, KieBaseModel kieBaseModel ) {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( kBase );
KnowledgeBuilderImpl pkgbuilder = (KnowledgeBuilderImpl)kbuilder;
CompositeKnowledgeBuilder ckbuilder = kbuilder.batch();
Expand All @@ -241,7 +243,7 @@ private void updateKBase( InternalKnowledgeBase kBase, InternalKieModule current

if ( shouldRebuild ) {
// readd unchanged dsl files to the kbuilder
for (String dslFile : dslFiles) {
for (String dslFile : unchangedResources) {
if (isFileInKBase(newKM, kieBaseModel, dslFile)) {
newKM.addResourceToCompiler(ckbuilder, kieBaseModel, dslFile);
}
Expand All @@ -254,16 +256,27 @@ private void updateKBase( InternalKnowledgeBase kBase, InternalKieModule current
}
}

private List<String> getUnchangedDslFiles(InternalKieModule newKM, KieJarChangeSet cs) {
private List<String> getUnchangedResources( InternalKieModule newKM, KieJarChangeSet cs ) {
List<String> dslFiles = new ArrayList<String>();
for (String file : newKM.getFileNames()) {
if (ResourceType.DSL.matchesExtension(file) && !cs.contains(file)) {
if ( includeIfUnchanged( file ) && !cs.contains( file ) ) {
dslFiles.add(file);
}
}
return dslFiles;
}

private static final ResourceType[] TYPES_TO_BE_INCLUDED = new ResourceType[] { ResourceType.DSL, ResourceType.GDRL };

private boolean includeIfUnchanged( String file ) {
for (ResourceType type : TYPES_TO_BE_INCLUDED ) {
if (type.matchesExtension( file )) {
return true;
}
}
return false;
}

private boolean applyResourceChanges(InternalKieModule currentKM, InternalKieModule newKM, KieJarChangeSet cs, List<String> modifiedClasses, KieBase kBase, KieBaseModel kieBaseModel, KnowledgeBuilderImpl pkgbuilder, CompositeKnowledgeBuilder ckbuilder) {
boolean modifyingUsedClass = false;
for (String modifiedClass : modifiedClasses) {
Expand Down
83 changes: 83 additions & 0 deletions kie-ci/src/test/java/org/kie/scanner/KieRepositoryScannerTest.java
Expand Up @@ -731,4 +731,87 @@ private InternalKieModule createIncludingKJar(ReleaseId containerReleaseId, Rele
assertTrue(kieBuilder.buildAll().getResults().getMessages().isEmpty());
return (InternalKieModule) kieBuilder.getKieModule();
}

@Test
public void testKScannerWithGDRL() throws Exception {
// BZ-1310261
String rule1 =
"import java.util.List;\n" +
"rule R when\n" +
" $s : String()\n" +
"then\n" +
" list.add(\"Hello \" + $s);\n" +
"end";

String rule2 =
"import java.util.List;\n" +
"rule R when\n" +
" $s : String()\n" +
"then\n" +
" list.add(\"Hi \" + $s);\n" +
"end";

KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie", "scanner-test", "1.0-SNAPSHOT");

InternalKieModule kJar1 = createKieJarWithGDRL(ks, releaseId, rule1);
KieContainer kieContainer = ks.newKieContainer(releaseId);

MavenRepository repository = getMavenRepository();
repository.installArtifact(releaseId, kJar1, createKPom(fileManager, releaseId));

// create a ksesion and check it works as expected
KieSession ksession = kieContainer.newKieSession("KSession1");
List<String> list = new ArrayList<String>();
ksession.setGlobal( "list", list );
ksession.insert( "Mario" );
ksession.fireAllRules();

assertEquals( 1, list.size() );
assertEquals( "Hello Mario", list.get(0) );
list.clear();

ksession.dispose();

// create a new kjar
InternalKieModule kJar2 = createKieJarWithGDRL(ks, releaseId, rule2);

// deploy it on maven
repository.installArtifact(releaseId, kJar2, createKPom(fileManager, releaseId));

// since I am not calling start() on the scanner it means it won't have automatic scheduled scanning
KieScanner scanner = ks.newKieScanner(kieContainer);

// scan the maven repo to get the new kjar version and deploy it on the kcontainer
scanner.scanNow();

// create a ksesion and check it works as expected
// create a ksesion and check it works as expected
ksession = kieContainer.newKieSession("KSession1");
list = new ArrayList<String>();
ksession.setGlobal( "list", list );
ksession.insert( "Mario" );
ksession.fireAllRules();

assertEquals( 1, list.size() );
assertEquals( "Hi Mario", list.get(0) );
list.clear();

ksession.dispose();

ks.getRepository().removeKieModule(releaseId);
}

private InternalKieModule createKieJarWithGDRL(KieServices ks, ReleaseId releaseId, String rule) throws IOException {
KieFileSystem kfs = createKieFileSystemWithKProject(ks, false);
kfs.writePomXML(getPom(releaseId));

kfs.write("src/main/resources/rule.drl", rule);
kfs.write("src/main/resources/global.gdrl", "global java.util.List list;");

KieBuilder kieBuilder = ks.newKieBuilder(kfs);
assertTrue(kieBuilder.buildAll().getResults().getMessages().isEmpty());
return (InternalKieModule) kieBuilder.getKieModule();
}

}

0 comments on commit b271fc9

Please sign in to comment.