package de.jpaw.bonaparte.netty; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.jpaw.bonaparte.core.BonaPortable; import de.jpaw.bonaparte.core.ByteArrayComposer; @Sharable public class BonaparteNettyEncoder extends MessageToByteEncoder<BonaPortable> { private static final Logger LOGGER = LoggerFactory.getLogger(BonaparteNettyEncoder.class); @Override public void encode(ChannelHandlerContext ctx, BonaPortable msg, ByteBuf out) throws Exception { ByteArrayComposer w = new ByteArrayComposer(); try { // catch any exceptions during serialization, because they might not get logged otherwise w.writeRecord(msg); LOGGER.debug("Writing object {} as stream of {} bytes", msg.getClass().getCanonicalName(), w.getLength()); if (LOGGER.isTraceEnabled()) LOGGER.trace("String is {}", new String(w.getBytes())); // w.getBytes() is costly as it involves an array copy! // output the converted data out.writeBytes(w.getBuffer(), 0, w.getLength()); } catch (Exception e) { // http://co-de-generation.blogspot.de/2012/09/slf4j-doesnt-log-exception-stacktrace.html LOGGER.error("Exception serializing object of type " + msg.ret$PQON() + ": got exception {}", e); } } }