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