package org.lemsml.jlems.io.out; import java.io.File; import java.io.IOException; import java.util.ArrayList; import org.lemsml.jlems.core.logging.E; import org.lemsml.jlems.core.out.EventResultWriter; import org.lemsml.jlems.core.run.RuntimeError; import org.lemsml.jlems.core.run.RuntimeEventOutput; import org.lemsml.jlems.core.type.simulation.EventWriter; import org.lemsml.jlems.io.util.FileUtil; public class FileEventResultWriter implements EventResultWriter { String id; String path; String fileName; String format; ArrayList<String> currentEvents = new ArrayList<String>(); StringBuilder lines = new StringBuilder(); boolean newFile = true; boolean verbose = false; public FileEventResultWriter(RuntimeEventOutput ro) { id = ro.getID(); path = ro.getPath(); fileName = ro.getFileName(); format = ro.getFormat(); } @Override public String getID() { return id; } @Override public void recordEvent(String id) { if (verbose) System.out.println("FileEventResultWriter "+id+" recordEvent: "+id+"..."); currentEvents.add(id); } @Override public void advance(double t) throws RuntimeError { for (String ev: currentEvents) { if (format.equals(EventWriter.FORMAT_TIME_ID)) { lines.append((float)t+"\t"+ev+"\n"); } else if (format.equals(EventWriter.FORMAT_ID_TIME)) { lines.append(ev+"\t"+(float)t+"\n"); } } currentEvents.clear(); } @Override public void addedRecorder() { // ... } public void flush() throws RuntimeError { File fdest = getFile(); try { if (newFile) { FileUtil.writeStringToFile(lines.toString(), fdest); } else { FileUtil.appendStringToFile(lines.toString(), fdest); } } catch (IOException ex) { throw new RuntimeError("Can't write to file: " + fileName, ex); } newFile = false; } private File getFile() { File fdir; if (path != null) { fdir = new File(path); } else if (fileName.startsWith("/")) { fdir = null; } else { fdir = new File("."); } File fdest = new File(fdir, fileName); if (!fdest.getParentFile().exists()) { try { E.informativeError("This LEMS file is requesting to write to a file: "+fileName+", resolved as: "+fdest.getCanonicalPath() +"\nHowever, parent directory: "+fdest.getParentFile().getCanonicalPath()+" does not exist!"); } catch (IOException ex) { E.informativeError("This LEMS file is requesting to write to a file: "+fileName+", resolved as: "+fdest.getAbsolutePath() +"\nHowever, parent directory: "+fdest.getParentFile().getAbsolutePath()+" does not exist!"); } System.exit(1); } return fdest; } @Override public void close() throws RuntimeError { if (verbose) System.out.println("close()..."); flush(); File f = getFile(); E.info("Written to the event file " + f.getAbsolutePath() + " " + f.length()); } }