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