Package org.menacheri.jetserver.handlers.netty

Source Code of org.menacheri.jetserver.handlers.netty.UDPUpstreamHandler

package org.menacheri.jetserver.handlers.netty;

import java.net.SocketAddress;

import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jboss.netty.channel.socket.DatagramChannel;
import org.menacheri.jetserver.app.Session;
import org.menacheri.jetserver.communication.MessageSender.Fast;
import org.menacheri.jetserver.communication.NettyUDPMessageSender;
import org.menacheri.jetserver.event.Event;
import org.menacheri.jetserver.event.Events;
import org.menacheri.jetserver.service.SessionRegistryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class UDPUpstreamHandler extends SimpleChannelUpstreamHandler
{
  private static final Logger LOG = LoggerFactory.getLogger(UDPUpstreamHandler.class);
  private SessionRegistryService<SocketAddress> udpSessionRegistry;
  public UDPUpstreamHandler()
  {
    super();
  }
 
  @Override
  public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
      throws Exception
  {
    // Get the session using the remoteAddress.
    SocketAddress remoteAddress = e.getRemoteAddress();
    Session session = udpSessionRegistry.getSession(remoteAddress);
    if(null != session)
    {
      Event event = (Event) e.getMessage();
      // If the session's UDP has not been connected yet then send a
      // CONNECT event.
      if (!session.isUDPEnabled())
      {
        event = getUDPConnectEvent(event, remoteAddress,
            (DatagramChannel) e.getChannel());
        // Pass the connect event on to the session
        session.onEvent(event);
      }
      else if (event.getType() == Events.CONNECT)
      {
        // Duplicate connect just discard.
        LOG.trace("Duplicate CONNECT {} received in UDP channel, "
            + "for session: {} going to discard", event, session);
      }
      else
      {
        // Pass the original event on to the session
        session.onEvent(event);
      }
    }
    else
    {
      LOG.trace("Packet received from unknown source address: {}, going to discard",remoteAddress);
    }
  }

  public Event getUDPConnectEvent(Event event, SocketAddress remoteAddress,
      DatagramChannel udpChannel)
  {
    LOG.debug("Incoming udp connection remote address : {}",
        remoteAddress);
   
    if (event.getType() != Events.CONNECT)
    {
      LOG.warn("Going to discard UDP Message Event with type {} "
          + "It will get converted to a CONNECT event since "
          + "the UDP MessageSender is not initialized till now",
          event.getType());
    }
    Fast messageSender = new NettyUDPMessageSender(remoteAddress, udpChannel, udpSessionRegistry);
    Event connectEvent = Events.connectEvent(messageSender);
   
    return connectEvent;
  }

  public SessionRegistryService<SocketAddress> getUdpSessionRegistry()
  {
    return udpSessionRegistry;
  }

  public void setUdpSessionRegistry(
      SessionRegistryService<SocketAddress> udpSessionRegistry)
  {
    this.udpSessionRegistry = udpSessionRegistry;
  }
 
}
TOP

Related Classes of org.menacheri.jetserver.handlers.netty.UDPUpstreamHandler

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.