edu.cornell.mannlib.vitro.webapp.servlet.setup.ThemeInfoSetup.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.servlet.setup.ThemeInfoSetup.java

Source

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

package edu.cornell.mannlib.vitro.webapp.servlet.setup;

import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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

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

import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.util.iterator.ClosableIterator;

import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean.ThemeInfo;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;

public class ThemeInfoSetup implements ServletContextListener {
    private static final Log log = LogFactory.getLog(ThemeInfoSetup.class);

    // Set default theme based on themes present on the file system
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext ctx = sce.getServletContext();
        StartupStatus ss = StartupStatus.getBean(ctx);

        String themeDirPath = ctx.getRealPath("/themes");
        if (themeDirPath == null) {
            throw new IllegalStateException("Application does not have a /themes directory.");
        }
        File themesBaseDir = new File(themeDirPath);

        List<String> themeNames = getThemeNames(themesBaseDir);
        log.debug("themeNames: " + themeNames);
        if (themeNames.isEmpty()) {
            ss.fatal(this, "The application contains no themes. '" + themesBaseDir.getAbsolutePath()
                    + "' has no child directories.");
        }

        String defaultThemeName = "vitro";
        if (!themeNames.contains(defaultThemeName)) {
            defaultThemeName = themeNames.get(0);
        }
        log.debug("defaultThemeName: " + defaultThemeName);

        String currentThemeName = getCurrentThemeName(ctx);
        log.debug("currentThemeName: " + currentThemeName);
        if ((currentThemeName != null) && (!currentThemeName.isEmpty())
                && (!themeNames.contains(currentThemeName))) {
            ss.warning(this,
                    "The current theme selection is '" + currentThemeName
                            + "', but that theme is not available. The '" + defaultThemeName
                            + "' theme will be used instead. " + "Go to the Site Admin page and choose "
                            + "\"Site Information\" to select a theme.");
        }

        ApplicationBean.themeInfo = new ThemeInfo(themesBaseDir, defaultThemeName, themeNames);
        ss.info(this, "current theme: " + currentThemeName + ", default theme: " + defaultThemeName
                + ", available themes: " + themeNames);
    }

    /** Get a list of the names of available themes, sorted alphabetically. */
    private List<String> getThemeNames(File themesBaseDir) {
        ArrayList<String> themeNames = new ArrayList<String>();

        for (File child : themesBaseDir.listFiles()) {
            if (child.isDirectory()) {
                themeNames.add(child.getName());
            }
        }

        Collections.sort(themeNames, String.CASE_INSENSITIVE_ORDER);
        return themeNames;
    }

    private String getCurrentThemeName(ServletContext ctx) {
        OntModel ontModel = ModelAccess.on(ctx).getOntModel(APPLICATION_METADATA);

        ontModel.enterCriticalSection(Lock.READ);
        try {
            Property property = ontModel.getProperty(VitroVocabulary.PORTAL_THEMEDIR);
            ClosableIterator<RDFNode> nodes = ontModel.listObjectsOfProperty(property);
            try {
                if (nodes.hasNext()) {
                    String themeDir = ((Literal) nodes.next()).getString();
                    return ThemeInfo.themeNameFromDir(themeDir);
                } else {
                    return null;
                }
            } finally {
                nodes.close();
            }
        } catch (Exception e) {
            log.error(e, e);
            return null;
        } finally {
            ontModel.leaveCriticalSection();
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // nothing to do here
    }

}