package com.urbanairship.octobot; import org.jvyaml.YAML; import java.util.HashMap; import java.io.FileReader; import org.apache.log4j.Logger; // This class is responsible for loading in configuration data for the // application. By default, it searches for a YAML file located at // /usr/local/octobot/octobot.yml, unless the JVM environment variable // "-DconfigFile=/absolute/path" is specified. These values are accessed // as a standard map by calling Settings.get("Octobot", "queues"). // Implemented as a singleton to avoid reading the file in multiple times. // Changes to application configuration require a restart to take effect. public class Settings { private static final Logger logger = Logger.getLogger("Settings"); public static HashMap<String, HashMap<String, Object>> configuration = null; // Load the settings once on initialization, and hang onto them. private static final Settings INSTANCE = new Settings(); @SuppressWarnings("unchecked") private Settings() { String settingsFile = System.getProperty("configFile"); if (settingsFile == null) settingsFile = "/usr/local/octobot/octobot.yml"; try { configuration = (HashMap<String,HashMap<String, Object>>) YAML.load(new FileReader(settingsFile)); } catch (Exception e) { // Logging to Stdout here because Log4J not yet initialized. logger.warn("Warning: No valid config at " + settingsFile); logger.warn("Please create this file, or set the " + "-DconfigFile=/foo/bar/octobot.yml JVM variable to its location."); logger.warn("Continuing launch with internal defaults."); } } public static Settings get() { return INSTANCE; } /** * Fetches a setting from YAML configuration. * If unset in YAML, use the default value specified above. * * @param category Category to retrieve setting from (eg PosgreSQL) * @param key Actual setting to retrieve * @return value of setting as a String or null */ public static String get(String category, String key) { String result = null; try { HashMap configCategory = configuration.get(category); result = configCategory.get(key).toString(); } catch (NullPointerException e) { logger.warn("Warning - unable to load " + category + " / " + key + " from configuration file."); } return result; } /** * Fetches a setting from YAML configuration. * * @param category Category to retrieve setting from (eg PosgreSQL) * @param key Actual setting to retrieve * @param defaultValue value to return if setting doesn't exist * @return value of setting as a String or null */ public static String get(String category, String key, String defaultValue) { String result = get(category, key); if (result == null) { return defaultValue; } else { return result; } } /** * Fetches a setting from YAML config and converts it to an integer. No * integer settings are autodetected, so that logic is not needed here. * * @param category Category to retrieve setting from (eg PosgreSQL) * @param key Actual setting to retrieve * @return value of setting as an Integer or null */ public static Integer getAsInt(String category, String key) { Integer result = null; Object value = null; HashMap configCategory = null; try { configCategory = configuration.get(category); value = configCategory.get(key); if (value instanceof Long) { result = ((Long) configCategory.get(key)).intValue(); } else if (value instanceof Integer) { result = (Integer) configCategory.get(key); } } catch (NullPointerException e) { logger.warn("Warning - unable to load " + category + " / " + key + " from config file, autodetection, or default settings."); } return result; } /** * Fetches a setting from YAML config and converts it to an integer. * No integer settings are autodetected, so that logic is not needed here. * * @param category Category to retrieve setting from (eg PosgreSQL) * @param key Actual setting to retrieve * @param defaultValue value to return if setting doesn't exist * @return value of setting as an Integer or defaultValue */ public static Integer getAsInt(String category, String key, int defaultValue) { Integer result = getAsInt(category, key); if (result == null) { return defaultValue; } else { return result; } } // Fetches a value from settings as an integer, with a default value. public static Integer getIntFromYML(Object obj, Integer defaultValue) { int result = defaultValue; if (obj != null) { try { result = Integer.parseInt(obj.toString()); } catch (NumberFormatException e) { logger.info("Error reading settings."); } } return result; } // Fetches a setting from YAML config and converts it to a boolean. // No boolean settings are autodetected, so that logic is not needed here. public static boolean getAsBoolean(String category, String key) { return Boolean.valueOf(get(category, key)).booleanValue(); } }