View Javadoc

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