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