ReloadableResourceBundleMessageSource uses ConcurrentHashMaps and ReentrantLocks instead of synchronization

Issue: SPR-10500
This commit is contained in:
Juergen Hoeller
2014-08-21 14:24:28 +02:00
parent f5cf3cd56e
commit a000dd782a
2 changed files with 209 additions and 116 deletions

View File

@@ -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();
}
}