r435 - in trunk/wikitty-api/src: main/java/org/nuiton/wikitty main/xmi test/java/org/nuiton/wikitty
Author: bpoussin Date: 2010-10-20 16:14:33 +0200 (Wed, 20 Oct 2010) New Revision: 435 Url: http://nuiton.org/repositories/revision/wikitty/435 Log: Ajout du support i18n pour les extensions, et d'un debut de test unitaire http://www.nuiton.org/issues/show/756 Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nImpl.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nUtil.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyI18nTest.java Modified: trunk/wikitty-api/src/main/xmi/wikitty.zargo Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nImpl.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nImpl.java 2010-10-20 14:14:33 UTC (rev 435) @@ -0,0 +1,217 @@ +package org.nuiton.wikitty; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; + +/** + * WikittyI18n permet de gerer les traductions des champs des extensions. + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyI18nImpl extends WikittyI18nAbstract + implements PropertyChangeListener { + + private static final long serialVersionUID = 3824481585361443459L; + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyI18nImpl.class); + + /** contient les translations sous une forme plus simple a utiliser */ + transient protected Map<String, Map<String, String>> translationsCache = null; + + /** + * WikittyI18nImpl : + */ + public WikittyI18nImpl() { + super(); + } + + /** + * WikittyI18nImpl : + * @param wikitty + */ + public WikittyI18nImpl(Wikitty wikitty) { + super(wikitty); + } + + /** + * WikittyI18nImpl : + * @param businessEntityWikitty + */ + public WikittyI18nImpl(BusinessEntityWikitty businessEntityWikitty) { + super(businessEntityWikitty.getWikitty()); + } + + /** + * WikittyAuthorisationImpl : + * @param extension + * @param wikitty + */ + + public WikittyI18nImpl(WikittyExtension extension, Wikitty wikitty) { + this(wikitty); + setExtensionForMetaExtension(extension); + } + + /** + * On surcharge la methode pour se mettre listener des modifications de + * translation pour pouvoir vider le cache de translation + * @param wikitty + */ + @Override + public void setWikitty(Wikitty wikitty) { + if (this.wikitty != null) { + this.wikitty.removePropertyChangeListener( + FQ_FIELD_WIKITTYI18N_TRANSLATIONS, this); + } + super.setWikitty(wikitty); + if (this.wikitty != null) { + this.wikitty.addPropertyChangeListener( + FQ_FIELD_WIKITTYI18N_TRANSLATIONS, this); + } + } + + /** + * Retourne la translation pour un champs donne pour une lang donnee + * @param lang la langue souhaitee (ex: fr) + * @param field le champs souhaite (ex: name) + * @return la traduction + */ + public String getTranslation(String lang, String field) { + parseAndCacheTranslations(); + + String result = null; + Map<String, String> l = translationsCache.get(lang); + if (l != null) { + result = l.get(field); + } + + if (result == null) { + // no translation for this field, default return field in parameter + result = field; + } + return result; + } + + /** + * Modifie la traduction d'un champs + * @param lang + * @param field + * @param trad + */ + public void setTranslation(String lang, String field, String trad) { + parseAndCacheTranslations(); + putInTranslationCache(lang, field, trad); + // on sauve temporairement le cache, car il va etre supprime + // suite au setTranslations, vu qu'il est a jour se serait dommage de + // devoir le reconstruire + Map<String, Map<String, String>> tmp = translationsCache; + String trans = convertToString(tmp); + setTranslations(trans); + // remet le cache sauvegarde en place + translationsCache = tmp; + + // on indique que la lang a des traductions si besoin + if (getLang() == null || !getLang().contains(lang)) { + addLang(lang); + } + } + + /** + * Parse les traductions et le met en cache + * + * Translations est de la forme: + * [fr:"name"="nom","firstname"="prenom"],[en:"name="name","firstname"="firstname"] + */ + protected void parseAndCacheTranslations() { + if (translationsCache == null) { + String trans = getTranslations(); + String[] langsFields = StringUtil.split(trans, ","); + for (String langFields : langsFields) { + // suppression des [ ] + langFields = langFields.substring(1, langFields.length() - 1); + int colonPos = langFields.indexOf(":"); + // recuperation de la langue + String lang = langFields.substring(0, colonPos); + langFields = langFields.substring(colonPos + 1); + String[] fields = StringUtil.split(langFields, ","); + for (String field : fields) { + String[] fieldNameAndTrad = StringUtil.split(field, "="); + String fieldName = fieldNameAndTrad[0]; + String fieldTrad = fieldNameAndTrad[1]; + + // suppression des " + fieldName = fieldName.substring(1, fieldName.length() - 1); + fieldTrad = fieldTrad.substring(1, fieldTrad.length() - 1); + putInTranslationCache(lang, fieldName, fieldTrad); + } + } + } + } + + /** + * met un traduction en plus dans le cache + * @param lang + * @param field + * @param trans + */ + protected void putInTranslationCache(String lang, String field, String trans) { + if (translationsCache == null) { + translationsCache = new HashMap<String, Map<String, String>>(); + } + Map<String, String> l = translationsCache.get(lang); + if (l == null) { + l = new HashMap<String, String>(); + translationsCache.put(lang, l); + } + l.put(field, trans); + } + + /** + * converti le cache dans une representation string + * @param trans + * @return + */ + protected String convertToString(Map<String, Map<String, String>> trans) { + StringBuilder result = new StringBuilder(); + for (Map.Entry<String, Map<String, String>> l : trans.entrySet()) { + String lang = l.getKey(); + result.append("[" + lang + ":"); + for(Map.Entry<String, String> t : l.getValue().entrySet()) { + result.append("\"" + t.getKey() + "\"=\"" + t.getValue() + "\","); + } + // suppression de la derniere , + if (result.charAt(result.length() - 1) == ',') { + result.deleteCharAt(result.length() - 1); + } + result.append("],"); + } + if (result.charAt(result.length() - 1) == ',') { + result.deleteCharAt(result.length() - 1); + } + return result.toString(); + } + + /** + * Ecoute les events pour devalider le cache + * @param evt + */ + @Override + public void propertyChange(PropertyChangeEvent evt) { + String propName = evt.getPropertyName(); + if (FQ_FIELD_WIKITTYI18N_TRANSLATIONS.equals(propName)) { + // la valeur a change on vide le cache + translationsCache = null; + } + } + +} //WikittyI18nImpl Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nUtil.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nUtil.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyI18nUtil.java 2010-10-20 14:14:33 UTC (rev 435) @@ -0,0 +1,44 @@ +package org.nuiton.wikitty; + + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * Cette classe sert a aider a la gestion multi-langue des extensions + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyI18nUtil { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyI18nUtil.class); + + /** + * Create or load WikittyExtensionTranslation for given extension. + * If created you must call store if you want keep it in storage + * @param proxy + * @param extension + * @return + */ + static public WikittyI18n getI18n(WikittyProxy proxy, WikittyExtension extension) { + String id = WikittyMetaExtensionUtil.generateId( + WikittyI18n.EXT_WIKITTYI18N, + extension.getName()); + + WikittyI18n result; + Wikitty w = proxy.restore(id); + if (w == null) { + w = new WikittyImpl(id); + } + result = new WikittyI18nImpl(w); + + return result; + } + +} Modified: trunk/wikitty-api/src/main/xmi/wikitty.zargo =================================================================== (Binary files differ) Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyI18nTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyI18nTest.java (rev 0) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyI18nTest.java 2010-10-20 14:14:33 UTC (rev 435) @@ -0,0 +1,52 @@ +package org.nuiton.wikitty; + + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Test; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyI18nTest { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyI18nTest.class); + + @Test + public void testI18n() throws Exception { + // creation d'un proxy sur un ws in memory + WikittyService ws = new WikittyServiceInMemory(); + WikittyProxy proxy = new WikittyProxy(ws); + + // creation d'un label pour l'utiliser pour l'i18n + WikittyLabel label = new WikittyLabelImpl(); + WikittyExtension ext = + label.getWikitty().getExtension(WikittyLabel.EXT_WIKITTYLABEL); + + WikittyI18n i18n = WikittyI18nUtil.getI18n(proxy, ext); + i18n.setTranslation("fr", WikittyLabel.FIELD_WIKITTYLABEL_LABELS, "étiquette"); + proxy.store(i18n); + + // ajout d'une traduction pour le francais + String trad = i18n.getTranslation("fr", WikittyLabel.FIELD_WIKITTYLABEL_LABELS); + Assert.assertEquals("étiquette", trad); + Assert.assertEquals(1, i18n.getLang().size()); + Assert.assertEquals("fr", i18n.getLang().iterator().next()); + Assert.assertEquals("[fr:\"labels\"=\"étiquette\"]", i18n.getTranslations()); + + // ajout d'une traduction pour l'espagnole + i18n.setTranslation("es", WikittyLabel.FIELD_WIKITTYLABEL_LABELS, "etiqueta"); + + Assert.assertEquals(2, i18n.getLang().size()); + + System.out.println(i18n.getTranslations()); + } + +}
participants (1)
-
bpoussin@users.nuiton.org