KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > rmi > server > transport > TransportManager


1 package org.sapia.ubik.rmi.server.transport;
2
3 import java.rmi.RemoteException JavaDoc;
4 import java.util.Collections JavaDoc;
5 import java.util.HashMap JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.Map JavaDoc;
8
9 import org.sapia.ubik.net.ServerAddress;
10 import org.sapia.ubik.rmi.Consts;
11 import org.sapia.ubik.rmi.server.transport.nio.tcp.NioTcpTransportProvider;
12 import org.sapia.ubik.rmi.server.transport.socket.MultiplexSocketTransportProvider;
13 import org.sapia.ubik.rmi.server.transport.socket.SocketTransportProvider;
14
15
16 /**
17  * The transport manager is the single-entry point into Ubik RMI's transport
18  * layer. It allows to register <code>TransportProvider</code> instances,
19  * which provide transport implementations on top of different network
20  * protocols.
21  *
22  * @author Yanick Duchesne
23  * <dl>
24  * <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>
25  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
26  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
27  * </dl>
28  */

29 public class TransportManager {
30   private static Map JavaDoc _providers = Collections.synchronizedMap(new HashMap JavaDoc());
31
32   static {
33     TransportProvider provider = new MultiplexSocketTransportProvider();
34     registerProvider(provider);
35     provider = new NioTcpTransportProvider();
36     registerProvider(provider);
37     
38
39     String JavaDoc[] propNames = (String JavaDoc[]) System.getProperties().keySet().toArray(new String JavaDoc[System.getProperties()
40                                                                                              .size()]);
41     String JavaDoc propName;
42     String JavaDoc className;
43
44     for (int i = 0; i < propNames.length; i++) {
45       propName = (String JavaDoc) propNames[i];
46
47       if (propName.startsWith(Consts.TRANSPORT_PROVIDER)) {
48         className = System.getProperty(propName);
49
50         if (className == null) {
51           throw new IllegalStateException JavaDoc(
52             "No class name defined for transport provider: " + propName);
53         }
54
55         try {
56           provider = (TransportProvider) Class.forName(className).newInstance();
57           registerProvider(provider);
58         } catch (Throwable JavaDoc e) {
59           e.printStackTrace();
60           throw new IllegalStateException JavaDoc(
61             "Could not instantiate transport provider: " + className);
62         }
63       }
64     }
65   }
66
67   /**
68    * Registers the transport provider of the given type with the transport manager. The
69    * provider is internally mapped to its "transport type".
70    *
71    * @see TransportProvider#getTransportType()
72    * @param provider a <code>TransportProvider</code> instance.
73    * @throws IllegalArgumentException if a provider is already registered for the
74    * given type.
75    */

76   public static void registerProvider(TransportProvider provider) {
77     if (_providers.containsKey(provider.getTransportType())) {
78       throw new IllegalArgumentException JavaDoc(
79         "Transport provider already registered for: " +
80         provider.getTransportType());
81     }
82
83     _providers.put(provider.getTransportType(), provider);
84   }
85
86   /**
87    * Returns the transport provider corresponding to the given type.
88    *
89    * @param type the logical type of the desired transport provider.
90    * @return a <code>TransportProvider</code>.
91    * @throws IllegalArgumentException if no provider is registered for
92    * the passed in type.
93    */

94   public static TransportProvider getProviderFor(String JavaDoc type) {
95     TransportProvider provider = (TransportProvider) _providers.get(type);
96
97     if (provider == null) {
98       throw new IllegalArgumentException JavaDoc("No transport provider for: " + type);
99     }
100
101     return provider;
102   }
103
104   /***
105    * Gets a connection pool that holds connections to a server,
106    * given the server's address.
107    *
108    * @return a <code>ConnectionPool</code>.
109    * @param address a <code>ServerAddress</code>.
110    * @throws RemoteException if an problem occurs acquiring the connection.
111    */

112   public static Connections getConnectionsFor(ServerAddress address)
113     throws RemoteException JavaDoc {
114     return getProviderFor(address.getTransportType()).getPoolFor(address);
115   }
116
117   /**
118    * Returns the default transport provider.
119    *
120    * @return the <code>SocketTransportProvider</code>.
121    */

122   public static SocketTransportProvider getDefaultProvider() {
123     return (SocketTransportProvider) _providers.get(SocketTransportProvider.TRANSPORT_TYPE);
124   }
125
126   public static void shutdown() {
127     TransportProvider provider;
128     Iterator JavaDoc providers;
129
130     synchronized (_providers) {
131       providers = _providers.values().iterator();
132
133       while (providers.hasNext()) {
134         provider = (TransportProvider) providers.next();
135         provider.shutdown();
136       }
137     }
138   }
139 }
140
Popular Tags