/dumbhippo/branches/cluster/wildfire/src/java/org/jivesoftware/wildfire/spi/ConnectionManagerImpl.java

https://gitlab.com/manoj-makkuboy/magnetism · Java · 438 lines · 345 code · 44 blank · 49 comment · 57 complexity · b3db9ad8d68ca7e5a5dc1d20396e4497 MD5 · raw file

  1. /**
  2. * $RCSfile: ConnectionManagerImpl.java,v $
  3. * $Revision: 3159 $
  4. * $Date: 2005-12-04 22:56:40 -0300 (Sun, 04 Dec 2005) $
  5. *
  6. * Copyright (C) 2004 Jive Software. All rights reserved.
  7. *
  8. * This software is published under the terms of the GNU Public License (GPL),
  9. * a copy of which is included in this distribution.
  10. */
  11. package org.jivesoftware.wildfire.spi;
  12. import org.jivesoftware.wildfire.*;
  13. import org.jivesoftware.wildfire.container.BasicModule;
  14. import org.jivesoftware.wildfire.net.*;
  15. import org.jivesoftware.util.LocaleUtils;
  16. import org.jivesoftware.util.Log;
  17. import org.jivesoftware.util.JiveGlobals;
  18. import java.io.IOException;
  19. import java.net.InetAddress;
  20. import java.net.Socket;
  21. import java.net.UnknownHostException;
  22. import java.util.ArrayList;
  23. import java.util.Iterator;
  24. import java.util.List;
  25. public class ConnectionManagerImpl extends BasicModule implements ConnectionManager {
  26. private SocketAcceptThread socketThread;
  27. private SSLSocketAcceptThread sslSocketThread;
  28. private SocketAcceptThread componentSocketThread;
  29. private SocketAcceptThread serverSocketThread;
  30. private ArrayList<ServerPort> ports;
  31. private SessionManager sessionManager;
  32. private PacketDeliverer deliverer;
  33. private PacketRouter router;
  34. private String serverName;
  35. private XMPPServer server;
  36. private String localIPAddress = null;
  37. // Used to know if the sockets can be started (the connection manager has been started)
  38. private boolean isStarted = false;
  39. // Used to know if the sockets have been started
  40. private boolean isSocketStarted = false;
  41. public ConnectionManagerImpl() {
  42. super("Connection Manager");
  43. ports = new ArrayList<ServerPort>(4);
  44. }
  45. private void createSocket() {
  46. if (!isStarted || isSocketStarted || sessionManager == null || deliverer == null ||
  47. router == null ||
  48. serverName == null)
  49. {
  50. return;
  51. }
  52. isSocketStarted = true;
  53. // Setup port info
  54. try {
  55. localIPAddress = InetAddress.getLocalHost().getHostAddress();
  56. }
  57. catch (UnknownHostException e) {
  58. if (localIPAddress == null) {
  59. localIPAddress = "Unknown";
  60. }
  61. }
  62. // Start the port listener for s2s communication
  63. startServerListener(localIPAddress);
  64. // Start the port listener for external components
  65. startComponentListener(localIPAddress);
  66. // Start the port listener for clients
  67. startClientListeners(localIPAddress);
  68. // Start the port listener for secured clients
  69. startClientSSLListeners(localIPAddress);
  70. }
  71. private void startServerListener(String localIPAddress) {
  72. // Start servers socket unless it's been disabled.
  73. if (isServerListenerEnabled()) {
  74. int port = getServerListenerPort();
  75. String interfaceName = JiveGlobals.getProperty("xmpp.server.socket.interface");
  76. ServerPort serverPort = new ServerPort(port, interfaceName, serverName, localIPAddress,
  77. false, null, ServerPort.Type.server);
  78. try {
  79. serverSocketThread = new SocketAcceptThread(this, serverPort);
  80. ports.add(serverPort);
  81. serverSocketThread.setDaemon(true);
  82. serverSocketThread.start();
  83. List<String> params = new ArrayList<String>();
  84. params.add(Integer.toString(serverSocketThread.getPort()));
  85. Log.info(LocaleUtils.getLocalizedString("startup.server", params));
  86. }
  87. catch (Exception e) {
  88. System.err.println("Error starting server listener on port " + port + ": " +
  89. e.getMessage());
  90. Log.error(LocaleUtils.getLocalizedString("admin.error.socket-setup"), e);
  91. }
  92. }
  93. }
  94. private void stopServerListener() {
  95. if (serverSocketThread != null) {
  96. serverSocketThread.shutdown();
  97. ports.remove(serverSocketThread.getServerPort());
  98. serverSocketThread = null;
  99. }
  100. }
  101. private void startComponentListener(String localIPAddress) {
  102. // Start components socket unless it's been disabled.
  103. if (isComponentListenerEnabled()) {
  104. int port = getComponentListenerPort();
  105. String interfaceName = JiveGlobals.getProperty("xmpp.component.socket.interface");
  106. ServerPort serverPort = new ServerPort(port, interfaceName, serverName, localIPAddress,
  107. false, null, ServerPort.Type.component);
  108. try {
  109. componentSocketThread = new SocketAcceptThread(this, serverPort);
  110. ports.add(serverPort);
  111. componentSocketThread.setDaemon(true);
  112. componentSocketThread.start();
  113. List<String> params = new ArrayList<String>();
  114. params.add(Integer.toString(componentSocketThread.getPort()));
  115. Log.info(LocaleUtils.getLocalizedString("startup.component", params));
  116. }
  117. catch (Exception e) {
  118. System.err.println("Error starting component listener on port " + port + ": " +
  119. e.getMessage());
  120. Log.error(LocaleUtils.getLocalizedString("admin.error.socket-setup"), e);
  121. }
  122. }
  123. }
  124. private void stopComponentListener() {
  125. if (componentSocketThread != null) {
  126. componentSocketThread.shutdown();
  127. ports.remove(componentSocketThread.getServerPort());
  128. componentSocketThread = null;
  129. }
  130. }
  131. private void startClientListeners(String localIPAddress) {
  132. // Start clients plain socket unless it's been disabled.
  133. if (isClientListenerEnabled()) {
  134. int port = getClientListenerPort();
  135. String interfaceName = JiveGlobals.getProperty("xmpp.socket.plain.interface");
  136. ServerPort serverPort = new ServerPort(port, interfaceName, serverName, localIPAddress,
  137. false, null, ServerPort.Type.client);
  138. try {
  139. socketThread = new SocketAcceptThread(this, serverPort);
  140. ports.add(serverPort);
  141. socketThread.setDaemon(true);
  142. socketThread.start();
  143. List<String> params = new ArrayList<String>();
  144. params.add(Integer.toString(socketThread.getPort()));
  145. Log.info(LocaleUtils.getLocalizedString("startup.plain", params));
  146. }
  147. catch (Exception e) {
  148. System.err.println("Error starting XMPP listener on port " + port + ": " +
  149. e.getMessage());
  150. Log.error(LocaleUtils.getLocalizedString("admin.error.socket-setup"), e);
  151. }
  152. }
  153. }
  154. private void stopClientListeners() {
  155. if (socketThread != null) {
  156. socketThread.shutdown();
  157. ports.remove(socketThread.getServerPort());
  158. socketThread = null;
  159. }
  160. }
  161. private void startClientSSLListeners(String localIPAddress) {
  162. // Start clients SSL unless it's been disabled.
  163. if (isClientSSLListenerEnabled()) {
  164. int port = getClientSSLListenerPort();
  165. String interfaceName = JiveGlobals.getProperty("xmpp.socket.ssl.interface");
  166. String algorithm = JiveGlobals.getProperty("xmpp.socket.ssl.algorithm");
  167. if ("".equals(algorithm) || algorithm == null) {
  168. algorithm = "TLS";
  169. }
  170. ServerPort serverPort = new ServerPort(port, interfaceName, serverName, localIPAddress,
  171. true, algorithm, ServerPort.Type.client);
  172. try {
  173. sslSocketThread = new SSLSocketAcceptThread(this, serverPort);
  174. ports.add(serverPort);
  175. sslSocketThread.setDaemon(true);
  176. sslSocketThread.start();
  177. List<String> params = new ArrayList<String>();
  178. params.add(Integer.toString(sslSocketThread.getPort()));
  179. Log.info(LocaleUtils.getLocalizedString("startup.ssl", params));
  180. }
  181. catch (Exception e) {
  182. System.err.println("Error starting SSL XMPP listener on port " + port + ": " +
  183. e.getMessage());
  184. Log.error(LocaleUtils.getLocalizedString("admin.error.ssl"), e);
  185. }
  186. }
  187. }
  188. private void stopClientSSLListeners() {
  189. if (sslSocketThread != null) {
  190. sslSocketThread.shutdown();
  191. ports.remove(sslSocketThread.getServerPort());
  192. sslSocketThread = null;
  193. }
  194. }
  195. public Iterator<ServerPort> getPorts() {
  196. return ports.iterator();
  197. }
  198. public void addSocket(Socket sock, boolean isSecure, ServerPort serverPort) {
  199. try {
  200. // the order of these calls is critical (stupid huh?)
  201. SocketConnection conn = new SocketConnection(deliverer, sock, isSecure);
  202. SocketReader reader = null;
  203. String threadName = null;
  204. if (serverPort.isClientPort()) {
  205. reader = new ClientSocketReader(router, serverName, sock, conn);
  206. threadName = "Client SR - " + reader.hashCode();
  207. }
  208. else if (serverPort.isComponentPort()) {
  209. reader = new ComponentSocketReader(router, serverName, sock, conn);
  210. threadName = "Component SR - " + reader.hashCode();
  211. }
  212. else {
  213. reader = new ServerSocketReader(router, serverName, sock, conn);
  214. threadName = "Server SR - " + reader.hashCode();
  215. }
  216. Thread thread = new Thread(reader, threadName);
  217. thread.setDaemon(true);
  218. thread.start();
  219. }
  220. catch (IOException e) {
  221. Log.error(LocaleUtils.getLocalizedString("admin.error"), e);
  222. }
  223. }
  224. public void initialize(XMPPServer server) {
  225. super.initialize(server);
  226. this.server = server;
  227. router = server.getPacketRouter();
  228. deliverer = server.getPacketDeliverer();
  229. sessionManager = server.getSessionManager();
  230. }
  231. public void enableClientListener(boolean enabled) {
  232. if (enabled == isClientListenerEnabled()) {
  233. // Ignore new setting
  234. return;
  235. }
  236. if (enabled) {
  237. JiveGlobals.setProperty("xmpp.socket.plain.active", "true");
  238. // Start the port listener for clients
  239. startClientListeners(localIPAddress);
  240. }
  241. else {
  242. JiveGlobals.setProperty("xmpp.socket.plain.active", "false");
  243. // Stop the port listener for clients
  244. stopClientListeners();
  245. }
  246. }
  247. public boolean isClientListenerEnabled() {
  248. return JiveGlobals.getBooleanProperty("xmpp.socket.plain.active", true);
  249. }
  250. public void enableClientSSLListener(boolean enabled) {
  251. if (enabled == isClientSSLListenerEnabled()) {
  252. // Ignore new setting
  253. return;
  254. }
  255. if (enabled) {
  256. JiveGlobals.setProperty("xmpp.socket.ssl.active", "true");
  257. // Start the port listener for secured clients
  258. startClientSSLListeners(localIPAddress);
  259. }
  260. else {
  261. JiveGlobals.setProperty("xmpp.socket.ssl.active", "false");
  262. // Stop the port listener for secured clients
  263. stopClientSSLListeners();
  264. }
  265. }
  266. public boolean isClientSSLListenerEnabled() {
  267. return JiveGlobals.getBooleanProperty("xmpp.socket.ssl.active", true);
  268. }
  269. public void enableComponentListener(boolean enabled) {
  270. if (enabled == isComponentListenerEnabled()) {
  271. // Ignore new setting
  272. return;
  273. }
  274. if (enabled) {
  275. JiveGlobals.setProperty("xmpp.component.socket.active", "true");
  276. // Start the port listener for external components
  277. startComponentListener(localIPAddress);
  278. }
  279. else {
  280. JiveGlobals.setProperty("xmpp.component.socket.active", "false");
  281. // Stop the port listener for external components
  282. stopComponentListener();
  283. }
  284. }
  285. public boolean isComponentListenerEnabled() {
  286. return JiveGlobals.getBooleanProperty("xmpp.component.socket.active", false);
  287. }
  288. public void enableServerListener(boolean enabled) {
  289. if (enabled == isServerListenerEnabled()) {
  290. // Ignore new setting
  291. return;
  292. }
  293. if (enabled) {
  294. JiveGlobals.setProperty("xmpp.server.socket.active", "true");
  295. // Start the port listener for s2s communication
  296. startServerListener(localIPAddress);
  297. }
  298. else {
  299. JiveGlobals.setProperty("xmpp.server.socket.active", "false");
  300. // Stop the port listener for s2s communication
  301. stopServerListener();
  302. }
  303. }
  304. public boolean isServerListenerEnabled() {
  305. return JiveGlobals.getBooleanProperty("xmpp.server.socket.active", true);
  306. }
  307. public void setClientListenerPort(int port) {
  308. if (port == getClientListenerPort()) {
  309. // Ignore new setting
  310. return;
  311. }
  312. JiveGlobals.setProperty("xmpp.socket.plain.port", String.valueOf(port));
  313. // Stop the port listener for clients
  314. stopClientListeners();
  315. if (isClientListenerEnabled()) {
  316. // Start the port listener for clients
  317. startClientListeners(localIPAddress);
  318. }
  319. }
  320. public int getClientListenerPort() {
  321. return JiveGlobals.getIntProperty("xmpp.socket.plain.port",
  322. SocketAcceptThread.DEFAULT_PORT);
  323. }
  324. public void setClientSSLListenerPort(int port) {
  325. if (port == getClientSSLListenerPort()) {
  326. // Ignore new setting
  327. return;
  328. }
  329. JiveGlobals.setProperty("xmpp.socket.ssl.port", String.valueOf(port));
  330. // Stop the port listener for secured clients
  331. stopClientSSLListeners();
  332. if (isClientSSLListenerEnabled()) {
  333. // Start the port listener for secured clients
  334. startClientSSLListeners(localIPAddress);
  335. }
  336. }
  337. public int getClientSSLListenerPort() {
  338. return JiveGlobals.getIntProperty("xmpp.socket.ssl.port",
  339. SSLSocketAcceptThread.DEFAULT_PORT);
  340. }
  341. public void setComponentListenerPort(int port) {
  342. if (port == getComponentListenerPort()) {
  343. // Ignore new setting
  344. return;
  345. }
  346. JiveGlobals.setProperty("xmpp.component.socket.port", String.valueOf(port));
  347. // Stop the port listener for external components
  348. stopComponentListener();
  349. if (isComponentListenerEnabled()) {
  350. // Start the port listener for external components
  351. startComponentListener(localIPAddress);
  352. }
  353. }
  354. public int getComponentListenerPort() {
  355. return JiveGlobals.getIntProperty("xmpp.component.socket.port",
  356. SocketAcceptThread.DEFAULT_COMPONENT_PORT);
  357. }
  358. public void setServerListenerPort(int port) {
  359. if (port == getServerListenerPort()) {
  360. // Ignore new setting
  361. return;
  362. }
  363. JiveGlobals.setProperty("xmpp.server.socket.port", String.valueOf(port));
  364. // Stop the port listener for s2s communication
  365. stopServerListener();
  366. if (isServerListenerEnabled()) {
  367. // Start the port listener for s2s communication
  368. startServerListener(localIPAddress);
  369. }
  370. }
  371. public int getServerListenerPort() {
  372. return JiveGlobals.getIntProperty("xmpp.server.socket.port",
  373. SocketAcceptThread.DEFAULT_SERVER_PORT);
  374. }
  375. // #####################################################################
  376. // Module management
  377. // #####################################################################
  378. public void start() {
  379. super.start();
  380. isStarted = true;
  381. serverName = server.getServerInfo().getName();
  382. createSocket();
  383. SocketSendingTracker.getInstance().start();
  384. }
  385. public void stop() {
  386. super.stop();
  387. stopClientListeners();
  388. stopClientSSLListeners();
  389. stopComponentListener();
  390. stopServerListener();
  391. SocketSendingTracker.getInstance().shutdown();
  392. serverName = null;
  393. }
  394. }