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