diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java b/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java index f759498dd75..f6fb83bce86 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java @@ -192,6 +192,7 @@ public class GenericConversionService implements ConversionService, ConverterReg addGenericConverter(Collection.class, String.class, new CollectionToStringGenericConverter(this)); addGenericConverter(Collection.class, Object.class, new CollectionToObjectGenericConverter(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, Collection.class, new StringToCollectionGenericConverter(this)); addGenericConverter(String.class, Map.class, new StringToMapGenericConverter(this)); diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/support/MapToStringArrayGenericConverter.java b/org.springframework.core/src/main/java/org/springframework/core/convert/support/MapToStringArrayGenericConverter.java new file mode 100644 index 00000000000..4f710981717 --- /dev/null +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/support/MapToStringArrayGenericConverter.java @@ -0,0 +1,58 @@ +/* + * 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; + } + +} diff --git a/org.springframework.core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java b/org.springframework.core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java index d9f55108c27..9fd56fe004b 100644 --- a/org.springframework.core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java +++ b/org.springframework.core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -307,6 +308,29 @@ public class GenericConversionServiceTests { assertEquals(FooEnum.BAZ, map.get(2)); } + @Test + public void convertMapToStringArray() throws Exception { + Map foo = new LinkedHashMap(); + 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 foo = new LinkedHashMap(); + 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 public void convertStringToArray() { conversionService.addConverterFactory(new StringToNumberConverterFactory()); @@ -403,8 +427,8 @@ public class GenericConversionServiceTests { @Test public void convertStringArrayToMapWithElementConversion() throws Exception { - conversionService.addConverterFactory(new StringToNumberConverterFactory()); - conversionService.addConverterFactory(new StringToEnumConverterFactory()); + conversionService.addConverterFactory(new StringToNumberConverterFactory()); + conversionService.addConverterFactory(new StringToEnumConverterFactory()); Map result = (Map) conversionService.convert(new String[] { "1=BAR", "2=BAZ" }, TypeDescriptor .valueOf(String[].class), new TypeDescriptor(getClass().getField("genericMap"))); assertEquals(FooEnum.BAR, result.get(1)); @@ -421,10 +445,10 @@ public class GenericConversionServiceTests { @Test public void convertStringToMapWithElementConversion() throws Exception { - conversionService.addConverterFactory(new StringToNumberConverterFactory()); - conversionService.addConverterFactory(new StringToEnumConverterFactory()); - Map result = (Map) conversionService.convert("1=BAR 2=BAZ", TypeDescriptor - .valueOf(String.class), new TypeDescriptor(getClass().getField("genericMap"))); + conversionService.addConverterFactory(new StringToNumberConverterFactory()); + conversionService.addConverterFactory(new StringToEnumConverterFactory()); + Map result = (Map) conversionService.convert("1=BAR 2=BAZ", TypeDescriptor.valueOf(String.class), + new TypeDescriptor(getClass().getField("genericMap"))); assertEquals(FooEnum.BAR, result.get(1)); assertEquals(FooEnum.BAZ, result.get(2)); }