View Javadoc

1   /*** 
2    * 
3    * Copyright 2004 Protique Ltd
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); 
6    * you may not use this file except in compliance with the License. 
7    * You may obtain a copy of the License at 
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, 
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
14   * See the License for the specific language governing permissions and 
15   * limitations under the License. 
16   * 
17   **/
18  package org.codehaus.activemq.transport.tcp;
19  
20  import org.codehaus.activemq.message.WireFormat;
21  import org.codehaus.activemq.transport.TransportServerChannel;
22  import org.codehaus.activemq.transport.TransportServerChannelFactory;
23  
24  import javax.jms.JMSException;
25  import javax.net.ServerSocketFactory;
26  import java.io.IOException;
27  import java.net.InetAddress;
28  import java.net.ServerSocket;
29  import java.net.URI;
30  
31  /***
32   * An implementation of TransportServerChannelFactory which uses a ServerSocketFactory
33   * to create ServerSocket instances
34   *
35   * @version $Revision: 1.4 $
36   */
37  public class SfTransportServerChannelFactory implements TransportServerChannelFactory {
38  
39      protected static final int BACKLOG = 500;
40  
41      private ServerSocketFactory serverSocketFactory;
42  
43      public SfTransportServerChannelFactory(ServerSocketFactory socketFactory) {
44          this.serverSocketFactory = socketFactory;
45      }
46  
47      /***
48       * Bind a ServerChannel to an address
49       *
50       * @param wireFormat
51       * @param bindAddress
52       * @return the TransportChannel bound to the remote node
53       * @throws JMSException
54       */
55      public TransportServerChannel create(WireFormat wireFormat, URI bindAddress) throws JMSException {
56          ServerSocket serverSocket = null;
57          try {
58              serverSocket = createServerSocket(bindAddress);
59          }
60          catch (IOException e) {
61              JMSException jmsEx = new JMSException("Creation of ServerSocket failed: " + e);
62              jmsEx.setLinkedException(e);
63              throw jmsEx;
64          }
65          return new TcpTransportServerChannel(wireFormat, serverSocket);
66      }
67  
68      protected ServerSocket createServerSocket(URI bind) throws IOException {
69          String host = bind.getHost();
70          host = (host == null || host.length() == 0) ? "localhost" : host;
71  
72          InetAddress addr = InetAddress.getByName(host);
73          if (addr.equals(InetAddress.getLocalHost())) {
74              return serverSocketFactory.createServerSocket(bind.getPort(), BACKLOG);
75          }
76          else {
77              return serverSocketFactory.createServerSocket(bind.getPort(), BACKLOG, addr);
78          }
79      }
80  
81  }