1. Project Clover database Wed Jan 17 2024 23:40:18 CST
  2. Package org.europa.together.application

File JakartaMailClient.java

 

Coverage histogram

../../../../img/srcFileCovDistChart10.png
0% of files have more coverage

Code metrics

30
115
15
1
282
252
32
0.28
7.67
15
2.13

Classes

Class Line # Actions
JakartaMailClient 39 115 0% 32 3
0.9812598.1%
 

Contributing tests

This file is covered by 16 tests. .

Source view

1    package org.europa.together.application;
2   
3    import jakarta.activation.DataHandler;
4    import jakarta.activation.DataSource;
5    import jakarta.mail.MessagingException;
6    import jakarta.mail.Multipart;
7    import jakarta.mail.NoSuchProviderException;
8    import jakarta.mail.PasswordAuthentication;
9    import jakarta.mail.Session;
10    import jakarta.mail.internet.InternetAddress;
11    import jakarta.mail.internet.MimeBodyPart;
12    import jakarta.mail.internet.MimeMessage;
13    import jakarta.mail.internet.MimeMultipart;
14    import java.io.IOException;
15    import java.util.Date;
16    import java.util.HashMap;
17    import java.util.List;
18    import java.util.Map;
19    import java.util.Properties;
20    import jakarta.activation.FileDataSource;
21    import org.europa.together.business.ConfigurationDAO;
22    import org.europa.together.business.CryptoTools;
23    import org.europa.together.business.Logger;
24    import org.europa.together.business.MailClient;
25    import org.europa.together.business.PropertyReader;
26    import org.europa.together.domain.ConfigurationDO;
27    import org.europa.together.domain.HashAlgorithm;
28    import org.europa.together.domain.LogLevel;
29    import org.europa.together.domain.Mail;
30    import org.europa.together.utils.Constraints;
31    import org.europa.together.utils.StringUtils;
32    import org.springframework.beans.factory.annotation.Autowired;
33    import org.springframework.stereotype.Repository;
34   
35    /**
36    * Implementation of a simple SMTP Mailer.
37    */
38    @Repository
 
