1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.mockoperation;
14
15 import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
16 import com.eviware.soapui.impl.wsdl.WsdlInterface;
17 import com.eviware.soapui.impl.wsdl.WsdlOperation;
18 import com.eviware.soapui.impl.wsdl.actions.mockoperation.NewMockResponseAction;
19 import com.eviware.soapui.impl.wsdl.actions.mockoperation.OpenRequestForMockOperationAction;
20 import com.eviware.soapui.impl.wsdl.mock.WsdlMockOperation;
21 import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
22 import com.eviware.soapui.impl.wsdl.mock.dispatch.MockOperationDispatchRegistry;
23 import com.eviware.soapui.impl.wsdl.mock.dispatch.MockOperationDispatcher;
24 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
25 import com.eviware.soapui.model.ModelItem;
26 import com.eviware.soapui.model.iface.Interface;
27 import com.eviware.soapui.model.iface.Operation;
28 import com.eviware.soapui.model.mock.MockOperation;
29 import com.eviware.soapui.model.mock.MockResponse;
30 import com.eviware.soapui.model.mock.MockServiceListener;
31 import com.eviware.soapui.model.support.InterfaceListenerAdapter;
32 import com.eviware.soapui.model.support.ProjectListenerAdapter;
33 import com.eviware.soapui.model.util.ModelItemNames;
34 import com.eviware.soapui.support.UISupport;
35 import com.eviware.soapui.support.action.swing.ActionList;
36 import com.eviware.soapui.support.action.swing.ActionSupport;
37 import com.eviware.soapui.support.action.swing.DefaultActionList;
38 import com.eviware.soapui.support.action.swing.SwingActionDelegate;
39 import com.eviware.soapui.support.components.JComponentInspector;
40 import com.eviware.soapui.support.components.JInspectorPanel;
41 import com.eviware.soapui.support.components.JInspectorPanelFactory;
42 import com.eviware.soapui.support.components.JXToolBar;
43 import com.eviware.soapui.support.swing.ExtendedComboBoxModel;
44 import com.eviware.soapui.support.swing.ModelItemListKeyListener;
45 import com.eviware.soapui.support.swing.ModelItemListMouseListener;
46 import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
47 import com.jgoodies.forms.builder.ButtonBarBuilder;
48
49 import javax.swing.*;
50 import java.awt.*;
51 import java.awt.event.ItemEvent;
52 import java.awt.event.ItemListener;
53 import java.beans.PropertyChangeEvent;
54 import java.beans.PropertyChangeListener;
55 import java.util.ArrayList;
56 import java.util.List;
57
58 /***
59 * DesktopPanel for WsdlGroovyTestSteps
60 *
61 * @author Ole.Matzura
62 */
63
64 public class WsdlMockOperationDesktopPanel extends ModelItemDesktopPanel<WsdlMockOperation>
65 {
66 private JList responseList;
67 private JComboBox interfaceCombo;
68 private JComboBox operationCombo;
69 private JComboBox dispatchCombo;
70 private JPanel dispatchPanel;
71 private InternalInterfaceListener interfaceListener = new InternalInterfaceListener();
72 private InternalProjectListener projectListener = new InternalProjectListener();
73 private WsdlInterface currentInterface;
74 private JComboBox defaultResponseCombo;
75 private ResponseListModel responseListModel;
76 private JComponentInspector<JComponent> dispatchInspector;
77
78 public WsdlMockOperationDesktopPanel( WsdlMockOperation mockOperation )
79 {
80 super( mockOperation );
81
82 buildUI();
83 setPreferredSize( new Dimension( 600, 440 ) );
84
85 mockOperation.getMockService().getProject().addProjectListener( projectListener );
86
87 WsdlOperation operation = getModelItem().getOperation();
88 if( operation != null )
89 {
90 currentInterface = operation.getInterface();
91 currentInterface.addInterfaceListener( interfaceListener );
92 }
93 }
94
95 private void buildUI()
96 {
97 add( buildToolbar(), BorderLayout.NORTH );
98
99 JInspectorPanel inspectorPanel = JInspectorPanelFactory.build( buildResponseList() );
100 inspectorPanel.setDefaultDividerLocation( 0.5F );
101 dispatchInspector = new JComponentInspector<JComponent>(
102 buildDispatchEditor(), "Dispatch (" + getModelItem().getDispatchStyle().toString() + ")",
103 "Configures current dispatch style", true );
104 inspectorPanel.addInspector( dispatchInspector );
105 inspectorPanel.activate( dispatchInspector );
106
107 add( inspectorPanel.getComponent(), BorderLayout.CENTER );
108 }
109
110 private JComponent buildResponseList()
111 {
112 responseListModel = new ResponseListModel();
113 responseList = new JList( responseListModel );
114 responseList.addKeyListener( new ModelItemListKeyListener()
115 {
116 @Override
117 public ModelItem getModelItemAt( int ix )
118 {
119 return getModelItem().getMockResponseAt( ix );
120 }
121 } );
122
123 responseList.addMouseListener( new ModelItemListMouseListener()
124 {
125
126 private DefaultActionList defaultActions;
127
128 @Override
129 protected ActionList getActionsForRow( JList list, int row )
130 {
131 ActionList actions = super.getActionsForRow( list, row );
132
133 actions.insertAction( SwingActionDelegate.createDelegate( NewMockResponseAction.SOAPUI_ACTION_ID, getModelItem(), null,
134 "/addToMockService.gif" ), 0 );
135
136 actions.insertAction( SwingActionDelegate.createDelegate( OpenRequestForMockOperationAction.SOAPUI_ACTION_ID, getModelItem(), null,
137 "/open_request.gif" ), 1 );
138
139 if( actions.getActionCount() > 2 )
140 actions.insertAction( ActionSupport.SEPARATOR_ACTION, 2 );
141
142 return actions;
143 }
144
145 @Override
146 protected ActionList getDefaultActions()
147 {
148 if( defaultActions == null )
149 {
150 defaultActions = new DefaultActionList();
151 defaultActions.addAction( SwingActionDelegate.createDelegate( NewMockResponseAction.SOAPUI_ACTION_ID, getModelItem(), null,
152 "/addToMockService.gif" ) );
153 }
154
155 return defaultActions;
156 }
157
158 } );
159 responseList.setCellRenderer( new ResponseListCellRenderer() );
160
161 JScrollPane scrollPane = new JScrollPane( responseList );
162 JTabbedPane tabs = new JTabbedPane();
163 tabs.addTab( "MockResponses", UISupport.buildPanelWithToolbar( buildMockResponseListToolbar(), scrollPane ) );
164
165 return UISupport.createTabPanel( tabs, true );
166 }
167
168 private JComponent buildMockResponseListToolbar()
169 {
170 JXToolBar toolbar = UISupport.createToolbar();
171 toolbar.add( UISupport.createToolbarButton(
172 SwingActionDelegate.createDelegate( NewMockResponseAction.SOAPUI_ACTION_ID, getModelItem(),
173 null, "/mockResponse.gif" ) ) );
174
175 return toolbar;
176 }
177
178 private JComponent buildDispatchEditor()
179 {
180 dispatchPanel = new JPanel( new BorderLayout() );
181 dispatchPanel.setOpaque( true );
182 ButtonBarBuilder builder = new ButtonBarBuilder();
183 builder.addFixed( new JLabel( "Dispatch: " ) );
184 builder.addRelatedGap();
185 dispatchCombo = new JComboBox( MockOperationDispatchRegistry.getDispatchTypes() );
186
187 dispatchCombo.addItemListener( new ItemListener()
188 {
189 public void itemStateChanged( ItemEvent e )
190 {
191 if( dispatchPanel.getComponentCount() > 1 )
192 dispatchPanel.remove( 1 );
193
194 String item = (String) dispatchCombo.getSelectedItem();
195 MockOperationDispatcher dispatcher = getModelItem().setDispatchStyle( item );
196
197 dispatchPanel.add( dispatcher.buildEditorComponent(), BorderLayout.CENTER );
198 dispatchPanel.revalidate();
199 dispatchPanel.repaint();
200
201 if( dispatchInspector != null && item != null )
202 {
203 dispatchInspector.setTitle( "Dispatch (" + item + ")" );
204 }
205 }
206 } );
207
208 builder.addFixed( dispatchCombo );
209
210 builder.addUnrelatedGap();
211 builder.addFixed( new JLabel( "Default Response: " ) );
212 builder.addRelatedGap();
213
214 ModelItemNames<MockResponse> names = new ModelItemNames<MockResponse>( getModelItem().getMockResponses() );
215 defaultResponseCombo = new JComboBox( new ExtendedComboBoxModel( names.getNames() ) );
216 defaultResponseCombo.setPreferredSize( new Dimension( 150, 20 ) );
217 defaultResponseCombo.addItemListener( new ItemListener()
218 {
219 public void itemStateChanged( ItemEvent e )
220 {
221 Object selectedItem = defaultResponseCombo.getSelectedItem();
222 getModelItem().setDefaultResponse( (String) selectedItem );
223 }
224 } );
225
226 builder.addFixed( defaultResponseCombo );
227 builder.setBorder( BorderFactory.createEmptyBorder( 2, 3, 3, 3 ) );
228
229 dispatchPanel.add( builder.getPanel(), BorderLayout.NORTH );
230
231
232 defaultResponseCombo.setSelectedItem( getModelItem().getDefaultResponse() );
233 dispatchCombo.setSelectedItem( getModelItem().getDispatchStyle() );
234
235 return dispatchPanel;
236 }
237
238 private Component buildToolbar()
239 {
240 JXToolBar toolbar = UISupport.createToolbar();
241 toolbar.addSpace( 3 );
242
243 toolbar.addFixed( UISupport.createToolbarButton(
244 SwingActionDelegate.createDelegate( NewMockResponseAction.SOAPUI_ACTION_ID, getModelItem(), null,
245 "/addToMockService.gif" ) ) );
246 toolbar.addFixed( UISupport.createToolbarButton(
247 SwingActionDelegate.createDelegate( OpenRequestForMockOperationAction.SOAPUI_ACTION_ID, getModelItem(), null,
248 "/open_request.gif" ) ) );
249 toolbar.addUnrelatedGap();
250
251 ModelItemNames<Interface> names = new ModelItemNames<Interface>( getModelItem().getMockService().getProject().getInterfaceList() );
252 interfaceCombo = new JComboBox( names.getNames() );
253 interfaceCombo.setSelectedIndex( -1 );
254 interfaceCombo.addItemListener( new InterfaceComboListener() );
255
256 toolbar.addLabeledFixed( "Interface", interfaceCombo );
257 toolbar.addUnrelatedGap();
258 operationCombo = new JComboBox( new ExtendedComboBoxModel() );
259 operationCombo.setPreferredSize( new Dimension( 150, 20 ) );
260 operationCombo.addItemListener( new OperationComboListener() );
261
262 toolbar.addLabeledFixed( "Operation", operationCombo );
263
264 WsdlOperation operation = getModelItem().getOperation();
265 interfaceCombo.setSelectedItem( operation == null ? null : operation.getInterface().getName() );
266 operationCombo.setSelectedItem( operation == null ? null : operation.getName() );
267
268 toolbar.addGlue();
269 toolbar.addFixed( createActionButton( new ShowOnlineHelpAction( HelpUrls.MOCKOPERATION_HELP_URL ), true ) );
270
271 return toolbar;
272 }
273
274 public boolean onClose( boolean canCancel )
275 {
276 if( currentInterface != null )
277 currentInterface.removeInterfaceListener( interfaceListener );
278
279 getModelItem().getMockService().getProject().removeProjectListener( projectListener );
280 responseListModel.release();
281
282 return release();
283 }
284
285 public boolean dependsOn( ModelItem modelItem )
286 {
287 return modelItem == getModelItem() || modelItem == getModelItem().getMockService()
288 || modelItem == getModelItem().getMockService().getProject();
289 }
290
291 private final class OperationComboListener implements ItemListener
292 {
293 public void itemStateChanged( ItemEvent e )
294 {
295 WsdlInterface iface = (WsdlInterface) getModelItem().getMockService().getProject().getInterfaceByName( interfaceCombo.getSelectedItem().toString() );
296 WsdlOperation operation = iface.getOperationByName( operationCombo.getSelectedItem().toString() );
297 getModelItem().setOperation( operation );
298 }
299 }
300
301 private final class InterfaceComboListener implements ItemListener
302 {
303 public void itemStateChanged( ItemEvent e )
304 {
305 if( currentInterface != null )
306 {
307 currentInterface.removeInterfaceListener( interfaceListener );
308 }
309
310 Object selectedItem = interfaceCombo.getSelectedItem();
311 if( selectedItem == null )
312 {
313 operationCombo.setModel( new ExtendedComboBoxModel() );
314 currentInterface = null;
315 }
316 else
317 {
318 currentInterface = (WsdlInterface) getModelItem().getMockService().getProject().getInterfaceByName( selectedItem.toString() );
319 ModelItemNames<Operation> names = new ModelItemNames<Operation>( currentInterface.getOperationList() );
320 operationCombo.setModel( new ExtendedComboBoxModel( names.getNames() ) );
321
322 currentInterface.addInterfaceListener( interfaceListener );
323 }
324 }
325 }
326
327 private final class InternalProjectListener extends ProjectListenerAdapter
328 {
329 @Override
330 public void interfaceAdded( Interface iface )
331 {
332 interfaceCombo.addItem( iface.getName() );
333 }
334
335 @Override
336 public void interfaceRemoved( Interface iface )
337 {
338 if( interfaceCombo.getSelectedItem().equals( iface.getName() ) )
339 {
340 getModelItem().setOperation( null );
341 }
342 }
343 }
344
345 private final class InternalInterfaceListener extends InterfaceListenerAdapter
346 {
347 @Override
348 public void operationAdded( Operation operation )
349 {
350 operationCombo.addItem( operation.getName() );
351 }
352
353 @Override
354 public void operationRemoved( Operation operation )
355 {
356 Object selectedItem = operationCombo.getSelectedItem();
357 operationCombo.removeItem( operation.getName() );
358
359 if( selectedItem.equals( operation.getName() ) )
360 {
361 getModelItem().setOperation( null );
362 interfaceCombo.setSelectedIndex( -1 );
363 }
364 }
365
366 @Override
367 public void operationUpdated( Operation operation )
368 {
369 ExtendedComboBoxModel model = ( (ExtendedComboBoxModel) operationCombo.getModel() );
370 int ix = model.getIndexOf( operation.getName() );
371 if( ix != -1 )
372 {
373 model.setElementAt( operation.getName(), ix );
374 }
375 }
376 }
377
378 public class ResponseListModel extends AbstractListModel implements ListModel, MockServiceListener, PropertyChangeListener
379 {
380 private List<WsdlMockResponse> responses = new ArrayList<WsdlMockResponse>();
381
382 public ResponseListModel()
383 {
384 for( int c = 0; c < getModelItem().getMockResponseCount(); c++ )
385 {
386 WsdlMockResponse mockResponse = (WsdlMockResponse) getModelItem().getMockResponseAt( c );
387 mockResponse.addPropertyChangeListener( this );
388
389 responses.add( mockResponse );
390 }
391
392 getModelItem().getMockService().addMockServiceListener( this );
393 }
394
395 public Object getElementAt( int arg0 )
396 {
397 return responses.get( arg0 );
398 }
399
400 public int getSize()
401 {
402 return responses.size();
403 }
404
405 public void mockOperationAdded( MockOperation operation )
406 {
407
408 }
409
410 public void mockOperationRemoved( MockOperation operation )
411 {
412
413 }
414
415 public void mockResponseAdded( MockResponse response )
416 {
417 if( response.getMockOperation() != getModelItem() )
418 return;
419
420 responses.add( (WsdlMockResponse) response );
421 response.addPropertyChangeListener( this );
422 fireIntervalAdded( this, responses.size() - 1, responses.size() - 1 );
423
424 defaultResponseCombo.addItem( response.getName() );
425 }
426
427 public void mockResponseRemoved( MockResponse response )
428 {
429 if( response.getMockOperation() != getModelItem() )
430 return;
431
432 int ix = responses.indexOf( response );
433 responses.remove( ix );
434 response.removePropertyChangeListener( this );
435 fireIntervalRemoved( this, ix, ix );
436
437 defaultResponseCombo.removeItem( response.getName() );
438 }
439
440 public void propertyChange( PropertyChangeEvent arg0 )
441 {
442 if( arg0.getPropertyName().equals( WsdlMockOperation.NAME_PROPERTY ) )
443 {
444 int ix = responses.indexOf( arg0.getSource() );
445 fireContentsChanged( this, ix, ix );
446
447 ExtendedComboBoxModel model = (ExtendedComboBoxModel) defaultResponseCombo.getModel();
448 model.setElementAt( arg0.getNewValue(), ix );
449
450 if( model.getSelectedItem().equals( arg0.getOldValue() ) )
451 model.setSelectedItem( arg0.getNewValue() );
452 }
453 }
454
455 public void release()
456 {
457 for( WsdlMockResponse operation : responses )
458 {
459 operation.removePropertyChangeListener( this );
460 }
461
462 getModelItem().getMockService().removeMockServiceListener( this );
463 }
464 }
465
466 private final static class ResponseListCellRenderer extends JLabel implements ListCellRenderer
467 {
468 public Component getListCellRendererComponent(
469 JList list, Object value, int index, boolean isSelected,
470 boolean cellHasFocus
471 )
472 {
473 MockResponse testStep = (MockResponse) value;
474 setText( testStep.getName() );
475 setIcon( testStep.getIcon() );
476
477 if( isSelected )
478 {
479 setBackground( list.getSelectionBackground() );
480 setForeground( list.getSelectionForeground() );
481 }
482 else
483 {
484 setBackground( list.getBackground() );
485 setForeground( list.getForeground() );
486 }
487
488 setEnabled( list.isEnabled() );
489 setFont( list.getFont() );
490 setOpaque( true );
491 setBorder( BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) );
492
493 return this;
494 }
495 }
496
497 }