summaryrefslogtreecommitdiff
path: root/src/main/java/io/trygvis/rules/acme/AcmeIo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/trygvis/rules/acme/AcmeIo.java')
-rw-r--r--src/main/java/io/trygvis/rules/acme/AcmeIo.java81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/rules/acme/AcmeIo.java b/src/main/java/io/trygvis/rules/acme/AcmeIo.java
new file mode 100644
index 0000000..67dd4cb
--- /dev/null
+++ b/src/main/java/io/trygvis/rules/acme/AcmeIo.java
@@ -0,0 +1,81 @@
+package io.trygvis.rules.acme;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
+import org.drools.core.common.DefaultFactHandle;
+import org.kie.api.runtime.rule.FactHandle;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+public class AcmeIo {
+ private final ObjectMapper mapper;
+
+ public AcmeIo() {
+ var factory = new YAMLFactory();
+ factory.enable(YAMLGenerator.Feature.USE_NATIVE_TYPE_ID);
+ factory.enable(YAMLGenerator.Feature.USE_NATIVE_OBJECT_ID);
+ mapper = new ObjectMapper(factory);
+ mapper.findAndRegisterModules();
+ }
+
+ public List<Object> load(String file) throws IOException {
+ var parser = mapper.getFactory().createParser(new File(file));
+
+ var objects = mapper.readValues(parser, AcmeObject.class).readAll(new ArrayList<>());
+
+ List<Object> items = new ArrayList<>(objects.size());
+ for (AcmeObject object : objects) {
+ try {
+ var type = Class.forName(object.type);
+ var x = mapper.treeToValue(object.data, type);
+ items.add(x);
+ } catch (ClassNotFoundException e) {
+ throw new IOException(e);
+ }
+ }
+
+ return items;
+ }
+
+ public void dump(String s, Collection<FactHandle> factHandles) throws IOException {
+ var out = new File("out");
+
+ if (!out.isDirectory()) {
+ if (!out.mkdirs()) {
+ throw new IOException("Could not create directory: " + out);
+ }
+ }
+
+ List<Map.Entry<String, Object>> facts = new ArrayList<>(factHandles.size());
+ for (var handle : factHandles) {
+ if (handle instanceof DefaultFactHandle h) {
+ facts.add(new AbstractMap.SimpleImmutableEntry<>(
+ h.getObjectClassName(),
+ h.getObject()));
+ }
+ }
+
+ facts.sort(Map.Entry.comparingByKey());
+
+ var factory = mapper.getFactory();
+ try (var writer = new FileWriter(new File(out, s + ".yaml"));
+ var g = factory.createGenerator(writer)) {
+ for (Map.Entry<String, Object> fact : facts) {
+ g.writeObject(new AcmeObject(
+ fact.getKey(),
+ mapper.valueToTree(fact.getValue())
+ ));
+ }
+ }
+ }
+}