package org.infinispan.server.hotrod.logging;
import org.infinispan.server.hotrod.CacheDecodeContext;
import org.infinispan.server.hotrod.ErrorResponse;
import org.infinispan.server.hotrod.HotRodOperation;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.util.AttributeKey;
/**
* Very simple handler that sole purpose is to put the decode context into the channel
*
* @author wburns
* @since 9.0
*/
@ChannelHandler.Sharable
public class LoggingContextHandler extends ChannelDuplexHandler {
public LoggingContextHandler() {
}
private static final LoggingContextHandler INSTANCE = new LoggingContextHandler();
public static final LoggingContextHandler getInstance() {
return INSTANCE;
}
public static final AttributeKey<CacheDecodeContext> DECODE_CONTEXT_KEY = AttributeKey.newInstance("__decodeContextKey");
public static final AttributeKey<HotRodOperation> OPERATION_KEY = AttributeKey.newInstance("__operationKey");
public static final AttributeKey<String> CACHE_NAME_KEY = AttributeKey.newInstance("__cacheNameKey");
public static final AttributeKey<String> EXCEPTION_MESSAGE_KEY = AttributeKey.newInstance("__exceptionMessageKey");
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof CacheDecodeContext) {
ctx.channel().attr(DECODE_CONTEXT_KEY).set((CacheDecodeContext) msg);
ctx.channel().attr(EXCEPTION_MESSAGE_KEY).remove();
}
super.channelRead(ctx, msg);
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if (msg instanceof ErrorResponse) {
ErrorResponse errorResponse = (ErrorResponse) msg;
ctx.channel().attr(OPERATION_KEY).set(errorResponse.getOperation());
ctx.channel().attr(CACHE_NAME_KEY).set(errorResponse.getCacheName());
ctx.channel().attr(EXCEPTION_MESSAGE_KEY).set(errorResponse.getMsg());
}
super.write(ctx, msg, promise);
}
}