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 private void buildUI()
97 {
98 editor = new GroovyEditor( new ScriptStepGroovyEditorModel( ));
99
100 logArea = new JLogList( "Groovy Test Log" );
101 logArea.addLogger( groovyStep.getName() + "#" + hashCode(), true );
102 logArea.getLogList().addMouseListener( new MouseAdapter() {
103
104 public void mouseClicked(MouseEvent e)
105 {
106 if( e.getClickCount() < 2 )
107 return;
108
109 String value = logArea.getLogList().getSelectedValue().toString();
110 if( value == null )
111 return;
112
113 editor.selectError( value );
114 }} );
115
116 logArea.getLogList().getModel().addListDataListener( new ListDataChangeListener() {
117
118 @Override
119 public void dataChanged( ListModel model )
120 {
121 logInspector.setTitle( "Log Output (" + model.getSize() + ")" );
122
123 }} );
124
125 JInspectorPanel inspectorPanel = new JInspectorPanel( new JScrollPane( editor ));
126 logInspector = inspectorPanel.addInspector( new JComponentInspector( logArea, "Log Output (0)",
127 "Groovy Log output for this script", true ) );
128 inspectorPanel.setDefaultDividerLocation( 0.8F );
129 inspectorPanel.activate( logInspector );
130 add( inspectorPanel, BorderLayout.CENTER );
131 add( buildToolbar(), BorderLayout.NORTH );
132 add( buildStatusBar(), BorderLayout.SOUTH );
133
134 componentEnabler.add( editor );
135 }
136
137 private Component buildStatusBar()
138 {
139 statusBar = new JEditorStatusBarWithProgress( editor );
140 return statusBar;
141 }
142
143 private JComponent buildToolbar()
144 {
145 JXToolBar toolBar = UISupport.createToolbar();
146 JButton runButton = UISupport.createToolbarButton( runAction );
147 toolBar.add( runButton );
148 toolBar.add( Box.createHorizontalGlue() );
149 JLabel label = new JLabel("<html>Script is invoked with <code>log</code>, <code>context</code> " +
150 "and <code>testRunner</code> variables</html>");
151 label.setToolTipText( label.getText() );
152 label.setMaximumSize( label.getPreferredSize() );
153
154 toolBar.add( label);
155 toolBar.addRelatedGap();
156 toolBar.add( UISupport.createToolbarButton( new ShowOnlineHelpAction( HelpUrls.GROOVYSTEPEDITOR_HELP_URL )));
157
158 componentEnabler.add( runButton );
159
160 return toolBar;
161 }
162
163 public boolean onClose( boolean canCancel )
164 {
165 componentEnabler.release();
166 editor.release();
167 SoapUI.getSettings().removeSettingsListener( settingsListener );
168 logger.removeAllAppenders();
169 logger = null;
170 logArea.release();
171 super.release();
172 return true;
173 }
174
175 public JComponent getComponent()
176 {
177 return this;
178 }
179
180 public boolean dependsOn(ModelItem modelItem)
181 {
182 return modelItem == groovyStep || modelItem == groovyStep.getTestCase() ||
183 modelItem == groovyStep.getTestCase().getTestSuite() ||
184 modelItem == groovyStep.getTestCase().getTestSuite().getProject();
185 }
186
187 private class ScriptStepGroovyEditorModel implements GroovyEditorModel
188 {
189 public String[] getKeywords()
190 {
191 return new String[] {"log", "context", "testRunner"};
192 }
193
194 public Action getRunAction()
195 {
196 return runAction;
197 }
198
199 public String getScript()
200 {
201 return groovyStep.getScript();
202 }
203
204 public void setScript( String text )
205 {
206 groovyStep.setScript( text );
207 }
208
209 public Settings getSettings()
210 {
211 return SoapUI.getSettings();
212 }}
213
214 private class RunAction extends AbstractAction
215 {
216 public RunAction()
217 {
218 putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/run_groovy_script.gif" ));
219 putValue( Action.SHORT_DESCRIPTION, "Runs this script using a mock testRunner and testContext" );
220 }
221
222 public void actionPerformed(ActionEvent e)
223 {
224 MockTestRunner mockTestRunner = new MockTestRunner( groovyStep.getTestCase(), logger );
225 statusBar.setIndeterminate( true );
226 WsdlTestStepResult result = (WsdlTestStepResult) groovyStep.run( mockTestRunner,
227 new MockTestRunContext( mockTestRunner, groovyStep ) );
228 statusBar.setIndeterminate( false );
229
230 Throwable er = result.getError();
231 if( er != null )
232 {
233 String message = er.getMessage();
234
235
236 editor.selectError( message);
237
238 UISupport.showErrorMessage( er.toString() );
239 editor.requestFocus();
240 }
241 }
242 }
243 }