Skip to content

Commit 67f9a69

Browse files
committed
using @ConfigurationProperties for configuration access
1 parent c005a35 commit 67f9a69

File tree

9 files changed

+179
-178
lines changed

9 files changed

+179
-178
lines changed

grails-app/services/grails/plugins/mail/MailService.groovy

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,47 @@
1616
package grails.plugins.mail
1717

1818
import grails.config.Config
19-
import grails.core.support.GrailsConfigurationAware
2019
import groovy.transform.CompileStatic
2120
import groovy.util.logging.Slf4j
2221
import org.springframework.beans.factory.DisposableBean
2322
import org.springframework.beans.factory.InitializingBean
23+
import org.springframework.boot.context.properties.ConfigurationProperties
24+
import org.springframework.boot.context.properties.bind.Bindable
25+
import org.springframework.boot.context.properties.bind.Binder
26+
import org.springframework.boot.context.properties.source.ConfigurationPropertySource
27+
import org.springframework.boot.context.properties.source.ConfigurationPropertySources
28+
import org.springframework.core.env.PropertiesPropertySource
29+
import org.springframework.core.env.PropertySource
2430
import org.springframework.mail.MailMessage
2531

2632
import java.util.concurrent.LinkedBlockingQueue
2733
import java.util.concurrent.ThreadPoolExecutor
2834
import java.util.concurrent.TimeUnit
35+
2936
/**
3037
* Provides the entry point to the mail sending API.
3138
*/
3239
@Slf4j
3340
@CompileStatic
34-
class MailService implements InitializingBean, DisposableBean, GrailsConfigurationAware {
41+
class MailService implements InitializingBean, DisposableBean {
3542

3643
static transactional = false
3744

38-
MailConfig configuration
45+
MailConfigurationProperties mailConfigurationProperties
3946
MailMessageBuilderFactory mailMessageBuilderFactory
4047
ThreadPoolExecutor mailExecutorService
4148

4249
private static final Integer DEFAULT_POOL_SIZE = 5
4350

44-
MailMessage sendMail(MailConfig config, @DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = MailMessageBuilder) Closure callable) {
51+
private static final Bindable<MailConfigurationProperties> CONFIG_BINDABLE = Bindable.of(MailConfigurationProperties)
52+
53+
MailMessage sendMail(MailConfigurationProperties properties, @DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = MailMessageBuilder) Closure callable) {
4554
if (isDisabled()) {
4655
log.warn("Sending emails disabled by configuration option")
4756
return
4857
}
4958

50-
MailMessageBuilder messageBuilder = mailMessageBuilderFactory.createBuilder(config)
59+
MailMessageBuilder messageBuilder = mailMessageBuilderFactory.createBuilder(properties)
5160
callable.delegate = messageBuilder
5261
callable.resolveStrategy = Closure.DELEGATE_FIRST
5362
callable.call(messageBuilder)
@@ -56,28 +65,29 @@ class MailService implements InitializingBean, DisposableBean, GrailsConfigurati
5665
}
5766

5867
MailMessage sendMail(Config config, @DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = MailMessageBuilder) Closure callable) {
59-
return sendMail(new MailConfig(config), callable)
68+
return sendMail(toMailProperties(config), callable)
6069
}
6170

6271
MailMessage sendMail(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = MailMessageBuilder) Closure callable) {
63-
return sendMail(configuration, callable)
72+
return sendMail(mailConfigurationProperties, callable)
6473
}
6574

75+
private static MailConfigurationProperties toMailProperties(Config config) {
76+
PropertySource propertySource = new PropertiesPropertySource('mailProperties', config.toProperties())
77+
Iterable<ConfigurationPropertySource> configurationPropertySources = ConfigurationPropertySources.from(propertySource)
78+
Binder binder = new Binder(configurationPropertySources)
79+
return binder.bind(MailConfigurationProperties.PREFIX, CONFIG_BINDABLE).get()
80+
}
6681

6782
boolean isDisabled() {
68-
configuration.disabled
83+
mailConfigurationProperties.disabled
6984
}
7085

7186
void setPoolSize(Integer poolSize){
7287
mailExecutorService.setMaximumPoolSize(poolSize ?: DEFAULT_POOL_SIZE)
7388
mailExecutorService.setCorePoolSize(poolSize ?: DEFAULT_POOL_SIZE)
7489
}
7590

76-
@Override
77-
void setConfiguration(Config config) {
78-
configuration = new MailConfig(config)
79-
}
80-
8191
@Override
8292
public void destroy() throws Exception {
8393
mailExecutorService.shutdown()
@@ -88,7 +98,7 @@ class MailService implements InitializingBean, DisposableBean, GrailsConfigurati
8898
public void afterPropertiesSet() throws Exception {
8999
mailExecutorService = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>())
90100

91-
Integer poolSize = configuration.poolSize
101+
Integer poolSize = mailConfigurationProperties.poolSize
92102
try{
93103
((ThreadPoolExecutor)mailExecutorService).allowCoreThreadTimeOut(true)
94104
}catch(MissingMethodException e){

src/integration-test/groovy/grails/plugins/mail/MailServiceSpec.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class MailServiceSpec extends Specification {
6969
)
7070
mimeCapableMailService = new MailService(
7171
mailMessageBuilderFactory: mimeMessageBuilderFactor,
72-
configuration: grailsApplication.config)
72+
mailConfigurationProperties: new MailConfigurationProperties())
7373
mimeCapableMailService.afterPropertiesSet()
7474

7575
MailSender simpleMailSender = new SimpleMailSender()
@@ -79,7 +79,7 @@ class MailServiceSpec extends Specification {
7979
)
8080
nonMimeCapableMailService = new MailService(
8181
mailMessageBuilderFactory: simpleMessageBuilderFactory,
82-
configuration: grailsApplication.config)
82+
mailConfigurationProperties: new MailConfigurationProperties())
8383
nonMimeCapableMailService.afterPropertiesSet()
8484
}
8585

