1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.loadtest.strategy;
14
15
16 import javax.swing.JComponent;
17 import javax.swing.JLabel;
18 import javax.swing.JPanel;
19 import javax.swing.JTextField;
20 import javax.swing.text.Document;
21
22 import org.apache.xmlbeans.XmlObject;
23
24 import com.eviware.soapui.SoapUI;
25 import com.eviware.soapui.model.testsuite.LoadTestRunContext;
26 import com.eviware.soapui.model.testsuite.LoadTestRunner;
27 import com.eviware.soapui.model.testsuite.TestRunContext;
28 import com.eviware.soapui.model.testsuite.TestRunner;
29 import com.eviware.soapui.support.DocumentListenerAdapter;
30 import com.eviware.soapui.support.UISupport;
31 import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder;
32 import com.eviware.soapui.support.xml.XmlObjectConfigurationReader;
33 import com.jgoodies.forms.builder.ButtonBarBuilder;
34
35 /***
36 * LoadStrategy allowing maximum runs and request delays
37 *
38 * @author Ole.Matzura
39 */
40
41 public class SimpleLoadStrategy extends AbstractLoadStrategy
42 {
43 private static final int DEFAULT_TEST_DELAY = 1000;
44
45 private static final float DEFAULT_RANDOM_FACTOR = 0.5F;
46
47 public static final String STRATEGY_TYPE = "Simple";
48
49 private int testDelay = DEFAULT_TEST_DELAY;
50 private float randomFactor = DEFAULT_RANDOM_FACTOR;
51
52 private JPanel configPanel;
53 private JTextField testDelayField;
54 private JTextField randomFactorField;
55
56 public SimpleLoadStrategy(XmlObject config)
57 {
58 super( STRATEGY_TYPE );
59
60 if( config != null )
61 {
62 XmlObjectConfigurationReader reader = new XmlObjectConfigurationReader( config );
63 testDelay = reader.readInt( "testDelay", DEFAULT_TEST_DELAY );
64 randomFactor = reader.readFloat( "randomFactor", DEFAULT_RANDOM_FACTOR );
65 }
66 }
67
68 public XmlObject getConfig()
69 {
70 XmlObjectConfigurationBuilder builder = new XmlObjectConfigurationBuilder();
71 builder.add( "testDelay", testDelay );
72 builder.add( "randomFactor", randomFactor );
73 return builder.finish();
74 }
75
76 public void beforeTestCase( LoadTestRunner loadTestRunner, LoadTestRunContext context, TestRunner testRunner, TestRunContext runContext)
77 {
78 int delay = calculateDelay( testDelay);
79 if( delay == 0 ) return;
80 try
81 {
82 Thread.sleep( delay );
83 }
84 catch (InterruptedException e)
85 {
86 SoapUI.logError( e );
87 }
88 }
89
90 public int calculateDelay( int delay )
91 {
92 if( delay == 0 || randomFactor == 0 )
93 return delay;
94
95 int fixDelay = (int) ((float)delay*(1-randomFactor));
96 int randDelay = (int) (randomFactor == 0 ? 0 : (float)(delay-fixDelay)*Math.random());
97 return fixDelay + randDelay;
98 }
99
100 public JComponent getConfigurationPanel()
101 {
102 if( configPanel == null )
103 {
104 ButtonBarBuilder builder = new ButtonBarBuilder();
105
106 testDelayField = new JTextField( 5 );
107 UISupport.setPreferredHeight( testDelayField, 18 );
108 testDelayField.setHorizontalAlignment( JTextField.RIGHT );
109 testDelayField.setText( String.valueOf( testDelay ));
110 testDelayField.setToolTipText( "Sets the delay between each test run in milliseconds" );
111 testDelayField.getDocument().addDocumentListener( new ConfigDocumentListener());
112
113 builder.addFixed( new JLabel( "Test Delay" ));
114 builder.addRelatedGap();
115
116 builder.addFixed( testDelayField );
117 builder.addRelatedGap();
118
119 randomFactorField = new JTextField( 4 );
120 UISupport.setPreferredHeight( randomFactorField, 18 );
121 randomFactorField.setHorizontalAlignment( JTextField.RIGHT );
122 randomFactorField.setText( String.valueOf( randomFactor ));
123 randomFactorField.setToolTipText( "Specifies the relativt amount of randomization for delay (0 = no random, 1 = all random)" );
124 randomFactorField.getDocument().addDocumentListener( new ConfigDocumentListener());
125
126 builder.addFixed( new JLabel( "Random" ));
127 builder.addRelatedGap();
128 builder.addFixed( randomFactorField);
129
130 configPanel = builder.getPanel();
131 }
132
133 return configPanel;
134 }
135
136 private final class ConfigDocumentListener extends DocumentListenerAdapter
137 {
138 public void update(Document document)
139 {
140 try
141 {
142 if (document == testDelayField.getDocument())
143 testDelay = Integer.parseInt(testDelayField.getText());
144 if (document == randomFactorField.getDocument())
145 randomFactor = Float.parseFloat(randomFactorField.getText().replace( ',', '.' ));
146
147 notifyConfigurationChanged();
148 }
149 catch (NumberFormatException e)
150 {
151 }
152 }
153 }
154
155 /***
156 * Factory for SimpleLoadStrategy class
157 *
158 * @author Ole.Matzura
159 */
160
161 public static class Factory implements LoadStrategyFactory
162 {
163 public String getType()
164 {
165 return STRATEGY_TYPE;
166 }
167
168 public LoadStrategy build(XmlObject config)
169 {
170 return new SimpleLoadStrategy( config );
171 }
172
173 public LoadStrategy create()
174 {
175 return new SimpleLoadStrategy( null );
176 }
177 }
178 }