1 package org.openecomp.config.impl;
 
   3 import org.apache.commons.configuration2.ImmutableConfiguration;
 
   4 import org.apache.commons.dbcp2.BasicDataSource;
 
   5 import org.apache.commons.lang3.StringUtils;
 
   6 import org.openecomp.config.ConfigurationUtils;
 
   7 import org.openecomp.config.Constants;
 
   9 import java.sql.Driver;
 
  10 import java.util.Arrays;
 
  11 import java.util.Collections;
 
  12 import java.util.HashSet;
 
  13 import java.util.ServiceLoader;
 
  17  * The type Configuration data source.
 
  19 public final class ConfigurationDataSource {
 
  21   private static BasicDataSource configDBDatasource = null;
 
  22   private static Set<String> validCallers = Collections.unmodifiableSet(new HashSet<>(
 
  23       Arrays.asList(ConfigurationUtils.class.getName(), CliConfigurationImpl.class.getName())));
 
  27       configDBDatasource = initDataSource();
 
  28     } catch (Exception exception) {
 
  29       System.err.println("Datasource initialization error. Configuration management will be using in-memory persistence.");
 
  34    * Lookup basic data source.
 
  36    * @return the basic data source
 
  37    * @throws Exception the exception
 
  39   public static BasicDataSource lookup() throws Exception {
 
  40     if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) {
 
  41       return configDBDatasource;
 
  48    * Init data source basic data source.
 
  50    * @return the basic data source
 
  51    * @throws Exception the exception
 
  53   public static BasicDataSource initDataSource() throws Exception {
 
  54     ImmutableConfiguration dbConfig = ConfigurationRepository.lookup()
 
  55         .getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE);
 
  56     if (StringUtils.isEmpty(dbConfig.getString("dbhost"))) {
 
  59     BasicDataSource datasource = new BasicDataSource();
 
  60     String driverClassName = dbConfig.getString("driverClassName");
 
  61     String jdbcUrl = dbConfig.getString("jdbcURL");
 
  62     if (!isDriverSuitable(driverClassName, jdbcUrl)) {
 
  63       driverClassName = getDriverFor(jdbcUrl);
 
  65     datasource.setDriverClassName(driverClassName);
 
  66     datasource.setUrl(jdbcUrl);
 
  67     String dbuser = dbConfig.getString("dbuser");
 
  68     String dbpassword = dbConfig.getString("dbpassword");
 
  69     if (dbuser != null && dbuser.trim().length() > 0) {
 
  70       datasource.setUsername(dbuser);
 
  72     if (dbpassword != null && dbpassword.trim().length() > 0) {
 
  73       datasource.setPassword(dbpassword);
 
  78   private static boolean isDriverSuitable(String driverClassName, String url) {
 
  79     if (driverClassName == null || driverClassName.trim().length() == 0) {
 
  83       Driver driver = Driver.class.cast(Class.forName(driverClassName).newInstance());
 
  84       return driver.acceptsURL(url);
 
  85     } catch (Exception exception) {
 
  86       exception.printStackTrace();
 
  91   private static String getDriverFor(String url) throws Exception {
 
  92     ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
 
  93     for (Driver driver : loader) {
 
  94       if (driver.acceptsURL(url)) {
 
  95         return driver.getClass().getName();
 
  98     throw new RuntimeException("No Suitable driver found for " + url);