Author: pete
Date: Fri Jul  1 15:28:24 2011
New Revision: 1141965

URL: http://svn.apache.org/viewvc?rev=1141965&view=rev
Log:
added RFC1123 date formatter class for thread-safe(!) formatting of dates 
contained in http response headers

Added:
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/date/
    
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/date/RFC1123DateFormatter.java
Modified:
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HttpHeaderCollection.java
    
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HttpHeaderCollectionTest.java

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HttpHeaderCollection.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HttpHeaderCollection.java?rev=1141965&r1=1141964&r2=1141965&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HttpHeaderCollection.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HttpHeaderCollection.java
 Fri Jul  1 15:28:24 2011
@@ -16,11 +16,8 @@
  */
 package org.apache.wicket.request;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -28,8 +25,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import java.util.TimeZone;
 
+import org.apache.wicket.util.date.RFC1123DateFormatter;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.time.Time;
 
@@ -45,24 +42,9 @@ public class HttpHeaderCollection
 {
        private final Map<HeaderKey, List<Object>> headers;
 
-       /** Greenwich Mean Time (GMT) timezone */
-       private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
-
-       /** rfc 1123 compliant time stamp for headers */
-       private static final String RFC_1123_DATE_FORMAT = "EEE, dd MMM yyyy 
HH:mm:ss zzz";
-
-       /** date format for date headers */
-       public static final DateFormat DATE_FORMAT;
-       
        /** returned in case no header values were found */
        private static final String[] NO_VALUES = new String[0];
 
-       static
-       {
-               DATE_FORMAT = new SimpleDateFormat(RFC_1123_DATE_FORMAT, 
Locale.US);
-               DATE_FORMAT.setTimeZone(GMT);
-       }
-
        public HttpHeaderCollection()
        {
                headers = new HashMap<HeaderKey, List<Object>>();
@@ -179,10 +161,7 @@ public class HttpHeaderCollection
        {
                if (value instanceof Time)
                {
-                       synchronized(DATE_FORMAT)
-                       {
-                               return DATE_FORMAT.format(new 
Date(((Time)value).getMilliseconds()));
-                       }
+                       return RFC1123DateFormatter.formatDate((Time)value);
                }
                else
                {

Modified: 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HttpHeaderCollectionTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HttpHeaderCollectionTest.java?rev=1141965&r1=1141964&r2=1141965&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HttpHeaderCollectionTest.java
 (original)
+++ 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HttpHeaderCollectionTest.java
 Fri Jul  1 15:28:24 2011
@@ -18,6 +18,7 @@ package org.apache.wicket.request;
 
 import java.util.Locale;
 import java.util.Set;
+import java.util.TimeZone;
 
 import org.apache.wicket.util.time.Time;
 import org.junit.Test;
@@ -81,17 +82,26 @@ public class HttpHeaderCollectionTest
                assertEquals(time1, headers.getDateHeader("date"));
                assertEquals("Thu, 01 Jan 1970 00:16:40 GMT", 
headers.getHeader("date"));
 
-               // a change of the locale must not affect the date format
+               // a change of the locale or timezone must not affect the date 
format
                final Locale defaultLocale = Locale.getDefault();
+               final TimeZone defaultLocaleefaultTimezone = 
TimeZone.getDefault();
 
                try
                {
+                       final String expected = "Thu, 01 Jan 1970 00:16:40 GMT";
+
                        Locale.setDefault(Locale.CHINESE);
-                       assertEquals("Thu, 01 Jan 1970 00:16:40 GMT", 
headers.getHeader("date"));
+                       TimeZone.setDefault(TimeZone.getTimeZone("CET"));
+                       assertEquals(expected, headers.getHeader("date"));
+
+                       Locale.setDefault(Locale.US);
+                       TimeZone.setDefault(TimeZone.getTimeZone("EST"));
+                       assertEquals(expected, headers.getHeader("date"));
                }
                finally
                {
                        Locale.setDefault(defaultLocale);
+                       TimeZone.setDefault(defaultLocaleefaultTimezone);
                }
 
                assertArrayEquals(new String[]{"Thu, 01 Jan 1970 00:16:40 GMT", 
"Thu, 01 Jan 1970 00:33:20 GMT", "not-a-date"},

Added: 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/date/RFC1123DateFormatter.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/date/RFC1123DateFormatter.java?rev=1141965&view=auto
==============================================================================
--- 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/date/RFC1123DateFormatter.java
 (added)
+++ 
wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/date/RFC1123DateFormatter.java
 Fri Jul  1 15:28:24 2011
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.util.date;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.apache.wicket.util.time.Time;
+
+/**
+ * print date in RFC1123 format
+ * <p/>
+ * Contrary to {@link java.text.SimpleDateFormat} this is thread-safe.
+ * <p/> 
+ * taken from the source code of jetty 7.3.0, thanks for Greg Wilkins!
+ * 
+ * @author Peter Ertl
+ * 
+ */
+public final class RFC1123DateFormatter
+{
+       private static final String[] DAYS =
+               {"Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+       private static final String[] MONTHS =
+               {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", 
"Oct", "Nov", "Dec", "Jan"};
+
+       public static final TimeZone GMT = TimeZone.getTimeZone("GMT");
+
+       private RFC1123DateFormatter()
+       {
+       }
+
+       public static String formatDate(Time time)
+       {
+               final Calendar cal = GregorianCalendar.getInstance(GMT);
+               final StringBuilder buf = new StringBuilder(32);
+
+               cal.setTimeInMillis(time.getMilliseconds());
+
+               int day_of_week = cal.get(Calendar.DAY_OF_WEEK);
+               int day_of_month = cal.get(Calendar.DAY_OF_MONTH);
+               int month = cal.get(Calendar.MONTH);
+               int year = cal.get(Calendar.YEAR);
+               int century = year / 100;
+               year = year % 100;
+
+               int hours = cal.get(Calendar.HOUR_OF_DAY);
+               int minutes = cal.get(Calendar.MINUTE);
+               int seconds = cal.get(Calendar.SECOND);
+
+               buf.append(DAYS[day_of_week]);
+               buf.append(',');
+               buf.append(' ');
+               appendTwoDigits(buf, day_of_month);
+
+               buf.append(' ');
+               buf.append(MONTHS[month]);
+               buf.append(' ');
+               appendTwoDigits(buf, century);
+               appendTwoDigits(buf, year);
+
+               buf.append(' ');
+               appendTwoDigits(buf, hours);
+               buf.append(':');
+               appendTwoDigits(buf, minutes);
+               buf.append(':');
+               appendTwoDigits(buf, seconds);
+               buf.append(" GMT");
+
+               return buf.toString();
+       }
+
+       private static void appendTwoDigits(StringBuilder str, int number)
+       {
+               str.append((char)(number / 10 + '0'));
+               str.append((char)(number % 10 + '0'));
+       }
+}


Reply via email to