View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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.support.editor.views.xml.raw;
14  
15  import java.beans.PropertyChangeEvent;
16  import java.util.Arrays;
17  
18  import com.eviware.soapui.SoapUI;
19  import com.eviware.soapui.impl.support.AbstractHttpRequest;
20  import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
21  import com.eviware.soapui.impl.wsdl.WsdlRequest;
22  import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
23  import com.eviware.soapui.impl.wsdl.panels.teststeps.amf.AMFRequest;
24  import com.eviware.soapui.impl.wsdl.support.MessageExchangeModelItem;
25  import com.eviware.soapui.impl.wsdl.teststeps.AMFRequestTestStep;
26  import com.eviware.soapui.model.ModelItem;
27  import com.eviware.soapui.model.iface.MessageExchange;
28  import com.eviware.soapui.settings.UISettings;
29  import com.eviware.soapui.support.editor.Editor;
30  import com.eviware.soapui.support.editor.EditorView;
31  import com.eviware.soapui.support.editor.registry.RequestEditorViewFactory;
32  import com.eviware.soapui.support.editor.registry.ResponseEditorViewFactory;
33  import com.eviware.soapui.support.editor.xml.XmlDocument;
34  import com.eviware.soapui.support.editor.xml.XmlEditor;
35  import com.eviware.soapui.support.types.StringToStringsMap;
36  
37  public class RawXmlEditorFactory implements ResponseEditorViewFactory, RequestEditorViewFactory
38  {
39  	public static final String VIEW_ID = "Raw";
40  
41  	public String getViewId()
42  	{
43  		return VIEW_ID;
44  	}
45  
46  	@SuppressWarnings( "unchecked" )
47  	public EditorView<?> createResponseEditorView( Editor<?> editor, ModelItem modelItem )
48  	{
49  
50  		if( modelItem instanceof MessageExchangeModelItem )
51  		{
52  			return new WsdlMessageExchangeResponseRawXmlEditor( ( MessageExchangeModelItem )modelItem, ( XmlEditor )editor );
53  		}
54  		else if( modelItem instanceof AbstractHttpRequestInterface<?> )
55  		{
56  			return new HttpResponseRawXmlEditor( ( AbstractHttpRequest<?> )modelItem, ( XmlEditor )editor );
57  		}
58  		else if( modelItem instanceof WsdlMockResponse )
59  		{
60  			return new WsdlMockResponseRawXmlEditor( ( WsdlMockResponse )modelItem, ( XmlEditor )editor );
61  		}
62  		else if( modelItem instanceof AMFRequestTestStep )
63  		{
64  			return new AmfResponseRawXmlEditor( ( AMFRequestTestStep )modelItem, ( XmlEditor )editor );
65  		}
66  
67  		return null;
68  	}
69  
70  	@SuppressWarnings( "unchecked" )
71  	public EditorView<XmlDocument> createRequestEditorView( Editor<?> editor, ModelItem modelItem )
72  	{
73  		if( modelItem instanceof MessageExchangeModelItem )
74  		{
75  			return new WsdlMessageExchangeRequestRawXmlEditor( ( MessageExchangeModelItem )modelItem, ( XmlEditor )editor );
76  		}
77  		else if( modelItem instanceof AbstractHttpRequestInterface<?> )
78  		{
79  			return new HttpRequestRawXmlEditor( ( AbstractHttpRequest<?> )modelItem, ( XmlEditor )editor );
80  		}
81  		else if( modelItem instanceof WsdlMockResponse )
82  		{
83  			return new WsdlMockRequestRawXmlEditor( ( WsdlMockResponse )modelItem, ( XmlEditor )editor );
84  		}
85  		else if( modelItem instanceof AMFRequestTestStep )
86  		{
87  			return new AmfRequestRawXmlEditor( ( AMFRequestTestStep )modelItem, ( XmlEditor )editor );
88  		}
89  
90  		return null;
91  	}
92  
93  	private static class HttpRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
94  	{
95  		private final AbstractHttpRequest<?> request;
96  
97  		public HttpRequestRawXmlEditor( AbstractHttpRequest<?> request, XmlEditor<XmlDocument> editor )
98  		{
99  			super( "Raw", editor, "The actual content of the last submitted request" );
100 			this.request = request;
101 
102 			request.addPropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
103 		}
104 
105 		@Override
106 		public void propertyChange( PropertyChangeEvent evt )
107 		{
108 			if( evt.getPropertyName().equals( WsdlRequest.RESPONSE_PROPERTY ) )
109 			{
110 				setXml( "" );
111 			}
112 		}
113 
114 		@Override
115 		public String getContent()
116 		{
117 			if( request.getResponse() == null || request.getResponse().getRawRequestData() == null
118 					|| request.getResponse().getRawRequestData().length == 0 )
119 				return "<missing raw request data>";
120 
121 			byte[] rawRequestData = request.getResponse().getRawRequestData();
122 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_REQUEST_MESSAGE_SIZE, 10000 );
123 
124 			if( maxSize < rawRequestData.length )
125 				return new String( Arrays.copyOf( rawRequestData, maxSize ) );
126 			else
127 				return new String( rawRequestData );
128 		}
129 
130 		@Override
131 		public void release()
132 		{
133 			request.removePropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
134 			super.release();
135 		}
136 	}
137 
138 	private static class HttpResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
139 	{
140 		private final AbstractHttpRequest<?> request;
141 
142 		public HttpResponseRawXmlEditor( AbstractHttpRequest<?> request, XmlEditor<XmlDocument> editor )
143 		{
144 			super( "Raw", editor, "The actual content of the last received response" );
145 			this.request = request;
146 
147 			request.addPropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
148 		}
149 
150 		@Override
151 		public void propertyChange( PropertyChangeEvent evt )
152 		{
153 			if( evt.getPropertyName().equals( WsdlRequest.RESPONSE_PROPERTY ) )
154 			{
155 				setXml( "" );
156 			}
157 		}
158 
159 		@Override
160 		public String getContent()
161 		{
162 			if( request.getResponse() == null || request.getResponse().getRawResponseData() == null
163 					|| request.getResponse().getRawResponseData().length == 0 )
164 				return "<missing raw response data>";
165 
166 			byte[] rawResponseData = request.getResponse().getRawResponseData();
167 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_RESPONSE_MESSAGE_SIZE, 10000 );
168 
169 			if( maxSize < rawResponseData.length )
170 				return new String( Arrays.copyOf( rawResponseData, maxSize ) );
171 			else
172 				return new String( rawResponseData );
173 		}
174 
175 		@Override
176 		public void release()
177 		{
178 			request.removePropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
179 			super.release();
180 		}
181 	}
182 
183 	private static class WsdlMockRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
184 	{
185 		private final WsdlMockResponse request;
186 
187 		public WsdlMockRequestRawXmlEditor( WsdlMockResponse response, XmlEditor<XmlDocument> editor )
188 		{
189 			super( "Raw", editor, "The actual content of the last received mock request" );
190 			this.request = response;
191 
192 			response.addPropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
193 		}
194 
195 		@Override
196 		public void propertyChange( PropertyChangeEvent evt )
197 		{
198 			if( evt.getPropertyName().equals( WsdlMockResponse.MOCKRESULT_PROPERTY ) )
199 			{
200 				setXml( "" );
201 			}
202 		}
203 
204 		@Override
205 		public String getContent()
206 		{
207 			if( request.getMockResult() == null )
208 				return "<missing request>";
209 
210 			return buildRawContent( request.getMockResult().getMockRequest().getRequestHeaders(), request.getMockResult()
211 					.getMockRequest().getRawRequestData() );
212 		}
213 
214 		@Override
215 		public void release()
216 		{
217 			request.removePropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
218 			super.release();
219 		}
220 	}
221 
222 	private static class WsdlMockResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
223 	{
224 		private final WsdlMockResponse request;
225 
226 		public WsdlMockResponseRawXmlEditor( WsdlMockResponse response, XmlEditor<XmlDocument> editor )
227 		{
228 			super( "Raw", editor, "The actual content of the last returned Mock Response" );
229 			this.request = response;
230 
231 			response.addPropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
232 		}
233 
234 		@Override
235 		public void propertyChange( PropertyChangeEvent evt )
236 		{
237 			if( evt.getPropertyName().equals( WsdlMockResponse.MOCKRESULT_PROPERTY ) )
238 			{
239 				setXml( "" );
240 			}
241 		}
242 
243 		@Override
244 		public String getContent()
245 		{
246 			if( request.getMockResult() == null )
247 				return "<missing response>";
248 
249 			StringToStringsMap headers = request.getMockResult().getResponseHeaders();
250 			byte[] data = request.getMockResult().getRawResponseData();
251 
252 			return buildRawContent( headers, data );
253 		}
254 
255 		@Override
256 		public void release()
257 		{
258 			request.removePropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
259 			super.release();
260 		}
261 	}
262 
263 	private static String buildRawContent( StringToStringsMap headers, byte[] data )
264 	{
265 		StringBuffer result = new StringBuffer();
266 		String status = headers.get( "#status#", "" );
267 		if( status != null )
268 			result.append( status ).append( '\n' );
269 
270 		for( String header : headers.keySet() )
271 		{
272 			if( header.equals( "#status#" ) )
273 				continue;
274 
275 			for( String value : headers.get( header ) )
276 				result.append( header ).append( ": " ).append( value ).append( '\n' );
277 		}
278 		result.append( '\n' );
279 
280 		if( data != null )
281 			result.append( new String( data ).trim() );
282 
283 		return result.toString().trim();
284 	}
285 
286 	private static class WsdlMessageExchangeResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
287 	{
288 		private final MessageExchangeModelItem response;
289 
290 		public WsdlMessageExchangeResponseRawXmlEditor( MessageExchangeModelItem response, XmlEditor<XmlDocument> editor )
291 		{
292 			super( "Raw", editor, "The raw response data" );
293 			this.response = response;
294 		}
295 
296 		@Override
297 		public String getContent()
298 		{
299 			MessageExchange me = response.getMessageExchange();
300 			return me == null || me.getRawResponseData() == null ? "<missing raw response data>" : new String( me
301 					.getRawResponseData() );
302 		}
303 	}
304 
305 	private static class WsdlMessageExchangeRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
306 	{
307 		private final MessageExchangeModelItem request;
308 
309 		public WsdlMessageExchangeRequestRawXmlEditor( MessageExchangeModelItem request, XmlEditor<XmlDocument> editor )
310 		{
311 			super( "Raw", editor, "The raw request data" );
312 			this.request = request;
313 		}
314 
315 		@Override
316 		public String getContent()
317 		{
318 			MessageExchange me = request.getMessageExchange();
319 			return me == null || me.getRawRequestData() == null ? "<missing raw request data>" : new String( me
320 					.getRawRequestData() );
321 		}
322 	}
323 
324 	private static class AmfResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
325 	{
326 		private final AMFRequest request;
327 
328 		public AmfResponseRawXmlEditor( AMFRequestTestStep requestTestStep, XmlEditor<XmlDocument> editor )
329 		{
330 			super( "Raw", editor, "The actual content of the last received response" );
331 			this.request = requestTestStep.getAMFRequest();
332 
333 			request.addPropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
334 		}
335 
336 		@Override
337 		public void propertyChange( PropertyChangeEvent evt )
338 		{
339 			setXml( "" );
340 		}
341 
342 		@Override
343 		public String getContent()
344 		{
345 			if( request.getResponse() == null )
346 				return "<missing response>";
347 
348 			byte[] rawResponseData = request.getResponse().getRawResponseData();
349 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_RESPONSE_MESSAGE_SIZE, 10000 );
350 
351 			if( maxSize < rawResponseData.length )
352 				return new String( Arrays.copyOf( rawResponseData, maxSize ) );
353 			else
354 				return new String( rawResponseData );
355 		}
356 
357 		@Override
358 		public void release()
359 		{
360 			request.removePropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
361 			super.release();
362 		}
363 	}
364 
365 	private static class AmfRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
366 	{
367 		private final AMFRequest request;
368 
369 		public AmfRequestRawXmlEditor( AMFRequestTestStep requestTestStep, XmlEditor<XmlDocument> editor )
370 		{
371 			super( "Raw", editor, "The actual content of the last request" );
372 			this.request = requestTestStep.getAMFRequest();
373 
374 			request.addPropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
375 		}
376 
377 		@Override
378 		public void propertyChange( PropertyChangeEvent evt )
379 		{
380 			setXml( "" );
381 		}
382 
383 		@Override
384 		public String getContent()
385 		{
386 			if( request.getResponse() == null )
387 				return "";
388 
389 			byte[] rawRequestData = request.getResponse().getRawRequestData();
390 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_RESPONSE_MESSAGE_SIZE, 10000 );
391 
392 			if( maxSize < rawRequestData.length )
393 				return new String( Arrays.copyOf( rawRequestData, maxSize ) );
394 			else
395 				return new String( rawRequestData );
396 		}
397 
398 		@Override
399 		public void release()
400 		{
401 			request.removePropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
402 			super.release();
403 		}
404 	}
405 }