/* * 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 static org.hamcrest.MatcherAssert.assertThat; import static org.mule.mvel2.MVEL.compileExpression; import static org.mule.runtime.api.metadata.MediaType.JSON; import static org.mule.tck.junit4.matcher.DataTypeMatcher.like; import org.mule.mvel2.MVEL; import org.mule.mvel2.ParserConfiguration; import org.mule.mvel2.ParserContext; import org.mule.mvel2.compiler.CompiledExpression; import org.mule.mvel2.integration.impl.CachedMapVariableResolverFactory; import org.mule.runtime.api.metadata.DataType; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.el.mvel.DelegateVariableResolverFactory; import org.mule.runtime.core.el.mvel.GlobalVariableResolverFactory; import org.mule.runtime.core.el.mvel.MVELExpressionLanguage; import org.mule.runtime.core.el.mvel.MVELExpressionLanguageContext; import org.mule.runtime.core.el.mvel.MessageVariableResolverFactory; import org.mule.runtime.core.el.mvel.StaticVariableResolverFactory; import org.mule.runtime.core.el.mvel.VariableVariableResolverFactory; import org.mule.tck.junit4.AbstractMuleContextTestCase; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Collections; import org.junit.Test; public abstract class AbstractVarExpressionDataTypeResolverTestCase extends AbstractMuleContextTestCase { public static final String EXPRESSION_VALUE = "bar"; public static final Charset CUSTOM_ENCODING = StandardCharsets.UTF_16; public static final String PROPERTY_NAME = "foo"; private final ExpressionDataTypeResolver expressionDataTypeResolver; private final String variableName; protected AbstractVarExpressionDataTypeResolverTestCase(ExpressionDataTypeResolver expressionDataTypeResolver, String variableName) { this.expressionDataTypeResolver = expressionDataTypeResolver; this.variableName = variableName; } @Test public void returnsFlowVarDataTypeUsingMapSyntax() throws Exception { doVarDataTypeTest(variableName + "['" + PROPERTY_NAME + "']"); } @Test public void returnsFlowVarDataTypeUsingDotSyntax() throws Exception { doVarDataTypeTest(variableName + "." + PROPERTY_NAME); } @Test public void returnsFlowVarDataTypeUsingEscapedDotSyntax() throws Exception { doVarDataTypeTest(variableName + ".'" + PROPERTY_NAME + "'"); } protected void doVarDataTypeTest(String expression) throws Exception { DataType expectedDataType = DataType.builder().type(String.class).mediaType(JSON).charset(CUSTOM_ENCODING).build(); Event event = setVariable(testEvent(), EXPRESSION_VALUE, expectedDataType); final ParserConfiguration parserConfiguration = MVELExpressionLanguage.createParserConfiguration(Collections.EMPTY_MAP); final MVELExpressionLanguageContext context = createMvelExpressionLanguageContext(event, parserConfiguration); CompiledExpression compiledExpression = (CompiledExpression) compileExpression(expression, new ParserContext(parserConfiguration)); // Expression must be executed, otherwise the variable accessor is not properly configured MVEL.executeExpression(compiledExpression, context); assertThat(expressionDataTypeResolver.resolve(event, compiledExpression), like(String.class, JSON, CUSTOM_ENCODING)); } protected MVELExpressionLanguageContext createMvelExpressionLanguageContext(Event testEvent, ParserConfiguration parserConfiguration) { final MVELExpressionLanguageContext context = new MVELExpressionLanguageContext(parserConfiguration, muleContext); final StaticVariableResolverFactory staticContext = new StaticVariableResolverFactory(parserConfiguration, muleContext); final GlobalVariableResolverFactory globalContext = new GlobalVariableResolverFactory(Collections.EMPTY_MAP, Collections.EMPTY_MAP, parserConfiguration, muleContext); final DelegateVariableResolverFactory innerDelegate = new DelegateVariableResolverFactory(globalContext, new VariableVariableResolverFactory(parserConfiguration, muleContext, testEvent, Event.builder(testEvent))); final DelegateVariableResolverFactory delegate = new DelegateVariableResolverFactory(staticContext, new MessageVariableResolverFactory(parserConfiguration, muleContext, testEvent, Event.builder(testEvent), innerDelegate)); context.setNextFactory(new CachedMapVariableResolverFactory(Collections.EMPTY_MAP, delegate)); return context; } protected abstract Event setVariable(Event testEvent, Object propertyValue, DataType expectedDataType); }