/*
* Copyright 2008-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.
* 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.kaleidofoundry.core.i18n;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kaleidofoundry.core.i18n.model.I18nMessage;
import org.kaleidofoundry.core.i18n.model.I18nMessageGroup;
import org.kaleidofoundry.core.i18n.model.I18nMessageLanguage;
import org.kaleidofoundry.core.persistence.UnmanagedEntityManagerFactory;
import org.kaleidofoundry.core.util.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author jraduget
*/
public class I18nJpaEntityMessagesTest extends AbstractI18nMessagesTest {
private static final Logger LOGGER = LoggerFactory.getLogger(I18nJpaEntityMessagesTest.class);
private static final String ResourceRoot = "i18n/jpa-entity/";
private static EntityManagerFactory emf;
/**
* create a database with mocked data
*/
@BeforeClass
public static void setupStatic() {
EntityManager em = null;
EntityTransaction et = null;
try {
// memorize entity manager factory in order to clean it up at end of tests
emf = UnmanagedEntityManagerFactory.getEntityManagerFactory();
// current entity manager
em = UnmanagedEntityManagerFactory.currentEntityManager();
et = em.getTransaction();
et.begin();
// feed database with mock entities
String resourceName;
I18nMessage message;
I18nMessageGroup messageGroup;
// a. root resourceBundle datas
resourceName = ResourceRoot + "root";
messageGroup = new I18nMessageGroup(resourceName);
message = new I18nMessage("label.simple.test", null, messageGroup);
message.getMessageLanguages().add(new I18nMessageLanguage(message, "fr test label", Locale.FRENCH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "en test label", Locale.ENGLISH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "de test label", Locale.GERMAN));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "test label", Locale.ROOT));
em.merge(message);
message = new I18nMessage("label.array.test", null, messageGroup);
message.getMessageLanguages().add(new I18nMessageLanguage(message, "fr test label {0}", Locale.FRENCH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "en test label {0}", Locale.ENGLISH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "de test label {0}", Locale.GERMAN));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "test label {0}", Locale.ROOT));
em.merge(message);
message = new I18nMessage("label.array2.test", null, messageGroup);
message.getMessageLanguages().add(new I18nMessageLanguage(message, "fr test label {0} {1}", Locale.FRENCH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "en test label {0} {1}", Locale.ENGLISH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "de test label {0} {1}", Locale.GERMAN));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "test label {0} {1}", Locale.ROOT));
em.merge(message);
// b. child of root resourceBundle datas
resourceName = ResourceRoot + "child";
messageGroup = new I18nMessageGroup(resourceName);
// override parent item
message = new I18nMessage("label.simple.test", null, messageGroup);
message.getMessageLanguages().add(new I18nMessageLanguage(message, "fr test override parent label", Locale.FRENCH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "en test override parent label", Locale.ENGLISH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "de test override parent label", Locale.GERMAN));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "test override parent label", Locale.ROOT));
em.merge(message);
// new item
message = new I18nMessage("child.simple.test", null, messageGroup);
message.getMessageLanguages().add(new I18nMessageLanguage(message, "fr test child label", Locale.FRENCH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "en test child label", Locale.ENGLISH));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "de test child label", Locale.GERMAN));
message.getMessageLanguages().add(new I18nMessageLanguage(message, "test child label", Locale.ROOT));
em.merge(message);
// print mock entities that have been persist
final I18nMessageController i18nMessageService = new I18nMessageController();
for (final Locale currentLocale : Arrays.asList(Locale.FRENCH, Locale.ENGLISH, Locale.GERMAN)) {
final List<I18nMessageLanguage> frMessages = i18nMessageService.findMessagesByLocale(ResourceRoot + "root", currentLocale);
LOGGER.info(StringHelper.replicate("#", 140));
LOGGER.info("findMessagesByLanguageIso mock database messages for locale '{}' :", currentLocale);
for (final I18nMessageLanguage ml : frMessages) {
LOGGER.info("\t{}", ml.toString());
}
LOGGER.info(StringHelper.replicate("#", 140));
}
et.commit();
// enable jpa control
I18nMessagesFactory.enableJpaControl();
} catch (final RuntimeException re) {
LOGGER.error("static setup", re);
throw re;
} finally {
UnmanagedEntityManagerFactory.close(em);
}
}
@AfterClass
public static void cleanupStatic() {
UnmanagedEntityManagerFactory.close(emf);
}
@After
@Override
public void cleanup() {
super.cleanup();
// each method will have its own entity manager, we have to clean up after use it
UnmanagedEntityManagerFactory.closeItSilently(UnmanagedEntityManagerFactory.currentEntityManager());
}
@Override
String getResourceRoot() {
return ResourceRoot;
}
@Test
public void testResourceBundleCache() {
I18nMessages messageBundle = I18nMessagesFactory.provides(ResourceRoot + "root", Locale.FRENCH);
LOGGER.debug(messageBundle.getMessage("label.array.test", "1"));
LOGGER.debug(messageBundle.getMessage("label.array.test", "2"));
messageBundle = I18nMessagesFactory.provides(ResourceRoot + "root", Locale.FRENCH);
LOGGER.debug(messageBundle.getMessage("label.array.test", "3"));
LOGGER.debug(messageBundle.getMessage("label.array.test", "4"));
LOGGER.debug("clear bundle cache");
I18nMessagesFactory.clearCache();
messageBundle = I18nMessagesFactory.provides(ResourceRoot + "root", Locale.FRENCH);
LOGGER.debug(messageBundle.getMessage("label.array.test", "1"));
LOGGER.debug(messageBundle.getMessage("label.array.test", "2"));
LOGGER.debug(messageBundle.getMessage("label.array.test", "3"));
LOGGER.debug(messageBundle.getMessage("label.array.test", "4"));
}
}