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.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       // init data
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 }