All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bridgedb.utils.ConfigReader Maven / Gradle / Ivy

The newest version!
// BridgeDb,
// An abstraction layer for identifier mapping services, both local and online.
//
// Copyright 2006-2009  BridgeDb developers
// Copyright 2012-2013  Christian Y. A. Brenninkmeijer
// Copyright 2012-2013  OpenPhacts
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package org.bridgedb.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Christian
 */
public class ConfigReader {
    
    //Files
    public static final String CONFIG_FILE_NAME = "BridgeDb.properties";
    public static final String LOCAL_FILE_NAME = "local.properties";
    public static final String LOG_PROPERTIES_FILE = "log4j.properties";

    //Properties added by this class
    public static final String CONFIG_FILE_PATH_PROPERTY = "ConfigPath";
    public static final String CONFIG_FILE_PATH_SOURCE_PROPERTY = "ConfigPathSource";

    private InputStream inputStream;
    private String findMethod;
    private String foundAt;
    private String error = null;
    private Properties properties = null;
    
    protected static boolean useTest = false;
    protected static boolean loggerSetup = false;
    private static ConfigReader propertyReader = null;
    
    private static final Logger logger = Logger.getLogger(ConfigReader.class);
    
    public static Properties getProperties() throws BridgeDBException{
        if (propertyReader == null){
            configureLogger();
            propertyReader = new ConfigReader(CONFIG_FILE_NAME);    
            propertyReader.readProperties();
            propertyReader.properties = addLocalProperties(propertyReader.properties);
        }
        return propertyReader.readProperties();
    }
  
    public static Properties getProperties(String fileName) throws BridgeDBException{
        configureLogger();
        ConfigReader configReader = new ConfigReader(fileName);            
        Properties original = configReader.readProperties();
        return addLocalProperties(original);
    }
    
    private static Properties addLocalProperties(Properties original) throws BridgeDBException{
        //Logger already configured
        logger.info("Adding local properties");
        ConfigReader localReader = new ConfigReader(LOCAL_FILE_NAME); 
        localReader.properties = new Properties();           
        try {
            localReader.properties.load(localReader.getInputStream());
            localReader.inputStream.close();
        } catch (IOException ex) {
            throw new BridgeDBException("Unexpected file not found exception after file.exists returns true.", ex);
        }
        original.putAll(localReader.properties);
        return original;
    }

    public static InputStream getInputStream(String fileName) throws BridgeDBException{
        configureLogger();
        ConfigReader finder = new ConfigReader(fileName);
        return finder.getInputStream();
    }
        
    public static synchronized void configureLogger() throws BridgeDBException{
        if (!loggerSetup){
            ConfigReader finder;
            finder = new ConfigReader(LOG_PROPERTIES_FILE);
            Properties props = finder.readProperties();
            PropertyConfigurator.configure(props);
            logger.info("Logger configured from " + finder.foundAt + " by " + finder.findMethod);
            loggerSetup = true;
         }
    }
     
    public static void logToConsole() throws BridgeDBException{
        configureLogger();
        Logger.getRootLogger().addAppender(new ConsoleAppender());
    }

    protected ConfigReader(){
    }
    
    private ConfigReader(String fileName) throws BridgeDBException{
        Reporter.println("Looking for " + fileName);
        try {
            if (loadDirectly(fileName)) {
                return;
            }
            if (loadByEnviromentVariable(fileName)) {
                return;
            }
            if (loadByCatalinaHomeConfigs(fileName)) {
                return;
            }
            if (loadFromDirectory(fileName, "conf/BridgeDb")) {
                return;
            }
            if (loadFromDirectory(fileName, "../conf/BridgeDb")) {
                return;
            }
            if (getInputStreamWithClassLoader(fileName)) {
                return;
            }
             throw new BridgeDBException("Unable to find " + fileName);
        } catch (IOException ex) {
            error = "Unexpected IOEXception after doing checks.";
            throw new BridgeDBException(error, ex);
        }
    }
    
    private InputStream getInputStream() throws BridgeDBException{
        if (error != null){
            throw new BridgeDBException(error);
        }
        if (inputStream == null){
            error = "InputStream already closed. Illegal attempt to use again.";         
            throw new BridgeDBException(error);
        }
        return inputStream;
    }
    
    private Properties readProperties() throws BridgeDBException{
        if (properties == null){
            properties = new Properties();           
            try {
                properties.load(getInputStream());
                properties.put(CONFIG_FILE_PATH_PROPERTY, foundAt);
                properties.put(CONFIG_FILE_PATH_SOURCE_PROPERTY, findMethod);
                inputStream.close();
                inputStream = null;
            } catch (IOException ex) {
                error = "Unexpected file not fond exception after file.exists returns true.";
                throw new BridgeDBException("Unexpected file not fond exception after file.exists returns true.", ex);
            }
        }
        return properties;
    }
    
    /**
     * Reads the file from the run directory
     * 
     * @param fileName
     * @return true if the file was found
     * @throws FileNotFoundException Only throw if file.exists() returns true but still the file can not be converted to an inputStream
     */
    private boolean loadDirectly(String fileName) throws FileNotFoundException {
        File file = new File(fileName);
        if (!file.exists()) {
            Reporter.println("Unable to find " + file.getAbsolutePath() + " in local Directory ");    
            return false;
        }
        inputStream = new FileInputStream(file);
        findMethod = "Loaded from run Directory.";
        foundAt = file.getAbsolutePath();
        Reporter.println("Loaded file " + fileName + " directly from " + foundAt);    
        return true;
    }

