package com.liveramp.hank.monitor.notifier.db; import com.liveramp.hank.config.InvalidConfigurationException; import com.liveramp.hank.config.yaml.YamlConfigurator; import com.liveramp.hank.monitor.notifier.AbstractNotifierFactory; import com.liveramp.hank.monitor.notifier.NotifierFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.FileNotFoundException; import java.util.Map; public class SQLEnvironmentsNotifierFactory extends AbstractNotifierFactory implements NotifierFactory { private static Logger LOG = LoggerFactory.getLogger(SQLEnvironmentsNotifierFactory.class); protected static final String ENVIRONMENT_CONFIG_FILE = "environment_config_file"; protected static final String DATABASES_CONFIG_FILE = "database_config_file"; protected static final String DATABASE_ENVIRONMENT = "database_environment"; protected static final String DRIVER = "driver"; protected static final String TARGET_VERSION_NOTIFICATIONS_TABLE = "target_version_notifications_table"; protected static final String ADAPTER = "adapter"; protected static final String HOST = "host"; protected static final String DATABASE = "database"; protected static final String USERNAME = "username"; protected static final String PASSWORD = "password"; private String adapter; private String host; private String database; private String username; private String password; private SQLEnvironmentsNotifierFactory.EnvironmentYamlConfigurator environmentYamlConfigurator; private DatabaseYamlConfigurator databaseYamlConfigurator; @Override public void validate(Map<String, Object> configuration) throws InvalidConfigurationException { String environmentFilename = getRequiredString(configuration, ENVIRONMENT_CONFIG_FILE); String databaseFilename = getRequiredString(configuration, DATABASES_CONFIG_FILE); String databaseEnvironment = getRequiredString(configuration, DATABASE_ENVIRONMENT); getRequiredString(configuration, DRIVER); getRequiredString(configuration, TARGET_VERSION_NOTIFICATIONS_TABLE); initYamlConfigurators(environmentFilename, databaseFilename, databaseEnvironment); } private void initYamlConfigurators(String environmentFilename, String databaseFilename, String databaseEnvironment) throws InvalidConfigurationException { if (environmentYamlConfigurator == null) { environmentYamlConfigurator = new EnvironmentYamlConfigurator(environmentFilename, databaseEnvironment); } if (databaseYamlConfigurator == null) { databaseYamlConfigurator = new DatabaseYamlConfigurator(databaseFilename, environmentYamlConfigurator.databaseConfigName); } } @Override public SQLNotifier createNotifier(Map<String, Object> configuration, String name, String webUiUrl) { String environmentFilename = getString(configuration, ENVIRONMENT_CONFIG_FILE); String databaseFilename = getString(configuration, DATABASES_CONFIG_FILE); String databaseEnvironment = getString(configuration, DATABASE_ENVIRONMENT); String driver = getString(configuration, DRIVER); String targetVersionNotificationTable = getString(configuration, TARGET_VERSION_NOTIFICATIONS_TABLE); try { initYamlConfigurators(environmentFilename, databaseFilename, databaseEnvironment); } catch (InvalidConfigurationException e) { throw new RuntimeException("Error while reading files", e); } String serverUrl = "jdbc:" + databaseYamlConfigurator.adapter + "://" + databaseYamlConfigurator.host; String database = databaseYamlConfigurator.database; String connectionUrl = serverUrl + "/" + database; String username = databaseYamlConfigurator.username; String password = databaseYamlConfigurator.password; SQLNotifierConfiguration notifierNotification = new SQLNotifierConfiguration(driver, connectionUrl, username, password, targetVersionNotificationTable); return new SQLNotifier(notifierNotification); } private class EnvironmentYamlConfigurator extends YamlConfigurator { private String databaseEnvironment; private String databaseConfigName; private EnvironmentYamlConfigurator(String environmentFilename, String databaseEnvironment) throws InvalidConfigurationException { this.databaseEnvironment = databaseEnvironment; try { loadFromFile(environmentFilename); } catch (FileNotFoundException e) { throw new InvalidConfigurationException("Can't find config file " + e.getMessage()); } } @Override protected void validate() throws InvalidConfigurationException { databaseConfigName = getRequiredString(databaseEnvironment); } } private class DatabaseYamlConfigurator extends YamlConfigurator { private String databaseConfigName; private String adapter; private String host; private String database; private String username; private String password; private DatabaseYamlConfigurator(String databaseFilename, String databaseConfigName) throws InvalidConfigurationException { this.databaseConfigName = databaseConfigName; try { loadFromFile(databaseFilename); } catch (FileNotFoundException e) { throw new InvalidConfigurationException("Can't find config file " + e.getMessage()); } } @Override protected void validate() throws InvalidConfigurationException { getRequiredSection(databaseConfigName); adapter = getRequiredString(databaseConfigName, ADAPTER); host = getRequiredString(databaseConfigName, HOST); database = getRequiredString(databaseConfigName, DATABASE); username = getRequiredString(databaseConfigName, USERNAME); password = getRequiredString(databaseConfigName, PASSWORD); } } }