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.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.testsuite.TestRunContext;
28 import com.eviware.soapui.model.testsuite.TestRunner;
29 import com.eviware.soapui.model.testsuite.TestStepResult;
30 import com.eviware.soapui.model.testsuite.TestStepResult.TestStepStatus;
31 import com.eviware.soapui.support.UISupport;
32
33 /***
34 * WsdlTestStep for transferring values from a WsdlTestRequest response to a
35 * WsdlTestRequest request using XPath expressions
36 *
37 * @author Ole.Matzura
38 */
39
40 public class TransferResponseValuesTestStep extends WsdlTestStep
41 {
42 private TransferValuesStepConfig transferStepConfig;
43 private boolean canceled;
44 private List<PropertyTransfer> transfers = new ArrayList<PropertyTransfer>();
45 private ImageIcon failedIcon;
46 private ImageIcon okIcon;
47
48 public TransferResponseValuesTestStep(WsdlTestCase testCase, TestStepConfig config, boolean forLoadTest)
49 {
50 super(testCase, config, true, forLoadTest);
51
52 if( !forLoadTest )
53 {
54 okIcon = UISupport.createImageIcon("/value_transfer.gif");
55 failedIcon = UISupport.createImageIcon( "/value_transfer_failed.gif" );
56
57 setIcon( okIcon);
58
59
60
61
62
63 }
64
65 if( testCase == null )
66 postInit( config );
67 }
68
69 public void postInit( TestStepConfig config )
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 public void resetConfigOnMove(TestStepConfig config)
91 {
92 super.resetConfigOnMove(config);
93
94 transferStepConfig = (TransferValuesStepConfig) config.getConfig().changeType(TransferValuesStepConfig.type);
95 for( int c = 0; c < transferStepConfig.sizeOfTransfersArray(); c++ )
96 {
97 transfers.get( c ).setConfigOnMove( transferStepConfig.getTransfersArray( c ));
98 }
99 }
100
101 public TestStepResult run( TestRunner runner, TestRunContext context )
102 {
103 return run( runner, context, null);
104 }
105
106 public TestStepResult run( TestRunner runner, TestRunContext context, PropertyTransfer transfer )
107 {
108 ValueTransferResult result = new ValueTransferResult();
109 result.addAction( new ShowTransferValuesResultsAction( result ), true );
110
111 canceled = false;
112
113 long startTime = System.currentTimeMillis();
114
115 for( int c = 0; c < transfers.size(); c++ )
116 {
117 PropertyTransfer valueTransfer = transfers.get( c );
118 if( transfer != null && transfer != valueTransfer )
119 continue;
120
121 try
122 {
123 if( canceled )
124 {
125 result.setStatus( TestStepStatus.CANCELED );
126 result.setTimeTaken( System.currentTimeMillis()-startTime );
127 return result;
128 }
129
130 String [] values = valueTransfer.transferProperties( context );
131 if( values != null && values.length > 0 )
132 {
133 String name = valueTransfer.getName();
134 result.addMessage( "Performed transfer [" + name + "]" );
135 result.addTransferResult( valueTransfer, values );
136 }
137 }
138 catch (PropertyTransferException e)
139 {
140 result.addMessage( "Error performing transfer [" + valueTransfer.getName() + "]" );
141 result.addTransferResult( valueTransfer, new String[] {e.getMessage()} );
142
143 if( transfers.get( c ).getFailOnError() )
144 {
145 result.setError( e );
146 result.setStatus( TestStepStatus.FAILED );
147 result.setTimeTaken( System.currentTimeMillis()-startTime );
148
149 if( failedIcon != null )
150 setIcon( failedIcon );
151
152 return result;
153 }
154 }
155 }
156
157 if( okIcon != null )
158 setIcon( okIcon );
159
160 result.setStatus( TestStepStatus.OK );
161 result.setTimeTaken( System.currentTimeMillis()-startTime );
162
163 return result;
164 }
165
166 public boolean cancel()
167 {
168 canceled = true;
169 return canceled;
170 }
171
172 public int getTransferCount()
173 {
174 return transferStepConfig.sizeOfTransfersArray();
175 }
176
177 public PropertyTransfer getTransferAt( int index )
178 {
179 return transfers.get( index );
180 }
181
182 public PropertyTransfer addTransfer( String name )
183 {
184 PropertyTransfer transfer = new PropertyTransfer( this, transferStepConfig.addNewTransfers());
185 transfer.setName( name );
186 transfer.setFailOnError( true );
187 transfers.add( transfer );
188 return transfer;
189 }
190
191 public void removeTransferAt( int index )
192 {
193 transfers.remove( index ).release();
194 transferStepConfig.removeTransfers( index );
195 }
196
197 public TestStepResult createFailedResult(String message)
198 {
199 ValueTransferResult result = new ValueTransferResult();
200 result.setStatus( TestStepStatus.FAILED );
201 result.addMessage( message );
202
203 return result;
204 }
205
206 public void release()
207 {
208 super.release();
209
210 for( PropertyTransfer transfer : transfers )
211 {
212 transfer.release();
213 }
214 }
215
216 public class ValueTransferResult extends WsdlTestStepResult
217 {
218 private List<ValueTransferConfig> transfers = new ArrayList<ValueTransferConfig>();
219 private List<String[]> values = new ArrayList<String[]>();
220
221 public ValueTransferResult()
222 {
223 super( TransferResponseValuesTestStep.this );
224 }
225
226 public void addTransferResult( PropertyTransfer transfer, String [] values )
227 {
228
229 transfers.add( ( ValueTransferConfig ) transfer.getConfig().copy() );
230 this.values.add( values );
231 }
232
233 public int getTransferCount()
234 {
235 return transfers == null ? 0 : transfers.size();
236 }
237
238 public ValueTransferConfig getTransferAt( int index )
239 {
240 return transfers == null ? null : transfers.get( index );
241 }
242
243 public String [] getTransferredValuesAt( int index )
244 {
245 return values == null ? null : values.get( index );
246 }
247
248 public void discard()
249 {
250 super.discard();
251
252 transfers = null;
253 values = null;
254 }
255
256 public void writeTo(PrintWriter writer)
257 {
258 super.writeTo( writer );
259
260 if( !isDiscarded() )
261 {
262 writer.println( "----------------------------------------------------" );
263 for( int c = 0; c < transfers.size(); c++ )
264 {
265 ValueTransferConfig transfer = transfers.get( c );
266 writer.println( transfer.getName() + " transferred [" + Arrays.toString(values.get( c )) + "] from [" +
267 transfer.getSourceStep() + "." + transfer.getSourceType() + "] to [" +
268 transfer.getTargetStep() + "." + transfer.getTargetType() + "]" );
269 if( transfer.getSourcePath() != null )
270 {
271 writer.println( "------------ source path -------------" );
272 writer.println( transfer.getSourcePath() );
273 }
274 if( transfer.getTargetPath() != null )
275 {
276 writer.println( "------------ target path -------------" );
277 writer.println( transfer.getTargetPath() );
278 }
279 }
280 }
281 }
282 }
283
284 public PropertyTransfer getTransferByName(String name)
285 {
286 for( int c = 0; c < getTransferCount(); c++ )
287 {
288 PropertyTransfer transfer = getTransferAt( c );
289 if( transfer.getName().equals( name ))
290 return transfer;
291 }
292
293 return null;
294 }
295 }