Favor convertValue(Object, TypeDescriptor) where possible and TypedValue(Object); check with Andy on Selection and Projection TypedValue usage
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -75,4 +75,8 @@ public class StandardTypeConverter implements TypeConverter {
|
||||
}
|
||||
}
|
||||
|
||||
public Object convertValue(Object value, TypeDescriptor targetType) {
|
||||
return convertValue(value, TypeDescriptor.forObject(value), targetType);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user