64fd22e4314342f6cd439ceb887f1d052fb49f69
[sdc.git] / common / onap-common-configuration-management / onap-configuration-management-core / src / main / java / org / onap / config / impl / ConfigurationDataSource.java
1 package org.onap.config.impl;
2
3 import org.apache.commons.configuration2.ImmutableConfiguration;
4 import org.apache.commons.dbcp2.BasicDataSource;
5 import org.apache.commons.lang3.StringUtils;
6 import org.onap.config.ConfigurationUtils;
7 import org.onap.config.Constants;
8 import java.util.*;
9 import java.sql.Driver;
10
11 /**
12  * The type Configuration data source.
13  */
14 public final class ConfigurationDataSource {
15
16   private static BasicDataSource configDBDatasource = null;
17   private static Set<String> validCallers = Collections.unmodifiableSet(new HashSet<>(
18       Arrays.asList(ConfigurationUtils.class.getName(), CliConfigurationImpl.class.getName())));
19
20   private ConfigurationDataSource() {
21     //Hide constructor to prevent instantiation using the default implicit constructor
22   }
23
24   static {
25     try {
26       configDBDatasource = initDataSource();
27     } catch (Exception exception) {
28       System.err.println("Datasource initialization error. Configuration management will be using"
29           + "in-memory persistence.");
30     }
31   }
32
33   /**
34    * Lookup basic data source.
35    *
36    * @return the basic data source
37    * @throws Exception the exception
38    */
39   public static BasicDataSource lookup() throws Exception {
40     if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) {
41       return configDBDatasource;
42     } else {
43       return null;
44     }
45   }
46
47   /**
48    * Init data source basic data source.
49    *
50    * @return the basic data source
51    * @throws Exception the exception
52    */
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"))) {
57       return null;
58     }
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);
64     }
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);
71     }
72     if (dbpassword != null && dbpassword.trim().length() > 0) {
73       datasource.setPassword(dbpassword);
74     }
75     return datasource;
76   }
77
78   private static boolean isDriverSuitable(String driverClassName, String url) {
79     if (driverClassName == null || driverClassName.trim().length() == 0) {
80       return false;
81     }
82     try {
83       Driver driver = Driver.class.cast(Class.forName(driverClassName).newInstance());
84       return driver.acceptsURL(url);
85     } catch (Exception exception) {
86       return false;
87     }
88   }
89
90   private static String getDriverFor(String url) throws Exception {
91     ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
92     for (Driver driver : loader) {
93       if (driver.acceptsURL(url)) {
94         return driver.getClass().getName();
95       }
96     }
97     throw new RuntimeException("No Suitable driver found for " + url);
98   }
99
100 }