/*
* 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.teststeps.registry;
import com.eviware.soapui.config.HttpRequestConfig;
import com.eviware.soapui.config.RestParameterConfig;
import com.eviware.soapui.config.RestParametersConfig;
import com.eviware.soapui.config.TestStepConfig;
import com.eviware.soapui.impl.rest.RestRequestInterface;
import com.eviware.soapui.impl.rest.actions.support.NewRestResourceActionBase;
import com.eviware.soapui.impl.rest.panels.resource.RestParamsTable;
import com.eviware.soapui.impl.rest.support.RestUtils;
import com.eviware.soapui.impl.rest.support.XmlBeansRestParamsTestPropertyHolder;
import com.eviware.soapui.impl.support.HttpUtils;
import com.eviware.soapui.impl.wsdl.monitor.WsdlMonitorMessageExchange;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.teststeps.HttpTestRequestStep;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep;
import com.eviware.soapui.support.MessageSupport;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.x.form.XFormDialog;
import com.eviware.x.form.XFormOptionsField;
import com.eviware.x.form.support.ADialogBuilder;
import com.eviware.x.form.support.AField;
import com.eviware.x.form.support.AForm;
import com.eviware.x.form.validators.RequiredValidator;
import javax.swing.AbstractAction;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Factory for WsdlTestRequestSteps
*
* @author Ole.Matzura
*/
public class HttpRequestStepFactory extends WsdlTestStepFactory {
private static final String HTTPREQUEST = "httprequest";
public static final String HTTPREQUEST_TYPE = HTTPREQUEST;
private XFormDialog dialog;
public static final MessageSupport messages = MessageSupport.getMessages(HttpRequestStepFactory.class);
private XmlBeansRestParamsTestPropertyHolder params;
private RestParamsTable paramsTable;
public HttpRequestStepFactory() {
super(HTTPREQUEST_TYPE, "HTTP Request", "Submits a HTTP Request and validates its response",
"/http_request_step.png");
}
public WsdlTestStep buildTestStep(WsdlTestCase testCase, TestStepConfig config, boolean forLoadTest) {
return new HttpTestRequestStep(testCase, config, forLoadTest);
}
public TestStepConfig createNewTestStep(WsdlTestCase testCase, String name) {
if (dialog == null) {
buildDialog();
} else {
dialog.setValue(Form.ENDPOINT, "");
}
params = new XmlBeansRestParamsTestPropertyHolder(testCase, RestParametersConfig.Factory.newInstance());
paramsTable = new RestParamsTable(params, false, NewRestResourceActionBase.ParamLocation.RESOURCE, true, false);
dialog.getFormField(Form.PARAMSTABLE).setProperty("component", paramsTable);
dialog.setValue(Form.STEPNAME, name);
try {
if (dialog.show()) {
HttpRequestConfig httpRequest = HttpRequestConfig.Factory.newInstance();
httpRequest.setEndpoint(HttpUtils.completeUrlWithHttpIfProtocolIsNotHttpOrHttpsOrPropertyExpansion(dialog.getValue(Form.ENDPOINT)));
httpRequest.setMethod(dialog.getValue(Form.HTTPMETHOD));
XmlBeansRestParamsTestPropertyHolder tempParams = new XmlBeansRestParamsTestPropertyHolder(testCase,
httpRequest.addNewParameters());
tempParams.addParameters(params);
tempParams.release();
TestStepConfig testStep = TestStepConfig.Factory.newInstance();
testStep.setType(HTTPREQUEST_TYPE);
testStep.setConfig(httpRequest);
testStep.setName(dialog.getValue(Form.STEPNAME));
return testStep;
} else {
return null;
}
} finally {
paramsTable.release();
paramsTable = null;
params = null;
dialog.getFormField(Form.PARAMSTABLE).setProperty("component", paramsTable);
}
}
public TestStepConfig createNewTestStep(WsdlTestCase testCase, String name, String endpoint, String method) {
RestParametersConfig restParamConf = RestParametersConfig.Factory.newInstance();
params = new XmlBeansRestParamsTestPropertyHolder(testCase, restParamConf);
HttpRequestConfig httpRequest = HttpRequestConfig.Factory.newInstance();
httpRequest.setMethod(method);
endpoint = RestUtils.extractParams(endpoint, params, true);
XmlBeansRestParamsTestPropertyHolder tempParams = new XmlBeansRestParamsTestPropertyHolder(testCase,
httpRequest.addNewParameters());
tempParams.addParameters(params);
httpRequest.setEndpoint(HttpUtils.completeUrlWithHttpIfProtocolIsNotHttpOrHttpsOrPropertyExpansion(endpoint));
TestStepConfig testStep = TestStepConfig.Factory.newInstance();
testStep.setType(HTTPREQUEST_TYPE);
testStep.setConfig(httpRequest);
testStep.setName(name);
return testStep;
}
public boolean canCreate() {
return true;
}
@Override
public boolean promptForName() {
return false;
}
private void buildDialog() {
dialog = ADialogBuilder.buildDialog(Form.class);
dialog.getFormField(Form.STEPNAME).addFormFieldValidator(new RequiredValidator());
dialog.getFormField(Form.EXTRACTPARAMS).setProperty("action", new ExtractParamsAction());
((XFormOptionsField) dialog.getFormField(Form.HTTPMETHOD)).setOptions(RestRequestInterface.HttpMethod
.getMethods());
}
@AForm(name = "Form.Title", description = "Form.Description", helpUrl = HelpUrls.HTTP_REQUEST_HELP_URL, icon = UISupport.TOOL_ICON_PATH)
public interface Form {
@AField(description = "Form.TestStepName.Description", type = AField.AFieldType.STRING)
public final static String STEPNAME = messages.get("Form.TestStepName.Label");
@AField(description = "Form.Endpoint.Description", type = AField.AFieldType.STRING)
public final static String ENDPOINT = messages.get("Form.Endpoint.Label");
@AField(description = "Form.ExtractParams.Description", type = AField.AFieldType.ACTION)
public final static String EXTRACTPARAMS = messages.get("Form.ExtractParams.Label");
@AField(description = "Form.ParamsTable.Description", type = AField.AFieldType.COMPONENT)
public final static String PARAMSTABLE = messages.get("Form.ParamsTable.Label");
@AField(description = "Form.HttpMethod.Description", type = AField.AFieldType.ENUMERATION)
public final static String HTTPMETHOD = messages.get("Form.HttpMethod.Label");
}
private class ExtractParamsAction extends AbstractAction {
public ExtractParamsAction() {
super("Extract Params");
}
public void actionPerformed(ActionEvent e) {
try {
String path = RestUtils.extractParams(dialog.getValue(Form.ENDPOINT), params, true);
dialog.setValue(Form.ENDPOINT, path);
if (StringUtils.isNullOrEmpty(dialog.getValue(Form.STEPNAME))) {
setNameFromPath(path);
}
paramsTable.refresh();
} catch (Exception e1) {
UISupport.showInfoMessage("No parameters to extract!");
}
}
private void setNameFromPath(String path) {
String[] items = path.split("/");
if (items.length > 0) {
dialog.setValue(Form.STEPNAME, items[items.length - 1]);
}
}
}
public TestStepConfig createConfig(WsdlMonitorMessageExchange me, String stepName) {
HttpRequestConfig testRequestConfig = HttpRequestConfig.Factory.newInstance();
testRequestConfig.setName(stepName);
testRequestConfig.setEncoding("UTF-8");
testRequestConfig.setEndpoint(me.getEndpoint());
testRequestConfig.setMethod(me.getRequestMethod());
// set parameters
RestParametersConfig parametersConfig = testRequestConfig.addNewParameters();
Map<String, String> parametersMap = me.getHttpRequestParameters();
List<RestParameterConfig> parameterConfigList = new ArrayList<RestParameterConfig>();
for (String name : parametersMap.keySet()) {
RestParameterConfig parameterConf = RestParameterConfig.Factory.newInstance();
parameterConf.setName(name);
parameterConf.setValue(parametersMap.get(name));
parameterConfigList.add(parameterConf);
}
parametersConfig.setParameterArray(parameterConfigList.toArray(new RestParameterConfig[parametersMap.size()]));
testRequestConfig.setParameters(parametersConfig);
// String requestContent = me.getRequestContent();
// testRequestConfig.addNewRequest().setStringValue( requestContent );
TestStepConfig testStep = TestStepConfig.Factory.newInstance();
testStep.setType(HTTPREQUEST);
testStep.setConfig(testRequestConfig);
testStep.setName(stepName);
return testStep;
}
}