1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.loadtest;
14
15 import java.awt.BorderLayout;
16 import java.awt.Component;
17 import java.awt.Toolkit;
18 import java.awt.event.ActionEvent;
19 import java.awt.event.MouseAdapter;
20 import java.awt.event.MouseEvent;
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23
24 import javax.swing.AbstractAction;
25 import javax.swing.Action;
26 import javax.swing.Icon;
27 import javax.swing.ImageIcon;
28 import javax.swing.JButton;
29 import javax.swing.JComponent;
30 import javax.swing.JPanel;
31 import javax.swing.JPopupMenu;
32 import javax.swing.JScrollPane;
33 import javax.swing.JTable;
34 import javax.swing.ListSelectionModel;
35 import javax.swing.event.ListSelectionEvent;
36 import javax.swing.event.ListSelectionListener;
37 import javax.swing.table.AbstractTableModel;
38 import javax.swing.table.DefaultTableCellRenderer;
39 import javax.swing.table.TableColumnModel;
40
41 import org.jdesktop.swingx.JXTable;
42
43 import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
44 import com.eviware.soapui.impl.wsdl.loadtest.LoadTestAssertion;
45 import com.eviware.soapui.impl.wsdl.loadtest.LoadTestListener;
46 import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest;
47 import com.eviware.soapui.impl.wsdl.loadtest.assertions.LoadTestAssertionRegistry;
48 import com.eviware.soapui.impl.wsdl.support.Configurable;
49 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
50 import com.eviware.soapui.support.UISupport;
51 import com.eviware.soapui.support.components.JXToolBar;
52
53 /***
54 * Table showing configured assertions for a WsdlLoadTest
55 *
56 * @todo add popup menu
57 *
58 * @author Ole.Matzura
59 */
60
61 public class JLoadTestAssertionsTable extends JPanel
62 {
63 private JXTable table;
64 private final WsdlLoadTest loadTest;
65 private ConfigureAssertionAction configureAssertionAction;
66 private RemoveAssertionAction removeAssertionAction;
67 private AddLoadTestAssertionAction addLoadTestAssertionAction;
68 private LoadTestAssertionsTableModel tableModel;
69 private JPopupMenu assertionPopup;
70 private InternalLoadTestListener internalLoadTestListener = new InternalLoadTestListener();
71
72 public JLoadTestAssertionsTable( WsdlLoadTest wsdlLoadTest )
73 {
74 super( new BorderLayout() );
75 this.loadTest = wsdlLoadTest;
76
77 loadTest.addLoadTestListener( internalLoadTestListener );
78
79 tableModel = new LoadTestAssertionsTableModel();
80 table = new JXTable( tableModel );
81 table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
82
83 TableColumnModel columnModel = table.getColumnModel();
84 columnModel.getColumn( 0 ).setMaxWidth( 16 );
85 columnModel.getColumn( 0 ).setCellRenderer( new IconTableCellRenderer() );
86 columnModel.getColumn( 1 ).setPreferredWidth( 100 );
87 columnModel.getColumn( 2 ).setPreferredWidth( 100 );
88 columnModel.getColumn( 3 ).setPreferredWidth( 200 );
89
90 JScrollPane scrollPane = new JScrollPane(table);
91 add( scrollPane, BorderLayout.CENTER );
92
93 table.addMouseListener( new MouseAdapter() {
94
95 public void mouseClicked(MouseEvent e)
96 {
97 if( e.getClickCount() < 2 ) return;
98
99 int ix = table.getSelectedRow();
100 if( ix == -1 ) return;
101 ix = table.convertRowIndexToModel( ix );
102
103 Object obj = loadTest.getAssertionAt( ix );
104 if( obj instanceof Configurable )
105 {
106 ((Configurable)obj).configure();
107 }
108 else Toolkit.getDefaultToolkit().beep();
109 }});
110
111 add( buildToolbar(), BorderLayout.NORTH );
112
113 table.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
114
115 public void valueChanged(ListSelectionEvent e)
116 {
117 int ix = table.getSelectedRow();
118
119 configureAssertionAction.setEnabled( ix >= 0 );
120 removeAssertionAction.setEnabled( ix >= 0 );
121
122 if( ix == -1 ) return;
123
124 ix = table.convertRowIndexToModel( ix );
125 configureAssertionAction.setEnabled( loadTest.getAssertionAt( ix ) instanceof Configurable );
126 }} );
127
128
129 assertionPopup = new JPopupMenu();
130 assertionPopup.add( configureAssertionAction );
131 assertionPopup.addSeparator();
132 assertionPopup.add( addLoadTestAssertionAction );
133 assertionPopup.add( removeAssertionAction );
134
135 setComponentPopupMenu( assertionPopup );
136
137 scrollPane.setInheritsPopupMenu( true );
138 table.setComponentPopupMenu( assertionPopup );
139 }
140
141 public void release()
142 {
143 tableModel.release();
144 loadTest.removeLoadTestListener( internalLoadTestListener );
145 }
146
147 private JComponent buildToolbar()
148 {
149 configureAssertionAction = new ConfigureAssertionAction();
150 removeAssertionAction = new RemoveAssertionAction();
151 addLoadTestAssertionAction = new AddLoadTestAssertionAction();
152
153 JXToolBar toolbar = UISupport.createToolbar();
154
155 JButton button = UISupport.createToolbarButton( addLoadTestAssertionAction );
156 button.setText(null);
157 toolbar.addFixed( button);
158 button = UISupport.createToolbarButton( removeAssertionAction );
159 button.setText(null);
160 toolbar.addFixed( button);
161 button = UISupport.createToolbarButton( configureAssertionAction );
162 button.setText(null);
163 toolbar.addFixed( button);
164 toolbar.addGlue();
165 toolbar.add( new ShowOnlineHelpAction( HelpUrls.LOADTEST_ASSERTIONS_URL ));
166
167 return toolbar;
168 }
169
170 private class LoadTestAssertionsTableModel extends AbstractTableModel implements PropertyChangeListener
171 {
172 public LoadTestAssertionsTableModel()
173 {
174 for( int c = 0; c < loadTest.getAssertionCount(); c++ )
175 {
176 loadTest.getAssertionAt( c ).addPropertyChangeListener( LoadTestAssertion.CONFIGURATION_PROPERTY, this );
177 }
178 }
179
180 public void release()
181 {
182 for( int c = 0; c < loadTest.getAssertionCount(); c++ )
183 {
184 loadTest.getAssertionAt( c ).removePropertyChangeListener( LoadTestAssertion.CONFIGURATION_PROPERTY, this );
185 }
186 }
187
188 public int getRowCount()
189 {
190 return loadTest.getAssertionCount();
191 }
192
193 public int getColumnCount()
194 {
195 return 4;
196 }
197
198 public Class<?> getColumnClass(int columnIndex)
199 {
200 switch( columnIndex )
201 {
202 case 0 : return ImageIcon.class;
203 default : return String.class;
204 }
205 }
206
207 public String getColumnName(int column)
208 {
209 switch( column )
210 {
211 case 0 : return " ";
212 case 1 : return "Name";
213 case 2 : return "Step";
214 case 3 : return "Details";
215 }
216
217 return null;
218 }
219
220 public Object getValueAt(int rowIndex, int columnIndex)
221 {
222 LoadTestAssertion assertion = loadTest.getAssertionAt( rowIndex );
223
224 switch( columnIndex )
225 {
226 case 0 : return assertion.getIcon();
227 case 1 : return assertion.getName();
228 case 2 : return assertion.getTargetStep();
229 case 3 : return assertion.getDescription();
230 }
231
232 return null;
233 }
234
235 public void assertionRemoved(LoadTestAssertion assertion)
236 {
237 assertion.removePropertyChangeListener( LoadTestAssertion.CONFIGURATION_PROPERTY, this );
238 fireTableDataChanged();
239 }
240
241 public void assertionAdded(LoadTestAssertion assertion)
242 {
243 assertion.addPropertyChangeListener( LoadTestAssertion.CONFIGURATION_PROPERTY, this );
244 fireTableRowsInserted( getRowCount()-1, getRowCount()-1 );
245 }
246
247 public void propertyChange(PropertyChangeEvent evt)
248 {
249 fireTableDataChanged();
250 }
251 }
252
253 private static final class IconTableCellRenderer extends DefaultTableCellRenderer
254 {
255 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
256 {
257 if( value != null )
258 setIcon( (Icon) value );
259
260 if (isSelected)
261 {
262 setBackground(table.getSelectionBackground());
263 setForeground(table.getSelectionForeground());
264 }
265 else
266 {
267 setBackground(table.getBackground());
268 setForeground(table.getForeground());
269 }
270
271 return this;
272 }
273 }
274
275 public class AddLoadTestAssertionAction extends AbstractAction
276 {
277 public AddLoadTestAssertionAction()
278 {
279 super( "Add Assertion" );
280 putValue( Action.SHORT_DESCRIPTION, "Adds an assertion to this LoadTest" );
281 putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/addAssertion.gif" ));
282 }
283
284 public void actionPerformed( ActionEvent e )
285 {
286 String [] types = LoadTestAssertionRegistry.getAvailableAssertions();
287 String type = (String) UISupport.prompt( "Select assertion type to add", "Add Assertion", types );
288 if( type != null )
289 {
290 loadTest.addAssertion( type, LoadTestAssertion.ANY_TEST_STEP, true );
291 }
292 }
293 }
294
295 public class ConfigureAssertionAction extends AbstractAction
296 {
297 ConfigureAssertionAction()
298 {
299 super( "Configure" );
300 putValue( Action.SHORT_DESCRIPTION, "Configures the selection assertion" );
301 putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/options.gif" ));
302 setEnabled( false );
303 }
304
305 public void actionPerformed( ActionEvent e )
306 {
307 int ix = table.getSelectedRow();
308 if( ix == -1 ) return;
309 ix = table.convertRowIndexToModel( ix );
310
311 Object obj = loadTest.getAssertionAt( ix );
312 if( obj instanceof Configurable )
313 {
314 ((Configurable)obj).configure();
315 tableModel.fireTableRowsUpdated( ix, ix );
316 }
317 else Toolkit.getDefaultToolkit().beep();
318 }
319 }
320
321 public class RemoveAssertionAction extends AbstractAction
322 {
323 public RemoveAssertionAction()
324 {
325 super( "Remove Assertion" );
326 putValue( Action.SHORT_DESCRIPTION, "Removes the selected assertion from this LoadTest" );
327 putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/remove_assertion.gif" ));
328 setEnabled( false );
329 }
330
331 public void actionPerformed( ActionEvent e )
332 {
333 int ix = table.getSelectedRow();
334 if( ix == -1 ) return;
335 ix = table.convertRowIndexToModel( ix );
336
337 LoadTestAssertion assertion = loadTest.getAssertionAt( ix );
338 if( UISupport.confirm( "Remove assertion [" + assertion.getName() + "]", "Remove Assertion"))
339 {
340 loadTest.removeAssertion( assertion );
341 }
342 }
343 }
344
345 public class InternalLoadTestListener implements LoadTestListener
346 {
347 public void assertionAdded(LoadTestAssertion assertion)
348 {
349 tableModel.assertionAdded( assertion );
350 table.getSelectionModel().setSelectionInterval( tableModel.getRowCount()-1, tableModel.getRowCount()-1 );
351 }
352
353 public void assertionRemoved(LoadTestAssertion assertion)
354 {
355 tableModel.assertionRemoved( assertion );
356 }
357 }
358 }