package org.teiid.test.framework; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.teiid.core.util.PropertiesUtils; import org.teiid.test.framework.datasource.DataStore; import org.teiid.test.util.PropUtils; /** * The ConfigProperteryLoader will load the configuration properties to be used by a test. * Unless a different configuraton file is specified, subsequent loading of the configuration * fill will not occur. However, <code>overrides</code> that are applied per test * * * @author vanhalbert * */ @SuppressWarnings("nls") public class ConfigPropertyLoader { /** * The default config file to use when #CONFIG_FILE system property isn't * set */ public static final String DEFAULT_CONFIG_FILE_NAME = "default-config.properties"; private static ConfigPropertyLoader _instance = null; private static String LAST_CONFIG_FILE = null; /** * Contains any overrides specified for the test */ private Properties overrides = new Properties(); /** * Contains the properties loaded from the config file */ private Properties props = null; private Map<String, String>modelAssignedDatabaseType = new HashMap<String, String>(5); private ConfigPropertyLoader() { } public static synchronized ConfigPropertyLoader getInstance() { boolean diff = differentConfigProp(); if (_instance != null) { if (!diff) { return _instance; } reset(); } _instance = new ConfigPropertyLoader(); _instance.initialize(); return _instance; } /** * because a config file could be different for the subsequent test, check * to see if the file is different. * @return boolean */ private static boolean differentConfigProp( ) { String filename = System.getProperty(ConfigPropertyNames.CONFIG_FILE); if (filename == null) { filename = DEFAULT_CONFIG_FILE_NAME; } if (LAST_CONFIG_FILE == null || ! LAST_CONFIG_FILE.equalsIgnoreCase(filename)) { LAST_CONFIG_FILE = filename; return true; } return false; } /** * Called after each test to reset any per test settings. */ public static synchronized void reset() { if (_instance == null) return; _instance.overrides.clear(); _instance.modelAssignedDatabaseType.clear(); _instance.props.clear(); _instance = null; LAST_CONFIG_FILE=null; } private void initialize() { props = PropUtils.loadProperties(LAST_CONFIG_FILE, null); } public String getProperty(String key) { String rtn = null; rtn = overrides.getProperty(key); if (rtn == null) { rtn = props.getProperty(key); if (rtn == null) { rtn = System.getProperty(key); } } return rtn; } public void setProperty(String key, String value) { overrides.setProperty(key, value); } public void setProperties(Properties props) { overrides.putAll(props); } public Properties getProperties() { Properties p = PropertiesUtils.clone(System.getProperties()); if (props != null) { p.putAll(props); } if (overrides != null) { p.putAll(overrides); } return p; } /** * In certain testcases, the data that being provided is already * preconfigured and should not be touched by the {@link DataStore} * processing. * * @return boolean */ public boolean isDataStoreDisabled() { String disable_config = this.getProperty( ConfigPropertyNames.DISABLE_DATASTORES); if (disable_config != null) { return true; } return false; } public Map<String, String> getModelAssignedDatabaseTypes() { return this.modelAssignedDatabaseType; } public void setModelAssignedToDatabaseType(String modelname, String dbtype) { this.modelAssignedDatabaseType.put(modelname, dbtype); } public static void main(String[] args) { System.setProperty("test", "value"); ConfigPropertyLoader _instance = ConfigPropertyLoader.getInstance(); Properties p = _instance.getProperties(); if (p == null || p.isEmpty()) { throw new RuntimeException("Failed to load config properties file"); } if (!p.getProperty("test").equalsIgnoreCase("value")) { throw new RuntimeException("Failed to pickup system property"); } _instance.setProperty("override", "ovalue"); if (!_instance.getProperties().getProperty("override").equalsIgnoreCase("ovalue")) { throw new RuntimeException("Override value wasnt found"); } ConfigPropertyLoader.reset(); if (_instance.getProperties().getProperty("override") != null) { throw new RuntimeException("Override value was found, should have been removed on reset"); } if (!p.getProperty("test").equalsIgnoreCase("value")) { throw new RuntimeException("Failed to pickup system property"); } System.out.println("Loaded Config Properties " + p.toString()); } }