/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package com.eactive.eai.rms.onl.server;

import org.apache.log4j.Logger;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.FixedRecvByteBufAllocator;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;

public final class UdpServer {
	
	private static final Logger logger = Logger.getLogger(UdpServer.class);
    private static int port ;
    
    private EventLoopGroup group;
    private UdpServerHandler handler;
    
    public void setHandler(UdpServerHandler handler){
    	this.handler = handler;
    }
    
    public void setPort(int port){
    	this.port = port;
    }
    public void init() throws Exception{
        group = new NioEventLoopGroup();
        Bootstrap b = new Bootstrap();
        b.group(group)
         .channel(NioDatagramChannel.class)
         .option(ChannelOption.SO_BROADCAST, true)
         .option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(40000))
         .handler(new ChannelInitializer<NioDatagramChannel>() {
             @Override
             public void initChannel(NioDatagramChannel ch) throws Exception {
                 ChannelPipeline p = ch.pipeline();
                p.addLast(
                         new ObjectUdpEncoder(),
                         new ObjectUdpDecoder(),
                         handler);
             }
          });        
        b.bind(port).sync().channel().closeFuture();
        logger.warn("$$ Monitoring UdpServer Started. port = " +port);
    }
    public void destory(){
    	group.shutdownGracefully();
    }
//    public static void main(String[] args) throws Exception {
//
//    }
}
