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.StringToStringMap;
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 				return "";
119 
120 			byte[] rawRequestData = request.getResponse().getRawRequestData();
121 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_REQUEST_MESSAGE_SIZE, 10000 );
122 
123 			if( maxSize < rawRequestData.length )
124 				return new String( Arrays.copyOf( rawRequestData, maxSize ) );
125 			else
126 				return new String( rawRequestData );
127 		}
128 
129 		@Override
130 		public void release()
131 		{
132 			request.removePropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
133 			super.release();
134 		}
135 	}
136 
137 	private static class HttpResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
138 	{
139 		private final AbstractHttpRequest<?> request;
140 
141 		public HttpResponseRawXmlEditor( AbstractHttpRequest<?> request, XmlEditor<XmlDocument> editor )
142 		{
143 			super( "Raw", editor, "The actual content of the last received response" );
144 			this.request = request;
145 
146 			request.addPropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
147 		}
148 
149 		@Override
150 		public void propertyChange( PropertyChangeEvent evt )
151 		{
152 			if( evt.getPropertyName().equals( WsdlRequest.RESPONSE_PROPERTY ) )
153 			{
154 				setXml( "" );
155 			}
156 		}
157 
158 		@Override
159 		public String getContent()
160 		{
161 			if( request.getResponse() == null )
162 				return "<missing response>";
163 
164 			byte[] rawResponseData = request.getResponse().getRawResponseData();
165 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_RESPONSE_MESSAGE_SIZE, 10000 );
166 
167 			if( maxSize < rawResponseData.length )
168 				return new String( Arrays.copyOf( rawResponseData, maxSize ) );
169 			else
170 				return new String( rawResponseData );
171 		}
172 
173 		@Override
174 		public void release()
175 		{
176 			request.removePropertyChangeListener( WsdlRequest.RESPONSE_PROPERTY, this );
177 			super.release();
178 		}
179 	}
180 
181 	private static class WsdlMockRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
182 	{
183 		private final WsdlMockResponse request;
184 
185 		public WsdlMockRequestRawXmlEditor( WsdlMockResponse response, XmlEditor<XmlDocument> editor )
186 		{
187 			super( "Raw", editor, "The actual content of the last received mock request" );
188 			this.request = response;
189 
190 			response.addPropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
191 		}
192 
193 		@Override
194 		public void propertyChange( PropertyChangeEvent evt )
195 		{
196 			if( evt.getPropertyName().equals( WsdlMockResponse.MOCKRESULT_PROPERTY ) )
197 			{
198 				setXml( "" );
199 			}
200 		}
201 
202 		@Override
203 		public String getContent()
204 		{
205 			if( request.getMockResult() == null )
206 				return "<missing request>";
207 
208 			return buildRawContent( request.getMockResult().getMockRequest().getRequestHeaders(), request.getMockResult()
209 					.getMockRequest().getRawRequestData() );
210 		}
211 
212 		@Override
213 		public void release()
214 		{
215 			request.removePropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
216 			super.release();
217 		}
218 	}
219 
220 	private static class WsdlMockResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
221 	{
222 		private final WsdlMockResponse request;
223 
224 		public WsdlMockResponseRawXmlEditor( WsdlMockResponse response, XmlEditor<XmlDocument> editor )
225 		{
226 			super( "Raw", editor, "The actual content of the last returned Mock Response" );
227 			this.request = response;
228 
229 			response.addPropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
230 		}
231 
232 		@Override
233 		public void propertyChange( PropertyChangeEvent evt )
234 		{
235 			if( evt.getPropertyName().equals( WsdlMockResponse.MOCKRESULT_PROPERTY ) )
236 			{
237 				setXml( "" );
238 			}
239 		}
240 
241 		@Override
242 		public String getContent()
243 		{
244 			if( request.getMockResult() == null )
245 				return "<missing response>";
246 
247 			StringToStringMap headers = request.getMockResult().getResponseHeaders();
248 			byte[] data = request.getMockResult().getRawResponseData();
249 
250 			return buildRawContent( headers, data );
251 		}
252 
253 		@Override
254 		public void release()
255 		{
256 			request.removePropertyChangeListener( WsdlMockResponse.MOCKRESULT_PROPERTY, this );
257 			super.release();
258 		}
259 	}
260 
261 	private static String buildRawContent( StringToStringMap headers, byte[] data )
262 	{
263 		StringBuffer result = new StringBuffer();
264 		String status = headers.get( "#status#" );
265 		if( status != null )
266 			result.append( status ).append( '\n' );
267 
268 		for( String header : headers.keySet() )
269 		{
270 			if( header.equals( "#status#" ) )
271 				continue;
272 
273 			result.append( header ).append( ": " ).append( headers.get( header ) ).append( '\n' );
274 		}
275 		result.append( '\n' );
276 
277 		if( data != null )
278 			result.append( new String( data ).trim() );
279 
280 		return result.toString().trim();
281 	}
282 
283 	private static class WsdlMessageExchangeResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
284 	{
285 		private final MessageExchangeModelItem response;
286 
287 		public WsdlMessageExchangeResponseRawXmlEditor( MessageExchangeModelItem response, XmlEditor<XmlDocument> editor )
288 		{
289 			super( "Raw", editor, "The raw response data" );
290 			this.response = response;
291 		}
292 
293 		@Override
294 		public String getContent()
295 		{
296 			MessageExchange me = response.getMessageExchange();
297 			return me == null || me.getRawResponseData() == null ? "" : new String( me.getRawResponseData() );
298 		}
299 	}
300 
301 	private static class WsdlMessageExchangeRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
302 	{
303 		private final MessageExchangeModelItem request;
304 
305 		public WsdlMessageExchangeRequestRawXmlEditor( MessageExchangeModelItem request, XmlEditor<XmlDocument> editor )
306 		{
307 			super( "Raw", editor, "The raw request data" );
308 			this.request = request;
309 		}
310 
311 		@Override
312 		public String getContent()
313 		{
314 			MessageExchange me = request.getMessageExchange();
315 			return me == null || me.getRawRequestData() == null ? "" : new String( me.getRawRequestData() );
316 		}
317 	}
318 
319 	private static class AmfResponseRawXmlEditor extends RawXmlEditor<XmlDocument>
320 	{
321 		private final AMFRequest request;
322 
323 		public AmfResponseRawXmlEditor( AMFRequestTestStep requestTestStep, XmlEditor<XmlDocument> editor )
324 		{
325 			super( "Raw", editor, "The actual content of the last received response" );
326 			this.request = requestTestStep.getAMFRequest();
327 
328 			request.addPropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
329 		}
330 
331 		@Override
332 		public void propertyChange( PropertyChangeEvent evt )
333 		{
334 				setXml( "" );
335 		}
336 
337 		@Override
338 		public String getContent()
339 		{
340 			if( request.getResponse() == null )
341 				return "<missing response>";
342 
343 			byte[] rawResponseData = request.getResponse().getRawResponseData();
344 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_RESPONSE_MESSAGE_SIZE, 10000 );
345 
346 			if( maxSize < rawResponseData.length )
347 				return new String( Arrays.copyOf( rawResponseData, maxSize ) );
348 			else
349 				return new String( rawResponseData );
350 		}
351 
352 		@Override
353 		public void release()
354 		{
355 			request.removePropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
356 			super.release();
357 		}
358 	}
359 	
360 	private static class AmfRequestRawXmlEditor extends RawXmlEditor<XmlDocument>
361 	{
362 		private final AMFRequest request;
363 
364 		public AmfRequestRawXmlEditor( AMFRequestTestStep requestTestStep, XmlEditor<XmlDocument> editor )
365 		{
366 			super( "Raw", editor, "The actual content of the last request" );
367 			this.request = requestTestStep.getAMFRequest();
368 
369 			request.addPropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
370 		}
371 
372 		@Override
373 		public void propertyChange( PropertyChangeEvent evt )
374 		{
375 				setXml( "" );
376 		}
377 
378 		@Override
379 		public String getContent()
380 		{
381 			if( request.getResponse() == null )
382 				return "";
383 
384 			byte[] rawRequestData = request.getResponse().getRawRequestData(); 
385 			int maxSize = ( int )SoapUI.getSettings().getLong( UISettings.RAW_RESPONSE_MESSAGE_SIZE, 10000 );
386 
387 			if( maxSize < rawRequestData.length )
388 				return new String( Arrays.copyOf( rawRequestData, maxSize ) );
389 			else
390 				return new String( rawRequestData );
391 		}
392 
393 		@Override
394 		public void release()
395 		{
396 			request.removePropertyChangeListener( AMFRequest.AMF_RESPONSE_PROPERTY, this );
397 			super.release();
398 		}
399 	}
400 }