/*
* 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.internal.loader.java;
import static java.lang.String.format;
import static org.mule.runtime.extension.api.util.NameUtils.getComponentDeclarationTypeName;
import org.mule.metadata.api.ClassTypeLoader;
import org.mule.runtime.api.meta.model.declaration.fluent.ComponentDeclarer;
import org.mule.runtime.extension.api.annotation.param.Connection;
import org.mule.runtime.extension.api.connectivity.TransactionalConnection;
import org.mule.runtime.extension.api.exception.IllegalOperationModelDefinitionException;
import org.mule.runtime.module.extension.internal.loader.java.property.ConnectivityModelProperty;
import org.mule.runtime.module.extension.internal.loader.java.type.ExtensionParameter;
import org.mule.runtime.module.extension.internal.loader.java.type.WithAlias;
import org.mule.runtime.module.extension.internal.loader.java.type.WithParameters;
import java.util.List;
/**
* Base class for sub delegates of {@link DefaultJavaModelLoaderDelegate}
*
* @since 4.0
*/
abstract class AbstractModelLoaderDelegate {
protected final DefaultJavaModelLoaderDelegate loader;
AbstractModelLoaderDelegate(DefaultJavaModelLoaderDelegate loader) {
this.loader = loader;
}
protected Class<?> getExtensionType() {
return loader.getExtensionType();
}
ConfigModelLoaderDelegate getConfigLoaderDelegate() {
return loader.getConfigLoaderDelegate();
}
OperationModelLoaderDelegate getOperationModelLoaderDelegate() {
return loader.getOperationLoaderDelegate();
}
SourceModelLoaderDelegate getSourceModelLoaderDelegate() {
return loader.getSourceModelLoaderDelegate();
}
ConnectionProviderModelLoaderDelegate getConnectionProviderModelLoaderDelegate() {
return loader.getConnectionProviderModelLoaderDelegate();
}
OperationModelLoaderDelegate getOperationLoaderDelegate() {
return loader.getOperationLoaderDelegate();
}
ClassTypeLoader getTypeLoader() {
return loader.getTypeLoader();
}
void processComponentConnectivity(ComponentDeclarer componentDeclarer, WithParameters component, WithAlias alias) {
final List<ExtensionParameter> connectionParameters = component.getParametersAnnotatedWith(Connection.class);
if (connectionParameters.isEmpty()) {
componentDeclarer.requiresConnection(false).transactional(false);
} else if (connectionParameters.size() == 1) {
ExtensionParameter connectionParameter = connectionParameters.iterator().next();
componentDeclarer.requiresConnection(true)
.transactional(TransactionalConnection.class.isAssignableFrom(connectionParameter.getType().getDeclaringClass()))
.withModelProperty(new ConnectivityModelProperty(connectionParameter.getType().getDeclaringClass()));
} else if (connectionParameters.size() > 1) {
throw new IllegalOperationModelDefinitionException(format(
"%s '%s' defines %d parameters annotated with @%s. Only one is allowed",
getComponentDeclarationTypeName(componentDeclarer
.getDeclaration()),
alias.getAlias(),
connectionParameters.size(),
Connection.class.getSimpleName()));
}
}
}