/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.extension.soap.internal.runtime.connection;
import static java.lang.String.format;
import static org.mule.runtime.module.extension.soap.internal.loader.SoapServiceProviderDeclarer.CUSTOM_TRANSPORT;
import org.mule.runtime.api.config.PoolingProfile;
import org.mule.runtime.api.connection.ConnectionProvider;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.meta.model.ExtensionModel;
import org.mule.runtime.api.meta.model.connection.ConnectionProviderModel;
import org.mule.runtime.core.api.Injector;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.registry.RegistrationException;
import org.mule.runtime.core.api.retry.RetryPolicyTemplate;
import org.mule.runtime.core.internal.connection.ConnectionManagerAdapter;
import org.mule.runtime.core.internal.connection.ErrorTypeHandlerConnectionProviderWrapper;
import org.mule.runtime.core.internal.connection.PoolingConnectionProviderWrapper;
import org.mule.runtime.extension.api.soap.MessageDispatcherProvider;
import org.mule.runtime.extension.api.soap.SoapServiceProvider;
import org.mule.runtime.extension.api.soap.message.MessageDispatcher;
import org.mule.runtime.module.extension.internal.loader.java.property.ImplementingTypeModelProperty;
import org.mule.runtime.module.extension.internal.runtime.config.ConnectionProviderObjectBuilder;
import org.mule.runtime.module.extension.internal.runtime.objectbuilder.DefaultResolverSetBasedObjectBuilder;
import org.mule.runtime.module.extension.internal.runtime.resolver.ResolverSet;
import org.mule.runtime.module.extension.internal.runtime.resolver.ResolverSetResult;
import org.mule.runtime.module.extension.soap.internal.runtime.connection.transport.DefaultHttpMessageDispatcherProvider;
import org.mule.services.soap.api.client.SoapClient;
/**
* Implementation of {@link ConnectionProviderObjectBuilder} which produces instances of {@link ForwardingSoapClientConnectionProvider}.
*
* @since 4.0
*/
public final class SoapConnectionProviderObjectBuilder extends ConnectionProviderObjectBuilder<SoapClient> {
private final DefaultResolverSetBasedObjectBuilder<SoapServiceProvider> objectBuilder;
/**
* Creates a new instances which produces instances based on the given {@code providerModel} and {@code resolverSet}
*
* @param providerModel the {@link ConnectionProviderModel} which describes the instances to be produced
* @param resolverSet a {@link ResolverSet} to populate the values
* @param connectionManager a {@link ConnectionManagerAdapter} to obtain the default {@link RetryPolicyTemplate} in case of none
* is provided
*/
public SoapConnectionProviderObjectBuilder(ConnectionProviderModel providerModel, ResolverSet resolverSet,
PoolingProfile poolingProfile, boolean disableValidation,
RetryPolicyTemplate retryPolicyTemplate, ConnectionManagerAdapter connectionManager,
ExtensionModel extensionModel, MuleContext muleContext) {
super(providerModel, getServiceProviderType(providerModel), resolverSet, poolingProfile,
disableValidation, retryPolicyTemplate, connectionManager, extensionModel, muleContext);
objectBuilder = new DefaultResolverSetBasedObjectBuilder<>(getServiceProviderType(providerModel), resolverSet);
}
/**
* Build a new {@link ForwardingSoapClientConnectionProvider} based on a {@link SoapServiceProvider} instance.
*
* @param result the {@link ResolverSetResult} with the values for the {@link SoapServiceProvider} instance.
* @return a wrapped {@link ForwardingSoapClientConnectionProvider} with error handling and polling mechanisms.
* @throws MuleException
*/
@Override
public ConnectionProvider build(ResolverSetResult result) throws MuleException {
SoapServiceProvider serviceProvider = objectBuilder.build(result);
MessageDispatcherProvider<? extends MessageDispatcher> transport = getCustomTransport(result);
Injector injector = muleContext.getInjector();
injector.inject(serviceProvider);
injector.inject(transport);
ConnectionProvider<ForwardingSoapClient> provider = new ForwardingSoapClientConnectionProvider(serviceProvider, transport);
provider = new PoolingConnectionProviderWrapper<>(provider, poolingProfile, disableValidation, retryPolicyTemplate);
provider = new ErrorTypeHandlerConnectionProviderWrapper<>(provider, muleContext, extensionModel, retryPolicyTemplate);
return provider;
}
private MessageDispatcherProvider<? extends MessageDispatcher> getCustomTransport(ResolverSetResult resultSet)
throws RegistrationException {
MessageDispatcherProvider transportProvider = (MessageDispatcherProvider) resultSet.get(CUSTOM_TRANSPORT);
return transportProvider != null ? transportProvider : new DefaultHttpMessageDispatcherProvider();
}
/**
* @return a {@link SoapServiceProvider} implementation {@link Class} for a given {@link ConnectionProviderModel}.
*/
private static Class<SoapServiceProvider> getServiceProviderType(ConnectionProviderModel model) {
return model.getModelProperty(ImplementingTypeModelProperty.class)
.map(prop -> (Class<SoapServiceProvider>) prop.getType())
.orElseThrow(() -> new IllegalStateException(format("No %s was defined in connection provider [%s]",
ImplementingTypeModelProperty.class.getSimpleName(),
model.getName())));
}
/**
* {@inheritDoc}
*/
@Override
public boolean isDynamic() {
return resolverSet.isDynamic();
}
}