/*
* 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;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.AnonymousTypeConfig;
import com.eviware.soapui.config.DefinitionCacheConfig;
import com.eviware.soapui.config.OperationConfig;
import com.eviware.soapui.config.SoapVersionTypesConfig;
import com.eviware.soapui.config.WsaVersionTypeConfig;
import com.eviware.soapui.config.WsdlInterfaceConfig;
import com.eviware.soapui.impl.WsdlInterfaceFactory;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
import com.eviware.soapui.impl.support.AbstractInterface;
import com.eviware.soapui.impl.wsdl.mock.WsdlMockResponse;
import com.eviware.soapui.impl.wsdl.support.ExternalDependency;
import com.eviware.soapui.impl.wsdl.support.InterfaceExternalDependency;
import com.eviware.soapui.impl.wsdl.support.PathUtils;
import com.eviware.soapui.impl.wsdl.support.policy.PolicyUtils;
import com.eviware.soapui.impl.wsdl.support.soap.SoapMessageBuilder;
import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlContext;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlLoader;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlUtils;
import com.eviware.soapui.impl.wsdl.teststeps.BeanPathPropertySupport;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequest;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Operation;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.settings.WsaSettings;
import com.eviware.soapui.settings.WsdlSettings;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.resolver.ResolveContext;
import com.eviware.soapui.support.types.StringList;
import org.apache.log4j.Logger;
import org.w3.x2007.x05.addressing.metadata.AddressingDocument.Addressing;
import org.w3.x2007.x05.addressing.metadata.AnonymousResponsesDocument.AnonymousResponses;
import org.w3.x2007.x05.addressing.metadata.NonAnonymousResponsesDocument.NonAnonymousResponses;
import org.xmlsoap.schemas.ws.x2004.x09.policy.Policy;
import javax.wsdl.Binding;
import javax.wsdl.BindingOperation;
import javax.wsdl.Definition;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.xml.namespace.QName;
import java.io.File;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* WSDL implementation of Interface, maps to a WSDL Binding
*
* @author Ole.Matzura
*/
public class WsdlInterface extends AbstractInterface<WsdlInterfaceConfig> {
public static final String STYLE_DOCUMENT = "Document";
public static final String STYLE_RPC = "RPC";
public static final String JBOSSWS_ACTIONS = "jbossws";
public static final String WSTOOLS_ACTIONS = "wstools";
public static final String XML_ACTIONS = "xml";
private final static Logger log = Logger.getLogger(WsdlInterface.class);
private List<WsdlOperation> operations = new ArrayList<WsdlOperation>();
private WsdlProject project;
private SoapMessageBuilder soapMessageBuilder;
private WsdlContext wsdlContext;
private boolean updating = false;
private BeanPathPropertySupport definitionProperty;
private String interfaceAnonymous;
private String interfaceWsaVersion;
boolean policyFlag = false;
public WsdlInterface(WsdlProject project, WsdlInterfaceConfig interfaceConfig) {
super(interfaceConfig, project, "/interface.png");
if (!interfaceConfig.isSetWsaVersion()) {
interfaceConfig.setWsaVersion(WsaVersionTypeConfig.NONE);
}
this.project = project;
List<OperationConfig> operationConfigs = interfaceConfig.getOperationList();
for (int i = 0; i < operationConfigs.size(); i++) {
operations.add(new WsdlOperation(this, operationConfigs.get(i)));
}
definitionProperty = new BeanPathPropertySupport(this, "definition");
}
public WsdlOperation getOperationAt(int index) {
return operations.get(index);
}
public int getOperationCount() {
return operations.size();
}
public WsdlOperation addNewOperation(BindingOperation operation) {
WsdlOperation operationImpl = new WsdlOperation(this, getConfig().addNewOperation());
operations.add(operationImpl);
operationImpl.initFromBindingOperation(operation);
fireOperationAdded(operationImpl);
return operationImpl;
}
public WsdlProject getProject() {
return project;
}
public void setDefinition(String wsdlUrl) throws Exception {
setDefinition(wsdlUrl, true);
}
public void setDefinition(String wsdlUrl, boolean updateCache) throws Exception {
String old = definitionProperty.set(wsdlUrl, false);
if (wsdlContext != null) {
wsdlContext.setDefinition(definitionProperty.expandUrl(), updateCache);
}
notifyPropertyChanged(DEFINITION_PROPERTY, old, wsdlUrl);
notifyPropertyChanged(UPDATING_PROPERTY, true, false);
}
public DefinitionCacheConfig cacheDefinition(WsdlLoader loader) throws Throwable {
log.debug("Caching definition for [" + loader.getBaseURI() + "]");
if (getConfig().isSetDefinitionCache()) {
getConfig().unsetDefinitionCache();
}
DefinitionCacheConfig definitionCache = null;
try {
definitionCache = getConfig().addNewDefinitionCache();
definitionCache.set(WsdlUtils.cacheWsdl(loader));
} catch (Throwable e) {
getConfig().unsetDefinitionCache();
throw e;
}
return definitionCache;
}
public String getDefinition() {
if (!getConfig().isSetDefinition()) {
return null;
}
String result = definitionProperty.get();
if (PathUtils.isFilePath(result) && !PathUtils.isRelativePath(result) && !result.startsWith("file:")
&& !result.startsWith("$")) {
try {
result = new File(result).toURI().toURL().toString();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
return result;
}
public String getType() {
return WsdlInterfaceFactory.WSDL_TYPE;
}
public boolean isDefinitionShareble() {
return true;
}
public synchronized WsdlContext getWsdlContext() {
if (wsdlContext == null) {
wsdlContext = new WsdlContext(PathUtils.expandPath(getDefinition(), this), this);
}
return wsdlContext;
}
/**
* Used by importer so we dont need to reload the context after importing..
*
* @param wsdlContext
*/
public void setWsdlContext(WsdlContext wsdlContext) {
this.wsdlContext = wsdlContext;
this.wsdlContext.setInterface(this);
if (soapMessageBuilder != null) {
soapMessageBuilder.setWsdlContext(wsdlContext);
}
}
public SoapMessageBuilder getMessageBuilder() {
if (soapMessageBuilder == null) {
try {
soapMessageBuilder = new SoapMessageBuilder(this);
} catch (Exception e) {
SoapUI.logError(e);
}
}
return soapMessageBuilder;
}
public void setSoapMessageBuilder(SoapMessageBuilder builder) {
soapMessageBuilder = builder;
soapMessageBuilder.setInterface(this);
}
public QName getBindingName() {
return getConfig().getBindingName() == null ? null : QName.valueOf(getConfig().getBindingName());
}
public void setBindingName(QName name) {
getConfig().setBindingName(name.toString());
}
public SoapVersion getSoapVersion() {
if (getConfig().getSoapVersion() == SoapVersionTypesConfig.X_1_2) {
return SoapVersion.Soap12;
}
return SoapVersion.Soap11;
}
public void setSoapVersion(SoapVersion version) {
if (version == SoapVersion.Soap11) {
getConfig().setSoapVersion(SoapVersionTypesConfig.X_1_1);
} else if (version == SoapVersion.Soap12) {
getConfig().setSoapVersion(SoapVersionTypesConfig.X_1_2);
} else {
throw new RuntimeException("Unknown soapVersion [" + version + "], must be 1.1 or 1.2");
}
}
public boolean updateDefinition(String url, boolean createRequests) throws Exception {
WsdlContext.uncache(url);
WsdlContext newContext = new WsdlContext(url, (WsdlInterface) null);
if (!newContext.load()) {
return false;
}
BindingTuple tuple = findBinding(newContext);
if (tuple == null) {
return false;
}
setBindingName(tuple.binding.getQName());
// update name
if (getSettings().getBoolean(WsdlSettings.NAME_WITH_BINDING)) {
setName(tuple.binding.getQName().getLocalPart());
}
// update context
setWsdlContext(newContext);
transferOperations(tuple.binding, createRequests);
setDefinition(url, false);
transferEndpoints(tuple.port);
updateWsaPolicy(url, newContext);
getProject().fireInterfaceUpdated(this);
return true;
}
private void updateWsaPolicy(String url, WsdlContext newContext) throws Exception {
Definition definition = newContext.getDefinition();
policyFlag = false;
processPolicy(PolicyUtils.getAttachedPolicy(getBinding(), definition));
Map<?, ?> serviceMap = definition.getAllServices();
if (serviceMap.isEmpty()) {
log.info("Missing services in [" + url + "], check for bindings");
} else {
Iterator<?> i = serviceMap.values().iterator();
while (i.hasNext()) {
Service service = (Service) i.next();
Map<?, ?> portMap = service.getPorts();
Iterator<?> i2 = portMap.values().iterator();
while (i2.hasNext()) {
Port port = (Port) i2.next();
processPolicy(PolicyUtils.getAttachedPolicy(port, definition));
}
}
}
}
public BindingTuple prepareUpdateDefinition(String url) throws Exception {
WsdlContext newContext = new WsdlContext(url, getSoapVersion());
if (!newContext.load()) {
return null;
}
BindingTuple tuple = findBinding(newContext);
return tuple;
}
public void updateDefinition(BindingTuple tuple) throws Exception {
setBindingName(tuple.binding.getQName());
if (getConfig().isSetDefinitionCache()) {
getConfig().unsetDefinitionCache();
}
// update name
if (getSettings().getBoolean(WsdlSettings.NAME_WITH_BINDING)) {
setName(tuple.binding.getQName().getLocalPart());
}
// update context
wsdlContext = tuple.context;
wsdlContext.setInterface(this);
if (soapMessageBuilder != null) {
soapMessageBuilder.setWsdlContext(wsdlContext);
}
}
public BindingOperation findBindingOperation(Definition definition, String bindingOperationName, String inputName,
String outputName) {
Binding binding = definition.getBinding(getBindingName());
return WsdlUtils.findBindingOperation(binding, bindingOperationName, inputName, outputName);
}
public Binding getBinding() {
try {
return findBinding(getWsdlContext()).binding;
} catch (Exception e) {
SoapUI.logError(e);
return null;
}
}
@SuppressWarnings("unchecked")
private BindingTuple findBinding(WsdlContext newContext) throws Exception {
BindingTuple tuple = new BindingTuple();
tuple.context = newContext;
// start by finding the old binding in the new definition
Definition definition = newContext.getDefinition();
Map serviceMap = definition.getAllServices();
Iterator<String> i = serviceMap.keySet().iterator();
while (i.hasNext()) {
tuple.service = (Service) serviceMap.get(i.next());
Map portMap = tuple.service.getPorts();
Iterator i2 = portMap.keySet().iterator();
while (i2.hasNext()) {
tuple.port = (Port) portMap.get(i2.next());
if (tuple.port.getBinding().getQName().equals(getBindingName())) {
tuple.binding = tuple.port.getBinding();
}
}
if (tuple.binding != null) {
break;
}
tuple.service = null;
}
if (tuple.service == null && tuple.binding == null) {
tuple.binding = definition.getBinding(getBindingName());
}
// missing matching binding, prompt for new one to use instead (will
// happen if binding has been renamed)
if (tuple.binding == null) {
Map bindings = definition.getAllBindings();
Object retval = UISupport.prompt("Missing matching binding [" + getBindingName()
+ "] in definition, select new\nbinding to map to", "Map Binding", bindings.keySet().toArray());
if (retval == null) {
return null;
}
tuple.binding = (Binding) bindings.get(retval);
}
return tuple;
}
@SuppressWarnings("unchecked")
public void transferOperations(Binding binding, boolean createRequests) {
// prepare for transfer of operations/requests
List<BindingOperation> newOperations = new ArrayList<BindingOperation>(binding.getBindingOperations());
Map<String, WsdlOperation> oldOperations = new HashMap<String, WsdlOperation>();
for (int c = 0; c < operations.size(); c++) {
oldOperations.put(operations.get(c).getBindingOperationName(), operations.get(c));
}
// clear existing from both collections
for (int c = 0; c < newOperations.size(); c++) {
BindingOperation newOperation = newOperations.get(c);
String bindingOperationName = newOperation.getName();
if (oldOperations.containsKey(bindingOperationName)) {
log.info("Synchronizing existing operation [" + bindingOperationName + "]");
WsdlOperation wsdlOperation = oldOperations.get(bindingOperationName);
WsdlUtils.getAnonymous(wsdlOperation);
wsdlOperation.initFromBindingOperation(newOperation);
fireOperationUpdated(wsdlOperation);
oldOperations.remove(bindingOperationName);
newOperations.remove(c);
c--;
}
}
// remove leftover operations
Iterator<String> i = oldOperations.keySet().iterator();
while (i.hasNext()) {
String name = i.next();
if (newOperations.size() > 0) {
List<String> list = new ArrayList<String>();
list.add("none - delete operation");
for (int c = 0; c < newOperations.size(); c++) {
list.add(newOperations.get(c).getName());
}
String retval = (String) UISupport.prompt("Binding operation [" + name
+ "] not found in new interface, select new\nbinding operation to map to", "Map Operation",
list.toArray(), "none/cancel - delete operation");
int ix = retval == null ? -1 : list.indexOf(retval) - 1;
// delete operation?
if (ix < 0) {
deleteOperation(name);
}
// change operation?
else {
BindingOperation newOperation = newOperations.get(ix);
WsdlOperation wsdlOperation = oldOperations.get(name);
wsdlOperation.initFromBindingOperation(newOperation);
fireOperationUpdated(wsdlOperation);
newOperations.remove(ix);
}
oldOperations.remove(name);
} else {
deleteOperation(name);
oldOperations.remove(name);
}
i = oldOperations.keySet().iterator();
}
// add leftover new operations
if (newOperations.size() > 0) {
for (int c = 0; c < newOperations.size(); c++) {
BindingOperation newOperation = newOperations.get(c);
WsdlOperation wsdlOperation = addNewOperation(newOperation);
if (createRequests) {
WsdlRequest request = wsdlOperation.addNewRequest("Request 1");
try {
request.setRequestContent(wsdlOperation.createRequest(true));
} catch (Exception e) {
SoapUI.logError(e);
}
}
}
}
}
public void transferEndpoints(Port port) {
if (port != null) {
String endpoint = WsdlUtils.getSoapEndpoint(port);
if (endpoint != null) {
StringList list = new StringList(getEndpoints());
// expand properties..
for (int c = 0; c < list.size(); c++) {
list.set(c, PropertyExpander.expandProperties(this, list.get(c)));
}
if (!list.contains(endpoint)) {
if (UISupport.confirm("Update existing requests with new endpoint\n[" + endpoint + "]",
"Update Definition")) {
for (int c = 0; c < getOperationCount(); c++) {
Operation operation = getOperationAt(c);
for (int ix = 0; ix < operation.getRequestCount(); ix++) {
operation.getRequestAt(ix).setEndpoint(endpoint);
}
}
}
addEndpoint(endpoint);
}
}
}
}
public void deleteOperation(String bindingOperationName) {
for (int c = 0; c < operations.size(); c++) {
WsdlOperation wsdlOperation = operations.get(c);
if (wsdlOperation.getBindingOperationName().equals(bindingOperationName)) {
log.info("deleting operation [" + bindingOperationName + "]");
// remove requests first (should this be done by some listener?)
while (wsdlOperation.getRequestCount() > 0) {
wsdlOperation.removeRequest(wsdlOperation.getRequestAt(0));
}
operations.remove(c);
try {
fireOperationRemoved(wsdlOperation);
} finally {
wsdlOperation.release();
getConfig().removeOperation(c);
}
return;
}
}
}
public void removeOperation(WsdlOperation wsdlOperation) {
int c = operations.indexOf(wsdlOperation);
if (c < 0) {
throw new IllegalArgumentException(wsdlOperation.getName() + " not found");
}
log.info("deleting operation [" + wsdlOperation.getName() + "]");
// remove requests first (should this be done by some listener?)
while (wsdlOperation.getRequestCount() > 0) {
wsdlOperation.removeRequest(wsdlOperation.getRequestAt(0));
}
operations.remove(c);
try {
fireOperationRemoved(wsdlOperation);
} finally {
wsdlOperation.release();
getConfig().removeOperation(c);
}
}
public WsdlOperation getOperationByName(String name) {
return (WsdlOperation) getWsdlModelItemByName(operations, name);
}
public Map<String, Operation> getOperations() {
Map<String, Operation> result = new HashMap<String, Operation>();
for (Operation operation : operations) {
result.put(operation.getName(), operation);
}
return result;
}
public boolean isCached() {
if (wsdlContext != null && wsdlContext.isCached()) {
return true;
}
DefinitionCacheConfig cacheConfig = getConfig().getDefinitionCache();
if (cacheConfig == null || cacheConfig.getRootPart() == null || cacheConfig.sizeOfPartArray() == 0) {
return false;
}
return true;
}
public String getStyle() {
if (wsdlContext == null || !wsdlContext.isLoaded()) {
return "<not loaded>";
}
try {
Binding binding = wsdlContext.getDefinition().getBinding(getBindingName());
if (binding == null) {
return "<missing binding>";
}
if (WsdlUtils.isRpc(binding)) {
return STYLE_RPC;
} else {
return STYLE_DOCUMENT;
}
} catch (Exception e) {
SoapUI.logError(e);
return "<error>";
}
}
@Override
public void release() {
super.release();
for (WsdlOperation operation : operations) {
operation.release();
}
if (wsdlContext != null) {
wsdlContext.release();
}
}
public List<Operation> getOperationList() {
return new ArrayList<Operation>(operations);
}
public static class BindingTuple {
public WsdlContext context = null;
public Service service = null;
public Port port = null;
public Binding binding = null;
}
public boolean isUpdating() {
return updating;
}
public void setUpdating(boolean updating) {
if (this.updating == updating) {
return;
}
if (updating) {
List<AbstractWsdlModelItem<?>> messages = getAllMessages();
for (AbstractWsdlModelItem<?> modelItem : messages) {
modelItem.beforeSave();
}
}
boolean oldValue = this.updating;
this.updating = updating;
notifyPropertyChanged(UPDATING_PROPERTY, oldValue, updating);
}
public List<AbstractWsdlModelItem<?>> getAllMessages() {
ArrayList<AbstractWsdlModelItem<?>> list = new ArrayList<AbstractWsdlModelItem<?>>();
getAllMessages(getProject(), list);
return list;
}
private void getAllMessages(ModelItem modelItem, List<AbstractWsdlModelItem<?>> list) {
if (modelItem instanceof AbstractHttpRequestInterface<?>) {
AbstractHttpRequest<?> wsdlRequest = (AbstractHttpRequest<?>) modelItem;
if (wsdlRequest.getOperation().getInterface() == this) {
list.add(wsdlRequest);
}
} else if (modelItem instanceof WsdlTestRequestStep) {
WsdlTestRequestStep testRequestStep = (WsdlTestRequestStep) modelItem;
WsdlTestRequest testRequest = testRequestStep.getTestRequest();
if (testRequest != null && testRequest.getOperation() != null
&& testRequest.getOperation().getInterface() == this) {
list.add(testRequest);
}
} else if (modelItem instanceof WsdlMockResponse) {
WsdlMockResponse mockResponse = (WsdlMockResponse) modelItem;
if (mockResponse.getMockOperation() != null && mockResponse.getMockOperation().getOperation() != null
&& mockResponse.getMockOperation().getOperation().getInterface() == this) {
list.add(mockResponse);
}
}
// Traverse the ModelItem hierarchy.
for (ModelItem child : modelItem.getChildren()) {
getAllMessages(child, list);
}
}
@Override
public void addExternalDependencies(List<ExternalDependency> dependencies) {
super.addExternalDependencies(dependencies);
dependencies.add(new InterfaceExternalDependency(definitionProperty));
}
@SuppressWarnings("unchecked")
@Override
public void resolve(ResolveContext<?> context) {
super.resolve(context);
String definition = definitionProperty.expandUrl();
if (!isCached() && definition.startsWith("file:")) {
try {
File file = new File(definition.substring(5));
if (!file.exists()) {
if (context.hasThisModelItem(this, "Missing WSDL file", definition)) {
return;
}
context.addPathToResolve(this, "Missing WSDL file", definition, new ResolveContext.FileResolver(
"Select WSDL File", "wsdl", "WSDL Files (*.wsdl)", file.getParent()) {
@Override
public boolean apply(File newFile) {
try {
setDefinition(newFile.toURI().toURL().toString());
return true;
} catch (Exception e) {
log.error("Invalid URL for new Definition", e);
return false;
}
}
});
} else {
if (context.hasThisModelItem(this, "Missing WSDL file", definition)) {
context.getPath(this, "Missing WSDL file", definition).setSolved(true);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public String getInterfaceType() {
return WsdlInterfaceFactory.WSDL_TYPE;
}
public String getTechnicalId() {
return getBindingName().toString();
}
public String getWsaVersion() {
if (getConfig().getWsaVersion().equals(WsaVersionTypeConfig.X_200408)) {
return WsaVersionTypeConfig.X_200408.toString();
} else if (getConfig().getWsaVersion().equals(WsaVersionTypeConfig.X_200508)) {
return WsaVersionTypeConfig.X_200508.toString();
}
return WsaVersionTypeConfig.NONE.toString();
}
public void setWsaVersion(String wsAddressing) {
if (wsAddressing.equals(WsaVersionTypeConfig.X_200508.toString())) {
getConfig().setWsaVersion(WsaVersionTypeConfig.X_200508);
} else if (wsAddressing.equals(WsaVersionTypeConfig.X_200408.toString())) {
getConfig().setWsaVersion(WsaVersionTypeConfig.X_200408);
} else {
getConfig().setWsaVersion(WsaVersionTypeConfig.NONE);
}
}
public void setAnonymous(String anonymous) {
if (anonymous.equals(AnonymousTypeConfig.REQUIRED.toString())) {
getConfig().setAnonymous(AnonymousTypeConfig.REQUIRED);
} else if (anonymous.equals(AnonymousTypeConfig.PROHIBITED.toString())) {
getConfig().setAnonymous(AnonymousTypeConfig.PROHIBITED);
} else {
getConfig().setAnonymous(AnonymousTypeConfig.OPTIONAL);
}
}
public String getAnonymous() {
// return WsdlUtils.getAnonymous(this);
if (getConfig().isSetAnonymous()) {
if (getConfig().getAnonymous().equals(AnonymousTypeConfig.PROHIBITED)) {
return AnonymousTypeConfig.PROHIBITED.toString();
} else if (getConfig().getAnonymous().equals(AnonymousTypeConfig.REQUIRED)) {
return AnonymousTypeConfig.REQUIRED.toString();
}
}
return AnonymousTypeConfig.OPTIONAL.toString();
}
@Override
public WsdlContext getDefinitionContext() {
return getWsdlContext();
}
// need to fix removing mock response and test cases.
private void replace(WsdlOperation wsdlOperation, OperationConfig reloadedOperation) {
int index = operations.indexOf(wsdlOperation);
int c = operations.indexOf(wsdlOperation);
if (c < 0) {
throw new IllegalArgumentException(wsdlOperation.getName() + " not found");
}
log.info("deleting operation [" + wsdlOperation.getName() + "]");
// remove requests first (should this be done by some listener?)
while (wsdlOperation.getRequestCount() > 0) {
wsdlOperation.removeRequest(wsdlOperation.getRequestAt(0));
}
operations.remove(c);
try {
fireOperationRemoved(wsdlOperation);
} finally {
wsdlOperation.release();
getConfig().removeOperation(c);
}
OperationConfig newConfig = (OperationConfig) getConfig().addNewOperation().set(reloadedOperation)
.changeType(OperationConfig.type);
WsdlOperation newOperation = new WsdlOperation(this, newConfig);
operations.add(index, newOperation);
newOperation.afterLoad();
fireOperationAdded(newOperation);
}
/**
* Method for processing policy on interface level it should include
* processing of all types of policies, but for now there's only Addressing
* policy implemented
*
* @param policy
* @return this interface changed in a proper way indicated by the policy
*/
public void processPolicy(Policy policy) throws Exception {
// default is optional
// String anonymous = AnonymousTypeConfig.OPTIONAL.toString();
// if (StringUtils.isNullOrEmpty(interfaceAnonymous) || policyFlag)
// interfaceAnonymous = AnonymousTypeConfig.OPTIONAL.toString() ;
// if (StringUtils.isNullOrEmpty(interfaceWsaVersion)|| policyFlag)
// interfaceWsaVersion = WsaVersionTypeConfig.NONE.toString();
if (!policyFlag) {
interfaceAnonymous = AnonymousTypeConfig.OPTIONAL.toString();
interfaceWsaVersion = WsaVersionTypeConfig.NONE.toString();
}
policyFlag = true;
if (policy != null) {
List<Addressing> addressingList = policy.getAddressingList();
List<?> usingAddressingList = policy.getUsingAddressingList();
for (Addressing addressing : addressingList) {
policyFlag = true;
String optional = addressing.getOptional().toString();
if (StringUtils.isNullOrEmpty(optional) || optional.equals("false")
|| (optional.equals("true") && SoapUI.getSettings().getBoolean(WsaSettings.ENABLE_FOR_OPTIONAL))) {
interfaceWsaVersion = WsaVersionTypeConfig.X_200508.toString();
}
Policy innerPolicy = addressing.getPolicy();
if (innerPolicy != null) {
List<AnonymousResponses> anonymousList = innerPolicy.getAnonymousResponsesList();
List<NonAnonymousResponses> nonAnonymousList = innerPolicy.getNonAnonymousResponsesList();
if (anonymousList.size() > 0 && nonAnonymousList.size() > 0) {
throw new Exception(
"Wrong addressing policy, anonymousResponses and nonAnonymousResponses can not be specified together");
}
if (anonymousList.size() > 0) {
interfaceAnonymous = AnonymousTypeConfig.REQUIRED.toString();
} else {
if (nonAnonymousList.size() > 0) {
interfaceAnonymous = AnonymousTypeConfig.PROHIBITED.toString();
}
}
}
}
if (interfaceWsaVersion == WsaVersionTypeConfig.NONE.toString() && !usingAddressingList.isEmpty()) {
/*
* UsingAddressing can also be specified insde Policy check
* http://www.w3.org/TR/ws-addr-wsdl/#id2263339
*/
interfaceWsaVersion = WsaVersionTypeConfig.X_200508.toString();
}
}
setAnonymous(interfaceAnonymous);
// set wsaVersion to one from policy only if it was null from wsdl binding
if (getConfig().getWsaVersion().equals(WsaVersionTypeConfig.NONE)) {
setWsaVersion(interfaceWsaVersion);
}
}
}