/* * 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); } }