/*
* Copyright 2004-2014 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.CredentialsConfig;
import com.eviware.soapui.config.WsaVersionTypeConfig;
import com.eviware.soapui.config.WsdlRequestConfig;
import com.eviware.soapui.config.WsrmVersionTypeConfig;
import com.eviware.soapui.impl.rest.RestRequestInterface;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.wsdl.submit.RequestTransportRegistry;
import com.eviware.soapui.impl.wsdl.submit.transports.http.WsdlResponse;
import com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments.AttachmentUtils;
import com.eviware.soapui.impl.wsdl.submit.transports.jms.JMSHeader;
import com.eviware.soapui.impl.wsdl.support.jms.header.JMSHeaderConfig;
import com.eviware.soapui.impl.wsdl.support.jms.property.JMSPropertiesConfig;
import com.eviware.soapui.impl.wsdl.support.wsa.WsaConfig;
import com.eviware.soapui.impl.wsdl.support.wsa.WsaContainer;
import com.eviware.soapui.impl.wsdl.support.wsrm.WsrmConfig;
import com.eviware.soapui.impl.wsdl.support.wsrm.WsrmContainer;
import com.eviware.soapui.impl.wsdl.teststeps.HttpTestRequestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.iface.Attachment.AttachmentEncoding;
import com.eviware.soapui.model.iface.Interface;
import com.eviware.soapui.model.iface.MessagePart;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.model.propertyexpansion.PropertyExpander;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContainer;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionUtils;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionsResult;
import com.eviware.soapui.model.support.InterfaceListenerAdapter;
import com.eviware.soapui.settings.WsdlSettings;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringToStringsMap;
import org.apache.log4j.Logger;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Request implementation holding a SOAP request
*
* @author Ole.Matzura
*/
public class WsdlRequest extends AbstractHttpRequest<WsdlRequestConfig> implements WsdlAttachmentContainer,
PropertyExpansionContainer, WsaContainer, WsrmContainer, PropertyChangeListener {
public final static Logger log = Logger.getLogger(WsdlRequest.class);
public static final String RESPONSE_CONTENT_PROPERTY = WsdlRequest.class.getName() + "@response-content";
public static final String INLINE_RESPONSE_ATTACHMENTS = WsdlRequest.class.getName()
+ "@inline-response-attachments";
public static final String EXPAND_MTOM_RESPONSE_ATTACHMENTS = WsdlRequest.class.getName()
+ "@expand-mtom-attachments";
public static final String FORCE_MTOM = WsdlRequest.class.getName() + "@force_mtom";
public static final String ENABLE_INLINE_FILES = WsdlRequest.class.getName() + "@enable_inline_files";
public static final String SKIP_SOAP_ACTION = WsdlRequest.class.getName() + "@skip_soap_action";
public static final String ENCODE_ATTACHMENTS = WsdlRequest.class.getName() + "@encode_attachments";
public static final String WSS_TIMETOLIVE = WsdlRequest.class.getName() + "@wss-time-to-live";
public static final String OPERATION_PROPERTY = WsdlRequest.class.getName() + "@operation";
public static final String INCOMING_WSS = WsdlRequest.class.getName() + "@incoming-wss";
public static final String OUGOING_WSS = WsdlRequest.class.getName() + "@outgoing-wss";
public final static String PW_TYPE_NONE = "None";
public final static String PW_TYPE_DIGEST = "PasswordDigest";
public final static String PW_TYPE_TEXT = "PasswordText";
private WsdlOperation operation;
private List<HttpAttachmentPart> definedAttachmentParts;
private InternalInterfaceListener interfaceListener = new InternalInterfaceListener();
private WsaConfig wsaConfig;
private WsrmConfig wsrmConfig;
public WsdlRequest(WsdlOperation operation, WsdlRequestConfig callConfig) {
this(operation, callConfig, false);
}
public WsdlRequest(WsdlOperation operation, WsdlRequestConfig callConfig, boolean forLoadTest) {
super(callConfig, operation, null, forLoadTest);
this.operation = operation;
initEndpoints();
// ensure encoding
if (callConfig.getEncoding() == null || callConfig.getEncoding().length() == 0) {
callConfig.setEncoding("UTF-8");
}
if (!forLoadTest) {
operation.getInterface().addPropertyChangeListener(interfaceListener);
operation.getInterface().addInterfaceListener(interfaceListener);
}
}
public void updateConfig(WsdlRequestConfig request) {
setConfig(request);
if (wsaConfig != null) {
wsaConfig.setConfig(request.getWsaConfig());
}
if (wsrmConfig != null) {
wsrmConfig.setWsrmConfig(request.getWsrmConfig());
}
if (jmsHeaderConfig != null) {
jmsHeaderConfig.setJMSHeaderConfConfig(request.getJmsConfig());
}
if (jmsPropertyConfig != null) {
jmsPropertyConfig.setJmsPropertyConfConfig(request.getJmsPropertyConfig());
}
}
protected void initEndpoints() {
if (getEndpoint() == null) {
String[] endpoints = operation.getInterface().getEndpoints();
if (endpoints.length > 0) {
setEndpoint(endpoints[0]);
}
}
}
public boolean isInlineResponseAttachments() {
return getSettings().getBoolean(INLINE_RESPONSE_ATTACHMENTS);
}
public void setInlineResponseAttachments(boolean inlineResponseAttachments) {
boolean old = getSettings().getBoolean(INLINE_RESPONSE_ATTACHMENTS);
getSettings().setBoolean(INLINE_RESPONSE_ATTACHMENTS, inlineResponseAttachments);
notifyPropertyChanged(INLINE_RESPONSE_ATTACHMENTS, old, inlineResponseAttachments);
}
public boolean isExpandMtomResponseAttachments() {
return getSettings().getBoolean(EXPAND_MTOM_RESPONSE_ATTACHMENTS);
}
public void setExpandMtomResponseAttachments(boolean expandMtomResponseAttachments) {
boolean old = getSettings().getBoolean(EXPAND_MTOM_RESPONSE_ATTACHMENTS);
getSettings().setBoolean(EXPAND_MTOM_RESPONSE_ATTACHMENTS, expandMtomResponseAttachments);
notifyPropertyChanged(EXPAND_MTOM_RESPONSE_ATTACHMENTS, old, expandMtomResponseAttachments);
}
/**
* Use getResponse().getContentAsString();
*
* @deprecated
*/
@Deprecated
public String getResponseContent() {
return getResponse() == null ? null : getResponse().getContentAsString();
}
public WsdlResponse getResponse() {
return (WsdlResponse) super.getResponse();
}
public WsdlOperation getOperation() {
return operation;
}
public void setOperation(WsdlOperation wsdlOperation) {
WsdlOperation oldOperation = operation;
this.operation = wsdlOperation;
definedAttachmentParts = null;
notifyPropertyChanged(OPERATION_PROPERTY, oldOperation, operation);
}
public void setRequestContent(String request) {
definedAttachmentParts = null;
super.setRequestContent(request);
}
// public void setResponse( WsdlResponse response, SubmitContext context )
// {
// WsdlResponse oldResponse = getResponse();
// this.response = response;
//
// notifyPropertyChanged( RESPONSE_PROPERTY, oldResponse, response );
// }
public WsdlSubmit<WsdlRequest> submit(SubmitContext submitContext, boolean async) throws SubmitException {
String endpoint = PropertyExpander.expandProperties(submitContext, getEndpoint());
if (endpoint == null || endpoint.trim().length() == 0) {
UISupport.showErrorMessage("Missing endpoint for request [" + getName() + "]");
return null;
}
try {
WsdlSubmit<WsdlRequest> submitter = new WsdlSubmit<WsdlRequest>(this, getSubmitListeners(),
RequestTransportRegistry.getTransport(endpoint, submitContext));
submitter.submitRequest(submitContext, async);
return submitter;
} catch (Exception e) {
throw new SubmitException(e.toString());
}
}
private class InternalInterfaceListener extends InterfaceListenerAdapter implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Interface.ENDPOINT_PROPERTY)) {
String endpoint = getEndpoint();
if (evt.getOldValue() != null && evt.getOldValue().equals(endpoint)) {
setEndpoint((String) evt.getNewValue());
}
}
}
}
public String getWssPasswordType() {
String wssPasswordType = getConfig().getWssPasswordType();
return StringUtils.isNullOrEmpty(wssPasswordType) || PW_TYPE_NONE.equals(wssPasswordType) ? null
: wssPasswordType;
}
public void setWssPasswordType(String wssPasswordType) {
if (wssPasswordType == null || wssPasswordType.equals(PW_TYPE_NONE)) {
if (getConfig().isSetWssPasswordType()) {
getConfig().unsetWssPasswordType();
}
} else {
getConfig().setWssPasswordType(wssPasswordType);
}
}
/*
* (non-Javadoc)
*
* @see
* com.eviware.soapui.impl.wsdl.AttachmentContainer#getDefinedAttachmentParts
* ()
*/
public synchronized HttpAttachmentPart[] getDefinedAttachmentParts() {
if (definedAttachmentParts == null) {
try {
UISupport.setHourglassCursor();
definedAttachmentParts = AttachmentUtils.extractAttachmentParts(operation, getRequestContent(), true,
false, isMtomEnabled());
} catch (Exception e) {
log.warn(e.toString());
definedAttachmentParts = new ArrayList<HttpAttachmentPart>();
} finally {
UISupport.resetCursor();
}
}
return definedAttachmentParts.toArray(new HttpAttachmentPart[definedAttachmentParts.size()]);
}
public RestRequestInterface.HttpMethod getMethod() {
return RestRequestInterface.HttpMethod.POST;
}
/*
* (non-Javadoc)
*
* @see
* com.eviware.soapui.impl.wsdl.AttachmentContainer#getAttachmentPart(java
* .lang.String)
*/
public HttpAttachmentPart getAttachmentPart(String partName) {
HttpAttachmentPart[] parts = getDefinedAttachmentParts();
for (HttpAttachmentPart part : parts) {
if (part.getName().equals(partName)) {
return part;
}
}
return null;
}
public void copyTo(WsdlRequest newRequest, boolean copyAttachments, boolean copyHeaders) {
newRequest.setEncoding(getEncoding());
newRequest.setEndpoint(getEndpoint());
newRequest.setRequestContent(getRequestContent());
newRequest.setWssPasswordType(getWssPasswordType());
CredentialsConfig credentials = getConfig().getCredentials();
if (credentials != null) {
newRequest.getConfig().setCredentials((CredentialsConfig) credentials.copy());
}
if (copyAttachments) {
copyAttachmentsTo(newRequest);
}
if (copyHeaders) {
newRequest.setRequestHeaders(getRequestHeaders());
}
// ((DefaultWssContainer)newRequest.getWssContainer()).updateConfig( (
// WSSConfigConfig ) getConfig().getWssConfig().copy() );
}
/*
* (non-Javadoc)
*
* @see com.eviware.soapui.impl.wsdl.AttachmentContainer#isMtomEnabled()
*/
public boolean isMtomEnabled() {
return getSettings().getBoolean(WsdlSettings.ENABLE_MTOM);
}
public void setMtomEnabled(boolean mtomEnabled) {
getSettings().setBoolean(WsdlSettings.ENABLE_MTOM, mtomEnabled);
definedAttachmentParts = null;
}
public boolean isInlineFilesEnabled() {
return getSettings().getBoolean(WsdlRequest.ENABLE_INLINE_FILES);
}
public void setInlineFilesEnabled(boolean inlineFilesEnabled) {
getSettings().setBoolean(WsdlRequest.ENABLE_INLINE_FILES, inlineFilesEnabled);
}
public boolean isSkipSoapAction() {
return getSettings().getBoolean(WsdlRequest.SKIP_SOAP_ACTION);
}
public void setSkipSoapAction(boolean skipSoapAction) {
getSettings().setBoolean(WsdlRequest.SKIP_SOAP_ACTION, skipSoapAction);
}
@Override
public void release() {
super.release();
getOperation().getInterface().removeInterfaceListener(interfaceListener);
getOperation().getInterface().removePropertyChangeListener(interfaceListener);
}
public MessagePart[] getRequestParts() {
try {
List<MessagePart> result = new ArrayList<MessagePart>();
result.addAll(Arrays.asList(getOperation().getDefaultRequestParts()));
result.addAll(Arrays.asList(getDefinedAttachmentParts()));
return result.toArray(new MessagePart[result.size()]);
} catch (Exception e) {
SoapUI.logError(e);
return new MessagePart[0];
}
}
public MessagePart[] getResponseParts() {
try {
List<MessagePart> result = new ArrayList<MessagePart>();
result.addAll(Arrays.asList(getOperation().getDefaultResponseParts()));
if (getResponse() != null) {
result.addAll(AttachmentUtils.extractAttachmentParts(getOperation(), getResponse().getContentAsString(),
true, true, isMtomEnabled()));
}
return result.toArray(new MessagePart[result.size()]);
} catch (Exception e) {
SoapUI.logError(e);
return new MessagePart[0];
}
}
public String getWssTimeToLive() {
return getSettings().getString(WSS_TIMETOLIVE, null);
}
public void setWssTimeToLive(String ttl) {
getSettings().setString(WSS_TIMETOLIVE, ttl);
}
public long getContentLength() {
return getRequestContent().length();
}
public boolean isForceMtom() {
return getSettings().getBoolean(FORCE_MTOM);
}
public void setForceMtom(boolean forceMtom) {
boolean old = getSettings().getBoolean(FORCE_MTOM);
getSettings().setBoolean(FORCE_MTOM, forceMtom);
notifyPropertyChanged(FORCE_MTOM, old, forceMtom);
}
public boolean isEncodeAttachments() {
return getSettings().getBoolean(ENCODE_ATTACHMENTS);
}
public void setEncodeAttachments(boolean encodeAttachments) {
boolean old = getSettings().getBoolean(ENCODE_ATTACHMENTS);
getSettings().setBoolean(ENCODE_ATTACHMENTS, encodeAttachments);
notifyPropertyChanged(ENCODE_ATTACHMENTS, old, encodeAttachments);
}
public String getIncomingWss() {
return getConfig().getIncomingWss();
}
public void setIncomingWss(String incomingWss) {
String old = getIncomingWss();
getConfig().setIncomingWss(incomingWss);
notifyPropertyChanged(INCOMING_WSS, old, incomingWss);
}
public String getOutgoingWss() {
return getConfig().getOutgoingWss();
}
public void setOutgoingWss(String outgoingWss) {
String old = getOutgoingWss();
getConfig().setOutgoingWss(outgoingWss);
notifyPropertyChanged(OUGOING_WSS, old, outgoingWss);
}
public boolean isWsAddressing() {
return getConfig().getUseWsAddressing();
}
public void setWsAddressing(boolean wsAddressing) {
boolean old = getConfig().getUseWsAddressing();
getConfig().setUseWsAddressing(wsAddressing);
notifyPropertyChanged("wsAddressing", old, wsAddressing);
}
public PropertyExpansion[] getPropertyExpansions() {
PropertyExpansionsResult result = new PropertyExpansionsResult(this, this);
result.addAll(super.getPropertyExpansions());
StringToStringsMap requestHeaders = getRequestHeaders();
for (Map.Entry<String, List<String>> headerEntry : requestHeaders.entrySet()) {
for (String value : headerEntry.getValue()) {
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(this,
new HttpTestRequestStep.RequestHeaderHolder(headerEntry.getKey(), value, this), "value"));
}
}
addWsaPropertyExpansions(result, getWsaConfig(), this);
addJMSHeaderExpansions(result, getJMSHeaderConfig(), this);
return result.toArray();
}
public void addWsaPropertyExpansions(PropertyExpansionsResult result, WsaConfig wsaConfig, ModelItem modelItem) {
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "action"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "from"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "to"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "replyTo"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "replyToRefParams"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "faultTo"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "faultToRefParams"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "relatesTo"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "relationshipType"));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, wsaConfig, "messageID"));
}
public void addJMSHeaderExpansions(PropertyExpansionsResult result, JMSHeaderConfig jmsHeaderConfig,
ModelItem modelItem) {
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig,
JMSHeader.JMSCORRELATIONID));
result.addAll(PropertyExpansionUtils
.extractPropertyExpansions(modelItem, jmsHeaderConfig, JMSHeader.JMSREPLYTO));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig, JMSHeader.JMSTYPE));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig,
JMSHeader.JMSPRIORITY));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig,
JMSHeader.DURABLE_SUBSCRIPTION_NAME));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig, JMSHeader.CLIENT_ID));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig,
JMSHeader.SEND_AS_BYTESMESSAGE));
result.addAll(PropertyExpansionUtils.extractPropertyExpansions(modelItem, jmsHeaderConfig,
JMSHeader.SOAP_ACTION_ADD));
}
public AttachmentEncoding getAttachmentEncoding(String partName) {
HttpAttachmentPart attachmentPart = getAttachmentPart(partName);
if (attachmentPart == null) {
return AttachmentUtils.getAttachmentEncoding(getOperation(), partName, false);
} else {
return AttachmentUtils.getAttachmentEncoding(getOperation(), attachmentPart, false);
}
}
public WsaConfig getWsaConfig() {
if (wsaConfig == null) {
if (!getConfig().isSetWsaConfig()) {
getConfig().addNewWsaConfig();
}
wsaConfig = new WsaConfig(getConfig().getWsaConfig(), this);
}
return wsaConfig;
}
public ModelItem getModelItem() {
return this;
}
public boolean isWsaEnabled() {
return isWsAddressing();
}
public void setWsaEnabled(boolean arg0) {
setWsAddressing(arg0);
}
public boolean isWsReliableMessaging() {
return getConfig().getUseWsReliableMessaging();
}
public void setWsReliableMessaging(boolean wsReliableMessaging) {
boolean old = getConfig().getUseWsReliableMessaging();
getConfig().setUseWsReliableMessaging(wsReliableMessaging);
notifyPropertyChanged("wsReliableMessaging", old, wsReliableMessaging);
}
public WsrmConfig getWsrmConfig() {
if (wsrmConfig == null) {
if (!getConfig().isSetWsrmConfig()) {
getConfig().addNewWsrmConfig();
}
wsrmConfig = new WsrmConfig(getConfig().getWsrmConfig(), this);
wsrmConfig.addPropertyChangeListener("version", this);
}
return wsrmConfig;
}
public boolean isWsrmEnabled() {
return isWsReliableMessaging();
}
public void setWsrmEnabled(boolean arg0) {
setWsReliableMessaging(arg0);
}
public String getResponseContentAsXml() {
return getResponse() == null ? null : getResponse().getContentAsString();
}
private JMSHeaderConfig jmsHeaderConfig;
private JMSPropertiesConfig jmsPropertyConfig;
public JMSHeaderConfig getJMSHeaderConfig() {
if (jmsHeaderConfig == null) {
if (!getConfig().isSetJmsConfig()) {
getConfig().addNewJmsConfig();
}
jmsHeaderConfig = new JMSHeaderConfig(getConfig().getJmsConfig(), this);
}
return jmsHeaderConfig;
}
public JMSPropertiesConfig getJMSPropertiesConfig() {
if (jmsPropertyConfig == null) {
if (!getConfig().isSetJmsPropertyConfig()) {
getConfig().addNewJmsPropertyConfig();
}
jmsPropertyConfig = new JMSPropertiesConfig(getConfig().getJmsPropertyConfig(), this);
}
return jmsPropertyConfig;
}
public String getAction() {
if (isWsaEnabled() && StringUtils.hasContent(getWsaConfig().getAction())) {
return getWsaConfig().getAction();
}
return getOperation().getAction();
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getSource() == wsrmConfig && evt.getPropertyName().equals("version")) {
if (evt.getNewValue().equals(WsrmVersionTypeConfig.X_1_0.toString())) {
getWsaConfig().setVersion(WsaVersionTypeConfig.X_200408.toString());
}
}
}
}