1
2
3
4
5
6
7
8
9
10
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 }