/*
* Milyn - Copyright (C) 2006
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (version 2.1) as published
* by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details:
* http://www.gnu.org/licenses/lgpl.txt
*/
package org.milyn.util;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;
import org.apache.commons.logging.Log;
/**
* StoutToLog4jFilter is just a simple FileWriter implementation that
* supresses output unless the log4j priority is set to debug.
* This class in indended to be used with hsql embedded server and to
* be used like this:
* <pre>{@code
*
* Log targetLogger = LogFactory.getLog("org.hsqldb");
* server.setLogWriter(new PrintWriter(new StdoutToLog4jFilter(server.getLogWriter(), targetLogger)));
*
* }</pre>
*
* @author <a href="mailto:dbevenius@redhat.com">Daniel Bevenius</a>
*/
public class StdoutToLog4jFilter extends FilterWriter
{
/**
* Log to log check logging level.
*/
protected Log logger;
/**
* string "buffer"
*/
protected StringBuilder sb = new StringBuilder();
/**
* Carrage Return
*/
private static final char CR = '\r';
/**
* Line Feed
*/
private static final char LF = '\n';
public StdoutToLog4jFilter(Writer writer)
{
super( writer );
}
public StdoutToLog4jFilter(Writer writer, Log log)
{
this( writer );
this.logger = log;
}
@Override
public synchronized void write(int c) throws IOException
{
sb.append(c);
}
@Override
public synchronized void write(char[] cbuf, int off, int len) throws IOException
{
sb.append( cbuf, off, len );
}
@Override
public synchronized void write(String str, int off, int len) throws IOException
{
sb.append( str.substring(off, off+len));
}
@Override
public synchronized void flush() throws IOException
{
log();
}
@Override
public synchronized void close() throws IOException
{
if ( sb.length() != 0)
{
log();
}
}
@Override
protected void finalize() throws Throwable
{
if (sb.length() != 0)
{
log();
}
super.finalize();
}
protected void log()
{
stripExtraNewLine();
logBuffer(sb);
sb.delete(0,sb.length());
}
private void logBuffer(final StringBuilder sb)
{
if (logger == null )
{
return;
}
if (logger.isDebugEnabled())
{
logger.debug(sb.toString());
}
}
protected final void stripExtraNewLine()
{
int length = sb.length();
if (length == 0)
{
return;
}
if (length == 1)
{
char last = sb.charAt(0);
if (last == CR || last == LF)
{
sb.deleteCharAt(0);
}
}
else
{
int lastPosition = length-1;
char secondLast = sb.charAt(lastPosition);
if (secondLast == CR)
{
sb.deleteCharAt( lastPosition );
}
else if (secondLast == LF)
{
int secondlastPosition = length-2;
sb.deleteCharAt(lastPosition);
if (sb.charAt(secondlastPosition) == CR )
{
sb.deleteCharAt(secondlastPosition);
}
}
}
}
}