/*
* Copyright 2017 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.
* You may obtain a copy of the License at
*
* 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.testcoverage.common.util;
import org.assertj.core.api.Assertions;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.command.KieCommands;
import org.kie.api.io.KieResources;
import org.kie.api.io.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* Util class that provides various methods related to Kie API.
*/
public final class KieUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(KieUtil.class);
public static KieModule buildAndInstallKieModuleIntoRepo(final String groupId,
final KieModuleModel kieModuleModel, final Resource... resources) {
final ReleaseId releaseId = generateReleaseId(groupId);
return buildAndInstallKieModuleIntoRepo(releaseId, kieModuleModel, resources);
}
public static KieModule buildAndInstallKieModuleIntoRepo(final ReleaseId releaseId,
final KieModuleModel kieModuleModel, final Resource... resources) {
final KieServices kieServices = KieServices.Factory.get();
final KieFileSystem fileSystem = getKieFileSystemWithKieModule(kieModuleModel, releaseId, resources);
final KieBuilder builder = getKieBuilderFromKieFileSystem(fileSystem, true);
final KieModule kieModule = builder.getKieModule();
kieServices.getRepository().addKieModule(kieModule);
return kieModule;
}
public static KieModuleModel createKieModuleModel() {
final KieServices kieServices = KieServices.Factory.get();
return kieServices.newKieModuleModel();
}
public static KieFileSystem getKieFileSystemWithKieModule(final KieModuleModel kieModuleModel,
final ReleaseId releaseId, final Resource... resources) {
final KieFileSystem fileSystem = KieServices.Factory.get().newKieFileSystem();
fileSystem.generateAndWritePomXML(releaseId);
for (Resource resource : resources) {
fileSystem.write(resource);
}
fileSystem.writeKModuleXML(kieModuleModel.toXML());
return fileSystem;
}
public static KieBuilder getKieBuilderFromKieFileSystem(final KieFileSystem fileSystem, final boolean failIfBuildError) {
return getKieBuilderFromFileSystemWithResources(fileSystem, failIfBuildError);
}
public static KieBuilder getKieBuilderFromResources(final boolean failIfBuildError, final Resource... resources) {
return getKieBuilderFromFileSystemWithResources(
KieServices.Factory.get().newKieFileSystem(), failIfBuildError, resources);
}
private static KieBuilder getKieBuilderFromFileSystemWithResources(final KieFileSystem kfs,
final boolean failIfBuildError, final Resource... resources) {
for (Resource res : resources) {
kfs.write(res);
}
final KieBuilder kbuilder = KieServices.Factory.get().newKieBuilder(kfs);
kbuilder.buildAll();
// Messages from KieBuilder with increasing severity
List<Message> msgs = kbuilder.getResults().getMessages(Message.Level.INFO);
if (msgs.size() > 0) {
LOGGER.info("KieBuilder information: {}", msgs.toString());
}
msgs = kbuilder.getResults().getMessages(Message.Level.WARNING);
if (msgs.size() > 0) {
LOGGER.warn("KieBuilder warnings: {}", msgs.toString());
}
msgs = kbuilder.getResults().getMessages(Message.Level.ERROR);
if (msgs.size() > 0) {
LOGGER.error("KieBuilder errors: {}", msgs.toString());
}
if (failIfBuildError) {
Assertions.assertThat(msgs).as(msgs.toString()).isEmpty();
}
return kbuilder;
}
public static ReleaseId generateReleaseId(final String groupId) {
final KieServices kieServices = KieServices.Factory.get();
return kieServices.newReleaseId(groupId, UUID.randomUUID().toString(), "1.0.0-SNAPSHOT");
}
public static KieBuilder getKieBuilderFromClasspathResources(final Class classLoaderFromClass,
final boolean failIfBuildError,
final String... resources) {
final List<Resource> result = new ArrayList<>();
for (String resource : resources) {
result.add(KieServices.Factory.get().getResources().newClassPathResource(resource, classLoaderFromClass));
}
return getKieBuilderFromResources(failIfBuildError, result.toArray(new Resource[]{}));
}
public static Resource[] createResources(final String drlFile, final Class<?> clazz) {
return new Resource[] { getResources().newClassPathResource(drlFile, clazz)};
}
public static Resource[] createResources(final String drl) {
final Resource drlResource = getResources().newReaderResource(new StringReader(drl));
drlResource.setTargetPath(TestConstants.DRL_TEST_TARGET_PATH);
return new Resource[] { drlResource };
}
public static final KieCommands getCommands() {
return getServices().getCommands();
}
public static final KieResources getResources() {
return getServices().getResources();
}
public static final KieServices getServices() {
return KieServices.Factory.get();
}
private KieUtil() {
// Creating instances of util classes should not be possible.
}
}