package org.exoplatform.services.resources; import org.exoplatform.commons.utils.PropertyManager; import org.exoplatform.component.test.AbstractKernelTest; import org.exoplatform.component.test.ConfigurationUnit; import org.exoplatform.component.test.ConfiguredBy; import org.exoplatform.component.test.ContainerScope; import org.exoplatform.container.PortalContainer; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.services.resources.ResourceBundleData; import org.exoplatform.services.resources.ResourceBundleService; import java.util.Locale; import java.util.ResourceBundle; /** * @author <a href="trongtt@gmail.com">Trong Tran</a> * @version $Revision$ */ @ConfiguredBy({ @ConfigurationUnit(scope = ContainerScope.PORTAL, path = "bundles/resource-bundle-configuration.xml") }) public class TestResourceBundleService extends AbstractKernelTest { private static String test_res = "bundles.portal.test"; private ResourceBundleService service_; private LocaleConfigService lservice_; private Locale localeBK; public TestResourceBundleService(String name) { super(name); } public void setUp() throws Exception { // Backup the default locale of JVM to be able to restored in tearDown() localeBK = Locale.getDefault(); PortalContainer manager = PortalContainer.getInstance(); service_ = (ResourceBundleService) manager.getComponentInstanceOfType(ResourceBundleService.class); lservice_ = (LocaleConfigService) manager.getComponentInstanceOfType(LocaleConfigService.class); } @Override protected void tearDown() throws Exception { super.tearDown(); // Restore the default locale of JVM from backup Locale.setDefault(localeBK); } public void testDefaultLocale() { assertEquals(Locale.FRENCH, lservice_.getDefaultLocaleConfig().getLocale()); // Set up default locale of JVM is different than PORTAL // Make sure that default locale of PORTAL will be used instead of JVM locale Locale.setDefault(Locale.ENGLISH); // Portal resource bundle ResourceBundle res = service_.getResourceBundle(test_res, Locale.GERMAN); assertEquals("French", res.getString("language")); res = service_.getResourceBundle(test_res, new Locale("vi")); assertEquals("TiengViet", res.getString("language")); assertEquals("base_vi.xml", res.getString("base_vi")); // Portlet resource bundle res = service_.getResourceBundle("bundles.portlet.test", Locale.GERMAN); assertEquals("French", res.getString("language")); } public void testXMLResourceBunble() { ResourceBundle res = service_.getResourceBundle(test_res, new Locale("vi")); assertEquals("base_vi.xml", res.getString("base_vi")); } public void testCachingPortletBundle() { String oldValue = PropertyManager.getProperty(PropertyManager.DEVELOPING); try { PropertyManager.setProperty(PropertyManager.DEVELOPING, "true"); assertTrue(PropertyManager.isDevelopping()); ResourceBundle res = service_.getResourceBundle("bundles.portlet.test", Locale.ENGLISH); assertNotNull(res); assertTrue(res != service_.getResourceBundle("bundles.portlet.test", Locale.ENGLISH)); PropertyManager.setProperty(PropertyManager.DEVELOPING, "false"); assertFalse(PropertyManager.isDevelopping()); res = service_.getResourceBundle("bundles.portlet.test", Locale.ENGLISH); assertNotNull(res); assertTrue(res == service_.getResourceBundle("bundles.portlet.test", Locale.ENGLISH)); } finally { PropertyManager.setProperty(PropertyManager.DEVELOPING, oldValue); } } public void testPortalFallbackLocale() { assertFallback("portal"); } public void testPortletFallbackLocale() { assertFallback("portlet"); } private void assertFallback(String app) { String baseName = "bundles." + app + ".base"; ResourceBundle res = service_.getResourceBundle(baseName, Locale.ENGLISH); assertEquals("English", res.getString("language")); res = service_.getResourceBundle(baseName, Locale.FRENCH); assertEquals("Default", res.getString("language")); res = service_.getResourceBundle(baseName, Locale.GERMAN); assertEquals("Default", res.getString("language")); // Test locale with no base file baseName = "bundles." + app + ".no-base"; res = service_.getResourceBundle(baseName, Locale.ENGLISH); assertEquals("English", res.getString("language")); res = service_.getResourceBundle(baseName, new Locale("vi")); assertEquals("TiengViet", res.getString("language")); assertEquals("base_vi.properties", res.getString("base_vi")); res = service_.getResourceBundle(baseName, Locale.GERMAN); assertEquals("English", res.getString("language")); assertEquals("base_en.properties", res.getString("base_en")); } public void testResourceBundleServiceUpdate() throws Exception { // -------getResourceBundle have loaded from property file to database-------- String bundle = "portal.locale"; String PROPERTIES = "language=en"; String PROPERTIES_FR = "language=fr\n" + "property=property"; String PROPERTIES_EN_UPDATE = "language=en\n" + "property=en-property"; // //------------create ressource bundle in database------------------ createResourceBundle(bundle, PROPERTIES, Locale.ENGLISH); createResourceBundle(bundle, PROPERTIES_FR, Locale.FRENCH); ResourceBundle res = service_.getResourceBundle(bundle, Locale.ENGLISH); assertEquals("en", res.getString("language")); assertEquals("property", res.getString("property")); res = service_.getResourceBundle(bundle, Locale.FRENCH); assertEquals("fr", res.getString("language")); // --------- Update a databseRes resource bundle in database ---------------- createResourceBundle(bundle, PROPERTIES_EN_UPDATE, Locale.ENGLISH); res = service_.getResourceBundle(bundle, Locale.ENGLISH); assertEquals("en-property", res.getString("property")); ResourceBundleData data = service_.getResourceBundleData(bundle + "_en"); service_.removeResourceBundleData(data.getId()); assertNull(service_.getResourceBundleData(bundle + "_en")); } private void createResourceBundle(String name, String datas, Locale locale) throws Exception { ResourceBundleData data = service_.createResourceBundleDataInstance(); data.setName(name); data.setData(datas); data.setLanguage(locale.getLanguage()); if (locale.getCountry().trim().length() != 0) { data.setCountry(locale.getCountry()); } service_.saveResourceBundle(data); } }