1 package org.sapia.ubik.rmi.server.transport.socket; 2 3 import java.io.IOException ; 4 import java.rmi.RemoteException ; 5 import java.rmi.server.RMIClientSocketFactory ; 6 import java.util.Properties ; 7 8 import org.sapia.ubik.net.DefaultClientSocketFactory; 9 import org.sapia.ubik.net.ServerAddress; 10 import org.sapia.ubik.net.TCPAddress; 11 import org.sapia.ubik.net.UbikServerSocketFactory; 12 import org.sapia.ubik.rmi.Consts; 13 import org.sapia.ubik.rmi.server.Log; 14 import org.sapia.ubik.rmi.server.Server; 15 import org.sapia.ubik.rmi.server.transport.Connections; 16 import org.sapia.ubik.rmi.server.transport.TransportProvider; 17 18 19 32 public class SocketTransportProvider implements TransportProvider { 33 36 public static final String TRANSPORT_TYPE = TCPAddress.TRANSPORT_TYPE; 37 38 42 public static final String MAX_THREADS = "ubik.rmi.transport.socket.max-threads"; 43 44 48 public static final String CLIENT_FACTORY = "ubik.rmi.transport.socket.client-factory"; 49 50 56 public static final String SERVER_FACTORY = "ubik.rmi.transport.socket.server-factory"; 57 58 62 public static final String BIND_ADDRESS = "ubik.rmi.transport.socket.bind-address"; 63 64 68 public static final String PORT = "ubik.rmi.transport.socket.port"; 69 private RMIClientSocketFactory _factory; 70 71 74 public synchronized Connections getPoolFor(ServerAddress address) 75 throws RemoteException { 76 if (_factory == null) { 77 if (System.getProperty(CLIENT_FACTORY) != null) { 78 String name = System.getProperty(CLIENT_FACTORY); 79 80 try { 81 _factory = (RMIClientSocketFactory ) Class.forName(name).newInstance(); 82 } catch (InstantiationException e) { 83 throw new java.rmi.RemoteException ("problem instantiating client socket factory", 84 e); 85 } catch (IllegalAccessException e) { 86 throw new java.rmi.RemoteException ("could not find client socket factory; make sure factory class is public, and has a public, no-arg constructor", 87 e); 88 } catch (ClassNotFoundException e) { 89 throw new java.rmi.RemoteException ( 90 "could not find client socket factory implementation: " + name, e); 91 } 92 } else { 93 _factory = new DefaultClientSocketFactory(); 94 } 95 } 96 97 return SocketClientConnectionPool.getInstance(address, _factory); 98 } 99 100 103 public Server newServer(Properties props) throws RemoteException { 104 SocketRmiServer server; 105 int maxThreads = 0; 106 int port = 0; 107 108 if (props.getProperty(Consts.SERVER_MAX_THREADS) != null) { 109 try { 110 maxThreads = Integer.parseInt(props.getProperty( 111 Consts.SERVER_MAX_THREADS)); 112 } catch (NumberFormatException e) { 113 Log.error(getClass(), 114 "could not parse integer from property: " + 115 Consts.SERVER_MAX_THREADS); 116 } 117 } 118 119 if (props.getProperty(MAX_THREADS) != null) { 120 try { 121 maxThreads = Integer.parseInt(props.getProperty(MAX_THREADS)); 122 } catch (NumberFormatException e) { 123 Log.error(getClass(), 124 "could not parse integer from property: " + MAX_THREADS); 125 } 126 } 127 128 if (props.getProperty(PORT) != null) { 129 try { 130 port = Integer.parseInt(props.getProperty(PORT)); 131 } catch (NumberFormatException e) { 132 Log.error(getClass(), "could not parse integer from property: " + PORT); 133 } 134 } 135 136 if (props.getProperty(SERVER_FACTORY) != null) { 137 String name = props.getProperty(SERVER_FACTORY); 138 UbikServerSocketFactory fac; 139 140 try { 141 fac = (UbikServerSocketFactory) Class.forName(name).newInstance(); 142 } catch (InstantiationException e) { 143 throw new java.rmi.RemoteException ("problem instantiating server socket factory", 144 e); 145 } catch (IllegalAccessException e) { 146 throw new java.rmi.RemoteException ("could not find server socket factory; make sure factory class is public, and has a public, no-arg constructor", 147 e); 148 } catch (ClassNotFoundException e) { 149 throw new java.rmi.RemoteException ( 150 "could not find server socket factory implementation: " + name, e); 151 } 152 153 try { 154 if (props.getProperty(BIND_ADDRESS) != null) { 155 server = new SocketRmiServer(props.getProperty(BIND_ADDRESS), port, 156 maxThreads, fac); 157 } else { 158 server = new SocketRmiServer(port, maxThreads, fac); 159 } 160 } catch (IOException e) { 161 throw new RemoteException ("could not create server socket", e); 162 } 163 } else { 164 try { 165 if (props.getProperty(BIND_ADDRESS) != null) { 166 server = new SocketRmiServer(props.getProperty(BIND_ADDRESS), port, 167 maxThreads); 168 } else { 169 server = new SocketRmiServer(port, maxThreads); 170 } 171 } catch (IOException e) { 172 throw new RemoteException ("could not create server socket", e); 173 } 174 } 175 176 return server; 177 } 178 179 182 public Server newDefaultServer() throws RemoteException { 183 return newServer(0); 184 } 185 186 public Server newServer(int port) throws RemoteException { 187 SocketRmiServer server; 188 int maxThreads = 0; 189 190 if (System.getProperty(Consts.SERVER_MAX_THREADS) != null) { 191 try { 192 maxThreads = Integer.parseInt(System.getProperty( 193 Consts.SERVER_MAX_THREADS)); 194 } catch (NumberFormatException e) { 195 Log.error(getClass(), 196 "could not parse integer from property: " + 197 Consts.SERVER_MAX_THREADS); 198 } 199 } 200 201 try { 202 server = new SocketRmiServer(port, maxThreads); 203 } catch (java.io.IOException e) { 204 throw new java.rmi.RemoteException ("could not create singleton server", e); 205 } 206 207 return server; 208 } 209 210 213 public String getTransportType() { 214 return TRANSPORT_TYPE; 215 } 216 217 220 public void shutdown() { 221 SocketClientConnectionPool.shutdown(); 222 } 223 } 224 | Popular Tags |