/*
* ====================================================================
* 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.internal.util;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.Map;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.util.SVNDebugLogAdapter;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
public class DefaultSVNDebugLogger extends SVNDebugLogAdapter {
private Map myLoggers;
private Handler myTestHandler;
public DefaultSVNDebugLogger() {
myLoggers = new SVNHashMap();
}
public void log(SVNLogType logType, Throwable th, Level logLevel) {
Logger logger = getLogger(logType);
if (logger.isLoggable(logLevel) && th != null) {
logger.log(logLevel, getMessage(logType, th.getMessage()), th);
}
}
public void log(SVNLogType logType, String message, Level logLevel) {
Logger logger = getLogger(logType);
if (logger.isLoggable(logLevel) && message != null) {
logger.log(logLevel, getMessage(logType, message));
}
}
public void log(SVNLogType logType, String message, byte[] data) {
Logger logger = getLogger(logType);
if (logger.isLoggable(Level.FINEST)) {
try {
logger.log(Level.FINEST, message + "\n" + new String(data, "UTF-8"));
} catch (UnsupportedEncodingException e) {
logger.log(Level.FINEST, message + "\n" + new String(data));
}
}
}
public InputStream createLogStream(SVNLogType logType, InputStream is) {
if (getLogger(logType).isLoggable(Level.FINEST)) {
return super.createLogStream(logType, is);
}
return is;
}
public OutputStream createLogStream(SVNLogType logType, OutputStream os) {
if (getLogger(logType).isLoggable(Level.FINEST)) {
return super.createLogStream(logType, os);
}
return os;
}
private Logger getLogger(SVNLogType logType) {
Logger logger = (Logger) myLoggers.get(logType);
if (logger == null) {
logger = Logger.getLogger(logType.getName());
String testName = SVNFileUtil.getEnvironmentVariable("SVN_CURRENT_TEST");
if (testName != null) {
if (myTestHandler == null) {
try {
myTestHandler = createTestLogger(testName);
} catch (IOException e) {}
}
if (myTestHandler != null) {
Handler[] existingHandlers = logger.getHandlers();
for (int i = 0; i < existingHandlers.length; i++) {
logger.removeHandler(existingHandlers[i]);
}
logger.addHandler(myTestHandler);
}
}
myLoggers.put(logType, logger);
}
return logger;
}
private String getMessage(SVNLogType logType, String originalMessage) {
return logType.getShortName() + ": " + originalMessage;
}
private static Handler createTestLogger(String testName) throws IOException {
URL mySource = DefaultSVNDebugLogger.class.getProtectionDomain().getCodeSource().getLocation();
File programDir = new File(mySource.getPath()).getParentFile();
File logFile = new File(programDir, "../logs/" + testName.trim() + ".log");
FileHandler fileHandler = new FileHandler(logFile.getAbsolutePath(), 0, 1, true);
fileHandler.setLevel(Level.FINEST);
fileHandler.setFormatter(new DefaultSVNDebugFormatter());
return fileHandler;
}
}