package org.infinispan.server.core.transport; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufHolder; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; /** * Input/Output ChannelHandler to keep statistics * * @author gustavonalle * @author wburns * @since 7.1 */ public class StatsChannelHandler extends ChannelDuplexHandler { private final NettyTransport transport; public StatsChannelHandler(NettyTransport transport) { this.transport = transport; } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { transport.updateTotalBytesRead(getByteSize(msg)); super.channelRead(ctx, msg); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { transport.acceptedChannels.add(ctx.channel()); super.channelActive(ctx); } @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { int writable = getByteSize(msg); transport.updateTotalBytesWritten(writable); super.write(ctx, msg, promise); } int getByteSize(Object msg) { if (msg instanceof ByteBuf) { return ((ByteBuf) msg).readableBytes(); } else if (msg instanceof ByteBufHolder) { return ((ByteBufHolder) msg).content().readableBytes(); } else { return -1; } } }