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