From 71e60f455186b2373a5c3e47d672bed1a91822bd Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Fri, 7 Jan 2011 06:32:21 +0000 Subject: [PATCH] Favor convertValue(Object, TypeDescriptor) where possible and TypedValue(Object); check with Andy on Selection and Projection TypedValue usage --- .../core/convert/support/ConversionUtils.java | 22 ------------------- .../support/DefaultConversionTests.java | 6 ++--- .../expression/TypeConverter.java | 4 ++++ .../expression/spel/ExpressionState.java | 2 +- .../spel/ast/ConstructorReference.java | 3 +-- .../expression/spel/ast/Projection.java | 7 +++--- .../expression/spel/ast/Selection.java | 15 ++++++------- .../spel/support/ReflectionHelper.java | 5 ++--- .../support/ReflectivePropertyAccessor.java | 2 +- .../spel/support/StandardTypeConverter.java | 4 ++++ ...essionTestsUsingCoreConversionService.java | 4 ++-- .../support/BeanFactoryTypeConverter.java | 5 +++++ 12 files changed, 32 insertions(+), 47 deletions(-) diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java b/org.springframework.core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java index 88731032e4e..0b0c62221b6 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java @@ -16,8 +16,6 @@ package org.springframework.core.convert.support; -import java.util.Map; - import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; @@ -43,24 +41,4 @@ abstract class ConversionUtils { } } - public static TypeDescriptor[] getMapEntryTypes(Map sourceMap) { - Class keyType = null; - Class valueType = null; - for (Object entry : sourceMap.entrySet()) { - Map.Entry mapEntry = (Map.Entry) entry; - Object key = mapEntry.getKey(); - if (keyType == null && key != null) { - keyType = key.getClass(); - } - Object value = mapEntry.getValue(); - if (valueType == null && value != null) { - valueType = value.getClass(); - } - if (keyType!= null && valueType != null) { - break; - } - } - return new TypeDescriptor[] { TypeDescriptor.valueOf(keyType), TypeDescriptor.valueOf(valueType) }; - } - } diff --git a/org.springframework.core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java b/org.springframework.core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java index 807ddf501fd..2ac63df918d 100644 --- a/org.springframework.core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java +++ b/org.springframework.core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java @@ -457,8 +457,7 @@ public class DefaultConversionTests { @Test public void convertStringToCollectionWithElementConversion() throws Exception { - List result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class), - new TypeDescriptor(getClass().getField("genericList"))); + List result = (List) conversionService.convert("1,2,3", new TypeDescriptor(getClass().getField("genericList"))); assertEquals(3, result.size()); assertEquals(new Integer(1), result.get(0)); assertEquals(new Integer(2), result.get(1)); @@ -494,8 +493,7 @@ public class DefaultConversionTests { @Test public void convertObjectToCollectionWithElementConversion() throws Exception { - List result = (List) conversionService.convert(3L, TypeDescriptor.valueOf(Long.class), - new TypeDescriptor(getClass().getField("genericList"))); + List result = (List) conversionService.convert(3L, new TypeDescriptor(getClass().getField("genericList"))); assertEquals(1, result.size()); assertEquals(new Integer(3), result.get(0)); } diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/TypeConverter.java b/org.springframework.expression/src/main/java/org/springframework/expression/TypeConverter.java index 212f9ef902a..1f6aef67831 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/TypeConverter.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/TypeConverter.java @@ -49,5 +49,9 @@ public interface TypeConverter { * @throws EvaluationException if conversion is not possible */ Object convertValue(Object value, TypeDescriptor sourceType, TypeDescriptor targetType); + + // 3.1 additions for encapsulation of TypeDescriptor.forObject(value); + + Object convertValue(Object value, TypeDescriptor targetType); } diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ExpressionState.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ExpressionState.java index dc1a1025618..3dbf10de92e 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ExpressionState.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ExpressionState.java @@ -141,7 +141,7 @@ public class ExpressionState { } public Object convertValue(TypedValue value, TypeDescriptor targetTypeDescriptor) throws EvaluationException { - return this.relatedContext.getTypeConverter().convertValue(value.getValue(), TypeDescriptor.forObject(value.getValue()), targetTypeDescriptor); + return this.relatedContext.getTypeConverter().convertValue(value.getValue(), targetTypeDescriptor); } /* diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java index faedfdc2ade..f97c325a7ba 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java @@ -322,8 +322,7 @@ public class ConstructorReference extends SpelNodeImpl { for (int i = 0; i < newObjectArray.length; i++) { SpelNode elementNode = initializer.getChild(i); Object arrayEntry = elementNode.getValue(state); - newObjectArray[i] = typeConverter.convertValue(arrayEntry, TypeDescriptor.forObject(arrayEntry), - toTypeDescriptor); + newObjectArray[i] = typeConverter.convertValue(arrayEntry, toTypeDescriptor); } } diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Projection.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Projection.java index e9c47e5e0df..92f0b49948e 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Projection.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Projection.java @@ -23,7 +23,6 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import org.springframework.core.convert.TypeDescriptor; import org.springframework.expression.EvaluationException; import org.springframework.expression.TypedValue; import org.springframework.expression.spel.ExpressionState; @@ -85,7 +84,7 @@ public class Projection extends SpelNodeImpl { Class arrayElementType = null; for (Object element : data) { try { - state.pushActiveContextObject(new TypedValue(element ,TypeDescriptor.valueOf(op.getTypeDescriptor().getType()))); + state.pushActiveContextObject(new TypedValue(element)); state.enterScope("index", idx); Object value = children[0].getValueInternal(state).getValue(); if (value != null && operandIsArray) { @@ -105,9 +104,9 @@ public class Projection extends SpelNodeImpl { } Object resultArray = Array.newInstance(arrayElementType, result.size()); System.arraycopy(result.toArray(), 0, resultArray, 0, result.size()); - return new TypedValue(resultArray, op.getTypeDescriptor()); + return new TypedValue(resultArray); } - return new TypedValue(result, op.getTypeDescriptor()); + return new TypedValue(result); } else { if (operand==null) { diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Selection.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Selection.java index 60639315a6c..5b29402ae66 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Selection.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Selection.java @@ -24,7 +24,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.springframework.core.convert.TypeDescriptor; import org.springframework.expression.EvaluationException; import org.springframework.expression.TypedValue; import org.springframework.expression.spel.ExpressionState; @@ -101,9 +100,9 @@ public class Selection extends SpelNodeImpl { Map resultMap = new HashMap(); Object lastValue = result.get(lastKey); resultMap.put(lastKey,lastValue); - return new TypedValue(resultMap,TypeDescriptor.valueOf(Map.class)); + return new TypedValue(resultMap); } - return new TypedValue(result,op.getTypeDescriptor()); + return new TypedValue(result); } else if ((operand instanceof Collection) || ObjectUtils.isArray(operand)) { List data = new ArrayList(); Collection c = (operand instanceof Collection) ? @@ -113,13 +112,13 @@ public class Selection extends SpelNodeImpl { int idx = 0; for (Object element : data) { try { - state.pushActiveContextObject(new TypedValue(element, op.getTypeDescriptor().getElementTypeDescriptor())); + state.pushActiveContextObject(new TypedValue(element)); state.enterScope("index", idx); Object o = selectionCriteria.getValueInternal(state).getValue(); if (o instanceof Boolean) { if (((Boolean) o).booleanValue() == true) { if (variant == FIRST) { - return new TypedValue(element, op.getTypeDescriptor().getElementTypeDescriptor()); + return new TypedValue(element); } result.add(element); } @@ -137,16 +136,16 @@ public class Selection extends SpelNodeImpl { return TypedValue.NULL; } if (variant == LAST) { - return new TypedValue(result.get(result.size() - 1), op.getTypeDescriptor().getElementTypeDescriptor()); + return new TypedValue(result.get(result.size() - 1)); } if (operand instanceof Collection) { - return new TypedValue(result,op.getTypeDescriptor()); + return new TypedValue(result); } else { Class elementType = ClassUtils.resolvePrimitiveIfNecessary(op.getTypeDescriptor().getElementType()); Object resultArray = Array.newInstance(elementType, result.size()); System.arraycopy(result.toArray(), 0, resultArray, 0, result.size()); - return new TypedValue(resultArray, op.getTypeDescriptor()); + return new TypedValue(resultArray); } } else { if (operand==null) { diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java index f37b0d1211b..5966a47ee84 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java @@ -241,8 +241,7 @@ public class ReflectionHelper { else { targetType = new TypeDescriptor(MethodParameter.forMethodOrConstructor(methodOrCtor, argPosition)); } - arguments[argPosition] = converter.convertValue( - arguments[argPosition], TypeDescriptor.forObject(arguments[argPosition]), targetType); + arguments[argPosition] = converter.convertValue(arguments[argPosition], targetType); } } @@ -279,7 +278,7 @@ public class ReflectionHelper { if (converter == null) { throw new SpelEvaluationException(SpelMessage.TYPE_CONVERSION_ERROR, argument.getClass().getName(), targetType); } - arguments[argPosition] = converter.convertValue(argument, TypeDescriptor.forObject(argument), targetType); + arguments[argPosition] = converter.convertValue(argument, targetType); } } catch (EvaluationException ex) { diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java index e30e2c37db2..dfb5314cc1f 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java @@ -218,7 +218,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { TypeDescriptor typeDescriptor = getTypeDescriptor(context, target, name); if (typeDescriptor != null) { try { - possiblyConvertedNewValue = context.getTypeConverter().convertValue(newValue, TypeDescriptor.forObject(newValue), typeDescriptor); + possiblyConvertedNewValue = context.getTypeConverter().convertValue(newValue, typeDescriptor); } catch (EvaluationException evaluationException) { throw new AccessException("Type conversion failure",evaluationException); diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeConverter.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeConverter.java index 67a61541f63..e6223d86365 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeConverter.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeConverter.java @@ -75,4 +75,8 @@ public class StandardTypeConverter implements TypeConverter { } } + public Object convertValue(Object value, TypeDescriptor targetType) { + return convertValue(value, TypeDescriptor.forObject(value), targetType); + } + } diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/ExpressionTestsUsingCoreConversionService.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/ExpressionTestsUsingCoreConversionService.java index e8b7c5b925e..6d148d4322d 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/ExpressionTestsUsingCoreConversionService.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/ExpressionTestsUsingCoreConversionService.java @@ -121,8 +121,7 @@ public class ExpressionTestsUsingCoreConversionService extends ExpressionTestCas 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()); + assertEquals("[1, 2, 3, 4]", evaluationContext.getTypeConverter().convertValue("1,2,3,4", collectionType).toString()); evaluationContext.setVariable("target", new TestTarget()); @@ -153,6 +152,7 @@ public class ExpressionTestsUsingCoreConversionService extends ExpressionTestCas public Object convertValue(Object value, TypeDescriptor sourceType, TypeDescriptor targetType) throws EvaluationException { return this.service.convert(value, sourceType, targetType); } + } } diff --git a/org.springframework.integration-tests/src/test/java/org/springframework/expression/spel/support/BeanFactoryTypeConverter.java b/org.springframework.integration-tests/src/test/java/org/springframework/expression/spel/support/BeanFactoryTypeConverter.java index 912db04b603..ae91a4055f1 100644 --- a/org.springframework.integration-tests/src/test/java/org/springframework/expression/spel/support/BeanFactoryTypeConverter.java +++ b/org.springframework.integration-tests/src/test/java/org/springframework/expression/spel/support/BeanFactoryTypeConverter.java @@ -87,5 +87,10 @@ class BeanFactoryTypeConverter implements TypeConverter, BeanFactoryAware { } return delegate.convertIfNecessary(value, targetType.getType()); } + + public Object convertValue(Object value, TypeDescriptor targetType) { + return convertValue(value, TypeDescriptor.forObject(value), targetType); + } + } \ No newline at end of file