net.jforum.util.JForumConfig.java Source code

Java tutorial

Introduction

Here is the source code for net.jforum.util.JForumConfig.java

Source

/*
 * Copyright (c) JForum Team. All rights reserved.
 *
 * The software in this package is published under the terms of the LGPL
 * license a copy of which has been included with this distribution in the
 * license.txt file.
 *
 * The JForum Project
 * http://www.jforum.net
 */
package net.jforum.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletContext;

import net.jforum.core.exceptions.ForumException;
import net.jforum.entities.Config;
import net.jforum.repository.ConfigRepository;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;

/**
 * @author Rafael Steil
 * @author Jose Donizetti Brito Junior
 */
@Component
@ApplicationScoped
public class JForumConfig extends PropertiesConfiguration {
    private static final Logger logger = Logger.getLogger(JForumConfig.class);
    private final SessionFactory sessionFactory;

    public JForumConfig(ServletContext servletContext, SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
        this.setReloadingStrategy(new FileChangedReloadingStrategy());
        this.setDelimiterParsingDisabled(true);

        try {
            loadProps();
            if (servletContext != null) {
                setProperty(ConfigKeys.APPLICATION_PATH, servletContext.getRealPath(""));
            }
            loadDatabaseProperties();
            normalizeTemplateDirectory();
        } catch (Exception e) {
            throw new ForumException(e);
        }
    }

    private void normalizeTemplateDirectory() {
        StringBuilder sb = new StringBuilder(getValue(ConfigKeys.TEMPLATE_DIRECTORY));

        if (sb.charAt(0) != '/') {
            sb.insert(0, '/');
        }

        if (sb.charAt(sb.length() - 1) != '/') {
            sb.append('/');
        }

        setProperty(ConfigKeys.TEMPLATE_DIRECTORY, sb.toString());
    }

    @Override
    public void setProperty(String key, Object value) {
        clearProperty(key);
        super.setProperty(key, value);
    }

    public List<String> getValueAsList(String key) {
        String value = getValue(key);
        List<String> l = new ArrayList<String>();

        if (value != null) {
            String[] parts = value.split(",");

            for (String p : parts) {
                l.add(p.trim());
            }
        }

        return l;
    }

    private void loadProps() throws ConfigurationException, Exception {
        this.load(this.getClass().getResourceAsStream("/jforumConfig/SystemGlobals.properties"));
        this.loadCustomProperties();
    }

    private void loadCustomProperties() throws Exception {
        InputStream is = this.getClass().getResourceAsStream("/jforumConfig/jforum-custom.properties");

        if (is != null) {
            Properties custom = new Properties();
            custom.load(is);

            for (Enumeration<?> e = custom.keys(); e.hasMoreElements();) {
                String key = (String) e.nextElement();
                this.clearProperty(key);
                this.addProperty(key, custom.get(key));
            }
        }
    }

    private void loadDatabaseProperties() {
        Session session = null;

        try {
            session = sessionFactory.openSession();

            ConfigRepository repository = new ConfigRepository(session);
            List<Config> databasesProperties = repository.getAll();

            for (Config config : databasesProperties) {
                this.clearProperty(config.getName());
                this.addProperty(config.getName(), config.getValue());
            }
        } catch (Exception e) {
            logger.error("Error while trying to load custom settings from the database: " + e.getMessage(), e);
        } finally {
            try {
                session.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * @see org.apache.commons.configuration.BaseConfiguration#addPropertyDirect(java.lang.String, java.lang.Object)
     */
    @Override
    protected void addPropertyDirect(String key, Object value) {
        super.addPropertyDirect(key, value);
    }

    /**
     * Gets the complete path to the application root directory
     * @return the path to the root directory
     */
    public String getApplicationPath() {
        return this.getString(ConfigKeys.APPLICATION_PATH);
    }

    /**
     * Delegates to {@link #getString(String)}
     * @param key the key to retrieve
     * @return the key's value
     */
    public String getValue(String key) {
        return this.getString(key);
    }
}