1 package org.kuali.common.jdbc.vendor.service; 2 3 import java.sql.Driver; 4 import java.util.List; 5 import java.util.Properties; 6 7 import org.kuali.common.jdbc.model.context.ConnectionContext; 8 import org.kuali.common.jdbc.sql.model.AdminSql; 9 import org.kuali.common.jdbc.sql.model.DbaSql; 10 import org.kuali.common.jdbc.vendor.model.DatabaseVendor; 11 import org.kuali.common.jdbc.vendor.model.VendorDefault; 12 import org.kuali.common.jdbc.vendor.model.VendorSql; 13 import org.kuali.common.jdbc.vendor.model.keys.Admin; 14 import org.kuali.common.jdbc.vendor.model.keys.Basic; 15 import org.kuali.common.jdbc.vendor.model.keys.Dba; 16 import org.kuali.common.util.Assert; 17 import org.kuali.common.util.ReflectionUtils; 18 import org.kuali.common.util.spring.env.EnvironmentService; 19 import org.kuali.common.util.spring.env.model.EnvironmentKeySuffix; 20 21 public class DefaultDatabaseVendorService implements DatabaseVendorService { 22 23 public DefaultDatabaseVendorService(EnvironmentService env, VendorDefault vendorDefault) { 24 Assert.noNulls(env, vendorDefault); 25 this.env = env; 26 this.vendorDefault = vendorDefault; 27 } 28 29 private final EnvironmentService env; 30 private final VendorDefault vendorDefault; 31 32 @Override 33 public DatabaseVendor getDatabaseVendor() { 34 ConnectionContext dba = getDba(); 35 Class<? extends Driver> driver = getDriver(); 36 Properties sql = getSql(); 37 AdminSql adminSql = getAdminSql(sql); 38 DbaSql dbaSql = getDbaSql(adminSql, sql); 39 VendorSql vendorSql = new VendorSql(adminSql, dbaSql, sql); 40 String url = getUrl(dba); 41 return new DatabaseVendor(vendorDefault, dba, url, driver, vendorSql); 42 } 43 44 protected String getUrl(ConnectionContext dba) { 45 String key = vendorDefault.getCode() + "." + Basic.URL.getValue(); 46 String defaultValue = dba.getUrl(); 47 String actualValue = env.getString(key, defaultValue); 48 return actualValue; 49 } 50 51 protected DbaSql getDbaSql(AdminSql adminSql, Properties sql) { 52 String before = getDbaBefore(vendorDefault.getCode() + "." + Dba.BEFORE.getValue(), adminSql, sql); 53 String after = getDbaAfter(vendorDefault.getCode() + "." + Dba.AFTER.getValue(), adminSql, sql); 54 return new DbaSql(before, after); 55 } 56 57 protected String getDbaBefore(String key, AdminSql adminSql, Properties sql) { 58 return env.getString(key, adminSql.getValidate() + adminSql.getDrop() + adminSql.getCreate()); 59 } 60 61 protected String getDbaAfter(String key, AdminSql adminSql, Properties sql) { 62 return env.getString(key, adminSql.getValidate()); 63 } 64 65 protected AdminSql getAdminSql(Properties sql) { 66 String validate = sql.getProperty(vendorDefault.getCode() + "." + Admin.VALIDATE.getValue()); 67 String create = sql.getProperty(vendorDefault.getCode() + "." + Admin.CREATE.getValue()); 68 String drop = sql.getProperty(vendorDefault.getCode() + "." + Admin.DROP.getValue()); 69 return new AdminSql(validate, create, drop); 70 } 71 72 protected String getSql(String key, Properties sql) { 73 String defaultValue = sql.getProperty(key); 74 return env.getString(key, defaultValue); 75 } 76 77 protected Properties getSql() { 78 List<EnvironmentKeySuffix> suffixes = getSqlKeySuffixes(); 79 Properties properties = new Properties(); 80 for (EnvironmentKeySuffix suffix : suffixes) { 81 String key = vendorDefault.getCode() + "." + suffix.getValue(); 82 String sql = env.getString(key); 83 properties.setProperty(key, sql); 84 } 85 return properties; 86 } 87 88 protected Class<? extends Driver> getDriver() { 89 String driver = env.getString(vendorDefault.getCode() + "." + Basic.DRIVER.getValue(), vendorDefault.getDriver()); 90 return ReflectionUtils.getTypedClass(driver); 91 } 92 93 protected ConnectionContext getDba() { 94 String dbaUrl = env.getString(vendorDefault.getCode() + "." + Dba.URL.getValue(), vendorDefault.getDba().getUrl()); 95 String dbaUsr = env.getString(vendorDefault.getCode() + "." + Dba.USERNAME.getValue(), vendorDefault.getDba().getCredentials().getUsername()); 96 String dbaPwd = env.getString(vendorDefault.getCode() + "." + Dba.PASSWORD.getValue(), vendorDefault.getDba().getCredentials().getPassword()); 97 return new ConnectionContext(dbaUrl, dbaUsr, dbaPwd); 98 } 99 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 }