/*
* 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.context.support;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import junit.framework.TestCase;
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;
/**
* @author Juergen Hoeller
* @since 03.02.2004
*/
public class ResourceBundleMessageSourceTests extends TestCase {
public void testMessageAccessWithDefaultMessageSource() {
doTestMessageAccess(false, true, false, false, false);
}
public void testMessageAccessWithDefaultMessageSourceAndMessageFormat() {
doTestMessageAccess(false, true, false, false, true);
}
public void testMessageAccessWithDefaultMessageSourceAndFallbackToGerman() {
doTestMessageAccess(false, true, true, true, false);
}
public void testMessageAccessWithReloadableMessageSource() {
doTestMessageAccess(true, true, false, false, false);
}
public void testMessageAccessWithReloadableMessageSourceAndMessageFormat() {
doTestMessageAccess(true, true, false, false, true);
}
public void testMessageAccessWithReloadableMessageSourceAndFallbackToGerman() {
doTestMessageAccess(true, true, true, true, false);
}
public void testMessageAccessWithReloadableMessageSourceAndFallbackTurnedOff() {
doTestMessageAccess(true, false, false, false, false);
}
public void testMessageAccessWithReloadableMessageSourceAndFallbackTurnedOffAndFallbackToGerman() {
doTestMessageAccess(true, false, true, true, false);
}
protected void doTestMessageAccess(
boolean reloadable, boolean fallbackToSystemLocale,
boolean expectGermanFallback, boolean useCodeAsDefaultMessage, boolean alwaysUseMessageFormat) {
StaticApplicationContext ac = new StaticApplicationContext();
if (reloadable) {
StaticApplicationContext parent = new StaticApplicationContext();
parent.refresh();
ac.setParent(parent);
}
MutablePropertyValues pvs = new MutablePropertyValues();
String basepath = "org/springframework/context/support/";
String[] basenames = null;
if (reloadable) {
basenames = new String[] {
"classpath:" + basepath + "messages",
"classpath:" + basepath + "more-messages"};
}
else {
basenames = new String[] {
basepath + "messages",
basepath + "more-messages"};
}
pvs.addPropertyValue("basenames", basenames);
if (!fallbackToSystemLocale) {
pvs.addPropertyValue("fallbackToSystemLocale", Boolean.FALSE);
}
if (useCodeAsDefaultMessage) {
pvs.addPropertyValue("useCodeAsDefaultMessage", Boolean.TRUE);
}
if (alwaysUseMessageFormat) {
pvs.addPropertyValue("alwaysUseMessageFormat", Boolean.TRUE);
}
Class clazz = reloadable ?
(Class) ReloadableResourceBundleMessageSource.class : ResourceBundleMessageSource.class;
ac.registerSingleton("messageSource", clazz, pvs);
ac.refresh();
Locale.setDefault(expectGermanFallback ? Locale.GERMAN : Locale.CANADA);
assertEquals("message1", ac.getMessage("code1", null, Locale.ENGLISH));
assertEquals(fallbackToSystemLocale && expectGermanFallback ? "nachricht2" : "message2",
ac.getMessage("code2", null, Locale.ENGLISH));
assertEquals("nachricht2", ac.getMessage("code2", null, Locale.GERMAN));
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) {
assertEquals("nachricht2xml", ac.getMessage("code2", null, Locale.GERMANY));
}
MessageSourceAccessor accessor = new MessageSourceAccessor(ac);
LocaleContextHolder.setLocale(new Locale("DE", "at"));
try {
assertEquals("nochricht2", accessor.getMessage("code2"));
}
finally {
LocaleContextHolder.setLocale(null);
}
assertEquals("message3", ac.getMessage("code3", null, Locale.ENGLISH));
MessageSourceResolvable resolvable = new DefaultMessageSourceResolvable("code3");
assertEquals("message3", ac.getMessage(resolvable, Locale.ENGLISH));
resolvable = new DefaultMessageSourceResolvable(new String[] {"code4", "code3"});
assertEquals("message3", ac.getMessage(resolvable, Locale.ENGLISH));
assertEquals("message3", ac.getMessage("code3", null, Locale.ENGLISH));
resolvable = new DefaultMessageSourceResolvable(new String[] {"code4", "code3"});
assertEquals("message3", ac.getMessage(resolvable, Locale.ENGLISH));
Object[] args = new Object[] {"Hello", new DefaultMessageSourceResolvable(new String[] {"code1"})};
assertEquals("Hello, message1", ac.getMessage("hello", args, Locale.ENGLISH));
// test default message without and with args
assertEquals("default", ac.getMessage(null, null, "default", Locale.ENGLISH));
assertEquals("default", ac.getMessage(null, args, "default", Locale.ENGLISH));
assertEquals("{0}, default", ac.getMessage(null, null, "{0}, default", Locale.ENGLISH));
assertEquals("Hello, default", ac.getMessage(null, args, "{0}, default", Locale.ENGLISH));
// test resolvable with default message, without and with args
resolvable = new DefaultMessageSourceResolvable(null, null, "default");
assertEquals("default", ac.getMessage(resolvable, Locale.ENGLISH));
resolvable = new DefaultMessageSourceResolvable(null, args, "default");
assertEquals("default", ac.getMessage(resolvable, Locale.ENGLISH));
resolvable = new DefaultMessageSourceResolvable(null, null, "{0}, default");
assertEquals("{0}, default", ac.getMessage(resolvable, Locale.ENGLISH));
resolvable = new DefaultMessageSourceResolvable(null, args, "{0}, default");
assertEquals("Hello, default", ac.getMessage(resolvable, Locale.ENGLISH));
// test message args
assertEquals("Arg1, Arg2", ac.getMessage("hello", new Object[] {"Arg1", "Arg2"}, Locale.ENGLISH));
assertEquals("{0}, {1}", ac.getMessage("hello", null, Locale.ENGLISH));
if (alwaysUseMessageFormat) {
assertEquals("I'm", ac.getMessage("escaped", null, Locale.ENGLISH));
}
else {
assertEquals("I''m", ac.getMessage("escaped", null, Locale.ENGLISH));
}
assertEquals("I'm", ac.getMessage("escaped", new Object[] {"some arg"}, Locale.ENGLISH));
try {
assertEquals("code4", ac.getMessage("code4", null, Locale.GERMAN));
if (!useCodeAsDefaultMessage) {
fail("Should have thrown NoSuchMessageException");
}
}
catch (NoSuchMessageException ex) {
if (useCodeAsDefaultMessage) {
fail("Should have returned code as default message");
}
}
}
public void testDefaultApplicationContextMessageSource() {
GenericApplicationContext ac = new GenericApplicationContext();
ac.refresh();
assertEquals("default", ac.getMessage("code1", null, "default", Locale.ENGLISH));
assertEquals("default value", ac.getMessage("code1", new Object[] {"value"}, "default {0}", Locale.ENGLISH));
}
public void testResourceBundleMessageSourceStandalone() {
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
ms.setBasename("org/springframework/context/support/messages");
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testResourceBundleMessageSourceWithWhitespaceInBasename() {
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
ms.setBasename(" org/springframework/context/support/messages ");
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testReloadableResourceBundleMessageSourceStandalone() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename("org/springframework/context/support/messages");
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testReloadableResourceBundleMessageSourceWithWhitespaceInBasename() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename(" org/springframework/context/support/messages ");
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testReloadableResourceBundleMessageSourceWithDefaultCharset() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename("org/springframework/context/support/messages");
ms.setDefaultEncoding("ISO-8859-1");
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
assertEquals("nachricht2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testReloadableResourceBundleMessageSourceWithInappropriateDefaultCharset() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename("org/springframework/context/support/messages");
ms.setDefaultEncoding("unicode");
Properties fileCharsets = new Properties();
fileCharsets.setProperty("org/springframework/context/support/messages_de", "unicode");
ms.setFileEncodings(fileCharsets);
ms.setFallbackToSystemLocale(false);
try {
ms.getMessage("code1", null, Locale.ENGLISH);
fail("Should have thrown NoSuchMessageException");
}
catch (NoSuchMessageException ex) {
// expected
}
}
public void testReloadableResourceBundleMessageSourceWithInappropriateEnglishCharset() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename("org/springframework/context/support/messages");
ms.setFallbackToSystemLocale(false);
Properties fileCharsets = new Properties();
fileCharsets.setProperty("org/springframework/context/support/messages", "unicode");
ms.setFileEncodings(fileCharsets);
try {
ms.getMessage("code1", null, Locale.ENGLISH);
fail("Should have thrown NoSuchMessageException");
}
catch (NoSuchMessageException ex) {
// expected
}
}
public void testReloadableResourceBundleMessageSourceWithInappropriateGermanCharset() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename("org/springframework/context/support/messages");
ms.setFallbackToSystemLocale(false);
Properties fileCharsets = new Properties();
fileCharsets.setProperty("org/springframework/context/support/messages_de", "unicode");
ms.setFileEncodings(fileCharsets);
assertEquals("message1", ms.getMessage("code1", null, Locale.ENGLISH));
assertEquals("message2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testReloadableResourceBundleMessageSourceFileNameCalculation() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
List filenames = ms.calculateFilenamesForLocale("messages", Locale.ENGLISH);
assertEquals(1, filenames.size());
assertEquals("messages_en", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", Locale.UK);
assertEquals(2, filenames.size());
assertEquals("messages_en", filenames.get(1));
assertEquals("messages_en_GB", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("en", "GB", "POSIX"));
assertEquals(3, filenames.size());
assertEquals("messages_en", filenames.get(2));
assertEquals("messages_en_GB", filenames.get(1));
assertEquals("messages_en_GB_POSIX", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("en", "", "POSIX"));
assertEquals(2, filenames.size());
assertEquals("messages_en", filenames.get(1));
assertEquals("messages_en__POSIX", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("", "UK", "POSIX"));
assertEquals(2, filenames.size());
assertEquals("messages__UK", filenames.get(1));
assertEquals("messages__UK_POSIX", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("", "", "POSIX"));
assertEquals(0, filenames.size());
}
}