ReloadableResourceBundleMessageSource uses ConcurrentHashMaps and ReentrantLocks instead of synchronization
Issue: SPR-10500
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
* Copyright 2002-2014 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.
|
||||
@@ -21,62 +21,68 @@ import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.beans.MutablePropertyValues;
|
||||
import org.springframework.context.MessageSourceResolvable;
|
||||
import org.springframework.context.NoSuchMessageException;
|
||||
import org.springframework.context.i18n.LocaleContextHolder;
|
||||
import org.springframework.core.JdkVersion;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
* @since 03.02.2004
|
||||
*/
|
||||
public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
public class ResourceBundleMessageSourceTests {
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithDefaultMessageSource() {
|
||||
doTestMessageAccess(false, true, false, false, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithDefaultMessageSourceAndMessageFormat() {
|
||||
doTestMessageAccess(false, true, false, false, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithDefaultMessageSourceAndFallbackToGerman() {
|
||||
doTestMessageAccess(false, true, true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithDefaultMessageSourceAndFallbackTurnedOff() {
|
||||
if (JdkVersion.getMajorJavaVersion() < JdkVersion.JAVA_16) {
|
||||
return;
|
||||
}
|
||||
doTestMessageAccess(false, false, false, false, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithDefaultMessageSourceAndFallbackTurnedOffAndFallbackToGerman() {
|
||||
if (JdkVersion.getMajorJavaVersion() < JdkVersion.JAVA_16) {
|
||||
return;
|
||||
}
|
||||
doTestMessageAccess(false, false, true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithReloadableMessageSource() {
|
||||
doTestMessageAccess(true, true, false, false, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithReloadableMessageSourceAndMessageFormat() {
|
||||
doTestMessageAccess(true, true, false, false, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithReloadableMessageSourceAndFallbackToGerman() {
|
||||
doTestMessageAccess(true, true, true, true, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithReloadableMessageSourceAndFallbackTurnedOff() {
|
||||
doTestMessageAccess(true, false, false, false, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageAccessWithReloadableMessageSourceAndFallbackTurnedOffAndFallbackToGerman() {
|
||||
doTestMessageAccess(true, false, true, true, false);
|
||||
}
|
||||
@@ -94,7 +100,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
|
||||
MutablePropertyValues pvs = new MutablePropertyValues();
|
||||
String basepath = "org/springframework/context/support/";
|
||||
String[] basenames = null;
|
||||
String[] basenames;
|
||||
if (reloadable) {
|
||||
basenames = new String[] {
|
||||
"classpath:" + basepath + "messages",
|
||||
@@ -129,7 +135,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nochricht2", ac.getMessage("code2", null, new Locale("DE", "at")));
|
||||
assertEquals("noochricht2", ac.getMessage("code2", null, new Locale("DE", "at", "oo")));
|
||||
|
||||
if (reloadable && JdkVersion.getMajorJavaVersion() >= JdkVersion.JAVA_15) {
|
||||
if (reloadable) {
|
||||
assertEquals("nachricht2xml", ac.getMessage("code2", null, Locale.GERMANY));
|
||||
}
|
||||
|
||||
@@ -196,6 +202,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultApplicationContextMessageSource() {
|
||||
GenericApplicationContext ac = new GenericApplicationContext();
|
||||
ac.refresh();
|
||||
@@ -203,6 +210,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("default value", ac.getMessage("code1", new Object[] {"value"}, "default {0}", Locale.ENGLISH));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResourceBundleMessageSourceStandalone() {
|
||||
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -210,6 +218,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResourceBundleMessageSourceWithWhitespaceInBasename() {
|
||||
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
|
||||
ms.setBasename(" org/springframework/context/support/messages ");
|
||||
@@ -217,6 +226,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResourceBundleMessageSourceWithDefaultCharset() {
|
||||
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -225,10 +235,8 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResourceBundleMessageSourceWithInappropriateDefaultCharset() {
|
||||
if (JdkVersion.getMajorJavaVersion() < JdkVersion.JAVA_16) {
|
||||
return;
|
||||
}
|
||||
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
ms.setDefaultEncoding("argh");
|
||||
@@ -242,6 +250,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceStandalone() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -249,6 +258,36 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithCacheSeconds() throws InterruptedException {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
ms.setCacheSeconds(1);
|
||||
// Initial cache attempt
|
||||
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
Thread.sleep(1100);
|
||||
// Late enough for a re-cache attempt
|
||||
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithNonConcurrentRefresh() throws InterruptedException {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
ms.setCacheSeconds(1);
|
||||
ms.setConcurrentRefresh(false);
|
||||
// Initial cache attempt
|
||||
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
Thread.sleep(1100);
|
||||
// Late enough for a re-cache attempt
|
||||
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithCommonMessages() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
Properties commonMessages = new Properties();
|
||||
@@ -261,6 +300,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("Do not do that", ms.getMessage("warning", new Object[] {"that"}, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithWhitespaceInBasename() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename(" org/springframework/context/support/messages ");
|
||||
@@ -268,6 +308,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithDefaultCharset() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -276,6 +317,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithInappropriateDefaultCharset() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -293,6 +335,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithInappropriateEnglishCharset() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -309,6 +352,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceWithInappropriateGermanCharset() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -320,6 +364,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals("message2", ms.getMessage("code2", null, Locale.GERMAN));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReloadableResourceBundleMessageSourceFileNameCalculation() {
|
||||
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
|
||||
|
||||
@@ -352,6 +397,7 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertEquals(0, filenames.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMessageSourceResourceBundle() {
|
||||
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
|
||||
ms.setBasename("org/springframework/context/support/messages");
|
||||
@@ -363,11 +409,10 @@ public class ResourceBundleMessageSourceTests extends TestCase {
|
||||
assertTrue(rbg.containsKey("code2"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
if (JdkVersion.getMajorJavaVersion() >= JdkVersion.JAVA_16) {
|
||||
ResourceBundle.clearCache();
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
ResourceBundle.clearCache();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user