package org.jboss.logging.util;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.jboss.logging.XLevel;
public class LoggerStream
extends PrintStream
{
public static final boolean TRACE =
getBoolean(LoggerStream.class.getName() + ".trace", false);
private static boolean getBoolean(String name, boolean defaultValue)
{
String value = System.getProperty(name, null);
if (value == null)
return defaultValue;
return new Boolean(value).booleanValue();
}
private Logger logger;
private Level level;
private boolean inWrite;
private boolean issuedWarning;
public LoggerStream(final Logger logger)
{
this(logger, Level.INFO, System.out);
}
public LoggerStream(final Logger logger,
final Level level,
final PrintStream ps)
{
super(ps);
this.logger = logger;
this.level = level;
}
public void println(String msg)
{
if( msg == null )
msg = "null";
byte[] bytes = msg.getBytes();
write(bytes, 0, bytes.length);
}
public void println(Object msg)
{
if( msg == null )
msg = "null";
byte[] bytes = msg.toString().getBytes();
write(bytes, 0, bytes.length);
}
public void write(byte b)
{
byte[] bytes = {b};
write(bytes, 0, 1);
}
private ThreadLocal recursiveCheck = new ThreadLocal();
public void write(byte[] b, int off, int len)
{
Boolean recursed = (Boolean)recursiveCheck.get();
if (recursed != null && recursed.equals(Boolean.TRUE))
{
if( issuedWarning == false )
{
String msg = "ERROR: invalid console appender config detected, console stream is looping";
try
{
out.write(msg.getBytes());
}
catch(IOException ignore)
{
}
issuedWarning = true;
}
return;
}
while( len > 0 && (b[len-1] == '\n' || b[len-1] == '\r') && len > off )
len --;
if (len != 0)
{
String msg = new String(b, off, len);
recursiveCheck.set(Boolean.TRUE);
if (TRACE)
{
logger.log(level, msg, new Throwable());
}
else
{
logger.log(level, msg);
}
recursiveCheck.set(Boolean.FALSE);
}
}
}