br.com.valecard.config.MainConfig.java Source code

Java tutorial

Introduction

Here is the source code for br.com.valecard.config.MainConfig.java

Source

/*
 * The License
 *
 * Copyright 2014 Marcos O. Junqueira <marcos.junqueira at gmail.com>.
 *
 * This file is part of schedule-app and can not be copied and/or 
 * distributed without the express permission of Marcos O. Junqueira <marcos.junqueira at gmail.com>.
 */
package br.com.valecard.config;

import br.com.valecard.context.event.ChoiceTaskExecutorApplicationEventMulticaster;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.core.env.Environment;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaRepositories(basePackages = "br.com.valecard.repositories")
@EnableTransactionManagement
@ComponentScan(basePackages = { "br.com.valecard.controllers", "br.com.valecard.services",
        "br.com.valecard.services.security.impl", "br.com.valecard.repositories",
        "br.com.valecard.repositories.events", "br.com.valecard.listeners",
        "br.com.valecard.context.event" }, excludeFilters = { @ComponentScan.Filter(Configuration.class) })
@PropertySource("classpath:application.properties")
@Import(RepositoryRestMvcConfiguration.class)
public class MainConfig extends RepositoryRestMvcConfiguration {

    @Autowired
    private Environment environment;

    @Bean
    public DataSource dataSource() {
        //Abaixo est configurado para obter propriedades do sistema que podem 
        //ser passadas via opo -Dprop=value do java
        //entretando pode ser configurado de diversas maneiras
        //        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        //        dataSource.setDriverClassName(environment.getProperty("database.driverClassName"));
        //        String url = environment.getProperty("MYSQL_URL_AGENDOO");
        //        if (url.startsWith("mysql://")) {//ajuste para cloudbees funcionar
        //            url = "jdbc:" + url;
        //        }
        //        dataSource.setUrl(url);
        //        dataSource.setUsername(environment.getProperty("MYSQL_USERNAME_AGENDOO"));
        //        dataSource.setPassword(environment.getProperty("MYSQL_PASSWORD_AGENDOO"));
        //        LOG.info("Inicializando datasource: " + dataSource.getUrl());
        //        return dataSource;
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.HSQL).build();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setDatabase(Database.MYSQL);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("br.com.valecard.model");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();

        return factory.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {

        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public JavaMailSender mailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.auth", environment.getProperty("mail.smtp.auth"));
        properties.setProperty("mail.smtp.starttls.enable", environment.getProperty("mail.smtp.starttls.enable"));

        mailSender.setHost(environment.getProperty("mail.host"));
        mailSender.setPort(environment.getProperty("mail.port", Integer.class));
        mailSender.setUsername(environment.getProperty("mail.username"));
        mailSender.setPassword(environment.getProperty("mail.password"));

        mailSender.setJavaMailProperties(properties);

        return mailSender;
    }

    @Bean
    public ApplicationEventMulticaster applicationEventMulticaster() {
        //Implementao prpria para execuo de evento de acordo com o tipo, 
        //se for um evento de repositrio executa sincronamente 
        //se for outro tipo de evento executa assincronamente
        final ChoiceTaskExecutorApplicationEventMulticaster multicaster = new ChoiceTaskExecutorApplicationEventMulticaster();
        multicaster.setTaskExecutor(taskExecutor());
        return multicaster;
    }

    @Bean
    public TaskExecutor taskExecutor() {
        return new SimpleAsyncTaskExecutor();
    }

    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        //configurao para exposio dos repositorios como api json+halC
        try {
            config.setBaseUri(new URI("/data"));
        } catch (URISyntaxException ex) {
            LOG.log(Level.WARNING, "No foi possvel configurar a URI da API JSON.", ex);
        }
    }

    private static final Logger LOG = Logger.getLogger(MainConfig.class.getName());

}