diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ResourceBundleEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ResourceBundleEditor.java index 7a827c9481..7eabc102b7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ResourceBundleEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ResourceBundleEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * 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. @@ -24,14 +24,13 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** - * {@link java.beans.PropertyEditor} implementation for + * {@link java.beans.PropertyEditor} implementation for standard JDK * {@link java.util.ResourceBundle ResourceBundles}. * - *

Only supports conversion from a String, but not - * to a String. + *

Only supports conversion from a String, but not to a String. * - * Find below some examples of using this class in a - * (properly configured) Spring container using XML-based metadata: + * Find below some examples of using this class in a (properly configured) + * Spring container using XML-based metadata: * *

 <bean id="errorDialog" class="...">
  *    <!--
@@ -62,19 +61,20 @@ import org.springframework.util.StringUtils;
  *    </property>
  * </bean>
* - *

Please note that this {@link java.beans.PropertyEditor} is - * not registered by default with any of the Spring infrastructure. + *

Please note that this {@link java.beans.PropertyEditor} is not + * registered by default with any of the Spring infrastructure. * *

Thanks to David Leal Valmana for the suggestion and initial prototype. * * @author Rick Evans + * @author Juergen Hoeller * @since 2.0 */ public class ResourceBundleEditor extends PropertyEditorSupport { /** - * The separator used to distinguish between the base name and the - * locale (if any) when {@link #setAsText(String) converting from a String}. + * The separator used to distinguish between the base name and the locale + * (if any) when {@link #setAsText(String) converting from a String}. */ public static final String BASE_NAME_SEPARATOR = "_"; @@ -82,25 +82,23 @@ public class ResourceBundleEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { Assert.hasText(text, "'text' must not be empty"); - ResourceBundle bundle; - String rawBaseName = text.trim(); - int indexOfBaseNameSeparator = rawBaseName.indexOf(BASE_NAME_SEPARATOR); - if (indexOfBaseNameSeparator == -1) { - bundle = ResourceBundle.getBundle(rawBaseName); + String name = text.trim(); + + int separator = name.indexOf(BASE_NAME_SEPARATOR); + if (separator == -1) { + setValue(ResourceBundle.getBundle(name)); } else { - // it potentially has locale information - String baseName = rawBaseName.substring(0, indexOfBaseNameSeparator); + // The name potentially contains locale information + String baseName = name.substring(0, separator); if (!StringUtils.hasText(baseName)) { - throw new IllegalArgumentException("Bad ResourceBundle name : received '" + text + "' as argument to 'setAsText(String value)'."); + throw new IllegalArgumentException("Invalid ResourceBundle name: '" + text + "'"); } - String localeString = rawBaseName.substring(indexOfBaseNameSeparator + 1); + String localeString = name.substring(separator + 1); Locale locale = StringUtils.parseLocaleString(localeString); - bundle = (StringUtils.hasText(localeString)) - ? ResourceBundle.getBundle(baseName, locale) - : ResourceBundle.getBundle(baseName); + setValue((StringUtils.hasText(localeString)) ? ResourceBundle.getBundle(baseName, locale) : + ResourceBundle.getBundle(baseName)); } - setValue(bundle); } } diff --git a/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ResourceBundleEditorTests.java b/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ResourceBundleEditorTests.java index c6659d113e..613959dc3c 100644 --- a/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ResourceBundleEditorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ResourceBundleEditorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 the original author or authors. + * 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. @@ -28,9 +28,10 @@ import static org.junit.Assert.*; * @author Rick Evans * @author Chris Beams */ -public final class ResourceBundleEditorTests { +public class ResourceBundleEditorTests { private static final String BASE_NAME = ResourceBundleEditorTests.class.getName(); + private static final String MESSAGE_KEY = "punk"; @@ -40,7 +41,8 @@ public final class ResourceBundleEditorTests { editor.setAsText(BASE_NAME); Object value = editor.getValue(); assertNotNull("Returned ResourceBundle was null (must not be for valid setAsText(..) call).", value); - assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", value instanceof ResourceBundle); + assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", + value instanceof ResourceBundle); ResourceBundle bundle = (ResourceBundle) value; String string = bundle.getString(MESSAGE_KEY); assertEquals(MESSAGE_KEY, string); @@ -52,7 +54,8 @@ public final class ResourceBundleEditorTests { editor.setAsText(BASE_NAME + "_"); Object value = editor.getValue(); assertNotNull("Returned ResourceBundle was null (must not be for valid setAsText(..) call).", value); - assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", value instanceof ResourceBundle); + assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", + value instanceof ResourceBundle); ResourceBundle bundle = (ResourceBundle) value; String string = bundle.getString(MESSAGE_KEY); assertEquals(MESSAGE_KEY, string); @@ -64,7 +67,8 @@ public final class ResourceBundleEditorTests { editor.setAsText(BASE_NAME + "Lang" + "_en"); Object value = editor.getValue(); assertNotNull("Returned ResourceBundle was null (must not be for valid setAsText(..) call).", value); - assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", value instanceof ResourceBundle); + assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", + value instanceof ResourceBundle); ResourceBundle bundle = (ResourceBundle) value; String string = bundle.getString(MESSAGE_KEY); assertEquals("yob", string); @@ -76,7 +80,8 @@ public final class ResourceBundleEditorTests { editor.setAsText(BASE_NAME + "LangCountry" + "_en_GB"); Object value = editor.getValue(); assertNotNull("Returned ResourceBundle was null (must not be for valid setAsText(..) call).", value); - assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", value instanceof ResourceBundle); + assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", + value instanceof ResourceBundle); ResourceBundle bundle = (ResourceBundle) value; String string = bundle.getString(MESSAGE_KEY); assertEquals("chav", string); @@ -88,31 +93,32 @@ public final class ResourceBundleEditorTests { editor.setAsText(BASE_NAME + "LangCountryDialect" + "_en_GB_GLASGOW"); Object value = editor.getValue(); assertNotNull("Returned ResourceBundle was null (must not be for valid setAsText(..) call).", value); - assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", value instanceof ResourceBundle); + assertTrue("Returned object was not a ResourceBundle (must be for valid setAsText(..) call).", + value instanceof ResourceBundle); ResourceBundle bundle = (ResourceBundle) value; String string = bundle.getString(MESSAGE_KEY); assertEquals("ned", string); } - @Test(expected=IllegalArgumentException.class) + @Test(expected = IllegalArgumentException.class) public void testSetAsTextWithNull() throws Exception { ResourceBundleEditor editor = new ResourceBundleEditor(); editor.setAsText(null); } - @Test(expected=IllegalArgumentException.class) + @Test(expected = IllegalArgumentException.class) public void testSetAsTextWithEmptyString() throws Exception { ResourceBundleEditor editor = new ResourceBundleEditor(); editor.setAsText(""); } - @Test(expected=IllegalArgumentException.class) + @Test(expected = IllegalArgumentException.class) public void testSetAsTextWithWhiteSpaceString() throws Exception { ResourceBundleEditor editor = new ResourceBundleEditor(); editor.setAsText(" "); } - @Test(expected=IllegalArgumentException.class) + @Test(expected = IllegalArgumentException.class) public void testSetAsTextWithJustSeparatorString() throws Exception { ResourceBundleEditor editor = new ResourceBundleEditor(); editor.setAsText("_"); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java index 4bf43e2845..547a91fc35 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * 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. @@ -111,6 +111,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte /** * Set a fixed TimeZone that this resolver will return if no cookie found. + * @since 4.0 */ public void setDefaultTimeZone(TimeZone defaultTimeZone) { this.defaultTimeZone = defaultTimeZone; @@ -119,6 +120,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte /** * Return the fixed TimeZone that this resolver will return if no cookie found, * if any. + * @since 4.0 */ protected TimeZone getDefaultTimeZone() { return this.defaultTimeZone; @@ -171,7 +173,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte } } request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, - (locale != null ? locale: determineDefaultLocale(request))); + (locale != null ? locale : determineDefaultLocale(request))); request.setAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, (timeZone != null ? timeZone : determineDefaultTimeZone(request))); } @@ -197,7 +199,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte removeCookie(response); } request.setAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME, - (locale != null ? locale: determineDefaultLocale(request))); + (locale != null ? locale : determineDefaultLocale(request))); request.setAttribute(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, (timeZone != null ? timeZone : determineDefaultTimeZone(request))); }