edu.cornell.mannlib.vitro.webapp.i18n.selection.LocaleSelectionSetup.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.i18n.selection.LocaleSelectionSetup.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.i18n.selection;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.lang.LocaleUtils;
import org.apache.commons.lang.StringUtils;

import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;

/**
 * Check the ConfigurationProperties for a forced locale, or for a
 * comma-separate list of selectable locales.
 * 
 * Create the appropriate Locale objects and store them in the ServletContext.
 */
public class LocaleSelectionSetup implements ServletContextListener {
    /**
     * If this is set, the locale is forced. No selection will be offered to the
     * user, and browser locales will be ignored.
     */
    public static final String PROPERTY_FORCE_LOCALE = "languages.forceLocale";

    /**
     * This is the list of locales that the user may select. There should be a
     * national flag or symbol available for each supported locale.
     */
    public static final String PROPERTY_SELECTABLE_LOCALES = "languages.selectableLocales";

    private ServletContext ctx;
    private StartupStatus ss;
    private ConfigurationProperties props;

    private String forceString;
    private String selectableString;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ctx = sce.getServletContext();
        ss = StartupStatus.getBean(ctx);
        props = ConfigurationProperties.getBean(sce);

        readProperties();

        if (isForcing() && hasSelectables()) {
            warnAboutOverride();
        }

        if (isForcing()) {
            forceLocale();
        } else if (hasSelectables()) {
            setUpSelections();
        } else {
            reportNoLocales();
        }
    }

    private void readProperties() {
        forceString = props.getProperty(PROPERTY_FORCE_LOCALE, "");
        selectableString = props.getProperty(PROPERTY_SELECTABLE_LOCALES, "");
    }

    private boolean isForcing() {
        return StringUtils.isNotBlank(forceString);
    }

    private boolean hasSelectables() {
        return StringUtils.isNotBlank(selectableString);
    }

    private void warnAboutOverride() {
        ss.warning(this, "'" + PROPERTY_FORCE_LOCALE + "' will override '" + PROPERTY_SELECTABLE_LOCALES + "'.");
    }

    private void forceLocale() {
        try {
            Locale forceLocale = buildLocale(forceString);
            SelectedLocale.setForcedLocale(ctx, forceLocale);
            ssInfo("Setting forced locale to '" + forceLocale + "'.");
        } catch (IllegalArgumentException e) {
            ssWarning("Problem in '" + PROPERTY_FORCE_LOCALE + "': " + e.getMessage());
        }
    }

    private void setUpSelections() {
        List<Locale> locales = new ArrayList<Locale>();
        for (String string : splitSelectables()) {
            try {
                locales.add(buildLocale(string));
            } catch (IllegalArgumentException e) {
                ssWarning("Problem in '" + PROPERTY_SELECTABLE_LOCALES + "': " + e.getMessage());
            }
        }

        SelectedLocale.setSelectableLocales(ctx, locales);
        ssInfo("Setting selectable locales to '" + locales + "'.");
    }

    private String[] splitSelectables() {
        return selectableString.split("\\s*,\\s*");
    }

    private void reportNoLocales() {
        ssInfo("There is no Locale information.");
    }

    private void ssInfo(String message) {
        ss.info(this, message + showPropertyValues());
    }

    private void ssWarning(String message) {
        ss.warning(this, message + showPropertyValues());
    }

    private String showPropertyValues() {
        return " In runtime.properties, '" + PROPERTY_FORCE_LOCALE + "' is set to '" + forceString + "', '"
                + PROPERTY_SELECTABLE_LOCALES + "' is set to '" + selectableString + "'";
    }

    private Locale buildLocale(String localeString) throws IllegalArgumentException {
        Locale locale = LocaleUtils.toLocale(localeString);

        if (!"es_GO".equals(localeString) && // No complaint about bogus locale
                !LocaleUtils.isAvailableLocale(locale)) {
            ssWarning("'" + locale + "' is not a recognized locale.");
        }
        return locale;
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // Nothing to do at shutdown.
    }

}