提交 187d025c 编写于 作者: K Keith Donald

map converters

上级 1ee4ac1b
...@@ -192,6 +192,7 @@ public class GenericConversionService implements ConversionService, ConverterReg ...@@ -192,6 +192,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
addGenericConverter(Collection.class, String.class, new CollectionToStringGenericConverter(this)); addGenericConverter(Collection.class, String.class, new CollectionToStringGenericConverter(this));
addGenericConverter(Collection.class, Object.class, new CollectionToObjectGenericConverter(this)); addGenericConverter(Collection.class, Object.class, new CollectionToObjectGenericConverter(this));
addGenericConverter(Map.class, Map.class, new MapToMapGenericConverter(this)); addGenericConverter(Map.class, Map.class, new MapToMapGenericConverter(this));
addGenericConverter(Map.class, String[].class, new MapToStringArrayGenericConverter(this));
addGenericConverter(String.class, Object[].class, new StringToArrayGenericConverter(this)); addGenericConverter(String.class, Object[].class, new StringToArrayGenericConverter(this));
addGenericConverter(String.class, Collection.class, new StringToCollectionGenericConverter(this)); addGenericConverter(String.class, Collection.class, new StringToCollectionGenericConverter(this));
addGenericConverter(String.class, Map.class, new StringToMapGenericConverter(this)); addGenericConverter(String.class, Map.class, new StringToMapGenericConverter(this));
......
/*
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.core.convert.support;
import java.lang.reflect.Array;
import java.util.Map;
import org.springframework.core.convert.TypeDescriptor;
final class MapToStringArrayGenericConverter implements GenericConverter {
private final GenericConversionService conversionService;
public MapToStringArrayGenericConverter(GenericConversionService conversionService) {
this.conversionService = conversionService;
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
Map sourceMap = (Map) source;
TypeDescriptor sourceKeyType = sourceType.getMapKeyTypeDescriptor();
TypeDescriptor sourceValueType = sourceType.getMapValueTypeDescriptor();
TypeDescriptor targetElementType = targetType.getElementTypeDescriptor();
boolean keysCompatible = false;
if (sourceKeyType.isAssignableTo(targetElementType)) {
keysCompatible = true;
}
boolean valuesCompatible = false;
if (sourceValueType.isAssignableTo(targetElementType)) {
valuesCompatible = true;
}
Object array = Array.newInstance(targetElementType.getType(), sourceMap.size());
MapEntryConverter converter = new MapEntryConverter(sourceKeyType, sourceValueType, targetElementType, targetElementType, keysCompatible, valuesCompatible, conversionService);
int i = 0;
for (Object entry : sourceMap.entrySet()) {
Map.Entry mapEntry = (Map.Entry) entry;
Object key = mapEntry.getKey();
Object value = mapEntry.getValue();
String property = converter.convertKey(key) + "=" + converter.convertValue(value);
Array.set(array, i, property);
i++;
}
return array;
}
}
...@@ -27,6 +27,7 @@ import java.util.ArrayList; ...@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
...@@ -307,6 +308,29 @@ public class GenericConversionServiceTests { ...@@ -307,6 +308,29 @@ public class GenericConversionServiceTests {
assertEquals(FooEnum.BAZ, map.get(2)); assertEquals(FooEnum.BAZ, map.get(2));
} }
@Test
public void convertMapToStringArray() throws Exception {
Map<String, String> foo = new LinkedHashMap<String, String>();
foo.put("1", "BAR");
foo.put("2", "BAZ");
conversionService.addConverterFactory(new StringToNumberConverterFactory());
String[] result = conversionService.convert(foo, String[].class);
assertEquals("1=BAR", result[0]);
assertEquals("2=BAZ", result[1]);
}
@Test
public void convertMapToStringArrayWithElementConversion() throws Exception {
Map<Integer, FooEnum> foo = new LinkedHashMap<Integer, FooEnum>();
foo.put(1, FooEnum.BAR);
foo.put(2, FooEnum.BAZ);
conversionService.addConverter(new ObjectToStringConverter());
String[] result = (String[]) conversionService.convert(foo, new TypeDescriptor(getClass()
.getField("genericMap")), TypeDescriptor.valueOf(String[].class));
assertEquals("1=BAR", result[0]);
assertEquals("2=BAZ", result[1]);
}
@Test @Test
public void convertStringToArray() { public void convertStringToArray() {
conversionService.addConverterFactory(new StringToNumberConverterFactory()); conversionService.addConverterFactory(new StringToNumberConverterFactory());
...@@ -403,8 +427,8 @@ public class GenericConversionServiceTests { ...@@ -403,8 +427,8 @@ public class GenericConversionServiceTests {
@Test @Test
public void convertStringArrayToMapWithElementConversion() throws Exception { public void convertStringArrayToMapWithElementConversion() throws Exception {
conversionService.addConverterFactory(new StringToNumberConverterFactory()); conversionService.addConverterFactory(new StringToNumberConverterFactory());
conversionService.addConverterFactory(new StringToEnumConverterFactory()); conversionService.addConverterFactory(new StringToEnumConverterFactory());
Map result = (Map) conversionService.convert(new String[] { "1=BAR", "2=BAZ" }, TypeDescriptor Map result = (Map) conversionService.convert(new String[] { "1=BAR", "2=BAZ" }, TypeDescriptor
.valueOf(String[].class), new TypeDescriptor(getClass().getField("genericMap"))); .valueOf(String[].class), new TypeDescriptor(getClass().getField("genericMap")));
assertEquals(FooEnum.BAR, result.get(1)); assertEquals(FooEnum.BAR, result.get(1));
...@@ -421,10 +445,10 @@ public class GenericConversionServiceTests { ...@@ -421,10 +445,10 @@ public class GenericConversionServiceTests {
@Test @Test
public void convertStringToMapWithElementConversion() throws Exception { public void convertStringToMapWithElementConversion() throws Exception {
conversionService.addConverterFactory(new StringToNumberConverterFactory()); conversionService.addConverterFactory(new StringToNumberConverterFactory());
conversionService.addConverterFactory(new StringToEnumConverterFactory()); conversionService.addConverterFactory(new StringToEnumConverterFactory());
Map result = (Map) conversionService.convert("1=BAR 2=BAZ", TypeDescriptor Map result = (Map) conversionService.convert("1=BAR 2=BAZ", TypeDescriptor.valueOf(String.class),
.valueOf(String.class), new TypeDescriptor(getClass().getField("genericMap"))); new TypeDescriptor(getClass().getField("genericMap")));
assertEquals(FooEnum.BAR, result.get(1)); assertEquals(FooEnum.BAR, result.get(1));
assertEquals(FooEnum.BAZ, result.get(2)); assertEquals(FooEnum.BAZ, result.get(2));
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册