package com.alibaba.doris.dataserver.net.netty; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.doris.dataserver.action.data.ActionData; import com.alibaba.doris.dataserver.action.parser.ActionParser; /** * @author ajun Email:jack.yuj@alibaba-inc.com */ public class DataServerEncoder extends OneToOneEncoder { @Override protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { ActionData actionData = (ActionData) msg; // We allocate memory just in the first request . if (null == buffer) { buffer = ChannelBuffers.dynamicBuffer(channel.getConfig().getBufferFactory()); } else { buffer.clear(); } ActionParser parser = actionData.getActionType().getParser(); if (null != parser) { NettyByteBufferWrapper bufferWrapper = new NettyByteBufferWrapper(buffer); parser.writeHead(bufferWrapper, actionData); parser.writeBody(bufferWrapper, actionData); } if (logger.isDebugEnabled()) { logger.debug("client:" + channel.getRemoteAddress() + " server:" + channel.getLocalAddress() + "Server send back command:" + actionData); } return buffer; } private ChannelBuffer buffer; private static final Logger logger = LoggerFactory.getLogger(DataServerEncoder.class); }