    /**
     * Looks for the config file in the directory set up the environment variable "BRIDGEDB_CONFIG"
     * @return True if the config file was found. 
     *     False if the environment variable "BRIDGEDB_CONFIG" was unset.
     *     False if the environment variable "BRIDGEDB_CONFIG" is set to a directory but it does not contain the requested file.
     * @throws IOException Thrown if the environment variable is not null and does not point to a directory that ran be read.
     */
    private boolean loadByEnviromentVariable(String fileName) throws BridgeDBException, FileNotFoundException{
        String envPath = System.getenv().get("BRIDGEDB_CONFIG");
        if (envPath == null || envPath.isEmpty()) {
            Reporter.warn("No environment variable BRIDGEDB_CONFIG found");
            return false;
        }
        File envDir = new File(envPath);
        if (!envDir.exists()){
            error = "Environment Variable BRIDGEDB_CONFIG points to " + envPath + 
                    " but no directory found there";
            throw new BridgeDBException (error);
        }
        if (envDir.isDirectory()){
            File file = new File(envDir, fileName);
            if (!file.exists()){
                Reporter.warn("No file " + fileName + " found in BRIDGEDB_CONFIG directory " + envDir.getAbsolutePath());
                return false;
            }
            inputStream = new FileInputStream(file);
            findMethod = "Loaded from Environment Variable.";
            foundAt = file.getAbsolutePath();
            Reporter.println("Loaded file " + fileName + " using BRIDGEDB_CONFIG from " + foundAt);    
            return true;
        } else {
            error = "Environment Variable BRIDGEDB_CONFIG points to " + envPath + 
                    " but is not a directory";
            throw new BridgeDBException (error);
        }
    }
  
    /**
     * Looks for the config file in the directory "/conf/BridgeDb" under the directory set up by the environment variable "CATALINA_HOME"
     * @return True if the config file was found. 
     *       False if the environment variable "CATALINA_HOME" was unset.
     *       False if the directory pointed to by "CATALINA_HOME" has no "/conf/BridgeDb" subdirectory
     * @throws IOException Thrown if the environment variable is not null, but does not point to a directory.
     *    If $CATALINA_HOME/conf/BridgeDb exists but is not a directory or can not be read
     *    If the file exists but can not be read.
     */
    private boolean loadByCatalinaHomeConfigs(String fileName) throws BridgeDBException, FileNotFoundException {
        String catalinaHomePath = System.getenv().get("CATALINA_HOME");
        if (catalinaHomePath == null || catalinaHomePath.isEmpty()) {
            Reporter.warn("No enviroment variable CATALINA_HOME found");
            return false;
        }
        File catalineHomeDir = new File(catalinaHomePath);
        if (!catalineHomeDir.exists()){
            error = "Environment Variable CATALINA_HOME points to " + catalinaHomePath + 
                    " but no directory found there";
            throw new BridgeDBException(error);
        }
        if (!catalineHomeDir.isDirectory()){
            error = "Environment Variable CATALINA_HOME points to " + catalinaHomePath + 
                    " but is not a directory";
            throw new BridgeDBException(error);
        }
        File envDir = new File (catalineHomeDir + "/conf/BridgeDb");
        if (!envDir.exists()) {
            Reporter.warn("No directory /conf/BridgeDb found in $CATALINA_HOME directory " + catalineHomeDir.getAbsolutePath());
            return false; //No hard requirements that catalineHome has a /conf/BridgeDb directory
        } 
        if (envDir.isDirectory()){
            File file = new File(envDir, fileName);
            if (!file.exists()){
                Reporter.warn("No file " + fileName + " found in $CATALINA_HOME/conf/BridgeDb directory " + envDir.getAbsolutePath());
                return false;
            }
            inputStream = new FileInputStream(file);
            findMethod = "Loaded from CATALINA_HOME configs.";
            foundAt = file.getAbsolutePath();
            Reporter.println("Loaded file " + fileName + " using CATALINA_HOME from " + foundAt);    
            return true;
        } else {
            error = "Environment Variable CATALINA_HOME points to " + catalinaHomePath  + 
                    " but $CATALINA_HOME/conf/BridgeDb is not a directory";
            throw new BridgeDBException (error);
       }
    }
    
    /**
     * Looks for the config file in a directory.
     * 

* @return True if the file was found, False if it was not found. * @throws IOException If there is an error reading the file. */ private boolean loadFromDirectory(String fileName, String directoryName) throws FileNotFoundException { File directory = new File (directoryName); if (!directory.exists()) { Reporter.warn("No directory found at: " + directoryName+ " at " + directory.getAbsolutePath()); return false; } if (!directory.isDirectory()){ Reporter.warn(directoryName + " is not a directory "); return false; } File file = new File(directory, fileName); if (!file.exists()) return false; if (!file.exists()){ Reporter.warn("No file " + fileName + " found in " + directory.getAbsolutePath()); return false; } inputStream = new FileInputStream(file); findMethod = "Loaded from directory: " + directoryName; foundAt = file.getAbsolutePath(); Reporter.println("Loaded file " + fileName + " from " + foundAt); return true; } /** * Reads the config file direct from the war or jar. * @param fileName * @return The true if the config file was found and could be opened otherwise null; * @throws FileNotFoundException */ private boolean getInputStreamWithClassLoader(String fileName) throws FileNotFoundException{ ClassLoader classLoader = this.getClass().getClassLoader(); URL url = classLoader.getResource(fileName); if (url != null){ try { inputStream = url.openStream(); } catch (IOException ex) { Reporter.error("Error opeing url " + url , ex); return false; } findMethod = "Loaded with class loader"; foundAt = url.getPath(); Reporter.println("Loaded " + fileName + " from "+ url + " with class loader. "); return true; } Reporter.println("Not found by class loader. "); return false; } public static String getProperty(String propertyName) throws BridgeDBException { Properties properties = getProperties(); return properties.getProperty(propertyName); } public static void useTest() { useTest = true; } public static boolean inTestMode() { return useTest; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy