1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.teststeps;
14
15 import com.eviware.soapui.config.PropertyTransferConfig;
16 import com.eviware.soapui.config.PropertyTransfersStepConfig;
17 import com.eviware.soapui.config.TestStepConfig;
18 import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
19 import com.eviware.soapui.impl.wsdl.teststeps.actions.ShowTransferValuesResultsAction;
20 import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
21 import com.eviware.soapui.model.propertyexpansion.PropertyExpansionUtils;
22 import com.eviware.soapui.model.support.XPathReference;
23 import com.eviware.soapui.model.support.XPathReferenceContainer;
24 import com.eviware.soapui.model.support.XPathReferenceImpl;
25 import com.eviware.soapui.model.testsuite.TestRunContext;
26 import com.eviware.soapui.model.testsuite.TestRunner;
27 import com.eviware.soapui.model.testsuite.TestStepResult;
28 import com.eviware.soapui.model.testsuite.TestStepResult.TestStepStatus;
29 import com.eviware.soapui.support.StringUtils;
30 import com.eviware.soapui.support.UISupport;
31 import com.eviware.soapui.support.resolver.ResolveContext;
32
33 import javax.swing.*;
34 import java.io.PrintWriter;
35 import java.util.ArrayList;
36 import java.util.Arrays;
37 import java.util.List;
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 PropertyTransfersTestStep extends WsdlTestStepWithProperties implements XPathReferenceContainer
47 {
48 private PropertyTransfersStepConfig transferStepConfig;
49 private boolean canceled;
50 private List<PropertyTransfer> transfers = new ArrayList<PropertyTransfer>();
51 private ImageIcon failedIcon;
52 private ImageIcon okIcon;
53
54 public PropertyTransfersTestStep(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 = (PropertyTransfersStepConfig) config.getConfig().changeType(
74 PropertyTransfersStepConfig.type);
75 for (int c = 0; c < transferStepConfig.sizeOfTransfersArray(); c++)
76 {
77 transfers.add(new PropertyTransfer(this, transferStepConfig.getTransfersArray(c)));
78 }
79 }
80 else
81 {
82 transferStepConfig = (PropertyTransfersStepConfig) config.addNewConfig().changeType(
83 PropertyTransfersStepConfig.type);
84 }
85
86 super.afterLoad();
87 }
88
89 public PropertyTransfersStepConfig getTransferConfig()
90 {
91 return transferStepConfig;
92 }
93
94 @Override
95 public void resetConfigOnMove(TestStepConfig config)
96 {
97 super.resetConfigOnMove(config);
98
99 transferStepConfig = (PropertyTransfersStepConfig) config.getConfig()
100 .changeType(PropertyTransfersStepConfig.type);
101 for (int c = 0; c < transferStepConfig.sizeOfTransfersArray(); c++)
102 {
103 transfers.get(c).setConfigOnMove(transferStepConfig.getTransfersArray(c));
104 }
105 }
106
107 public TestStepResult run(TestRunner runner, TestRunContext context)
108 {
109 return run(runner, context, null);
110 }
111
112 public TestStepResult run(TestRunner runner, TestRunContext context, PropertyTransfer transfer)
113 {
114 PropertyTransferResult result = new PropertyTransferResult();
115 result.addAction(new ShowTransferValuesResultsAction(result), true);
116
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
229 public PropertyTransferResult()
230 {
231 super(PropertyTransfersTestStep.this);
232 }
233
234 public void addTransferResult(PropertyTransfer transfer, String[] values)
235 {
236
237 transfers.add((PropertyTransferConfig) transfer.getConfig().copy());
238 this.values.add(values);
239 }
240
241 public int getTransferCount()
242 {
243 return transfers == null ? 0 : transfers.size();
244 }
245
246 public PropertyTransferConfig getTransferAt(int index)
247 {
248 return transfers == null ? null : transfers.get(index);
249 }
250
251 public String[] getTransferredValuesAt(int index)
252 {
253 return values == null ? null : values.get(index);
254 }
255
256 @Override
257 public void discard()
258 {
259 super.discard();
260
261 transfers = null;
262 values = null;
263 }
264
265 @Override
266 public void writeTo(PrintWriter writer)
267 {
268 super.writeTo(writer);
269
270 if (!isDiscarded())
271 {
272 writer.println("----------------------------------------------------");
273 for (int c = 0; c < transfers.size(); c++)
274 {
275 PropertyTransferConfig transfer = transfers.get(c);
276 writer.println(transfer.getName() + " transferred [" + Arrays.toString(values.get(c)) + "] from ["
277 + transfer.getSourceStep() + "." + transfer.getSourceType() + "] to [" + transfer.getTargetStep()
278 + "." + transfer.getTargetType() + "]");
279 if (transfer.getSourcePath() != null)
280 {
281 writer.println("------------ source path -------------");
282 writer.println(transfer.getSourcePath());
283 }
284 if (transfer.getTargetPath() != null)
285 {
286 writer.println("------------ target path -------------");
287 writer.println(transfer.getTargetPath());
288 }
289 }
290 }
291 }
292 }
293
294 public PropertyTransfer getTransferByName(String name)
295 {
296 for (int c = 0; c < getTransferCount(); c++)
297 {
298 PropertyTransfer transfer = getTransferAt(c);
299 if (transfer.getName().equals(name))
300 return transfer;
301 }
302
303 return null;
304 }
305
306 public PropertyExpansion[] getPropertyExpansions()
307 {
308 List<PropertyExpansion> result = new ArrayList<PropertyExpansion>();
309
310 for (PropertyTransfer transfer : transfers)
311 {
312 result.addAll(PropertyExpansionUtils.extractPropertyExpansions(this, transfer, "sourcePath"));
313 result.addAll(PropertyExpansionUtils.extractPropertyExpansions(this, transfer, "targetPath"));
314 }
315
316 return result.toArray(new PropertyExpansion[result.size()]);
317 }
318
319 @Override
320 public boolean hasProperties()
321 {
322 return false;
323 }
324
325 public XPathReference[] getXPathReferences()
326 {
327 List<XPathReference> result = new ArrayList<XPathReference>();
328
329 for (PropertyTransfer transfer : transfers)
330 {
331 if (StringUtils.hasContent(transfer.getSourcePath()))
332 result.add(new XPathReferenceImpl("Source path for " + transfer.getName() + " PropertyTransfer in "
333 + getName(), transfer.getSourceProperty(), transfer, "sourcePath"));
334
335 if (StringUtils.hasContent(transfer.getTargetPath()))
336 result.add(new XPathReferenceImpl("Target path for " + transfer.getName() + " PropertyTransfer in "
337 + getName(), transfer.getTargetProperty(), transfer, "targetPath"));
338 }
339
340 return result.toArray(new XPathReference[result.size()]);
341 }
342
343 @SuppressWarnings("unchecked")
344 @Override
345 public void resolve(ResolveContext context)
346 {
347 super.resolve(context);
348
349 for (PropertyTransfer pTransfer : transfers)
350 {
351 pTransfer.resolver( context , this);
352
353 }
354 }
355 }