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.wsdl.WsdlOperation;
17 import com.eviware.soapui.impl.wsdl.WsdlRequest;
18 import com.eviware.soapui.impl.wsdl.actions.mockresponse.AddWsaHeadersToMockResponseAction;
19 import com.eviware.soapui.impl.wsdl.actions.mockresponse.ApplyOutgoingWSSToMockResponseAction;
20 import com.eviware.soapui.impl.wsdl.actions.request.AddWSSUsernameTokenAction;
21 import com.eviware.soapui.impl.wsdl.actions.request.AddWSTimestampAction;
22 import com.eviware.soapui.impl.wsdl.actions.request.AddWsaHeadersToRequestAction;
23 import com.eviware.soapui.impl.wsdl.actions.request.ApplyOutgoingWSSToRequestAction;
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.impl.wsdl.teststeps.assertions.basic.WadlValidator;
36 import com.eviware.soapui.model.ModelItem;
37 import com.eviware.soapui.model.testsuite.AssertionError;
38 import com.eviware.soapui.support.editor.Editor;
39 import com.eviware.soapui.support.editor.EditorView;
40 import com.eviware.soapui.support.editor.registry.RequestEditorViewFactory;
41 import com.eviware.soapui.support.editor.registry.ResponseEditorViewFactory;
42 import com.eviware.soapui.support.editor.xml.XmlDocument;
43 import com.eviware.soapui.support.editor.xml.XmlEditor;
44 import com.eviware.soapui.support.editor.xml.XmlEditorView;
45 import com.eviware.soapui.support.editor.xml.support.ValidationError;
46 import com.eviware.soapui.support.propertyexpansion.PropertyExpansionPopupListener;
47 import com.eviware.soapui.support.xml.JXEditTextArea;
48
49 import javax.swing.*;
50 import javax.swing.event.PopupMenuEvent;
51 import javax.swing.event.PopupMenuListener;
52 import java.util.List;
53
54 /***
55 * Factory for default "XML" source editor view in soapUI
56 *
57 * @author ole.matzura
58 */
59
60 public class XmlSourceEditorViewFactory implements ResponseEditorViewFactory, RequestEditorViewFactory
61 {
62 public static final String VIEW_ID = "Source";
63
64 public XmlEditorView createEditorView(XmlEditor editor)
65 {
66 return new XmlSourceEditorView( editor );
67 }
68
69 public String getViewId()
70 {
71 return VIEW_ID;
72 }
73
74 public EditorView<?> createRequestEditorView( Editor<?> editor, ModelItem modelItem )
75 {
76 if( modelItem instanceof WsdlRequest )
77 {
78 return new WsdlRequestXmlSourceEditor( (XmlEditor) editor, ( WsdlRequest ) modelItem );
79 }
80 else if( modelItem instanceof WsdlMockResponse )
81 {
82 return new WsdlMockRequestXmlSourceEditor( (XmlEditor) editor, ( WsdlMockResponse ) modelItem );
83 }
84 else if( modelItem instanceof MessageExchangeModelItem )
85 {
86 return new XmlSourceEditorView( (XmlEditor) editor );
87 }
88
89 return null;
90 }
91
92 public EditorView<?> createResponseEditorView( Editor<?> editor, ModelItem modelItem )
93 {
94 if( modelItem instanceof WsdlRequest )
95 {
96 return new WsdlResponseXmlSourceEditor( (XmlEditor) editor, ( WsdlRequest ) modelItem );
97 }
98 else if( modelItem instanceof WsdlMockResponse )
99 {
100 return new WsdlMockResponseXmlSourceEditor( (XmlEditor) editor, ( WsdlMockResponse ) modelItem );
101 }
102 else if( modelItem instanceof RestRequest )
103 {
104 return new RestResponseXmlSourceEditor( (XmlEditor) editor, (RestRequest)modelItem );
105 }
106 else if( modelItem instanceof MessageExchangeModelItem )
107 {
108 return new XmlSourceEditorView( (XmlEditor) editor );
109 }
110
111 return null;
112 }
113
114 /***
115 * XmlSource editor for a WsdlRequest
116 *
117 * @author ole.matzura
118 */
119
120 public static class WsdlRequestXmlSourceEditor extends XmlSourceEditorView
121 {
122 private final WsdlRequest request;
123 private JMenu applyMenu;
124 private JMenuItem wsaApplyMenu;
125
126 public WsdlRequestXmlSourceEditor(XmlEditor xmlEditor, WsdlRequest request )
127 {
128 super(xmlEditor);
129 this.request = request;
130 }
131
132 protected ValidationError[] validateXml( String xml )
133 {
134 WsdlOperation operation = request.getOperation();
135 WsdlValidator validator = new WsdlValidator((operation.getInterface()).getWsdlContext());
136
137 WsdlResponseMessageExchange wsdlResponseMessageExchange = new WsdlResponseMessageExchange( request );
138 wsdlResponseMessageExchange.setRequestContent( xml );
139 return validator.assertRequest( wsdlResponseMessageExchange, false );
140 }
141
142 @Override
143 protected void buildUI()
144 {
145 super.buildUI();
146 PropertyExpansionPopupListener.enable( getInputArea(), request );
147 }
148
149 protected void buildPopup(JPopupMenu inputPopup, JXEditTextArea editArea )
150 {
151 super.buildPopup(inputPopup, editArea );
152
153 inputPopup.insert( new JSeparator(), 2 );
154 inputPopup.insert(new AddWSSUsernameTokenAction(request),3);
155 inputPopup.insert(new AddWSTimestampAction(request),4);
156 inputPopup.insert( applyMenu = new JMenu( "Apply Outgoing WSS"),5);
157
158 wsaApplyMenu = new JMenuItem( "Add WS-A headers");
159 inputPopup.insert(wsaApplyMenu,6 );
160 wsaApplyMenu.setAction( new AddWsaHeadersToRequestAction(request));
161
162 inputPopup.addPopupMenuListener( new PopupMenuListener() {
163
164 public void popupMenuCanceled( PopupMenuEvent e )
165 {
166
167 }
168
169 public void popupMenuWillBecomeInvisible( PopupMenuEvent e )
170 {
171
172 }
173
174 public void popupMenuWillBecomeVisible( PopupMenuEvent e )
175 {
176 applyMenu.removeAll();
177 DefaultWssContainer wss = request.getOperation().getInterface().getProject().getWssContainer();
178 List<OutgoingWss> outgoingWssList = wss.getOutgoingWssList();
179 applyMenu.setEnabled( !outgoingWssList.isEmpty() );
180
181 for( OutgoingWss outgoing : outgoingWssList )
182 {
183 applyMenu.add( new ApplyOutgoingWSSToRequestAction( request, outgoing ) );
184 }
185
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 JMenuItem 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( "Apply Outgoing WSS"),2);
311
312 wsaApplyMenu = new JMenuItem( "Add WS-A headers");
313 inputPopup.insert(wsaApplyMenu,3 );
314 wsaApplyMenu.setAction( new AddWsaHeadersToMockResponseAction(mockResponse));
315
316 inputPopup.addPopupMenuListener( new PopupMenuListener() {
317
318 public void popupMenuCanceled( PopupMenuEvent e )
319 {
320
321 }
322
323 public void popupMenuWillBecomeInvisible( PopupMenuEvent e )
324 {
325
326 }
327
328 public void popupMenuWillBecomeVisible( PopupMenuEvent e )
329 {
330 applyMenu.removeAll();
331 DefaultWssContainer wss = mockResponse.getMockOperation().getMockService().getProject().getWssContainer();
332 List<OutgoingWss> outgoingWssList = wss.getOutgoingWssList();
333 applyMenu.setEnabled( !outgoingWssList.isEmpty() );
334
335 for( OutgoingWss outgoing : outgoingWssList )
336 {
337 applyMenu.add( new ApplyOutgoingWSSToMockResponseAction( mockResponse, outgoing ) );
338 }
339
340 wsaApplyMenu.setEnabled(mockResponse.getWsaConfig().isWsaEnabled());
341 }} );
342 }
343 }
344
345 private class RestResponseXmlSourceEditor extends XmlSourceEditorView
346 {
347 private RestRequest restRequest;
348
349 public RestResponseXmlSourceEditor( XmlEditor<XmlDocument> xmlEditor, RestRequest restRequest )
350 {
351 super( xmlEditor );
352 this.restRequest = restRequest;
353 }
354
355 protected ValidationError[] validateXml( String xml )
356 {
357 if( restRequest.getResource() == null )
358 return new ValidationError[0];
359
360 WadlValidator validator = new WadlValidator( restRequest.getResource().getService().getWadlContext() );
361 return validator.assertResponse( new RestResponseMessageExchange( restRequest ) );
362 }
363 }
364 }