1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support.editor.views.xml.source;
14
15 import java.util.List;
16
17 import javax.swing.JMenu;
18 import javax.swing.JPopupMenu;
19 import javax.swing.JSeparator;
20 import javax.swing.event.PopupMenuEvent;
21 import javax.swing.event.PopupMenuListener;
22
23 import com.eviware.soapui.impl.rest.RestRequest;
24 import com.eviware.soapui.impl.rest.RestRequestInterface;
25 import com.eviware.soapui.impl.support.http.HttpRequestInterface;
26 import com.eviware.soapui.impl.wadl.support.WadlValidator;
27 import com.eviware.soapui.impl.wsdl.WsdlOperation;
28 import com.eviware.soapui.impl.wsdl.WsdlRequest;
29 import com.eviware.soapui.impl.wsdl.actions.mockresponse.AddWsaHeadersToMockResponseAction;
30 import com.eviware.soapui.impl.wsdl.actions.mockresponse.ApplyOutgoingWSSToMockResponseAction;
31 import com.eviware.soapui.impl.wsdl.actions.mockresponse.RemoveAllOutgoingWSSFromMockResponseAction;
32 import com.eviware.soapui.impl.wsdl.actions.mockresponse.RemoveWsaHeadersFromMockResponseAction;
33 import com.eviware.soapui.impl.wsdl.actions.request.AddWSSUsernameTokenAction;
34 import com.eviware.soapui.impl.wsdl.actions.request.AddWSTimestampAction;
35 import com.eviware.soapui.impl.wsdl.actions.request.AddWsaHeadersToRequestAction;
36 import com.eviware.soapui.impl.wsdl.actions.request.ApplyOutgoingWSSToRequestAction;
37 import com.eviware.soapui.impl.wsdl.actions.request.RemoveAllOutgoingWSSFromRequestAction;
38 import com.eviware.soapui.impl.wsdl.actions.request.RemoveWsaHeadersFromRequestAction;
39 import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
40 import com.eviware.soapui.impl.wsdl.panels.mockoperation.WsdlMockResponseMessageExchange;
41 import com.eviware.soapui.impl.wsdl.panels.mockoperation.WsdlMockResultMessageExchange;
42 import com.eviware.soapui.impl.wsdl.support.MessageExchangeModelItem;
43 import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlValidator;
44 import com.eviware.soapui.impl.wsdl.support.wss.DefaultWssContainer;
45 import com.eviware.soapui.impl.wsdl.support.wss.OutgoingWss;
46 import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
47 import com.eviware.soapui.impl.wsdl.teststeps.AMFRequestTestStep;
48 import com.eviware.soapui.impl.wsdl.teststeps.JdbcRequestTestStep;
49 import com.eviware.soapui.impl.wsdl.teststeps.RestResponseMessageExchange;
50 import com.eviware.soapui.impl.wsdl.teststeps.WsdlResponseMessageExchange;
51 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest;
52 import com.eviware.soapui.model.ModelItem;
53 import com.eviware.soapui.model.testsuite.AssertionError;
54 import com.eviware.soapui.support.editor.Editor;
55 import com.eviware.soapui.support.editor.EditorView;
56 import com.eviware.soapui.support.editor.registry.RequestEditorViewFactory;
57 import com.eviware.soapui.support.editor.registry.ResponseEditorViewFactory;
58 import com.eviware.soapui.support.editor.xml.XmlDocument;
59 import com.eviware.soapui.support.editor.xml.XmlEditor;
60 import com.eviware.soapui.support.editor.xml.XmlEditorView;
61 import com.eviware.soapui.support.editor.xml.support.ValidationError;
62 import com.eviware.soapui.support.propertyexpansion.PropertyExpansionPopupListener;
63 import com.eviware.soapui.support.xml.JXEditTextArea;
64
65 /***
66 * Factory for default "XML" source editor view in soapUI
67 *
68 * @author ole.matzura
69 */
70
71 public class XmlSourceEditorViewFactory implements ResponseEditorViewFactory, RequestEditorViewFactory
72 {
73 public static final String VIEW_ID = "Source";
74
75 @SuppressWarnings( "unchecked" )
76 public XmlEditorView createEditorView( XmlEditor editor )
77 {
78 return new XmlSourceEditorView<ModelItem>( editor, null );
79 }
80
81 public String getViewId()
82 {
83 return VIEW_ID;
84 }
85
86 @SuppressWarnings( "unchecked" )
87 public EditorView<?> createRequestEditorView( Editor<?> editor, ModelItem modelItem )
88 {
89 if( modelItem instanceof WsdlRequest )
90 {
91 return new WsdlRequestXmlSourceEditor( ( XmlEditor )editor, ( WsdlRequest )modelItem );
92 }
93 else if( modelItem instanceof WsdlMockResponse )
94 {
95 return new WsdlMockRequestXmlSourceEditor( ( XmlEditor )editor, ( WsdlMockResponse )modelItem );
96 }
97 else if( modelItem instanceof MessageExchangeModelItem )
98 {
99 return new XmlSourceEditorView<MessageExchangeModelItem>( ( XmlEditor )editor,
100 ( MessageExchangeModelItem )modelItem );
101 }
102
103 return null;
104 }
105
106 @SuppressWarnings( "unchecked" )
107 public EditorView<?> createResponseEditorView( Editor<?> editor, ModelItem modelItem )
108 {
109 if( modelItem instanceof WsdlRequest )
110 {
111 return new WsdlResponseXmlSourceEditor( ( XmlEditor )editor, ( WsdlRequest )modelItem );
112 }
113 else if( modelItem instanceof WsdlMockResponse )
114 {
115 return new WsdlMockResponseXmlSourceEditor( ( XmlEditor )editor, ( WsdlMockResponse )modelItem );
116 }
117 else if( modelItem instanceof HttpRequestInterface<?> )
118 {
119 return new RestResponseXmlSourceEditor( ( XmlEditor )editor, ( HttpRequestInterface<?> )modelItem );
120 }
121 else if( modelItem instanceof MessageExchangeModelItem )
122 {
123 return new XmlSourceEditorView<MessageExchangeModelItem>( ( XmlEditor )editor,
124 ( MessageExchangeModelItem )modelItem );
125 }
126 else if( modelItem instanceof JdbcRequestTestStep)
127 {
128 return new XmlSourceEditorView<JdbcRequestTestStep>( (XmlEditor) editor, (JdbcRequestTestStep)modelItem );
129 }
130 else if( modelItem instanceof AMFRequestTestStep)
131 {
132 return new XmlSourceEditorView<AMFRequestTestStep>( (XmlEditor) editor, (AMFRequestTestStep)modelItem );
133 }
134
135 return null;
136 }
137
138 /***
139 * XmlSource editor for a WsdlRequest
140 *
141 * @author ole.matzura
142 */
143
144 public static class WsdlRequestXmlSourceEditor extends XmlSourceEditorView<WsdlRequest>
145 {
146 private JMenu applyMenu;
147 private JMenu wsaApplyMenu;
148
149 @SuppressWarnings( "unchecked" )
150 public WsdlRequestXmlSourceEditor( XmlEditor xmlEditor, WsdlRequest request )
151 {
152 super( xmlEditor, request );
153 }
154
155 protected ValidationError[] validateXml( String xml )
156 {
157 WsdlOperation operation = getModelItem().getOperation();
158 WsdlValidator validator = new WsdlValidator( ( operation.getInterface() ).getWsdlContext() );
159
160 WsdlResponseMessageExchange wsdlResponseMessageExchange = new WsdlResponseMessageExchange( getModelItem() );
161 wsdlResponseMessageExchange.setRequestContent( xml );
162 return validator.assertRequest( wsdlResponseMessageExchange, false );
163 }
164
165 @Override
166 protected void buildUI()
167 {
168 super.buildUI();
169 PropertyExpansionPopupListener.enable( getInputArea(), getModelItem() );
170 }
171
172 protected void buildPopup( JPopupMenu inputPopup, JXEditTextArea editArea )
173 {
174 super.buildPopup( inputPopup, editArea );
175
176 inputPopup.insert( new JSeparator(), 2 );
177 inputPopup.insert( new AddWSSUsernameTokenAction( getModelItem() ), 3 );
178 inputPopup.insert( new AddWSTimestampAction( getModelItem() ), 4 );
179 inputPopup.insert( applyMenu = new JMenu( "Outgoing WSS" ), 5 );
180 inputPopup.insert( wsaApplyMenu = new JMenu( "WS-A headers" ), 6 );
181
182 inputPopup.addPopupMenuListener( new PopupMenuListener()
183 {
184
185 public void popupMenuCanceled( PopupMenuEvent e )
186 {
187
188 }
189
190 public void popupMenuWillBecomeInvisible( PopupMenuEvent e )
191 {
192
193 }
194
195 public void popupMenuWillBecomeVisible( PopupMenuEvent e )
196 {
197 applyMenu.removeAll();
198 DefaultWssContainer wss = getModelItem().getOperation().getInterface().getProject().getWssContainer();
199 List<OutgoingWss> outgoingWssList = wss.getOutgoingWssList();
200 applyMenu.setEnabled( !outgoingWssList.isEmpty() );
201
202 for( OutgoingWss outgoing : outgoingWssList )
203 {
204 applyMenu.add( new ApplyOutgoingWSSToRequestAction( getModelItem(), outgoing ) );
205 }
206 applyMenu.add( new RemoveAllOutgoingWSSFromRequestAction( getModelItem() ) );
207
208 wsaApplyMenu.removeAll();
209 wsaApplyMenu.add( new AddWsaHeadersToRequestAction( getModelItem() ) );
210 wsaApplyMenu.add( new RemoveWsaHeadersFromRequestAction( getModelItem() ) );
211 wsaApplyMenu.setEnabled( getModelItem().getWsaConfig().isWsaEnabled() );
212 }
213 } );
214 }
215
216 public WsdlRequest getRequest()
217 {
218 return getModelItem();
219 }
220 }
221
222 /***
223 * XmlSource editor for a WsdlMockRequest
224 *
225 * @author ole.matzura
226 */
227
228 public static class WsdlMockRequestXmlSourceEditor extends XmlSourceEditorView<WsdlMockResponse>
229 {
230 @SuppressWarnings( "unchecked" )
231 public WsdlMockRequestXmlSourceEditor( XmlEditor xmlEditor, WsdlMockResponse mockResponse )
232 {
233 super( xmlEditor, mockResponse );
234 }
235
236 protected ValidationError[] validateXml( String xml )
237 {
238 WsdlOperation operation = getModelItem().getMockOperation().getOperation();
239
240 if( operation == null )
241 {
242 return new ValidationError[] { new AssertionError( "Missing operation for MockResponse" ) };
243 }
244
245 WsdlValidator validator = new WsdlValidator( ( operation.getInterface() ).getWsdlContext() );
246 return validator.assertRequest( new WsdlMockResultMessageExchange( getModelItem().getMockResult(),
247 getModelItem() ), false );
248 }
249
250 protected void buildPopup( JPopupMenu inputPopup, JXEditTextArea editArea )
251 {
252 super.buildPopup( inputPopup, editArea );
253
254 }
255 }
256
257 /***
258 * XmlSource editor for a WsdlResponse
259 *
260 * @author ole.matzura
261 */
262
263 public static class WsdlResponseXmlSourceEditor extends XmlSourceEditorView<WsdlRequest>
264 {
265 @SuppressWarnings( "unchecked" )
266 public WsdlResponseXmlSourceEditor( XmlEditor xmlEditor, WsdlRequest request )
267 {
268 super( xmlEditor, request );
269 }
270
271 protected ValidationError[] validateXml( String xml )
272 {
273 if( getModelItem() instanceof WsdlTestRequest )
274 {
275 WsdlTestRequest testRequest = ( WsdlTestRequest )getModelItem();
276 testRequest.assertResponse( new WsdlTestRunContext( testRequest.getTestStep() ) );
277 }
278
279 WsdlOperation operation = getModelItem().getOperation();
280 WsdlValidator validator = new WsdlValidator( ( operation.getInterface() ).getWsdlContext() );
281
282 return validator.assertResponse( new WsdlResponseMessageExchange( getModelItem() ), false );
283 }
284 }
285
286 /***
287 * XmlSource editor for a WsdlMockResponse
288 *
289 * @author ole.matzura
290 */
291
292 public static class WsdlMockResponseXmlSourceEditor extends XmlSourceEditorView<WsdlMockResponse>
293 {
294 private JMenu applyMenu;
295 private JMenu wsaApplyMenu;
296
297 @SuppressWarnings( "unchecked" )
298 public WsdlMockResponseXmlSourceEditor( XmlEditor xmlEditor, WsdlMockResponse mockResponse )
299 {
300 super( xmlEditor, mockResponse );
301 }
302
303 @Override
304 protected void buildUI()
305 {
306 super.buildUI();
307
308 getValidateXmlAction().setEnabled( getModelItem().getMockOperation().getOperation().isBidirectional() );
309 }
310
311 protected ValidationError[] validateXml( String xml )
312 {
313 WsdlOperation operation = getModelItem().getMockOperation().getOperation();
314 if( operation == null )
315 {
316 return new ValidationError[] { new AssertionError( "Missing operation for MockResponse" ) };
317 }
318
319 WsdlValidator validator = new WsdlValidator( ( operation.getInterface() ).getWsdlContext() );
320 return validator.assertResponse( new WsdlMockResponseMessageExchange( getModelItem() ), false );
321 }
322
323 public WsdlMockResponse getMockResponse()
324 {
325 return getModelItem();
326 }
327
328 protected void buildPopup( JPopupMenu inputPopup, JXEditTextArea editArea )
329 {
330 super.buildPopup( inputPopup, editArea );
331
332 inputPopup.insert( applyMenu = new JMenu( "Outgoing WSS" ), 2 );
333 inputPopup.insert( wsaApplyMenu = new JMenu( "WS-A headers" ), 3 );
334
335 inputPopup.addPopupMenuListener( new PopupMenuListener()
336 {
337
338 public void popupMenuCanceled( PopupMenuEvent e )
339 {
340
341 }
342
343 public void popupMenuWillBecomeInvisible( PopupMenuEvent e )
344 {
345
346 }
347
348 public void popupMenuWillBecomeVisible( PopupMenuEvent e )
349 {
350 applyMenu.removeAll();
351 DefaultWssContainer wss = getModelItem().getMockOperation().getMockService().getProject()
352 .getWssContainer();
353 List<OutgoingWss> outgoingWssList = wss.getOutgoingWssList();
354 applyMenu.setEnabled( !outgoingWssList.isEmpty() );
355
356 for( OutgoingWss outgoing : outgoingWssList )
357 {
358 applyMenu.add( new ApplyOutgoingWSSToMockResponseAction( getModelItem(), outgoing ) );
359 }
360 applyMenu.add( new RemoveAllOutgoingWSSFromMockResponseAction( getModelItem() ) );
361
362 wsaApplyMenu.removeAll();
363 wsaApplyMenu.add( new AddWsaHeadersToMockResponseAction( getModelItem() ) );
364 wsaApplyMenu.add( new RemoveWsaHeadersFromMockResponseAction( getModelItem() ) );
365 wsaApplyMenu.setEnabled( getModelItem().getWsaConfig().isWsaEnabled() );
366
367 }
368 } );
369 }
370 }
371
372 private class RestResponseXmlSourceEditor extends XmlSourceEditorView<HttpRequestInterface<?>>
373 {
374 public RestResponseXmlSourceEditor( XmlEditor<XmlDocument> xmlEditor, HttpRequestInterface<?> restRequest )
375 {
376 super( xmlEditor, restRequest );
377 }
378
379 @SuppressWarnings( "unchecked" )
380 protected ValidationError[] validateXml( String xml )
381 {
382 if( getModelItem() instanceof HttpRequestInterface
383 || ( ( RestRequestInterface )getModelItem() ).getResource() == null )
384 return new ValidationError[0];
385
386 WadlValidator validator = new WadlValidator( ( ( RestRequestInterface )getModelItem() ).getResource()
387 .getService().getWadlContext() );
388 return validator.assertResponse( new RestResponseMessageExchange( ( RestRequest )getModelItem() ) );
389 }
390 }
391 }