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 getLabel()
    102 	{
    103 		String name = getName();
    104 		if( isDisabled() )
    105 			return name + " (disabled)";
    106 		else
    107 			return name;
    108 	}
    109
    110    @Override
    111 	public void setName( String name )
    112 	{
    113    	String oldLabel = getLabel();
    114
    115 		super.setName( name );
    116
    117 		String label = getLabel();
    118 		if( !oldLabel.equals( label ))
    119 		{
    120 			notifyPropertyChanged( LABEL_PROPERTY, oldLabel, label );
    121 		}
    122 	}
    123
    124 	public String [] getPropertyNames()
    125 	{
    126    	if( properties == null )
    127    		return new String[0];
    128
    129    	String [] result = new String[properties.size()];
    130    	int ix = 0;
    131    	for( TestStepProperty property : properties.values() )
    132    		result[ix++] = property.getName();
    133
    134    	return result;
    135 	}
    136
    137 	public TestStepProperty getProperty(String name)
    138 	{
    139 		return properties == null || name == null ? null : properties.get( name.toUpperCase() );
    140 	}
    141
    142 	public String getPropertyValue(String name)
    143 	{
    144 		if( properties == null )
    145 			return null;
    146
    147 		TestStepProperty testStepProperty = properties.get( name.toUpperCase());
    148 		return testStepProperty == null ? null : testStepProperty.getValue();
    149 	}
    150
    151 	public void setPropertyValue(String name, String value)
    152 	{
    153 		if( properties == null )
    154 			return;
    155
    156 		TestStepProperty testStepProperty = properties.get( name.toUpperCase());
    157 		if( testStepProperty != null )
    158 		{
    159 			testStepProperty.setValue( value );
    160 		}
    161 	}
    162
    163 	protected void addProperty( TestStepProperty property )
    164 	{
    165 		if( properties == null )
    166 			properties = new HashMap<String,TestStepProperty>();
    167
    168 		properties.put( property.getName().toUpperCase(), property );
    169 	}
    170
    171 	protected void deleteProperty( String name )
    172 	{
    173 		if( properties != null )
    174 			properties.remove( name.toUpperCase() );
    175 	}
    176
    177 	protected void propertyRenamed( String oldName )
    178 	{
    179 		if( properties == null )
    180 			return;
    181
    182 		TestStepProperty testStepProperty = properties.get( oldName.toUpperCase() );
    183 		if( testStepProperty == null )
    184 			return;
    185
    186 		properties.remove( oldName.toUpperCase() );
    187 		String newName = testStepProperty.getName();
    188 		properties.put( newName.toUpperCase(), testStepProperty );
    189
    190 		firePropertyRenamed( oldName, newName );
    191 	}
    192
    193 	public void addTestStepListener( WsdlTestStepListener listener )
    194 	{
    195 		listeners.add( listener );
    196 	}
    197
    198 	public void removeTestStepListener( WsdlTestStepListener listener )
    199 	{
    200 		listeners.remove( listener );
    201 	}
    202
    203 	protected void firePropertyAdded( String name )
    204 	{
    205 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
    206 		for( WsdlTestStepListener listener : array )
    207 		{
    208 			listener.propertyAdded( name );
    209 		}
    210 	}
    211
    212 	protected void firePropertyRemoved( String name )
    213 	{
    214 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
    215 		for( WsdlTestStepListener listener : array )
    216 		{
    217 			listener.propertyRemoved( name );
    218 		}
    219 	}
    220
    221 	protected void firePropertyRenamed( String oldName, String newName )
    222 	{
    223 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
    224 		for( WsdlTestStepListener listener : array )
    225 		{
    226 			listener.propertyRenamed( oldName, newName );
    227 		}
    228 	}
    229
    230 	protected void firePropertyValueChanged( String name, String oldValue, String newValue )
    231 	{
    232 		if( oldValue == null && newValue == null )
    233 			return;
    234
    235 		if( oldValue != null && oldValue.equals( newValue ))
    236 			return;
    237
    238 		if( newValue != null && newValue.equals( oldValue ))
    239 			return;
    240
    241 		WsdlTestStepListener[] array = listeners.toArray( new WsdlTestStepListener[listeners.size()]);
    242 		for( WsdlTestStepListener listener : array )
    243 		{
    244 			listener.propertyValueChanged( name, oldValue, newValue );
    245 		}
    246 	}
    247
    248 	public boolean dependsOn( AbstractWsdlModelItem modelItem )
    249 	{
    250 		return false;
    251 	}
    252
    253 	public String getTestStepTitle()
    254 	{
    255 		return getTestCase().getTestSuite().getName() + "#" + getTestCase().getName();
    256 	}
    257
    258 	/***
    259 	 * Called after cloning for custom behaviour
    260 	 *
    261 	 * @param sourceStep step we were cloned from
    262 	 */
    263
    264 	public WsdlTestStep clone( WsdlTestCase targetTestCase, String name)
    265 	{
    266 		onSave();
    267 		TestStepConfig newConfig = (TestStepConfig) getConfig().copy();
    268 		newConfig.setName( name );
    269 		return targetTestCase.addTestStep( newConfig );
    270 	}
    271
    272 	public void finish( TestRunner testRunner, TestRunContext testRunContext )
    273 	{
    274 	}
    275
    276 	public void prepare( TestRunner testRunner, TestRunContext testRunContext ) throws Exception
    277 	{
    278 	}
    279
    280 	public Collection<WsdlInterface> getRequiredInterfaces()
    281 	{
    282 		return new ArrayList<WsdlInterface>();
    283 	}
    284
    285 	public boolean isDisabled()
    286 	{
    287 		return getConfig().getDisabled();
    288 	}
    289
    290 	public void setDisabled( boolean disabled )
    291 	{
    292 		String oldLabel = getLabel();
    293
    294 		boolean oldDisabled = isDisabled();
    295 		if( oldDisabled == disabled )
    296 			return;
    297
    298 		if( disabled )
    299 			getConfig().setDisabled( disabled );
    300 		else if( getConfig().isSetDisabled() )
    301 			getConfig().unsetDisabled();
    302
    303 		notifyPropertyChanged( DISABLED_PROPERTY, oldDisabled, disabled );
    304
    305 		String label = getLabel();
    306 		if( !oldLabel.equals( label ))
    307 			notifyPropertyChanged( LABEL_PROPERTY, oldLabel, label );
    308 	}
    309 }