Search in sources :

Example 1 with MethodExecutor

use of cn.taketoday.expression.MethodExecutor in project today-infrastructure by TAKETODAY.

the class SpelReproTests method varargsAndPrimitives_SPR8174.

@Test
void varargsAndPrimitives_SPR8174() throws Exception {
    EvaluationContext emptyEvalContext = new StandardEvaluationContext();
    List<TypeDescriptor> args = new ArrayList<>();
    args.add(TypeDescriptor.fromObject(34L));
    ReflectionUtil<Integer> ru = new ReflectionUtil<>();
    MethodExecutor me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "methodToCall", args);
    args.set(0, TypeDescriptor.fromObject(23));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, 45);
    args.set(0, TypeDescriptor.fromObject(23f));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, 45f);
    args.set(0, TypeDescriptor.fromObject(23d));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, 23d);
    args.set(0, TypeDescriptor.fromObject((short) 23));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, (short) 23);
    args.set(0, TypeDescriptor.fromObject(23L));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, 23L);
    args.set(0, TypeDescriptor.fromObject((char) 65));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, (char) 65);
    args.set(0, TypeDescriptor.fromObject((byte) 23));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, (byte) 23);
    args.set(0, TypeDescriptor.fromObject(true));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "foo", args);
    me.execute(emptyEvalContext, ru, true);
    // trickier:
    args.set(0, TypeDescriptor.fromObject(12));
    args.add(TypeDescriptor.fromObject(23f));
    me = new ReflectiveMethodResolver().resolve(emptyEvalContext, ru, "bar", args);
    me.execute(emptyEvalContext, ru, 12, 23f);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) TypeDescriptor(cn.taketoday.core.TypeDescriptor) ReflectiveMethodResolver(cn.taketoday.expression.spel.support.ReflectiveMethodResolver) MethodExecutor(cn.taketoday.expression.MethodExecutor) ArrayList(java.util.ArrayList) EvaluationContext(cn.taketoday.expression.EvaluationContext) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) Test(org.junit.jupiter.api.Test)

Example 2 with MethodExecutor

use of cn.taketoday.expression.MethodExecutor in project today-infrastructure by TAKETODAY.

the class SpelReproTests method wideningPrimitiveConversion_SPR8224.

/**
 * Test whether {@link ReflectiveMethodResolver} handles Widening Primitive Conversion. That's passing an 'int' to a
 * method accepting 'long' is ok.
 */
@Test
void wideningPrimitiveConversion_SPR8224() throws Exception {
    class WideningPrimitiveConversion {

        public int getX(long i) {
            return 10;
        }
    }
    final Integer INTEGER_VALUE = 7;
    WideningPrimitiveConversion target = new WideningPrimitiveConversion();
    EvaluationContext emptyEvalContext = new StandardEvaluationContext();
    List<TypeDescriptor> args = new ArrayList<>();
    args.add(TypeDescriptor.fromObject(INTEGER_VALUE));
    MethodExecutor me = new ReflectiveMethodResolver(true).resolve(emptyEvalContext, target, "getX", args);
    final int actual = (Integer) me.execute(emptyEvalContext, target, INTEGER_VALUE).getValue();
    final int compiler = target.getX(INTEGER_VALUE);
    assertThat(actual).isEqualTo(compiler);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) TypeDescriptor(cn.taketoday.core.TypeDescriptor) ReflectiveMethodResolver(cn.taketoday.expression.spel.support.ReflectiveMethodResolver) MethodExecutor(cn.taketoday.expression.MethodExecutor) ArrayList(java.util.ArrayList) EvaluationContext(cn.taketoday.expression.EvaluationContext) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) Test(org.junit.jupiter.api.Test)

Example 3 with MethodExecutor

use of cn.taketoday.expression.MethodExecutor in project today-infrastructure by TAKETODAY.

the class Spr7538Tests method repro.

@Test
void repro() throws Exception {
    AlwaysTrueReleaseStrategy target = new AlwaysTrueReleaseStrategy();
    BeanFactoryTypeConverter converter = new BeanFactoryTypeConverter();
    StandardEvaluationContext context = new StandardEvaluationContext();
    context.setTypeConverter(converter);
    List<Foo> arguments = Collections.emptyList();
    List<TypeDescriptor> paramDescriptors = new ArrayList<>();
    Method method = AlwaysTrueReleaseStrategy.class.getMethod("checkCompleteness", List.class);
    paramDescriptors.add(new TypeDescriptor(new MethodParameter(method, 0)));
    List<TypeDescriptor> argumentTypes = new ArrayList<>();
    argumentTypes.add(TypeDescriptor.fromObject(arguments));
    ReflectiveMethodResolver resolver = new ReflectiveMethodResolver();
    MethodExecutor executor = resolver.resolve(context, target, "checkCompleteness", argumentTypes);
    Object result = executor.execute(context, target, arguments);
    System.out.println("Result: " + result);
}
Also used : ArrayList(java.util.ArrayList) Method(java.lang.reflect.Method) TypeDescriptor(cn.taketoday.core.TypeDescriptor) MethodExecutor(cn.taketoday.expression.MethodExecutor) MethodParameter(cn.taketoday.core.MethodParameter) Test(org.junit.jupiter.api.Test)

Example 4 with MethodExecutor

use of cn.taketoday.expression.MethodExecutor in project today-framework by TAKETODAY.

the class SpelReproTests method SPR9495.

