[SDC-29] Amdocs OnBoard 1707 initial commit.
[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.openecomp.config.ConfigurationUtils;
6 import org.openecomp.config.Constants;
7
8 import java.sql.Driver;
9 import java.util.Arrays;
10 import java.util.Collections;
11 import java.util.HashSet;
12 import java.util.ServiceLoader;
13 import java.util.Set;
14
15 /**
16  * The type Configuration data source.
17  */
18 public final class ConfigurationDataSource {
19
20   private static BasicDataSource configDBDatasource = null;
21   private static Set<String> validCallers = Collections.unmodifiableSet(new HashSet<>(
22       Arrays.asList(ConfigurationUtils.class.getName(), CliConfigurationImpl.class.getName())));
23
24   static {
25     try {
26       configDBDatasource = initDataSource();
27     } catch (Exception exception) {
28       System.err.println("Datasource initialization error. Configuration management will be using in-memory persistence.");
29     }
30   }
31
32   /**
33    * Lookup basic data source.
34    *
35    * @return the basic data source
36    * @throws Exception the exception
37    */
38   public static BasicDataSource lookup() throws Exception {
39     if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) {
40       return configDBDatasource;
41     } else {
42       return null;
43     }
44   }
45
46   /**
47    * Init data source basic data source.
48    *
49    * @return the basic data source
50    * @throws Exception the exception
51    */
52   public static BasicDataSource initDataSource() throws Exception {
53     ImmutableConfiguration dbConfig = ConfigurationRepository.lookup()
54         .getConfigurationFor(Constants.DEFAULT_TENANT, Constants.DB_NAMESPACE);
55     BasicDataSource datasource = new BasicDataSource();
56     String driverClassName = dbConfig.getString("driverClassName");
57     String jdbcUrl = dbConfig.getString("jdbcURL");
58     if (!isDriverSuitable(driverClassName, jdbcUrl)) {
59       driverClassName = getDriverFor(jdbcUrl);
60     }
61     datasource.setDriverClassName(driverClassName);
62     datasource.setUrl(jdbcUrl);
63     String dbuser = dbConfig.getString("dbuser");
64     String dbpassword = dbConfig.getString("dbpassword");
65     if (dbuser != null && dbuser.trim().length() > 0) {
66       datasource.setUsername(dbuser);
67     }
68     if (dbpassword != null && dbpassword.trim().length() > 0) {
69       datasource.setPassword(dbpassword);
70     }
71     return datasource;
72   }
73
74   private static boolean isDriverSuitable(String driverClassName, String url) {
75     if (driverClassName == null || driverClassName.trim().length() == 0) {
76       return false;
77     }
78     try {
79       Driver driver = Driver.class.cast(Class.forName(driverClassName).newInstance());
80       return driver.acceptsURL(url);
81     } catch (Exception exception) {
82       exception.printStackTrace();
83       return false;
84     }
85   }
86
87   private static String getDriverFor(String url) throws Exception {
88     ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
89     for (Driver driver : loader) {
90       if (driver.acceptsURL(url)) {
91         return driver.getClass().getName();
92       }
93     }
94     throw new RuntimeException("No Suitable driver found for " + url);
95   }
96
97 }