View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.impl.wsdl.monitor;
14  
15  import com.eviware.soapui.SoapUI;
16  import com.eviware.soapui.impl.wsdl.WsdlOperation;
17  import com.eviware.soapui.impl.wsdl.WsdlProject;
18  import com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments.MultipartMessageSupport;
19  import com.eviware.soapui.impl.wsdl.submit.transports.http.support.methods.ExtendedPostMethod;
20  import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils;
21  import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion;
22  import com.eviware.soapui.impl.wsdl.support.wss.IncomingWss;
23  import com.eviware.soapui.model.iface.Attachment;
24  import com.eviware.soapui.model.iface.Interface;
25  import com.eviware.soapui.model.iface.Operation;
26  import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext;
27  import com.eviware.soapui.settings.WsdlSettings;
28  import com.eviware.soapui.support.Tools;
29  import com.eviware.soapui.support.types.StringToStringMap;
30  import com.eviware.soapui.support.xml.XmlUtils;
31  
32  import org.apache.commons.httpclient.Header;
33  import org.apache.xmlbeans.XmlObject;
34  import org.w3c.dom.Document;
35  
36  import javax.servlet.http.HttpServletRequest;
37  import java.io.ByteArrayInputStream;
38  import java.io.IOException;
39  import java.io.StringWriter;
40  import java.net.MalformedURLException;
41  import java.net.URL;
42  import java.util.ArrayList;
43  import java.util.Enumeration;
44  import java.util.List;
45  import java.util.Vector;
46  
47  public class JProxyServletWsdlMonitorMessageExchange extends WsdlMonitorMessageExchange
48  {
49  
50  	private WsdlOperation operation;
51  	private WsdlProject project;
52  	private String requestContent;
53  	private StringToStringMap requestHeaders;
54  	private String responseContent;
55  	private StringToStringMap responseHeaders;
56  	private MultipartMessageSupport requestMmSupport;
57  	private boolean discarded;
58  	private long timestampStart;
59  	private byte[] request;
60  	private byte[] response;
61  	private String requestHost;
62  	private URL targetURL;
63  	private String requestContentType;
64  	private Vector<Object> requestWssResult;
65  	private SoapVersion soapVersion;
66  	private String responseContentType;
67  	private MultipartMessageSupport responseMmSupport;
68  	private Vector<Object> responseWssResult;
69  	private long timestampEnd;
70  	private boolean capture;
71  	private byte[] requestRaw = null;
72  	private byte[] responseRaw = null;
73  
74  	public JProxyServletWsdlMonitorMessageExchange(WsdlProject project)
75  	{
76  		super(null);
77  		responseHeaders = new StringToStringMap();
78  		requestHeaders = new StringToStringMap();
79  		timestampStart = System.currentTimeMillis();
80  		this.project = project;
81  		capture = true;
82  	}
83  
84  	@Override
85  	public void discard()
86  	{
87  		operation = null;
88  		project = null;
89  
90  		requestContent = null;
91  		requestHeaders = null;
92  
93  		responseContent = null;
94  		responseHeaders = null;
95  
96  		requestMmSupport = null;
97  
98  		response = null;
99  		request = null;
100 		capture = false;
101 
102 		discarded = true;
103 	}
104 
105 	@Override
106 	public long getRequestContentLength()
107 	{
108 		return request == null ? -1 : request.length;
109 	}
110 
111 	@Override
112 	public String getRequestHost()
113 	{
114 		return requestHost;
115 	}
116 
117 	@Override
118 	public long getResponseContentLength()
119 	{
120 		return response == null ? -1 : response.length;
121 	}
122 
123 	@Override
124 	public URL getTargetUrl()
125 	{
126 		return this.targetURL;
127 	}
128 
129 	@Override
130 	public void prepare(IncomingWss incomingRequestWss, IncomingWss incomingResponseWss)
131 	{
132 
133 		parseRequestData(incomingRequestWss);
134 		parseReponseData(incomingResponseWss);
135 
136 	}
137 
138 	private void parseReponseData(IncomingWss incomingResponseWss)
139 	{
140 
141 		ByteArrayInputStream in = new ByteArrayInputStream(response == null ? new byte[0] : response);
142 		try
143 		{
144 
145 			responseContentType = responseHeaders.get("Content-Type");
146 			if (responseContentType != null && responseContentType.toUpperCase().startsWith("MULTIPART"))
147 			{
148 				StringToStringMap values = StringToStringMap.fromHttpHeader(responseContentType);
149 				responseMmSupport = new MultipartMessageSupport(new MonitorMessageExchangeDataSource("monitor response",
150 						in, responseContentType), values.get("start"), null, true, SoapUI.getSettings().getBoolean(
151 						WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES));
152 				responseContentType = responseMmSupport.getRootPart().getContentType();
153 			}
154 			else
155 			{
156 				this.responseContent = XmlUtils.prettyPrintXml(Tools.readAll(in, 0).toString());
157 			}
158 
159 			processResponseWss(incomingResponseWss);
160 		}
161 		catch (Exception e)
162 		{
163 			try
164 			{
165 				in.close();
166 			}
167 			catch (IOException e1)
168 			{
169 				e1.printStackTrace();
170 			}
171 		}
172 
173 	}
174 
175 	private void processResponseWss(IncomingWss incomingResponseWss) throws IOException
176 	{
177 
178 		if (incomingResponseWss != null)
179 		{
180 			Document dom = XmlUtils.parseXml(responseContent);
181 			try
182 			{
183 				responseWssResult = incomingResponseWss.processIncoming(dom, new DefaultPropertyExpansionContext(project));
184 				if (responseWssResult != null && responseWssResult.size() > 0)
185 				{
186 					StringWriter writer = new StringWriter();
187 					XmlUtils.serialize(dom, writer);
188 					responseContent = writer.toString();
189 				}
190 			}
191 			catch (Exception e)
192 			{
193 				if (responseWssResult == null)
194 					responseWssResult = new Vector<Object>();
195 				responseWssResult.add(e);
196 			}
197 		}
198 
199 	}
200 
201 	private void parseRequestData(IncomingWss incomingRequestWss)
202 	{
203 
204 		ByteArrayInputStream in = request == null ? new ByteArrayInputStream(new byte[0]) : new ByteArrayInputStream(
205 				request);
206 		try
207 		{
208 
209 			requestContentType = requestHeaders.get("Content-Type");
210 			if (requestContentType != null && requestContentType.toUpperCase().startsWith("MULTIPART"))
211 			{
212 				StringToStringMap values = StringToStringMap.fromHttpHeader(requestContentType);
213 				requestMmSupport = new MultipartMessageSupport(new MonitorMessageExchangeDataSource("monitor request", in,
214 						requestContentType), values.get("start"), null, true, SoapUI.getSettings().getBoolean(
215 						WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES));
216 				requestContentType = requestMmSupport.getRootPart().getContentType();
217 			}
218 			else
219 			{
220 				this.requestContent = XmlUtils.prettyPrintXml(Tools.readAll(in, 0).toString());
221 			}
222 
223 			processRequestWss(incomingRequestWss);
224 
225 			operation = findOperation();
226 		}
227 		catch (Exception e)
228 		{
229 			try
230 			{
231 				in.close();
232 			}
233 			catch (IOException e1)
234 			{
235 				e1.printStackTrace();
236 			}
237 		}
238 
239 	}
240 
241 	private WsdlOperation findOperation() throws Exception
242 	{
243 		soapVersion = SoapUtils.deduceSoapVersion(requestContentType, XmlObject.Factory.parse(getRequestContent()));
244 		if (soapVersion == null)
245 			throw new Exception("Unrecognized SOAP Version");
246 
247 		String soapAction = SoapUtils.getSoapAction(soapVersion, requestHeaders);
248 
249 		List<WsdlOperation> operations = new ArrayList<WsdlOperation>();
250 		for (Interface iface : project.getInterfaceList())
251 		{
252 			for (Operation operation : iface.getOperationList())
253 				operations.add((WsdlOperation) operation);
254 		}
255 
256 		return SoapUtils.findOperationForRequest(soapVersion, soapAction, XmlObject.Factory.parse(getRequestContent()),
257 				operations, true, false);
258 	}
259 
260 	private void processRequestWss(IncomingWss incomingRequestWss) throws IOException
261 	{
262 
263 		if (incomingRequestWss != null)
264 		{
265 			Document dom = XmlUtils.parseXml(requestContent);
266 			try
267 			{
268 				requestWssResult = incomingRequestWss.processIncoming(dom, new DefaultPropertyExpansionContext(project));
269 				if (requestWssResult != null && requestWssResult.size() > 0)
270 				{
271 					StringWriter writer = new StringWriter();
272 					XmlUtils.serialize(dom, writer);
273 					requestContent = writer.toString();
274 				}
275 			}
276 			catch (Exception e)
277 			{
278 				if (requestWssResult == null)
279 					requestWssResult = new Vector<Object>();
280 				requestWssResult.add(e);
281 			}
282 		}
283 
284 	}
285 
286 	public WsdlOperation getOperation()
287 	{
288 		return operation;
289 	}
290 
291 	public Vector<?> getRequestWssResult()
292 	{
293 		return requestWssResult;
294 	}
295 
296 	public Vector<?> getResponseWssResult()
297 	{
298 		return responseWssResult;
299 	}
300 
301 	public Attachment[] getRequestAttachments()
302 	{
303 		return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments();
304 	}
305 
306 	public String getRequestContent()
307 	{
308 		return requestMmSupport == null ? requestContent : requestMmSupport.getContentAsString();
309 	}
310 
311 	public byte[] getRawRequestData()
312 	{
313 		if (requestRaw != null)
314 			return requestRaw;
315 		else
316 			return request;
317 	}
318 
319 	public void setRawRequestData(byte[] data)
320 	{
321 		requestRaw = data;
322 	}
323 
324 	public byte[] getRawResponseData()
325 	{
326 		if (responseRaw == null)
327 			return responseRaw;
328 		else
329 			return response;
330 	}
331 
332 	public void setRawResponseData(byte[] data)
333 	{
334 		responseRaw = data;
335 	}
336 
337 	public StringToStringMap getRequestHeaders()
338 	{
339 		return requestHeaders;
340 	}
341 
342 	public Attachment[] getResponseAttachments()
343 	{
344 		return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments();
345 	}
346 
347 	public String getResponseContent()
348 	{
349 		return responseContent;
350 	}
351 
352 	public StringToStringMap getResponseHeaders()
353 	{
354 		return responseHeaders;
355 	}
356 
357 	public long getTimeTaken()
358 	{
359 		return timestampEnd - timestampStart;
360 	}
361 
362 	public long getTimestamp()
363 	{
364 		return timestampStart;
365 	}
366 
367 	public boolean isDiscarded()
368 	{
369 		return discarded;
370 	}
371 
372 	public void stopCapture()
373 	{
374 
375 		timestampEnd = System.currentTimeMillis();
376 		capture = false;
377 
378 	}
379 
380 	public boolean isStopCapture()
381 	{
382 		return capture;
383 	}
384 
385 	public void setRequest(byte[] request)
386 	{
387 		this.request = request;
388 	}
389 
390 	public void setResponse(byte[] response)
391 	{
392 		if (this.response == null)
393 		{
394 			this.response = response;
395 		}
396 		else
397 		{
398 			byte[] newResponse = new byte[this.response.length + response.length];
399 			for (int i = 0; i < this.response.length; i++)
400 			{
401 				newResponse[i] = this.response[i];
402 			}
403 			for (int i = this.response.length; i < newResponse.length; i++)
404 			{
405 				newResponse[i] = response[i - this.response.length];
406 			}
407 			this.response = newResponse;
408 		}
409 	}
410 
411 	public void setResponseHeader(String name, String value)
412 	{
413 		responseHeaders.put(name, value);
414 	}
415 
416 	public void setRequestHost(String serverName)
417 	{
418 		requestHost = serverName;
419 	}
420 
421 	public void setTargetHost(String remoteHost)
422 	{
423 	}
424 
425 	@SuppressWarnings("unchecked")
426 	public void setRequestHeader(HttpServletRequest httpRequest)
427 	{
428 		Enumeration<String> headerNames = httpRequest.getHeaderNames();
429 		while (headerNames.hasMoreElements())
430 		{
431 			String name = headerNames.nextElement();
432 			Enumeration<String> header = httpRequest.getHeaders(name);
433 			while (header.hasMoreElements())
434 			{
435 				String value = header.nextElement();
436 				if (value != null)
437 				{
438 					requestHeaders.put(name, value);
439 				}
440 			}
441 		}
442 	}
443 
444 	public void setTargetURL(String url)
445 	{
446 		try
447 		{
448 			this.targetURL = new URL(url);
449 		}
450 		catch (MalformedURLException e)
451 		{
452 			e.printStackTrace();
453 		}
454 	}
455 
456 	public int getResponseStatusCode()
457 	{
458 		return 0;
459 	}
460 
461 	public String getResponseContentType()
462 	{
463 		return null;
464 	}
465 
466 	public void setResponseHeader(ExtendedPostMethod method)
467 	{
468 		Header[] headers = method.getResponseHeaders();
469 		for (Header header : headers)
470 		{
471 			String name = header.getName();
472 			String value = header.getValue();
473 			if (value != null)
474 			{
475 				responseHeaders.put(name, value);
476 			}
477 		}
478 	}
479 
480 }