/* * 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.actions; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.project.Project; import com.eviware.soapui.model.security.SecurityCheckedParameter; import com.eviware.soapui.model.support.ModelSupport; import com.eviware.soapui.model.testsuite.TestCase; import com.eviware.soapui.model.testsuite.TestStep; import com.eviware.soapui.model.testsuite.TestSuite; import com.eviware.soapui.security.SecurityTest; import com.eviware.soapui.security.scan.AbstractSecurityScan; import com.eviware.soapui.security.scan.AbstractSecurityScanWithProperties; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.action.swing.DefaultActionList; import com.eviware.x.form.XFormDialog; import com.eviware.x.form.XFormField; import com.eviware.x.form.XFormFieldListener; import com.eviware.x.form.XFormOptionsField; 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.form.support.XFormMultiSelectList; import com.eviware.x.impl.swing.JFormDialog; import com.eviware.x.impl.swing.SwingXFormDialog; import javax.swing.AbstractAction; import javax.swing.Action; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; public class CloneParametersAction extends AbstractAction { private XFormDialog dialog; protected DefaultActionList actionList; private AbstractSecurityScanWithProperties securityScan; public CloneParametersAction() { super("Clone SecurityScan Parameters"); putValue(Action.SMALL_ICON, UISupport.createImageIcon("/clone_parameters.png")); putValue(Action.SHORT_DESCRIPTION, "Clones parameter"); setEnabled(false); } public CloneParametersAction(AbstractSecurityScanWithProperties securityScan) { super("Clone SecurityScan Parameters"); putValue(Action.SMALL_ICON, UISupport.createImageIcon("/clone_parameters.png")); putValue(Action.SHORT_DESCRIPTION, "Clones parameter"); this.securityScan = securityScan; } @Override public void actionPerformed(ActionEvent e) { XFormDialog dialog = createCloneParameterDialog(); dialog.show(); // model.fireTableDataChanged(); } public void setSecurityScan(AbstractSecurityScanWithProperties securityScan) { this.securityScan = securityScan; } private class OkAction extends AbstractAction { private XFormDialog dialog; public OkAction() { super("OK"); } public void setDialog(XFormDialog dialog) { this.dialog = dialog; } @Override public void actionPerformed(ActionEvent arg0) { if (dialog != null) { ((SwingXFormDialog) dialog).setReturnValue(XFormDialog.OK_OPTION); List<ModelItem> items = performClone(true); UISupport.showInfoMessage("Updated " + items.size() + " scans"); dialog.setVisible(false); } } } private String[] getSecurableTestStepsNames(TestCase testCase) { List<TestStep> testStepList = testCase.getTestStepList(); List<String> namesList = new ArrayList<String>(); for (TestStep testStep : testStepList) { if (AbstractSecurityScan.isSecurable(testStep)) { namesList.add(testStep.getName()); } } String[] names = new String[namesList.size()]; for (int c = 0; c < namesList.size(); c++) { names[c] = namesList.get(c); } return names; } public List<ModelItem> performClone(boolean showErrorMessage) { List<ModelItem> items = new ArrayList<ModelItem>(); String targetTestSuiteName = dialog.getValue(CloneParameterDialog.TARGET_TESTSUITE); String targetTestCaseName = dialog.getValue(CloneParameterDialog.TARGET_TESTCASE); String targetSecurityTestName = dialog.getValue(CloneParameterDialog.TARGET_SECURITYTEST); String targetSecurityTestStepName = dialog.getValue(CloneParameterDialog.TARGET_TESTSTEP); String[] targetSecurityScans = StringUtils.toStringArray(((XFormMultiSelectList) dialog .getFormField(CloneParameterDialog.TARGET_SECURITYSCAN)).getSelectedOptions()); if (targetSecurityScans.length == 0) { if (showErrorMessage) { UISupport.showErrorMessage("No SecurityScans selected.."); } return items; } int[] indexes = ((XFormOptionsField) dialog.getFormField(CloneParameterDialog.PARAMETERS)) .getSelectedIndexes(); if (indexes.length == 0) { if (showErrorMessage) { UISupport.showErrorMessage("No Parameters selected.."); } return items; } Project project = securityScan.getTestStep().getTestCase().getTestSuite().getProject(); TestSuite targetTestSuite = project.getTestSuiteByName(targetTestSuiteName); TestCase targetTestCase = targetTestSuite.getTestCaseByName(targetTestCaseName); SecurityTest targetSecurityTest = targetTestCase.getSecurityTestByName(targetSecurityTestName); TestStep targetTestStep = targetTestCase.getTestStepByName(targetSecurityTestStepName); boolean overwrite = dialog.getBooleanValue(CloneParameterDialog.OVERWRITE); for (String scanName : targetSecurityScans) { AbstractSecurityScanWithProperties targetSecurityScan = (AbstractSecurityScanWithProperties) targetSecurityTest .getTestStepSecurityScanByName(targetTestStep.getId(), scanName); for (int i : indexes) { SecurityCheckedParameter scanParameter = securityScan.getParameterAt(i); String newParameterLabel = scanParameter.getLabel(); if (securityScan.getParameterByLabel(scanParameter.getLabel()) != null) { if (securityScan.equals(targetSecurityScan)) { newParameterLabel = "Copy of " + scanParameter.getLabel(); } } if (targetSecurityScan.importParameter(scanParameter, overwrite, newParameterLabel) && !items.contains(targetSecurityScan)) { items.add(targetSecurityScan); } } } return items; } private class CancelAction extends AbstractAction { private XFormDialog dialog; public CancelAction() { super("Cancel"); } public void setDialog(XFormDialog dialog) { this.dialog = dialog; } @Override public void actionPerformed(ActionEvent arg0) { if (dialog != null) { ((SwingXFormDialog) dialog).setReturnValue(XFormDialog.CANCEL_OPTION); dialog.setVisible(false); } } } private class ApplyAction extends AbstractAction { private XFormDialog dialog; public ApplyAction() { super("Apply"); } public void setDialog(XFormDialog dialog) { this.dialog = dialog; } @Override public void actionPerformed(ActionEvent arg0) { if (dialog != null) { List<ModelItem> items = performClone(true); UISupport.showInfoMessage("Updated " + items.size() + " scans"); if (items.size() > 0) { ((XFormMultiSelectList) dialog.getFormField(CloneParameterDialog.TARGET_SECURITYSCAN)) .setSelectedOptions(new String[0]); ((XFormMultiSelectList) dialog.getFormField(CloneParameterDialog.PARAMETERS)) .setSelectedOptions(new String[0]); } } } } protected XFormDialog createCloneParameterDialog() { actionList = new DefaultActionList(); OkAction okAction = new OkAction(); actionList.addAction(okAction, true); CancelAction cancelAction = new CancelAction(); actionList.addAction(cancelAction); ApplyAction applyAction = new ApplyAction(); actionList.addAction(applyAction); dialog = ADialogBuilder.buildDialog(CloneParameterDialog.class, actionList, false); okAction.setDialog(dialog); cancelAction.setDialog(dialog); applyAction.setDialog(dialog); final TestCase testCase = securityScan.getTestStep().getTestCase(); final Project project = testCase.getTestSuite().getProject(); dialog.getFormField(CloneParameterDialog.TARGET_TESTSUITE).addFormFieldListener(new XFormFieldListener() { public void valueChanged(XFormField sourceField, String newValue, String oldValue) { TestSuite testSuite = project.getTestSuiteByName(newValue); String[] testCaseNames = ModelSupport.getNames(testSuite.getTestCaseList()); dialog.setOptions(CloneParameterDialog.TARGET_TESTCASE, testCaseNames); if (testCaseNames.length > 0) { dialog.setValue(CloneParameterDialog.TARGET_TESTCASE, testCaseNames[0]); TestCase testCase = testSuite.getTestCaseByName(testCaseNames[0]); String[] testStepNames = new String[0]; String[] securityTestNames = ModelSupport.getNames(testCase.getSecurityTestList()); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYTEST, securityTestNames); if (securityTestNames.length > 0) { testStepNames = getSecurableTestStepsNames(testCase); } dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, testStepNames); if (securityTestNames.length > 0) { dialog.setValue(CloneParameterDialog.TARGET_SECURITYTEST, securityTestNames[0]); if (testStepNames.length > 0) { dialog.setValue(CloneParameterDialog.TARGET_TESTSTEP, testStepNames[0]); } else { dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, new String[0]); } String securityTestName = dialog.getValue(CloneParameterDialog.TARGET_SECURITYTEST); SecurityTest securityTest = testCase.getSecurityTestByName(securityTestName); String testStepName = dialog.getValue(CloneParameterDialog.TARGET_TESTSTEP); TestStep testStep = testCase.getTestStepByName(testStepName); String[] securityScanNames = ModelSupport.getNames(securityTest.getTestStepSecurityScanByType( testStep.getId(), AbstractSecurityScanWithProperties.class)); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, securityScanNames); } else { dialog.setOptions(CloneParameterDialog.TARGET_SECURITYTEST, new String[0]); dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, new String[0]); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, new String[0]); } } else { dialog.setOptions(CloneParameterDialog.TARGET_SECURITYTEST, new String[0]); dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, new String[0]); } } }); dialog.getFormField(CloneParameterDialog.TARGET_TESTCASE).addFormFieldListener(new XFormFieldListener() { public void valueChanged(XFormField sourceField, String newValue, String oldValue) { String testSuiteName = dialog.getValue(CloneParameterDialog.TARGET_TESTSUITE); TestSuite testSuite = project.getTestSuiteByName(testSuiteName); TestCase testCase = testSuite.getTestCaseByName(newValue); String[] testStepNames = new String[0]; String[] securityTestNames = ModelSupport.getNames(testCase.getSecurityTestList()); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYTEST, securityTestNames); if (securityTestNames.length > 0) { testStepNames = getSecurableTestStepsNames(testCase); } dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, testStepNames); if (securityTestNames.length > 0) { dialog.setValue(CloneParameterDialog.TARGET_SECURITYTEST, securityTestNames[0]); if (testStepNames.length > 0) { dialog.setValue(CloneParameterDialog.TARGET_TESTSTEP, testStepNames[0]); } else { dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, new String[0]); } String securityTestName = dialog.getValue(CloneParameterDialog.TARGET_SECURITYTEST); SecurityTest securityTest = testCase.getSecurityTestByName(securityTestName); String testStepName = dialog.getValue(CloneParameterDialog.TARGET_TESTSTEP); TestStep testStep = testCase.getTestStepByName(testStepName); String[] securityScanNames = ModelSupport.getNames(securityTest.getTestStepSecurityScanByType( testStep.getId(), AbstractSecurityScanWithProperties.class)); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, securityScanNames); } else { dialog.setOptions(CloneParameterDialog.TARGET_SECURITYTEST, new String[0]); dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, new String[0]); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, new String[0]); } } }); dialog.getFormField(CloneParameterDialog.TARGET_TESTSTEP).addFormFieldListener(new XFormFieldListener() { public void valueChanged(XFormField sourceField, String newValue, String oldValue) { String testSuiteName = dialog.getValue(CloneParameterDialog.TARGET_TESTSUITE); TestSuite testSuite = project.getTestSuiteByName(testSuiteName); String testCaseName = dialog.getValue(CloneParameterDialog.TARGET_TESTCASE); TestCase testCase = testSuite.getTestCaseByName(testCaseName); String securityTestName = dialog.getValue(CloneParameterDialog.TARGET_SECURITYTEST); SecurityTest securityTest = testCase.getSecurityTestByName(securityTestName); TestStep testStep = testCase.getTestStepByName(newValue); String[] securityScanNames = ModelSupport.getNames(securityTest.getTestStepSecurityScanByType( testStep.getId(), AbstractSecurityScanWithProperties.class)); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, securityScanNames); } }); dialog.getFormField(CloneParameterDialog.TARGET_SECURITYTEST).addFormFieldListener(new XFormFieldListener() { public void valueChanged(XFormField sourceField, String newValue, String oldValue) { String testSuiteName = dialog.getValue(CloneParameterDialog.TARGET_TESTSUITE); TestSuite testSuite = project.getTestSuiteByName(testSuiteName); String testCaseName = dialog.getValue(CloneParameterDialog.TARGET_TESTCASE); TestCase testCase = testSuite.getTestCaseByName(testCaseName); SecurityTest securityTest = testCase.getSecurityTestByName(newValue); String testStepName = dialog.getValue(CloneParameterDialog.TARGET_TESTSTEP); TestStep testStep = testCase.getTestStepByName(testStepName); String[] securityScanNames = ModelSupport.getNames(securityTest.getTestStepSecurityScanByType( testStep.getId(), AbstractSecurityScanWithProperties.class)); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, securityScanNames); } }); WsdlTestCase wsdlTestCase = (WsdlTestCase) securityScan.getTestStep().getTestCase(); dialog.setOptions(CloneParameterDialog.TARGET_TESTSUITE, ModelSupport.getNames(wsdlTestCase.getTestSuite().getProject().getTestSuiteList())); dialog.setValue(CloneParameterDialog.TARGET_TESTSUITE, wsdlTestCase.getTestSuite().getName()); List<TestCase> wsdlTestCaseList = wsdlTestCase.getTestSuite().getTestCaseList(); dialog.setOptions(CloneParameterDialog.TARGET_TESTCASE, ModelSupport.getNames(wsdlTestCaseList)); dialog.setValue(CloneParameterDialog.TARGET_TESTCASE, wsdlTestCase.getName()); dialog.setOptions(CloneParameterDialog.TARGET_TESTSTEP, getSecurableTestStepsNames(wsdlTestCase)); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYTEST, ModelSupport.getNames(wsdlTestCase.getSecurityTestList())); String securityTestName = dialog.getValue(CloneParameterDialog.TARGET_SECURITYTEST); SecurityTest securityTest = wsdlTestCase.getSecurityTestByName(securityTestName); String testStepName = dialog.getValue(CloneParameterDialog.TARGET_TESTSTEP); TestStep testStep = wsdlTestCase.getTestStepByName(testStepName); String[] securityScanNames = ModelSupport.getNames(securityTest.getTestStepSecurityScanByType(testStep.getId(), AbstractSecurityScanWithProperties.class)); dialog.setOptions(CloneParameterDialog.TARGET_SECURITYSCAN, securityScanNames); dialog.setOptions(CloneParameterDialog.PARAMETERS, securityScan.getParameterHolder().getParameterLabels()); ((JFormDialog) dialog).getDialog().setResizable(false); return dialog; } @AForm(description = "Specify target TestSuite/TestCase/Security Test(s)/Security Scan(s) and select Parameters to clone", name = "Clone Parameters", icon = UISupport.TOOL_ICON_PATH, helpUrl = HelpUrls.SECURITY_SCANS_OVERVIEW) private interface CloneParameterDialog { @AField(name = "Parameters", description = "The Parameters to clone", type = AFieldType.MULTILIST) public final static String PARAMETERS = "Parameters"; @AField(name = "Target TestSuite", description = "The target TestSuite for the cloned Parameter(s)", type = AFieldType.ENUMERATION) public final static String TARGET_TESTSUITE = "Target TestSuite"; @AField(name = "Target TestCase", description = "The target TestCase for the cloned Parameter(s)", type = AFieldType.ENUMERATION) public final static String TARGET_TESTCASE = "Target TestCase"; @AField(name = "Target SecurityTest", description = "The target SecurityTest for the cloned Parameter(s)", type = AFieldType.ENUMERATION) public final static String TARGET_SECURITYTEST = "Target SecurityTest"; @AField(name = "Target TestStep", description = "The target TestStep for the cloned Parameter(s)", type = AFieldType.ENUMERATION) public final static String TARGET_TESTSTEP = "Target TestStep"; @AField(name = "Target SecurityScans", description = "The SecurityScans to clone to", type = AFieldType.MULTILIST) public final static String TARGET_SECURITYSCAN = "Target SecurityScans"; @AField(name = "Overwrite", description = "Overwrite existing parameters", type = AFieldType.BOOLEAN) public final static String OVERWRITE = "Overwrite"; } }