Skip to content

Commit 3ffe012

Browse files
committed
Commons Email: code cleanup
1 parent b555bd4 commit 3ffe012

3 files changed

Lines changed: 133 additions & 64 deletions

File tree

modules/jooby-commons-email/src/main/java/io/jooby/email/CommonsEmailModule.java

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
package io.jooby.email;
77

88
import com.typesafe.config.Config;
9+
import com.typesafe.config.ConfigException;
10+
import com.typesafe.config.ConfigException.Missing;
911
import com.typesafe.config.ConfigFactory;
1012
import io.jooby.Extension;
1113
import io.jooby.Jooby;
1214
import io.jooby.ServiceKey;
1315
import io.jooby.ServiceRegistry;
14-
import io.jooby.internal.email.HtmlEmailProvider;
15-
import io.jooby.internal.email.ImageHtmlEmailProvider;
16-
import io.jooby.internal.email.MultiPartEmailProvider;
17-
import io.jooby.internal.email.SimpleEmailProvider;
16+
import io.jooby.internal.email.EmailFactory;
1817
import org.apache.commons.mail.Email;
1918
import org.apache.commons.mail.HtmlEmail;
2019
import org.apache.commons.mail.ImageHtmlEmail;
@@ -23,9 +22,7 @@
2322

2423
import javax.annotation.Nonnull;
2524
import javax.inject.Provider;
26-
27-
import java.util.HashMap;
28-
import java.util.Map;
25+
import java.util.stream.Stream;
2926

3027
import static java.util.Objects.requireNonNull;
3128

@@ -91,29 +88,36 @@ public CommonsEmailModule() {
9188
}
9289

9390
@Override
94-
public void install(@Nonnull Jooby application) throws Exception {
95-
Config appConfig = application.getConfig();
96-
97-
Config mail = appConfig.getConfig(name)
98-
.withFallback(appConfig.getConfig("mail"))
99-
.withFallback(defaults(appConfig));
91+
public void install(@Nonnull Jooby application) {
92+
Config config = mailConfig(application.getConfig(), name);
10093

10194
ServiceRegistry services = application.getServices();
10295

103-
register(services, SimpleEmail.class, new SimpleEmailProvider(mail));
104-
register(services, HtmlEmail.class, new HtmlEmailProvider(mail));
105-
register(services, MultiPartEmail.class, new MultiPartEmailProvider(mail));
106-
register(services, ImageHtmlEmail.class, new ImageHtmlEmailProvider(mail));
96+
EmailFactory factory = new EmailFactory(config);
97+
98+
register(services, SimpleEmail.class, factory::newSimpleEmail);
99+
register(services, HtmlEmail.class, factory::newHtmlEmail);
100+
register(services, MultiPartEmail.class, factory::newMultiPartEmail);
101+
register(services, ImageHtmlEmail.class, factory::newImageHtmlEmail);
102+
}
103+
104+
static Config mailConfig(Config config, String name) {
105+
Config mail = Stream.of(name, "mail")
106+
.distinct()
107+
.filter(config::hasPath)
108+
.map(config::getConfig)
109+
.reduce(Config::withFallback)
110+
.orElseThrow(() -> new Missing(Stream.of(name, "mail").distinct().findFirst().get()));
111+
112+
mail = mail.withFallback(ConfigFactory.empty()
113+
.withValue("charset", config.getValue("application.charset"))
114+
);
115+
return mail;
107116
}
108117

109118
private <T> void register(ServiceRegistry services, Class<T> clazz, Provider<T> provider) {
110119
services.putIfAbsent(clazz, provider);
111120
services.put(ServiceKey.key(clazz, name), provider);
112121
}
113122

114-
private Config defaults(Config appConfig) {
115-
final Map<String, Object> defaults = new HashMap<>();
116-
defaults.put("charset", appConfig.getString("application.charset"));
117-
return ConfigFactory.parseMap(defaults, CommonsEmailModule.class.getSimpleName() + "#defaults(...)");
118-
}
119123
}

modules/jooby-commons-email/src/main/java/io/jooby/internal/email/EmailFactory.java

Lines changed: 54 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@
66
package io.jooby.internal.email;
77

88
import com.typesafe.config.Config;
9+
import io.jooby.SneakyThrows;
910
import org.apache.commons.mail.Email;
1011
import org.apache.commons.mail.HtmlEmail;
12+
import org.apache.commons.mail.ImageHtmlEmail;
13+
import org.apache.commons.mail.MultiPartEmail;
14+
import org.apache.commons.mail.SimpleEmail;
1115

