1 package org.codehaus.xfire.transport;
2
3 import java.util.Collection;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.Map;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10 import org.codehaus.xfire.service.Service;
11 import org.codehaus.xfire.service.ServiceRegistry;
12 import org.codehaus.xfire.service.event.RegistrationEvent;
13 import org.codehaus.xfire.service.event.RegistrationEventListener;
14 import org.codehaus.xfire.soap.SoapTransport;
15 import org.codehaus.xfire.transport.dead.DeadLetterTransport;
16 import org.codehaus.xfire.transport.local.LocalTransport;
17
18 /***
19 * The default <code>TransportManager</code> implementation.
20 *
21 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
22 */
23 public class DefaultTransportManager
24 implements TransportManager, RegistrationEventListener
25 {
26 private static final Log log = LogFactory.getLog(DefaultTransportManager.class);
27
28 private Map services = new HashMap();
29 private Map transports = new HashMap();
30 private Map transportUris = new HashMap();
31
32 private ServiceRegistry serviceRegistry;
33
34 public DefaultTransportManager()
35 {
36 }
37
38 /***
39 * Creates a DefaultTransportManager. A LocalTransport and DeadLetterTransport
40 * are registered automatically.
41 * @param xfire
42 */
43 public DefaultTransportManager(ServiceRegistry registry)
44 {
45 this.serviceRegistry = registry;
46
47 initialize();
48 }
49
50 public ServiceRegistry getServiceRegistry()
51 {
52 return serviceRegistry;
53 }
54
55 public void setServiceRegistry(ServiceRegistry serviceRegistry)
56 {
57 this.serviceRegistry = serviceRegistry;
58 }
59
60 /***
61 * Initializes transports for each service. This also registers a LocalTransport and
62 * DeadLetterTransport.
63 */
64 public void initialize()
65 {
66 initializeTransports();
67
68 register(SoapTransport.createSoapTransport(new LocalTransport()));
69 register(SoapTransport.createSoapTransport(new DeadLetterTransport()));
70 }
71
72 /***
73 * @param registry
74 */
75 protected void initializeTransports()
76 {
77 for (Iterator itr = serviceRegistry.getServices().iterator(); itr.hasNext();)
78 {
79 Service endpoint = (Service) itr.next();
80 enableAll(endpoint.getName());
81 }
82 serviceRegistry.addRegistrationEventListener(this);
83 }
84
85 public void register(Transport transport)
86 {
87 transports.put(transport.getName(), transport);
88
89 String[] schemes = transport.getKnownUriSchemes();
90 for (int i = 0; i < schemes.length; i++)
91 {
92 transportUris.put(schemes[i], transport);
93 }
94
95 for (Iterator itr = services.values().iterator(); itr.hasNext();)
96 {
97 Map serviceTransports = (Map) itr.next();
98 serviceTransports.put(transport.getName(), transport);
99 }
100
101 log.debug("Registered transport " + transport.getName());
102 }
103
104 public void unregister(Transport transport)
105 {
106 transports.remove(transport);
107
108 for (Iterator itr = services.values().iterator(); itr.hasNext();)
109 {
110 Map serviceTransports = (Map) itr.next();
111 if (serviceTransports != null)
112 {
113 serviceTransports.remove(transport);
114 }
115 }
116 }
117
118 /***
119 * @see org.codehaus.xfire.transport.TransportManager#getTransports(java.lang.String)
120 */
121 public Transport getTransport(String name)
122 {
123 return (Transport) transports.get(name);
124 }
125
126 public void enable(String transport, String serviceName)
127 {
128 Map serviceTransports = (Map) services.get(serviceName);
129 if (serviceTransports == null)
130 {
131 serviceTransports = new HashMap();
132 services.put(serviceName, serviceTransports);
133 }
134
135 serviceTransports.put(transport, getTransport(transport));
136 }
137
138 public void disable(String transport, String serviceName)
139 {
140 Map serviceTransports = (Map) services.get(serviceName);
141 if (serviceTransports == null)
142 {
143 return;
144 }
145
146 serviceTransports.remove(transport);
147 }
148
149 /***
150 * @param service
151 * @return
152 * @see org.codehaus.xfire.transport.TransportManager#getTransports(java.lang.String)
153 */
154 public Collection getTransports(String service)
155 {
156 Map transports = ((Map) services.get(service));
157
158 if (transports != null)
159 return transports.values();
160 else
161 return null;
162 }
163
164 public Collection getTransports()
165 {
166 return transports.values();
167 }
168
169 /***
170 * @param serviceName
171 */
172 public void enableAll(String serviceName)
173 {
174 Map serviceTransports = (Map) services.get(serviceName);
175 if (serviceTransports == null)
176 {
177 serviceTransports = new HashMap();
178 services.put(serviceName, serviceTransports);
179 }
180
181 for (Iterator itr = transports.values().iterator(); itr.hasNext();)
182 {
183 Transport t = (Transport) itr.next();
184
185 serviceTransports.put(t.getName(), t);
186 }
187 }
188
189 /***
190 * @param serviceName
191 */
192 public void disableAll(String serviceName)
193 {
194 Map serviceTransports = (Map) services.get(serviceName);
195 if (serviceTransports == null)
196 {
197 return;
198 }
199
200 for (Iterator itr = transports.keySet().iterator(); itr.hasNext();)
201 {
202 String name = (String) itr.next();
203
204 serviceTransports.remove(name);
205 }
206 }
207
208 /***
209 * @param service
210 * @param transportName
211 * @return
212 */
213 public boolean isEnabled(String service, String transportName)
214 {
215 Map serviceTransports = (Map) services.get(service);
216 if (serviceTransports == null)
217 {
218 return false;
219 }
220
221 if (serviceTransports.containsKey(transportName))
222 {
223 return true;
224 }
225
226 return false;
227 }
228
229 /***
230 * Notifies this <code>RegistrationEventListener</code> that the <code>ServiceEndpointRegistry</code> has registered
231 * an endpoint.
232 *
233 * @param event an event object describing the source of the event
234 */
235 public void endpointRegistered(RegistrationEvent event)
236 {
237 enableAll(event.getEndpoint().getName());
238 }
239
240 /***
241 * Notifies this <code>RegistrationEventListener</code> that the <code>ServiceEndpointRegistry</code> has
242 * deregistered an endpoint.
243 *
244 * @param event an event object describing the source of the event
245 */
246 public void endpointUnregistered(RegistrationEvent event)
247 {
248 disableAll(event.getEndpoint().getName());
249 }
250
251 public Transport getTransportForUri(String uri)
252 {
253 for (Iterator itr = transportUris.entrySet().iterator(); itr.hasNext();)
254 {
255 Map.Entry entry = (Map.Entry) itr.next();
256
257 if (uri.startsWith((String) entry.getKey()))
258 {
259 return (Transport) entry.getValue();
260 }
261 }
262
263 return null;
264 }
265 }