Mercurial > hg4j
diff src/org/tmatesoft/hg/internal/StreamLogFacility.java @ 295:981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 16 Sep 2011 05:35:32 +0200 |
parents | |
children | 909306e412e2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/tmatesoft/hg/internal/StreamLogFacility.java Fri Sep 16 05:35:32 2011 +0200 @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2011 TMate Software Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * For information on how to redistribute this software under + * the terms of a license other than GNU General Public License + * contact TMate Software at support@hg4j.com + */ +package org.tmatesoft.hg.internal; + +import java.io.PrintStream; + +import org.tmatesoft.hg.util.LogFacility; + +/** + * Primitive implementation of {@link LogFacility} that directs all output to specified {@link PrintStream}. + * + * @author Artem Tikhomirov + * @author TMate Software Ltd. + */ +public class StreamLogFacility implements LogFacility { + + private final boolean isDebug; + private final boolean isInfo; + protected final boolean timestamp; + protected final PrintStream outStream; + + public StreamLogFacility(boolean pringDebug, boolean printInfo, boolean needTimestamp, PrintStream out) { + isDebug = pringDebug; + isInfo = printInfo; + timestamp = needTimestamp; + outStream = out; + } + + public boolean isDebug() { + return isDebug; + } + + public boolean isInfo() { + return isInfo; + } + + public void debug(Class<?> src, String format, Object... args) { + if (!isDebug) { + return; + } + printf("DEBUG", src, format, args); + } + + public void info(Class<?> src, String format, Object... args) { + if (!isInfo) { + return; + } + printf("INFO", src, format, args); + } + + public void warn(Class<?> src, String format, Object... args) { + printf("WARN", src, format, args); + } + + public void error(Class<?> src, String format, Object... args) { + printf("ERROR", src, format, args); + } + + public void debug(Class<?> src, Throwable th, String message) { + if (!isDebug) { + return; + } + printf("DEBUG", src, th, message); + } + + public void info(Class<?> src, Throwable th, String message) { + if (!isInfo) { + return; + } + printf("INFO", src, th, message); + } + + public void warn(Class<?> src, Throwable th, String message) { + printf("WARN", src, th, message); + } + + public void error(Class<?> src, Throwable th, String message) { + printf("ERROR", src, th, message); + } + + protected void printf(String level, Class<?> src, String format, Object... args) { + String msg = String.format(format, args); + if (timestamp) { + outStream.printf(isDebug ? "%tT.%1$tL " : "%tT ", System.currentTimeMillis()); + } + if (isDebug) { + String cn = src.getName(); + if (cn.startsWith("org.tmatesoft.hg.")) { + cn = "oth." + cn.substring("org.tmatesoft.hg.".length()); + } + outStream.printf("(%s) ", cn); + } + outStream.printf("%s: %s", level, msg); + if (format.length() == 0 || format.charAt(format.length() - 1) != '\n') { + outStream.println(); + } + } + protected void printf(String level, Class<?> src, Throwable th, String msg) { + if (msg != null || timestamp || isDebug || th == null) { + printf(level, src, msg == null ? "" : msg, (Object[]) null); + } + if (th != null) { + if (isDebug || isInfo) { + // full stack trace + th.printStackTrace(outStream); + } else { + // just title of the exception + outStream.printf("%s: %s\n", th.getClass().getName(), th.getMessage()); + } + } + } + + // alternative to hardcore System.out where SessionContext is not available now (or ever) + public static LogFacility newDefault() { + return new StreamLogFacility(true, true, true, System.out); + } +}