package org.rzo.netty.ahessian.rpc.message; import java.io.OutputStream; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipelineCoverage; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import org.rzo.netty.ahessian.Constants; import org.rzo.netty.ahessian.io.OutputStreamEncoder; import org.rzo.netty.ahessian.rpc.io.Hessian2Output; import org.rzo.netty.ahessian.session.ClientSessionFilter; import com.caucho.hessian4.io.AbstractSerializerFactory; import com.caucho.hessian4.io.SerializerFactory; /** * writes a call request to an output stream */ @ChannelPipelineCoverage("all") public class HessianRPCCallEncoder extends SimpleChannelHandler { SerializerFactory sFactory = new SerializerFactory(); Hessian2Output hOut = null; boolean _hasSessionFilter = false; public HessianRPCCallEncoder() { super(); } public HessianRPCCallEncoder(AbstractSerializerFactory serializerFactory) { super(); if (serializerFactory != null) sFactory.addFactory(serializerFactory); } /* (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 { try { // if (e.getMessage() instanceof Integer) // { // hOut.flush(); // return; // } Object msg = e.getMessage(); if (msg instanceof FlushRequestMessage) { hOut.flush(e.getFuture()); e.getFuture().await(5000); return; } HessianRPCCallMessage message = (HessianRPCCallMessage) e.getMessage(); message.setHasSessionFilter(_hasSessionFilter); hOut.resetReferences(); hOut.call(message); } catch (Exception ex) { Constants.ahessianLogger.warn("", ex); e.getFuture().setFailure(ex); } //--Thread.yield(); } private OutputStream getOutputStream(ChannelHandlerContext ctx) { return (OutputStream) ctx.getPipeline().getContext(OutputStreamEncoder.class).getAttachment(); } @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { _hasSessionFilter = ctx.getPipeline().getContext(ClientSessionFilter.class) != null; if (hOut == null) { OutputStream out = (OutputStream) ctx.getPipeline().getContext(OutputStreamEncoder.class).getAttachment(); hOut = new Hessian2Output(out); hOut.getSerializerFactory().addFactory(sFactory); } else hOut.reset(); ctx.sendUpstream(e); } }