View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 }