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@456: import static org.tmatesoft.hg.util.LogFacility.Severity.Info; tikhomirov@456: 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@456: private final Severity severity; tikhomirov@295: protected final boolean timestamp; tikhomirov@295: protected final PrintStream outStream; tikhomirov@295: tikhomirov@456: public StreamLogFacility(Severity level, boolean needTimestamp, PrintStream out) { tikhomirov@456: assert level != null; tikhomirov@456: severity = level; tikhomirov@456: isDebug = level == Severity.Debug; tikhomirov@295: timestamp = needTimestamp; tikhomirov@295: outStream = out; tikhomirov@295: } tikhomirov@295: tikhomirov@295: public boolean isDebug() { tikhomirov@295: return isDebug; tikhomirov@295: } tikhomirov@456: tikhomirov@456: public Severity getLevel() { tikhomirov@456: return severity; tikhomirov@295: } tikhomirov@295: tikhomirov@456: public void dump(Class src, Severity severity, String format, Object... args) { tikhomirov@456: if (severity.ordinal() >= getLevel().ordinal()) { tikhomirov@456: printf(severity, src, format, args); tikhomirov@295: } tikhomirov@295: } tikhomirov@295: tikhomirov@456: public void dump(Class src, Severity severity, Throwable th, String message) { tikhomirov@456: if (severity.ordinal() >= getLevel().ordinal()) { tikhomirov@456: printf(severity, src, th, message); tikhomirov@295: } tikhomirov@295: } tikhomirov@295: tikhomirov@456: protected void printf(Severity 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@456: outStream.printf("%s: %s", level.toString().toUpperCase(), msg); tikhomirov@295: if (format.length() == 0 || format.charAt(format.length() - 1) != '\n') { tikhomirov@295: outStream.println(); tikhomirov@295: } tikhomirov@295: } tikhomirov@456: protected void printf(Severity 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@456: if (getLevel().ordinal() <= Info.ordinal()) { 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@456: return new StreamLogFacility(Severity.Debug, true, System.out); tikhomirov@295: } tikhomirov@295: }