package fr.sii.ogham.spring.autoconfigure; import java.util.Arrays; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration; import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration; import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import fr.sii.ogham.core.builder.MessagingBuilder; import fr.sii.ogham.core.service.MessagingService; import fr.sii.ogham.core.template.parser.TemplateParser; import fr.sii.ogham.spring.config.FreeMarkerConfigurer; import fr.sii.ogham.spring.config.MessagingBuilderConfigurer; import fr.sii.ogham.spring.config.NoTemplateEngineConfigurer; import fr.sii.ogham.spring.config.ThymeLeafConfigurer; import fr.sii.ogham.spring.env.SpringEnvironmentPropertyResolver; import freemarker.template.TemplateExceptionHandler; /** * <p> * Spring Boot auto-configuration module for Ogham messaging library. * </p> * * It links Ogham with Spring beans: * <ul> * <li>Use SpringTemplateEngine instead of default Thymeleaf * TemplateEngine</li> * </ul> * * * @author Aurélien Baudet */ @Configuration @AutoConfigureAfter({ WebMvcAutoConfiguration.class, ThymeleafAutoConfiguration.class, FreeMarkerAutoConfiguration.class }) @ConditionalOnMissingBean(MessagingService.class) public class OghamAutoConfiguration { @Autowired Environment environment; /** * Configures the Messaging service and the {@link TemplateParser}. A * ThymeLeaf parser will be configured. If we find SpringTemplateEngine, we * will set it as its template engine implementation. If we find a * FreeMarker configuration already configured by spring-boot, we will add a * FreeMarker parser. * * @param builder * The builder used to create the messaging service * * @return A configured messaging service */ @Bean public MessagingService messagingService(MessagingBuilder builder) { return builder.build(); } @Bean public MessagingBuilder defaultMessagingBuilder(List<MessagingBuilderConfigurer> configurers) { MessagingBuilder builder = new MessagingBuilder().useAllDefaults(new SpringEnvironmentPropertyResolver(environment)); for (MessagingBuilderConfigurer configurer : configurers) { configurer.configure(builder); } return builder; } @Configuration @ConditionalOnMissingClass({"freemarker.template.Configuration", "org.thymeleaf.spring4.SpringTemplateEngine"}) public static class OghamNoTemplateEngineConfiguration { @Bean public List<MessagingBuilderConfigurer> defaultMessagingBuilderConfigurer() { return Arrays.<MessagingBuilderConfigurer>asList(new NoTemplateEngineConfigurer()); } } @Configuration @ConditionalOnClass(freemarker.template.Configuration.class) public static class OghamFreemarkerConfiguration { @Bean @Qualifier("email") @ConditionalOnMissingBean(name="emailFreemarkerConfiguration") public freemarker.template.Configuration emailFreemarkerConfiguration() { freemarker.template.Configuration configuration = new freemarker.template.Configuration(); configuration.setDefaultEncoding("UTF-8"); configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // configuration.setLogTemplateExceptions(false); return configuration; } @Bean @Qualifier("sms") @ConditionalOnMissingBean(name="smsFreemarkerConfiguration") public freemarker.template.Configuration smsFreemarkerConfiguration() { freemarker.template.Configuration configuration = new freemarker.template.Configuration(); configuration.setDefaultEncoding("UTF-8"); configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // configuration.setLogTemplateExceptions(false); return configuration; } @Bean @ConditionalOnMissingBean(FreeMarkerConfigurer.class) public FreeMarkerConfigurer freemarkerConfigurer(@Qualifier("email") freemarker.template.Configuration emailFreemarkerConfiguration, @Qualifier("sms") freemarker.template.Configuration smsFreemarkerConfiguration) { return new FreeMarkerConfigurer(emailFreemarkerConfiguration, smsFreemarkerConfiguration); } } @Configuration @ConditionalOnClass(org.thymeleaf.spring4.SpringTemplateEngine.class) public static class OghamThymeleafConfiguration { @Bean @ConditionalOnMissingBean(ThymeLeafConfigurer.class) public ThymeLeafConfigurer thymeleafConfigurer(org.thymeleaf.spring4.SpringTemplateEngine springTemplateEngine) { return new ThymeLeafConfigurer(springTemplateEngine); } } }