/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.core.server.manager.impl;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import javax.persistence.EntityManager;
import cc.kune.common.shared.utils.TextUtils;
import cc.kune.core.client.errors.DefaultException;
import cc.kune.core.server.manager.I18nLanguageManager;
import cc.kune.core.server.manager.I18nTranslationManager;
import cc.kune.core.server.persist.DataSourceKune;
import cc.kune.core.shared.dto.I18nTranslationDTO;
import cc.kune.core.shared.dto.SearchResultDTO;
import cc.kune.domain.I18nLanguage;
import cc.kune.domain.I18nTranslation;
import cc.kune.domain.finders.I18nTranslationFinder;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
// TODO: Auto-generated Javadoc
/**
* The Class I18nTranslationManagerDefault.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
@Singleton
public class I18nTranslationManagerDefault extends DefaultManager<I18nTranslation, Long> implements
I18nTranslationManager {
/** The finder. */
private final I18nTranslationFinder finder;
/** The lang cache. */
private final ConcurrentHashMap<String, HashMap<String, String>> langCache;
/** The language manager. */
private final I18nLanguageManager languageManager;
/**
* Instantiates a new i18n translation manager default.
*
* @param provider
* the provider
* @param finder
* the finder
* @param languageManager
* the language manager
*/
@Inject
public I18nTranslationManagerDefault(@DataSourceKune final Provider<EntityManager> provider,
final I18nTranslationFinder finder, final I18nLanguageManager languageManager) {
super(provider, I18nTranslation.class);
this.finder = finder;
this.languageManager = languageManager;
langCache = new ConcurrentHashMap<String, HashMap<String, String>>();
}
/**
* Def lang.
*
* @return the i18n language
*/
private I18nLanguage defLang() {
return languageManager.getDefaultLanguage();
}
/**
* Gets the language.
*
* @param languageId
* the language id
* @return the language
*/
private I18nLanguage getLanguage(final String languageId) {
return languageManager.findByCode(languageId);
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#getLexicon(java.lang
* .String)
*/
@Override
public HashMap<String, String> getLexicon(final String languageId) {
getLanguage(languageId);
HashMap<String, String> map = langCache.get(languageId);
if (map == null) {
map = getLexiconFromDb(languageId);
}
return map;
}
/**
* Gets the lexicon from db.
*
* @param language
* the language
* @return the lexicon from db
*/
@SuppressWarnings("unchecked")
private HashMap<String, String> getLexiconFromDb(final String language) {
// FIXME
// 1) Generate English
// 2) Don't permit to translate English
HashMap<String, String> map = new HashMap<String, String>();
final List<I18nTranslation> set = finder.findByLanguage(language);
if (!language.equals(I18nTranslation.DEFAULT_LANG)) {
map = (HashMap<String, String>) getLexicon(I18nTranslation.DEFAULT_LANG).clone();
}
for (final I18nTranslation trans : set) {
map.put(trans.getTrKey(), trans.getText());
}
langCache.put(language, map);
return map;
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#getTranslatedLexicon
* (java.lang.String, java.lang.String)
*/
@Override
public List<I18nTranslationDTO> getTranslatedLexicon(final String languageCode,
final String languageFrom) {
if (languageFrom == null) {
return finder.getTranslatedLexicon(getLanguage(languageCode));
} else {
return finder.getTranslatedLexiconWithFrom(getLanguage(languageCode), getLanguage(languageFrom));
}
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#getTranslatedLexicon
* (java.lang.String, java.lang.String, java.lang.Integer, java.lang.Integer)
*/
@Override
public SearchResultDTO<I18nTranslationDTO> getTranslatedLexicon(final String languageCode,
final String languageCodeFrom, final Integer firstResult, final Integer maxResults) {
final I18nLanguage language = getLanguage(languageCode);
List<I18nTranslationDTO> list;
if (languageCodeFrom == null) {
list = finder.getTranslatedLexicon(language, firstResult, maxResults);
} else {
final I18nLanguage languageFrom = getLanguage(languageCodeFrom);
list = finder.getTranslatedLexiconWithFrom(language, languageFrom, firstResult, maxResults);
}
return new SearchResultDTO<I18nTranslationDTO>(list.size(), list);
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#getTranslation(java.
* lang.String, java.lang.String, java.lang.String)
*/
@Override
public String getTranslation(final String language, final String text, final String noteForTranslators) {
if (TextUtils.empty(text)) {
return text;
}
final HashMap<String, String> lexicon = getLexicon(language);
final String escapedText = TextUtils.escapeHtmlLight(text);
if (lexicon.containsKey(escapedText)) {
final String translation = lexicon.get(escapedText);
return translation;
} else {
// new key, add to language and default language and let
// untranslated
if (finder.findCount(defLang().getCode(), escapedText) == 0) {
final I18nTranslation newTranslation = new I18nTranslation("", null,
I18nTranslation.DEF_PLUR_INDEX, "", I18nTranslation.UNTRANSLATED_VALUE, escapedText,
I18nTranslation.DEF_NAMESPACE, defLang(), null, noteForTranslators);
try {
persist(newTranslation);
langCache.clear();
} catch (final Exception e) {
// TODO: handle exception
throw new RuntimeException("Error persisting '" + text + "' to language '" + language + "'", e);
}
}
return I18nTranslation.UNTRANSLATED_VALUE;
}
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#getUntranslatedLexicon
* (java.lang.String, java.lang.String)
*/
@Override
public List<I18nTranslationDTO> getUntranslatedLexicon(final String languageCode,
final String languageFrom) {
final I18nLanguage language = initUnstranlated(languageCode);
if (languageFrom == null) {
return finder.getUntranslatedLexicon(language);
} else {
return finder.getUntranslatedLexiconWithFrom(language, getLanguage(languageFrom));
}
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#getUntranslatedLexicon
* (java.lang.String, java.lang.String, java.lang.Integer, java.lang.Integer)
*/
@Override
public SearchResultDTO<I18nTranslationDTO> getUntranslatedLexicon(final String languageCode,
final String languageCodeFrom, final Integer firstResult, final Integer maxResults) {
final I18nLanguage language = initUnstranlated(languageCode);
List<I18nTranslationDTO> list;
if (languageCodeFrom == null) {
list = finder.getUnstranslatedLexicon(language, firstResult, maxResults);
} else {
final I18nLanguage languageFrom = getLanguage(languageCodeFrom);
list = finder.getUntranslatedLexiconWithFrom(language, languageFrom, firstResult, maxResults);
}
return new SearchResultDTO<I18nTranslationDTO>(list.size(), list);
}
/**
* Inits the unstranlated.
*
* @param languageCode
* the language code
* @return the i18n language
*/
private I18nLanguage initUnstranlated(final String languageCode) {
final I18nLanguage defLanguage = defLang();
I18nLanguage language;
if (languageCode.equals(I18nTranslation.DEFAULT_LANG)) {
language = defLanguage;
} else {
language = getLanguage(languageCode);
final List<I18nTranslation> list = finder.getNonExistentFromDefault(defLanguage, language);
for (final I18nTranslation defTrans : list) {
final I18nTranslation newTrans = defTrans.cloneForNewLanguage();
newTrans.setLanguage(language);
persist(newTrans);
}
}
return language;
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.manager.I18nTranslationManager#setTranslation(java.
* lang.Long, java.lang.String)
*/
@Override
public String setTranslation(final Long id, final String translation) throws DefaultException {
final I18nTranslation trans = super.find(id);
if (trans != null) {
// Don't permit to translate the def language
final String lang = trans.getLanguage().getCode();
assert lang != I18nTranslation.DEFAULT_LANG;
final String escapedTranslation = TextUtils.escapeHtmlLight(translation);
trans.setText(escapedTranslation);
persist(trans);
// reset cache for this lang
langCache.remove(lang);
return escapedTranslation;
} else {
throw new DefaultException("Trying to translate a unknown item");
}
}
}