/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.actions.iface;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlRequest;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.support.PathUtils;
import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Request;
import com.eviware.soapui.model.testsuite.TestCase;
import com.eviware.soapui.model.testsuite.TestSuite;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.action.support.AbstractSoapUIAction;
import com.eviware.soapui.support.components.ModelItemListDesktopPanel;
import com.eviware.soapui.support.xml.XmlUtils;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormField;
import com.eviware.x.form.XFormFieldListener;
import com.eviware.x.form.support.ADialogBuilder;
import com.eviware.x.form.support.AField;
import com.eviware.x.form.support.AField.AFieldType;
import com.eviware.x.form.support.AForm;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Updates the definition of a WsdlInterface.
*
* @author Ole.Matzura
*/
public class UpdateInterfaceAction extends AbstractSoapUIAction<WsdlInterface> {
public static final String SOAPUI_ACTION_ID = "UpdateInterfaceAction";
private XFormDialog dialog = null;
public UpdateInterfaceAction() {
this("Update Definition", "Reloads the definition for this interface and its operations");
}
protected UpdateInterfaceAction(String name, String description) {
super(name, description);
}
public void perform(WsdlInterface iface, Object param) {
if (RemoveInterfaceAction.hasRunningDependingTests(iface)) {
UISupport.showErrorMessage("Cannot update Interface due to running depending tests");
return;
}
if (dialog == null) {
dialog = ADialogBuilder.buildDialog(Form.class);
dialog.setBooleanValue(Form.CREATE_REQUESTS, true);
dialog.getFormField(Form.CREATE_BACKUPS).setEnabled(false);
dialog.getFormField(Form.RECREATE_OPTIONAL).setEnabled(false);
dialog.getFormField(Form.KEEP_EXISTING).setEnabled(false);
dialog.getFormField(Form.RECREATE_REQUESTS).addFormFieldListener(new XFormFieldListener() {
public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
boolean enabled = dialog.getBooleanValue(Form.RECREATE_REQUESTS);
dialog.getFormField(Form.CREATE_BACKUPS).setEnabled(enabled);
dialog.getFormField(Form.RECREATE_OPTIONAL).setEnabled(enabled);
dialog.getFormField(Form.KEEP_EXISTING).setEnabled(enabled);
}
});
}
dialog.setValue(Form.DEFINITION_URL, iface.getDefinition());
dialog.getFormField(Form.DEFINITION_URL).setToolTip(PathUtils.expandPath(iface.getDefinition(), iface));
if (!dialog.show()) {
return;
}
String url = dialog.getValue(Form.DEFINITION_URL);
if (url == null || url.trim().length() == 0) {
return;
}
String expUrl = PathUtils.expandPath(url, iface);
if (expUrl.trim().length() == 0) {
return;
}
try {
File file = new File(expUrl);
if (file.exists()) {
expUrl = file.toURI().toURL().toString();
}
} catch (Exception e) {
SoapUI.logError(e);
}
boolean createRequests = dialog.getBooleanValue(Form.CREATE_REQUESTS);
try {
UISupport.setHourglassCursor();
if (iface.updateDefinition(expUrl, createRequests)) {
afterUpdate(iface);
if (!url.equals(expUrl)) {
iface.setDefinition(url, false);
}
} else {
UISupport.showInfoMessage("Update of interface failed", "Update Definition");
}
} catch (Exception e1) {
UISupport.showInfoMessage("Failed to update interface: [" + e1 + "]", "Update Definition");
SoapUI.logError(e1);
} finally {
UISupport.resetCursor();
}
}
protected void afterUpdate(WsdlInterface iface) throws Exception {
if (dialog.getBooleanValue(Form.RECREATE_REQUESTS)) {
boolean buildOptional = dialog.getBooleanValue(Form.RECREATE_OPTIONAL);
boolean createBackups = dialog.getBooleanValue(Form.CREATE_BACKUPS);
boolean keepExisting = dialog.getBooleanValue(Form.KEEP_EXISTING);
boolean keepHeaders = dialog.getBooleanValue(Form.KEEP_HEADERS);
List<ModelItem> updated = new ArrayList<ModelItem>();
updated.addAll(recreateRequests(iface, buildOptional, createBackups, keepExisting, keepHeaders));
if (dialog.getBooleanValue(Form.UPDATE_TESTREQUESTS)) {
updated.addAll(recreateTestRequests(iface, buildOptional, createBackups, keepExisting, keepHeaders));
}
UISupport.showInfoMessage("Update of interface successfull, [" + updated.size()
+ "] Requests/TestRequests have" + " been updated.", "Update Definition");
if (dialog.getBooleanValue(Form.OPEN_LIST)) {
UISupport
.showDesktopPanel(new ModelItemListDesktopPanel("Updated Requests/TestRequests",
"The following Request/TestRequests where updated", updated.toArray(new ModelItem[updated
.size()])));
}
} else {
UISupport.showInfoMessage("Update of interface successful", "Update Definition");
}
}
public static List<Request> recreateRequests(WsdlInterface iface, boolean buildOptional, boolean createBackups,
boolean keepExisting, boolean keepHeaders) {
int count = 0;
List<Request> result = new ArrayList<Request>();
// first check operations
for (int c = 0; c < iface.getOperationCount(); c++) {
WsdlOperation operation = iface.getOperationAt(c);
String newRequest = operation.createRequest(buildOptional);
List<Request> requests = operation.getRequestList();
for (Request request : requests) {
String requestContent = request.getRequestContent();
if (keepHeaders) {
newRequest = SoapUtils.transferSoapHeaders(requestContent, newRequest, iface.getSoapVersion());
}
String req = XmlUtils.transferValues(requestContent, newRequest);
// changed?
if (!req.equals(requestContent)) {
if (!XmlUtils.prettyPrintXml(req).equals(XmlUtils.prettyPrintXml(requestContent))) {
if (createBackups) {
WsdlRequest backupRequest = operation.addNewRequest("Backup of [" + request.getName() + "]");
((WsdlRequest) request).copyTo(backupRequest, false, false);
}
((WsdlRequest) request).setRequestContent(req);
count++;
result.add(request);
}
}
}
}
return result;
}
public static List<WsdlTestRequestStep> recreateTestRequests(WsdlInterface iface, boolean buildOptional,
boolean createBackups, boolean keepExisting, boolean keepHeaders) {
int count = 0;
List<WsdlTestRequestStep> result = new ArrayList<WsdlTestRequestStep>();
// now check testsuites..
for (TestSuite testSuite : iface.getProject().getTestSuiteList()) {
for (TestCase testCase : testSuite.getTestCaseList()) {
int testStepCount = testCase.getTestStepCount();
for (int c = 0; c < testStepCount; c++) {
WsdlTestStep testStep = (WsdlTestStep) testCase.getTestStepAt(c);
if (testStep instanceof WsdlTestRequestStep) {
WsdlTestRequest testRequest = ((WsdlTestRequestStep) testStep).getTestRequest();
if (testRequest != null && testRequest.getOperation() != null
&& testRequest.getOperation().getInterface() == iface) {
String newRequest = testRequest.getOperation().createRequest(buildOptional);
if (keepHeaders) {
newRequest = SoapUtils.transferSoapHeaders(testRequest.getRequestContent(), newRequest,
iface.getSoapVersion());
}
if (keepExisting) {
newRequest = XmlUtils.transferValues(testRequest.getRequestContent(), newRequest);
}
// changed?
if (!newRequest.equals(testRequest.getRequestContent())) {
if (createBackups) {
((WsdlTestCase) testCase).importTestStep(testStep,
"Backup of [" + testStep.getName() + "]", -1, true).setDisabled(true);
}
((WsdlRequest) testRequest).setRequestContent(newRequest);
count++;
result.add((WsdlTestRequestStep) testStep);
}
}
}
}
}
}
return result;
}
@AForm(description = "Specify Update Definition options", name = "Update Definition", helpUrl = HelpUrls.UPDATE_INTERFACE_HELP_URL, icon = UISupport.TOOL_ICON_PATH)
protected interface Form {
@AField(name = "Definition URL", description = "The URL or file for the updated definition", type = AFieldType.FILE)
public final static String DEFINITION_URL = "Definition URL";
@AField(name = "Create New Requests", description = "Create default requests for new methods", type = AFieldType.BOOLEAN)
public final static String CREATE_REQUESTS = "Create New Requests";
@AField(name = "Recreate Requests", description = "Recreate existing request with the new schema", type = AFieldType.BOOLEAN)
public final static String RECREATE_REQUESTS = "Recreate Requests";
@AField(name = "Recreate Optional", description = "Recreate optional content when updating requests", type = AFieldType.BOOLEAN)
public final static String RECREATE_OPTIONAL = "Recreate Optional";
@AField(name = "Keep Existing", description = "Keeps existing values when recreating requests", type = AFieldType.BOOLEAN)
public final static String KEEP_EXISTING = "Keep Existing";
@AField(name = "Keep SOAP Headers", description = "Keeps any SOAP Headers when recreating requests", type = AFieldType.BOOLEAN)
public final static String KEEP_HEADERS = "Keep SOAP Headers";
@AField(name = "Create Backups", description = "Create backup copies of changed requests", type = AFieldType.BOOLEAN)
public final static String CREATE_BACKUPS = "Create Backups";
@AField(name = "Update TestRequests", description = "Updates all TestRequests for operations in this Interface also", type = AFieldType.BOOLEAN)
public final static String UPDATE_TESTREQUESTS = "Update TestRequests";
@AField(name = "Open Request List", description = "Opens a list of all requests that have been updated", type = AFieldType.BOOLEAN)
public final static String OPEN_LIST = "Open Request List";
}
}