/* * Copyright (c) JForum Team * All rights reserved. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided * that the following conditions are met: * * 1) Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * 2) Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of "Rafael Steil" nor * the names of its contributors may be used to endorse * or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * * Created on 02/11/2004 12:45:37 * The JForum Project * http://www.jforum.net */ package net.jforum; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Properties; import net.jforum.api.integration.mail.pop.POPJobStarter; import net.jforum.cache.CacheEngine; import net.jforum.cache.Cacheable; import net.jforum.dao.DataAccessDriver; import net.jforum.exceptions.CacheEngineStartupException; import net.jforum.exceptions.ForumException; import net.jforum.search.SearchFacade; import net.jforum.sso.LoginAuthenticator; import net.jforum.summary.SummaryScheduler; import net.jforum.util.FileMonitor; import net.jforum.util.preferences.ConfigKeys; import net.jforum.util.preferences.QueriesFileListener; import net.jforum.util.preferences.SystemGlobals; import net.jforum.util.preferences.SystemGlobalsListener; import org.apache.log4j.Logger; import org.quartz.SchedulerException; /** * General utilities methods for loading configurations for JForum. * * @author Rafael Steil * @version $Id: ConfigLoader.java,v 1.30 2007/07/27 15:42:56 rafaelsteil Exp $ */ public class ConfigLoader { private static final Logger logger = Logger.getLogger(ConfigLoader.class); private static CacheEngine cache; /** * Start ( or restart ) <code>SystemGlobals</code>. * This method loads all configuration keys set at * <i>SystemGlobals.properties</i>, <i><user.name>.properties</i> * and database specific stuff. * * @param appPath The application root's directory */ public static void startSystemglobals(String appPath) { SystemGlobals.initGlobals(appPath, appPath + "/WEB-INF/config/SystemGlobals.properties"); SystemGlobals.loadAdditionalDefaults(SystemGlobals.getValue(ConfigKeys.DATABASE_DRIVER_CONFIG)); if (new File(SystemGlobals.getValue(ConfigKeys.INSTALLATION_CONFIG)).exists()) { SystemGlobals.loadAdditionalDefaults(SystemGlobals.getValue(ConfigKeys.INSTALLATION_CONFIG)); } } /** * Loads module mappings for the system. * * @param baseConfigDir The directory where the file <i>modulesMapping.properties</i> is. * @return The <code>java.util.Properties</code> instance, with the loaded modules */ public static Properties loadModulesMapping(String baseConfigDir) { FileInputStream fis = null; try { Properties modulesMapping = new Properties(); fis = new FileInputStream(baseConfigDir + "/modulesMapping.properties"); modulesMapping.load(fis); return modulesMapping; } catch (IOException e) { throw new ForumException( e); } finally { if (fis != null) { try { fis.close(); } catch (Exception e) {} } } } public static void createLoginAuthenticator() { String className = SystemGlobals.getValue(ConfigKeys.LOGIN_AUTHENTICATOR); try { LoginAuthenticator loginAuthenticator = (LoginAuthenticator) Class.forName(className).newInstance(); SystemGlobals.setObjectValue(ConfigKeys.LOGIN_AUTHENTICATOR_INSTANCE, loginAuthenticator); } catch (Exception e) { throw new ForumException("Error while trying to create a login.authenticator instance (" + className + "): " + e, e); } } /** * Load url patterns. * The method tries to load url patterns from <i>WEB-INF/config/urlPattern.properties</i> */ public static void loadUrlPatterns() { FileInputStream fis = null; try { Properties p = new Properties(); fis = new FileInputStream(SystemGlobals.getValue(ConfigKeys.CONFIG_DIR) + "/urlPattern.properties"); p.load(fis); for (Iterator iter = p.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry) iter.next(); UrlPatternCollection.addPattern((String)entry.getKey(), (String)entry.getValue()); } } catch (IOException e) { throw new ForumException(e); } finally { if (fis != null) { try { fis.close(); } catch (Exception e) {} } } } /** * Listen for changes in common configuration files. * The watched files are: <i>generic_queries.sql</i>, * <i><database_name>.sql</i>, <i>SystemGlobals.properties</i> * and <i><user.name>.properties</i> */ public static void listenForChanges() { int fileChangesDelay = SystemGlobals.getIntValue(ConfigKeys.FILECHANGES_DELAY); if (fileChangesDelay > 0) { // Queries FileMonitor.getInstance().addFileChangeListener(new QueriesFileListener(), SystemGlobals.getValue(ConfigKeys.SQL_QUERIES_GENERIC), fileChangesDelay); FileMonitor.getInstance().addFileChangeListener(new QueriesFileListener(), SystemGlobals.getValue(ConfigKeys.SQL_QUERIES_DRIVER), fileChangesDelay); // System Properties FileMonitor.getInstance().addFileChangeListener(new SystemGlobalsListener(), SystemGlobals.getValue(ConfigKeys.DEFAULT_CONFIG), fileChangesDelay); ConfigLoader.listenInstallationConfig(); } } public static void listenInstallationConfig() { int fileChangesDelay = SystemGlobals.getIntValue(ConfigKeys.FILECHANGES_DELAY); if (fileChangesDelay > 0) { if (new File(SystemGlobals.getValue(ConfigKeys.INSTALLATION_CONFIG)).exists()) { FileMonitor.getInstance().addFileChangeListener(new SystemGlobalsListener(), SystemGlobals.getValue(ConfigKeys.INSTALLATION_CONFIG), fileChangesDelay); } } } public static void loadDaoImplementation() { // Start the dao.driver implementation String driver = SystemGlobals.getValue(ConfigKeys.DAO_DRIVER); logger.info("Loading JDBC driver " + driver); try { Class c = Class.forName(driver); DataAccessDriver d = (DataAccessDriver)c.newInstance(); DataAccessDriver.init(d); } catch (Exception e) { throw new ForumException(e); } } public static void startCacheEngine() { try { String cacheImplementation = SystemGlobals.getValue(ConfigKeys.CACHE_IMPLEMENTATION); logger.info("Using cache engine: " + cacheImplementation); cache = (CacheEngine)Class.forName(cacheImplementation).newInstance(); cache.init(); String s = SystemGlobals.getValue(ConfigKeys.CACHEABLE_OBJECTS); if (s == null || s.trim().equals("")) { logger.warn("Cannot find Cacheable objects to associate the cache engine instance."); return; } String[] cacheableObjects = s.split(","); for (int i = 0; i < cacheableObjects.length; i++) { logger.info("Creating an instance of " + cacheableObjects[i]); Object o = Class.forName(cacheableObjects[i].trim()).newInstance(); if (o instanceof Cacheable) { ((Cacheable)o).setCacheEngine(cache); } else { logger.error(cacheableObjects[i] + " is not an instance of net.jforum.cache.Cacheable"); } } } catch (Exception e) { throw new CacheEngineStartupException("Error while starting the cache engine", e); } } public static void stopCacheEngine() { if (cache != null) { cache.stop(); } } public static void startSearchIndexer() { SearchFacade.init(); } /** * Init a Job who will send e-mails to the all users with a summary of posts... * @throws SchedulerException * @throws IOException */ public static void startSummaryJob() throws SchedulerException { SummaryScheduler.startJob(); } public static void startPop3Integration() throws SchedulerException { POPJobStarter.startJob(); } }