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.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 }