package org.rzo.netty.ahessian.log;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.DownstreamMessageEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.UpstreamMessageEvent;
import org.jboss.netty.handler.logging.LoggingHandler;
import org.rzo.netty.ahessian.Constants;
public class OutLogger extends LoggingHandler
{
String _name;
public OutLogger(String name)
{
super(name);
_name = name;
}
@Override
public void log(ChannelEvent e)
{
StringBuilder sb = new StringBuilder();
//System.out.println(e);
if (e instanceof DownstreamMessageEvent)
{
DownstreamMessageEvent devm = (DownstreamMessageEvent) e;
Object mes = devm.getMessage();
sb.append('[');
sb.append(e.getChannel().getId());
sb.append(" >out> ");
if (mes instanceof ChannelBuffer)
encodeBuffer((ChannelBuffer)((DownstreamMessageEvent)e).getMessage(), sb);
else
sb.append(mes.toString());
} else
if (e instanceof UpstreamMessageEvent)
{
sb.append(e.getChannel().getId());
sb.append(" <in< ");
Object message = ((UpstreamMessageEvent)e).getMessage();
if (message instanceof ChannelBuffer)
encodeBuffer((ChannelBuffer)((UpstreamMessageEvent)e).getMessage(), sb);
}
else if (e instanceof ExceptionEvent)
{
sb.append(e.toString());
}
else
sb.append(e.toString());
Constants.ahessianLogger.info(sb.toString());
}
static private void encodeBuffer(ChannelBuffer buffer, StringBuilder sb)
{
if (buffer == null)
return;
sb.append("("+buffer.readableBytes()+") ");
int size = Math.min(50, buffer.readableBytes());
byte[] b = new byte[size];
buffer.getBytes(0, b);
for (int i=0; i<b.length && i < 50; i++)
{
toDebugChar(sb, b[i]);
}
}
static private void toDebugChar(StringBuilder sb, int ch)
{
if (ch >= 0x20 && ch < 0x7f) {
sb.append((char) ch);
}
else
sb.append(String.format("\\x%02x", ch & 0xff));
}
public static String asString(byte[] buffer)
{
StringBuilder sb = new StringBuilder();
if (buffer == null)
return "null";
sb.append("("+buffer.length+") ");
for (int i=0; i<buffer.length; i++)
{
toDebugChar(sb, buffer[i]);
}
return sb.toString();
}
}