View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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.io.PrintWriter;
16  import java.util.ArrayList;
17  import java.util.Arrays;
18  import java.util.List;
19  
20  import javax.swing.ImageIcon;
21  
22  import com.eviware.soapui.config.PropertyTransferConfig;
23  import com.eviware.soapui.config.PropertyTransfersStepConfig;
24  import com.eviware.soapui.config.TestStepConfig;
25  import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
26  import com.eviware.soapui.impl.wsdl.teststeps.actions.ShowTransferValuesResultsAction;
27  import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
28  import com.eviware.soapui.model.propertyexpansion.PropertyExpansionUtils;
29  import com.eviware.soapui.model.support.XPathReference;
30  import com.eviware.soapui.model.support.XPathReferenceContainer;
31  import com.eviware.soapui.model.support.XPathReferenceImpl;
32  import com.eviware.soapui.model.testsuite.TestCaseRunContext;
33  import com.eviware.soapui.model.testsuite.TestCaseRunner;
34  import com.eviware.soapui.model.testsuite.TestStepResult;
35  import com.eviware.soapui.model.testsuite.TestStepResult.TestStepStatus;
36  import com.eviware.soapui.support.StringUtils;
37  import com.eviware.soapui.support.UISupport;
38  import com.eviware.soapui.support.action.swing.ActionList;
39  import com.eviware.soapui.support.resolver.ResolveContext;
40  
41  /***
42   * WsdlTestStep for transferring values from a WsdlTestRequest response to a
43   * WsdlTestRequest request using XPath expressions
44   * 
45   * @author Ole.Matzura
46   */
47  
48  public class PropertyTransfersTestStep extends WsdlTestStepWithProperties implements XPathReferenceContainer
49  {
50  	private PropertyTransfersStepConfig transferStepConfig;
51  	private boolean canceled;
52  	private List<PropertyTransfer> transfers = new ArrayList<PropertyTransfer>();
53  	private ImageIcon failedIcon;
54  	private ImageIcon okIcon;
55  
56  	public PropertyTransfersTestStep( WsdlTestCase testCase, TestStepConfig config, boolean forLoadTest )
57  	{
58  		super( testCase, config, true, forLoadTest );
59  
60  		if( !forLoadTest )
61  		{
62  			okIcon = UISupport.createImageIcon( "/value_transfer.gif" );
63  			failedIcon = UISupport.createImageIcon( "/value_transfer_failed.gif" );
64  			setIcon( okIcon );
65  		}
66  	}
67  
68  	@Override
69  	public void afterLoad()
70  	{
71  		TestStepConfig config = getConfig();
72  
73  		if( config.getConfig() != null )
74  		{
75  			transferStepConfig = ( PropertyTransfersStepConfig )config.getConfig().changeType(
76  					PropertyTransfersStepConfig.type );
77  			for( int c = 0; c < transferStepConfig.sizeOfTransfersArray(); c++ )
78  			{
79  				transfers.add( new PropertyTransfer( this, transferStepConfig.getTransfersArray( c ) ) );
80  			}
81  		}
82  		else
83  		{
84  			transferStepConfig = ( PropertyTransfersStepConfig )config.addNewConfig().changeType(
85  					PropertyTransfersStepConfig.type );
86  		}
87  
88  		super.afterLoad();
89  	}
90  
91  	public PropertyTransfersStepConfig getTransferConfig()
92  	{
93  		return transferStepConfig;
94  	}
95  
96  	@Override
97  	public void resetConfigOnMove( TestStepConfig config )
98  	{
99  		super.resetConfigOnMove( config );
100 
101 		transferStepConfig = ( PropertyTransfersStepConfig )config.getConfig().changeType(
102 				PropertyTransfersStepConfig.type );
103 		for( int c = 0; c < transferStepConfig.sizeOfTransfersArray(); c++ )
104 		{
105 			transfers.get( c ).setConfigOnMove( transferStepConfig.getTransfersArray( c ) );
106 		}
107 	}
108 
109 	public TestStepResult run( TestCaseRunner runner, TestCaseRunContext context )
110 	{
111 		return run( runner, context, null );
112 	}
113 
114 	public TestStepResult run( TestCaseRunner runner, TestCaseRunContext context, PropertyTransfer transfer )
115 	{
116 		PropertyTransferResult result = new PropertyTransferResult();
117 		canceled = false;
118 
119 		long startTime = System.currentTimeMillis();
120 
121 		for( int c = 0; c < transfers.size(); c++ )
122 		{
123 			PropertyTransfer valueTransfer = transfers.get( c );
124 			if( ( transfer != null && transfer != valueTransfer ) || valueTransfer.isDisabled() )
125 				continue;
126 
127 			try
128 			{
129 				if( canceled )
130 				{
131 					result.setStatus( TestStepStatus.CANCELED );
132 					result.setTimeTaken( System.currentTimeMillis() - startTime );
133 					return result;
134 				}
135 
136 				String[] values = valueTransfer.transferProperties( context );
137 				if( values != null && values.length > 0 )
138 				{
139 					String name = valueTransfer.getName();
140 					result.addMessage( "Performed transfer [" + name + "]" );
141 					result.addTransferResult( valueTransfer, values );
142 				}
143 			}
144 			catch( PropertyTransferException e )
145 			{
146 				result.addMessage( "Error performing transfer [" + valueTransfer.getName() + "] - " + e.getMessage() );
147 				result.addTransferResult( valueTransfer, new String[] { e.getMessage() } );
148 
149 				if( transfers.get( c ).getFailOnError() )
150 				{
151 					result.setError( e );
152 					result.setStatus( TestStepStatus.FAILED );
153 					result.setTimeTaken( System.currentTimeMillis() - startTime );
154 
155 					if( failedIcon != null )
156 						setIcon( failedIcon );
157 
158 					return result;
159 				}
160 			}
161 		}
162 
163 		if( okIcon != null )
164 			setIcon( okIcon );
165 
166 		result.setStatus( TestStepStatus.OK );
167 		result.setTimeTaken( System.currentTimeMillis() - startTime );
168 
169 		return result;
170 	}
171 
172 	@Override
173 	public boolean cancel()
174 	{
175 		canceled = true;
176 		return canceled;
177 	}
178 
179 	public int getTransferCount()
180 	{
181 		return transferStepConfig.sizeOfTransfersArray();
182 	}
183 
184 	public PropertyTransfer getTransferAt( int index )
185 	{
186 		return transfers.get( index );
187 	}
188 
189 	public PropertyTransfer addTransfer( String name )
190 	{
191 		PropertyTransfer transfer = new PropertyTransfer( this, transferStepConfig.addNewTransfers() );
192 		transfer.setName( name );
193 		transfer.setFailOnError( true );
194 		transfers.add( transfer );
195 		return transfer;
196 	}
197 
198 	public void removeTransferAt( int index )
199 	{
200 		transfers.remove( index ).release();
201 		transferStepConfig.removeTransfers( index );
202 	}
203 
204 	public TestStepResult createFailedResult( String message )
205 	{
206 		PropertyTransferResult result = new PropertyTransferResult();
207 		result.setStatus( TestStepStatus.FAILED );
208 		result.addMessage( message );
209 
210 		return result;
211 	}
212 
213 	@Override
214 	public void release()
215 	{
216 		super.release();
217 
218 		for( PropertyTransfer transfer : transfers )
219 		{
220 			transfer.release();
221 		}
222 	}
223 
224 	public class PropertyTransferResult extends WsdlTestStepResult
225 	{
226 		private List<PropertyTransferConfig> transfers = new ArrayList<PropertyTransferConfig>();
227 		private List<String[]> values = new ArrayList<String[]>();
228 		private boolean addedAction;
229 
230 		public PropertyTransferResult()
231 		{
232 			super( PropertyTransfersTestStep.this );
233 		}
234 
235 		public void addTransferResult( PropertyTransfer transfer, String[] values )
236 		{
237 			// save a copy, so we dont mirror changes
238 			transfers.add( ( PropertyTransferConfig )transfer.getConfig().copy() );
239 			this.values.add( values );
240 		}
241 
242 		@Override
243 		public ActionList getActions()
244 		{
245 			if( !addedAction )
246 			{
247 				addAction( new ShowTransferValuesResultsAction( this ), true );
248 				addedAction = true;
249 			}
250 
251 			return super.getActions();
252 		}
253 
254 		public int getTransferCount()
255 		{
256 			return transfers == null ? 0 : transfers.size();
257 		}
258 
259 		public PropertyTransferConfig getTransferAt( int index )
260 		{
261 			return transfers == null ? null : transfers.get( index );
262 		}
263 
264 		public String[] getTransferredValuesAt( int index )
265 		{
266 			return values == null ? null : values.get( index );
267 		}
268 
269 		@Override
270 		public void discard()
271 		{
272 			super.discard();
273 
274 			transfers = null;
275 			values = null;
276 		}
277 
278 		@Override
279 		public void writeTo( PrintWriter writer )
280 		{
281 			super.writeTo( writer );
282 
283 			if( !isDiscarded() )
284 			{
285 				writer.println( "----------------------------------------------------" );
286 				for( int c = 0; c < transfers.size(); c++ )
287 				{
288 					PropertyTransferConfig transfer = transfers.get( c );
289 					writer.println( transfer.getName() + " transferred [" + Arrays.toString( values.get( c ) ) + "] from ["
290 							+ transfer.getSourceStep() + "." + transfer.getSourceType() + "] to [" + transfer.getTargetStep()
291 							+ "." + transfer.getTargetType() + "]" );
292 					if( transfer.getSourcePath() != null )
293 					{
294 						writer.println( "------------ source path -------------" );
295 						writer.println( transfer.getSourcePath() );
296 					}
297 					if( transfer.getTargetPath() != null )
298 					{
299 						writer.println( "------------ target path -------------" );
300 						writer.println( transfer.getTargetPath() );
301 					}
302 				}
303 			}
304 		}
305 	}
306 
307 	public PropertyTransfer getTransferByName( String name )
308 	{
309 		for( int c = 0; c < getTransferCount(); c++ )
310 		{
311 			PropertyTransfer transfer = getTransferAt( c );
312 			if( transfer.getName().equals( name ) )
313 				return transfer;
314 		}
315 
316 		return null;
317 	}
318 
319 	public PropertyExpansion[] getPropertyExpansions()
320 	{
321 		List<PropertyExpansion> result = new ArrayList<PropertyExpansion>();
322 
323 		for( PropertyTransfer transfer : transfers )
324 		{
325 			result.addAll( PropertyExpansionUtils.extractPropertyExpansions( this, transfer, "sourcePath" ) );
326 			result.addAll( PropertyExpansionUtils.extractPropertyExpansions( this, transfer, "targetPath" ) );
327 		}
328 
329 		return result.toArray( new PropertyExpansion[result.size()] );
330 	}
331 
332 	@Override
333 	public boolean hasProperties()
334 	{
335 		return false;
336 	}
337 
338 	public XPathReference[] getXPathReferences()
339 	{
340 		List<XPathReference> result = new ArrayList<XPathReference>();
341 
342 		for( PropertyTransfer transfer : transfers )
343 		{
344 			if( StringUtils.hasContent( transfer.getSourcePath() ) )
345 				result.add( new XPathReferenceImpl( "Source path for " + transfer.getName() + " PropertyTransfer in "
346 						+ getName(), transfer.getSourceProperty(), transfer, "sourcePath" ) );
347 
348 			if( StringUtils.hasContent( transfer.getTargetPath() ) )
349 				result.add( new XPathReferenceImpl( "Target path for " + transfer.getName() + " PropertyTransfer in "
350 						+ getName(), transfer.getTargetProperty(), transfer, "targetPath" ) );
351 		}
352 
353 		return result.toArray( new XPathReference[result.size()] );
354 	}
355 
356 	@Override
357 	public void resolve( ResolveContext<?> context )
358 	{
359 		super.resolve( context );
360 
361 		for( PropertyTransfer pTransfer : transfers )
362 		{
363 			pTransfer.resolve( context, this );
364 
365 		}
366 	}
367 }