View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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 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 			// inputPopup.insert( new JSeparator(), 2 );
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 }