/* * 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.actions; import com.eviware.soapui.config.RestParametersConfig; import com.eviware.soapui.impl.rest.RestMethod; import com.eviware.soapui.impl.rest.RestRequest; import com.eviware.soapui.impl.rest.RestRequestInterface; import com.eviware.soapui.impl.rest.RestResource; import com.eviware.soapui.impl.rest.RestService; import com.eviware.soapui.impl.rest.RestServiceFactory; import com.eviware.soapui.impl.rest.RestURIParser; import com.eviware.soapui.impl.rest.support.RestParamProperty; import com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder; import com.eviware.soapui.impl.rest.support.RestURIParserImpl; import com.eviware.soapui.impl.rest.support.RestUtils; import com.eviware.soapui.impl.rest.support.XmlBeansRestParamsTestPropertyHolder; import com.eviware.soapui.impl.support.AbstractInterface; import com.eviware.soapui.impl.wsdl.WsdlProject; import com.eviware.soapui.support.ModelItemNamer; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.UISupport; import org.apache.commons.lang.ArrayUtils; import java.net.MalformedURLException; public class RestServiceBuilder { public void createRestService(WsdlProject project, String URI) throws MalformedURLException { if (StringUtils.isNullOrEmpty(URI)) { return; } RestResource restResource = createResource(ModelCreationStrategy.CREATE_NEW_MODEL, project, URI); RestRequest restRequest = addNewRequest(addNewMethod(ModelCreationStrategy.CREATE_NEW_MODEL, restResource, RestRequestInterface.HttpMethod.GET)); copyParameters(extractParams(URI), restResource.getParams()); UISupport.select(restRequest); UISupport.showDesktopPanel(restRequest); } protected RestParamsPropertyHolder extractParams(String URI) { RestParamsPropertyHolder params = new XmlBeansRestParamsTestPropertyHolder(null, RestParametersConfig.Factory.newInstance()); extractAndFillParameters(URI, params); return params; } protected RestResource createResource(ModelCreationStrategy creationStrategy, WsdlProject project, String URI) throws MalformedURLException { RestURIParser restURIParser = new RestURIParserImpl(URI); String resourcePath = restURIParser.getResourcePath(); String host = restURIParser.getEndpoint(); RestService restService = null; if (creationStrategy == ModelCreationStrategy.REUSE_MODEL) { AbstractInterface<?> existingInterface = project.getInterfaceByName(host); if (existingInterface instanceof RestService && ArrayUtils.contains(existingInterface.getEndpoints(), host)) { restService = (RestService) existingInterface; } } if (restService == null) { restService = (RestService) project.addNewInterface(host, RestServiceFactory.REST_TYPE); restService.addEndpoint(restURIParser.getEndpoint()); } if (creationStrategy == ModelCreationStrategy.REUSE_MODEL) { RestResource existingResource = restService.getResourceByFullPath(RestResource.removeMatrixParams(resourcePath)); if (existingResource != null) { return existingResource; } } return restService.addNewResource(restURIParser.getResourceName(), resourcePath); } protected void extractAndFillParameters(String URI, RestParamsPropertyHolder params) { // This does lot of magic including extracting and filling up parameters on the params RestUtils.extractParams(URI, params, false, RestUtils.TemplateExtractionOption.EXTRACT_TEMPLATE_PARAMETERS); } //TODO: In advanced version we have to apply filtering like which type of parameter goes to which location protected void copyParameters(RestParamsPropertyHolder srcParams, RestParamsPropertyHolder destinationParams) { for (int i = 0; i < srcParams.size(); i++) { RestParamProperty prop = srcParams.getPropertyAt(i); destinationParams.addParameter(prop); } } //TODO: In advanced version we have to apply filtering like which type of parameter goes to which location protected void copyParametersWithDefaultsOnResource(RestParamsPropertyHolder srcParams, RestParamsPropertyHolder resourceParams, RestParamsPropertyHolder requestParams) { for (int i = 0; i < srcParams.size(); i++) { RestParamProperty prop = srcParams.getPropertyAt(i); String value = prop.getValue(); prop.setValue(""); prop.setDefaultValue(""); resourceParams.addParameter(prop); requestParams.getProperty(prop.getName()).setValue(value); } } protected RestMethod addNewMethod(ModelCreationStrategy creationStrategy, RestResource restResource, RestRequestInterface.HttpMethod requestMethod) { if (creationStrategy == ModelCreationStrategy.REUSE_MODEL) { for (RestMethod restMethod : restResource.getRestMethodList()) { if (restMethod.getMethod() == requestMethod) { return restMethod; } } } String methodName = ModelItemNamer.createName(restResource.getName(), restResource.getRestMethodList()); RestMethod restMethod = restResource.addNewMethod(methodName); restMethod.setMethod(requestMethod); return restMethod; } protected RestRequest addNewRequest(RestMethod restMethod) { return restMethod.addNewRequest("Request " + (restMethod.getRequestCount() + 1)); } protected static enum ModelCreationStrategy { CREATE_NEW_MODEL, REUSE_MODEL } }