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())));
25 private ConfigurationDataSource() {
26 //Hide constructor to prevent instantiation using the default implicit constructor
31 configDBDatasource = initDataSource();
32 } catch (Exception exception) {
33 System.err.println("Datasource initialization error. Configuration management will be using"
34 + "in-memory persistence.");
39 * Lookup basic data source.
41 * @return the basic data source
42 * @throws Exception the exception
44 public static BasicDataSource lookup() throws Exception {
45 if (validCallers.contains(Thread.currentThread().getStackTrace()[2].getClassName())) {
46 return configDBDatasource;
53 * Init data source basic data source.
55 * @return the basic data source
56 * @throws Exception the exception
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"))) {
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);
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);
77 if (dbpassword != null && dbpassword.trim().length() > 0) {
78 datasource.setPassword(dbpassword);
83 private static boolean isDriverSuitable(String driverClassName, String url) {
84 if (driverClassName == null || driverClassName.trim().length() == 0) {
88 Driver driver = Driver.class.cast(Class.forName(driverClassName).newInstance());
89 return driver.acceptsURL(url);
90 } catch (Exception exception) {
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();
102 throw new RuntimeException("No Suitable driver found for " + url);