1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.teststeps;
14
15 import java.awt.BorderLayout;
16 import java.awt.Component;
17 import java.awt.Dimension;
18 import java.awt.event.ActionEvent;
19 import java.awt.event.FocusAdapter;
20 import java.awt.event.FocusEvent;
21 import java.awt.event.MouseAdapter;
22 import java.awt.event.MouseEvent;
23
24 import javax.swing.AbstractAction;
25 import javax.swing.Action;
26 import javax.swing.Box;
27 import javax.swing.JButton;
28 import javax.swing.JComponent;
29 import javax.swing.JLabel;
30 import javax.swing.JScrollPane;
31 import javax.swing.ListModel;
32
33 import org.apache.log4j.Logger;
34
35 import com.eviware.soapui.SoapUI;
36 import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
37 import com.eviware.soapui.impl.wsdl.panels.support.MockTestRunContext;
38 import com.eviware.soapui.impl.wsdl.panels.support.MockTestRunner;
39 import com.eviware.soapui.impl.wsdl.panels.support.TestRunComponentEnabler;
40 import com.eviware.soapui.impl.wsdl.panels.teststeps.support.GroovyEditor;
41 import com.eviware.soapui.impl.wsdl.panels.teststeps.support.GroovyEditorModel;
42 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
43 import com.eviware.soapui.impl.wsdl.teststeps.WsdlGroovyScriptTestStep;
44 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStepResult;
45 import com.eviware.soapui.model.ModelItem;
46 import com.eviware.soapui.model.settings.Settings;
47 import com.eviware.soapui.model.settings.SettingsListener;
48 import com.eviware.soapui.support.ListDataChangeListener;
49 import com.eviware.soapui.support.UISupport;
50 import com.eviware.soapui.support.components.JComponentInspector;
51 import com.eviware.soapui.support.components.JEditorStatusBarWithProgress;
52 import com.eviware.soapui.support.components.JInspectorPanel;
53 import com.eviware.soapui.support.components.JXToolBar;
54 import com.eviware.soapui.support.log.JLogList;
55 import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
56
57 /***
58 * DesktopPanel for WsdlGroovyTestSteps
59 *
60 * @author Ole.Matzura
61 */
62
63 public class GroovyScriptStepDesktopPanel extends ModelItemDesktopPanel<WsdlGroovyScriptTestStep>
64 {
65 private final WsdlGroovyScriptTestStep groovyStep;
66 private GroovyEditor editor;
67 private JLogList logArea;
68 private Logger logger;
69 private TestRunComponentEnabler componentEnabler;
70 private RunAction runAction = new RunAction();
71 private JEditorStatusBarWithProgress statusBar;
72 private SettingsListener settingsListener;
73 private JComponentInspector logInspector;
74
75 public GroovyScriptStepDesktopPanel(WsdlGroovyScriptTestStep groovyStep)
76 {
77 super( groovyStep );
78 this.groovyStep = groovyStep;
79 componentEnabler = new TestRunComponentEnabler( groovyStep.getTestCase() );
80
81 buildUI();
82 setPreferredSize( new Dimension( 600, 440 ));
83
84 logger = Logger.getLogger( groovyStep.getName() + "#" + hashCode() );
85
86 addFocusListener( new FocusAdapter() {
87
88 public void focusGained( FocusEvent e )
89 {
90 editor.requestFocusInWindow();
91 }
92
93 } );
94 }
95
96 protected GroovyEditor getEditor()
97 {
98 return editor;
99 }
100
101 private void buildUI()
102 {
103 editor = new GroovyEditor( new ScriptStepGroovyEditorModel( ));
104
105 logArea = new JLogList( "Groovy Test Log" );
106 logArea.addLogger( groovyStep.getName() + "#" + hashCode(), true );
107 logArea.getLogList().addMouseListener( new MouseAdapter() {
108
109 public void mouseClicked(MouseEvent e)
110 {
111 if( e.getClickCount() < 2 )
112 return;
113
114 String value = logArea.getLogList().getSelectedValue().toString();
115 if( value == null )
116 return;
117
118 editor.selectError( value );
119 }} );
120
121 logArea.getLogList().getModel().addListDataListener( new ListDataChangeListener() {
122
123 @Override
124 public void dataChanged( ListModel model )
125 {
126 logInspector.setTitle( "Log Output (" + model.getSize() + ")" );
127
128 }} );
129
130 JScrollPane scrollPane = new JScrollPane( editor );
131 UISupport.addPreviewCorner( scrollPane, true );
132 JInspectorPanel inspectorPanel = new JInspectorPanel( scrollPane);
133 logInspector = inspectorPanel.addInspector( new JComponentInspector( logArea, "Log Output (0)",
134 "Groovy Log output for this script", true ) );
135 inspectorPanel.setDefaultDividerLocation( 0.8F );
136 inspectorPanel.activate( logInspector );
137 add( inspectorPanel, BorderLayout.CENTER );
138 add( buildToolbar(), BorderLayout.NORTH );
139 add( buildStatusBar(), BorderLayout.SOUTH );
140
141 componentEnabler.add( editor );
142 }
143
144 private Component buildStatusBar()
145 {
146 statusBar = new JEditorStatusBarWithProgress( editor );
147 return statusBar;
148 }
149
150 private JComponent buildToolbar()
151 {
152 JXToolBar toolBar = UISupport.createToolbar();
153 JButton runButton = UISupport.createToolbarButton( runAction );
154 toolBar.add( runButton );
155 toolBar.add( Box.createHorizontalGlue() );
156 JLabel label = new JLabel("<html>Script is invoked with <code>log</code>, <code>context</code> " +
157 "and <code>testRunner</code> variables</html>");
158 label.setToolTipText( label.getText() );
159 label.setMaximumSize( label.getPreferredSize() );
160
161 toolBar.add( label);
162 toolBar.addRelatedGap();
163 toolBar.add( UISupport.createToolbarButton( new ShowOnlineHelpAction( HelpUrls.GROOVYSTEPEDITOR_HELP_URL )));
164
165 componentEnabler.add( runButton );
166
167 return toolBar;
168 }
169
170 public boolean onClose( boolean canCancel )
171 {
172 componentEnabler.release();
173 editor.release();
174 SoapUI.getSettings().removeSettingsListener( settingsListener );
175 logger.removeAllAppenders();
176 logger = null;
177 logArea.release();
178 super.release();
179 return true;
180 }
181
182 public JComponent getComponent()
183 {
184 return this;
185 }
186
187 public boolean dependsOn(ModelItem modelItem)
188 {
189 return modelItem == groovyStep || modelItem == groovyStep.getTestCase() ||
190 modelItem == groovyStep.getTestCase().getTestSuite() ||
191 modelItem == groovyStep.getTestCase().getTestSuite().getProject();
192 }
193
194 private class ScriptStepGroovyEditorModel implements GroovyEditorModel
195 {
196 public String[] getKeywords()
197 {
198 return new String[] {"log", "context", "testRunner"};
199 }
200
201 public Action getRunAction()
202 {
203 return runAction;
204 }
205
206 public String getScript()
207 {
208 return groovyStep.getScript();
209 }
210
211 public void setScript( String text )
212 {
213 groovyStep.setScript( text );
214 }
215
216 public Settings getSettings()
217 {
218 return SoapUI.getSettings();
219 }
220
221 public String getScriptName()
222 {
223 return null;
224 }}
225
226 private class RunAction extends AbstractAction
227 {
228 public RunAction()
229 {
230 putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/run_groovy_script.gif" ));
231 putValue( Action.SHORT_DESCRIPTION, "Runs this script using a mock testRunner and testContext" );
232 }
233
234 public void actionPerformed(ActionEvent e)
235 {
236 MockTestRunner mockTestRunner = new MockTestRunner( groovyStep.getTestCase(), logger );
237 statusBar.setIndeterminate( true );
238 WsdlTestStepResult result = (WsdlTestStepResult) groovyStep.run( mockTestRunner,
239 new MockTestRunContext( mockTestRunner, groovyStep ) );
240 statusBar.setIndeterminate( false );
241
242 Throwable er = result.getError();
243 if( er != null )
244 {
245 String message = er.getMessage();
246
247
248 editor.selectError( message);
249
250 UISupport.showErrorMessage( er.toString() );
251 editor.requestFocus();
252 }
253 }
254 }
255 }