View Javadoc

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     	// Add text field for 'Path'
181     	// TODO Ericsson: Need more space for Path and Value fields. Move them to a dialog?
182     	// TODO Ericsson: Better GUI to enter an XPath.
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         // Add text field for 'Port'
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     	// Add text field for 'Request Query'
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         // Add text field for 'Matching Value'
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         //valueField.addPropertyChangeListener(this);
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 }