Browse Source

Favor convertValue(Object, TypeDescriptor) where possible and TypedValue(Object); check with Andy on Selection and Projection TypedValue usage

pull/7/head
Keith Donald 15 years ago
parent
commit
71e60f4551
  1. 22
      org.springframework.core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java
  2. 6
      org.springframework.core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java
  3. 4
      org.springframework.expression/src/main/java/org/springframework/expression/TypeConverter.java
  4. 2
      org.springframework.expression/src/main/java/org/springframework/expression/spel/ExpressionState.java
  5. 3
      org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java
  6. 7
      org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Projection.java
  7. 15
      org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Selection.java
  8. 5
      org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java
  9. 2
      org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java
  10. 4
      org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeConverter.java
  11. 4
      org.springframework.expression/src/test/java/org/springframework/expression/spel/ExpressionTestsUsingCoreConversionService.java
  12. 5
      org.springframework.integration-tests/src/test/java/org/springframework/expression/spel/support/BeanFactoryTypeConverter.java

22
org.springframework.core/src/main/java/org/springframework/core/convert/support/ConversionUtils.java

@ -16,8 +16,6 @@ @@ -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 { @@ -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) };
}
}

6
org.springframework.core/src/test/java/org/springframework/core/convert/support/DefaultConversionTests.java

@ -457,8 +457,7 @@ public class DefaultConversionTests { @@ -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 { @@ -494,8 +493,7 @@ public class DefaultConversionTests {
@Test
public void convertObjectToCollectionWithElementConversion() throws Exception {
List<Integer> result = (List<Integer>) conversionService.convert(3L, TypeDescriptor.valueOf(Long.class),
new TypeDescriptor(getClass().getField("genericList")));
List<Integer> result = (List<Integer>) conversionService.convert(3L, new TypeDescriptor(getClass().getField("genericList")));
assertEquals(1, result.size());
assertEquals(new Integer(3), result.get(0));
}

4
org.springframework.expression/src/main/java/org/springframework/expression/TypeConverter.java

@ -49,5 +49,9 @@ public interface TypeConverter { @@ -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);
}

2
org.springframework.expression/src/main/java/org/springframework/expression/spel/ExpressionState.java

@ -141,7 +141,7 @@ public class ExpressionState { @@ -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);
}
/*

3
org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java

@ -322,8 +322,7 @@ public class ConstructorReference extends SpelNodeImpl { @@ -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);
}
}

7
org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Projection.java

@ -23,7 +23,6 @@ import java.util.Collection; @@ -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 { @@ -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 { @@ -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) {

15
org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Selection.java

@ -24,7 +24,6 @@ import java.util.HashMap; @@ -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 { @@ -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<Object> data = new ArrayList<Object>();
Collection<?> c = (operand instanceof Collection) ?
@ -113,13 +112,13 @@ public class Selection extends SpelNodeImpl { @@ -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 { @@ -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) {

5
org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java

@ -241,8 +241,7 @@ public class ReflectionHelper { @@ -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 { @@ -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) {

2
org.springframework.expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java

@ -218,7 +218,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { @@ -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);

4
org.springframework.expression/src/main/java/org/springframework/expression/spel/support/StandardTypeConverter.java

@ -75,4 +75,8 @@ public class StandardTypeConverter implements TypeConverter { @@ -75,4 +75,8 @@ public class StandardTypeConverter implements TypeConverter {
}
}
public Object convertValue(Object value, TypeDescriptor targetType) {
return convertValue(value, TypeDescriptor.forObject(value), targetType);
}
}

4
org.springframework.expression/src/test/java/org/springframework/expression/spel/ExpressionTestsUsingCoreConversionService.java

@ -121,8 +121,7 @@ public class ExpressionTestsUsingCoreConversionService extends ExpressionTestCas @@ -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 @@ -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);
}
}
}

5
org.springframework.integration-tests/src/test/java/org/springframework/expression/spel/support/BeanFactoryTypeConverter.java

@ -87,5 +87,10 @@ class BeanFactoryTypeConverter implements TypeConverter, BeanFactoryAware { @@ -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);
}
}
Loading…
Cancel
Save