View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 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 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 			// save a copy, so we dont mirror changes
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 }