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 }