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