1
2
3
4
5
6
7
8
9
10
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
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 }