/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.panels.loadtest; import com.eviware.soapui.analytics.Analytics; import com.eviware.soapui.analytics.SoapUIActions; import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction; import com.eviware.soapui.impl.wsdl.loadtest.LoadTestAssertion; import com.eviware.soapui.impl.wsdl.loadtest.LoadTestListener; import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest; import com.eviware.soapui.impl.wsdl.loadtest.assertions.LoadTestAssertionRegistry; import com.eviware.soapui.impl.wsdl.support.Configurable; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.components.JXToolBar; import com.eviware.soapui.support.swing.JTableFactory; import org.jdesktop.swingx.JXTable; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumnModel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; /** * Table showing configured assertions for a WsdlLoadTest * * @author Ole.Matzura * @todo add popup menu */ public class JLoadTestAssertionsTable extends JPanel { private JXTable table; private final WsdlLoadTest loadTest; private ConfigureAssertionAction configureAssertionAction; private RemoveAssertionAction removeAssertionAction; private AddLoadTestAssertionAction addLoadTestAssertionAction; private LoadTestAssertionsTableModel tableModel; private JPopupMenu assertionPopup; private InternalLoadTestListener internalLoadTestListener = new InternalLoadTestListener(); public JLoadTestAssertionsTable(WsdlLoadTest wsdlLoadTest) { super(new BorderLayout()); this.loadTest = wsdlLoadTest; loadTest.addLoadTestListener(internalLoadTestListener); tableModel = new LoadTestAssertionsTableModel(); table = JTableFactory.getInstance().makeJXTable(tableModel); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); TableColumnModel columnModel = table.getColumnModel(); columnModel.getColumn(0).setMaxWidth(16); columnModel.getColumn(0).setCellRenderer(new IconTableCellRenderer()); columnModel.getColumn(1).setPreferredWidth(100); columnModel.getColumn(2).setPreferredWidth(100); columnModel.getColumn(3).setPreferredWidth(200); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() < 2) { return; } int ix = table.getSelectedRow(); if (ix == -1) { return; } ix = table.convertRowIndexToModel(ix); Object obj = loadTest.getAssertionAt(ix); if (obj instanceof Configurable) { ((Configurable) obj).configure(); } else { Toolkit.getDefaultToolkit().beep(); } } }); add(buildToolbar(), BorderLayout.NORTH); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int ix = table.getSelectedRow(); configureAssertionAction.setEnabled(ix >= 0); removeAssertionAction.setEnabled(ix >= 0); if (ix == -1) { return; } ix = table.convertRowIndexToModel(ix); configureAssertionAction.setEnabled(loadTest.getAssertionAt(ix) instanceof Configurable); } }); assertionPopup = new JPopupMenu(); assertionPopup.add(configureAssertionAction); assertionPopup.addSeparator(); assertionPopup.add(addLoadTestAssertionAction); assertionPopup.add(removeAssertionAction); setComponentPopupMenu(assertionPopup); scrollPane.setInheritsPopupMenu(true); table.setComponentPopupMenu(assertionPopup); } public void release() { tableModel.release(); loadTest.removeLoadTestListener(internalLoadTestListener); } private JComponent buildToolbar() { configureAssertionAction = new ConfigureAssertionAction(); removeAssertionAction = new RemoveAssertionAction(); addLoadTestAssertionAction = new AddLoadTestAssertionAction(); JXToolBar toolbar = UISupport.createSmallToolbar(); JButton button = UISupport.createToolbarButton(addLoadTestAssertionAction); toolbar.addFixed(button); button = UISupport.createToolbarButton(removeAssertionAction); toolbar.addFixed(button); button = UISupport.createToolbarButton(configureAssertionAction); toolbar.addFixed(button); toolbar.addGlue(); toolbar.add(new ShowOnlineHelpAction(HelpUrls.LOADTEST_ASSERTIONS_URL)); return toolbar; } private class LoadTestAssertionsTableModel extends AbstractTableModel implements PropertyChangeListener { public LoadTestAssertionsTableModel() { for (int c = 0; c < loadTest.getAssertionCount(); c++) { loadTest.getAssertionAt(c).addPropertyChangeListener(LoadTestAssertion.CONFIGURATION_PROPERTY, this); } } public void release() { for (int c = 0; c < loadTest.getAssertionCount(); c++) { loadTest.getAssertionAt(c).removePropertyChangeListener(LoadTestAssertion.CONFIGURATION_PROPERTY, this); } } public int getRowCount() { return loadTest.getAssertionCount(); } public int getColumnCount() { return 4; } public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return ImageIcon.class; default: return String.class; } } public String getColumnName(int column) { switch (column) { case 0: return " "; case 1: return "Name"; case 2: return "Step"; case 3: return "Details"; } return null; } public Object getValueAt(int rowIndex, int columnIndex) { LoadTestAssertion assertion = loadTest.getAssertionAt(rowIndex); switch (columnIndex) { case 0: return assertion.getIcon(); case 1: return assertion.getName(); case 2: return assertion.getTargetStep(); case 3: return assertion.getDescription(); } return null; } public void assertionRemoved(LoadTestAssertion assertion) { assertion.removePropertyChangeListener(LoadTestAssertion.CONFIGURATION_PROPERTY, this); fireTableDataChanged(); } public void assertionAdded(LoadTestAssertion assertion) { assertion.addPropertyChangeListener(LoadTestAssertion.CONFIGURATION_PROPERTY, this); fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1); } public void propertyChange(PropertyChangeEvent evt) { fireTableDataChanged(); } } private static final class IconTableCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value != null) { setIcon((Icon) value); } if (isSelected) { setBackground(table.getSelectionBackground()); setForeground(table.getSelectionForeground()); } else { setBackground(table.getBackground()); setForeground(table.getForeground()); } return this; } } public class AddLoadTestAssertionAction extends AbstractAction { public AddLoadTestAssertionAction() { super("Add Assertion"); putValue(Action.SHORT_DESCRIPTION, "Adds an assertion to this LoadTest"); putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add.png")); } public void actionPerformed(ActionEvent e) { String[] types = LoadTestAssertionRegistry.getAvailableAssertions(); String type = (String) UISupport.prompt("Select assertion type to add", "Add Assertion", types); if (type != null) { loadTest.addAssertion(type, LoadTestAssertion.ANY_TEST_STEP, true); Analytics.trackAction(SoapUIActions.ADD_LOAD_TEST_ASSERTION.getActionName()); } } } public class ConfigureAssertionAction extends AbstractAction { ConfigureAssertionAction() { super("Configure"); putValue(Action.SHORT_DESCRIPTION, "Configures the selection assertion"); putValue(Action.SMALL_ICON, UISupport.createImageIcon("/preferences.png")); setEnabled(false); } public void actionPerformed(ActionEvent e) { int ix = table.getSelectedRow(); if (ix == -1) { return; } ix = table.convertRowIndexToModel(ix); Object obj = loadTest.getAssertionAt(ix); if (obj instanceof Configurable) { ((Configurable) obj).configure(); tableModel.fireTableRowsUpdated(ix, ix); } else { Toolkit.getDefaultToolkit().beep(); } } } public class RemoveAssertionAction extends AbstractAction { public RemoveAssertionAction() { super("Remove Assertion"); putValue(Action.SHORT_DESCRIPTION, "Removes the selected assertion from this LoadTest"); putValue(Action.SMALL_ICON, UISupport.createImageIcon("/remove_assertion.gif")); setEnabled(false); } public void actionPerformed(ActionEvent e) { int ix = table.getSelectedRow(); if (ix == -1) { return; } ix = table.convertRowIndexToModel(ix); LoadTestAssertion assertion = loadTest.getAssertionAt(ix); if (UISupport.confirm("Remove assertion [" + assertion.getName() + "]", "Remove Assertion")) { loadTest.removeAssertion(assertion); } } } public class InternalLoadTestListener implements LoadTestListener { public void assertionAdded(LoadTestAssertion assertion) { tableModel.assertionAdded(assertion); table.getSelectionModel().setSelectionInterval(tableModel.getRowCount() - 1, tableModel.getRowCount() - 1); } public void assertionRemoved(LoadTestAssertion assertion) { tableModel.assertionRemoved(assertion); } } }