/*
* 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.core.el.mvel.datatype;
import org.mule.mvel2.compiler.CompiledExpression;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.core.api.Event;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
/**
* Resolves expression's data type using {@link ExpressionDataTypeResolver}
*/
public class MvelDataTypeResolver {
private final List<ExpressionDataTypeResolver> resolvers;
public MvelDataTypeResolver() {
this(getDefaultDataTypeResolvers());
}
public MvelDataTypeResolver(List<ExpressionDataTypeResolver> resolvers) {
this.resolvers = new LinkedList<>(resolvers);
}
private static List<ExpressionDataTypeResolver> getDefaultDataTypeResolvers() {
List<ExpressionDataTypeResolver> resolvers;
resolvers = new LinkedList<>();
resolvers.add(new PayloadExpressionDataTypeResolver());
resolvers.add(new PropertyExpressionDataTypeResolver());
resolvers.add(new FlowVarExpressionDataTypeResolver());
resolvers.add(new SessionVarExpressionDataTypeResolver());
return resolvers;
}
/**
* Resolves expression data type
*
* @param value result of evaluating the expression on the given message
* @param event event under evaluation
* @param serializedExpression expression
* @return the data type corresponding to the given expression if there is an expression resolver able to resolved it. A default
* data type for the value if the expression was not resolved.
*/
public DataType resolve(Object value, Event event, Serializable serializedExpression) {
DataType result = null;
if (serializedExpression instanceof CompiledExpression) {
CompiledExpression compiledExpression = (CompiledExpression) serializedExpression;
for (ExpressionDataTypeResolver resolver : resolvers) {
result = resolver.resolve(event, compiledExpression);
if (result != null) {
break;
}
}
}
if (result == null) {
Class<?> type = value == null ? Object.class : value.getClass();
result = DataType.fromType(type);
}
return result;
}
}