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 load(String file) throws IOException { var parser = mapper.getFactory().createParser(new File(file)); var objects = mapper.readValues(parser, AcmeObject.class).readAll(new ArrayList<>()); List 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 factHandles) throws IOException { var out = new File("out"); if (!out.isDirectory()) { if (!out.mkdirs()) { throw new IOException("Could not create directory: " + out); } } List> 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 fact : facts) { g.writeObject(new AcmeObject( fact.getKey(), mapper.valueToTree(fact.getValue()) )); } } } }