package io.trygvis.rules.engine; import org.drools.core.audit.WorkingMemoryConsoleLogger; import org.kie.api.KieServices; import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.RuleRuntimeEventListener; import org.kie.api.io.Resource; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class Engine implements Closeable { private final Logger logger = LoggerFactory.getLogger(getClass()); public final DbIo io; public final KieSession session; public Engine(String name, File database, File output, String[] agendaGroups, File[] modules) throws IOException { logger.info("Getting KieServices"); var services = KieServices.Factory.get(); logger.info("services = {}", services); var kieRepository = services.getRepository(); logger.info("kieRepository.getDefaultReleaseId() = {}", kieRepository.getDefaultReleaseId()); KieContainer container; if (modules != null && modules.length > 0) { List resources = new ArrayList<>(); for (File path : modules) { if (!path.exists()) { logger.warn("Module path does not exist: {}", path.getAbsolutePath()); continue; } logger.info("New KieBuilder: {}, file={}, directory={}", path, path.isFile(), path.isDirectory()); var resource = services.getResources().newFileSystemResource(path); logger.info("resource.getResourceType() = {}", resource.getResourceType()); resources.add(resource); } var module = kieRepository.addKieModule(resources.get(0), resources.subList(1, resources.size()).toArray(new Resource[0])); logger.info("module.getReleaseId() = {}", module.getReleaseId()); var rId = module.getReleaseId(); logger.info("Creating classpath container, releaseId=" + rId); container = services.newKieContainer(rId); } else { container = services.getKieClasspathContainer(); } logger.info("Creating KieBase \"{}\"", name); logger.info("Available kie base names: {}", container.getKieBaseNames()); var kieBase = container.getKieBase(name); session = container.newKieSession(name); var l = new WorkingMemoryConsoleLogger(session); session.addEventListener((AgendaEventListener) l); session.addEventListener((RuleRuntimeEventListener) l); session.setGlobal("te", new JinjavaTemplateEngine(output)); logger.info("Loading data"); io = new DbIo(container, kieBase); var objects = io.load(database); logger.info("Loaded {} objects", objects.size()); for (var object : objects) { logger.info("object = " + object); session.insert(object); } for (var agendaGroup : agendaGroups) { logger.info("Setting agenda: " + agendaGroup); session.getAgenda().getAgendaGroup(agendaGroup).setFocus(); session.fireAllRules(); } } @Override public void close() { session.dispose(); } }