1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.loadtest.assertions;
14
15 import java.awt.event.ActionEvent;
16 import java.beans.PropertyChangeEvent;
17 import java.beans.PropertyChangeListener;
18 import java.beans.PropertyChangeSupport;
19
20 import javax.swing.AbstractAction;
21 import javax.swing.Action;
22 import javax.swing.ImageIcon;
23
24 import org.apache.log4j.Logger;
25 import org.apache.xmlbeans.XmlObject;
26
27 import com.eviware.soapui.config.LoadTestAssertionConfig;
28 import com.eviware.soapui.impl.wsdl.loadtest.LoadTestAssertion;
29 import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest;
30 import com.eviware.soapui.impl.wsdl.support.Configurable;
31 import com.eviware.soapui.model.support.ModelSupport;
32 import com.eviware.soapui.model.support.TestSuiteListenerAdapter;
33 import com.eviware.soapui.model.testsuite.LoadTestRunContext;
34 import com.eviware.soapui.model.testsuite.LoadTestRunner;
35 import com.eviware.soapui.model.testsuite.TestStep;
36 import com.eviware.soapui.support.UISupport;
37
38 /***
39 * Base class for LoadTestAssertions
40 *
41 * @author Ole.Matzura
42 */
43
44 public abstract class AbstractLoadTestAssertion implements LoadTestAssertion
45 {
46 private LoadTestAssertionConfig assertionConfig;
47 @SuppressWarnings("unused")
48 private final static Logger log = Logger.getLogger( AbstractLoadTestAssertion.class );
49 private ImageIcon icon;
50 private final WsdlLoadTest loadTest;
51 private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( this );
52 private String testStepName;
53 private TestStep testStep;
54 private TestStepPropertyChangeListener testStepPropertyChangeListener = new TestStepPropertyChangeListener();
55 private InternalTestSuiteListener testSuiteListener = new InternalTestSuiteListener();
56
57 protected static final String TEST_STEP_ELEMENT = "test-step";
58 protected static final String TEST_STEP_FIELD = "TestStep";
59
60 public AbstractLoadTestAssertion(LoadTestAssertionConfig assertionConfig, WsdlLoadTest loadTest)
61 {
62 this.assertionConfig = assertionConfig;
63 this.loadTest = loadTest;
64
65 loadTest.getTestCase().getTestSuite().addTestSuiteListener( testSuiteListener );
66 }
67
68 public void initIcon( String url )
69 {
70 icon = UISupport.createImageIcon( url );
71 }
72
73 public LoadTestAssertionConfig getConfiguration()
74 {
75 return assertionConfig;
76 }
77
78 public void updateConfiguration( LoadTestAssertionConfig configuration )
79 {
80 assertionConfig = configuration;
81 }
82
83 protected void setConfiguration( XmlObject configuration )
84 {
85 XmlObject oldConfig = assertionConfig.getConfiguration();
86 assertionConfig.setConfiguration( configuration );
87 propertyChangeSupport.firePropertyChange( AbstractLoadTestAssertion.CONFIGURATION_PROPERTY, oldConfig, configuration );
88 }
89
90 public String getName()
91 {
92 return assertionConfig.isSetName() ? assertionConfig.getName() : assertionConfig.getType();
93 }
94
95 public void setName(String name)
96 {
97 String old = getName();
98 assertionConfig.setName( name );
99 propertyChangeSupport.firePropertyChange( NAME_PROPERTY, old, name );
100 }
101
102 public WsdlLoadTest getLoadTest()
103 {
104 return loadTest;
105 }
106
107 public class RenameAssertionAction extends AbstractAction
108 {
109 public RenameAssertionAction()
110 {
111 super( "Rename" );
112 putValue( Action.SHORT_DESCRIPTION, "Renames this assertion" );
113 }
114
115 public void actionPerformed(ActionEvent e)
116 {
117 String name = UISupport.prompt("Specify name for this assertion", "Rename Assertion", AbstractLoadTestAssertion.this.getName() );
118 if( name == null || name.equals( AbstractLoadTestAssertion.this.getName() )) return;
119
120 setName( name );
121 }
122 }
123
124 public class ConfigureAssertionAction extends AbstractAction
125 {
126 public ConfigureAssertionAction()
127 {
128 super( "Configure" );
129 putValue( Action.SHORT_DESCRIPTION, "Configures this assertion" );
130 }
131
132 public void actionPerformed(ActionEvent e)
133 {
134 ((Configurable)AbstractLoadTestAssertion.this).configure();
135 }
136 }
137
138 public ImageIcon getIcon()
139 {
140 return icon;
141 }
142
143 public void addPropertyChangeListener(PropertyChangeListener listener)
144 {
145 propertyChangeSupport.addPropertyChangeListener( listener );
146 }
147
148 public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)
149 {
150 propertyChangeSupport.addPropertyChangeListener( propertyName, listener );
151 }
152
153 public void removePropertyChangeListener(PropertyChangeListener listener)
154 {
155 propertyChangeSupport.removePropertyChangeListener( listener );
156 }
157
158 public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener)
159 {
160 propertyChangeSupport.removePropertyChangeListener( propertyName, listener );
161 }
162
163 protected String returnErrorOrFail(String message, int maxErrors, LoadTestRunner testRunner, LoadTestRunContext context)
164 {
165 String propertyKey = getClass().getName() + hashCode();
166 Long errorCount = (Long) context.getProperty( propertyKey );
167
168 if( errorCount == null )
169 {
170 errorCount = 1L;
171 }
172 else
173 {
174 errorCount = new Long( errorCount.longValue() + 1 );
175 }
176
177 if( maxErrors >= 0 && errorCount >= maxErrors )
178 {
179 testRunner.fail( "Maximum number of errors [" + maxErrors + "] for assertion [" + getName() + "] exceeded" );
180 }
181
182 context.setProperty( propertyKey, errorCount );
183
184 return message;
185 }
186
187 public String getTargetStep()
188 {
189 return testStepName;
190 }
191
192 public void setTargetStep(String name)
193 {
194 testStepName = name;
195 initTestStep();
196 }
197
198 abstract protected void updateConfiguration();
199
200 protected boolean targetStepMatches( TestStep testStep )
201 {
202 return testStepName == null || testStepName.equals( ANY_TEST_STEP ) || testStep.getName().equals( testStepName );
203 }
204
205 protected String[] getTargetStepOptions( boolean includeAll )
206 {
207 if( includeAll )
208 return ModelSupport.getNames( new String []{ ANY_TEST_STEP, ALL_TEST_STEPS },
209 getLoadTest().getTestCase().getTestStepList() );
210 else
211 return ModelSupport.getNames( new String []{ ANY_TEST_STEP },
212 getLoadTest().getTestCase().getTestStepList() );
213 }
214
215 private void initTestStep()
216 {
217 if( testStep != null )
218 {
219 testStep.removePropertyChangeListener( testStepPropertyChangeListener );
220 }
221
222 testStep = getLoadTest().getTestCase().getTestStepByName( testStepName );
223 if( testStep != null )
224 {
225 testStep.addPropertyChangeListener( TestStep.NAME_PROPERTY, testStepPropertyChangeListener );
226 }
227 }
228
229 public void release()
230 {
231 if( testStep != null )
232 {
233 testStep.removePropertyChangeListener( testStepPropertyChangeListener );
234 loadTest.getTestCase().getTestSuite().removeTestSuiteListener( testSuiteListener );
235 }
236 }
237
238 private final class InternalTestSuiteListener extends TestSuiteListenerAdapter
239 {
240 public void testStepRemoved(TestStep removedTestStep, int index)
241 {
242 if( removedTestStep.getName().equals( testStepName ) &&
243 removedTestStep.getTestCase() == testStep.getTestCase() )
244 {
245 testStepName = ANY_TEST_STEP;
246 updateConfiguration();
247 }
248 }
249 }
250
251 private final class TestStepPropertyChangeListener implements PropertyChangeListener
252 {
253 public void propertyChange(PropertyChangeEvent evt)
254 {
255 testStepName = evt.getNewValue().toString();
256 updateConfiguration();
257 }
258 }
259 }
260
261