Package org.rzo.netty.ahessian.rpc.message

Source Code of org.rzo.netty.ahessian.rpc.message.HessianRPCCallEncoder

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);
  }
 

}
TOP

Related Classes of org.rzo.netty.ahessian.rpc.message.HessianRPCCallEncoder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.