Skip to content

Commit

Permalink
Move from MailDateFormat (not thread safe) to DateTimeFormatter #590
Browse files Browse the repository at this point in the history
Signed-off-by: Jorge Bescos Gascon <[email protected]>
  • Loading branch information
jbescos committed Feb 28, 2024
1 parent 0d11fe5 commit b2f4e98
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 9 deletions.
21 changes: 12 additions & 9 deletions api/src/main/java/jakarta/mail/internet/MimeMessage.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2024 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -25,10 +25,14 @@
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

import jakarta.activation.DataHandler;
Expand Down Expand Up @@ -172,7 +176,10 @@ public class MimeMessage extends Message implements MimePart {
protected Object cachedContent;

// Used to parse dates
private static final MailDateFormat mailDateFormat = new MailDateFormat();
static final DateTimeFormatter mailDateFormat = DateTimeFormatter
.ofPattern("EEE, d MMM yyyy HH:mm:ss Z (z)")
.withLocale(Locale.US)
.withZone(ZoneOffset.systemDefault());

// Should addresses in headers be parsed in "strict" mode?
private boolean strict = true;
Expand Down Expand Up @@ -895,10 +902,8 @@ public Date getSentDate() throws MessagingException {
String s = getHeader("Date", null);
if (s != null) {
try {
synchronized (mailDateFormat) {
return mailDateFormat.parse(s);
}
} catch (ParseException pex) {
return Date.from(Instant.from(mailDateFormat.parse(s)));
} catch (RuntimeException pex) {
return null;
}
}
Expand All @@ -923,9 +928,7 @@ public void setSentDate(Date d) throws MessagingException {
if (d == null)
removeHeader("Date");
else {
synchronized (mailDateFormat) {
setHeader("Date", mailDateFormat.format(d));
}
setHeader("Date", mailDateFormat.format(d.toInstant()));
}
}

Expand Down
42 changes: 42 additions & 0 deletions api/src/test/java/jakarta/mail/internet/MimeMessageTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/

package jakarta.mail.internet;

import static org.junit.Assert.assertEquals;

import java.text.ParseException;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.Date;

import org.junit.Test;

public class MimeMessageTest {

@Test
public void dateTimeFormatter() throws ParseException {
MailDateFormat mailDateFormat1 = new MailDateFormat();
DateTimeFormatter mailDateFormat2 = MimeMessage.mailDateFormat;
Date date = new Date(1341100798000L);
String s1 = mailDateFormat1.format(date);
String s2 = mailDateFormat2.format(date.toInstant());
assertEquals(s1, s2);
Date d1 = mailDateFormat1.parse(s1);
Date d2 = Date.from(Instant.from(mailDateFormat2.parse(s1)));
assertEquals(d1, d2);
}
}

0 comments on commit b2f4e98

Please sign in to comment.