/*
* 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;
import org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl;
import org.drools.compiler.integrationtests.SerializationHelper;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.core.common.InternalAgenda;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseImpl;
import org.drools.core.reteoo.builder.NodeFactory;
import org.junit.Assert;
import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.Message;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.Results;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.marshalling.Marshaller;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.conf.KieSessionOption;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.InternalKieBuilder;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderConfiguration;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.marshalling.MarshallerFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import org.kie.internal.runtime.StatelessKnowledgeSession;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Collection;
import java.util.function.Predicate;
/**
* This contains methods common to many of the tests in drools-compiler. </p>
* The {@link #createKnowledgeSession(KnowledgeBase)} method has been made
* common so that tests in drools-compiler can be reused (with persistence) in
* drools-persistence-jpa.
*/
public class CommonTestMethodBase extends Assert {
protected KieSession createKieSession(KieBase kbase) {
return kbase.newKieSession();
}
protected KieSession createKieSession(KieBase kbase, KieSessionOption option) {
KieSessionConfiguration ksconf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
ksconf.setOption(option);
return kbase.newKieSession(ksconf, null);
}
protected StatefulKnowledgeSession createKnowledgeSession(KnowledgeBase kbase) {
return kbase.newStatefulKnowledgeSession();
}
protected StatefulKnowledgeSession createKnowledgeSession(KnowledgeBase kbase, KieSessionOption option) {
KieSessionConfiguration ksconf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
ksconf.setOption(option);
return kbase.newStatefulKnowledgeSession(ksconf, null);
}
protected StatefulKnowledgeSession createKnowledgeSession(KnowledgeBase kbase, KieSessionConfiguration ksconf) {
return kbase.newStatefulKnowledgeSession(ksconf, null);
}
protected StatefulKnowledgeSession createKnowledgeSession(KnowledgeBase kbase, KieSessionConfiguration ksconf, Environment env) {
return kbase.newStatefulKnowledgeSession(ksconf, env);
}
protected StatelessKnowledgeSession createStatelessKnowledgeSession(KnowledgeBase kbase) {
return kbase.newStatelessKnowledgeSession();
}
protected KnowledgeBase loadKnowledgeBaseFromString(NodeFactory nodeFactory, String... drlContentStrings) {
return loadKnowledgeBaseFromString(null, null, nodeFactory, drlContentStrings);
}
protected KnowledgeBase loadKnowledgeBaseFromString(String... drlContentStrings) {
return loadKnowledgeBaseFromString(null, null, drlContentStrings);
}
protected KnowledgeBase loadKnowledgeBaseFromString(KnowledgeBuilderConfiguration config, String... drlContentStrings) {
return loadKnowledgeBaseFromString(config, null, drlContentStrings);
}
protected KnowledgeBase loadKnowledgeBaseFromString(
KieBaseConfiguration kBaseConfig, String... drlContentStrings) {
return loadKnowledgeBaseFromString(null, kBaseConfig, drlContentStrings);
}
protected KnowledgeBase loadKnowledgeBaseFromString( KnowledgeBuilderConfiguration config, KieBaseConfiguration kBaseConfig, String... drlContentStrings) {
return loadKnowledgeBaseFromString( config, kBaseConfig, (NodeFactory)null, drlContentStrings);
}
protected KnowledgeBase loadKnowledgeBaseFromString( KnowledgeBuilderConfiguration config, KieBaseConfiguration kBaseConfig, NodeFactory nodeFactory, String... drlContentStrings) {
KnowledgeBuilder kbuilder = config == null ? KnowledgeBuilderFactory.newKnowledgeBuilder() : KnowledgeBuilderFactory.newKnowledgeBuilder(config);
for (String drlContentString : drlContentStrings) {
kbuilder.add(ResourceFactory.newByteArrayResource(drlContentString
.getBytes()), ResourceType.DRL);
}
if (kbuilder.hasErrors()) {
fail(kbuilder.getErrors().toString());
}
if (kBaseConfig == null) {
kBaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
}
KnowledgeBase kbase = kBaseConfig == null ? KnowledgeBaseFactory.newKnowledgeBase() : KnowledgeBaseFactory.newKnowledgeBase(kBaseConfig);
if (nodeFactory != null) {
((KnowledgeBaseImpl) kbase).getConfiguration().getComponentFactory().setNodeFactoryProvider( nodeFactory);
}
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
protected KnowledgeBase loadKnowledgeBase(KnowledgeBuilderConfiguration kbuilderConf, KieBaseConfiguration kbaseConf, String... classPathResources) {
Collection<KnowledgePackage> knowledgePackages = loadKnowledgePackages(kbuilderConf, classPathResources);
if (kbaseConf == null) {
kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConf);
kbase.addKnowledgePackages(knowledgePackages);
try {
kbase = SerializationHelper.serializeObject(kbase);
} catch (Exception e) {
throw new RuntimeException(e);
}
return kbase;
}
protected KnowledgeBase loadKnowledgeBase(PackageDescr descr) {
return loadKnowledgeBase(null, null, descr);
}
protected KnowledgeBase loadKnowledgeBase(KnowledgeBuilderConfiguration kbuilderConf,KieBaseConfiguration kbaseConf, PackageDescr descr) {
Collection<KnowledgePackage> knowledgePackages = loadKnowledgePackages(kbuilderConf, descr);
if (kbaseConf == null) {
kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConf);
kbase.addKnowledgePackages(knowledgePackages);
try {
kbase = SerializationHelper.serializeObject(kbase);
} catch (Exception e) {
throw new RuntimeException(e);
}
return kbase;
}
public Collection<KnowledgePackage> loadKnowledgePackages(String... classPathResources) {
return loadKnowledgePackages(null, classPathResources);
}
public Collection<KnowledgePackage> loadKnowledgePackages(PackageDescr descr) {
return loadKnowledgePackages(null, descr);
}
public Collection<KnowledgePackage> loadKnowledgePackages(KnowledgeBuilderConfiguration kbuilderConf, PackageDescr descr) {
if (kbuilderConf == null) {
kbuilderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
}
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConf);
kbuilder.add(ResourceFactory.newDescrResource(descr), ResourceType.DESCR);
if (kbuilder.hasErrors()) {
fail(kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> knowledgePackages = kbuilder.getKnowledgePackages();
return knowledgePackages;
}
public Collection<KnowledgePackage> loadKnowledgePackages( KnowledgeBuilderConfiguration kbuilderConf, String... classPathResources) {
return loadKnowledgePackages(kbuilderConf, true, classPathResources);
}
public Collection<KnowledgePackage> loadKnowledgePackages( KnowledgeBuilderConfiguration kbuilderConf, boolean serialize, String... classPathResources) {
if (kbuilderConf == null) {
kbuilderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
}
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConf);
for (String classPathResource : classPathResources) {
kbuilder.add(ResourceFactory.newClassPathResource(classPathResource, getClass()), ResourceType.DRL);
}
if (kbuilder.hasErrors()) {
fail(kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> knowledgePackages = null;
if ( serialize ) {
try {
knowledgePackages = SerializationHelper.serializeObject(kbuilder.getKnowledgePackages(), ((KnowledgeBuilderConfigurationImpl)kbuilderConf).getClassLoader() );
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
knowledgePackages = kbuilder.getKnowledgePackages();
}
return knowledgePackages;
}
public Collection<KnowledgePackage> loadKnowledgePackagesFromString(String... content) {
return loadKnowledgePackagesFromString(null, content);
}
public Collection<KnowledgePackage> loadKnowledgePackagesFromString(KnowledgeBuilderConfiguration kbuilderConf, String... content) {
if (kbuilderConf == null) {
kbuilderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
}
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConf);
for (String r : content) {
kbuilder.add(ResourceFactory.newByteArrayResource(r.getBytes()),ResourceType.DRL);
}
if (kbuilder.hasErrors()) {
fail(kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> knowledgePackages = kbuilder.getKnowledgePackages();
return knowledgePackages;
}
protected KnowledgeBase loadKnowledgeBase(KnowledgeBuilderConfiguration kbuilderConf,String... classPathResources) {
return loadKnowledgeBase(kbuilderConf, null, classPathResources);
}
protected KnowledgeBase loadKnowledgeBase(KieBaseConfiguration kbaseConf, String... classPathResources) {
return loadKnowledgeBase(null, kbaseConf, classPathResources);
}
protected KnowledgeBase getKnowledgeBase() {
KieBaseConfiguration kBaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
return getKnowledgeBase(kBaseConfig);
}
protected KnowledgeBase getKnowledgeBase(KieBaseConfiguration kBaseConfig) {
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kBaseConfig);
try {
kbase = SerializationHelper.serializeObject(kbase, ((InternalKnowledgeBase) kbase).getRootClassLoader());
} catch (Exception e) {
throw new RuntimeException(e);
}
return kbase;
}
protected KnowledgeBase loadKnowledgeBase(String... classPathResources) {
return loadKnowledgeBase(null, null, classPathResources);
}
protected InternalAgenda getInternalAgenda(StatefulKnowledgeSession session) {
return (InternalAgenda) session.getAgenda();
}
protected void waitBusy(final long waitDuration) {
final long waitEndTime = System.currentTimeMillis() + waitDuration;
while (System.currentTimeMillis() < waitEndTime) {
// do nothing, only spin.
}
}
public static byte[] createJar(KieServices ks,
ReleaseId releaseId,
String... drls) {
KieFileSystem kfs = ks.newKieFileSystem().generateAndWritePomXML(
releaseId);
for (int i = 0; i < drls.length; i++) {
if (drls[i] != null) {
kfs.write("src/main/resources/r" + i + ".drl", drls[i]);
}
}
KieBuilder kb = ks.newKieBuilder(kfs).buildAll();
assertFalse( kb.getResults().getMessages(org.kie.api.builder.Message.Level.ERROR).toString(),
kb.getResults().hasMessages(org.kie.api.builder.Message.Level.ERROR) );
InternalKieModule kieModule = (InternalKieModule) ks.getRepository()
.getKieModule(releaseId);
byte[] jar = kieModule.getBytes();
return jar;
}
public static KieModule createAndDeployJar(KieServices ks, ReleaseId releaseId, String... drls) {
byte[] jar = createJar(ks, releaseId, drls);
// Deploy jar into the repository
KieModule km = deployJarIntoRepository(ks, jar);
return km;
}
public static KieModule createAndDeployJar(KieServices ks, String kmoduleContent, ReleaseId releaseId, Resource... resources) {
return createAndDeployJar( ks, kmoduleContent, o -> true, releaseId, resources );
}
public static KieModule createAndDeployJar(KieServices ks,
String kmoduleContent,
Predicate<String> classFilter,
ReleaseId releaseId,
Resource... resources) {
byte[] jar = createJar(ks, kmoduleContent, classFilter, releaseId, resources);
KieModule km = deployJarIntoRepository(ks, jar);
return km;
}
public static byte[] createJar(KieServices ks, String kmoduleContent, Predicate<String> classFilter, ReleaseId releaseId, Resource... resources) {
KieFileSystem kfs = ks.newKieFileSystem().generateAndWritePomXML(releaseId).writeKModuleXML(kmoduleContent);
for (int i = 0; i < resources.length; i++) {
if (resources[i] != null) {
kfs.write(resources[i]);
}
}
KieBuilder kieBuilder = ks.newKieBuilder(kfs);
((InternalKieBuilder) kieBuilder).buildAll(classFilter);
Results results = kieBuilder.getResults();
if (results.hasMessages(Message.Level.ERROR)) {
throw new IllegalStateException(results.getMessages(Message.Level.ERROR).toString());
}
InternalKieModule kieModule = (InternalKieModule) ks.getRepository()
.getKieModule(releaseId);
byte[] jar = kieModule.getBytes();
return jar;
}
private static KieModule deployJarIntoRepository(KieServices ks, byte[] jar) {
Resource jarRes = ks.getResources().newByteArrayResource(jar);
KieModule km = ks.getRepository().addKieModule(jarRes);
return km;
}
public static byte[] createKJar(KieServices ks,
ReleaseId releaseId,
Resource pom,
Resource... resources) {
KieFileSystem kfs = ks.newKieFileSystem();
if( pom != null ) {
kfs.write(pom);
} else {
kfs.generateAndWritePomXML(releaseId);
}
for (int i = 0; i < resources.length; i++) {
if (resources[i] != null) {
kfs.write(resources[i]);
}
}
ks.newKieBuilder(kfs).buildAll();
InternalKieModule kieModule = (InternalKieModule) ks.getRepository()
.getKieModule(releaseId);
byte[] jar = kieModule.getBytes();
return jar;
}
public static byte[] createKJar(KieServices ks,
ReleaseId releaseId,
String pom,
String... drls) {
return createKJar( ks, null, releaseId, pom, drls );
}
public static byte[] createKJar(KieServices ks,
KieModuleModel kproj,
ReleaseId releaseId,
String pom,
String... drls) {
KieFileSystem kfs = ks.newKieFileSystem();
if (kproj != null) {
kfs.writeKModuleXML(kproj.toXML());
}
if( pom != null ) {
kfs.write("pom.xml", pom);
} else {
kfs.generateAndWritePomXML(releaseId);
}
for (int i = 0; i < drls.length; i++) {
if (drls[i] != null) {
kfs.write("src/main/resources/r" + i + ".drl", drls[i]);
}
}
return buildKJar( ks, kfs, releaseId );
}
public static byte[] buildKJar( KieServices ks, KieFileSystem kfs, ReleaseId releaseId ) {
KieBuilder kb = ks.newKieBuilder( kfs ).buildAll();
if( kb.getResults().hasMessages( Message.Level.ERROR ) ) {
for( Message result : kb.getResults().getMessages() ) {
System.out.println(result.getText());
}
return null;
}
InternalKieModule kieModule = (InternalKieModule) ks.getRepository()
.getKieModule(releaseId);
byte[] jar = kieModule.getBytes();
return jar;
}
public static KieModule deployJar(KieServices ks, byte[] jar) {
// Deploy jar into the repository
Resource jarRes = ks.getResources().newByteArrayResource(jar);
KieModule km = ks.getRepository().addKieModule(jarRes);
return km;
}
public static KieSession marshallAndUnmarshall(KieServices ks, KieBase kbase, KieSession ksession) {
return marshallAndUnmarshall(ks, kbase, ksession, null);
}
public static KieSession marshallAndUnmarshall(KieServices ks, KieBase kbase, KieSession ksession, KieSessionConfiguration sessionConfig) {
// Serialize and Deserialize
try {
Marshaller marshaller = ks.getMarshallers().newMarshaller(kbase);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshall(baos, ksession);
marshaller = MarshallerFactory.newMarshaller(kbase);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
baos.close();
ksession = marshaller.unmarshall(bais, sessionConfig, null);
bais.close();
} catch (Exception e) {
e.printStackTrace();
fail("unexpected exception :" + e.getMessage());
}
return ksession;
}
}