1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl;
14
15 import java.util.concurrent.ExecutorService;
16 import java.util.concurrent.Executors;
17 import java.util.concurrent.Future;
18
19 import org.apache.log4j.Logger;
20
21 import com.eviware.soapui.SoapUI;
22 import com.eviware.soapui.impl.wsdl.submit.RequestTransport;
23 import com.eviware.soapui.impl.wsdl.submit.transports.http.WsdlResponse;
24 import com.eviware.soapui.model.iface.Response;
25 import com.eviware.soapui.model.iface.Submit;
26 import com.eviware.soapui.model.iface.SubmitContext;
27 import com.eviware.soapui.model.iface.SubmitListener;
28
29 /***
30 * Submit implementation for submitting a WsdlRequest
31 *
32 * @author Ole.Matzura
33 */
34
35 public final class WsdlSubmit implements Runnable, Submit
36 {
37 private final static Logger logger = Logger.getLogger(WsdlSubmit.class);
38 private WsdlRequest wsdlRequest;
39 private SubmitListener[] listeners;
40 private Status status;
41 private Exception error;
42 private WsdlResponse response;
43 private volatile Future future;
44 private SubmitContext submitContext;
45 private final static ExecutorService threadPool = Executors.newCachedThreadPool();
46 private RequestTransport transport;
47
48 public WsdlSubmit(WsdlRequest wsdlRequest, SubmitListener[] listeners, RequestTransport transport)
49 {
50 this.wsdlRequest = wsdlRequest;
51 this.transport = transport;
52
53 this.listeners = new SubmitListener[listeners.length];
54 for( int c = 0; c < listeners.length; c++ )
55 this.listeners[c] = listeners[c];
56
57 error = null;
58 status = Status.INITIALIZED;
59 future = null;
60 }
61
62 public void submitRequest(SubmitContext submitContext, boolean async )
63 {
64 this.submitContext = submitContext;
65
66 if( async && future != null )
67 throw new RuntimeException( "Submit already running" );
68
69 if( async )
70 future = threadPool.submit(this);
71 else
72 run();
73 }
74
75 public void cancel()
76 {
77 if (status == Status.CANCELED)
78 return;
79
80 logger.info("Canceling request..");
81 if (status == Status.RUNNING )
82 {
83 transport.abortRequest( submitContext );
84 }
85
86 status = Status.CANCELED;
87
88 for (int i = 0; i < listeners.length; i++)
89 {
90 listeners[i].afterSubmit(this, submitContext);
91 }
92 }
93
94 public void run()
95 {
96 try
97 {
98 submitContext.setProperty( RequestTransport.REQUEST_TRANSPORT, transport );
99 submitContext.setProperty( RequestTransport.WSDL_REQUEST, wsdlRequest );
100
101 for (int i = 0; i < listeners.length; i++)
102 {
103 if (!listeners[i].beforeSubmit(this, submitContext))
104 {
105 status = Status.CANCELED;
106 System.err.println("listener cancelled submit..");
107 return;
108 }
109 }
110
111 status = Status.RUNNING;
112 response = ( WsdlResponse ) transport.sendRequest(submitContext, wsdlRequest);
113
114 if (status != Status.CANCELED)
115 {
116 status = Status.FINISHED;
117 }
118
119 if( response.getTimeTaken() == 0 )
120 {
121 logger.warn( "Request took 0 in thread " + Thread.currentThread().getId() +
122 ", response length = " + response.getContentLength() );
123 }
124 }
125 catch (Exception e1)
126 {
127 error = e1;
128 status = Status.ERROR;
129 logger.error("Exception in request: " + e1);
130 SoapUI.logError( e1 );
131 }
132 finally
133 {
134 if (status != Status.CANCELED)
135 {
136 for (int i = 0; i < listeners.length; i++)
137 {
138 listeners[i].afterSubmit(this, submitContext);
139 }
140 }
141 }
142 }
143
144 public WsdlRequest getRequest()
145 {
146 return wsdlRequest;
147 }
148
149 public Status getStatus()
150 {
151 return status;
152 }
153
154 public Exception getError()
155 {
156 return error;
157 }
158
159 public synchronized Status waitUntilFinished()
160 {
161 if (future != null)
162 {
163 if (!future.isDone())
164 {
165 try
166 {
167 future.get();
168 }
169 catch (Exception e)
170 {
171 SoapUI.logError( e );
172 }
173 }
174 }
175 else
176 throw new RuntimeException("cannot wait on null future");
177
178 return getStatus();
179 }
180
181 public Response getResponse()
182 {
183 return response;
184 }
185 }