39    public class JakartaMailClient implements MailClient {
40   
41    private static final long serialVersionUID = 6L;
42    private static final Logger LOGGER = new LogbackLogger(JakartaMailClient.class);
43   
44    @Autowired
45    private ConfigurationDAO configurationDAO;
46    @Autowired
47    private CryptoTools cryptoTools;
48    @Autowired
49    private PropertyReader propertyReader;
50   
51    private Map<String, String> configuration;
52    private MimeMessage message;
53    private Mail email;
54    private int configMaximumMailBulk;
55    private long configCountWaitTime;
56   
57    /**
58    * Constructor.
59    */
 
60  3 toggle public JakartaMailClient() {
61  3 initConfig();
62  3 configMaximumMailBulk = -1;
63  3 configCountWaitTime = -1;
64  3 LOGGER.log("instance class", LogLevel.INFO);
65    }
66   
 
67  19 toggle @Override
68    public Map<String, String> getDebugActiveConfiguration() {
69  19 return Map.copyOf(configuration);
70    }
71   
 
72  3 toggle @Override
73    public void clearConfiguration() {
74  3 configuration.clear();
75    }
76   
 
77  8 toggle @Override
78    public boolean loadConfigurationFromProperties(final String resource)
79    throws IOException {
80  8 boolean success = true;
81  8 initConfig();
82  8 Map<String, String> properties = new HashMap<>();
83  8 try {
84  8 propertyReader.appendPropertiesFromClasspath(resource);
85  6 properties = propertyReader.getPropertyList();
86    } catch (Exception ex) {
87  2 success = false;
88  2 LOGGER.catchException(ex);
89    }
90   
91  8 try {
92  8 propertyReader.appendPropertiesFromFile(resource);
93  1 properties = propertyReader.getPropertyList();
94    } catch (Exception ex) {
95  7 success = false;
96  7 LOGGER.catchException(ex);
97    }
98   
99  8 if (!properties.isEmpty()) {
100  7 configuration.putAll(properties);
101    } else {
102  1 success = false;
103  1 throw new IOException("Could not load " + resource + " from file system or classpath.");
104    }
105  7 return success;
106    }
107   
 
108  5 toggle @Override
109    public boolean loadConfigurationFromDatabase() {
110  5 boolean success = false;
111  5 initConfig();
112  5 LOGGER.log("Load all configuration sets of: " + CONFIG_SET
113    + " - Version: " + CONFIG_VERSION
114    + " - Module: " + Constraints.MODULE_NAME, LogLevel.DEBUG);
115  5 List<ConfigurationDO> configurationEntries
116    = configurationDAO.getAllConfigurationSetEntries(Constraints.MODULE_NAME,
117    CONFIG_VERSION, CONFIG_SET);
118  5 LOGGER.log("Size of config SET: " + configurationEntries.size(), LogLevel.DEBUG);
119  5 if (configurationEntries.size() > 0) {
120  4 processConfiguration(configurationEntries);
121  4 success = true;
122    }
123  5 LOGGER.log("DB CONFIG: " + configuration, LogLevel.DEBUG);
124  5 return success;
125    }
126   
 
127  1 toggle @Override
128    public int getBulkMailLimiter() {
129  1 return this.configMaximumMailBulk;
130    }
131   
 
132  1 toggle @Override
133    public long getWaitTime() {
134  1 return this.configCountWaitTime;
135    }
136   
 
137  4 toggle @Override
138    public void composeMail(final Mail email)
139    throws MessagingException {
140  4 MimeMessage mimeMessage = null;
141  4 LOGGER.log("Compose E-Mail", LogLevel.DEBUG);
142  4 mimeMessage = new MimeMessage(getSession());
143    //HEADER - EVENLOPE
144  4 mimeMessage.setHeader("From: ", configuration.get("mailer.sender"));
145  4 mimeMessage.setHeader("Return-Path: ", configuration.get("mailer.sender"));
146  4 mimeMessage.setSentDate(new Date());
147  4 mimeMessage.setSubject(email.getSubject());
148  4 mimeMessage.setFrom(new InternetAddress(configuration.get("mailer.sender")));
149  4 mimeMessage.setSender(new InternetAddress(configuration.get("mailer.sender")));
150    // CONTENT
151  4 MimeBodyPart bodypart = new MimeBodyPart();
152  4 if (email.getMimeType().equals("html")) {
153  1 bodypart.setContent(email.getMessage(), "text/html; charset=utf-8");
154    } else {
155  3 bodypart.setText(email.getMessage(), "utf-8");
156    }
157    // ATTACHMENTS : http://www.jguru.com/faq/view.jsp?EID=30251
158  4 Multipart multipart = new MimeMultipart();
159  4 multipart.addBodyPart(bodypart);
160  4 if (!email.getAttachmentList().isEmpty()) {
161  2 for (FileDataSource file : email.getAttachmentList()) {
162  2 DataSource source = file;
163  2 bodypart.setDataHandler(new DataHandler(source));
164  2 bodypart.setFileName(file.getName());
165  2 multipart.addBodyPart(bodypart);
166    }
167    }
168  4 mimeMessage.setContent(multipart);
169  4 this.message = mimeMessage;
170  4 this.email = email;
171    }
172   
 
173  6 toggle @Override
174    public Session getSession()
175    throws NoSuchProviderException {
176  6 Session connection = Session.getInstance(wireConfigurationEntries(),
177    new jakarta.mail.Authenticator() {
 
178  0 toggle @Override
179    protected PasswordAuthentication getPasswordAuthentication() {
180  0 return new PasswordAuthentication(
181    configuration.get("mailer.user"),
182    configuration.get("mailer.password")
183    );
184    }
185    });
186  5 connection.setDebug(Boolean.valueOf(configuration.get("mailer.debug")));
187  5 return connection;
188    }
189   
 
190  1 toggle @Override
191    public Mail getMailObject() {
192  1 return email;
193    }
194   
 
195  3 toggle @Override
196    public MimeMessage getMimeMessage() {
197  3 return message;
198    }
199   
 
200  16 toggle private void initConfig() {
201  16 this.configuration = new HashMap<>();
202  16 configuration.put("mailer.host", "mailer.host");
203  16 configuration.put("mailer.port", "mailer.port");
204  16 configuration.put("mailer.sender", "mailer.sender");
205  16 configuration.put("mailer.user", "mailer.user");
206  16 configuration.put("mailer.password", "mailer.password");
207  16 configuration.put("mailer.ssl", "mailer.ssl");
208  16 configuration.put("mailer.tls", "mailer.tls");
209  16 configuration.put("mailer.debug", "false");
210  16 configuration.put("mailer.count", "-1");
211  16 configuration.put("mailer.wait", "-1");
212    }
213   
 
214  6 toggle private Properties wireConfigurationEntries() {
215  6 configCountWaitTime = Long.parseLong(configuration.get("mailer.wait"));
216  5 configMaximumMailBulk = Integer.parseInt(configuration.get("mailer.count"));
217  5 Properties props = new Properties();
218  5 props.put("mail.smtp.host", configuration.get("mailer.host"));
219  5 props.put("mail.smtp.port", configuration.get("mailer.port"));
220  5 props.put("mail.smtp.auth", "true");
221  5 props.put("mail.smtp.starttls.enable", configuration.get("mailer.tls"));
222  5 props.put("mail.smtp.ssl.enable", configuration.get("mailer.ssl"));
223  5 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
224  5 props.put("mail.smtp.socketFactory.port", configuration.get("mailer.port"));
225  5 props.put("mail.smtp.socketFactory.fallback", "false");
226  5 return props;
227    }
228   
 
229  4 toggle private void processConfiguration(final List<ConfigurationDO> configurationEntries) {
230  4 LOGGER.log("Process E-Mail Configuration (" + configurationEntries.size() + ")",
231    LogLevel.DEBUG);
232  4 for (ConfigurationDO entry : configurationEntries) {
233  40 String value;
234  40 if (StringUtils.isEmpty(entry.getValue())) {
235  35 value = entry.getDefaultValue();
236    } else {
237  5 value = entry.getValue();
238    }
239  40 if (entry.getKey()
240    .equals(cryptoTools.calculateHash("mailer.host",
241    HashAlgorithm.SHA256))) {
242  4 configuration.replace("mailer.host", value);
243  36 } else if (entry.getKey()
244    .equals(cryptoTools.calculateHash("mailer.port",
245    HashAlgorithm.SHA256))) {
246  4 configuration.replace("mailer.port", value);
247  32 } else if (entry.getKey()
248    .equals(cryptoTools.calculateHash("mailer.sender",
249    HashAlgorithm.SHA256))) {
250  4 configuration.replace("mailer.sender", value);
251  28 } else if (entry.getKey()
252    .equals(cryptoTools.calculateHash("mailer.user",
253    HashAlgorithm.SHA256))) {
254  4 configuration.replace("mailer.user", value);
255  24 } else if (entry.getKey()
256    .equals(cryptoTools.calculateHash("mailer.password",
257    HashAlgorithm.SHA256))) {
258  4 configuration.replace("mailer.password", value);
259  20 } else if (entry.getKey()
260    .equals(cryptoTools.calculateHash("mailer.ssl",
261    HashAlgorithm.SHA256))) {
262  4 configuration.replace("mailer.ssl", value);
263  16 } else if (entry.getKey()
264    .equals(cryptoTools.calculateHash("mailer.tls",
265    HashAlgorithm.SHA256))) {
266  4 configuration.replace("mailer.tls", value);
267  12 } else if (entry.getKey()
268    .equals(cryptoTools.calculateHash("mailer.debug",
269    HashAlgorithm.SHA256))) {
270  4 configuration.replace("mailer.debug", value);
271  8 } else if (entry.getKey()
272    .equals(cryptoTools.calculateHash("mailer.count",
273    HashAlgorithm.SHA256))) {
274  4 configuration.replace("mailer.count", value);
275  4 } else if (entry.getKey()
276    .equals(cryptoTools.calculateHash("mailer.wait",
277    HashAlgorithm.SHA256))) {
278  4 configuration.replace("mailer.wait", value);
279    }
280    }
281    }
282    }