/*
* 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.drools.compiler.integrationtests;
import org.drools.compiler.CommonTestMethodBase;
import org.drools.compiler.Message;
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.ReleaseId;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.builder.model.KieSessionModel.KieSessionType;
import org.kie.api.conf.EqualityBehaviorOption;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.definition.type.FactType;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.conf.ClockTypeOption;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
/**
* This is a sample class to launch a rule.
*/
public class KieHelloWorldTest extends CommonTestMethodBase {
@Test
public void testHelloWorld() throws Exception {
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().write( "src/main/resources/r1.drl", createDrl( "R1" ) );
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()).newKieSession();
ksession.insert(new Message("Hello World"));
int count = ksession.fireAllRules();
assertEquals( 1, count );
}
@Test
public void testHelloWorldWithResource() throws Exception {
// DROOLS-351
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().write(
ks.getResources()
.newReaderResource( new StringReader( createDrl( "R1" ) ) )
.setResourceType( ResourceType.DRL )
.setSourcePath( "src/main/resources/r1.txt" ) );
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()).newKieSession();
ksession.insert(new Message("Hello World"));
int count = ksession.fireAllRules();
assertEquals( 1, count );
}
@Test
public void testHelloWorldWithEmptyFile() throws Exception {
String drl = createDrl("R1");
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem()
.write("src/main/resources/r1.drl", drl)
.write( "src/main/resources/empty.drl", ks.getResources().newInputStreamResource( new ByteArrayInputStream( new byte[0] ) ) );
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer( ks.getRepository().getDefaultReleaseId() ).newKieSession();
ksession.insert(new Message("Hello World"));
int count = ksession.fireAllRules();
assertEquals( 1, count );
}
@Test
public void testFailingHelloWorld() throws Exception {
String drl = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule R1 when\n" +
" $m : Message( nonExistentField == \"Hello World\" )\n" +
"then\n" +
"end\n";
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().write("src/main/resources/r1.drl", drl);
KieBuilder kb = ks.newKieBuilder( kfs ).buildAll();
assertEquals( 1, kb.getResults().getMessages().size() );
}
@Test
public void testHelloWorldWithKBaseInclude() throws Exception {
String drl = "package org.drools.compiler.integrationtests\n" +
"declare CancelFact\n" +
" cancel : boolean = true\n" +
"end\n" +
"rule R1 when\n" +
" $m : CancelFact( cancel == true )\n" +
"then\n" +
"end\n";
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().write( "src/main/resources/r1.drl", drl );
KieModuleModel module = ks.newKieModuleModel();
// define first kbase
final String defaultBaseName = "defaultKBase";
KieBaseModel defaultBase = module.newKieBaseModel(defaultBaseName);
defaultBase.setDefault(true);
defaultBase.addPackage("*");
defaultBase.newKieSessionModel("defaultKSession").setDefault(true);
// define second kbase including resources of the first one
final String includingBaseName = "includingKBase";
KieBaseModel includingBase = module.newKieBaseModel(includingBaseName);
includingBase.setDefault(false);
includingBase.addInclude(defaultBaseName);
includingBase.newKieSessionModel("includingKSession").setDefault(false);
kfs.writeKModuleXML(module.toXML());
KieBuilder kb = ks.newKieBuilder( kfs ).buildAll();
assertEquals( 0, kb.getResults().getMessages().size() );
KieSession ksession = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()).newKieSession();
FactType factType = ksession.getKieBase().getFactType("org.drools.compiler.integrationtests", "CancelFact");
assertNotNull(factType);
ksession.insert(factType.newInstance());
int count = ksession.fireAllRules();
assertEquals( 1, count );
}
@Test
public void testHelloWorldWithPackages() throws Exception {
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", "1.0-SNAPSHOT");
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML( releaseId )
.write( "src/main/resources/KBase1/org/pkg1/r1.drl", createDrl( "R1" ) )
.write( "src/main/resources/KBase1/org/pkg2/r2.drl", createDrl( "R2" ) )
.writeKModuleXML( createKieProjectWithPackages( ks, "org.pkg1" ).toXML() );
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert(new Message("Hello World"));
int count = ksession.fireAllRules();
assertEquals( 1, count );
}
@Test
public void testHelloWorldUsingPackages() throws Exception {
String drlDef = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule R_def when\n" +
" $m : Message( message == \"Hello World\" )\n" +
"then\n" +
"end\n";
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId( "org.kie", "hello-world", "1.0-SNAPSHOT" );
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML(releaseId)
.write("src/main/resources/KBase1/org/pkg1/r1_1.drl", drlDef)
.write("src/main/resources/KBase1/org/pkg1/r1_2.drl", createDrl("R1"))
.write("src/main/resources/KBase1/org/pkg2/r2.drl", createDrl("R2"))
.writeKModuleXML(createKieProjectWithPackages(ks, "org.pkg1").toXML());
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert( new Message( "Hello World" ) );
assertEquals( 2, ksession.fireAllRules() );
}
@Test
public void testHelloWorldWithWildcardPackages() throws Exception {
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", "1.0-SNAPSHOT");
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML( releaseId )
.write( "src/main/resources/org/pkg1/test/r1.drl", createDrlWithGlobal( "R1" ) )
.write( "src/main/resources/org/pkg2/test/r2.drl", createDrlWithGlobal( "R2" ) )
.writeKModuleXML( createKieProjectWithPackages( ks, "org.pkg1.*" ).toXML() );
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert(new Message("Hello World"));
List<String> list = new ArrayList<String>();
ksession.setGlobal("list", list);
assertEquals( 1, ksession.fireAllRules() );
assertEquals( 1, list.size() );
assertEquals( "R1", list.get( 0 ) );
}
@Test
public void testHelloWorldWithWildcardPackagesComplex() throws Exception {
// BZ-1174563
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", "1.0-SNAPSHOT");
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML(releaseId)
.write("src/main/resources/rules/rules.drl", createDrlWithGlobal("R1"))
.write("src/main/resources/rules/tests/tests.drl", createDrlWithGlobal("R2"))
.write("src/main/resources/aaarules/aaarules.drl", createDrlWithGlobal("R3"))
.write("src/main/resources/sample/brms601_1310778/rules/rules.drl", createDrlWithGlobal("R4"))
.write("src/main/resources/sample/brms601_1310778/tests/tests.drl", createDrlWithGlobal("R5"))
.write("src/main/resources/tests/tests.drl", createDrlWithGlobal("R6"))
.write("src/main/resources/rules2/rules2.drl", createDrlWithGlobal("R7"))
.writeKModuleXML( createKieProjectWithPackages(ks, "rules.*").toXML());
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert(new Message("Hello World"));
List<String> list = new ArrayList<String>();
ksession.setGlobal("list", list);
assertEquals( 2, ksession.fireAllRules() );
assertTrue( list.contains("R1") );
assertTrue( list.contains("R2") );
}
public String createDrl(String ruleName) {
return "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule " + ruleName + " when\n" +
" $m : Message( message == \"Hello World\" )\n" +
"then\n" +
"end\n";
}
public String createDrlWithGlobal(String ruleName) {
return "package org.drools.compiler.integrationtests\n" +
"global java.util.List list\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule " + ruleName + " when\n" +
" $m : Message( message == \"Hello World\" )\n" +
"then\n" +
" list.add(\"" + ruleName + "\");" +
"end\n";
}
private KieModuleModel createKieProjectWithPackages(KieServices ks, String pkg) {
KieModuleModel kproj = ks.newKieModuleModel();
KieBaseModel kieBaseModel1 = kproj.newKieBaseModel()
.setEqualsBehavior( EqualityBehaviorOption.EQUALITY )
.setEventProcessingMode( EventProcessingOption.STREAM )
.addPackage(pkg);
KieSessionModel ksession1 = kieBaseModel1.newKieSessionModel("KSession1")
.setType( KieSessionType.STATEFUL )
.setClockType(ClockTypeOption.get("realtime"))
.setDefault( true );
return kproj;
}
@Test
public void testHelloWorldOnVersionRange() throws Exception {
KieServices ks = KieServices.Factory.get();
buildVersion(ks, "Hello World", "1.0");
buildVersion(ks, "Aloha Earth", "1.1");
buildVersion(ks, "Hi Universe", "1.2");
ReleaseId latestReleaseId = ks.newReleaseId("org.kie", "hello-world", "LATEST");
KieSession ksession = ks.newKieContainer(latestReleaseId).newKieSession("KSession1");
ksession.insert(new Message("Hello World"));
assertEquals( 0, ksession.fireAllRules() );
ksession = ks.newKieContainer(latestReleaseId).newKieSession("KSession1");
ksession.insert(new Message("Hi Universe"));
assertEquals( 1, ksession.fireAllRules() );
ReleaseId releaseId1 = ks.newReleaseId("org.kie", "hello-world", "1.0");
ksession = ks.newKieContainer(releaseId1).newKieSession("KSession1");
ksession.insert(new Message("Hello World"));
assertEquals( 1, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId1).newKieSession("KSession1");
ksession.insert(new Message("Hi Universe"));
assertEquals( 0, ksession.fireAllRules() );
ReleaseId releaseId2 = ks.newReleaseId("org.kie", "hello-world", "[1.0,1.2)");
ksession = ks.newKieContainer(releaseId2).newKieSession("KSession1");
ksession.insert(new Message("Aloha Earth"));
assertEquals( 1, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId2).newKieSession("KSession1");
ksession.insert(new Message("Hi Universe"));
assertEquals( 0, ksession.fireAllRules() );
}
@Test
public void testGetDefaultKieSessionWithNullName() throws Exception {
// DROOLS-1276
KieServices ks = KieServices.Factory.get();
buildVersion(ks, "Hello World", "1.0");
ReleaseId releaseId1 = ks.newReleaseId("org.kie", "hello-world", "1.0");
KieSession ksession = ks.newKieContainer(releaseId1).newKieSession((String)null);
ksession.insert(new Message("Hello World"));
assertEquals( 1, ksession.fireAllRules() );
}
private void buildVersion(KieServices ks, String message, String version) {
String drl = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule R1 when\n" +
" $m : Message( message == \"" + message+ "\" )\n" +
"then\n" +
"end\n";
ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", version);
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML(releaseId)
.write("src/main/resources/KBase1/org/pkg1/r1.drl", drl)
.writeKModuleXML(createKieProjectWithPackages(ks, "*").toXML());
ks.newKieBuilder( kfs ).buildAll();
}
@Test
public void testHelloWorldWithPackagesAnd2KieBases() throws Exception {
String drl1 = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule R11 when\n" +
" $m : Message( message == \"Hello World\" )\n" +
"then\n" +
"end\n" +
"rule R12 when\n" +
" $m : Message( message == \"Hi Universe\" )\n" +
"then\n" +
"end\n";
String drl2 = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"rule R21 when\n" +
" $m : Message( message == \"Hello World\" )\n" +
"then\n" +
"end\n" +
"rule R22 when\n" +
" $m : Message( message == \"Aloha Earth\" )\n" +
"then\n" +
"end\n";
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", "1.0-SNAPSHOT");
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML(releaseId)
.write("src/main/resources/KBase1/org/pkg1/r1.drl", drl1)
.write("src/main/resources/KBase1/org/pkg2/r2.drl", drl2)
.writeKModuleXML(createKieProjectWithPackagesAnd2KieBases(ks).toXML());
ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert(new Message("Hello World"));
assertEquals( 1, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert(new Message("Hi Universe"));
assertEquals( 1, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId).newKieSession("KSession1");
ksession.insert(new Message("Aloha Earth"));
assertEquals( 0, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId).newKieSession("KSession2");
ksession.insert(new Message("Hello World"));
assertEquals( 1, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId).newKieSession("KSession2");
ksession.insert(new Message("Hi Universe"));
assertEquals( 0, ksession.fireAllRules() );
ksession = ks.newKieContainer(releaseId).newKieSession("KSession2");
ksession.insert(new Message("Aloha Earth"));
assertEquals(1, ksession.fireAllRules());
}
private KieModuleModel createKieProjectWithPackagesAnd2KieBases(KieServices ks) {
KieModuleModel kproj = ks.newKieModuleModel();
kproj.newKieBaseModel()
.setEqualsBehavior( EqualityBehaviorOption.EQUALITY )
.setEventProcessingMode( EventProcessingOption.STREAM )
.addPackage("org.pkg1")
.newKieSessionModel("KSession1");
kproj.newKieBaseModel()
.setEqualsBehavior( EqualityBehaviorOption.EQUALITY )
.setEventProcessingMode( EventProcessingOption.STREAM )
.addPackage("org.pkg2")
.newKieSessionModel("KSession2");
return kproj;
}
@Test
public void testImport() throws Exception {
// DROOLS-859
String drl1 = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"global java.util.List list\n" +
"rule R1 when\n" +
" $m : Message( message == \"Hello World\" )\n" +
"then\n" +
" list.add(\"ok\");\n" +
"end\n";
String drl2 = "package org.drools.compiler.integrationtests\n" +
"import " + Message.class.getCanonicalName() + "\n" +
"global java.util.List list\n" +
"rule R2 when\n" +
" $m : Message( message == \"Hi Universe\" )\n" +
"then\n" +
" list.add(\"ko\");\n" +
"end\n";
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId( "org.kie", "test-import", "1.0-SNAPSHOT" );
KieModuleModel kproj = ks.newKieModuleModel();
kproj.newKieBaseModel( "kbase" )
.addPackage( "rules" )
.newKieSessionModel( "ksession" )
.setDefault( true );
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML( releaseId )
.write( "src/main/resources/rules/r1.drl", drl1 )
.write( "src/main/resources/myrules/r2.drl", drl2 )
.writeKModuleXML( kproj.toXML() );
KieBuilder kieBuilder = ks.newKieBuilder( kfs ).buildAll();
KieSession ksession = ks.newKieContainer( releaseId ).newKieSession( );
List<String> results = new ArrayList<String>();
ksession.setGlobal( "list", results );
ksession.insert( new Message( "Hello World" ) );
ksession.insert( new Message( "Hi Universe" ) );
ksession.fireAllRules();
assertEquals( 1, results.size() );
assertEquals( "ok", results.get(0) );
}
}