package io.trygvis.rules.engine; import org.drools.core.audit.WorkingMemoryConsoleLogger; import org.kie.api.KieServices; import org.kie.api.builder.Message; import org.kie.api.builder.Message.Level; import org.kie.api.builder.ReleaseId; import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.RuleRuntimeEventListener; 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; 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); ReleaseId releaseId = null; for (File path : (modules == null ? new File[0] : modules)) { logger.info("New KieBuilder: {}", path); // var kieBuilder = services.newKieBuilder(fileSystem); var kieBuilder = services.newKieBuilder(path); logger.info("Building module"); kieBuilder.buildAll(); logger.info("Module built!"); var results = kieBuilder.getResults(); for (Message message : results.getMessages(Level.INFO, Level.WARNING, Level.ERROR)) { // logger.info("{} {}", message.getLevel(), message.getText()); logger.info(message.toString()); } var module = kieBuilder.getKieModule(); releaseId = module.getReleaseId(); logger.info("module.getReleaseId() = {}", releaseId); logger.info("module.getClass() = {}", module.getClass()); } logger.info("Creating classpath container"); // var container = services.getKieClasspathContainer(); var container = services.newKieContainer(releaseId); logger.info("Creating KieBase"); 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(); } }