View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 				// ugly...
248 				editor.selectError( message);
249 				
250 				UISupport.showErrorMessage( er.toString() );
251 				editor.requestFocus();
252 			}
253 		}
254 	}
255 }