View Javadoc

1   /*
2    *  soapUI, copyright (C) 2006 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
6    *  either version 2.1 of the License, or (at your option) any later version.
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.SoapUI;
23  import com.eviware.soapui.config.TestStepConfig;
24  import com.eviware.soapui.config.TransferValuesStepConfig;
25  import com.eviware.soapui.config.ValueTransferConfig;
26  import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
27  import com.eviware.soapui.impl.wsdl.support.HelpUrls;
28  import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
29  import com.eviware.soapui.impl.wsdl.teststeps.actions.CloneTestStepAction;
30  import com.eviware.soapui.impl.wsdl.teststeps.actions.ShowTransferValuesResultsAction;
31  import com.eviware.soapui.model.testsuite.TestRunContext;
32  import com.eviware.soapui.model.testsuite.TestRunner;
33  import com.eviware.soapui.model.testsuite.TestStepResult;
34  import com.eviware.soapui.model.testsuite.TestStepResult.TestStepStatus;
35  import com.eviware.soapui.monitor.TestMonitor;
36  import com.eviware.soapui.support.UISupport;
37  import com.eviware.soapui.support.action.ActionSupport;
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 WsdlTestStep
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)
55  	{
56  		super(testCase, config, true);
57        
58        okIcon = UISupport.createImageIcon("/value_transfer.gif");
59        failedIcon = UISupport.createImageIcon( "/value_transfer_failed.gif" );
60        
61  		setIcon( okIcon);
62        
63  		addAction( ActionSupport.SEPARATOR_ACTION );
64        addAction( new CloneTestStepAction( this, "PropertyTransfer" ) );
65        addAction( ActionSupport.SEPARATOR_ACTION );
66        addAction( new ShowOnlineHelpAction( HelpUrls.PROPERTYTRANSFER_HELP_URL ));
67        
68        if( testCase == null )
69        	postInit( config );
70  	}
71  	
72  	public void postInit( TestStepConfig config )
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  	public void resetConfigOnMove(TestStepConfig config)
94  	{
95  		super.resetConfigOnMove(config);
96  		
97  		transferStepConfig = (TransferValuesStepConfig) config.getConfig().changeType(TransferValuesStepConfig.type);
98  		for( int c = 0; c < transferStepConfig.sizeOfTransfersArray(); c++ )
99  		{
100 			transfers.get( c ).setConfigOnMove( transferStepConfig.getTransfersArray( c ));
101 		}		
102 	}
103 
104 	public TestStepResult run( TestRunner runner, TestRunContext context )
105 	{
106 		TestMonitor testMonitor = SoapUI.getTestMonitor();
107 		boolean hasRunningLoadTest = testMonitor == null ? false : testMonitor.hasRunningLoadTest( getTestCase() );
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 			
120 			try
121 			{
122 				if( canceled )
123 				{
124 					result.setStatus( TestStepStatus.CANCELED );
125 					result.setTimeTaken( System.currentTimeMillis()-startTime );
126 					return result;
127 				}
128 				
129 				String [] values = valueTransfer.transferProperties( context );
130 				if( values != null && values.length > 0 )
131 				{
132 					String name = valueTransfer.getName();
133 					result.addMessage( "Performed transfer [" + name + "]" );
134 					result.addTransferResult( valueTransfer, values );
135 				}
136 			}
137 			catch (PropertyTransferException e)
138 			{
139 				result.addMessage( "Error performing transfer [" + valueTransfer.getName() + "]" );
140 				result.addTransferResult( valueTransfer, new String[] {e.toString()} );
141 				
142 				if( transfers.get( c ).getFailOnError() )
143 				{
144 					result.setError( e );
145 					result.setStatus( TestStepStatus.FAILED );
146 					result.setTimeTaken( System.currentTimeMillis()-startTime );
147 					
148 					if( !hasRunningLoadTest )
149 						setIcon( failedIcon );
150 					
151 					return result;
152 				}
153 			}
154 		}
155 		
156 		if( !hasRunningLoadTest )
157 			setIcon( okIcon );
158 			
159 		result.setStatus( TestStepStatus.OK );
160 		result.setTimeTaken( System.currentTimeMillis()-startTime );
161 		
162 		return result;
163 	}
164 	
165 	public boolean cancel()
166 	{
167 		canceled = true;
168 		return canceled;
169 	}
170 	
171 	public int getTransferCount()
172 	{
173 		return transferStepConfig.sizeOfTransfersArray();
174 	}
175 	
176 	public PropertyTransfer getTransferAt( int index )
177 	{
178 		return transfers.get( index );
179 	}
180 	
181 	public PropertyTransfer addTransfer( String name )
182 	{
183 		PropertyTransfer transfer = new PropertyTransfer( this, transferStepConfig.addNewTransfers());
184 		transfer.setName( name );
185 		transfer.setFailOnError( true );
186 		transfers.add( transfer );
187 		return transfer;
188 	}
189 	
190 	public void removeTransferAt( int index )
191 	{
192 		transfers.remove( index ).release();
193 		transferStepConfig.removeTransfers( index );
194 	}
195 	
196 	public TestStepResult createFailedResult(String message)
197 	{
198 		ValueTransferResult result = new ValueTransferResult();
199 		result.setStatus( TestStepStatus.FAILED );
200 		result.addMessage( message );
201 		
202 		return result;
203 	}
204 	
205 	public void release()
206 	{
207 		super.release();
208 		
209 		for( PropertyTransfer transfer : transfers )
210 		{
211 			transfer.release();
212 		}
213 	}
214 
215 	public class ValueTransferResult extends WsdlTestStepResult
216 	{
217 		private List<ValueTransferConfig> transfers = new ArrayList<ValueTransferConfig>();
218 		private List<String[]> values = new ArrayList<String[]>();
219 		
220 		public ValueTransferResult()
221 		{
222 			super( TransferResponseValuesTestStep.this );
223 		}
224 
225 		public void addTransferResult( PropertyTransfer transfer, String [] values )
226 		{
227 			// save a copy, so we dont mirror changes
228 			transfers.add( ( ValueTransferConfig ) transfer.getConfig().copy()  );
229 			this.values.add( values );
230 		}
231 		
232 		public int getTransferCount()
233 		{
234 			return transfers == null ? 0 : transfers.size();
235 		}
236 		
237 		public ValueTransferConfig getTransferAt( int index )
238 		{
239 			return transfers == null ? null : transfers.get( index );
240 		}
241 		
242 		public String [] getTransferredValuesAt( int index )
243 		{
244 			return values == null ? null : values.get( index );
245 		}
246 		
247 		public void discard()
248 		{
249 			super.discard();
250 			
251 			transfers = null;
252 			values = null;
253 		}
254 
255 		public void writeTo(PrintWriter writer)
256 		{
257 			super.writeTo( writer );
258 			
259 			if( !isDiscarded() )
260 			{
261 				writer.println( "----------------------------------------------------" );
262 				for( int c = 0; c < transfers.size(); c++ )
263 				{
264 					ValueTransferConfig transfer = transfers.get( c );
265 					writer.println( transfer.getName() + " transferred [" + Arrays.toString(values.get( c )) + "] from [" + 
266 							transfer.getSourceStep() + "." + transfer.getSourceType() + "] to [" + 
267 							transfer.getTargetStep() + "." + transfer.getTargetType() + "]" );
268 					if( transfer.getSourcePath() != null )
269 					{
270 						writer.println( "------------ source path -------------" );
271 						writer.println( transfer.getSourcePath() );
272 					}
273 					if( transfer.getTargetPath() != null )
274 					{
275 						writer.println( "------------ target path -------------" );
276 						writer.println( transfer.getTargetPath() );
277 					}
278 				}
279 			}
280 		}
281 	}
282 
283 	public PropertyTransfer getTransferByName(String name)
284 	{
285 		for( int c = 0; c < getTransferCount(); c++ )
286 		{
287 			PropertyTransfer transfer = getTransferAt( c );
288 			if( transfer.getName().equals( name ))
289 				return transfer;
290 		}
291 			
292 		return null;
293 	}
294 }