1 package com.eviware.soapui.impl.wsdl.panels.teststeps;
2
3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.util.Date;
6
7 import javax.swing.JComponent;
8 import javax.swing.JLabel;
9 import javax.swing.JPanel;
10 import javax.swing.JScrollPane;
11 import javax.swing.JSplitPane;
12 import javax.swing.JTabbedPane;
13 import javax.swing.JTextArea;
14 import javax.swing.JTextField;
15 import javax.swing.text.Document;
16
17 import com.eviware.soapui.SoapUI;
18 import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
19 import com.eviware.soapui.impl.wsdl.panels.mockoperation.AbstractWsdlMockResponseDesktopPanel;
20 import com.eviware.soapui.impl.wsdl.teststeps.WsdlAsyncResponseTestStep;
21 import com.eviware.soapui.model.ModelItem;
22 import com.eviware.soapui.model.support.TestRunListenerAdapter;
23 import com.eviware.soapui.model.testsuite.AssertionError;
24 import com.eviware.soapui.model.testsuite.LoadTestRunner;
25 import com.eviware.soapui.model.testsuite.TestRunContext;
26 import com.eviware.soapui.model.testsuite.TestRunner;
27 import com.eviware.soapui.model.testsuite.TestStepResult;
28 import com.eviware.soapui.monitor.support.TestMonitorListenerAdapter;
29 import com.eviware.soapui.support.DocumentListenerAdapter;
30 import com.eviware.soapui.support.UISupport;
31 import com.eviware.soapui.support.components.JXToolBar;
32
33
34 @SuppressWarnings("serial")
35 public class AsyncResponseStepDesktopPanel
36 extends AbstractWsdlMockResponseDesktopPanel<WsdlAsyncResponseTestStep, WsdlMockResponse>
37 {
38 private InternalTestRunListener testRunListener;
39 private InternalTestMonitorListener testMonitorListener;
40 private JSplitPane verticalSplit;
41 private JTextArea responseLog;
42 private AssertionsPanel assertionsPanel;
43 private JTextField portField;
44 private JTextField pathField;
45 private JTextField queryField;
46 private JTextField valueField;
47
48 /***
49 *
50 *
51 */
52 private class InternalTestMonitorListener extends TestMonitorListenerAdapter
53 {
54 private WsdlAsyncResponseTestStep step;
55
56 public InternalTestMonitorListener()
57 {
58 step = getModelItem();
59 }
60
61 public void loadTestFinished(LoadTestRunner loadTestRunner)
62 {
63 setEnabled(!SoapUI.getTestMonitor().hasRunningTest(step.getTestCase()));
64 }
65
66 public void loadTestStarted(LoadTestRunner loadTestRunner)
67 {
68 if (loadTestRunner.getLoadTest().getTestCase() == step.getTestCase())
69 {
70 setEnabled(false);
71 }
72 }
73
74 public void testCaseFinished(TestRunner testRunner)
75 {
76 setEnabled(!SoapUI.getTestMonitor().hasRunningTest(step.getTestCase()));
77 }
78
79 public void testCaseStarted(TestRunner testRunner)
80 {
81 if (testRunner.getTestCase() == step.getTestCase())
82 {
83 setEnabled(false);
84 }
85 }
86 }
87
88 /***
89 *
90 *
91 */
92 public class InternalTestRunListener extends TestRunListenerAdapter
93 {
94 public void afterRun(TestRunner testRunner, TestRunContext testRunContext)
95 {
96 setEnabled(true);
97 }
98
99 public void beforeRun(TestRunner testRunner, TestRunContext testRunContext)
100 {
101 setEnabled(false);
102 }
103
104 public void beforeStep(TestRunner testRunner, TestRunContext testRunContext)
105 {
106 if (testRunContext.getCurrentStep() == getModelItem())
107 {
108 WsdlAsyncResponseTestStep step =
109 getModelItem();
110
111 StringBuilder sb = new StringBuilder();
112 sb.append(responseLog.getText());
113 sb.append((new Date(System.currentTimeMillis())).toString());
114 sb.append(": Waiting for request on http://127.0.0.1:");
115 sb.append(step.getPort());
116 sb.append(step.getPath());
117 sb.append("\r\n");
118
119 responseLog.setText(sb.toString());
120 }
121 }
122
123 public void afterStep(TestRunner testRunner,
124 TestRunContext testRunContext, TestStepResult result)
125 {
126 if (result.getTestStep() == getModelItem())
127 {
128 StringBuilder sb = new StringBuilder();
129 sb.append(responseLog.getText());
130 sb.append((new Date(result.getTimeStamp())).toString());
131 sb.append(": Handled request in ");
132 sb.append(result.getTimeTaken());
133 sb.append("ms");
134 sb.append("\r\n");
135
136 responseLog.setText(sb.toString());
137 }
138 }
139 }
140
141 /***
142 * Constructor
143 *
144 * @param step
145 */
146 public AsyncResponseStepDesktopPanel(WsdlAsyncResponseTestStep step)
147 {
148 super(step);
149
150 testMonitorListener = new InternalTestMonitorListener();
151 testRunListener = new InternalTestRunListener();
152
153 init(step.getMockResponse());
154
155 step.getTestCase().addTestRunListener(testRunListener);
156 SoapUI.getTestMonitor().addTestMonitorListener(testMonitorListener);
157
158 setEnabled(!SoapUI.getTestMonitor().hasRunningTest(step.getTestCase()));
159 }
160
161 protected JComponent buildContent()
162 {
163 JComponent jcomponent = super.buildContent();
164
165 verticalSplit = UISupport.createVerticalSplit();
166 verticalSplit.setTopComponent(jcomponent);
167 verticalSplit.setBottomComponent(createTabPanel());
168 verticalSplit.setDividerLocation(350);
169 verticalSplit.setResizeWeight(0.9);
170 verticalSplit.setBorder(null);
171
172 return verticalSplit;
173 }
174
175 protected void createToolbar(JXToolBar toolbar)
176 {
177 WsdlAsyncResponseTestStep step =
178 getModelItem();
179
180
181
182
183 toolbar.addUnrelatedGap();
184 toolbar.addFixed(new JLabel("Path"));
185 toolbar.addRelatedGap();
186 pathField = new JTextField(step.getPath(), 15);
187 pathField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
188
189 public void update(Document document)
190 {
191 WsdlAsyncResponseTestStep step = getModelItem();
192 step.setPath(pathField.getText());
193 }
194 });
195 toolbar.addFixed(pathField);
196
197
198 toolbar.addUnrelatedGap();
199 toolbar.addFixed(new JLabel("Port"));
200 toolbar.addRelatedGap();
201 portField = new JTextField(String.valueOf(step.getPort()), 5);
202 portField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
203
204 public void update(Document document)
205 {
206 try
207 {
208 WsdlAsyncResponseTestStep step =
209 getModelItem();
210
211 step.setPort(Integer.parseInt(portField.getText()));
212 }
213 catch(NumberFormatException e)
214 {
215 }
216 }
217 });
218 toolbar.addFixed(portField);
219
220
221 toolbar.addUnrelatedGap();
222 toolbar.addFixed(new JLabel("Request Query"));
223 toolbar.addRelatedGap();
224 queryField = new JTextField(step.getRequestQuery(), 30);
225 queryField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
226
227 public void update(Document document)
228 {
229 WsdlAsyncResponseTestStep step =
230 getModelItem();
231 step.setRequestQuery(queryField.getText());
232 }
233 });
234 toolbar.addFixed(queryField);
235
236
237 toolbar.addUnrelatedGap();
238 toolbar.addFixed(new JLabel("Matching Value"));
239 toolbar.addRelatedGap();
240 valueField = new JTextField(step.getMatchingValue(), 15);
241 valueField.getDocument().addDocumentListener(new DocumentListenerAdapter()
242 {
243
244 public void update(Document document)
245 {
246 WsdlAsyncResponseTestStep step = getModelItem();
247 step.setMatchingValue(valueField.getText());
248 }
249 });
250
251 toolbar.addFixed(valueField);
252 }
253
254 private Component createTabPanel()
255 {
256 JTabbedPane pane = new JTabbedPane(4);
257 pane.setTabLayoutPolicy(1);
258
259 pane.addTab("Assertions", createAssertionsPanel());
260 pane.addTab("Response Log", createResponseLogPanel());
261
262 return UISupport.createTabPanel(pane, true);
263 }
264
265 private JPanel createResponseLogPanel()
266 {
267 responseLog = new JTextArea();
268 responseLog.setEditable(false);
269 responseLog.setToolTipText("Response Log");
270
271 JPanel panel = new JPanel(new BorderLayout());
272 panel.add(new JScrollPane(responseLog), "Center");
273
274 return panel;
275 }
276
277 private JComponent createAssertionsPanel()
278 {
279 assertionsPanel = new AssertionsPanel(getModelItem()) {
280
281 protected void selectError(AssertionError assertionerror)
282 {
283 getResponseEditor().requestFocus();
284 }
285 };
286
287 return assertionsPanel;
288 }
289
290 public boolean onClose(boolean flag)
291 {
292 WsdlAsyncResponseTestStep step =
293 getModelItem();
294
295 step.getTestCase().removeTestRunListener(testRunListener);
296 SoapUI.getTestMonitor().removeTestMonitorListener(testMonitorListener);
297
298 assertionsPanel.release();
299
300 return super.onClose(flag);
301 }
302
303 public void setEnabled(boolean flag)
304 {
305 super.setEnabled(flag);
306
307 pathField.setEnabled(flag);
308 portField.setEnabled(flag);
309 }
310
311 public boolean dependsOn(ModelItem modelItem)
312 {
313 WsdlAsyncResponseTestStep step =
314 getModelItem();
315
316 return modelItem == getModelItem() ||
317 modelItem == step.getTestCase() ||
318 modelItem == step.getOperation() ||
319 modelItem == step.getOperation().getInterface() ||
320 modelItem == step.getTestCase().getTestSuite() ||
321 modelItem == step.getTestCase().getTestSuite().getProject();
322 }
323 }