Package org.rzo.yajsw.controller.jvm

Source Code of org.rzo.yajsw.controller.jvm.ControllerPipelineFactory

package org.rzo.yajsw.controller.jvm;

import static org.jboss.netty.channel.Channels.pipeline;

import java.net.InetAddress;
import java.net.UnknownHostException;

import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
import org.jboss.netty.handler.codec.frame.Delimiters;
import org.rzo.yajsw.Constants;
import org.rzo.yajsw.controller.Message;
import org.rzo.yajsw.nettyutils.ChannelGroupFilter;
import org.rzo.yajsw.nettyutils.Condition;
import org.rzo.yajsw.nettyutils.ConditionFilter;
import org.rzo.yajsw.nettyutils.LoggingFilter;
import org.rzo.yajsw.nettyutils.WhitelistFilter;

class ControllerPipelineFactory implements ChannelPipelineFactory
{

  JVMController  _controller;
  boolean      _debug  = false;

  ControllerPipelineFactory(JVMController controller, boolean debug)
  {
    _controller = controller;
    _debug = debug;
  }

  public ChannelPipeline getPipeline() throws Exception
  {

    ChannelPipeline pipeline = pipeline(); // Note the static import.
    if (_debug)
      pipeline.addLast("logging1", new LoggingFilter(_controller.getLog(), "controller"));

    // allow new connections only if state != LOGGED_ON
    pipeline.addLast("checkWaiting", new ConditionFilter(new Condition()
    {
      public boolean isOk(ChannelHandlerContext ctx, ChannelEvent e)
      {
        boolean result = true;
        int currentState = _controller.getState();
        if (currentState == JVMController.STATE_LOGGED_ON)
        {
          _controller.getLog().info("app already logged on -> rejecting new connedction");
          result = false;
        }
        return result;
      }
    }));

    // create a firewall allowing only localhosts to connect
    WhitelistFilter firewall = new WhitelistFilter();
    try
    {
      firewall.allowAll(InetAddress.getAllByName("127.0.0.1"));
      firewall.allow(InetAddress.getLocalHost());
      pipeline.addLast("firewall", firewall);
    }
    catch (UnknownHostException e)
    {
      _controller.getLog().throwing(JVMController.class.getName(), "start", e);
    }

    // add a framer to split incoming bytes to message chunks
    pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, true, Delimiters.nulDelimiter()));

    // add messge codec
    pipeline.addLast("messageEncoder", new MessageEncoder());
    pipeline.addLast("messageDecoder", new MessageDecoder());

    if (_controller.isDebug())
    {
      pipeline.addLast("logging", new LoggingFilter(_controller.getLog(), "controller"));
      _controller.getLog().info("Logging ON");
    }

    // if we found our partner close all other open connections
    pipeline.addLast("removeConnected", new ChannelGroupFilter(new Condition()
    {
      public boolean isOk(ChannelHandlerContext ctx, ChannelEvent e)
      {
        boolean result = false;
        if (e instanceof MessageEvent)
        {
          Message m = (Message) ((MessageEvent) e).getMessage();
          result = m.getCode() == Constants.WRAPPER_MSG_OKKEY;
        }
        return result;
      }
    }));

    // at last add the message handler
    pipeline.addLast("handler", new ControllerHandler(_controller));

    return pipeline;
  }

}
TOP

Related Classes of org.rzo.yajsw.controller.jvm.ControllerPipelineFactory

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.