You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by mw...@apache.org on 2009/01/13 00:18:45 UTC

svn commit: r733960 - in /james/mime4j/trunk/src: main/java/org/apache/james/mime4j/field/Fields.java test/java/org/apache/james/mime4j/field/FieldsTest.java

Author: mwiederkehr
Date: Mon Jan 12 15:18:41 2009
New Revision: 733960

URL: http://svn.apache.org/viewvc?rev=733960&view=rev
Log:
MIME4J-100: methods for creating Date header fields

Modified:
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java
    james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java?rev=733960&r1=733959&r2=733960&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java Mon Jan 12 15:18:41 2009
@@ -19,7 +19,14 @@
 
 package org.apache.james.mime4j.field;
 
+import java.text.DateFormat;
+import java.text.FieldPosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 
 import org.apache.james.mime4j.util.MimeUtil;
 
@@ -57,6 +64,30 @@
                 Field.CONTENT_TRANSFER_ENCODING, contentTransferEncoding);
     }
 
+    public static DateTimeField date(String fieldValue) {
+        return date("Date", fieldValue);
+    }
+
+    public static DateTimeField date(String fieldName, String fieldValue) {
+        return (DateTimeField) Field.parse(fieldName, fieldValue);
+    }
+
+    public static DateTimeField date(Date date) {
+        return date("Date", date, null);
+    }
+
+    public static DateTimeField date(String fieldName, Date date) {
+        return date(fieldName, date, null);
+    }
+
+    public static DateTimeField date(String fieldName, Date date, TimeZone zone) {
+        DateFormat df = RFC822_DATE_FORMAT.get();
+        if (zone != null) {
+            df.setTimeZone(zone);
+        }
+        return date(fieldName, df.format(date));
+    }
+
     private static String quote(String value) {
         for (int idx = 0; idx < value.length(); idx++) {
             if (isSpecial(value.charAt(idx))) {
@@ -72,4 +103,41 @@
         final String tspecials = "()<>@,;:\\\"/[]?="; // rfc 2045
         return ch < 32 || ch >= 127 || tspecials.indexOf(ch) != -1;
     }
+
+    private static final ThreadLocal<DateFormat> RFC822_DATE_FORMAT = new ThreadLocal<DateFormat>() {
+        @Override
+        protected DateFormat initialValue() {
+            return new Rfc822DateFormat();
+        }
+    };
+
+    private static final class Rfc822DateFormat extends SimpleDateFormat {
+        private static final long serialVersionUID = 1L;
+
+        public Rfc822DateFormat() {
+            super("EEE, d MMM yyyy HH:mm:ss ", Locale.US);
+        }
+
+        @Override
+        public StringBuffer format(Date date, StringBuffer toAppendTo,
+                FieldPosition pos) {
+            StringBuffer sb = super.format(date, toAppendTo, pos);
+
+            int zoneMillis = calendar.get(GregorianCalendar.ZONE_OFFSET);
+            int dstMillis = calendar.get(GregorianCalendar.DST_OFFSET);
+            int minutes = (zoneMillis + dstMillis) / 1000 / 60;
+
+            if (minutes < 0) {
+                sb.append('-');
+                minutes = -minutes;
+            } else {
+                sb.append('+');
+            }
+
+            sb.append(String.format("%02d%02d", minutes / 60, minutes % 60));
+
+            return sb;
+        }
+    }
+
 }

Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java?rev=733960&r1=733959&r2=733960&view=diff
==============================================================================
--- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java (original)
+++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java Mon Jan 12 15:18:41 2009
@@ -19,8 +19,10 @@
 
 package org.apache.james.mime4j.field;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TimeZone;
 
 import junit.framework.TestCase;
 
@@ -77,4 +79,54 @@
         assertEquals("Content-Transfer-Encoding: base64", field.getRaw());
     }
 
+    public void testDateString() throws Exception {
+        DateTimeField field = Fields.date("Thu, 1 Jan 1970 00:00:00 +0000");
+        assertTrue(field.isValidField());
+
+        assertEquals("Date: Thu, 1 Jan 1970 00:00:00 +0000", field.getRaw());
+        assertEquals(new Date(0), field.getDate());
+    }
+
+    public void testDateStringString() throws Exception {
+        DateTimeField field = Fields.date("Resent-Date",
+                "Thu, 1 Jan 1970 00:00:00 +0000");
+        assertTrue(field.isValidField());
+
+        assertEquals("Resent-Date: Thu, 1 Jan 1970 00:00:00 +0000", field
+                .getRaw());
+        assertEquals(new Date(0), field.getDate());
+    }
+
+    public void testDateStringDateTimeZone() throws Exception {
+        DateTimeField field = Fields.date("Date", new Date(0), TimeZone
+                .getTimeZone("GMT"));
+        assertTrue(field.isValidField());
+
+        assertEquals("Date: Thu, 1 Jan 1970 00:00:00 +0000", field.getRaw());
+        assertEquals(new Date(0), field.getDate());
+
+        field = Fields.date("Resent-Date", new Date(0), TimeZone
+                .getTimeZone("GMT+1"));
+        assertTrue(field.isValidField());
+
+        assertEquals("Resent-Date: Thu, 1 Jan 1970 01:00:00 +0100", field
+                .getRaw());
+        assertEquals(new Date(0), field.getDate());
+    }
+
+    public void testDateDST() throws Exception {
+        long millis = 1216221153000l;
+        DateTimeField field = Fields.date("Date", new Date(millis), TimeZone
+                .getTimeZone("CET"));
+        assertTrue(field.isValidField());
+
+        assertEquals("Date: Wed, 16 Jul 2008 17:12:33 +0200", field.getRaw());
+        assertEquals(new Date(millis), field.getDate());
+    }
+
+    public void testInvalidDate() throws Exception {
+        DateTimeField field = Fields.date("Thu, Jan 1 1969 00:00:00 +0000");
+        assertFalse(field.isValidField());
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org