1 8 package org.codehaus.spice.netserve.connection.impl; 9 10 import java.net.ServerSocket ; 11 import java.util.Hashtable ; 12 import java.util.Map ; 13 import org.codehaus.spice.netserve.connection.RequestHandler; 14 import org.codehaus.spice.netserve.connection.SocketAcceptorManager; 15 import org.codehaus.spice.netserve.connection.impl.AcceptorConfig; 16 import org.codehaus.spice.netserve.connection.impl.AcceptorMonitor; 17 import org.codehaus.spice.netserve.connection.impl.ConnectionAcceptor; 18 19 33 public class DefaultAcceptorManager 34 implements SocketAcceptorManager 35 { 36 39 private final Map m_acceptors = new Hashtable (); 40 41 44 private AcceptorMonitor m_monitor = NullAcceptorMonitor.MONITOR; 45 46 50 private int m_soTimeout = 1000; 51 52 57 private int m_shutdownTimeout; 58 59 65 public void setMonitor( final AcceptorMonitor monitor ) 66 { 67 m_monitor = monitor; 68 } 69 70 76 public void setSoTimeout( final int soTimeout ) 77 { 78 m_soTimeout = soTimeout; 79 } 80 81 87 public void setShutdownTimeout( final int shutdownTimeout ) 88 { 89 m_shutdownTimeout = shutdownTimeout; 90 } 91 92 97 protected int getShutdownTimeout() 98 { 99 return m_shutdownTimeout; 100 } 101 102 106 public void shutdownAcceptors() 107 { 108 final String [] names; 109 synchronized( m_acceptors ) 110 { 111 names = (String [])m_acceptors.keySet().toArray( new String [ 0 ] ); 112 } 113 for( int i = 0; i < names.length; i++ ) 114 { 115 disconnect( names[ i ] ); 116 } 117 } 118 119 130 public void connect( final String name, 131 final ServerSocket socket, 132 final RequestHandler handler ) 133 throws Exception 134 { 135 if( null == name ) 136 { 137 throw new NullPointerException ( "name" ); 138 } 139 if( null == socket ) 140 { 141 throw new NullPointerException ( "socket" ); 142 } 143 if( null == handler ) 144 { 145 throw new NullPointerException ( "handler" ); 146 } 147 148 if( 0 == socket.getSoTimeout() ) 149 { 150 socket.setSoTimeout( m_soTimeout ); 151 } 152 153 final ConnectionAcceptor acceptor; 154 synchronized( m_acceptors ) 155 { 156 if( isConnected( name ) ) 157 { 158 final String message = 159 "Connection already exists with name " + name; 160 throw new IllegalArgumentException ( message ); 161 } 162 163 final AcceptorConfig config = new AcceptorConfig( name, socket, handler ); 164 acceptor = new ConnectionAcceptor( config, getMonitor() ); 165 m_acceptors.put( name, acceptor ); 166 } 167 168 final Thread thread = 169 new Thread ( acceptor, "Acceptor[" + name + "]" ); 170 thread.start(); 171 while( !acceptor.hasStarted() ) 172 { 173 Thread.sleep( 5 ); 174 } 175 } 176 177 183 public boolean isConnected( final String name ) 184 { 185 return m_acceptors.containsKey( name ); 186 } 187 188 194 public void disconnect( final String name ) 195 { 196 final ConnectionAcceptor acceptor = 197 (ConnectionAcceptor)m_acceptors.remove( name ); 198 if( null == acceptor ) 199 { 200 final String message = "No connection with name " + name; 201 throw new IllegalArgumentException ( message ); 202 } 203 204 acceptor.close( getShutdownTimeout() ); 205 } 206 207 212 protected AcceptorMonitor getMonitor() 213 { 214 return m_monitor; 215 } 216 } 217 | Popular Tags |