package ilarkesto.mda.model; import ilarkesto.core.logging.Log; import ilarkesto.io.CsvParser; import ilarkesto.io.CsvWriter; import ilarkesto.io.IO; import java.io.File; import java.io.StringWriter; import java.util.Arrays; import java.util.List; public class CsvFileModelSource implements ModelSource { private static Log log = Log.get(CsvFileModelSource.class); private String charset = IO.UTF_8; private File file; public CsvFileModelSource(File file) { super(); this.file = file; } @Override public void save(Model model) { StringWriter sw = new StringWriter(); CsvWriter out = new CsvWriter(sw); out.writeHeaders(Arrays.asList("id", "parentId", "type", "value")); writeNode(model.getRoot(), out); log.info("Writing file:", file.getPath()); IO.writeFile(file, sw.toString(), charset); } private void writeNode(Node node, CsvWriter out) { if (node.isTransient()) return; out.writeField(node.getId()); out.writeField(node.getParentId()); out.writeField(node.getType()); out.writeField(node.getValue()); out.closeRecord(); for (Node child : node.getChildren()) { writeNode(child, out); } } @Override public void load(Model model) { model.clear(); log.info("Loading file:", file.getPath()); CsvParser parser; try { parser = new CsvParser(file, charset, true); } catch (Exception ex) { throw new RuntimeException(ex); } List<String> record = parser.nextRecord(); if (record == null) throw new RuntimeException("Illegal model file format"); if (!"id".equals(record.get(0))) throw new RuntimeException("Illegal model file format"); if (!"parentId".equals(record.get(1))) throw new RuntimeException("Illegal model file format"); if (!"type".equals(record.get(2))) throw new RuntimeException("Illegal model file format"); if (!"value".equals(record.get(3))) throw new RuntimeException("Illegal model file format"); while ((record = parser.nextRecord()) != null) { String id = record.get(0); String parentId = record.get(1); String type = record.get(2); String value = record.get(3); model.addNode(id, parentId, type, value); } } }