package com.revolsys.collection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.jdbc.JdbcUtils;
import com.revolsys.logging.Logs;
import com.revolsys.spring.config.BeanConfigurrer;
import com.revolsys.util.Property;
public class DatabaseBeanConfigurator extends BeanConfigurrer {
private DataSource dataSource;
private String propertyColumnName;
private String tableName;
private String typeColumnName;
private String valueColumnName;
private String whereClause;
public DatabaseBeanConfigurator() {
setOrder(LOWEST_PRECEDENCE - 500);
}
public DataSource getDataSource() {
return this.dataSource;
}
public String getPropertyColumnName() {
return this.propertyColumnName;
}
public String getTableName() {
return this.tableName;
}
public String getTypeColumnName() {
return this.typeColumnName;
}
public String getValueColumnName() {
return this.valueColumnName;
}
public String getWhereClause() {
return this.whereClause;
}
@Override
public void postProcessBeanFactory(final ConfigurableListableBeanFactory beanFactory)
throws BeansException {
try {
final boolean hasTypeColumnName = Property.hasValue(this.typeColumnName);
String sql = "SELECT " + this.propertyColumnName + ", " + this.valueColumnName;
if (hasTypeColumnName) {
sql += ", " + this.typeColumnName;
}
sql += " FROM " + JdbcUtils.getQualifiedTableName(this.tableName);
if (Property.hasValue(this.whereClause)) {
sql += " WHERE " + this.whereClause;
}
final Connection connection = this.dataSource.getConnection();
try {
final PreparedStatement statement = connection.prepareStatement(sql);
try {
final ResultSet resultSet = statement.executeQuery();
try {
while (resultSet.next()) {
final String property = resultSet.getString(1);
final String valueString = resultSet.getString(2);
String typePath = "string";
if (hasTypeColumnName) {
typePath = resultSet.getString(3);
}
final DataType dataType = DataTypes.getDataType(typePath);
Object value = valueString;
if (dataType != null) {
value = dataType.toObject(valueString);
}
setAttribute(property, value);
}
} finally {
JdbcUtils.close(resultSet);
}
} finally {
JdbcUtils.close(statement);
}
} finally {
JdbcUtils.release(connection, this.dataSource);
}
} catch (final Throwable e) {
Logs.error(this, "Unable to load configuration from database ", e);
} finally {
super.postProcessBeanFactory(beanFactory);
}
}
public void setDataSource(final DataSource dataSource) {
this.dataSource = dataSource;
}
public void setPropertyColumnName(final String propertyColumnName) {
this.propertyColumnName = propertyColumnName;
}
public void setTableName(final String tableName) {
this.tableName = tableName;
}
public void setTypeColumnName(final String typeColumnName) {
this.typeColumnName = typeColumnName;
}
public void setValueColumnName(final String valueColumnName) {
this.valueColumnName = valueColumnName;
}
public void setWhereClause(final String whereClause) {
this.whereClause = whereClause;
}
}