001 package org.kuali.common.jdbc.vendor.service;
002
003 import java.sql.Driver;
004 import java.util.List;
005 import java.util.Properties;
006
007 import org.kuali.common.jdbc.model.context.ConnectionContext;
008 import org.kuali.common.jdbc.sql.model.AdminSql;
009 import org.kuali.common.jdbc.sql.model.DbaSql;
010 import org.kuali.common.jdbc.vendor.model.DatabaseVendor;
011 import org.kuali.common.jdbc.vendor.model.VendorDefault;
012 import org.kuali.common.jdbc.vendor.model.VendorSql;
013 import org.kuali.common.jdbc.vendor.model.keys.Admin;
014 import org.kuali.common.jdbc.vendor.model.keys.Basic;
015 import org.kuali.common.jdbc.vendor.model.keys.Dba;
016 import org.kuali.common.util.Assert;
017 import org.kuali.common.util.ReflectionUtils;
018 import org.kuali.common.util.spring.env.EnvironmentService;
019 import org.kuali.common.util.spring.env.model.EnvironmentKeySuffix;
020
021 public class DefaultDatabaseVendorService implements DatabaseVendorService {
022
023 public DefaultDatabaseVendorService(EnvironmentService env, VendorDefault vendorDefault) {
024 Assert.noNulls(env, vendorDefault);
025 this.env = env;
026 this.vendorDefault = vendorDefault;
027 }
028
029 private final EnvironmentService env;
030 private final VendorDefault vendorDefault;
031
032 @Override
033 public DatabaseVendor getDatabaseVendor() {
034 ConnectionContext dba = getDba();
035 Class<? extends Driver> driver = getDriver();
036 Properties sql = getSql();
037 AdminSql adminSql = getAdminSql(sql);
038 DbaSql dbaSql = getDbaSql(adminSql, sql);
039 VendorSql vendorSql = new VendorSql(adminSql, dbaSql, sql);
040 String url = getUrl(dba);
041 return new DatabaseVendor(vendorDefault, dba, url, driver, vendorSql);
042 }
043
044 protected String getUrl(ConnectionContext dba) {
045 String key = vendorDefault.getCode() + "." + Basic.URL.getValue();
046 String defaultValue = dba.getUrl();
047 String actualValue = env.getString(key, defaultValue);
048 return actualValue;
049 }
050
051 protected DbaSql getDbaSql(AdminSql adminSql, Properties sql) {
052 String before = getDbaBefore(vendorDefault.getCode() + "." + Dba.BEFORE.getValue(), adminSql, sql);
053 String after = getDbaAfter(vendorDefault.getCode() + "." + Dba.AFTER.getValue(), adminSql, sql);
054 return new DbaSql(before, after);
055 }
056
057 protected String getDbaBefore(String key, AdminSql adminSql, Properties sql) {
058 return env.getString(key, adminSql.getValidate() + adminSql.getDrop() + adminSql.getCreate());
059 }
060
061 protected String getDbaAfter(String key, AdminSql adminSql, Properties sql) {
062 return env.getString(key, adminSql.getValidate());
063 }
064
065 protected AdminSql getAdminSql(Properties sql) {
066 String validate = sql.getProperty(vendorDefault.getCode() + "." + Admin.VALIDATE.getValue());
067 String create = sql.getProperty(vendorDefault.getCode() + "." + Admin.CREATE.getValue());
068 String drop = sql.getProperty(vendorDefault.getCode() + "." + Admin.DROP.getValue());
069 return new AdminSql(validate, create, drop);
070 }
071
072 protected String getSql(String key, Properties sql) {
073 String defaultValue = sql.getProperty(key);
074 return env.getString(key, defaultValue);
075 }
076
077 protected Properties getSql() {
078 List<EnvironmentKeySuffix> suffixes = getSqlKeySuffixes();
079 Properties properties = new Properties();
080 for (EnvironmentKeySuffix suffix : suffixes) {
081 String key = vendorDefault.getCode() + "." + suffix.getValue();
082 String sql = env.getString(key);
083 properties.setProperty(key, sql);
084 }
085 return properties;
086 }
087
088 protected Class<? extends Driver> getDriver() {
089 String driver = env.getString(vendorDefault.getCode() + "." + Basic.DRIVER.getValue(), vendorDefault.getDriver());
090 return ReflectionUtils.getTypedClass(driver);
091 }
092
093 protected ConnectionContext getDba() {
094 String dbaUrl = env.getString(vendorDefault.getCode() + "." + Dba.URL.getValue(), vendorDefault.getDba().getUrl());
095 String dbaUsr = env.getString(vendorDefault.getCode() + "." + Dba.USERNAME.getValue(), vendorDefault.getDba().getCredentials().getUsername());
096 String dbaPwd = env.getString(vendorDefault.getCode() + "." + Dba.PASSWORD.getValue(), vendorDefault.getDba().getCredentials().getPassword());
097 return new ConnectionContext(dbaUrl, dbaUsr, dbaPwd);
098 }
099
100 protected List<EnvironmentKeySuffix> getSqlKeySuffixes() {
101 return Admin.asList();
102 }
103
104 public EnvironmentService getEnv() {
105 return env;
106 }
107
108 public VendorDefault getVendorDefault() {
109 return vendorDefault;
110 }
111
112 }