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

This commit is contained in:
Keith Donald
2011-01-07 06:32:21 +00:00
parent 0fb631348e
commit 71e60f4551
12 changed files with 32 additions and 47 deletions

View File

@@ -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);
}

View File

@@ -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);
}
/*

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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<Object> data = new ArrayList<Object>();
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) {

View File

@@ -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) {

View File

@@ -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);

View File

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

View File

@@ -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);
}
}
}