/network/src/main/java/org/jboss/as/network/SocketBindingManagerImpl.java

https://github.com/samuelo/jboss-as · Java · 558 lines · 429 code · 69 blank · 60 comment · 12 complexity · 8034919301a0d56f573ce2ddbcc18344 MD5 · raw file

  1. /*
  2. * JBoss, Home of Professional Open Source.
  3. * Copyright 2011, Red Hat, Inc., and individual contributors
  4. * as indicated by the @author tags. See the copyright.txt file in the
  5. * distribution for a full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package org.jboss.as.network;
  23. import java.io.Closeable;
  24. import java.io.IOException;
  25. import java.net.DatagramSocket;
  26. import java.net.InetAddress;
  27. import java.net.InetSocketAddress;
  28. import java.net.MulticastSocket;
  29. import java.net.ServerSocket;
  30. import java.net.Socket;
  31. import java.net.SocketAddress;
  32. import java.net.SocketException;
  33. import java.nio.channels.DatagramChannel;
  34. import java.nio.channels.ServerSocketChannel;
  35. import java.nio.channels.SocketChannel;
  36. import java.util.Collection;
  37. import java.util.HashSet;
  38. import java.util.Map;
  39. import java.util.concurrent.ConcurrentHashMap;
  40. /**
  41. * @author Emanuel Muckenhuber
  42. */
  43. public abstract class SocketBindingManagerImpl implements SocketBindingManager {
  44. private final ManagedSocketFactory socketFactory = new ManagedSocketFactoryImpl();
  45. private final ManagedServerSocketFactory serverSocketFactory = new ManagedServerSocketFactoryImpl();
  46. private final NamedManagedBindingRegistry namedRegistry = new NamedRegistryImpl();
  47. private final UnnamedBindingRegistry unnamedRegistry = new UnnamedRegistryImpl();
  48. /** {@inheritDoc} */
  49. @Override
  50. public ManagedServerSocketFactory getServerSocketFactory() {
  51. return serverSocketFactory;
  52. }
  53. /** {@inheritDoc} */
  54. @Override
  55. public ManagedSocketFactory getSocketFactory() {
  56. return socketFactory;
  57. }
  58. /** {@inheritDoc} */
  59. @Override
  60. public DatagramSocket createDatagramSocket(String name, SocketAddress address) throws SocketException {
  61. return new ManagedDatagramSocketBinding(null, this.namedRegistry, address);
  62. }
  63. /** {@inheritDoc} */
  64. @Override
  65. public DatagramSocket createDatagramSocket(SocketAddress address) throws SocketException {
  66. return new ManagedDatagramSocketBinding(null, this.unnamedRegistry, address);
  67. }
  68. /** {@inheritDoc} */
  69. @Override
  70. public MulticastSocket createMulticastSocket(String name, SocketAddress address) throws IOException {
  71. return new ManagedMulticastSocketBinding(null, this.unnamedRegistry, address);
  72. }
  73. /** {@inheritDoc} */
  74. @Override
  75. public MulticastSocket createMulticastSocket(SocketAddress address) throws IOException {
  76. return new ManagedMulticastSocketBinding(null, this.unnamedRegistry, address);
  77. }
  78. /** {@inheritDoc} */
  79. @Override
  80. public NamedManagedBindingRegistry getNamedRegistry() {
  81. return namedRegistry;
  82. }
  83. /** {@inheritDoc} */
  84. @Override
  85. public UnnamedBindingRegistry getUnnamedRegistry() {
  86. return unnamedRegistry;
  87. }
  88. class ManagedSocketFactoryImpl extends ManagedSocketFactory {
  89. @Override
  90. public Socket createSocket() {
  91. return new ManagedSocketBinding(SocketBindingManagerImpl.this.unnamedRegistry);
  92. }
  93. @Override
  94. public Socket createSocket(final String host, final int port) throws IOException {
  95. return createSocket(InetAddress.getByName(host), port);
  96. }
  97. @Override
  98. public Socket createSocket(final InetAddress host, final int port) throws IOException {
  99. final Socket socket = createSocket();
  100. socket.connect(new InetSocketAddress(host, port));
  101. return socket;
  102. }
  103. @Override
  104. public Socket createSocket(final String host, final int port, final InetAddress localHost, final int localPort) throws IOException {
  105. return createSocket(InetAddress.getByName(host), port, localHost, localPort);
  106. }
  107. @Override
  108. public Socket createSocket(final InetAddress address, final int port, final InetAddress localAddress, final int localPort) throws IOException {
  109. final Socket socket = createSocket();
  110. socket.bind(new InetSocketAddress(localAddress, localPort));
  111. socket.connect(new InetSocketAddress(address, port));
  112. return socket;
  113. }
  114. @Override
  115. public Socket createSocket(final String name) {
  116. return new ManagedSocketBinding(name, SocketBindingManagerImpl.this.namedRegistry);
  117. }
  118. @Override
  119. public Socket createSocket(final String name, final String host, final int port) throws IOException {
  120. return createSocket(name, InetAddress.getByName(host), port);
  121. }
  122. @Override
  123. public Socket createSocket(final String name, final InetAddress host, final int port) throws IOException {
  124. final Socket socket = createSocket(name);
  125. socket.connect(new InetSocketAddress(host, port));
  126. return socket;
  127. }
  128. @Override
  129. public Socket createSocket(final String name, final String host, final int port, final InetAddress localHost, final int localPort) throws IOException {
  130. return createSocket(name, InetAddress.getByName(host), port, localHost, localPort);
  131. }
  132. @Override
  133. public Socket createSocket(final String name, final InetAddress address, final int port, final InetAddress localAddress, final int localPort) throws IOException {
  134. final Socket socket = createSocket(name);
  135. socket.bind(new InetSocketAddress(localAddress, localPort));
  136. socket.connect(new InetSocketAddress(address, port));
  137. return socket;
  138. }
  139. }
  140. class ManagedServerSocketFactoryImpl extends ManagedServerSocketFactory {
  141. @Override
  142. public ServerSocket createServerSocket(String name) throws IOException {
  143. return new ManagedServerSocketBinding(name, SocketBindingManagerImpl.this);
  144. }
  145. @Override
  146. public ServerSocket createServerSocket() throws IOException {
  147. return createServerSocket(null);
  148. }
  149. @Override
  150. public ServerSocket createServerSocket(int port) throws IOException {
  151. return createServerSocket(null, port);
  152. }
  153. @Override
  154. public ServerSocket createServerSocket(String name, final int port) throws IOException {
  155. final ServerSocket serverSocket = createServerSocket(name);
  156. serverSocket.bind(new InetSocketAddress(port));
  157. return serverSocket;
  158. }
  159. @Override
  160. public ServerSocket createServerSocket(final int port, final int backlog) throws IOException {
  161. return createServerSocket(null, port, backlog);
  162. }
  163. @Override
  164. public ServerSocket createServerSocket(String name, int port, int backlog) throws IOException {
  165. final ServerSocket serverSocket = createServerSocket(name);
  166. serverSocket.bind(new InetSocketAddress(port), backlog);
  167. return serverSocket;
  168. }
  169. @Override
  170. public ServerSocket createServerSocket(int port, int backlog, InetAddress ifAddress) throws IOException {
  171. return createServerSocket(null, port, backlog, ifAddress);
  172. }
  173. @Override
  174. public ServerSocket createServerSocket(final String name, final int port, final int backlog, final InetAddress ifAddress) throws IOException {
  175. final ServerSocket serverSocket = createServerSocket(name);
  176. serverSocket.bind(new InetSocketAddress(ifAddress, port), backlog);
  177. return serverSocket;
  178. }
  179. }
  180. static class CloseableManagedBinding implements ManagedBinding {
  181. private final String name;
  182. private final InetSocketAddress address;
  183. private final Closeable closeable;
  184. private final ManagedBindingRegistry registry;
  185. CloseableManagedBinding(final InetSocketAddress address, final Closeable closeable, final ManagedBindingRegistry registry) {
  186. this(null, address, closeable, registry);
  187. }
  188. CloseableManagedBinding(final String name, final InetSocketAddress address,
  189. final Closeable closeable, final ManagedBindingRegistry registry) {
  190. this.name = name;
  191. this.address = address;
  192. this.closeable = closeable;
  193. this.registry = registry;
  194. }
  195. @Override
  196. public String getSocketBindingName() {
  197. return name;
  198. }
  199. @Override
  200. public InetSocketAddress getBindAddress() {
  201. return address;
  202. }
  203. @Override
  204. public void close() throws IOException {
  205. try {
  206. closeable.close();
  207. } finally {
  208. registry.unregisterBinding(this);
  209. }
  210. }
  211. }
  212. static class WrappedManagedDatagramSocket implements ManagedBinding {
  213. private final String name;
  214. private final DatagramSocket socket;
  215. private final ManagedBindingRegistry registry;
  216. public WrappedManagedDatagramSocket(final DatagramSocket socket, final ManagedBindingRegistry registry) {
  217. this(null, socket, registry);
  218. }
  219. public WrappedManagedDatagramSocket(final String name, final DatagramSocket socket, final ManagedBindingRegistry registry) {
  220. this.name = name;
  221. this.socket = socket;
  222. this.registry = registry;
  223. }
  224. /** {@inheritDoc} */
  225. @Override
  226. public String getSocketBindingName() {
  227. return name;
  228. }
  229. @Override
  230. public InetSocketAddress getBindAddress() {
  231. return (InetSocketAddress) socket.getLocalSocketAddress();
  232. }
  233. @Override
  234. public void close() throws IOException {
  235. try {
  236. socket.close();
  237. } finally {
  238. registry.unregisterBinding(this);
  239. }
  240. }
  241. }
  242. static class WrappedManagedSocket implements ManagedBinding {
  243. private final String name;
  244. private final Socket socket;
  245. private final ManagedBindingRegistry registry;
  246. public WrappedManagedSocket(final Socket socket, final ManagedBindingRegistry registry) {
  247. this(null, socket, registry);
  248. }
  249. public WrappedManagedSocket(final String name, final Socket socket, final ManagedBindingRegistry registry) {
  250. this.name = name;
  251. this.socket = socket;
  252. this.registry = registry;
  253. }
  254. @Override
  255. public String getSocketBindingName() {
  256. return name;
  257. }
  258. @Override
  259. public InetSocketAddress getBindAddress() {
  260. return (InetSocketAddress) socket.getLocalSocketAddress();
  261. }
  262. @Override
  263. public void close() throws IOException {
  264. try {
  265. socket.close();
  266. } finally {
  267. registry.unregisterBinding(this);
  268. }
  269. }
  270. }
  271. static class WrappedManagedServerSocket implements ManagedBinding {
  272. private final String name;
  273. private final ServerSocket socket;
  274. private final ManagedBindingRegistry registry;
  275. public WrappedManagedServerSocket(final ServerSocket socket, final ManagedBindingRegistry registry) {
  276. this(null, socket, registry);
  277. }
  278. public WrappedManagedServerSocket(final String name, final ServerSocket socket, final ManagedBindingRegistry registry) {
  279. this.name = name;
  280. this.socket = socket;
  281. this.registry = registry;
  282. }
  283. @Override
  284. public String getSocketBindingName() {
  285. return name;
  286. }
  287. @Override
  288. public InetSocketAddress getBindAddress() {
  289. return (InetSocketAddress) socket.getLocalSocketAddress();
  290. }
  291. @Override
  292. public void close() throws IOException {
  293. try {
  294. socket.close();
  295. } finally {
  296. registry.unregisterBinding(this);
  297. }
  298. }
  299. }
  300. static final class NamedRegistryImpl implements NamedManagedBindingRegistry {
  301. private final Map<String, ManagedBinding> bindings = new ConcurrentHashMap<String, ManagedBinding>();
  302. /** {@inheritDoc} */
  303. @Override
  304. public ManagedBinding getManagedBinding(String name) {
  305. return bindings.get(name);
  306. }
  307. /** {@inheritDoc} */
  308. @Override
  309. public boolean isRegistered(String name) {
  310. return bindings.containsKey(name);
  311. }
  312. /** {@inheritDoc} */
  313. @Override
  314. public void registerBinding(ManagedBinding binding) {
  315. final String name = binding.getSocketBindingName();
  316. if(name == null) {
  317. throw new IllegalStateException();
  318. }
  319. bindings.put(name, binding);
  320. }
  321. /** {@inheritDoc} */
  322. @Override
  323. public void unregisterBinding(ManagedBinding binding) {
  324. final String name = binding.getSocketBindingName();
  325. if(name == null) {
  326. throw new IllegalStateException();
  327. }
  328. unregisterBinding(name);
  329. }
  330. /** {@inheritDoc} */
  331. @Override
  332. public Collection<ManagedBinding> listActiveBindings() {
  333. return new HashSet<ManagedBinding>(bindings.values());
  334. }
  335. /** {@inheritDoc} */
  336. @Override
  337. public Closeable registerSocket(String name, Socket socket) {
  338. final ManagedBinding binding = new WrappedManagedSocket(name, socket, this);
  339. registerBinding(binding);
  340. return binding;
  341. }
  342. /** {@inheritDoc} */
  343. @Override
  344. public Closeable registerSocket(String name, ServerSocket socket) {
  345. final ManagedBinding binding = new WrappedManagedServerSocket(name, socket, this);
  346. registerBinding(binding);
  347. return binding;
  348. }
  349. /** {@inheritDoc} */
  350. @Override
  351. public Closeable registerSocket(String name, DatagramSocket socket) {
  352. final ManagedBinding binding = new WrappedManagedDatagramSocket(name, socket, this);
  353. registerBinding(binding);
  354. return binding;
  355. }
  356. /** {@inheritDoc} */
  357. @Override
  358. public Closeable registerChannel(String name, SocketChannel channel) {
  359. final ManagedBinding binding = new CloseableManagedBinding(name, (InetSocketAddress) channel.socket().getLocalSocketAddress(), channel, this);
  360. registerBinding(binding);
  361. return binding;
  362. }
  363. /** {@inheritDoc} */
  364. @Override
  365. public Closeable registerChannel(String name, ServerSocketChannel channel) {
  366. final ManagedBinding binding = new CloseableManagedBinding(name, (InetSocketAddress) channel.socket().getLocalSocketAddress(), channel, this);
  367. registerBinding(binding);
  368. return binding;
  369. }
  370. /** {@inheritDoc} */
  371. @Override
  372. public Closeable registerChannel(String name, DatagramChannel channel) {
  373. final ManagedBinding binding = new CloseableManagedBinding(name, (InetSocketAddress) channel.socket().getLocalSocketAddress(), channel, this);
  374. registerBinding(binding);
  375. return binding;
  376. }
  377. /** {@inheritDoc} */
  378. @Override
  379. public void unregisterBinding(String name) {
  380. if(name == null) {
  381. return;
  382. }
  383. bindings.remove(name);
  384. }
  385. }
  386. static final class UnnamedRegistryImpl implements UnnamedBindingRegistry {
  387. private final Map<InetSocketAddress, ManagedBinding> bindings = new ConcurrentHashMap<InetSocketAddress, ManagedBinding>();
  388. /** {@inheritDoc} */
  389. @Override
  390. public void registerBinding(ManagedBinding binding) {
  391. final InetSocketAddress address = binding.getBindAddress();
  392. if(address == null) {
  393. throw new IllegalStateException();
  394. }
  395. bindings.put(address, binding);
  396. }
  397. /** {@inheritDoc} */
  398. @Override
  399. public void unregisterBinding(ManagedBinding binding) {
  400. final InetSocketAddress address = binding.getBindAddress();
  401. if(address == null) {
  402. throw new IllegalStateException();
  403. }
  404. unregisterBinding(address);
  405. }
  406. /** {@inheritDoc} */
  407. @Override
  408. public Collection<ManagedBinding> listActiveBindings() {
  409. return new HashSet<ManagedBinding>(bindings.values());
  410. }
  411. /** {@inheritDoc} */
  412. @Override
  413. public Closeable registerSocket(Socket socket) {
  414. final ManagedBinding binding = new WrappedManagedSocket(socket, this);
  415. registerBinding(binding);
  416. return binding;
  417. }
  418. /** {@inheritDoc} */
  419. @Override
  420. public Closeable registerSocket(ServerSocket socket) {
  421. final ManagedBinding binding = new WrappedManagedServerSocket(socket, this);
  422. registerBinding(binding);
  423. return binding;
  424. }
  425. /** {@inheritDoc} */
  426. @Override
  427. public Closeable registerSocket(DatagramSocket socket) {
  428. final ManagedBinding binding = new WrappedManagedDatagramSocket(socket, this);
  429. registerBinding(binding);
  430. return binding;
  431. }
  432. /** {@inheritDoc} */
  433. @Override
  434. public Closeable registerChannel(SocketChannel channel) {
  435. final ManagedBinding binding = new CloseableManagedBinding((InetSocketAddress) channel.socket().getLocalSocketAddress(), channel, this);
  436. registerBinding(binding);
  437. return binding;
  438. }
  439. /** {@inheritDoc} */
  440. @Override
  441. public Closeable registerChannel(ServerSocketChannel channel) {
  442. final ManagedBinding binding = new CloseableManagedBinding((InetSocketAddress) channel.socket().getLocalSocketAddress(), channel, this);
  443. registerBinding(binding);
  444. return binding;
  445. }
  446. /** {@inheritDoc} */
  447. @Override
  448. public Closeable registerChannel(DatagramChannel channel) {
  449. final ManagedBinding binding = new CloseableManagedBinding((InetSocketAddress) channel.socket().getLocalSocketAddress(), channel, this);
  450. registerBinding(binding);
  451. return binding;
  452. }
  453. /** {@inheritDoc} */
  454. @Override
  455. public void unregisterSocket(Socket socket) {
  456. unregisterBinding((InetSocketAddress) socket.getLocalSocketAddress());
  457. }
  458. /** {@inheritDoc} */
  459. @Override
  460. public void unregisterSocket(ServerSocket socket) {
  461. unregisterBinding((InetSocketAddress) socket.getLocalSocketAddress());
  462. }
  463. /** {@inheritDoc} */
  464. @Override
  465. public void unregisterSocket(DatagramSocket socket) {
  466. unregisterBinding((InetSocketAddress) socket.getLocalSocketAddress());
  467. }
  468. /** {@inheritDoc} */
  469. @Override
  470. public void unregisterChannel(SocketChannel channel) {
  471. unregisterBinding((InetSocketAddress) channel.socket().getLocalSocketAddress());
  472. }
  473. /** {@inheritDoc} */
  474. @Override
  475. public void unregisterChannel(ServerSocketChannel channel) {
  476. unregisterBinding((InetSocketAddress) channel.socket().getLocalSocketAddress());
  477. }
  478. /** {@inheritDoc} */
  479. @Override
  480. public void unregisterChannel(DatagramChannel channel) {
  481. unregisterBinding((InetSocketAddress) channel.socket().getLocalSocketAddress());
  482. }
  483. public void unregisterBinding(final InetSocketAddress address) {
  484. if(address != null) {
  485. bindings.remove(address);
  486. }
  487. }
  488. }
  489. }