package org.cryptocoinpartners.util; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Date; import javax.annotation.Nullable; import javax.inject.Inject; import org.cryptocoinpartners.module.Context; import org.cryptocoinpartners.module.SaveTicksCsv; import org.cryptocoinpartners.module.TickWindow; import org.cryptocoinpartners.report.TableOutput; import org.cryptocoinpartners.schema.ReplayFactory; import org.joda.time.Instant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import au.com.bytecode.opencsv.CSVWriter; import com.bethecoder.ascii_table.ASCIITable; import com.clutch.dates.StringToTime; /** * @author Tim Olson */ public class IoUtil { public static void outputAscii(TableOutput tableOutput) { if (tableOutput == null || tableOutput.rows == null || tableOutput.rows.length == 0) System.out.println("no results"); else ASCIITable.getInstance().printTable(tableOutput.headers, tableOutput.rows); } public static void outputCsv(TableOutput tableOutput, Writer out) { final CSVWriter writer = new CSVWriter(out); if (tableOutput == null) return; if (tableOutput.headers != null) writer.writeNext(tableOutput.headers); if (tableOutput.rows == null) return; for (String[] row : tableOutput.rows) writer.writeNext(row); } public static void writeCsv(TableOutput tableOutput, String filename) { FileWriter fw = null; try { fw = new FileWriter(filename); outputCsv(tableOutput, fw); } catch (IOException e) { log.error("Could not write CSV file " + filename, e); } finally { if (fw != null) { try { fw.close(); } catch (IOException e) { log.error(e.getMessage(), e); } } } } public static void dumpTicks(String filename, String startString, String endString, boolean allowNa) { // parse the start and end times Date start = null; if (startString != null) { try { start = new StringToTime(startString); } catch (Exception e) { log.error("Could not parse start time \"" + startString + "\""); System.exit(7001); } } Date end = null; if (endString != null) { try { end = new StringToTime(endString); } catch (Exception e) { log.error("Could not parse end time \"" + endString + "\""); System.exit(7001); } } dumpTicks(filename, new Instant(start), new Instant(end), allowNa); } public static void dumpTicks(String filename, @Nullable Instant start, @Nullable Instant end, boolean allowNa) { Replay replay; if (start == null) { if (end == null) replay = replayFactory.all(false); else replay = replayFactory.until(end, false, true); } else if (end == null) replay = replayFactory.since(start, false); else replay = replayFactory.between(start, end, false); Context context = replay.getContext(); context.attach(TickWindow.class); // generate ticks context.attach(SaveTicksCsv.class, // save ticks as csv ConfigUtil.forModule("savetickscsv.filename", filename, "savetickscsv.na", allowNa)); replay.run(); context.destroy(); } public static Logger log = LoggerFactory.getLogger(IoUtil.class); @Inject protected transient static ReplayFactory replayFactory; }