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    }