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