From 0612bc7bc5a82ff7414d8c8bcf665599d23a5225 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 8 May 2015 14:48:46 +0900 Subject: [PATCH] Harmonize default converters Provide Converter implementations for Charset, Currency and TimeZone as related PropertyEditors are available for those. Issue: SPR-13020 --- .../support/DefaultConversionService.java | 13 ++++++- .../support/StringToCharsetConverter.java | 36 +++++++++++++++++ .../support/StringToCurrencyConverter.java | 36 +++++++++++++++++ .../support/StringToTimeZoneConverter.java | 39 +++++++++++++++++++ .../DefaultConversionServiceTests.java | 28 +++++++++++++ 5 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 spring-core/src/main/java/org/springframework/core/convert/support/StringToCharsetConverter.java create mode 100644 spring-core/src/main/java/org/springframework/core/convert/support/StringToCurrencyConverter.java create mode 100644 spring-core/src/main/java/org/springframework/core/convert/support/StringToTimeZoneConverter.java diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java b/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java index 6946e14b69..943c8c22ad 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/DefaultConversionService.java @@ -16,6 +16,8 @@ package org.springframework.core.convert.support; +import java.nio.charset.Charset; +import java.util.Currency; import java.util.Locale; import java.util.UUID; @@ -75,7 +77,7 @@ public class DefaultConversionService extends GenericConversionService { converterRegistry.addConverter(new ByteBufferConverter((ConversionService) converterRegistry)); if (jsr310Available) { - Jsr310ConverterRegistrar.registerZoneIdConverters(converterRegistry); + Jsr310ConverterRegistrar.registerJsr310Converters(converterRegistry); } converterRegistry.addConverter(new ObjectToObjectConverter()); @@ -110,6 +112,12 @@ public class DefaultConversionService extends GenericConversionService { converterRegistry.addConverter(new StringToLocaleConverter()); converterRegistry.addConverter(Locale.class, String.class, new ObjectToStringConverter()); + converterRegistry.addConverter(new StringToCharsetConverter()); + converterRegistry.addConverter(Charset.class, String.class, new ObjectToStringConverter()); + + converterRegistry.addConverter(new StringToCurrencyConverter()); + converterRegistry.addConverter(Currency.class, String.class, new ObjectToStringConverter()); + converterRegistry.addConverter(new StringToPropertiesConverter()); converterRegistry.addConverter(new PropertiesToStringConverter()); @@ -150,7 +158,8 @@ public class DefaultConversionService extends GenericConversionService { */ private static final class Jsr310ConverterRegistrar { - public static void registerZoneIdConverters(ConverterRegistry converterRegistry) { + public static void registerJsr310Converters(ConverterRegistry converterRegistry) { + converterRegistry.addConverter(new StringToTimeZoneConverter()); converterRegistry.addConverter(new ZoneIdToTimeZoneConverter()); converterRegistry.addConverter(new ZonedDateTimeToCalendarConverter()); } diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/StringToCharsetConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/StringToCharsetConverter.java new file mode 100644 index 0000000000..af8bf05ca1 --- /dev/null +++ b/spring-core/src/main/java/org/springframework/core/convert/support/StringToCharsetConverter.java @@ -0,0 +1,36 @@ +/* + * Copyright 2002-2015 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.nio.charset.Charset; + +import org.springframework.core.convert.converter.Converter; + +/** + * Convert a String to a {@link Charset}. + * + * @author Stephane Nicoll + * @since 4.2 + */ +public class StringToCharsetConverter implements Converter { + + @Override + public Charset convert(String source) { + return Charset.forName(source); + } + +} diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/StringToCurrencyConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/StringToCurrencyConverter.java new file mode 100644 index 0000000000..fabb52fd7b --- /dev/null +++ b/spring-core/src/main/java/org/springframework/core/convert/support/StringToCurrencyConverter.java @@ -0,0 +1,36 @@ +/* + * Copyright 2002-2015 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.util.Currency; + +import org.springframework.core.convert.converter.Converter; + +/** + * Convert a String to a {@link Currency}. + * + * @author Stephane Nicoll + * @since 4.2 + */ +class StringToCurrencyConverter implements Converter { + + @Override + public Currency convert(String source) { + return Currency.getInstance(source); + } + +} diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/StringToTimeZoneConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/StringToTimeZoneConverter.java new file mode 100644 index 0000000000..cf8565d33c --- /dev/null +++ b/spring-core/src/main/java/org/springframework/core/convert/support/StringToTimeZoneConverter.java @@ -0,0 +1,39 @@ +/* + * Copyright 2002-2015 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.util.TimeZone; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.UsesJava8; +import org.springframework.util.StringUtils; + +/** + * Convert a String to a {@link TimeZone}. + * + * @author Stephane Nicoll + * @since 4.2 + */ +@UsesJava8 +class StringToTimeZoneConverter implements Converter { + + @Override + public TimeZone convert(String source) { + return StringUtils.parseTimeZoneString(source); + } + +} diff --git a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java index a6367976c1..f26f9eccd1 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java @@ -20,12 +20,14 @@ import java.awt.Color; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.BigInteger; +import java.nio.charset.Charset; import java.time.ZoneId; import java.util.AbstractList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Currency; import java.util.EnumSet; import java.util.HashMap; import java.util.LinkedHashMap; @@ -37,6 +39,7 @@ import java.util.Map; import java.util.Optional; import java.util.Properties; import java.util.Set; +import java.util.TimeZone; import java.util.UUID; import java.util.stream.Stream; @@ -277,6 +280,26 @@ public class DefaultConversionServiceTests { assertEquals(Locale.ENGLISH, conversionService.convert("en", Locale.class)); } + @Test + public void testStringToCharset() { + assertEquals(Charset.forName("UTF-8"), conversionService.convert("UTF-8", Charset.class)); + } + + @Test + public void testCharsetToString() { + assertEquals("UTF-8", conversionService.convert(Charset.forName("UTF-8"), String.class)); + } + + @Test + public void testStringToCurrency() { + assertEquals(Currency.getInstance("EUR"), conversionService.convert("EUR", Currency.class)); + } + + @Test + public void testCurrencyToString() { + assertEquals("USD", conversionService.convert(Currency.getInstance("USD"), String.class)); + } + @Test public void testStringToString() { String str = "test"; @@ -801,6 +824,11 @@ public class DefaultConversionServiceTests { assertEquals("toString() invocations", 0, SSN.toStringCount); } + @Test + public void convertStringToTimezone() { + assertEquals("GMT+02:00", conversionService.convert("GMT+2", TimeZone.class).getID()); + } + @Test public void convertObjectToStringWithJavaTimeOfMethodPresent() { assertTrue(conversionService.convert(ZoneId.of("GMT+1"), String.class).startsWith("GMT+"));