package org.rzo.netty.ahessian.serialization;
import java.io.OutputStream;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelDownstreamHandler;
import org.rzo.netty.ahessian.io.OutputStreamEncoder;
import com.caucho.hessian4.io.HessianOutput;
/**
* Encodes the requested {@link java.lang.Object} into a {@link ChannelBuffer}.
* A typical setup for a serialization protocol in a TCP/IP socket would be:
* <pre>
* {@link ChannelPipeline} pipeline = ...;
*
* // Encoder
* pipeline.addLast("outputStream", new {@link io.OutputStream}());
* pipeline.addLast("hessianEncoder", new {@link HessianEncoder}());
*
* // Decoder
* pipeline.addLast("inputStream", new {@link io.InputStream}());
* pipeline.addLast("hessianDecoder", new {@link HessianDecoder}());
* pipeline.addLast("handler", new MyHandler());
* </pre>
* and then, within the handler you can use a {@link java.lang.Object} instead of a {@link ChannelBuffer}
* as a message:
* <pre>
* void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
* // get the message
* Object msg = e.getMessage();
* // return the current time
* ch.write(new Date());
* }
* </pre>
*/
public class HessianEncoder extends SimpleChannelDownstreamHandler
{
/* (non-Javadoc)
* @see org.jboss.netty.channel.SimpleChannelDownstreamHandler#writeRequested(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.MessageEvent)
*/
public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
OutputStream out = OutputStreamEncoder.getOutputStream(ctx);
HessianOutput hout = new HessianOutput(out);
hout.writeObject(e.getMessage());
hout.flush();
}
}