package org.atomnuke.syslog.netty.channel;
import org.atomnuke.syslog.parser.FramingSyslogParser;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author zinic
*/
public class SyslogChannelDecoder extends SimpleChannelUpstreamHandler {
private static final Logger LOG = LoggerFactory.getLogger(SyslogChannelDecoder.class);
private final FramingSyslogParser parser;
public SyslogChannelDecoder() {
parser = new FramingSyslogParser();
}
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
final ChannelBuffer input = (ChannelBuffer) e.getMessage();
if (input.readable()) {
parser.next(input.readByte());
switch (parser.getState()) {
case ERROR:
LOG.error("Error parsing message: " + parser.getErrorMessage());
parser.reset();
break;
case STOP:
Channels.fireMessageReceived(ctx, parser.getResult());
break;
}
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
LOG.error(e.getCause().getMessage(), e.getCause());
}
}