KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > rmi > server > transport > socket > SocketTransportProvider


1 package org.sapia.ubik.rmi.server.transport.socket;
2
3 import java.io.IOException JavaDoc;
4 import java.rmi.RemoteException JavaDoc;
5 import java.rmi.server.RMIClientSocketFactory JavaDoc;
6 import java.util.Properties JavaDoc;
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 /**
20  * Implements the <code>TransportProvider</code> interface over standard
21  * java socket.
22  *
23  * @see java.net.Socket
24  *
25  * @author Yanick Duchesne
26  * <dl>
27  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
28  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
29  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
30  * </dl>
31  */

32 public class SocketTransportProvider implements TransportProvider {
33   /**
34    * Constant corresponding to this provider class' transport type.
35    */

36   public static final String JavaDoc TRANSPORT_TYPE = TCPAddress.TRANSPORT_TYPE;
37
38   /**
39    * This constant corresponds to the <code>ubik.rmi.transport.socket.max-threads</code>
40    * system property.
41    */

42   public static final String JavaDoc MAX_THREADS = "ubik.rmi.transport.socket.max-threads";
43
44   /**
45    * This constant corresponds to the <code>ubik.rmi.transport.socket.client-factory</code>
46    * system property.
47    */

48   public static final String JavaDoc CLIENT_FACTORY = "ubik.rmi.transport.socket.client-factory";
49
50   /**
51    * This constant corresponds to the <code>ubik.rmi.transport.socket.server-factory</code>
52    * system property. It identifies the <code>UbikServerSocketFactory</code> implementation to use.
53    *
54    * @see UbikServerSocketFactory
55    */

56   public static final String JavaDoc SERVER_FACTORY = "ubik.rmi.transport.socket.server-factory";
57
58   /**
59    * This constant corresponds to the <code>ubik.rmi.transport.socket.bind-address</code>
60    * system property.
61    */

62   public static final String JavaDoc BIND_ADDRESS = "ubik.rmi.transport.socket.bind-address";
63
64   /**
65    * This constant corresponds to the <code>ubik.rmi.transport.socket.port</code>
66    * system property.
67    */

68   public static final String JavaDoc PORT = "ubik.rmi.transport.socket.port";
69   private RMIClientSocketFactory JavaDoc _factory;
70
71   /**
72    * @see org.sapia.ubik.rmi.server.transport.TransportProvider#getPoolFor(ServerAddress)
73    */

74   public synchronized Connections getPoolFor(ServerAddress address)
75     throws RemoteException JavaDoc {
76     if (_factory == null) {
77       if (System.getProperty(CLIENT_FACTORY) != null) {
78         String JavaDoc name = System.getProperty(CLIENT_FACTORY);
79
80         try {
81           _factory = (RMIClientSocketFactory JavaDoc) Class.forName(name).newInstance();
82         } catch (InstantiationException JavaDoc e) {
83           throw new java.rmi.RemoteException JavaDoc("problem instantiating client socket factory",
84             e);
85         } catch (IllegalAccessException JavaDoc e) {
86           throw new java.rmi.RemoteException JavaDoc("could not find client socket factory; make sure factory class is public, and has a public, no-arg constructor",
87             e);
88         } catch (ClassNotFoundException JavaDoc e) {
89           throw new java.rmi.RemoteException JavaDoc(
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   /**
101    * @see org.sapia.ubik.rmi.server.transport.TransportProvider#newServer(Properties)
102    */

103   public Server newServer(Properties JavaDoc props) throws RemoteException JavaDoc {
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 JavaDoc 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 JavaDoc 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 JavaDoc e) {
132         Log.error(getClass(), "could not parse integer from property: " + PORT);
133       }
134     }
135
136     if (props.getProperty(SERVER_FACTORY) != null) {
137       String JavaDoc name = props.getProperty(SERVER_FACTORY);
138       UbikServerSocketFactory fac;
139
140       try {
141         fac = (UbikServerSocketFactory) Class.forName(name).newInstance();
142       } catch (InstantiationException JavaDoc e) {
143         throw new java.rmi.RemoteException JavaDoc("problem instantiating server socket factory",
144           e);
145       } catch (IllegalAccessException JavaDoc e) {
146         throw new java.rmi.RemoteException JavaDoc("could not find server socket factory; make sure factory class is public, and has a public, no-arg constructor",
147           e);
148       } catch (ClassNotFoundException JavaDoc e) {
149         throw new java.rmi.RemoteException JavaDoc(
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 JavaDoc e) {
161         throw new RemoteException JavaDoc("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 JavaDoc e) {
172         throw new RemoteException JavaDoc("could not create server socket", e);
173       }
174     }
175
176     return server;
177   }
178
179   /**
180    * @see org.sapia.ubik.rmi.server.transport.TransportProvider#newDefaultServer()
181    */

182   public Server newDefaultServer() throws RemoteException JavaDoc {
183     return newServer(0);
184   }
185
186   public Server newServer(int port) throws RemoteException JavaDoc {
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 JavaDoc 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 JavaDoc e) {
204       throw new java.rmi.RemoteException JavaDoc("could not create singleton server", e);
205     }
206
207     return server;
208   }
209
210   /**
211    * @see org.sapia.ubik.rmi.server.transport.TransportProvider#getTransportType()
212    */

213   public String JavaDoc getTransportType() {
214     return TRANSPORT_TYPE;
215   }
216
217   /**
218    * @see org.sapia.ubik.rmi.server.transport.TransportProvider#shutdown()
219    */

220   public void shutdown() {
221     SocketClientConnectionPool.shutdown();
222   }
223 }
224
Popular Tags