1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.iface;
14
15 import java.io.File;
16 import java.util.List;
17
18 import com.eviware.soapui.SoapUI;
19 import com.eviware.soapui.impl.wsdl.WsdlInterface;
20 import com.eviware.soapui.impl.wsdl.WsdlOperation;
21 import com.eviware.soapui.impl.wsdl.WsdlRequest;
22 import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
23 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest;
24 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep;
25 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
26 import com.eviware.soapui.model.iface.Request;
27 import com.eviware.soapui.model.testsuite.TestCase;
28 import com.eviware.soapui.model.testsuite.TestSuite;
29 import com.eviware.soapui.support.UISupport;
30 import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
31 import com.eviware.soapui.support.xml.XmlUtils;
32 import com.eviware.x.form.XFormDialog;
33 import com.eviware.x.form.XFormField;
34 import com.eviware.x.form.XFormFieldListener;
35 import com.eviware.x.form.support.ADialogBuilder;
36 import com.eviware.x.form.support.AField;
37 import com.eviware.x.form.support.AForm;
38 import com.eviware.x.form.support.AField.AFieldType;
39
40 /***
41 * Updates the definition of a WsdlInterface.
42 *
43 * @author Ole.Matzura
44 */
45
46 public class UpdateInterfaceAction extends AbstractSoapUIAction<WsdlInterface>
47 {
48 public static final String SOAPUI_ACTION_ID = "UpdateInterfaceAction";
49 private XFormDialog dialog = null;
50
51 public UpdateInterfaceAction()
52 {
53 super("Update Definition", "Reloads the definition for this interface and its operations");
54 }
55
56 public void perform( WsdlInterface iface, Object param )
57 {
58 if( RemoveInterfaceAction.hasRunningDependingTests( iface ))
59 {
60 UISupport.showErrorMessage( "Cannot update Interface due to running depending tests" );
61 return;
62 }
63
64 if( dialog == null )
65 {
66 dialog = ADialogBuilder.buildDialog( Form.class );
67 dialog.setBooleanValue( Form.CREATE_REQUESTS, true );
68 dialog.getFormField( Form.CREATE_BACKUPS ).setEnabled( false );
69 dialog.getFormField( Form.RECREATE_OPTIONAL ).setEnabled( false );
70 dialog.getFormField( Form.RECREATE_REQUESTS ).addFormFieldListener( new XFormFieldListener() {
71
72 public void valueChanged( XFormField sourceField, String newValue, String oldValue )
73 {
74 boolean enabled = dialog.getBooleanValue( Form.RECREATE_REQUESTS );
75
76 dialog.getFormField( Form.CREATE_BACKUPS ).setEnabled( enabled );
77 dialog.getFormField( Form.RECREATE_OPTIONAL ).setEnabled( enabled );
78 }} );
79 }
80
81 dialog.setValue( Form.DEFINITION_URL, iface.getDefinition() );
82 if( !dialog.show() )
83 return;
84
85 String url = dialog.getValue( Form.DEFINITION_URL );
86 if (url == null || url.trim().length() == 0 )
87 return;
88
89 try
90 {
91 File file = new File( url );
92 if( file.exists() )
93 url = file.toURL().toString();
94 }
95 catch( Exception e )
96 {
97 SoapUI.logError( e );
98 }
99
100 boolean createRequests = dialog.getBooleanValue( Form.CREATE_REQUESTS );
101
102 try
103 {
104 if( iface.updateDefinition( url, createRequests ))
105 {
106 if( dialog.getBooleanValue( Form.RECREATE_REQUESTS ))
107 {
108 int cnt = recreateRequests( iface, dialog.getBooleanValue( Form.RECREATE_OPTIONAL ),
109 dialog.getBooleanValue( Form.CREATE_BACKUPS ) );
110
111 UISupport.showInfoMessage( "Update of interface successfull, [" + cnt + "] requests have" +
112 " been udpated.", "Update Definition" );
113 }
114 else
115 {
116 UISupport.showInfoMessage( "Update of interface successfull", "Update Definition" );
117 }
118 }
119 else
120 UISupport.showInfoMessage( "Update of interface failed", "Update Definition" );
121 }
122 catch (Exception e1)
123 {
124 UISupport.showInfoMessage( "Failed to update interface: [" + e1 + "]", "Update Definition" );
125 SoapUI.logError( e1 );
126 }
127 }
128
129 protected int recreateRequests( WsdlInterface iface, boolean buildOptional, boolean createBackups )
130 {
131 int count = 0;
132
133
134 for( int c = 0; c < iface.getOperationCount(); c++ )
135 {
136 WsdlOperation operation = iface.getOperationAt( c );
137 String newRequest = operation.createRequest( buildOptional );
138 List<Request> requests = operation.getRequests();
139
140 for( Request request : requests )
141 {
142 String requestContent = request.getRequestContent();
143 String req = XmlUtils.transferValues( requestContent, newRequest );
144
145
146 if( !req.equals( requestContent ) )
147 {
148 if( !XmlUtils.prettyPrintXml( req ).equals( XmlUtils.prettyPrintXml( requestContent )))
149 {
150 if( createBackups )
151 {
152 WsdlRequest backupRequest = operation.addNewRequest(
153 "Backup of [" + request.getName() + "]" );
154 ((WsdlRequest)request).copyTo( backupRequest, false, false );
155 }
156
157 ((WsdlRequest)request).setRequestContent( req );
158 count++;
159 }
160 }
161 }
162 }
163
164
165 for( TestSuite testSuite : iface.getProject().getTestSuites() )
166 {
167 for( TestCase testCase : testSuite.getTestCaseList() )
168 {
169 for( int c = 0; c < testCase.getTestStepCount(); c++ )
170 {
171 WsdlTestStep testStep = ( WsdlTestStep ) testCase.getTestStepAt( c );
172 if( testStep instanceof WsdlTestRequestStep )
173 {
174 WsdlTestRequest testRequest = ((WsdlTestRequestStep)testStep).getTestRequest();
175 String newRequest = testRequest.getOperation().createRequest( buildOptional );
176
177 String req = XmlUtils.transferValues( testRequest.getRequestContent(), newRequest );
178
179
180 if( !req.equals( testRequest.getRequestContent() ) )
181 {
182 if( createBackups )
183 {
184 ((WsdlTestCase)testCase).importTestStep( testStep,
185 "Backup of [" + testStep.getName() + "]", -1 ).setDisabled( true );
186 }
187
188 ((WsdlRequest)testRequest).setRequestContent( req );
189 count++;
190 }
191 }
192 }
193 }
194 }
195
196 return count;
197 }
198
199 @AForm(description = "Specify Update Definition options", name = "Update Definition" )
200 protected interface Form
201 {
202 @AField( name="Definition URL", description = "The URL or file for the updated definition", type=AFieldType.FILE )
203 public final static String DEFINITION_URL = "Definition URL";
204
205 @AField( name="Create New Requests", description = "Create default requests for new methods", type=AFieldType.BOOLEAN )
206 public final static String CREATE_REQUESTS = "Create New Requests";
207
208 @AField( name="Recreate Requests", description = "Recreate existing request with the new schema", type=AFieldType.BOOLEAN )
209 public final static String RECREATE_REQUESTS = "Recreate Requests";
210
211 @AField( name="Recreate Optional", description = "Recreate optional content when updating requests", type=AFieldType.BOOLEAN )
212 public final static String RECREATE_OPTIONAL = "Recreate Optional";
213
214 @AField( name="Create Backups", description = "Create backup copies of changed requests",
215 type=AFieldType.BOOLEAN )
216 public final static String CREATE_BACKUPS = "Create Backups";
217 }
218 }