package com.mossle.core.jdbc;
import java.sql.SQLException;
import com.mossle.core.mapper.BeanMapper;
import net.sf.log4jdbc.Log4jdbcProxyDataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* dataSource wrapper.
*
* @author Lingo
*/
public class DataSourceWrapper extends DataSourceProxy {
/** logger. */
private static Logger logger = LoggerFactory
.getLogger(DataSourceWrapper.class);
private BasicDataSource basicDataSource;
private Log4jdbcProxyDataSource log4jdbcProxyDataSource;
private boolean log4jdbcEnabled;
private Throwable throwable;
private DataSourceInfo dataSourceInfo;
public DataSourceWrapper(DataSourceInfo dataSourceInfo) {
this.dataSourceInfo = dataSourceInfo;
}
public void init() {
this.basicDataSource = createBasicDataSource();
dataSourceInfo.validate();
new BeanMapper().copy(dataSourceInfo, basicDataSource);
try {
new DataSourceChecker().check(basicDataSource);
} catch (SQLException ex) {
logger.warn(ex.getMessage(), ex);
throwable = ex;
}
this.log4jdbcProxyDataSource = new Log4jdbcProxyDataSource(
this.basicDataSource);
if (this.log4jdbcEnabled) {
logger.debug("enable log4jdbc");
this.setTargetDataSource(this.log4jdbcProxyDataSource);
} else {
logger.debug("disable log4jdbc");
this.setTargetDataSource(this.basicDataSource);
}
}
// ~ ======================================================================
public void enableLog4jdbc() {
if (!this.log4jdbcEnabled) {
this.log4jdbcEnabled = true;
this.setTargetDataSource(this.log4jdbcProxyDataSource);
logger.info("enable log4jdbc");
} else {
logger.info("log4jdbc already enabled");
}
}
public void disableLog4jdbc() {
if (this.log4jdbcEnabled) {
this.log4jdbcEnabled = false;
this.setTargetDataSource(this.basicDataSource);
logger.info("disable log4jdbc");
} else {
logger.info("log4jdbc already disabled");
}
}
public boolean isLog4jdbcEnabled() {
return log4jdbcEnabled;
}
public void setLog4jdbcEnabled(boolean log4jdbcEnabled) {
this.log4jdbcEnabled = log4jdbcEnabled;
}
protected BasicDataSource createBasicDataSource() {
return new BasicDataSource();
}
public Throwable getThrowable() {
return throwable;
}
public BasicDataSource getBasicDataSource() {
return basicDataSource;
}
// ~ ======================================================================
public void close() {
if (basicDataSource != null) {
try {
basicDataSource.close();
basicDataSource = null;
log4jdbcProxyDataSource = null;
} catch (SQLException ex) {
logger.info("close db error", ex);
}
}
throwable = null;
}
public void restart() {
this.close();
this.init();
}
}