package org.infinispan.server.hotrod; import org.infinispan.commons.logging.LogFactory; import org.infinispan.server.core.logging.Log; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.DecoderException; /** * Handler that will transform various exceptions into responses to send back to the client. * * @author wburns * @since 9.0 */ public class HotRodExceptionHandler extends ChannelInboundHandlerAdapter { private final static Log log = LogFactory.getLog(HotRodExceptionHandler.class, Log.class); @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) throws Exception { Channel ch = ctx.channel(); HotRodDecoder decoder = ctx.pipeline().get(HotRodDecoder.class); CacheDecodeContext decodeCtx = decoder.decodeCtx; log.debug("Exception caught", t); if (t instanceof DecoderException) { t = t.getCause(); } if (t instanceof HotRodException) { // HotRodException is already translated to response ch.writeAndFlush(((HotRodException) t).response); } else { ch.writeAndFlush(decodeCtx.createExceptionResponse(t)); } } }