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  
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 			// save a copy, so we dont mirror changes
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 }