/*
* 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.enricher;
import static org.mule.runtime.api.meta.ExpressionSupport.SUPPORTED;
import static org.mule.runtime.api.meta.model.parameter.ParameterGroupModel.DEFAULT_GROUP_NAME;
import static org.mule.runtime.module.extension.internal.ExtensionProperties.ADVANCED_TAB_NAME;
import static org.mule.runtime.module.extension.internal.ExtensionProperties.ENCODING_PARAMETER_NAME;
import static org.mule.runtime.module.extension.internal.ExtensionProperties.MIME_TYPE_PARAMETER_NAME;
import static org.mule.runtime.module.extension.internal.util.IntrospectionUtils.isVoid;
import static org.mule.runtime.module.extension.internal.util.MuleExtensionUtils.getImplementingMethod;
import org.mule.metadata.api.ClassTypeLoader;
import org.mule.runtime.api.meta.model.declaration.fluent.ExtensionDeclaration;
import org.mule.runtime.api.meta.model.declaration.fluent.OperationDeclaration;
import org.mule.runtime.api.meta.model.declaration.fluent.ParameterDeclaration;
import org.mule.runtime.api.meta.model.display.LayoutModel;
import org.mule.runtime.extension.api.annotation.DataTypeParameters;
import org.mule.runtime.extension.api.declaration.fluent.util.IdempotentDeclarationWalker;
import org.mule.runtime.extension.api.declaration.type.ExtensionsTypeLoaderFactory;
import org.mule.runtime.extension.api.exception.IllegalModelDefinitionException;
import org.mule.runtime.extension.api.loader.ExtensionLoadingContext;
import org.mule.runtime.module.extension.internal.ExtensionProperties;
/**
* Enriches operations which were defined in methods annotated with {@link DataTypeParameters} so that parameters
* {@link ExtensionProperties#MIME_TYPE_PARAMETER_NAME} and {@link ExtensionProperties#ENCODING_PARAMETER_NAME}. are added Both
* attributes are optional, have no default value and accept expressions.
*
* @since 4.0
*/
public final class DataTypeDeclarationEnricher extends AbstractAnnotatedDeclarationEnricher {
private final ClassTypeLoader typeLoader = ExtensionsTypeLoaderFactory.getDefault().createTypeLoader();
@Override
public void enrich(ExtensionLoadingContext extensionLoadingContext) {
final ExtensionDeclaration declaration = extensionLoadingContext.getExtensionDeclarer().getDeclaration();
new IdempotentDeclarationWalker() {
@Override
protected void onOperation(OperationDeclaration declaration) {
getImplementingMethod(declaration).ifPresent(method -> {
DataTypeParameters annotation = method.getAnnotation(DataTypeParameters.class);
if (annotation != null) {
if (isVoid(method)) {
throw new IllegalModelDefinitionException(String.format(
"Operation '%s' of extension '%s' is void yet requires the ability to change the content metadata."
+ " Mutating the content metadata requires an operation with a return type.",
declaration.getName(), declaration.getName()));
}
declaration.getParameterGroup(DEFAULT_GROUP_NAME).addParameter(
newParameter(MIME_TYPE_PARAMETER_NAME,
"The mime type of the payload that this operation outputs."));
declaration.getParameterGroup(DEFAULT_GROUP_NAME)
.addParameter(newParameter(ENCODING_PARAMETER_NAME, "The encoding of the payload that this operation outputs."));
}
});
}
}.walk(declaration);
}
private ParameterDeclaration newParameter(String name, String description) {
ParameterDeclaration parameter = new ParameterDeclaration(name);
parameter.setRequired(false);
parameter.setExpressionSupport(SUPPORTED);
parameter.setType(typeLoader.load(String.class), false);
parameter.setDescription(description);
parameter.setLayoutModel(LayoutModel.builder().tabName(ADVANCED_TAB_NAME).build());
return parameter;
}
}