else if (typeConverter.canConvert(suppliedArg, expectedArg)) { match = ArgumentsMatchKind.REQUIRES_CONVERSION;
else if (typeConverter.canConvert(suppliedArg, expectedArg)) { match = ArgumentsMatchKind.REQUIRES_CONVERSION; else if (typeConverter.canConvert(suppliedArg, TypeDescriptor.valueOf(varargsParamType))) { match = ArgumentsMatchKind.REQUIRES_CONVERSION;
/** * Convert operand value to string using registered converter or using * {@code toString} method. * @param value typed value to be converted * @param state expression state * @return {@code TypedValue} instance converted to {@code String} */ private static String convertTypedValueToString(TypedValue value, ExpressionState state) { TypeConverter typeConverter = state.getEvaluationContext().getTypeConverter(); TypeDescriptor typeDescriptor = TypeDescriptor.valueOf(String.class); if (typeConverter.canConvert(value.getTypeDescriptor(), typeDescriptor)) { return String.valueOf(typeConverter.convertValue(value.getValue(), value.getTypeDescriptor(), typeDescriptor)); } return String.valueOf(value.getValue()); }
else if (typeConverter.canConvert(suppliedArg, expectedArg)) { match = ArgumentsMatchKind.REQUIRES_CONVERSION;
else if (typeConverter.canConvert(suppliedArg, expectedArg)) { match = ArgumentsMatchKind.REQUIRES_CONVERSION; else if (typeConverter.canConvert(suppliedArg, TypeDescriptor.valueOf(varargsParamType))) { match = ArgumentsMatchKind.REQUIRES_CONVERSION;
/** * Convert operand value to string using registered converter or using * {@code toString} method. * @param value typed value to be converted * @param state expression state * @return {@code TypedValue} instance converted to {@code String} */ private static String convertTypedValueToString(TypedValue value, ExpressionState state) { TypeConverter typeConverter = state.getEvaluationContext().getTypeConverter(); TypeDescriptor typeDescriptor = TypeDescriptor.valueOf(String.class); if (typeConverter.canConvert(value.getTypeDescriptor(), typeDescriptor)) { return String.valueOf(typeConverter.convertValue(value.getValue(), value.getTypeDescriptor(), typeDescriptor)); } return String.valueOf(value.getValue()); }
@Test public void testCoercionToCollectionOfPrimitive() throws Exception { class TestTarget { @SuppressWarnings("unused") public int sum(Collection<Integer> numbers) { int total = 0; for (int i : numbers) { total += i; } return total; } } StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); TypeDescriptor collectionType = new TypeDescriptor(new MethodParameter(TestTarget.class.getDeclaredMethod( "sum", Collection.class), 0)); // The type conversion is possible assertTrue(evaluationContext.getTypeConverter() .canConvert(TypeDescriptor.valueOf(String.class), collectionType)); // ... and it can be done successfully assertEquals("[1, 2, 3, 4]", evaluationContext.getTypeConverter().convertValue("1,2,3,4", TypeDescriptor.valueOf(String.class), collectionType).toString()); evaluationContext.setVariable("target", new TestTarget()); // OK up to here, so the evaluation should be fine... // ... but this fails int result = (Integer) parser.parseExpression("#target.sum(#root)").getValue(evaluationContext, "1,2,3,4"); assertEquals("Wrong result: " + result, 10, result); }
private boolean canReturnExpectedType(AnnotatedMethodFilter filter, Class<?> targetType, TypeConverter typeConverter) { if (this.expectedType == null) { return true; } List<Method> methods = filter.filter(Arrays.asList(ReflectionUtils.getAllDeclaredMethods(targetType))); for (Method candidate : methods) { if (typeConverter.canConvert(TypeDescriptor.valueOf(candidate.getReturnType()), this.expectedType)) { return true; } } return false; }
private void prepareEvaluationContext() throws Exception { StandardEvaluationContext context = getEvaluationContext(false); Class<?> targetType = AopUtils.getTargetClass(this.targetObject); if (this.method != null) { context.registerMethodFilter(targetType, new FixedMethodFilter(this.method)); if (this.expectedType != null) { Assert.state(context.getTypeConverter() .canConvert(TypeDescriptor.valueOf((this.method).getReturnType()), this.expectedType), () -> "Cannot convert to expected type (" + this.expectedType + ") from " + this.method); } } else { AnnotatedMethodFilter filter = new AnnotatedMethodFilter(this.annotationType, this.methodName, this.requiresReply); Assert.state(canReturnExpectedType(filter, targetType, context.getTypeConverter()), () -> "Cannot convert to expected type (" + this.expectedType + ") from " + this.method); context.registerMethodFilter(targetType, filter); } context.setVariable("target", this.targetObject); context.registerFunction("requiredHeader", ParametersWrapper.class.getDeclaredMethod("getHeader", Map.class, String.class)); }
private boolean canReturnExpectedType(AnnotatedMethodFilter filter, Class<?> targetType, TypeConverter typeConverter) { if (this.expectedType == null) { return true; } List<Method> methods = filter.filter(Arrays.asList(ReflectionUtils.getAllDeclaredMethods(targetType))); for (Method candidate : methods) { if (typeConverter.canConvert(TypeDescriptor.valueOf(candidate.getReturnType()), this.expectedType)) { return true; } } return false; }
private boolean canReturnExpectedType(AnnotatedMethodFilter filter, Class<?> targetType, TypeConverter typeConverter) { if (expectedType == null) { return true; } List<Method> methods = filter.filter(Arrays.asList(ReflectionUtils.getAllDeclaredMethods(targetType))); for (Method method : methods) { if (typeConverter.canConvert(TypeDescriptor.valueOf(method.getReturnType()), TypeDescriptor.valueOf(expectedType))) { return true; } } return false; }
private boolean canReturnExpectedType(AnnotatedMethodFilter filter, Class<?> targetType, TypeConverter typeConverter) { if (expectedType == null) { return true; } List<Method> methods = filter.filter(Arrays.asList(ReflectionUtils.getAllDeclaredMethods(targetType))); for (Method method : methods) { if (typeConverter.canConvert(TypeDescriptor.valueOf(method.getReturnType()), TypeDescriptor.valueOf(expectedType))) { return true; } } return false; }
@Override protected String convertToString( final IExpressionContext context, final Object object) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, TYPE_STRING)) { return super.convertToString(context, object); } return (String) typeConverter.convertValue(object, objectTypeDescriptor, TYPE_STRING); }
public boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType) { return targetType.isAssignableTo(BOOLEAN_TYPE) && ( sourceType.isAssignableTo(NUMBER_TYPE) || sourceType.isCollection() || sourceType.isArray() ) || decorated.canConvert(sourceType, targetType); }
@Override protected String convertToString( final IExpressionContext context, final Object object) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, TYPE_STRING)) { return super.convertToString(context, object); } return (String) typeConverter.convertValue(object, objectTypeDescriptor, TYPE_STRING); }
@Override protected String convertToString( final IExpressionContext context, final Object object) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, TYPE_STRING)) { return super.convertToString(context, object); } return (String) typeConverter.convertValue(object, objectTypeDescriptor, TYPE_STRING); }
@Override protected String convertToString( final IExpressionContext context, final Object object) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, TYPE_STRING)) { return super.convertToString(context, object); } return (String) typeConverter.convertValue(object, objectTypeDescriptor, TYPE_STRING); }
@Override protected String convertToString( final IExpressionContext context, final Object object) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, TYPE_STRING)) { return super.convertToString(context, object); } return (String) typeConverter.convertValue(object, objectTypeDescriptor, TYPE_STRING); }
@Override protected <T> T convertOther( final IExpressionContext context, final Object object, final Class<T> targetClass) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeDescriptor targetTypeDescriptor = TypeDescriptor.valueOf(targetClass); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, targetTypeDescriptor)) { return super.convertOther(context, object, targetClass); } return (T) typeConverter.convertValue(object, objectTypeDescriptor, targetTypeDescriptor); }
@Override protected <T> T convertOther( final IExpressionContext context, final Object object, final Class<T> targetClass) { if (object == null) { return null; } final TypeDescriptor objectTypeDescriptor = TypeDescriptor.forObject(object); final TypeDescriptor targetTypeDescriptor = TypeDescriptor.valueOf(targetClass); final TypeConverter typeConverter = getSpringConversionService(context); if (typeConverter == null || !typeConverter.canConvert(objectTypeDescriptor, targetTypeDescriptor)) { return super.convertOther(context, object, targetClass); } return (T) typeConverter.convertValue(object, objectTypeDescriptor, targetTypeDescriptor); }