/* Copyright (c) 2001 - 2009 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.translator.model;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
/**
* Maintains the state of the ongoing translations.
* <p>
* REVISIT: this class oughta to be factored out in two, one for the session properties and another
* for the actual translation state
* </p>
*
* @author Gabriel Roldan
* @version $Id$
* @since 2.0
*/
public class TranslateBean implements Serializable {
private static final long serialVersionUID = -8138420553898567646L;
private Locale baseLocale;
private boolean showMissingOnly;
private Locale targetLanguage;
private String currentKey;
private String filter;
/**
* Whether to show the tree as flat view. If false it'll be a tree.
*/
private boolean flatView;
private HashMap<Locale, HashMap<String, String>> availableResources;
public TranslateBean(final Locale baseLocale,
Map<Locale, Map<String, String>> availableResources) {
this.baseLocale = baseLocale;
this.availableResources = new HashMap<Locale, HashMap<String, String>>();
for (Map.Entry<Locale, Map<String, String>> entry : availableResources.entrySet()) {
Locale key = entry.getKey();
Map<String, String> value = entry.getValue();
this.availableResources.put(key, new HashMap<String, String>(value));
}
}
public String getFilter() {
return filter;
}
public void setFilter(String filter) {
this.filter = filter;
}
public Locale getBaseLocale() {
return baseLocale;
}
public void setBaseLocale(Locale baseLocale) {
this.baseLocale = baseLocale;
}
public boolean isFlatView() {
return flatView;
}
public void setFlatView(boolean flatView) {
this.flatView = flatView;
}
public String getCurrentKey() {
return currentKey;
}
public void setCurrentKey(String currentKey) {
this.currentKey = currentKey;
}
public String getCurrentBaseResource() {
String currentResource = getCurrentKeyResource(baseLocale);
return currentResource;
}
public String getCurrentResource() {
Locale targetLanguage = getTargetLanguage();
String currentResource = getCurrentKeyResource(targetLanguage);
return currentResource;
}
public void setCurrentResource(final String currentResource) {
if (currentResource == null) {
return;
}
final String currentKey = getCurrentKey();
Locale targetLanguage = getTargetLanguage();
Map<String, String> languageResources = getLanguageResources(targetLanguage);
languageResources.put(currentKey, currentResource);
}
private String getCurrentKeyResource(final Locale targetLanguage) {
final String currentKey = getCurrentKey();
Map<String, String> languageResources = getLanguageResources(targetLanguage);
String currentResource = languageResources.get(currentKey);
return currentResource;
}
private Map<String, String> getLanguageResources(final Locale locale) {
Map<String, String> languageResources;
HashMap<Locale, HashMap<String, String>> resources = getResources();
languageResources = resources.get(locale);
if (languageResources == null) {
throw new IllegalArgumentException("No translation for " + locale);
}
return languageResources;
}
private HashMap<Locale, HashMap<String, String>> getResources() {
return availableResources;
}
public Set<String> getMissingKeys() {
Set<String> allKeys = getResourceKeys();
Set<String> translatedKeys = getLanguageResources(getTargetLanguage()).keySet();
Set<String> missingKeys = new HashSet<String>(allKeys);
missingKeys.removeAll(translatedKeys);
return missingKeys;
}
public Set<String> getResourceKeys() {
Set<String> keys = Collections.unmodifiableSet(availableResources.get(null).keySet());
return keys;
}
public boolean isShowMissingOnly() {
return showMissingOnly;
}
public void setShowMissingOnly(boolean showMissingOnly) {
this.showMissingOnly = showMissingOnly;
}
public Locale getTargetLanguage() {
return targetLanguage;
}
public void setTargetLanguage(Locale targetLanguage) {
this.targetLanguage = targetLanguage;
if (targetLanguage != null) {
HashMap<Locale, HashMap<String, String>> resources = getResources();
if (!resources.containsKey(targetLanguage)) {
resources.put(targetLanguage, new HashMap<String, String>());
}
}
}
public String getResource(final Locale locale, final String key) {
if (!getResources().containsKey(locale)) {
return null;
}
Map<String, String> languageResources = getLanguageResources(locale);
String string = languageResources.get(key);
return string;
}
public Set<Locale> getAvailableTranslations() {
Set<Locale> locales = new HashSet<Locale>(getResources().keySet());
locales.remove(null);// remove default
return locales;
}
}