aboutsummaryrefslogtreecommitdiffstats
path: root/common/onap-common-configuration-management/onap-configuration-management-core/src/main/java/org/onap/config/impl/ConfigurationDataSource.java
blob: 64fd22e4314342f6cd439ceb887f1d052fb49f69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package org.onap.config.impl;

import org.apache.commons.configuration2.ImmutableConfiguration;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.lang3.StringUtils;
import org.onap.config.ConfigurationUtils;
import org.onap.config.Constants;
import java.util.*;
import java.sql.Driver;

/**
 * The type Configuration data source.
 */
public final class ConfigurationDataSource {

  private static BasicDataSource configDBDatasource = null;
  private static Set<String> validCallers = Collections.unmodifiableSet(new HashSet<>(
      Arrays.asList(ConfigurationUtils.class.getName(), CliConfigurationImpl.class.getName())));

  private ConfigurationDataSource() {
    //Hide constructor to prevent instantiation using the default implicit constructor
  }

  static {
    try {
      configDBDatasource = initDataSource();
    } catch (Exception exception) {
      System.err.println("Datasource initialization error. Configuration management will be using"
          + "in-memory persistence.");
    }
  }

  /**
   * Lookup basic data source.
   *
   * @return the basic data source
   * @throws Exception the exception
   */
  public static BasicDataSource lookup() throws Exception {
    if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) {
      return configDBDatasource;
    } else {
      return null;
    }
  }

  /**
   * Init data source basic data source.
   *
   * @return the basic data source
   * @throws Exception the exception
   */
  public static BasicDataSource initDataSource() throws Exception {
    ImmutableConfiguration dbConfig = ConfigurationRepository.lookup()
        .getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE);
    if (StringUtils.isEmpty(dbConfig.getString("dbhost"))) {
      return null;
    }
    BasicDataSource datasource = new BasicDataSource();
    String driverClassName = dbConfig.getString("driverClassName");
    String jdbcUrl = dbConfig.getString("jdbcURL");
    if (!isDriverSuitable(driverClassName, jdbcUrl)) {
      driverClassName = getDriverFor(jdbcUrl);
    }
    datasource.setDriverClassName(driverClassName);
    datasource.setUrl(jdbcUrl);
    String dbuser = dbConfig.getString("dbuser");
    String dbpassword = dbConfig.getString("dbpassword");
    if (dbuser != null && dbuser.trim().length() > 0) {
      datasource.setUsername(dbuser);
    }
    if (dbpassword != null && dbpassword.trim().length() > 0) {
      datasource.setPassword(dbpassword);
    }
    return datasource;
  }

  private static boolean isDriverSuitable(String driverClassName, String url) {
    if (driverClassName == null || driverClassName.trim().length() == 0) {
      return false;
    }
    try {
      Driver driver = Driver.class.cast(Class.forName(driverClassName).newInstance());
      return driver.acceptsURL(url);
    } catch (Exception exception) {
      return false;
    }
  }

  private static String getDriverFor(String url) throws Exception {
    ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
    for (Driver driver : loader) {
      if (driver.acceptsURL(url)) {
        return driver.getClass().getName();
      }
    }
    throw new RuntimeException("No Suitable driver found for " + url);
  }

}