package org.hsweb.web.service.impl; import org.hsweb.ezorm.core.ObjectWrapperFactory; import org.hsweb.ezorm.core.ValidatorFactory; import org.hsweb.ezorm.rdb.RDBDatabase; import org.hsweb.ezorm.rdb.executor.SqlExecutor; import org.hsweb.ezorm.rdb.meta.RDBDatabaseMetaData; import org.hsweb.ezorm.rdb.meta.parser.H2TableMetaParser; import org.hsweb.ezorm.rdb.meta.parser.MysqlTableMetaParser; import org.hsweb.ezorm.rdb.meta.parser.OracleTableMetaParser; import org.hsweb.ezorm.rdb.meta.parser.TableMetaParser; import org.hsweb.ezorm.rdb.render.dialect.H2RDBDatabaseMetaData; import org.hsweb.ezorm.rdb.render.dialect.MysqlRDBDatabaseMetaData; import org.hsweb.ezorm.rdb.render.dialect.OracleRDBDatabaseMetaData; import org.hsweb.ezorm.rdb.simple.SimpleDatabase; import org.hsweb.web.core.authorize.ExpressionScopeBean; import org.hsweb.web.core.datasource.DataSourceHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; @Configuration @AutoConfigureOrder public class DataBaseAutoConfiguration { @Resource private SqlExecutor sqlExecutor; @Autowired(required = false) private ValidatorFactory validatorFactory; @Autowired(required = false) private ObjectWrapperFactory objectWrapperFactory; @Autowired(required = false) private Map<String, ExpressionScopeBean> expressionScopeBeanMap; @Bean @ConditionalOnMissingBean(TableMetaParser.class) public TableMetaParser tableMetaParser() { return DataSourceHolder.getActiveDatabaseType().getDialect().getDefaultParser(sqlExecutor); } @Bean public RDBDatabase database(javax.sql.DataSource dataSource) throws SQLException { DataSourceHolder holder = new DataSourceHolder(); holder.init(dataSource); RDBDatabaseMetaData dataBaseMetaData; switch (DataSourceHolder.getDefaultDatabaseType()) { case mysql: dataBaseMetaData = new MysqlRDBDatabaseMetaData(); break; case oracle: dataBaseMetaData = new OracleRDBDatabaseMetaData(); break; case h2: dataBaseMetaData = new H2RDBDatabaseMetaData(); break; default: dataBaseMetaData = new H2RDBDatabaseMetaData(); break; } if (objectWrapperFactory != null) dataBaseMetaData.setObjectWrapperFactory(objectWrapperFactory); if (validatorFactory != null) dataBaseMetaData.setValidatorFactory(validatorFactory); dataBaseMetaData.init(); SimpleDatabase dataBase = new SimpleDatabase(dataBaseMetaData, sqlExecutor) { @Override public Map<String, Object> getTriggerContextRoot() { if (expressionScopeBeanMap != null) return new HashMap<>(expressionScopeBeanMap); return super.getTriggerContextRoot(); } }; return dataBase; } }