From 0533aa7f6ff40be30f46cd213fddff41c595fc99 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 26 Sep 2012 19:58:08 +0000 Subject: [PATCH] * RFC822Date: Synchronization fix --- .../src/net/i2p/router/util/RFC822Date.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/router/java/src/net/i2p/router/util/RFC822Date.java b/router/java/src/net/i2p/router/util/RFC822Date.java index 6635bca8cf..2ae4d45696 100644 --- a/router/java/src/net/i2p/router/util/RFC822Date.java +++ b/router/java/src/net/i2p/router/util/RFC822Date.java @@ -11,20 +11,24 @@ import java.util.Locale; */ public abstract class RFC822Date { + // SimpleDateFormat is not thread-safe, methods must be synchronized + + private static final SimpleDateFormat OUTPUT_FORMAT = new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US); + /** * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html * Apparently public domain * Probably don't need all of these... */ private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] { + OUTPUT_FORMAT, new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US), new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US), new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US), new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US), new SimpleDateFormat("d MMM yy HH:mm z", Locale.US), new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US), - new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US) + new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US) }; /** @@ -33,7 +37,7 @@ public abstract class RFC822Date { * @param s non-null * @return -1 on failure */ - public static long parse822Date(String s) { + public synchronized static long parse822Date(String s) { for (int i = 0; i < rfc822DateFormats.length; i++) { try { Date date = rfc822DateFormats[i].parse(s); @@ -44,8 +48,12 @@ public abstract class RFC822Date { return -1; } - /** @since 0.8.2 */ - public static String to822Date(long t) { - return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t)); + /** + * Format is "d MMM yyyy HH:mm:ss z" + * + * @since 0.8.2 + */ + public synchronized static String to822Date(long t) { + return OUTPUT_FORMAT.format(new Date(t)); } } -- GitLab