package com.camptocamp.owsproxy.logging;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.logging.ErrorManager;
import java.util.logging.Filter;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
import com.camptocamp.owsproxy.Translations;
/**
* A log handler that writes USER log messages to the standard out and a file.
* @author jeichar
*/
public class OWSLogHandler extends Handler {
/**
* This class just allows OWSLogHandler to change the OutputStream of the parent StreamHandler
*
* @author jeichar
*/
private static class OWSStreamHandler extends StreamHandler{
public OWSStreamHandler(OutputStream user, OWSLogFormatter logFormatter) {
super( user, logFormatter );
}
@Override
protected synchronized void setOutputStream(OutputStream out)
throws SecurityException {
super.setOutputStream(out);
}
}
private final OWSStreamHandler userlogStream;
private final OWSStreamHandler devlogStream;
private OWSStreamHandler userlogConsole;
// the next two are for testing.
private String devLogFile;
private String userLogFile;
public OWSLogHandler() {
this( createLogWriter(OWSLogger.USER), System.out,
createLogWriter(OWSLogger.DEV));
}
OWSLogHandler(OutputStream user, OutputStream userConsole, OutputStream dev) {
this.userlogStream=new OWSStreamHandler(user, new OWSLogFormatter());
this.userlogConsole=new OWSStreamHandler(userConsole, new OWSLogFormatter());
this.devlogStream=new OWSStreamHandler(dev, new OWSLogFormatter());;
}
private static OutputStream createLogWriter(OWSLogger logger) {
String logFile = System.getProperty(logger.systemPropertyKey());
if( logFile==null ){
logFile = Translations.getString("OWSLogHandler.defaultLog", logger.name()); //$NON-NLS-1$
}
try {
return new FileOutputStream(logFile, true);
} catch (IOException e) {
return System.err;
}
}
@Override
public void close() throws SecurityException {
userlogStream.close();
userlogConsole.close();
devlogStream.close();
}
@Override
public void flush() {
userlogStream.flush();
userlogConsole.flush();
devlogStream.flush();
}
@Override
public void publish(LogRecord record) {
OWSLogger logger = OWSLogger.lookup(record.getLoggerName());
if( logger==null ){
logger=OWSLogger.DEV;
}
setLevel(logger.logger().getLevel());
switch (logger) {
case USER:
userlogStream.publish(record);
userlogConsole.publish(record);
break;
default:
break;
}
devlogStream.publish(record);
flush();
}
@Override
public void setEncoding(String encoding) throws SecurityException,
UnsupportedEncodingException {
super.setEncoding(encoding);
userlogConsole.setEncoding(encoding);
userlogStream.setEncoding(encoding);
devlogStream.setEncoding(encoding);
}
@Override
public void setFilter(Filter newFilter) throws SecurityException {
super.setFilter(newFilter);
userlogConsole.setFilter(newFilter);
userlogStream.setFilter(newFilter);
devlogStream.setFilter(newFilter);
}
@Override
public void setErrorManager(ErrorManager em) {
super.setErrorManager(em);
userlogConsole.setErrorManager(em);
userlogStream.setErrorManager(em);
devlogStream.setErrorManager(em);
}
@Override
public void setFormatter(Formatter newFormatter) throws SecurityException {
super.setFormatter(newFormatter);
userlogConsole.setFormatter(newFormatter);
userlogStream.setFormatter(newFormatter);
devlogStream.setFormatter(newFormatter);
}
@Override
public synchronized void setLevel(Level newLevel) throws SecurityException {
super.setLevel(newLevel);
userlogConsole.setLevel(newLevel);
userlogStream.setLevel(newLevel);
devlogStream.setLevel(newLevel);
}
public String getDevLogFile() {
return devLogFile;
}
public void setDevLogFile(String devLogFile) throws FileNotFoundException {
this.devLogFile = devLogFile;
devlogStream.setOutputStream(new FileOutputStream(devLogFile));
}
public String getUserLogFile() {
return userLogFile;
}
public void setUserLogFile(String userLogFile) throws FileNotFoundException {
this.userLogFile = userLogFile;
userlogStream.setOutputStream(new FileOutputStream(userLogFile));
}
}