package net.hvidtfeldts.utils; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayDeque; import java.util.Deque; import javax.swing.SwingUtilities; public class Logger { private static Logger log = new Logger(); private static OutputStream stream = new LoggerPrintStream(); private final Deque<Long> timeStack = new ArrayDeque<Long>(); protected void internalLog(Object obj) { System.out.println(obj); } protected void internalWarn(Object obj) { System.err.println(obj); } public static void setLogger(Logger newLog) { log = newLog; } public static void log(Object obj) { log.internalLog(obj); } public static void warn(Object obj) { log.internalWarn(obj); } public static PrintStream getLoggerWarnStream() { return new PrintStream(stream); } public static void startTime() { log.internalStartTime(); } private void internalStartTime() { timeStack.push(System.currentTimeMillis()); } public static void endTime(String message) { log.internalEndTime(message); } private void internalEndTime(String message) { Long millis = System.currentTimeMillis() - timeStack.pop(); log.internalLog(String.format("[%s ms] %s", millis, message)); } private static class LoggerPrintStream extends OutputStream { private final StringBuffer sb = new StringBuffer(); @Override public void flush() { } @Override public void close() { } @Override public void write(int b) throws IOException { if (b == '\r') return; if (b == '\n') { final String text = sb.toString() + "\n"; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { warn(text); } }); sb.setLength(0); return; } sb.append((char) b); } } }