1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.teststeps;
14
15 import com.eviware.soapui.SoapUI;
16 import com.eviware.soapui.impl.rest.panels.request.AbstractRestRequestDesktopPanel;
17 import com.eviware.soapui.impl.support.components.ModelItemXmlEditor;
18 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
19 import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
20 import com.eviware.soapui.impl.wsdl.teststeps.RestTestRequest;
21 import com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestStep;
22 import com.eviware.soapui.impl.wsdl.teststeps.actions.AddAssertionAction;
23 import com.eviware.soapui.model.ModelItem;
24 import com.eviware.soapui.model.iface.Request.SubmitException;
25 import com.eviware.soapui.model.iface.Submit;
26 import com.eviware.soapui.model.iface.SubmitContext;
27 import com.eviware.soapui.model.testsuite.Assertable.AssertionStatus;
28 import com.eviware.soapui.model.testsuite.AssertionError;
29 import com.eviware.soapui.model.testsuite.*;
30 import com.eviware.soapui.monitor.support.TestMonitorListenerAdapter;
31 import com.eviware.soapui.support.ListDataChangeListener;
32 import com.eviware.soapui.support.UISupport;
33 import com.eviware.soapui.support.components.JComponentInspector;
34 import com.eviware.soapui.support.components.JInspectorPanel;
35 import com.eviware.soapui.support.components.JInspectorPanelFactory;
36 import com.eviware.soapui.support.components.JXToolBar;
37 import com.eviware.soapui.support.log.JLogList;
38
39 import javax.swing.*;
40 import java.beans.PropertyChangeEvent;
41 import java.text.SimpleDateFormat;
42 import java.util.Date;
43
44 public class RestTestRequestDesktopPanel extends AbstractRestRequestDesktopPanel<RestTestRequestStep, RestTestRequest>
45 {
46 private JLogList logArea;
47 private InternalTestMonitorListener testMonitorListener = new InternalTestMonitorListener();
48 private JButton addAssertionButton;
49 protected boolean updatingRequest;
50 private AssertionsPanel assertionsPanel;
51 private JInspectorPanel inspectorPanel;
52 private JComponentInspector<?> assertionInspector;
53 private JComponentInspector<?> logInspector;
54 private InternalAssertionsListener assertionsListener = new InternalAssertionsListener();
55 private long startTime;
56 private SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
57
58 public RestTestRequestDesktopPanel( RestTestRequestStep requestStep )
59 {
60 super( requestStep, requestStep.getTestRequest() );
61
62 SoapUI.getTestMonitor().addTestMonitorListener( testMonitorListener );
63 setEnabled( !SoapUI.getTestMonitor().hasRunningTest( requestStep.getTestCase() ) );
64
65 requestStep.getTestRequest().addAssertionsListener( assertionsListener );
66 }
67
68 protected JComponent buildLogPanel()
69 {
70 logArea = new JLogList( "Request Log" );
71
72 logArea.getLogList().getModel().addListDataListener( new ListDataChangeListener()
73 {
74
75 public void dataChanged( ListModel model )
76 {
77 logInspector.setTitle( "Request Log (" + model.getSize() + ")" );
78 }
79 } );
80
81 return logArea;
82 }
83
84 protected AssertionsPanel buildAssertionsPanel()
85 {
86 return new AssertionsPanel( getRequest() )
87 {
88 protected void selectError( AssertionError error )
89 {
90 ModelItemXmlEditor<?, ?> editor = (ModelItemXmlEditor<?, ?>) getResponseEditor();
91 editor.requestFocus();
92 }
93 };
94 }
95
96 public void setContent( JComponent content )
97 {
98 inspectorPanel.setContentComponent( content );
99 }
100
101 public void removeContent( JComponent content )
102 {
103 inspectorPanel.setContentComponent( null );
104 }
105
106 protected String getHelpUrl()
107 {
108 return HelpUrls.TESTREQUESTEDITOR_HELP_URL;
109 }
110
111 protected JComponent buildContent()
112 {
113 JComponent component = super.buildContent();
114
115 inspectorPanel = JInspectorPanelFactory.build( component );
116 assertionsPanel = buildAssertionsPanel();
117
118 assertionInspector = new JComponentInspector<JComponent>( assertionsPanel, "Assertions ("
119 + getModelItem().getAssertionCount() + ")", "Assertions for this Test Request", true );
120
121 inspectorPanel.addInspector( assertionInspector );
122
123 logInspector = new JComponentInspector<JComponent>( buildLogPanel(), "Request Log (0)", "Log of requests", true );
124 inspectorPanel.addInspector( logInspector );
125 inspectorPanel.setDefaultDividerLocation( 0.6F );
126 inspectorPanel.setCurrentInspector( "Assertions" );
127
128 updateStatusIcon();
129
130 return inspectorPanel.getComponent();
131 }
132
133 private void updateStatusIcon()
134 {
135 AssertionStatus status = getModelItem().getTestRequest().getAssertionStatus();
136 switch( status )
137 {
138 case FAILED:
139 {
140 assertionInspector.setIcon( UISupport.createImageIcon( "/failed_assertion.gif" ) );
141 inspectorPanel.activate( assertionInspector );
142 break;
143 }
144 case UNKNOWN:
145 {
146 assertionInspector.setIcon( UISupport.createImageIcon( "/unknown_assertion.gif" ) );
147 break;
148 }
149 case VALID:
150 {
151 assertionInspector.setIcon( UISupport.createImageIcon( "/valid_assertion.gif" ) );
152 inspectorPanel.deactivate();
153 break;
154 }
155 }
156 }
157
158 protected JComponent buildToolbar()
159 {
160 addAssertionButton = createActionButton( new AddAssertionAction( getRequest() ), true );
161 return super.buildToolbar();
162 }
163
164 protected void insertButtons( JXToolBar toolbar )
165 {
166 toolbar.add( addAssertionButton );
167 super.insertButtons( toolbar );
168 }
169
170 public void setEnabled( boolean enabled )
171 {
172 if( enabled == true )
173 enabled = !SoapUI.getTestMonitor().hasRunningLoadTest( getModelItem().getTestCase() );
174
175 super.setEnabled( enabled );
176 addAssertionButton.setEnabled( enabled );
177 assertionsPanel.setEnabled( enabled );
178
179 if( SoapUI.getTestMonitor().hasRunningLoadTest( getRequest().getTestCase() ) )
180 {
181 getRequest().removeSubmitListener( this );
182 }
183 else
184 {
185 getRequest().addSubmitListener( this );
186 }
187 }
188
189 protected Submit doSubmit() throws SubmitException
190 {
191 return getRequest().submit( new WsdlTestRunContext( getModelItem() ), true );
192 }
193
194 private final class InternalAssertionsListener implements AssertionsListener
195 {
196 public void assertionAdded( TestAssertion assertion )
197 {
198 assertionInspector.setTitle( "Assertions (" + getModelItem().getAssertionCount() + ")" );
199 }
200
201 public void assertionRemoved( TestAssertion assertion )
202 {
203 assertionInspector.setTitle( "Assertions (" + getModelItem().getAssertionCount() + ")" );
204 }
205 }
206
207 public boolean beforeSubmit( Submit submit, SubmitContext context )
208 {
209 boolean result = super.beforeSubmit( submit, context );
210 startTime = System.currentTimeMillis();
211 return result;
212 }
213
214 protected void logMessages( String message, String infoMessage )
215 {
216 super.logMessages( message, infoMessage );
217 logArea.addLine( sdf.format( new Date( startTime ) ) + " - " + message );
218 }
219
220 @Override
221 public void afterSubmit( Submit submit, SubmitContext context )
222 {
223 super.afterSubmit( submit, context );
224 if( !isHasClosed() )
225 updateStatusIcon();
226 }
227
228 public boolean onClose( boolean canCancel )
229 {
230 if( super.onClose( canCancel ) )
231 {
232 assertionsPanel.release();
233 SoapUI.getTestMonitor().removeTestMonitorListener( testMonitorListener );
234 logArea.release();
235 getModelItem().getTestRequest().removeAssertionsListener( assertionsListener );
236 return true;
237 }
238
239 return false;
240 }
241
242 public boolean dependsOn( ModelItem modelItem )
243 {
244 if( getRequest().getResource() == null )
245 {
246 return modelItem == getRequest() || modelItem == getModelItem() || modelItem == getRequest().getOperation()
247 || modelItem == getModelItem().getTestCase() || modelItem == getModelItem().getTestCase().getTestSuite()
248 || modelItem == getModelItem().getTestCase().getTestSuite().getProject();
249 }
250 else
251 {
252 return modelItem == getRequest() || modelItem == getModelItem() || modelItem == getRequest().getOperation()
253 || modelItem == getRequest().getOperation().getInterface()
254 || modelItem == getRequest().getOperation().getInterface().getProject()
255 || modelItem == getModelItem().getTestCase() || modelItem == getModelItem().getTestCase().getTestSuite();
256 }
257 }
258
259 private class InternalTestMonitorListener extends TestMonitorListenerAdapter
260 {
261 public void loadTestFinished( LoadTestRunner runner )
262 {
263 setEnabled( !SoapUI.getTestMonitor().hasRunningTest( getModelItem().getTestCase() ) );
264 }
265
266 public void loadTestStarted( LoadTestRunner runner )
267 {
268 if( runner.getLoadTest().getTestCase() == getModelItem().getTestCase() )
269 setEnabled( false );
270 }
271
272 public void testCaseFinished( TestRunner runner )
273 {
274 setEnabled( !SoapUI.getTestMonitor().hasRunningTest( getModelItem().getTestCase() ) );
275 }
276
277 public void testCaseStarted( TestRunner runner )
278 {
279 if( runner.getTestCase() == getModelItem().getTestCase() )
280 setEnabled( false );
281 }
282 }
283
284 public void propertyChange( PropertyChangeEvent evt )
285 {
286 super.propertyChange( evt );
287
288 if( evt.getPropertyName().equals( RestTestRequest.STATUS_PROPERTY ) )
289 updateStatusIcon();
290 }
291 }