/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.javahl;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.util.SVNDebugLogAdapter;
import org.tmatesoft.svn.util.SVNLogType;
import org.tigris.subversion.javahl.JavaHLObjectFactory;
import org.tigris.subversion.javahl.SVNClientLogLevel;
/**
* @author TMate Software Ltd.
* @version 1.3
*/
public class JavaHLDebugLog extends SVNDebugLogAdapter {
private static final String JAVAHL_LOGGER_NAME = "svnkit-javahl";
private static JavaHLDebugLog ourInstance = new JavaHLDebugLog();
private Map myHandlers = new HashMap();
private Logger myLogger;
public static JavaHLDebugLog getInstance() {
return ourInstance;
}
public synchronized void enableLogging(int logLevel, File logPath, Formatter formatter) throws SVNException {
logPath = logPath.getAbsoluteFile();
if (logLevel == SVNClientLogLevel.NoLog) {
if (logPath == null) {
resetLogHandlers();
} else {
Handler handler = (Handler) myHandlers.remove(logPath);
if (handler != null) {
handler.close();
getLogger().removeHandler(handler);
}
}
return;
}
Level level = JavaHLObjectFactory.getLoggingLevel(logLevel);
Handler handler = (Handler) myHandlers.get(logPath);
if (handler == null) {
try {
handler = new FileHandler(logPath.getAbsolutePath(), true);
} catch (IOException e) {
SVNErrorManager.error(SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e.getMessage()), e, SVNLogType.DEFAULT);
}
myHandlers.put(logPath, handler);
}
handler.setFormatter(formatter);
handler.setLevel(level);
getLogger().addHandler(handler);
}
private void resetLogHandlers() {
if (getLogger().getHandlers() == null) {
return;
}
for (int i = 0; i < getLogger().getHandlers().length; i++) {
Handler handler = getLogger().getHandlers()[i];
handler.close();
getLogger().removeHandler(handler);
}
}
private Logger getLogger() {
if (myLogger == null) {
myLogger = Logger.getLogger(JAVAHL_LOGGER_NAME);
myLogger.setUseParentHandlers(false);
myLogger.setLevel(Level.ALL);
resetLogHandlers();
}
return myLogger;
}
public void log(SVNLogType logType, String message, byte[] data) {
if (getLogger().isLoggable(Level.FINEST)) {
try {
getLogger().log(Level.FINEST, getMessage(message + "\n" + new String(data, "UTF-8")));
} catch (UnsupportedEncodingException e) {
getLogger().log(Level.FINEST, getMessage(message + "\n" + new String(data)));
}
}
}
public void log(SVNLogType logType, Throwable th, Level logLevel) {
if (getLogger().isLoggable(logLevel) && th != null) {
getLogger().log(logLevel, getMessage(th.getMessage()), th);
}
}
public void log(SVNLogType logType, String message, Level logLevel) {
if (getLogger().isLoggable(logLevel) && message != null) {
getLogger().log(logLevel, getMessage(message));
}
}
private String getMessage(String originalMessage) {
return "JAVAHL" + ": " + originalMessage;
}
}