src/main/groovy/grails/plugins/mail/MailConfig.groovy

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package grails.plugins.mail
2+
3+
import grails.core.GrailsApplication
4+
import grails.plugins.GrailsPluginManager
5+
import grails.web.pages.GroovyPagesUriService
6+
import groovy.transform.CompileStatic
7+
import org.grails.gsp.GroovyPagesTemplateEngine
8+
import org.springframework.beans.factory.annotation.Autowired
9+
import org.springframework.beans.factory.annotation.Qualifier
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
12+
import org.springframework.context.annotation.Bean
13+
import org.springframework.context.annotation.Configuration
14+
import org.springframework.jndi.JndiObjectFactoryBean
15+
import org.springframework.mail.MailSender
16+
import org.springframework.mail.javamail.JavaMailSenderImpl
17+
18+
import javax.mail.Session
19+
20+
@Configuration
21+
@CompileStatic
22+
class MailConfiguration {
23+
24+
@Bean
25+
MailConfigurationProperties mailConfigurationProperties() {
26+
return new MailConfigurationProperties()
27+
}
28+
29+
@Bean
30+
@ConditionalOnMissingBean(name = 'mailSession')
31+
@ConditionalOnProperty(prefix = 'grails.mail', name = 'jndiName')
32+
JndiObjectFactoryBean mailSession(MailConfigurationProperties mailProperties) {
33+
JndiObjectFactoryBean factory = new JndiObjectFactoryBean()
34+
factory.jndiName = mailProperties.jndiName
35+
return factory
36+
}
37+
38+
@Bean
39+
JavaMailSenderImpl mailSender(
40+
@Autowired(required = false) @Qualifier('mailSession') Session mailSession,
41+
MailConfigurationProperties mailProperties) {
42+
43+
JavaMailSenderImpl mailSender = new JavaMailSenderImpl()
44+
if (mailProperties.host) {
45+
mailSender.host = mailProperties.host
46+
} else if (!mailProperties.jndiName) {
47+
def envHost = System.getenv()['SMTP_HOST']
48+
if (envHost) {
49+
mailSender.host = envHost
50+
} else {
51+
mailSender.host = 'localhost'
52+
}
53+
}
54+
if (mailProperties.encoding) {
55+
mailSender.defaultEncoding = mailProperties.encoding
56+
} else if (!mailProperties.jndiName) {
57+
mailSender.defaultEncoding = 'utf-8'
58+
}
59+
if (mailSession != null) {
60+
mailSender.session = mailSession
61+
}
62+
if (mailProperties.port) {
63+
mailSender.port = mailProperties.port
64+
}
65+
if (mailProperties.username) {
66+
mailSender.username = mailProperties.username
67+
}
68+
if (mailProperties.password) {
69+
mailSender.password = mailProperties.password
70+
}
71+
if (mailProperties.protocol) {
72+
mailSender.protocol = mailProperties.protocol
73+
}
74+
if (mailProperties.props) {
75+
mailSender.javaMailProperties = mailProperties.props
76+
}
77+
return mailSender
78+
}
79+
80+
@Bean
81+
MailMessageBuilderFactory mailMessageBuilderFactory(
82+
MailSender mailSender,
83+
MailMessageContentRenderer mailMessageContentRenderer) {
84+
MailMessageBuilderFactory factory = new MailMessageBuilderFactory()
85+
factory.mailSender = mailSender
86+
factory.mailMessageContentRenderer = mailMessageContentRenderer
87+
return factory
88+
}
89+
90+
@Bean
91+
MailMessageContentRenderer mailMessageContentRenderer(
92+
GroovyPagesTemplateEngine groovyPagesTemplateEngine,
93+
GroovyPagesUriService groovyPagesUriService,
94+
GrailsApplication grailsApplication,
95+
GrailsPluginManager pluginManager) {
96+
MailMessageContentRenderer renderer = new MailMessageContentRenderer()
97+
renderer.groovyPagesTemplateEngine = groovyPagesTemplateEngine
98+
renderer.groovyPagesUriService = groovyPagesUriService
99+
renderer.grailsApplication = grailsApplication
100+
renderer.pluginManager = pluginManager
101+
return renderer
102+
}
103+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package grails.plugins.mail
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties
4+
5+
@ConfigurationProperties(MailConfigurationProperties.PREFIX)
6+
class MailConfigurationProperties {
7+
8+
public static final String PREFIX = 'grails.mail'
9+
10+
boolean disabled
11+
String overrideAddress
12+
Defaults defaults = new Defaults()
13+
14+
Integer poolSize
15+
String encoding
16+
String jndiName
17+
String protocol
18+
String host
19+
Integer port
20+
String username
21+
String password
22+
Properties props
23+
24+
/**
25+
* We can't use 'default' as a groovy property name as it is a reserved keyword.
26+
* But it is possible to define a getter for it to make it compatible.
27+
*/
28+
Defaults getDefault() {
29+
return defaults
30+
}
31+
32+
static class Defaults {
33+
String from
34+
String to
35+
}
36+
}

0 commit comments

Comments
 (0)