001    /**
002     *   GRANITE DATA SERVICES
003     *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004     *
005     *   This file is part of the Granite Data Services Platform.
006     *
007     *                               ***
008     *
009     *   Community License: GPL 3.0
010     *
011     *   This file is free software: you can redistribute it and/or modify
012     *   it under the terms of the GNU General Public License as published
013     *   by the Free Software Foundation, either version 3 of the License,
014     *   or (at your option) any later version.
015     *
016     *   This file is distributed in the hope that it will be useful, but
017     *   WITHOUT ANY WARRANTY; without even the implied warranty of
018     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
019     *   GNU General Public License for more details.
020     *
021     *   You should have received a copy of the GNU General Public License
022     *   along with this program. If not, see <http://www.gnu.org/licenses/>.
023     *
024     *                               ***
025     *
026     *   Available Commercial License: GraniteDS SLA 1.0
027     *
028     *   This is the appropriate option if you are creating proprietary
029     *   applications and you are not prepared to distribute and share the
030     *   source code of your application under the GPL v3 license.
031     *
032     *   Please visit http://www.granitedataservices.com/license for more
033     *   details.
034     */
035    package org.granite.gravity.udp;
036    
037    import java.net.InetSocketAddress;
038    
039    import javax.servlet.http.HttpServletRequest;
040    
041    import org.granite.gravity.AbstractChannel;
042    import org.granite.gravity.GravityConfig;
043    import org.granite.gravity.udp.UdpReceiver;
044    import org.granite.gravity.udp.UdpReceiverFactory;
045    import org.granite.logging.Logger;
046    
047    import flex.messaging.messages.Message;
048    
049    /**
050     * @author Franck WOLFF
051     */
052    public class UdpReceiverFactoryImpl implements UdpReceiverFactory {
053    
054            private static final Logger log = Logger.getLogger(UdpReceiverFactoryImpl.class);
055    
056        private int port = 0;
057            private boolean nio = true;
058            private boolean connected = false;
059            private int sendBufferSize = GravityConfig.DEFAULT_UDP_SEND_BUFFER_SIZE;
060            
061            private UdpChannelFactory udpChannelFactory = null;
062    
063            public void setPort(int port) {
064                    this.port = port;
065            }
066            public int getPort() {
067                    return port;
068            }
069    
070            public boolean isNio() {
071                    return nio;
072            }
073            public void setNio(boolean nio) {
074                    this.nio = nio;
075            }
076    
077            public boolean isConnected() {
078                    return connected;
079            }
080            public void setConnected(boolean connected) {
081                    this.connected = connected;
082            }
083    
084            public int getSendBufferSize() {
085                    return sendBufferSize;
086            }
087            public void setSendBufferSize(int sendBufferSize) {
088                    this.sendBufferSize = sendBufferSize;
089            }
090    
091            public void start() {
092                    log.info("Starting UDP Receiver Factory (port=%d, nio=%b, connected=%b, sendBufferSize=%d)", port, nio, connected, sendBufferSize);
093                    
094                    if (connected) {
095                            if (nio)
096                                    udpChannelFactory = new UdpConnectedNIOChannelFactory(this);
097                            else
098                                    udpChannelFactory = new UdpConnectedIOChannelFactory(this);
099                    }
100                    else {
101                            if (nio)
102                                    udpChannelFactory = new UdpSharedNIOChannelFactory(this);
103                            else
104                                    udpChannelFactory = new UdpSharedIOChannelFactory(this);
105                    }
106                    
107                    udpChannelFactory.start();
108            }
109    
110            @Override
111            public int getHeartBeatPort() {
112                    return 0;
113            }
114            
115            public boolean isUdpConnectRequest(Message connect) {
116                    return connect.headerExists(UdpReceiverImpl.GDS_CLIENT_UPD_PORT);
117            }
118    
119            public UdpReceiver newReceiver(AbstractChannel channel, HttpServletRequest request, Message connect) {
120                    Number port = (Number)connect.getHeader(UdpReceiverImpl.GDS_CLIENT_UPD_PORT);
121                    InetSocketAddress address = new InetSocketAddress(request.getRemoteAddr(), port.intValue());
122                    
123                    log.debug("Creating UDP receiver for channel id %s and address %s", channel.getId(), address);
124                    
125                    return new UdpReceiverImpl(udpChannelFactory.newUdpChannel(channel, address), connect);
126            }
127    
128            public void stop() {
129                    log.info("Stopping UDP Receiver Factory");
130    
131                    try {
132                            udpChannelFactory.stop();
133                    }
134                    finally {
135                            udpChannelFactory = null;
136                    }
137            }
138    }