/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.scanner;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.drools.core.util.FileManager;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieScanner;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertTrue;
import static org.kie.scanner.MavenRepository.getMavenRepository;
public class KieScannerIncrementalCompilationTest extends AbstractKieCiTest {
private final int FIRST_VALUE = 5;
private final int SECOND_VALUE = 10;
private FileManager fileManager;
private ReleaseId releaseId;
@Before
public void setUp() throws Exception {
this.fileManager = new FileManager();
this.fileManager.setUp();
releaseId = KieServices.Factory.get().newReleaseId("org.kie", "scanner-test", "1.0-SNAPSHOT");
}
@Test
public void testChangeJavaClassButNotDrl() throws IOException {
checkIncrementalCompilation(true);
}
@Test
public void testChangeDrlNotUsingJava() throws IOException {
checkIncrementalCompilation(false);
}
private void checkIncrementalCompilation(boolean useJavaInDrl) throws IOException {
KieServices ks = KieServices.Factory.get();
MavenRepository repository = getMavenRepository();
InternalKieModule kJar1 = createKieJarWithClass(ks, releaseId, FIRST_VALUE, useJavaInDrl);
repository.installArtifact(releaseId, kJar1, createKPom(releaseId));
KieContainer kieContainer = ks.newKieContainer(releaseId);
KieScanner scanner = ks.newKieScanner(kieContainer);
checkValue(kieContainer, FIRST_VALUE);
InternalKieModule kJar2 = createKieJarWithClass(ks, releaseId, SECOND_VALUE, useJavaInDrl);
repository.installArtifact(releaseId, kJar2, createKPom(releaseId));
scanner.scanNow();
checkValue(kieContainer, SECOND_VALUE);
ks.getRepository().removeKieModule(releaseId);
}
private void checkValue(KieContainer kieContainer, int value) {
List<Integer> list = new ArrayList<Integer>();
KieSession ksession = kieContainer.newKieSession("KSession1");
ksession.setGlobal( "list", list );
ksession.fireAllRules();
ksession.dispose();
assertTrue("Expected:<" + value + "> but was:<" + list.get(0) + ">", list.get(0) == value);
}
private InternalKieModule createKieJarWithClass(KieServices ks, ReleaseId releaseId, int value, boolean useJavaInDrl) throws IOException {
KieFileSystem kfs = createKieFileSystemWithKProject(ks, false);
kfs.writePomXML(getPom(releaseId));
if (useJavaInDrl) {
kfs.write("src/main/resources/KBase1/rule1.drl", createDRLForJavaSource());
} else {
kfs.write("src/main/resources/KBase1/rule1.drl", createDRLNotUsingJava(value));
}
kfs.write("src/main/java/org/kie/test/Value.java", createJavaSource(value));
KieBuilder kieBuilder = ks.newKieBuilder(kfs);
assertTrue("", kieBuilder.buildAll().getResults().getMessages().isEmpty());
return (InternalKieModule) kieBuilder.getKieModule();
}
private String createDRLForJavaSource() {
return "package org.kie.test\n" +
"global java.util.List list\n" +
"rule simple\n" +
"when\n" +
"then\n" +
" list.add(Value.getValue());\n" +
"end\n";
}
private String createDRLNotUsingJava(int value) {
return "package org.kie.test\n" +
"global java.util.List list\n" +
"rule simple\n" +
"when\n" +
"then\n" +
" list.add(" + value + ");\n" +
"end\n";
}
protected String createJavaSource(int value) {
return "package org.kie.test;\n" +
"public class Value {\n" +
" public static int getValue() {\n" +
" return " + value + ";\n" +
" }\n" +
"}";
}
private File createKPom(ReleaseId releaseId) throws IOException {
File pomFile = fileManager.newFile("pom.xml");
fileManager.write(pomFile, getPom(releaseId));
return pomFile;
}
}