edu.cornell.mannlib.vitro.webapp.config.ConfigurationPropertiesSmokeTests.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.config.ConfigurationPropertiesSmokeTests.java

Source

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

package edu.cornell.mannlib.vitro.webapp.config;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

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

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

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

/**
 * Test that gets run at servlet context startup to check for the existence and
 * validity of properties in the configuration.
 */
public class ConfigurationPropertiesSmokeTests implements ServletContextListener {
    private static final Log log = LogFactory.getLog(ConfigurationPropertiesSmokeTests.class);

    private static final String PROPERTY_DEFAULT_NAMESPACE = "Vitro.defaultNamespace";
    private static final String PROPERTY_LANGUAGE_BUILD = "languages.addToBuild";
    private static final String PROPERTY_LANGUAGE_SELECTABLE = "languages.selectableLocales";
    private static final String PROPERTY_LANGUAGE_FORCE = "languages.forceLocale";
    private static final String PROPERTY_LANGUAGE_FILTER = "RDFService.languageFilter";

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

        checkDefaultNamespace(ctx, props, ss);
        checkLanguages(props, ss);
    }

    /**
     * Confirm that the default namespace is specified and a syntactically valid
     * URI. It should also end with "/individual/".
     */
    private void checkDefaultNamespace(ServletContext ctx, ConfigurationProperties props, StartupStatus ss) {
        String ns = props.getProperty(PROPERTY_DEFAULT_NAMESPACE);
        if (ns == null || ns.isEmpty()) {
            ss.fatal(this, "runtime.properties does not contain a value for '" + PROPERTY_DEFAULT_NAMESPACE + "'");
            return;
        }

        try {
            new URI(ns);
        } catch (URISyntaxException e) {
            ss.fatal(this, PROPERTY_DEFAULT_NAMESPACE + " '" + ns + "' is not a valid URI. "
                    + (e.getMessage() != null ? e.getMessage() : ""));
            return;
        }

        String suffix = "/individual/";
        if (!ns.endsWith(suffix)) {
            ss.warning(this, "Default namespace does not match the expected form " + "(does not end with '" + suffix
                    + "'): '" + ns + "'");
        }
    }

    /**
     * Warn if we set up the languages incorrectly:
     * 
     * Must build with a language in order to select languages. Can't select
     * languages and force language. Shouldn't build with language unless
     * language filtering is enabled.
     */
    private void checkLanguages(ConfigurationProperties props, StartupStatus ss) {
        String buildString = props.getProperty(PROPERTY_LANGUAGE_BUILD);
        boolean buildWithLanguages = StringUtils.isNotBlank(buildString);

        String selectString = props.getProperty(PROPERTY_LANGUAGE_SELECTABLE);
        boolean selectableLanguages = StringUtils.isNotBlank(selectString);

        String forceString = props.getProperty(PROPERTY_LANGUAGE_FORCE);
        boolean forceLanguage = StringUtils.isNotBlank(forceString);

        String filterString = props.getProperty(PROPERTY_LANGUAGE_FILTER, "true");
        boolean languageFilter = Boolean.valueOf(filterString);

        if (selectableLanguages && !buildWithLanguages) {
            ss.warning(this,
                    String.format(
                            "Problem with Language setup - " + "runtime.properties specifies a "
                                    + "list of selectable languages (%s = %s), but "
                                    + "build.properties did not include any languages with %s",
                            PROPERTY_LANGUAGE_SELECTABLE, selectString, PROPERTY_LANGUAGE_BUILD));
        }

        if (selectableLanguages && forceLanguage) {
            ss.warning(this,
                    String.format(
                            "Problem with Language setup - " + "runtime.properties specifies a "
                                    + "forced locale (%s = %s), and also a list of selectable "
                                    + "languages (%s = %s). These options are incompatible.",
                            PROPERTY_LANGUAGE_FORCE, forceString, PROPERTY_LANGUAGE_SELECTABLE, selectString));
        }

        if (buildWithLanguages && !languageFilter) {
            ss.warning(this,
                    String.format(
                            "Problem with Language setup - " + "build.properties includes one or more additional "
                                    + "languages (%s = %s), but runtime.properties has "
                                    + "disabled language filtering (%s = %s). This will "
                                    + "likely result in a mix of languages in the " + "application.",
                            PROPERTY_LANGUAGE_BUILD, buildString, PROPERTY_LANGUAGE_FILTER, filterString));
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // nothing to do at shutdown
    }

}