/* * 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.security.ui; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.model.security.SecurityParametersTableModel; import com.eviware.soapui.model.testsuite.TestProperty; import com.eviware.soapui.security.actions.CloneParametersAction; import com.eviware.soapui.security.scan.AbstractSecurityScanWithProperties; import com.eviware.soapui.security.scan.BoundarySecurityScan; import com.eviware.soapui.security.scan.InvalidTypesSecurityScan; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.action.swing.DefaultActionList; import com.eviware.soapui.support.components.JUndoableTextArea; import com.eviware.soapui.support.components.JUndoableTextField; import com.eviware.soapui.support.components.JXToolBar; import com.eviware.soapui.support.swing.JTableFactory; import com.eviware.x.form.XFormDialog; import com.eviware.x.form.XFormField; import com.eviware.x.form.XFormFieldListener; import com.eviware.x.form.support.ADialogBuilder; import com.eviware.x.form.support.AField; import com.eviware.x.form.support.AField.AFieldType; import com.eviware.x.form.support.AForm; import com.eviware.x.impl.swing.JComboBoxFormField; import com.eviware.x.impl.swing.JFormDialog; import com.eviware.x.impl.swing.JTextFieldFormField; import com.eviware.x.impl.swing.SwingXFormDialog; import org.jdesktop.swingx.JXTable; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.DefaultListSelectionModel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableColumn; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @SuppressWarnings("serial") public class SecurityCheckedParametersTablePanel extends JPanel implements ListSelectionListener { protected static final int LABEL_NAME_COLUMN_WIDTH = 120; protected static final int ENABLE_COLUMN_WIDTH = 70; static final String CHOOSE_TEST_PROPERTY = "Choose Test Property"; protected SecurityParametersTableModel model; protected JXToolBar toolbar; protected JXTable table; protected Map<String, TestProperty> properties; protected DefaultActionList actionList; protected JUndoableTextArea pathPane; protected XFormDialog dialog; protected AbstractSecurityScanWithProperties securityScan; public SecurityCheckedParametersTablePanel(SecurityParametersTableModel model, Map<String, TestProperty> properties, AbstractSecurityScanWithProperties securityCheck) { this.securityScan = securityCheck; this.model = model; initRequestPartProperties(properties); init(); defineColumnWidth(); setPreferredSize(new Dimension(100, 100)); } private void initRequestPartProperties(Map<String, TestProperty> properties) { this.properties = new HashMap<String, TestProperty>(); for (Map.Entry<String, TestProperty> entry : properties.entrySet()) { if (properties.get(entry.getKey()).isRequestPart()) { this.properties.put(entry.getKey(), entry.getValue()); } } } protected void init() { setLayout(new BorderLayout()); toolbar = UISupport.createToolbar(); toolbar.add(UISupport.createToolbarButton(new AddNewParameterAction())); toolbar.add(UISupport.createToolbarButton(new RemoveParameterAction())); toolbar.add(UISupport.createToolbarButton(new CopyParameterAction())); toolbar.add(UISupport.createToolbarButton(new CloneParametersAction(securityScan))); toolbar.addGlue(); add(toolbar, BorderLayout.NORTH); table = JTableFactory.getInstance().makeJXTable(model); table.getSelectionModel().addListSelectionListener(this); defineColumnWidth(); table.setDefaultEditor(String.class, getDefaultCellEditor()); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); pathPane = new JUndoableTextArea(); if (securityScan instanceof BoundarySecurityScan) { ((BoundarySecurityScan) securityScan).refreshRestrictionLabel(-1); } if (securityScan instanceof InvalidTypesSecurityScan) { ((InvalidTypesSecurityScan) securityScan).refreshRestrictionLabel(-1); } } /** * */ protected void defineColumnWidth() { // enable column TableColumn col = table.getColumnModel().getColumn(3); col.setMaxWidth(ENABLE_COLUMN_WIDTH); col.setPreferredWidth(ENABLE_COLUMN_WIDTH); col.setMinWidth(ENABLE_COLUMN_WIDTH); // label col = table.getColumnModel().getColumn(0); col.setMaxWidth(LABEL_NAME_COLUMN_WIDTH); col.setPreferredWidth(LABEL_NAME_COLUMN_WIDTH); col.setMinWidth(LABEL_NAME_COLUMN_WIDTH); // name col = table.getColumnModel().getColumn(1); col.setMaxWidth(LABEL_NAME_COLUMN_WIDTH); col.setPreferredWidth(LABEL_NAME_COLUMN_WIDTH); col.setMinWidth(LABEL_NAME_COLUMN_WIDTH); } /** * this will return cell editor when editing xpath * * @return */ protected TableCellEditor getDefaultCellEditor() { return new XPathCellRender(); } public XFormDialog getDialog() { return dialog; } /* * Creates dialog */ protected XFormDialog createAddParameterDialog() { actionList = new DefaultActionList(); AddAction addAction = new AddAction(); actionList.addAction(addAction, true); AddAndCopy addAndCopy = new AddAndCopy(); actionList.addAction(addAndCopy); Close closeAction = new Close(); actionList.addAction(closeAction); dialog = ADialogBuilder.buildDialog(AddParameterDialog.class, actionList, false); dialog.getFormField(AddParameterDialog.PATH).setProperty("component", buildPathSelector()); closeAction.setDialog(dialog); addAction.setDialog(dialog); addAndCopy.setDialog(dialog); final JTextFieldFormField labelField = (JTextFieldFormField) dialog.getFormField(AddParameterDialog.LABEL); labelField.getComponent().setColumns(30); labelField.setEnabled(false); JComboBoxFormField nameField = (JComboBoxFormField) dialog.getFormField(AddParameterDialog.NAME); enablePathField(false); nameField.addFormFieldListener(new XFormFieldListener() { @Override public void valueChanged(XFormField sourceField, String newValue, String oldValue) { if (!newValue.equals(CHOOSE_TEST_PROPERTY)) { labelField.setEnabled(true); enablePathField(true); } else { labelField.setEnabled(false); enablePathField(false); } } }); ArrayList<String> options = new ArrayList<String>(); options.add(CHOOSE_TEST_PROPERTY); options.addAll(properties.keySet()); nameField.setOptions(options.toArray(new String[0])); ((JFormDialog) dialog).getDialog().setResizable(false); return dialog; } protected JPanel buildPathSelector() { JPanel sourcePanel = new JPanel(new BorderLayout()); sourcePanel.add(new JScrollPane(pathPane), BorderLayout.CENTER); sourcePanel.setBorder(BorderFactory.createEmptyBorder(0, 3, 3, 3)); return sourcePanel; } /** * @param pathField */ protected void enablePathField(boolean enable) { pathPane.setEnabled(enable); } class AddNewParameterAction extends AbstractAction { public AddNewParameterAction() { putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add.png")); putValue(Action.SHORT_DESCRIPTION, "Adds a parameter to security scan"); } @Override public void actionPerformed(ActionEvent arg0) { XFormDialog dialog = createAddParameterDialog(); dialog.show(); model.fireTableDataChanged(); } } class RemoveParameterAction extends AbstractAction { public RemoveParameterAction() { putValue(Action.SMALL_ICON, UISupport.createImageIcon("/delete.png")); putValue(Action.SHORT_DESCRIPTION, "Removes parameter from security scan"); } @Override public void actionPerformed(ActionEvent e) { model.removeRows(table.getSelectedRows()); model.fireTableDataChanged(); } } public class AddAndCopy extends AbstractAction { private XFormDialog dialog; public AddAndCopy() { super("Add&Copy"); } public void setDialog(XFormDialog dialog) { this.dialog = dialog; } @Override public void actionPerformed(ActionEvent e) { if (dialog.getValue(AddParameterDialog.LABEL) == null || dialog.getValue(AddParameterDialog.LABEL).trim().length() == 0) { UISupport.showErrorMessage("Label is required!"); } else { if (!model.addParameter(dialog.getValue(AddParameterDialog.LABEL), dialog.getValue(AddParameterDialog.NAME), pathPane.getText())) { UISupport.showErrorMessage("Label have to be unique!"); } } } } private class Close extends AbstractAction { private XFormDialog dialog; public Close() { super("Close"); } public void setDialog(XFormDialog dialog) { this.dialog = dialog; } @Override public void actionPerformed(ActionEvent e) { if (dialog != null) { ((SwingXFormDialog) dialog).setReturnValue(XFormDialog.CANCEL_OPTION); JComboBoxFormField nameField = (JComboBoxFormField) dialog.getFormField(AddParameterDialog.NAME); nameField.setSelectedOptions(new Object[]{nameField.getOptions()[0]}); dialog.setValue(AddParameterDialog.LABEL, ""); pathPane.setText(""); dialog.setVisible(false); } } } class CopyParameterAction extends AbstractAction { public CopyParameterAction() { putValue(Action.SMALL_ICON, UISupport.createImageIcon("/copy.png")); putValue(Action.SHORT_DESCRIPTION, "Copies parameter"); } @Override public void actionPerformed(ActionEvent e) { if (table.getSelectedRow() > -1) { XFormDialog dialog = createAddParameterDialog(); int row = table.getSelectedRow(); initDialogForCopy(dialog, row); dialog.show(); model.fireTableDataChanged(); } } } private void initDialogForCopy(XFormDialog dialog, int row) { dialog.setValue(AddParameterDialog.LABEL, (String) model.getValueAt(row, 0)); dialog.setValue(AddParameterDialog.NAME, (String) model.getValueAt(row, 1)); pathPane.setText((String) model.getValueAt(row, 2)); } public JUndoableTextArea getPathPane() { return pathPane; } private class AddAction extends AbstractAction { private XFormDialog dialog; public AddAction() { super("Add"); } public void setDialog(XFormDialog dialog) { this.dialog = dialog; } @Override public void actionPerformed(ActionEvent arg0) { if (dialog.getValue(AddParameterDialog.LABEL) == null || dialog.getValue(AddParameterDialog.LABEL).trim().length() == 0) { UISupport.showErrorMessage("Label is required!"); } else { if (model.addParameter(dialog.getValue(AddParameterDialog.LABEL), dialog.getValue(AddParameterDialog.NAME), pathPane.getText())) { JComboBoxFormField nameField = (JComboBoxFormField) dialog.getFormField(AddParameterDialog.NAME); nameField.setSelectedOptions(new Object[]{nameField.getOptions()[0]}); dialog.setValue(AddParameterDialog.LABEL, ""); pathPane.setText(""); } else { UISupport.showErrorMessage("Label have to be unique!"); } } } } public JUndoableTextField getLabel() { return ((JTextFieldFormField) dialog.getFormField(AddParameterDialog.LABEL)).getComponent(); } @AForm(description = "Add New Security Test Step Parameter", name = "Configure Security Test Step Parameters", helpUrl = HelpUrls.SECURITY_SCANS_OVERVIEW) interface AddParameterDialog { @AField(description = "Parameter Name", name = "Parameter Name", type = AFieldType.ENUMERATION) static String NAME = "Parameter Name"; @AField(description = "Parameter Label", name = "Parameter Label", type = AFieldType.STRING) static String LABEL = "Parameter Label"; @AField(description = "Parameter XPath", name = "XPath", type = AFieldType.COMPONENT) static String PATH = "XPath"; } /* * (non-Javadoc) * * @see * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event * .ListSelectionEvent) */ @Override public void valueChanged(ListSelectionEvent lse) { DefaultListSelectionModel dlsm = ((DefaultListSelectionModel) lse.getSource()); if (securityScan instanceof BoundarySecurityScan) { ((BoundarySecurityScan) securityScan).refreshRestrictionLabel(dlsm.getAnchorSelectionIndex()); } if (securityScan instanceof InvalidTypesSecurityScan) { ((InvalidTypesSecurityScan) securityScan).refreshRestrictionLabel(dlsm.getAnchorSelectionIndex()); } } }