/*
* 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.loader;
import static org.mule.runtime.api.meta.ExpressionSupport.NOT_SUPPORTED;
import static org.mule.runtime.api.meta.model.connection.ConnectionManagementType.POOLING;
import org.mule.metadata.api.ClassTypeLoader;
import org.mule.runtime.api.meta.model.declaration.fluent.ConfigurationDeclarer;
import org.mule.runtime.api.meta.model.declaration.fluent.ConnectionProviderDeclarer;
import org.mule.runtime.api.meta.model.display.LayoutModel;
import org.mule.runtime.api.metadata.TypedValue;
import org.mule.runtime.extension.api.declaration.type.ExtensionsTypeLoaderFactory;
import org.mule.runtime.extension.api.runtime.parameter.Literal;
import org.mule.runtime.extension.api.runtime.parameter.ParameterResolver;
import org.mule.runtime.extension.api.soap.MessageDispatcherProvider;
import org.mule.runtime.extension.api.soap.SoapServiceProvider;
import org.mule.runtime.extension.internal.property.LiteralModelProperty;
import org.mule.runtime.module.extension.internal.loader.java.ParameterModelsLoaderDelegate;
import org.mule.runtime.module.extension.internal.loader.java.contributor.InfrastructureFieldContributor;
import org.mule.runtime.module.extension.internal.loader.java.contributor.ParameterDeclarerContributor;
import org.mule.runtime.module.extension.internal.loader.java.contributor.ParameterTypeUnwrapperContributor;
import org.mule.runtime.module.extension.internal.loader.java.property.ConnectionTypeModelProperty;
import org.mule.runtime.module.extension.internal.loader.java.property.ImplementingTypeModelProperty;
import org.mule.runtime.module.extension.internal.loader.java.property.ParameterResolverTypeModelProperty;
import org.mule.runtime.module.extension.internal.loader.java.property.TypedValueTypeModelProperty;
import org.mule.runtime.module.extension.internal.loader.utils.ParameterDeclarationContext;
import org.mule.runtime.module.extension.soap.internal.loader.type.runtime.SoapServiceProviderWrapper;
import org.mule.runtime.module.extension.soap.internal.runtime.connection.ForwardingSoapClient;
import com.google.common.collect.ImmutableList;
import java.util.List;
/**
* Declares a Connection Provider of {@link ForwardingSoapClient} instances given a {@link SoapServiceProvider}.
*
* @since 4.0
*/
public class SoapServiceProviderDeclarer {
public static final String CUSTOM_TRANSPORT = "customTransport";
private final ParameterModelsLoaderDelegate parametersLoader;
private final ClassTypeLoader typeLoader = ExtensionsTypeLoaderFactory.getDefault().createTypeLoader();
SoapServiceProviderDeclarer(ClassTypeLoader loader) {
parametersLoader = new ParameterModelsLoaderDelegate(getContributors(loader), loader);
}
/**
* Declares a new connection provider for a configuration given a {@link SoapServiceProviderWrapper} declaration.
*
* @param configDeclarer the configuration declarer that will own the provider
* @param provider a {@link SoapServiceProviderWrapper} that describes the {@link SoapServiceProvider} Type.
* @param hasCustomTransports if declares custom transport or not.
*/
public void declare(ConfigurationDeclarer configDeclarer, SoapServiceProviderWrapper provider, boolean hasCustomTransports) {
String description = provider.getDescription();
// Declares the Service Provider as a Connection Provider.
ConnectionProviderDeclarer providerDeclarer = configDeclarer.withConnectionProvider(provider.getAlias())
.describedAs(description)
.withModelProperty(new ConnectionTypeModelProperty(ForwardingSoapClient.class))
.withModelProperty(new ImplementingTypeModelProperty(provider.getDeclaringClass()))
.withConnectionManagementType(POOLING);
ParameterDeclarationContext context = new ParameterDeclarationContext("Service Provider", providerDeclarer.getDeclaration());
parametersLoader.declare(providerDeclarer, provider.getParameters(), context);
if (hasCustomTransports) {
providerDeclarer.onParameterGroup(CUSTOM_TRANSPORT + "Group")
.withRequiredParameter(CUSTOM_TRANSPORT)
.ofType(typeLoader.load(MessageDispatcherProvider.class))
.withLayout(LayoutModel.builder().build())
.withExpressionSupport(NOT_SUPPORTED);
}
}
private List<ParameterDeclarerContributor> getContributors(ClassTypeLoader loader) {
return ImmutableList
.of(new InfrastructureFieldContributor(),
new ParameterTypeUnwrapperContributor(loader, TypedValue.class, new TypedValueTypeModelProperty()),
new ParameterTypeUnwrapperContributor(loader, ParameterResolver.class, new ParameterResolverTypeModelProperty()),
new ParameterTypeUnwrapperContributor(loader, Literal.class, new LiteralModelProperty()));
}
}