1
2
3
4
5
6
7
8
9
10
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
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 }