001 /** 002 * 003 * Copyright 2004 Protique Ltd 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.activemq.transport.tcp; 019 020 import org.activemq.io.WireFormat; 021 import org.activemq.transport.TransportServerChannel; 022 import org.activemq.transport.TransportServerChannelFactory; 023 024 import javax.jms.JMSException; 025 import javax.net.ServerSocketFactory; 026 import java.io.IOException; 027 import java.net.InetAddress; 028 import java.net.ServerSocket; 029 import java.net.URI; 030 031 /** 032 * An implementation of TransportServerChannelFactory which uses a ServerSocketFactory 033 * to create ServerSocket instances 034 * 035 * @version $Revision: 1.1.1.1 $ 036 */ 037 public class SfTransportServerChannelFactory implements TransportServerChannelFactory { 038 039 protected static final int BACKLOG = 500; 040 041 private ServerSocketFactory serverSocketFactory; 042 043 public SfTransportServerChannelFactory(ServerSocketFactory socketFactory) { 044 this.serverSocketFactory = socketFactory; 045 } 046 047 /** 048 * Bind a ServerChannel to an address 049 * 050 * @param wireFormat 051 * @param bindAddress 052 * @return the TransportChannel bound to the remote node 053 * @throws JMSException 054 */ 055 public TransportServerChannel create(WireFormat wireFormat, URI bindAddress) throws JMSException { 056 ServerSocket serverSocket = null; 057 try { 058 serverSocket = createServerSocket(bindAddress); 059 } 060 catch (IOException e) { 061 JMSException jmsEx = new JMSException("Creation of ServerSocket failed: " + e); 062 jmsEx.setLinkedException(e); 063 throw jmsEx; 064 } 065 return new TcpTransportServerChannel(wireFormat, serverSocket); 066 } 067 068 protected ServerSocket createServerSocket(URI bind) throws IOException { 069 String host = bind.getHost(); 070 host = (host == null || host.length() == 0) ? "localhost" : host; 071 072 InetAddress addr = InetAddress.getByName(host); 073 if (addr.equals(InetAddress.getLocalHost())) { 074 return serverSocketFactory.createServerSocket(bind.getPort(), BACKLOG); 075 } 076 else { 077 return serverSocketFactory.createServerSocket(bind.getPort(), BACKLOG, addr); 078 } 079 } 080 081 }