summaryrefslogtreecommitdiff
path: root/module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java
diff options
context:
space:
mode:
Diffstat (limited to 'module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java')
-rw-r--r--module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java48
1 files changed, 46 insertions, 2 deletions
diff --git a/module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java b/module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java
index f73419a..4a49ca2 100644
--- a/module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java
+++ b/module/ri-engine/src/main/java/io/trygvis/rules/engine/Engine.java
@@ -1,6 +1,7 @@
package io.trygvis.rules.engine;
import org.drools.core.audit.WorkingMemoryConsoleLogger;
+import org.drools.reflective.classloader.ProjectClassLoader;
import org.kie.api.KieServices;
import org.kie.api.event.rule.AgendaEventListener;
import org.kie.api.event.rule.RuleRuntimeEventListener;
@@ -12,10 +13,16 @@ import org.slf4j.LoggerFactory;
import java.io.Closeable;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
+import static io.trygvis.rules.engine.TemplateEngine.TemplateLoader;
+
public class Engine implements Closeable {
private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -33,8 +40,10 @@ public class Engine implements Closeable {
logger.info("kieRepository.getDefaultReleaseId() = {}", kieRepository.getDefaultReleaseId());
KieContainer container;
+ TemplateLoader templateLoader;
if (modules != null && modules.length > 0) {
List<Resource> resources = new ArrayList<>();
+ List<URL> files = new ArrayList<>();
for (File path : modules) {
if (!path.exists()) {
logger.warn("Module path does not exist: {}", path.getAbsolutePath());
@@ -43,6 +52,10 @@ public class Engine implements Closeable {
logger.info("New KieBuilder: {}, file={}, directory={}", path, path.isFile(), path.isDirectory());
+ if (path.isFile()) {
+ files.add(path.toURI().toURL());
+ }
+
var resource = services.getResources().newFileSystemResource(path);
logger.info("resource.getResourceType() = {}", resource.getResourceType());
resources.add(resource);
@@ -54,8 +67,12 @@ public class Engine implements Closeable {
logger.info("Creating classpath container, releaseId=" + rId);
container = services.newKieContainer(rId);
+
+ templateLoader = new ClasspathTemplateLoader(new URLClassLoader(files.toArray(new URL[0])));
} else {
- container = services.getKieClasspathContainer();
+ var classLoader = ProjectClassLoader.findParentClassLoader();
+ container = services.getKieClasspathContainer(classLoader);
+ templateLoader = new ClasspathTemplateLoader(classLoader);
}
logger.info("Creating KieBase \"{}\"", name);
@@ -68,11 +85,17 @@ public class Engine implements Closeable {
session.addEventListener((AgendaEventListener) l);
session.addEventListener((RuleRuntimeEventListener) l);
- session.setGlobal("te", new JinjavaTemplateEngine(output));
+ session.setGlobal("te", new JinjavaTemplateEngine(templateLoader, output));
logger.info("Loading data");
io = new DbIo(container, kieBase);
var objects = io.load(database);
+
+ if (objects.isEmpty()) {
+ logger.warn("Did not load any objects, something is wrong");
+ return;
+ }
+
logger.info("Loaded {} objects", objects.size());
for (var object : objects) {
@@ -91,4 +114,25 @@ public class Engine implements Closeable {
public void close() {
session.dispose();
}
+
+ private static class ClasspathTemplateLoader implements TemplateLoader {
+ private final ClassLoader classLoader;
+
+ private ClasspathTemplateLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
+ @Override
+ public String load(String name) throws IOException {
+ var resource = "templates/" + name + ".j2";
+
+ try (var inputStream = classLoader.getResourceAsStream(resource)) {
+ if (inputStream == null) {
+ throw new FileNotFoundException("Classpath resource: " + resource);
+ }
+
+ return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
+ }
+ }
+ }
}