@Test
void SPR9495() {
    SpelParserConfiguration configuration = new SpelParserConfiguration(false, false);
    ExpressionParser parser = new SpelExpressionParser(configuration);
    StandardEvaluationContext context = new StandardEvaluationContext();
    Expression spel = parser.parseExpression("#enumType.values()");
    context.setVariable("enumType", ABC.class);
    Object result = spel.getValue(context);
    assertThat(result).isNotNull();
    assertThat(result.getClass().isArray()).isTrue();
    assertThat(Array.get(result, 0)).isEqualTo(ABC.A);
    assertThat(Array.get(result, 1)).isEqualTo(ABC.B);
    assertThat(Array.get(result, 2)).isEqualTo(ABC.C);
    context.addMethodResolver(new MethodResolver() {

        @Override
        public MethodExecutor resolve(EvaluationContext context, Object targetObject, String name, List<TypeDescriptor> argumentTypes) throws AccessException {
            return (context1, target, arguments) -> {
                try {
                    Method method = XYZ.class.getMethod("values");
                    Object value = method.invoke(target, arguments);
                    return new TypedValue(value, new TypeDescriptor(new MethodParameter(method, -1)).narrow(value));
                } catch (Exception ex) {
                    throw new AccessException(ex.getMessage(), ex);
                }
            };
        }
    });
    result = spel.getValue(context);
    assertThat(result).isNotNull();
    assertThat(result.getClass().isArray()).isTrue();
    assertThat(Array.get(result, 0)).isEqualTo(XYZ.X);
    assertThat(Array.get(result, 1)).isEqualTo(XYZ.Y);
    assertThat(Array.get(result, 2)).isEqualTo(XYZ.Z);
}
Also used : StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) ReflectiveMethodResolver(cn.taketoday.expression.spel.support.ReflectiveMethodResolver) MethodResolver(cn.taketoday.expression.MethodResolver) Method(java.lang.reflect.Method) EvaluationException(cn.taketoday.expression.EvaluationException) ExpressionException(cn.taketoday.expression.ExpressionException) Assertions.assertThatIllegalStateException(org.assertj.core.api.Assertions.assertThatIllegalStateException) AccessException(cn.taketoday.expression.AccessException) SpelExpressionParser(cn.taketoday.expression.spel.standard.SpelExpressionParser) AccessException(cn.taketoday.expression.AccessException) TypeDescriptor(cn.taketoday.core.TypeDescriptor) Expression(cn.taketoday.expression.Expression) SpelExpression(cn.taketoday.expression.spel.standard.SpelExpression) MethodExecutor(cn.taketoday.expression.MethodExecutor) ExpressionParser(cn.taketoday.expression.ExpressionParser) SpelExpressionParser(cn.taketoday.expression.spel.standard.SpelExpressionParser) EvaluationContext(cn.taketoday.expression.EvaluationContext) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) MethodParameter(cn.taketoday.core.MethodParameter) TypedValue(cn.taketoday.expression.TypedValue) Test(org.junit.jupiter.api.Test)

Example 5 with MethodExecutor

use of cn.taketoday.expression.MethodExecutor in project today-framework by TAKETODAY.

the class SpelReproTests method wideningPrimitiveConversion_SPR8224.

/**
 * Test whether {@link ReflectiveMethodResolver} handles Widening Primitive Conversion. That's passing an 'int' to a
 * method accepting 'long' is ok.
 */
@Test
void wideningPrimitiveConversion_SPR8224() throws Exception {
    class WideningPrimitiveConversion {

        public int getX(long i) {
            return 10;
        }
    }
    final Integer INTEGER_VALUE = 7;
    WideningPrimitiveConversion target = new WideningPrimitiveConversion();
    EvaluationContext emptyEvalContext = new StandardEvaluationContext();
    List<TypeDescriptor> args = new ArrayList<>();
    args.add(TypeDescriptor.fromObject(INTEGER_VALUE));
    MethodExecutor me = new ReflectiveMethodResolver(true).resolve(emptyEvalContext, target, "getX", args);
    final int actual = (Integer) me.execute(emptyEvalContext, target, INTEGER_VALUE).getValue();
    final int compiler = target.getX(INTEGER_VALUE);
    assertThat(actual).isEqualTo(compiler);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) TypeDescriptor(cn.taketoday.core.TypeDescriptor) ReflectiveMethodResolver(cn.taketoday.expression.spel.support.ReflectiveMethodResolver) MethodExecutor(cn.taketoday.expression.MethodExecutor) ArrayList(java.util.ArrayList) EvaluationContext(cn.taketoday.expression.EvaluationContext) StandardEvaluationContext(cn.taketoday.expression.spel.support.StandardEvaluationContext) Test(org.junit.jupiter.api.Test)

Aggregations

TypeDescriptor (cn.taketoday.core.TypeDescriptor)10 MethodExecutor (cn.taketoday.expression.MethodExecutor)10 Test (org.junit.jupiter.api.Test)10 EvaluationContext (cn.taketoday.expression.EvaluationContext)8 ReflectiveMethodResolver (cn.taketoday.expression.spel.support.ReflectiveMethodResolver)8 StandardEvaluationContext (cn.taketoday.expression.spel.support.StandardEvaluationContext)8 ArrayList (java.util.ArrayList)8 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)6 MethodParameter (cn.taketoday.core.MethodParameter)4 Method (java.lang.reflect.Method)4 AccessException (cn.taketoday.expression.AccessException)2 EvaluationException (cn.taketoday.expression.EvaluationException)2 Expression (cn.taketoday.expression.Expression)2 ExpressionException (cn.taketoday.expression.ExpressionException)2 ExpressionParser (cn.taketoday.expression.ExpressionParser)2 MethodResolver (cn.taketoday.expression.MethodResolver)2 TypedValue (cn.taketoday.expression.TypedValue)2 SpelExpression (cn.taketoday.expression.spel.standard.SpelExpression)2 SpelExpressionParser (cn.taketoday.expression.spel.standard.SpelExpressionParser)2 Assertions.assertThatIllegalStateException (org.assertj.core.api.Assertions.assertThatIllegalStateException)2