/*
* 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.submit;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.wsdl.submit.filters.EndpointRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.EndpointStrategyRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.GlobalHttpHeadersRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.HttpAuthenticationRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.HttpCompressionRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.HttpPackagingResponseFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.HttpSettingsRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.OAuth2RequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.PostPackagingRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.PropertyExpansionRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.RemoveEmptyContentRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.RestRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.SoapHeadersRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.StripWhitespacesRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.WsaRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.WsdlPackagingRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.WsrmRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.WssAuthenticationRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.filters.WssRequestFilter;
import com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport;
import com.eviware.soapui.impl.wsdl.submit.transports.jms.HermesJmsRequestTransport;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.support.factory.SoapUIFactoryRegistryListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Registry of available transports, currently hard-coded but should be
* configurable in the future.
*
* @author Ole.Matzura
*/
public class RequestTransportRegistry {
public static final String HTTP = "http";
public static final String HTTPS = "https";
public static final String JMS = "jms";
private static Map<String, RequestTransport> transports = new HashMap<String, RequestTransport>();
private static Map<String, List<RequestFilter>> addedCustomRequestFilters = new HashMap<String, List<RequestFilter>>();
private static WsdlPackagingRequestFilter wsdlPackagingRequestFilter;
static {
HttpClientRequestTransport httpTransport = new HttpClientRequestTransport();
HermesJmsRequestTransport jmsTransport = new HermesJmsRequestTransport();
List<RequestFilterFactory> filterFactories = SoapUI.getFactoryRegistry()
.getFactories(RequestFilterFactory.class);
httpTransport.addRequestFilter(new EndpointRequestFilter());
httpTransport.addRequestFilter(new HttpSettingsRequestFilter());
httpTransport.addRequestFilter(new RestRequestFilter());
httpTransport.addRequestFilter(new SoapHeadersRequestFilter());
httpTransport.addRequestFilter(new HttpAuthenticationRequestFilter());
httpTransport.addRequestFilter(new WssAuthenticationRequestFilter());
httpTransport.addRequestFilter(new PropertyExpansionRequestFilter());
httpTransport.addRequestFilter(new RemoveEmptyContentRequestFilter());
httpTransport.addRequestFilter(new StripWhitespacesRequestFilter());
httpTransport.addRequestFilter(new EndpointStrategyRequestFilter());
httpTransport.addRequestFilter(new WsaRequestFilter());
httpTransport.addRequestFilter(new WsrmRequestFilter());
httpTransport.addRequestFilter(new WssRequestFilter());
httpTransport.addRequestFilter(new OAuth2RequestFilter());
httpTransport.addRequestFilter(new GlobalHttpHeadersRequestFilter());
addListenerRequestFilters(httpTransport);
for (RequestFilterFactory factory : filterFactories) {
String protocol = factory.getProtocol();
if (protocol.equals(HTTP) || protocol.equals(HTTPS)) {
RequestFilter requestFilter = factory.createRequestFilter();
httpTransport.addRequestFilter(requestFilter);
addToCustomRequestFilters(protocol, requestFilter);
}
}
wsdlPackagingRequestFilter = new WsdlPackagingRequestFilter();
httpTransport.addRequestFilter(wsdlPackagingRequestFilter);
httpTransport.addRequestFilter(new HttpCompressionRequestFilter());
httpTransport.addRequestFilter(new HttpPackagingResponseFilter());
httpTransport.addRequestFilter(new PostPackagingRequestFilter());
transports.put(HTTP, httpTransport);
transports.put(HTTPS, httpTransport);
jmsTransport.addRequestFilter(new WssAuthenticationRequestFilter());
jmsTransport.addRequestFilter(new PropertyExpansionRequestFilter());
jmsTransport.addRequestFilter(new RemoveEmptyContentRequestFilter());
jmsTransport.addRequestFilter(new StripWhitespacesRequestFilter());
jmsTransport.addRequestFilter(new WsaRequestFilter());
jmsTransport.addRequestFilter(new WssRequestFilter());
addListenerRequestFilters(jmsTransport);
for (RequestFilterFactory factory : filterFactories) {
if (factory.getProtocol().equals(JMS)) {
RequestFilter requestFilter = factory.createRequestFilter();
jmsTransport.addRequestFilter(requestFilter);
addToCustomRequestFilters(JMS, requestFilter);
}
}
transports.put(JMS, jmsTransport);
initCustomTransports(filterFactories);
SoapUI.getFactoryRegistry().addFactoryRegistryListener(new SoapUIFactoryRegistryListener() {
@Override
public void factoryAdded(Class<?> factoryType, Object factory) {
if (factory instanceof RequestTransportFactory) {
RequestTransportFactory transportFactory = (RequestTransportFactory) factory;
addTransport(transportFactory.getProtocol(), transportFactory.newRequestTransport());
}
if (factory instanceof RequestFilterFactory) {
RequestFilterFactory requestFilterFactory = (RequestFilterFactory) factory;
RequestFilter filter = requestFilterFactory.createRequestFilter();
String protocol = requestFilterFactory.getProtocol();
if (protocol.startsWith(HTTP)) {
RequestTransport transport = transports.get(HTTP);
transport.insertRequestFilter(filter, wsdlPackagingRequestFilter);
} else {
RequestTransport transport = transports.get(protocol);
if (transport != null) {
transport.addRequestFilter(filter);
}
}
addToCustomRequestFilters(protocol, filter);
}
}
@Override
public void factoryRemoved(Class<?> factoryType, Object factory) {
if (factory instanceof RequestTransportFactory) {
removeFactory((RequestTransportFactory) factory);
}
if (factory instanceof RequestFilterFactory) {
removeRequestFilterFactory((RequestFilterFactory) factory);
}
}
});
}
private static void addListenerRequestFilters(RequestTransport transport) {
for (RequestFilter filter : SoapUI.getListenerRegistry().getListeners(RequestFilter.class)) {
transport.addRequestFilter(filter);
}
}
private static void initCustomTransports(List<RequestFilterFactory> filterFactories) {
for (RequestTransportFactory factory : SoapUI.getFactoryRegistry().getFactories(RequestTransportFactory.class)) {
RequestTransport transport = factory.newRequestTransport();
String protocol = factory.getProtocol();
for (RequestFilterFactory filterFactory : filterFactories) {
if (filterFactory.getProtocol().equals(protocol)) {
RequestFilter requestFilter = filterFactory.createRequestFilter();
transport.addRequestFilter(requestFilter);
addToCustomRequestFilters(protocol, requestFilter);
}
}
transports.put(protocol, transport);
}
}
private static void addToCustomRequestFilters(String protocol, RequestFilter requestFilter) {
if (!addedCustomRequestFilters.containsKey(protocol)) {
addedCustomRequestFilters.put(protocol, new ArrayList<RequestFilter>());
}
addedCustomRequestFilters.get(protocol).add(requestFilter);
}
public static void removeRequestFilterFactory(RequestFilterFactory factory) {
String protocol = factory.getProtocol();
if (addedCustomRequestFilters.containsKey(protocol)) {
for (RequestFilter filter : addedCustomRequestFilters.get(protocol)) {
for (RequestTransport transport : transports.values()) {
transport.removeRequestFilter(filter);
}
}
addedCustomRequestFilters.remove(protocol);
}
}
public static synchronized RequestTransport getTransport(String endpoint, SubmitContext submitContext)
throws MissingTransportException, CannotResolveJmsTypeException {
int ix = endpoint.indexOf("://");
if (ix == -1) {
throw new MissingTransportException("Missing protocol in endpoint [" + endpoint + "]");
}
String protocol = endpoint.substring(0, ix).toLowerCase();
RequestTransport transport = transports.get(protocol);
if (transport == null) {
throw new MissingTransportException("Missing transport for protocol [" + protocol + "]");
}
return transport;
}
public static synchronized RequestTransport getTransport(String protocol) throws MissingTransportException {
RequestTransport transport = transports.get(protocol);
if (transport == null) {
throw new MissingTransportException("Missing transport for protocol [" + protocol + "]");
}
return transport;
}
public static void addTransport(String key, RequestTransport rt) {
transports.put(key, rt);
}
public static void removeFactory(RequestTransportFactory factory) {
RequestTransport transport = factory.newRequestTransport();
for (Map.Entry<String, RequestTransport> transportEntry : transports.entrySet()) {
if (transportEntry.getValue().getClass().equals(transport.getClass())) {
transports.remove(transportEntry.getKey());
break;
}
}
}
public static class MissingTransportException extends Exception {
public MissingTransportException(String msg) {
super(msg);
}
}
public static class CannotResolveJmsTypeException extends Exception {
public CannotResolveJmsTypeException(String msg) {
super(msg);
}
}
}