1216
import javax.mail.internet.AddressException;
1317
import javax.mail.internet.InternetAddress;
@@ -20,53 +24,61 @@
2024

2125
public class EmailFactory {
2226

23-
private interface EmailSetter {
24-
void apply(String p) throws Exception;
25-
}
26-
2727
private final Config mail;
2828

2929
public EmailFactory(final Config mail) {
3030
this.mail = requireNonNull(mail, "Mail config is required.");
3131
}
3232

33+
public SimpleEmail newSimpleEmail() {
34+
return newEmail(new SimpleEmail());
35+
}
36+
37+
public HtmlEmail newHtmlEmail() {
38+
return newEmail(new HtmlEmail());
39+
}
40+
41+
public MultiPartEmail newMultiPartEmail() {
42+
return newEmail(new MultiPartEmail());
43+
}
44+
45+
public ImageHtmlEmail newImageHtmlEmail() {
46+
return newEmail(new ImageHtmlEmail());
47+
}
48+
3349
public <T extends Email> T newEmail(final T email) {
34-
try {
35-
ifset("username", p -> email.setAuthentication(mail.getString(p), mail.getString("password")));
36-
37-
ifset("bcc", p -> email.setBcc(address(strList(p))));
38-
ifset("bounceAddress", p -> email.setBounceAddress(mail.getString(p)));
39-
ifset("cc", p -> email.setCc(address(strList(p))));
40-
email.setCharset(mail.getString("charset"));
41-
ifset("debug", p -> email.setDebug(mail.getBoolean(p)));
42-
ifset("from", p -> email.setFrom(mail.getString(p)));
43-
ifset("hostName", p -> email.setHostName(mail.getString(p)));
44-
ifset("msg", p -> {
45-
if (email instanceof HtmlEmail) {
46-
((HtmlEmail) email).setHtmlMsg(mail.getString(p));
47-
} else {
48-
email.setMsg(mail.getString(p));
49-
}
50-
});
51-
ifset("replyTo", p -> email.setReplyTo(address(mail.getStringList(p))));
52-
ifset("sendPartial", p -> email.setSendPartial(mail.getBoolean(p)));
53-
ifset("smtpPort", p -> email.setSmtpPort(mail.getInt(p)));
54-
ifset("socketConnectionTimeout",
55-
p -> email.setSocketConnectionTimeout((int) mail.getDuration(p, TimeUnit.MILLISECONDS)));
56-
ifset("socketTimeout",
57-
p -> email.setSocketTimeout((int) mail.getDuration(p, TimeUnit.MILLISECONDS)));
58-
ifset("ssl.checkServerIdentity", p -> email.setSSLCheckServerIdentity(mail.getBoolean(p)));
59-
ifset("ssl.onConnect", p -> email.setSSLOnConnect(mail.getBoolean(p)));
60-
ifset("ssl.smtpPort", p -> email.setSslSmtpPort(mail.getString(p)));
61-
ifset("startTLSEnabled", p -> email.setStartTLSEnabled(mail.getBoolean(p)));
62-
ifset("startTLSRequired", p -> email.setStartTLSRequired(mail.getBoolean(p)));
63-
ifset("subject", p -> email.setSubject(mail.getString(p)));
64-
ifset("to", p -> email.setTo(address(strList(p))));
65-
66-
return email;
67-
} catch (Exception ex) {
68-
throw new IllegalArgumentException(ex);
69-
}
50+
ifset("username", p -> email.setAuthentication(mail.getString(p), mail.getString("password")));
51+
52+
ifset("bcc", p -> email.setBcc(address(strList(p))));
53+
ifset("bounceAddress", p -> email.setBounceAddress(mail.getString(p)));
54+
ifset("cc", p -> email.setCc(address(strList(p))));
55+
email.setCharset(mail.getString("charset"));
56+
ifset("debug", p -> email.setDebug(mail.getBoolean(p)));
57+
ifset("from", p -> email.setFrom(mail.getString(p)));
58+
ifset("hostName", p -> email.setHostName(mail.getString(p)));
59+
ifset("msg", p -> {
60+
if (email instanceof HtmlEmail) {
61+
((HtmlEmail) email).setHtmlMsg(mail.getString(p));
62+
} else {
63+
email.setMsg(mail.getString(p));
64+
}
65+
});
66+
ifset("replyTo", p -> email.setReplyTo(address(mail.getStringList(p))));
67+
ifset("sendPartial", p -> email.setSendPartial(mail.getBoolean(p)));
68+
ifset("smtpPort", p -> email.setSmtpPort(mail.getInt(p)));
69+
ifset("socketConnectionTimeout",
70+
p -> email.setSocketConnectionTimeout((int) mail.getDuration(p, TimeUnit.MILLISECONDS)));
71+
ifset("socketTimeout",
72+
p -> email.setSocketTimeout((int) mail.getDuration(p, TimeUnit.MILLISECONDS)));
73+
ifset("ssl.checkServerIdentity", p -> email.setSSLCheckServerIdentity(mail.getBoolean(p)));
74+
ifset("ssl.onConnect", p -> email.setSSLOnConnect(mail.getBoolean(p)));
75+
ifset("ssl.smtpPort", p -> email.setSslSmtpPort(mail.getString(p)));
76+
ifset("startTLSEnabled", p -> email.setStartTLSEnabled(mail.getBoolean(p)));
77+
ifset("startTLSRequired", p -> email.setStartTLSRequired(mail.getBoolean(p)));
78+
ifset("subject", p -> email.setSubject(mail.getString(p)));
79+
ifset("to", p -> email.setTo(address(strList(p))));
80+
81+
return email;
7082
}
7183

7284
private List<String> strList(final String p) {
@@ -85,9 +97,9 @@ private List<InternetAddress> address(final List<String> list) throws AddressExc
8597
return addresses;
8698
}
8799

88-
private void ifset(final String key, final EmailSetter setter) throws Exception {
100+
private void ifset(final String key, final SneakyThrows.Consumer<String> setter) {
89101
if (mail.hasPath(key)) {
90-
setter.apply(key);
102+
setter.accept(key);
91103
}
92104
}
93105
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.jooby.email;
2+
3+
import com.typesafe.config.Config;
4+
import com.typesafe.config.ConfigException;
5+
import com.typesafe.config.ConfigFactory;
6+
import com.typesafe.config.ConfigValueFactory;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertThrows;
11+
12+
public class CommonsEmailModuleTest {
13+
14+
@Test
15+
public void shouldGenerateConfigWithDefaultSetup() {
16+
String charset = "UTF-8";
17+
String hostName = "smtp.googlemail.com";
18+
Config config = ConfigFactory.empty()
19+
.withValue("application.charset", ConfigValueFactory.fromAnyRef(charset))
20+
.withValue("mail.hostName", ConfigValueFactory.fromAnyRef(hostName));
21+
Config result = CommonsEmailModule.mailConfig(config, "mail");
22+
23+
assertEquals(hostName, result.getString("hostName"));
24+
assertEquals(charset, result.getString("charset"));
25+
}
26+
27+
@Test
28+
public void shouldGenerateConfigWithCustomSetup() {
29+
String charset = "UTF-8";
30+
String username = "u";
31+
String password = "p";
32+
String hostName1 = "smtp.googlemail.com";
33+
String hostName2 = "host2.googlemail.com";
34+
Config config = ConfigFactory.empty()
35+
.withValue("application.charset", ConfigValueFactory.fromAnyRef(charset))
36+
.withValue("otherMail.hostName", ConfigValueFactory.fromAnyRef(hostName2))
37+
.withValue("mail.hostName", ConfigValueFactory.fromAnyRef(hostName1))
38+
.withValue("mail.username", ConfigValueFactory.fromAnyRef(username))
39+
.withValue("mail.password", ConfigValueFactory.fromAnyRef(password));
40+
Config result = CommonsEmailModule.mailConfig(config, "otherMail");
41+
42+
assertEquals(hostName2, result.getString("hostName"));
43+
assertEquals(username, result.getString("username"));
44+
assertEquals(password, result.getString("password"));
45+
assertEquals(charset, result.getString("charset"));
46+
}
47+
48+
@Test
49+
public void shouldFailWhenConfigIsMissing() {
50+
assertThrows(ConfigException.Missing.class,
51+
() -> CommonsEmailModule.mailConfig(ConfigFactory.empty(), "mail"));
52+
}
53+
}

0 commit comments

Comments
 (0)