/* * 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.loadtest.assertions; import com.eviware.soapui.config.LoadTestAssertionConfig; import com.eviware.soapui.impl.wsdl.loadtest.LoadTestAssertion; import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest; import com.eviware.soapui.impl.wsdl.support.Configurable; import com.eviware.soapui.model.support.ModelSupport; import com.eviware.soapui.model.support.TestSuiteListenerAdapter; import com.eviware.soapui.model.testsuite.LoadTestRunContext; import com.eviware.soapui.model.testsuite.LoadTestRunner; import com.eviware.soapui.model.testsuite.TestStep; import com.eviware.soapui.support.UISupport; import org.apache.log4j.Logger; import org.apache.xmlbeans.XmlObject; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ImageIcon; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; /** * Base class for LoadTestAssertions * * @author Ole.Matzura */ public abstract class AbstractLoadTestAssertion implements LoadTestAssertion { private LoadTestAssertionConfig assertionConfig; @SuppressWarnings("unused") private final static Logger log = Logger.getLogger(AbstractLoadTestAssertion.class); private ImageIcon icon; private final WsdlLoadTest loadTest; private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); private String testStepName; private TestStep testStep; private TestStepPropertyChangeListener testStepPropertyChangeListener = new TestStepPropertyChangeListener(); private InternalTestSuiteListener testSuiteListener = new InternalTestSuiteListener(); protected static final String TEST_STEP_ELEMENT = "test-step"; protected static final String TEST_STEP_FIELD = "TestStep"; public AbstractLoadTestAssertion(LoadTestAssertionConfig assertionConfig, WsdlLoadTest loadTest) { this.assertionConfig = assertionConfig; this.loadTest = loadTest; loadTest.getTestCase().getTestSuite().addTestSuiteListener(testSuiteListener); } public void initIcon(String url) { icon = UISupport.createImageIcon(url); } public LoadTestAssertionConfig getConfiguration() { return assertionConfig; } public void updateConfiguration(LoadTestAssertionConfig configuration) { assertionConfig = configuration; } protected void setConfiguration(XmlObject configuration) { XmlObject oldConfig = assertionConfig.getConfiguration(); assertionConfig.setConfiguration(configuration); propertyChangeSupport.firePropertyChange(AbstractLoadTestAssertion.CONFIGURATION_PROPERTY, oldConfig, configuration); } public String getName() { return assertionConfig.isSetName() ? assertionConfig.getName() : assertionConfig.getType(); } public void setName(String name) { String old = getName(); assertionConfig.setName(name); propertyChangeSupport.firePropertyChange(NAME_PROPERTY, old, name); } public WsdlLoadTest getLoadTest() { return loadTest; } public class RenameAssertionAction extends AbstractAction { public RenameAssertionAction() { super("Rename"); putValue(Action.SHORT_DESCRIPTION, "Renames this assertion"); } public void actionPerformed(ActionEvent e) { String name = UISupport.prompt("Specify name for this assertion", "Rename Assertion", AbstractLoadTestAssertion.this.getName()); if (name == null || name.equals(AbstractLoadTestAssertion.this.getName())) { return; } setName(name); } } public class ConfigureAssertionAction extends AbstractAction { public ConfigureAssertionAction() { super("Configure"); putValue(Action.SHORT_DESCRIPTION, "Configures this assertion"); } public void actionPerformed(ActionEvent e) { ((Configurable) AbstractLoadTestAssertion.this).configure(); } } public ImageIcon getIcon() { return icon; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } protected String returnErrorOrFail(String message, int maxErrors, LoadTestRunner testRunner, LoadTestRunContext context) { String propertyKey = getClass().getName() + hashCode(); Long errorCount = (Long) context.getProperty(propertyKey); if (errorCount == null) { errorCount = 1L; } else { errorCount = new Long(errorCount.longValue() + 1); } if (maxErrors >= 0 && errorCount >= maxErrors) { testRunner.fail("Maximum number of errors [" + maxErrors + "] for assertion [" + getName() + "] exceeded"); } context.setProperty(propertyKey, errorCount); return message; } public String getTargetStep() { return testStepName; } public void setTargetStep(String name) { testStepName = name; initTestStep(); } abstract protected void updateConfiguration(); protected boolean targetStepMatches(TestStep testStep) { return testStepName == null || testStepName.equals(ANY_TEST_STEP) || testStep.getName().equals(testStepName); } protected String[] getTargetStepOptions(boolean includeAll) { if (includeAll) { return ModelSupport.getNames(new String[]{ANY_TEST_STEP, ALL_TEST_STEPS}, getLoadTest().getTestCase() .getTestStepList()); } else { return ModelSupport.getNames(new String[]{ANY_TEST_STEP}, getLoadTest().getTestCase().getTestStepList()); } } private void initTestStep() { if (testStep != null) { testStep.removePropertyChangeListener(testStepPropertyChangeListener); } testStep = getLoadTest().getTestCase().getTestStepByName(testStepName); if (testStep != null) { testStep.addPropertyChangeListener(TestStep.NAME_PROPERTY, testStepPropertyChangeListener); } } public void release() { if (testStep != null) { testStep.removePropertyChangeListener(testStepPropertyChangeListener); } loadTest.getTestCase().getTestSuite().removeTestSuiteListener(testSuiteListener); } private final class InternalTestSuiteListener extends TestSuiteListenerAdapter { public void testStepRemoved(TestStep removedTestStep, int index) { if (removedTestStep.getName().equals(testStepName) && removedTestStep.getTestCase() == testStep.getTestCase()) { testStepName = ANY_TEST_STEP; updateConfiguration(); } } } private final class TestStepPropertyChangeListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) { testStepName = evt.getNewValue().toString(); updateConfiguration(); } } }