KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > bindings > AbstractClientBinding


1 package org.objectweb.celtix.bindings;
2
3 import java.io.IOException JavaDoc;
4 import java.io.InputStream JavaDoc;
5 import java.lang.ref.WeakReference JavaDoc;
6 import java.util.List JavaDoc;
7 import java.util.concurrent.Executor JavaDoc;
8 import java.util.concurrent.Future JavaDoc;
9 import java.util.logging.Level JavaDoc;
10 import java.util.logging.Logger JavaDoc;
11
12 import javax.wsdl.Port;
13 import javax.wsdl.WSDLException;
14 import javax.wsdl.extensions.ExtensibilityElement;
15 import javax.xml.ws.handler.MessageContext;
16
17 import org.objectweb.celtix.Bus;
18 import org.objectweb.celtix.BusException;
19 import org.objectweb.celtix.buslifecycle.BusLifeCycleListener;
20 import org.objectweb.celtix.common.i18n.Message;
21 import org.objectweb.celtix.common.injection.ResourceInjector;
22 import org.objectweb.celtix.common.logging.LogUtils;
23 import org.objectweb.celtix.configuration.Configuration;
24 import org.objectweb.celtix.context.InputStreamMessageContext;
25 import org.objectweb.celtix.context.ObjectMessageContext;
26 import org.objectweb.celtix.context.OutputStreamMessageContext;
27 import org.objectweb.celtix.handlers.HandlerInvoker;
28 import org.objectweb.celtix.resource.DefaultResourceManager;
29 import org.objectweb.celtix.resource.ResourceManager;
30 import org.objectweb.celtix.resource.ResourceResolver;
31 import org.objectweb.celtix.transports.ClientTransport;
32 import org.objectweb.celtix.transports.TransportFactory;
33 import org.objectweb.celtix.ws.addressing.EndpointReferenceType;
34 import org.objectweb.celtix.wsdl.EndpointReferenceUtils;
35
36 import static org.objectweb.celtix.bindings.JAXWSConstants.BUS_PROPERTY;
37 import static org.objectweb.celtix.bindings.JAXWSConstants.CLIENT_BINDING_PROPERTY;
38 import static org.objectweb.celtix.bindings.JAXWSConstants.CLIENT_TRANSPORT_PROPERTY;
39
40 public abstract class AbstractClientBinding extends AbstractBindingBase implements ClientBinding {
41     private static final Logger JavaDoc LOG = LogUtils.getL7dLogger(AbstractClientBinding.class);
42
43     protected Port port;
44     private ResponseCorrelator responseCorrelator;
45     
46     public AbstractClientBinding(Bus b, EndpointReferenceType ref) throws WSDLException, IOException JavaDoc {
47         super(b, ref);
48         bus.getLifeCycleManager().registerLifeCycleListener(new ShutdownListener(this));
49         transport = null;
50     }
51
52     private class ShutdownListener extends WeakReference JavaDoc<AbstractClientBinding> implements
53         BusLifeCycleListener {
54
55         ShutdownListener(AbstractClientBinding c) {
56             super(c);
57         }
58
59         public void initComplete() {
60             // nothing
61
}
62
63         public void preShutdown() {
64             if (get() != null) {
65                 get().shutdown();
66                 clear();
67             }
68         }
69
70         public void postShutdown() {
71             clearResponseCorrelator();
72         }
73     }
74
75     public void clearResponseCorrelator() {
76         responseCorrelator = null;
77     }
78
79     // --- Methods to be implemented by concrete client bindings ---
80

81     public abstract AbstractBindingImpl getBindingImpl();
82
83     // --- Methods to be implemented by concrete client bindings ---
84

85     // --- BindingBase interface ---
86

87     public void configureSystemHandlers(Configuration endpointConfiguration) {
88         super.configureSystemHandlers(endpointConfiguration);
89      
90         ResourceManager rm = new DefaultResourceManager();
91         rm.addResourceResolver(new ResourceResolver() {
92             @SuppressWarnings JavaDoc("unchecked")
93             public <T> T resolve(String JavaDoc resourceName, Class JavaDoc<T> resourceType) {
94                 if (BUS_PROPERTY.equals(resourceName)) {
95                     return (T)AbstractClientBinding.this.getBus();
96                 } else if (CLIENT_BINDING_PROPERTY.equals(resourceName)) {
97                     return (T)AbstractClientBinding.this;
98                 } else if (CLIENT_TRANSPORT_PROPERTY.equals(resourceName)) {
99                     try {
100                         return (T)AbstractClientBinding.this.getTransport();
101                     } catch (IOException JavaDoc ex) {
102                         Message msg = new Message("SYSTEM_HANDLER_RESOURCE_INJECTION_FAILURE_MSG",
103                                                   LOG, resourceName);
104                         LOG.log(Level.WARNING, msg.toString(), ex);
105                     }
106                 }
107                 return null;
108             }
109             
110             public InputStream JavaDoc getAsStream(String JavaDoc name) {
111                 return null;
112             }
113         });
114         ResourceInjector injector = new ResourceInjector(rm);
115         getBindingImpl().injectSystemHandlers(injector);
116        
117     }
118     
119     // --- BindingBase interface ---
120

121     // --- ClientBinding interface ---
122

123     public ObjectMessageContext invoke(ObjectMessageContext objectCtx, DataBindingCallback callback)
124         throws IOException JavaDoc {
125
126         // storeSource(objectCtx);
127
BindingContextUtils.storeDataBindingCallback(objectCtx, callback);
128
129         Request request = new Request(this, getTransport(), objectCtx);
130
131         try {
132             OutputStreamMessageContext ostreamCtx = request.process(null);
133
134             if (null != ostreamCtx) {
135
136                 InputStreamMessageContext responseContext = clientTransport().invoke(ostreamCtx);
137                 Response fullResponse = null;
138                 if (BindingContextUtils.retrieveDecoupledResponse(responseContext)) {
139                     // partial response traverses complete handler chain first
140
Response partialResponse = new Response(request);
141                     partialResponse.processProtocol(responseContext);
142                     partialResponse.processLogical(callback);
143                     
144                     if (BindingContextUtils.isOnewayMethod(objectCtx)) {
145                         // no full response
146
objectCtx = partialResponse.getObjectMessageContext();
147                     } else {
148                         // wait for decoupled full response and tarverse logical chain
149
// (protocol chain already traversed by ResponseCorrelator)
150
fullResponse = getResponseCorrelator().getResponse(request);
151                         fullResponse.setObjectMessageContext(objectCtx);
152                         fullResponse.setHandlerInvoker(request.getHandlerInvoker());
153                         fullResponse.processLogical(callback);
154                         objectCtx = fullResponse.getObjectMessageContext();
155                     }
156                 } else {
157                     // synchronous full response
158
fullResponse = new Response(request);
159                     fullResponse.processProtocol(responseContext);
160                     fullResponse.processLogical(callback);
161                     objectCtx = fullResponse.getObjectMessageContext();
162                 }
163                 
164             }
165
166         } finally {
167             request.complete();
168         }
169
170         return objectCtx;
171     }
172
173     public void invokeOneWay(ObjectMessageContext objectCtx, DataBindingCallback callback)
174         throws IOException JavaDoc {
175         // storeSource(objectCtx);
176
BindingContextUtils.storeDataBindingCallback(objectCtx, callback);
177
178         Request request = new Request(this, getTransport(), objectCtx);
179         request.setOneway(true);
180
181         try {
182             OutputStreamMessageContext ostreamCtx = request.process(null);
183
184             if (null != ostreamCtx) {
185                 // one of the (system handlers) may have indicated that it expects
186
// headers to be piggybacked in the response
187
// if this is the case, use the transports invoke rather than invokeOneway
188
// to give the handlers a chance to process these headers
189

190                 if (BindingContextUtils.isOnewayTransport(ostreamCtx)) {
191                     clientTransport().invokeOneway(ostreamCtx);
192                 } else {
193                     LOG.fine("Sending message as a twoway request as required by system handlers.");
194                     InputStreamMessageContext istreamCtx = clientTransport().invoke(ostreamCtx);
195                     Response response = new Response(request);
196                     response.processProtocol(istreamCtx);
197                     response.processLogical(null);
198                 }
199             }
200
201         } finally {
202             request.complete();
203         }
204     }
205
206     public Future JavaDoc<ObjectMessageContext> invokeAsync(ObjectMessageContext objectCtx,
207                                                     DataBindingCallback callback, Executor JavaDoc executor)
208         throws IOException JavaDoc {
209
210         // storeSource(objectCtx);
211
BindingContextUtils.storeDataBindingCallback(objectCtx, callback);
212
213         Request request = new Request(this, getTransport(), objectCtx);
214         AsyncFuture asyncFuture = null;
215
216         try {
217             OutputStreamMessageContext ostreamCtx = request.process(null);
218
219             if (null != ostreamCtx) {
220
221                 Future JavaDoc<InputStreamMessageContext> ins = clientTransport().invokeAsync(ostreamCtx, executor);
222                 asyncFuture = new AsyncFuture(ins, this, callback, request.getHandlerInvoker(), objectCtx);
223             }
224
225         } finally {
226             request.complete();
227         }
228
229         return asyncFuture;
230     }
231
232     public synchronized ResponseCallback createResponseCallback() {
233         responseCorrelator = new ResponseCorrelator(this);
234         return responseCorrelator;
235     }
236         
237     // --- ClientBinding interface ---
238

239     // --- helpers ---
240

241     protected synchronized void shutdown() {
242         if (transport != null) {
243             transport.shutdown();
244             transport = null;
245         }
246     }
247
248     public synchronized ClientTransport getTransport() throws IOException JavaDoc {
249         if (transport == null) {
250             try {
251                 transport = createTransport(reference);
252             } catch (WSDLException e) {
253                 throw (IOException JavaDoc)(new IOException JavaDoc(e.getMessage()).initCause(e));
254             }
255         }
256         assert transport != null : "transport is null";
257         return clientTransport();
258     }
259
260     protected ClientTransport createTransport(EndpointReferenceType ref) throws WSDLException, IOException JavaDoc {
261         ClientTransport ret = null;
262         try {
263             LOG.info("creating client transport for " + ref);
264
265             port = EndpointReferenceUtils.getPort(bus.getWSDLManager(), ref);
266             List JavaDoc<?> exts = port.getExtensibilityElements();
267             if (exts.size() > 0) {
268                 ExtensibilityElement el = (ExtensibilityElement)exts.get(0);
269
270                 TransportFactory factory = bus.getTransportFactoryManager()
271                     .getTransportFactory(el.getElementType().getNamespaceURI());
272                 ret = factory.createClientTransport(ref, this);
273             }
274         } catch (BusException ex) {
275             LOG.severe("TRANSPORT_FACTORY_RETREIVAL_FAILURE_MSG");
276         }
277         assert ret != null;
278         return ret;
279     }
280     
281     protected ClientTransport clientTransport() {
282         return (ClientTransport)transport;
283     }
284
285     public synchronized ResponseCorrelator getResponseCorrelator() {
286         if (responseCorrelator == null) {
287             responseCorrelator =
288                 (ResponseCorrelator)clientTransport().getResponseCallback();
289         }
290         return responseCorrelator;
291     }
292     
293     protected void finalPrepareOutputStreamContext(MessageContext bindingContext,
294                                                    OutputStreamMessageContext ostreamContext)
295         throws IOException JavaDoc {
296         transport.finalPrepareOutputStreamContext(ostreamContext);
297     }
298
299     public ObjectMessageContext getObjectMessageContextAsync(InputStreamMessageContext ins,
300                                                              HandlerInvoker handlerInvoker,
301                                                              DataBindingCallback callback,
302                                                              ObjectMessageContext objectCtx) {
303         Response response = new Response(this, handlerInvoker);
304         try {
305             response.setObjectMessageContext(objectCtx);
306             response.processProtocol(ins);
307             response.processLogical(callback);
308         } finally {
309             handlerInvoker.mepComplete(objectCtx);
310         }
311
312         return response.getObjectMessageContext();
313     }
314 }
315
Popular Tags