package org.dayatang.dsrouter.builder;
import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.lang.reflect.InvocationTargetException;
import java.sql.Driver;
import java.util.Map;
import java.util.Properties;
public abstract class AbstractDataSourceBuilder implements DataSourceBuilder {
/**
*
*/
private static final long serialVersionUID = -5389391685137579724L;
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractDataSourceBuilder.class);
protected abstract Class<? extends DataSource> getDataSourceClass();
protected abstract String getPasswordProperty();
protected abstract String getUserProperty();
protected abstract String getJdbcUrlProperty();
protected abstract String getDriverProperty();
protected abstract Class<? extends Driver> getDriverClass(String url);
protected abstract String getJdbcUrl(String url);
protected abstract Properties getDefaultProp();
@Override
public DataSource buildDataSource(Properties prop) {
if (prop == null) {
throw new IllegalArgumentException("datasource's prop is null.");
}
DataSource dataSource = null;
try {
dataSource = getDataSourceClass().newInstance();
debug("准备为【{}】构建数据源,prop=【{}】", new Object[] { getDataSourceClass(), prop });
// dataSource = new ComboPooledDataSource();
assembleProps(dataSource, prop);
} catch (Exception ex) {
ex.printStackTrace();
}
return dataSource;
}
@Override
public DataSource buildDataSource(String url, String username, String password, Properties prop) {
DataSource dataSource = null;
try {
dataSource = getDataSourceClass().newInstance();
debug("准备为【{}】构建数据源,url=【{}】,username=【{}】,password=【****】", new Object[] { getDataSourceClass(), url, username });
// dataSource = new ComboPooledDataSource();
assembleBasicProp(dataSource, url, username, password);
if (prop == null) {
assembleProps(dataSource, getDefaultProp());
} else {
assembleProps(dataSource, prop);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return dataSource;
}
protected void assembleBasicProp(DataSource dataSource, String url, String username, String password) throws IllegalAccessException,
InvocationTargetException {
debug("正在为数据源【{}】组装基础属性driverClass=【{}】,jdbcUrl=【{}】,user=【{}】,password=【****】", new Object[] { getDataSourceClass(),
getDriverClass(url).getName(), getJdbcUrl(url), username });
BeanUtils.setProperty(dataSource, getDriverProperty(), getDriverClass(url).getName());
BeanUtils.setProperty(dataSource, getJdbcUrlProperty(), getJdbcUrl(url));
BeanUtils.setProperty(dataSource, getUserProperty(), username);
BeanUtils.setProperty(dataSource, getPasswordProperty(), password);
}
private void assembleProps(DataSource dataSource, Properties properties) throws IllegalAccessException, InvocationTargetException {
if (properties == null) {
return;
}
for (Map.Entry<Object, Object> each : properties.entrySet()) {
debug("正在为数据源【{}】组装可选属性【{}】=【{}】", new Object[] { dataSource, each.getKey(), each.getValue() });
BeanUtils.setProperty(dataSource, (String) each.getKey(), each.getValue());
}
}
private void debug(String message, Object... params) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(message, params);
}
}
}