/*
* 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.rest;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.RestMethodConfig;
import com.eviware.soapui.config.RestRequestConfig;
import com.eviware.soapui.config.RestResourceRepresentationConfig;
import com.eviware.soapui.impl.rest.RestRepresentation.Type;
import com.eviware.soapui.impl.rest.support.OverlayRestParamsPropertyHolder;
import com.eviware.soapui.impl.rest.support.RestParamProperty;
import com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder;
import com.eviware.soapui.impl.rest.support.XmlBeansRestParamsTestPropertyHolder;
import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Attachment;
import com.eviware.soapui.model.iface.Request;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.testsuite.TestProperty;
import com.eviware.soapui.model.testsuite.TestPropertyListener;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringList;
import com.eviware.soapui.ui.desktop.AbstractSoapUIDesktop;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class RestMethod extends AbstractWsdlModelItem<RestMethodConfig> implements MutableTestPropertyHolder,
PropertyChangeListener {
private List<RestRequest> requests = new ArrayList<RestRequest>();
private List<RestRepresentation> representations = new ArrayList<RestRepresentation>();
private RestResource resource;
private XmlBeansRestParamsTestPropertyHolder params;
private RestParamsPropertyHolder overlayParams;
private PropertyChangeListener representationPropertyChangeListener = new RepresentationPropertyChangeListener();
private TestPropertyListener testPropertyListener = new InternalTestPropertyListener();
public RestMethod(RestResource service, RestMethodConfig methodConfig) {
super(methodConfig, service, "/"
+ (StringUtils.isNullOrEmpty(methodConfig.getMethod()) ? "get" : methodConfig.getMethod().toLowerCase())
+ "_method.gif");
this.resource = service;
if (methodConfig.getParameters() == null) {
methodConfig.addNewParameters();
}
params = new XmlBeansRestParamsTestPropertyHolder(this, methodConfig.getParameters());
for (RestResourceRepresentationConfig config : methodConfig.getRepresentationList()) {
RestRepresentation representation = new RestRepresentation(this, config);
representations.add(representation);
notifyPropertyChanged("representations", null, representation);
}
for (RestRequestConfig config : methodConfig.getRequestList()) {
RestRequest request = new RestRequest(this, config, false);
requests.add(request);
notifyPropertyChanged("childRequests", null, request);
}
addTestPropertyListener(testPropertyListener);
}
public RestParamsPropertyHolder getOverlayParams() {
if (overlayParams == null) {
overlayParams = new OverlayRestParamsPropertyHolder(buildOverlay(getResource()), params);
}
return overlayParams;
}
private RestParamsPropertyHolder buildOverlay(RestResource resource) {
return resource.getParentResource() == null ? resource.getParams() : new OverlayRestParamsPropertyHolder(
buildOverlay(resource.getParentResource()), resource.getParams());
}
public RestResource getOperation() {
return resource;
}
public RestParamProperty addProperty(String name) {
return params.addProperty(name);
}
public void moveProperty(String propertyName, int targetIndex) {
params.moveProperty(propertyName, targetIndex);
}
public RestParamProperty removeProperty(String propertyName) {
return params.removeProperty(propertyName);
}
public boolean renameProperty(String name, String newName) {
return params.renameProperty(name, newName);
}
public void addTestPropertyListener(TestPropertyListener listener) {
params.addTestPropertyListener(listener);
}
public RestParamsPropertyHolder getParams() {
return params;
}
public ModelItem getModelItem() {
return this;
}
public Map<String, TestProperty> getProperties() {
return params.getProperties();
}
public RestParamProperty getProperty(String name) {
return params.getProperty(name);
}
public RestParamProperty getPropertyAt(int index) {
return params.getPropertyAt(index);
}
public int getPropertyCount() {
return params.getPropertyCount();
}
public String[] getPropertyNames() {
return params.getPropertyNames();
}
public String getPropertyValue(String name) {
return params.getPropertyValue(name);
}
public boolean hasProperty(String name) {
return params.hasProperty(name);
}
public void removeTestPropertyListener(TestPropertyListener listener) {
params.removeTestPropertyListener(listener);
}
public void setPropertyValue(String name, String value) {
params.setPropertyValue(name, value);
}
public String getPropertiesLabel() {
return "Method Params";
}
public boolean hasRequestBody() {
RestRequestInterface.HttpMethod method = getMethod();
return method == RestRequestInterface.HttpMethod.POST || method == RestRequestInterface.HttpMethod.PUT
|| method == RestRequestInterface.HttpMethod.PATCH || method == RestRequestInterface.HttpMethod.DELETE;
}
public void propertyChange(PropertyChangeEvent arg0) {
// TODO Auto-generated method stub
}
public PropertyExpansion[] getPropertyExpansions() {
return params.getPropertyExpansions();
}
public RestRequestInterface.HttpMethod getMethod() {
String method = getConfig().getMethod();
return method == null ? null : RestRequestInterface.HttpMethod.valueOf(method);
}
public void setMethod(RestRequestInterface.HttpMethod method) {
RestRequestInterface.HttpMethod old = getMethod();
getConfig().setMethod(method.toString());
setIcon(UISupport.createImageIcon("/" + method.toString().toLowerCase() + "_method.gif"));
notifyPropertyChanged("method", old, method);
}
public String getDefaultRequestMediaType() {
RestRepresentation[] representations = getRepresentations(RestRepresentation.Type.REQUEST, null);
if (representations.length >= 1) {
return representations[0].getMediaType();
}
return "application/json";
}
public RestRepresentation[] getRepresentations() {
return getRepresentations(null, null);
}
public RestRepresentation[] getRepresentations(RestRepresentation.Type type, String mediaType) {
List<RestRepresentation> result = new ArrayList<RestRepresentation>();
Set<String> addedTypes = new HashSet<String>();
for (RestRepresentation representation : representations) {
if ((type == null || type == representation.getType())
&& (mediaType == null || mediaType.equals(representation.getMediaType()))) {
result.add(representation);
addedTypes.add(representation.getMediaType());
}
}
if (type == RestRepresentation.Type.REQUEST) {
for (RestRequest request : requests) {
for (Attachment attachment : request.getAttachments()) {
if ((mediaType == null || mediaType.equals(attachment.getContentType()))
&& !addedTypes.contains(attachment.getContentType())) {
RestRepresentation representation = new RestRepresentation(this,
RestResourceRepresentationConfig.Factory.newInstance());
representation.setType(RestRepresentation.Type.REQUEST);
representation.setMediaType(attachment.getContentType());
result.add(representation);
}
}
}
}
return result.toArray(new RestRepresentation[result.size()]);
}
public String[] getResponseMediaTypes() {
StringList result = new StringList();
for (RestRepresentation representation : getRepresentations(Type.RESPONSE, null)) {
if (!result.contains(representation.getMediaType())) {
result.add(representation.getMediaType());
}
}
return result.toStringArray();
}
public RestRepresentation addNewRepresentation(Type type) {
RestRepresentation representation = new RestRepresentation(this, getConfig().addNewRepresentation());
representation.setType(type);
representation.addPropertyChangeListener(representationPropertyChangeListener);
representations.add(representation);
notifyPropertyChanged("representations", null, representation);
return representation;
}
public void removeRepresentation(RestRepresentation representation) {
int ix = representations.indexOf(representation);
representations.remove(ix);
representation.removePropertyChangeListener(representationPropertyChangeListener);
notifyPropertyChanged("representations", representation, null);
getConfig().removeRepresentation(ix);
representation.release();
}
public void removeRequest(RestRequest request) {
int ix = requests.indexOf(request);
requests.remove(ix);
try {
(getInterface()).fireRequestRemoved(request);
notifyPropertyChanged("childRequests", request, null);
} finally {
request.release();
getConfig().removeRequest(ix);
}
}
public RestResource getResource() {
return resource;
}
public List<RestRequest> getRequestList() {
return new ArrayList<RestRequest>(requests);
}
public RestRequest getRequestAt(int index) {
return requests.get(index);
}
public RestRequest getRequestByName(String name) {
return (RestRequest) getWsdlModelItemByName(requests, name);
}
public int getRequestCount() {
return requests.size();
}
public RestRequest addNewRequest(String name) {
RestRequestConfig requestConfig = getConfig().addNewRequest();
requestConfig.setName(name);
RestRequest request = new RestRequest(this, requestConfig, false);
requests.add(request);
request.resetPropertyValues();
String[] endpoints = getInterface().getEndpoints();
if (endpoints.length > 0) {
request.setEndpoint(endpoints[0]);
}
notifyPropertyChanged("childRequests", null, request);
return request;
}
public RestRequest cloneRequest(RestRequest request, String name) {
request.beforeSave();
RestRequestConfig requestConfig = (RestRequestConfig) getConfig().addNewRequest().set(request.getConfig());
requestConfig.setName(name);
RestRequest newRequest = new RestRequest(this, requestConfig, false);
requests.add(newRequest);
notifyPropertyChanged("childRequests", null, newRequest);
return newRequest;
}
public RestParamProperty[] getDefaultParams() {
List<RestParamProperty> result = new ArrayList<RestParamProperty>();
Set<String> names = new HashSet<String>();
result.addAll(Arrays.asList(resource.getDefaultParams()));
for (int c = 0; c < getPropertyCount(); c++) {
if (names.contains(getPropertyAt(c).getName())) {
continue;
}
result.add(getPropertyAt(c));
names.add(getPropertyAt(c).getName());
}
return result.toArray(new RestParamProperty[result.size()]);
}
public RestService getInterface() {
return resource.getInterface();
}
public List<? extends ModelItem> getChildren() {
return getRequestList();
}
@Override
public void release() {
((AbstractSoapUIDesktop) SoapUI.getDesktop()).closeDependantPanels(this);
super.release();
for (int i = requests.size(); i > 0; i--) {
requests.get(i - 1).release();
}
getOperation().removePropertyChangeListener(this);
params.release();
removeTestPropertyListener(testPropertyListener);
}
public List<TestProperty> getPropertyList() {
return params.getPropertyList();
}
private class RepresentationPropertyChangeListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Request.MEDIA_TYPE)
&& ((RestRepresentation) evt.getSource()).getType() == Type.RESPONSE) {
RestMethod.this.notifyPropertyChanged("responseMediaTypes", null, getResponseMediaTypes());
}
}
}
private class InternalTestPropertyListener implements TestPropertyListener {
public void propertyAdded(String name) {
}
public void propertyMoved(String name, int oldIndex, int newIndex) {
}
public void propertyRemoved(String name) {
}
public void propertyRenamed(String oldName, String newName) {
}
public void propertyValueChanged(String name, String oldValue, String newValue) {
getProperty(name).setDefaultValue(newValue);
}
}
}