/*
* 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.runtime.resolver;
import static org.mule.metadata.api.utils.MetadataTypeUtils.getDefaultValue;
import static org.mule.metadata.java.api.utils.JavaTypeUtils.getType;
import static org.mule.runtime.api.util.Preconditions.checkArgument;
import static org.mule.runtime.module.extension.internal.util.IntrospectionUtils.isParameterResolver;
import static org.mule.runtime.module.extension.internal.util.IntrospectionUtils.isTypedValue;
import org.mule.metadata.api.model.MetadataType;
import org.mule.metadata.api.model.ObjectFieldType;
import org.mule.runtime.api.exception.MuleRuntimeException;
import org.mule.runtime.api.lifecycle.InitialisationException;
import org.mule.runtime.api.meta.model.ModelProperty;
import org.mule.runtime.api.meta.model.parameter.ParameterModel;
import org.mule.runtime.core.api.MuleContext;
import java.util.Optional;
import java.util.Set;
import java.util.function.BooleanSupplier;
/**
* Utility class to share common behaviour between resolvers
*
* @since 4.0
*/
public class ResolverUtils {
private ResolverUtils() {
}
static ValueResolver<?> getFieldDefaultValueValueResolver(ObjectFieldType field, MuleContext muleContext) {
Optional<String> defaultValue = getDefaultValue(field);
checkArgument(defaultValue.isPresent(), "No default value available for field :" + field.getKey().getName());
return getExpressionBasedValueResolver(defaultValue.get(), field.getValue(), muleContext);
}
static ValueResolver<?> getFieldDefaultValueValueResolver(MetadataType fieldType, String defaultValue,
MuleContext muleContext) {
return getExpressionBasedValueResolver(defaultValue, fieldType, muleContext);
}
public static ValueResolver<?> getExpressionBasedValueResolver(String expression, MetadataType metadataType,
MuleContext muleContext) {
return getExpressionBasedValueResolver(expression,
() -> isTypedValue(metadataType),
() -> isParameterResolver(metadataType),
metadataType,
muleContext);
}
static ValueResolver<?> getExpressionBasedValueResolver(String expression, ParameterModel operationModel,
MuleContext muleContext) {
MetadataType metadataType = operationModel.getType();
Set<ModelProperty> modelProperties = operationModel.getModelProperties();
return getExpressionBasedValueResolver(expression,
() -> isTypedValue(metadataType) || isTypedValue(modelProperties),
() -> isParameterResolver(metadataType) || isParameterResolver(modelProperties),
metadataType,
muleContext);
}
private static ValueResolver<?> getExpressionBasedValueResolver(String expression, BooleanSupplier isTypedValue,
BooleanSupplier isParameterResolver, MetadataType type,
MuleContext muleContext) {
try {
if (isTypedValue.getAsBoolean()) {
ExpressionTypedValueValueResolver<Object> valueResolver =
new ExpressionTypedValueValueResolver<>(expression, getType(type));
valueResolver.setTransformationService(muleContext.getTransformationService());
valueResolver.setExtendedExpressionManager(muleContext.getExpressionManager());
return valueResolver;
} else if (isParameterResolver.getAsBoolean()) {
ExpressionBasedParameterResolverValueResolver<Object> valueResolver =
new ExpressionBasedParameterResolverValueResolver<>(expression, type);
valueResolver.setTransformationService(muleContext.getTransformationService());
valueResolver.setExtendedExpressionManager(muleContext.getExpressionManager());
return valueResolver;
} else if (muleContext.getExpressionManager().isExpression(expression)) {
TypeSafeExpressionValueResolver<Object> valueResolver = new TypeSafeExpressionValueResolver<>(expression, type);
valueResolver.setTransformationService(muleContext.getTransformationService());
valueResolver.setExtendedExpressionManager(muleContext.getExpressionManager());
valueResolver.initialise();
return valueResolver;
} else {
TypeSafeValueResolverWrapper typeSafeValueResolverWrapper =
new TypeSafeValueResolverWrapper<>(new StaticValueResolver<>(expression), getType(type));
typeSafeValueResolverWrapper.setTransformationService(muleContext.getTransformationService());
typeSafeValueResolverWrapper.initialise();
return typeSafeValueResolverWrapper;
}
} catch (InitialisationException e) {
throw new MuleRuntimeException(e);
}
}
}