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