/**
 * Company
 * Copyright (C) 2014-2017 All Rights Reserved.
 */
package com.bootcwenao.esserver.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * @author cwenao
 * @version $Id DataConfig.java, v 0.1 2017-01-24 17:43 cwenao Exp $$
 */

@Configuration
@EnableTransactionManagement
public class DataConfig {
    Logger logger = LoggerFactory.getLogger(DataConfig.class);

    @Bean
    public ServletRegistrationBean druidServlet() {
        return new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
    }

    @Bean(name = "dataSource",initMethod = "init", destroyMethod = "close")
    public DataSource druidDataSource(@Value("${druid.datasource.driverClassName}") String driver,
                                      @Value("${druid.datasource.url}") String url, @Value("${druid.datasource.username}") String username,
                                      @Value("${druid.datasource.password}") String password,
                                      @Value("${druid.datasource.initialSize}") Integer initialSize,
                                      @Value("${druid.datasource.minIdle}") Integer minIdle,
                                      @Value("${druid.datasource.maxActive}") Integer maxActive) {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        druidDataSource.setValidationQuery("SELECT * FROM DUAL");
        druidDataSource.setPoolPreparedStatements(false);
        try {
            druidDataSource.setFilters("stat");
        } catch (SQLException e1) {
            logger.error("setFilters error", e1);
        }
        try {
            druidDataSource.setFilters("stat, wall");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return druidDataSource;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer bean = new MapperScannerConfigurer();
        bean.setBasePackage("com.bootcwenao.esserver.mapper");
        return bean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}