package de.danielsenff.madds.util; import java.io.PrintStream; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * A simple log writing class. * * This logger implements basic functionality for logging messages to * System.out * * @author m.kandora * */ public class Logger { private static Map<Class<?>, Logger> logger = new HashMap<Class<?>, Logger>(); private PrintStream printer; private boolean enabled; private Class<?> reference; // private String format = "class %s : %s"; private Logger(final Class<?> reference) { this.reference = reference; this.enabled = true; this.printer = System.err; } /** * Returns a logger for the specific type * * @param type * @return a new Logger */ public static Logger getLogger(final Class<?> type) { if(logger.containsKey(type)) { return logger.get(type); } Logger log = new Logger(type); logger.put(type, log); return log; } /** * Inserts a sepeator between the logs */ public void separator() { this.log("------------------------------------"); } /** * Writes a log entry to stdout * * @param message */ public void log(final Object message) { this.log(message, null); } /** * Writes a log entry to stdout, prints the stacktrace if any existent * @param message * @param throwable */ public void log(final Object message, Throwable throwable) { this.log(message, throwable, getPrintStream()); } public void log(final Object message, Throwable throwable, PrintStream stream) { if(!enabled) return; System.out.println(getCaller() + ":"); System.out.println("\t" + getNow() + " ->" + message); if(throwable != null) { throwable.printStackTrace(); } } protected Date getNow() { return Calendar.getInstance().getTime(); } private PrintStream getPrintStream() { return printer; } public void setPrintStream(final PrintStream stream) { this.printer = stream; } /** * Experimental function to determine the caller of * {@link #log(Object)} or {@link #log(Object, Throwable)} * * @return the calling class method as string */ protected StackTraceElement getCaller() { StackTraceElement[] frame = Thread.currentThread().getStackTrace(); int index; // skip first -> current thread for(index=1; index < frame.length; index++) { if(!(frame[index].getClassName().equals(getClass().getName()))) { break; } } return frame[index]; } /** * enables / disables this logger * @param b */ public void enable(final boolean b) { this.enabled = b; System.err.println("Logger for Class: " + getReference() + " has been " + (enabled ? "enabled" : "disabled")); } private Class<?> getReference() { return reference; } }