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.teststeps;
14  
15  import java.util.ArrayList;
16  import java.util.Collection;
17  import java.util.HashMap;
18  import java.util.HashSet;
19  import java.util.Map;
20  import java.util.Set;
21  
22  import com.eviware.soapui.config.TestStepConfig;
23  import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
24  import com.eviware.soapui.impl.wsdl.WsdlInterface;
25  import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
26  import com.eviware.soapui.model.PanelBuilder;
27  import com.eviware.soapui.model.testsuite.TestRunContext;
28  import com.eviware.soapui.model.testsuite.TestRunner;
29  import com.eviware.soapui.model.testsuite.TestStep;
30  import com.eviware.soapui.model.testsuite.TestStepProperty;
31  
32  /***
33   * Base class for WSDL TestCase test steps.
34   *  
35   * @author Ole.Matzura
36   */
37  
38  abstract public class WsdlTestStep extends AbstractWsdlModelItem<TestStepConfig> implements TestStep
39  {
40  	private final WsdlTestCase testCase;
41  	private Map<String,TestStepProperty> properties;
42  	private Set<WsdlTestStepListener> listeners = new HashSet<WsdlTestStepListener>();
43  	private final boolean forLoadTest;
44  	private final boolean hasEditor;
45     
46     protected WsdlTestStep( WsdlTestCase testCase, TestStepConfig config, boolean hasEditor, boolean forLoadTest )
47     {
48     	super( config, testCase, null );
49     	
50        this.testCase = testCase;
51  		this.hasEditor = hasEditor;
52  		this.forLoadTest = forLoadTest;
53     }
54     
55     public boolean hasEditor()
56  	{
57  		return hasEditor;
58  	}
59  
60  	public boolean isForLoadTest()
61     {
62     	return forLoadTest;
63     }
64     
65     /***
66      * Called after creation of all teststeps, should be used for inter-test-step initializations
67      * @param config 
68      */
69     
70     public void postInit(TestStepConfig config)
71     {}
72  
73  	protected PanelBuilder createPanelBuilder()
74  	{
75  		return null;
76  	}
77  
78  	public WsdlTestCase getTestCase()
79     {
80        return testCase;
81     }
82     
83     /***
84      * Called from WsdlTestCase when moving a teststep due to no move functionality
85      * in xmlbeans generated arrays. 
86      * 
87      * @param config the new config to use, will be a copy of the existing one. The current
88      * will be invalid
89      */
90     
91     public void resetConfigOnMove( TestStepConfig config )
92     {
93     	setConfig( config );
94     }
95  
96  	public boolean cancel()
97  	{
98  		return false;
99  	}
100 	
101    public String [] getPropertyNames()
102 	{
103    	if( properties == null )
104    		return new String[0];
105    	
106    	String [] result = new String[properties.size()];
107    	int ix = 0;
108    	for( TestStepProperty property : properties.values() )
109    		result[ix++] = property.getName();
110    	
111    	return result;
112 	}
113    
114 	public TestStepProperty getProperty(String name)
115 	{
116 		return properties == null || name == null ? null : properties.get( name.toUpperCase() );
117 	}
118 	
119 	public String getPropertyValue(String name)
120 	{
121 		if( properties == null )
122 			return null;
123 		
124 		TestStepProperty testStepProperty = properties.get( name.toUpperCase());
125 		return testStepProperty == null ? null : testStepProperty.getValue();
126 	}
127 
128 	public void setPropertyValue(String name, String value)
129 	{
130 		if( properties == null )
131 			return;
132 		
133 		TestStepProperty testStepProperty = properties.get( name.toUpperCase());
134 		if( testStepProperty != null )
135 		{
136 			testStepProperty.setValue( value );
137 		}
138 	}
139 
140 	protected void addProperty( TestStepProperty property )
141 	{
142 		if( properties == null )
143 			properties = new HashMap<String,TestStepProperty>();
144 			
145 		properties.put( property.getName().toUpperCase(), property );
146 	}
147 	
148 	protected void deleteProperty( String name )
149 	{
150 		if( properties != null )
151 			properties.remove( name.toUpperCase() );
152 	}
153 
154 	protected void propertyRenamed( String oldName )
155 	{
156 		if( properties == null )
157 			return;
158 		
159 		TestStepProperty testStepProperty = properties.get( oldName.toUpperCase() );
160 		if( testStepProperty == null )
161 			return;
162 		
163 		properties.remove( oldName.toUpperCase() );
164 		String newName = testStepProperty.getName();
165 		properties.put( newName.toUpperCase(), testStepProperty );
166 		
167 		firePropertyRenamed( oldName, newName );
168 	}
169 	
170 	public void addTestStepListener( WsdlTestStepListener listener )
171 	{
172 		listeners.add( listener );
173 	}
174 	
175 	public void removeTestStepListener( WsdlTestStepListener listener )
176 	{
177 		listeners.remove( listener );
178 	}
179 	
180 	protected void firePropertyAdded( String name )
181 	{
182 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
183 		for( WsdlTestStepListener listener : array )
184 		{
185 			listener.propertyAdded( name );
186 		}
187 	}
188 	
189 	protected void firePropertyRemoved( String name )
190 	{
191 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
192 		for( WsdlTestStepListener listener : array )
193 		{
194 			listener.propertyRemoved( name );
195 		}
196 	}
197 	
198 	protected void firePropertyRenamed( String oldName, String newName )
199 	{
200 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
201 		for( WsdlTestStepListener listener : array )
202 		{
203 			listener.propertyRenamed( oldName, newName );
204 		}
205 	}	
206 	
207 	protected void firePropertyValueChanged( String name, String oldValue, String newValue )
208 	{
209 		if( oldValue == null && newValue == null )
210 			return;
211 		
212 		if( oldValue != null && oldValue.equals( newValue ))
213 			return;
214 
215 		if( newValue != null && newValue.equals( oldValue ))
216 			return;
217 		
218 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
219 		for( WsdlTestStepListener listener : array )
220 		{
221 			listener.propertyValueChanged( name, oldValue, newValue );
222 		}
223 	}
224 	
225 	public boolean dependsOn( AbstractWsdlModelItem modelItem )
226 	{
227 		return false;
228 	}
229 	
230 	public String getTestStepTitle()
231 	{
232 		return getTestCase().getTestSuite().getName() + "#" + getTestCase().getName();
233 	}
234 
235 	/***
236 	 * Called after cloning for custom behaviour
237 	 * 
238 	 * @param sourceStep step we were cloned from
239 	 */
240 	
241 	public WsdlTestStep clone( WsdlTestCase targetTestCase, String name)
242 	{
243 		onSave();
244 		TestStepConfig newConfig = (TestStepConfig) getConfig().copy();
245 		newConfig.setName( name );
246 		return targetTestCase.addTestStep( newConfig );
247 	}
248 	
249 	public void finish( TestRunner testRunner, TestRunContext testRunContext )
250 	{
251 	}
252 
253 	public void prepare( TestRunner testRunner, TestRunContext testRunContext ) throws Exception 
254 	{
255 	}
256 
257 	public Collection<WsdlInterface> getRequiredInterfaces()
258 	{
259 		return new ArrayList<WsdlInterface>();
260 	}
261 	
262 	public boolean isDisabled()
263 	{
264 		return getConfig().getDisabled();
265 	}
266 	
267 	public void setDisabled( boolean disabled )
268 	{
269 		boolean oldDisabled = isDisabled();
270 		
271 		if( disabled )
272 			getConfig().setDisabled( disabled );
273 		else
274 			getConfig().unsetDisabled();
275 		
276 		notifyPropertyChanged( DISABLED_PROPERTY, oldDisabled, disabled );
277 	}
278 }