ActivitySpec - Correcting logger messages
[sdc.git] / common / openecomp-common-configuration-management / openecomp-configuration-management-core / src / main / java / org / openecomp / config / impl / ConfigurationDataSource.java
1 package org.openecomp.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.openecomp.config.ConfigurationUtils;
7 import org.openecomp.config.Constants;
8
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;
14 import java.util.Set;
15
16 /**
17  * The type Configuration data source.
18  */
19 public final class ConfigurationDataSource {
20
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())));
24
25   private ConfigurationDataSource() {
26     //Hide constructor to prevent instantiation using the default implicit constructor
27   }
28
29   static {
30     try {
31       configDBDatasource = initDataSource();
32     } catch (Exception exception) {
33       System.err.println("Datasource initialization error. Configuration management will be using"
34           + "in-memory persistence.");
35     }
36   }
37
38   /**
39    * Lookup basic data source.
40    *
41    * @return the basic data source
42    * @throws Exception the exception
43    */
44   public static BasicDataSource lookup() throws Exception {
45     if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) {
46       return configDBDatasource;
47     } else {
48       return null;
49     }
50   }
51
52   /**
53    * Init data source basic data source.
54    *
55    * @return the basic data source
56    * @throws Exception the exception
57    */
58   public static BasicDataSource initDataSource() throws Exception {
59     ImmutableConfiguration dbConfig = ConfigurationRepository.lookup()
60         .getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE);
61     if (StringUtils.isEmpty(dbConfig.getString("dbhost"))) {
62       return null;
63     }
64     BasicDataSource datasource = new BasicDataSource();
65     String driverClassName = dbConfig.getString("driverClassName");
66     String jdbcUrl = dbConfig.getString("jdbcURL");
67     if (!isDriverSuitable(driverClassName, jdbcUrl)) {
68       driverClassName = getDriverFor(jdbcUrl);
69     }
70     datasource.setDriverClassName(driverClassName);
71     datasource.setUrl(jdbcUrl);
72     String dbuser = dbConfig.getString("dbuser");
73     String dbpassword = dbConfig.getString("dbpassword");
74     if (dbuser != null && dbuser.trim().length() > 0) {
75       datasource.setUsername(dbuser);
76     }
77     if (dbpassword != null && dbpassword.trim().length() > 0) {
78       datasource.setPassword(dbpassword);
79     }
80     return datasource;
81   }
82
83   private static boolean isDriverSuitable(String driverClassName, String url) {
84     if (driverClassName == null || driverClassName.trim().length() == 0) {
85       return false;
86     }
87     try {
88       Driver driver = Driver.class.cast(Class.forName(driverClassName).newInstance());
89       return driver.acceptsURL(url);
90     } catch (Exception exception) {
91       return false;
92     }
93   }
94
95   private static String getDriverFor(String url) throws Exception {
96     ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
97     for (Driver driver : loader) {
98       if (driver.acceptsURL(url)) {
99         return driver.getClass().getName();
100       }
101     }
102     throw new RuntimeException("No Suitable driver found for " + url);
103   }
104
105 }