You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by mw...@apache.org on 2009/01/31 21:47:49 UTC

svn commit: r739602 - in /james/mime4j/trunk: examples/src/java/org/apache/james/mime4j/samples/dom/ src/main/java/org/apache/james/mime4j/field/ src/main/java/org/apache/james/mime4j/message/ src/test/java/org/apache/james/mime4j/field/ src/test/java/...

Author: mwiederkehr
Date: Sat Jan 31 20:47:48 2009
New Revision: 739602

URL: http://svn.apache.org/viewvc?rev=739602&view=rev
Log:
MIME4J-100, MIME4J-108: more methods for creating Content-Disposition fields

Added:
    james/mime4j/trunk/src/test/java/org/apache/james/mime4j/message/EntityTest.java
Modified:
    james/mime4j/trunk/examples/src/java/org/apache/james/mime4j/samples/dom/MultipartMessage.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Fields.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Entity.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Message.java
    james/mime4j/trunk/src/test/java/org/apache/james/mime4j/field/FieldsTest.java

Modified: james/mime4j/trunk/examples/src/java/org/apache/james/mime4j/samples/dom/MultipartMessage.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/examples/src/java/org/apache/james/mime4j/samples/dom/MultipartMessage.java?rev=739602&r1=739601&r2=739602&view=diff
==============================================================================
--- james/mime4j/trunk/examples/src/java/org/apache/james/mime4j/samples/dom/MultipartMessage.java (original)
+++ james/mime4j/trunk/examples/src/java/org/apache/james/mime4j/samples/dom/MultipartMessage.java Sat Jan 31 20:47:48 2009
@@ -125,6 +125,10 @@
         bodyPart.setBody(body, "image/png");
         bodyPart.setContentTransferEncoding("base64");
 
+        // Specify a filename in the Content-Disposition header (implicitly sets
+        // the disposition type to "attachment")
+        bodyPart.setFilename("smiley.png");
+
         return bodyPart;
     }
 

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=739602&r1=739601&r2=739602&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 Sat Jan 31 20:47:48 2009
@@ -22,6 +22,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.TimeZone;
 
@@ -73,6 +74,9 @@
 
     public static ContentDispositionField contentDisposition(
             String dispositionType, Map<String, String> parameters) {
+        if (!isValidDispositionType(dispositionType))
+            throw new IllegalArgumentException();
+
         if (parameters == null || parameters.isEmpty()) {
             return parse(ContentDispositionField.class,
                     Field.CONTENT_DISPOSITION, dispositionType);
@@ -88,6 +92,44 @@
         }
     }
 
+    public static ContentDispositionField contentDisposition(
+            String dispositionType, String filename) {
+        return contentDisposition(dispositionType, filename, -1, null, null,
+                null);
+    }
+
+    public static ContentDispositionField contentDisposition(
+            String dispositionType, String filename, long size) {
+        return contentDisposition(dispositionType, filename, size, null, null,
+                null);
+    }
+
+    public static ContentDispositionField contentDisposition(
+            String dispositionType, String filename, long size,
+            Date creationDate, Date modificationDate, Date readDate) {
+        Map<String, String> parameters = new HashMap<String, String>();
+        if (filename != null) {
+            parameters.put(ContentDispositionField.PARAM_FILENAME, filename);
+        }
+        if (size >= 0) {
+            parameters.put(ContentDispositionField.PARAM_SIZE, Long
+                    .toString(size));
+        }
+        if (creationDate != null) {
+            parameters.put(ContentDispositionField.PARAM_CREATION_DATE,
+                    MimeUtil.formatDate(creationDate, null));
+        }
+        if (modificationDate != null) {
+            parameters.put(ContentDispositionField.PARAM_MODIFICATION_DATE,
+                    MimeUtil.formatDate(modificationDate, null));
+        }
+        if (readDate != null) {
+            parameters.put(ContentDispositionField.PARAM_READ_DATE, MimeUtil
+                    .formatDate(readDate, null));
+        }
+        return contentDisposition(dispositionType, parameters);
+    }
+
     public static DateTimeField date(Date date) {
         return date(Field.DATE, date, null);
     }
@@ -255,6 +297,13 @@
         return EncoderUtil.isToken(type) && EncoderUtil.isToken(subType);
     }
 
+    private static boolean isValidDispositionType(String dispositionType) {
+        if (dispositionType == null)
+            return false;
+
+        return EncoderUtil.isToken(dispositionType);
+    }
+
     private static <F extends Field> F parse(Class<F> fieldClass,
             String fieldName, String fieldBody) {
         try {

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Entity.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Entity.java?rev=739602&r1=739601&r2=739602&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Entity.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Entity.java Sat Jan 31 20:47:48 2009
@@ -22,11 +22,13 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.james.mime4j.MimeIOException;
 import org.apache.james.mime4j.codec.CodecUtil;
+import org.apache.james.mime4j.field.ContentDispositionField;
 import org.apache.james.mime4j.field.ContentTransferEncodingField;
 import org.apache.james.mime4j.field.ContentTypeField;
 import org.apache.james.mime4j.field.Field;
@@ -313,6 +315,156 @@
     }
 
     /**
+     * Return the disposition type of the content disposition of this
+     * <code>Entity</code>.
+     * 
+     * @return the disposition type or <code>null</code> if no disposition
+     *         type has been set.
+     */
+    public String getDispositionType() {
+        ContentDispositionField field = obtainField(Field.CONTENT_DISPOSITION);
+        if (field == null)
+            return null;
+
+        return field.getDispositionType();
+    }
+    
+    /**
+     * Sets the content disposition of this <code>Entity</code> to the
+     * specified disposition type. No filename, size or date parameters
+     * are included in the content disposition.
+     * 
+     * @param dispositionType
+     *            disposition type value (usually <code>inline</code> or
+     *            <code>attachment</code>).
+     */
+    public void setContentDisposition(String dispositionType) {
+        Header header = obtainHeader();
+        header.setField(Fields.contentDisposition(dispositionType, null, -1,
+                null, null, null));
+    }
+
+    /**
+     * Sets the content disposition of this <code>Entity</code> to the
+     * specified disposition type and filename. No size or date parameters are
+     * included in the content disposition.
+     * 
+     * @param dispositionType
+     *            disposition type value (usually <code>inline</code> or
+     *            <code>attachment</code>).
+     * @param filename
+     *            filename parameter value or <code>null</code> if the
+     *            parameter should not be included.
+     */
+    public void setContentDisposition(String dispositionType, String filename) {
+        Header header = obtainHeader();
+        header.setField(Fields.contentDisposition(dispositionType, filename,
+                -1, null, null, null));
+    }
+
+    /**
+     * Sets the content disposition of this <code>Entity</code> to the
+     * specified values. No date parameters are included in the content
+     * disposition.
+     * 
+     * @param dispositionType
+     *            disposition type value (usually <code>inline</code> or
+     *            <code>attachment</code>).
+     * @param filename
+     *            filename parameter value or <code>null</code> if the
+     *            parameter should not be included.
+     * @param size
+     *            size parameter value or <code>-1</code> if the parameter
+     *            should not be included.
+     */
+    public void setContentDisposition(String dispositionType, String filename,
+            long size) {
+        Header header = obtainHeader();
+        header.setField(Fields.contentDisposition(dispositionType, filename,
+                size, null, null, null));
+    }
+
+    /**
+     * Sets the content disposition of this <code>Entity</code> to the
+     * specified values.
+     * 
+     * @param dispositionType
+     *            disposition type value (usually <code>inline</code> or
+     *            <code>attachment</code>).
+     * @param filename
+     *            filename parameter value or <code>null</code> if the
+     *            parameter should not be included.
+     * @param size
+     *            size parameter value or <code>-1</code> if the parameter
+     *            should not be included.
+     * @param creationDate
+     *            creation-date parameter value or <code>null</code> if the
+     *            parameter should not be included.
+     * @param modificationDate
+     *            modification-date parameter value or <code>null</code> if
+     *            the parameter should not be included.
+     * @param readDate
+     *            read-date parameter value or <code>null</code> if the
+     *            parameter should not be included.
+     */
+    public void setContentDisposition(String dispositionType, String filename,
+            long size, Date creationDate, Date modificationDate, Date readDate) {
+        Header header = obtainHeader();
+        header.setField(Fields.contentDisposition(dispositionType, filename,
+                size, creationDate, modificationDate, readDate));
+    }
+
+    /**
+     * Returns the filename parameter of the content disposition of this
+     * <code>Entity</code>.
+     * 
+     * @return the filename parameter of the content disposition or
+     *         <code>null</code> if the filename has not been set.
+     */
+    public String getFilename() {
+        ContentDispositionField field = obtainField(Field.CONTENT_DISPOSITION);
+        if (field == null)
+            return null;
+
+        return field.getFilename();
+    }
+    
+    /**
+     * Sets the filename parameter of the content disposition of this
+     * <code>Entity</code> to the specified value. If this entity does not
+     * have a content disposition header field a new one with disposition type
+     * <code>attachment</code> is created.
+     * 
+     * @param filename
+     *            filename parameter value or <code>null</code> if the
+     *            parameter should be removed.
+     */
+    public void setFilename(String filename) {
+        Header header = obtainHeader();
+        ContentDispositionField field = (ContentDispositionField) header
+                .getField(Field.CONTENT_DISPOSITION);
+        if (field == null) {
+            if (filename != null) {
+                header.setField(Fields.contentDisposition(
+                        ContentDispositionField.DISPOSITION_TYPE_ATTACHMENT,
+                        filename, -1, null, null, null));
+            }
+        } else {
+            String dispositionType = field.getDispositionType();
+            Map<String, String> parameters = new HashMap<String, String>(field
+                    .getParameters());
+            if (filename == null) {
+                parameters.remove(ContentDispositionField.PARAM_FILENAME);
+            } else {
+                parameters
+                        .put(ContentDispositionField.PARAM_FILENAME, filename);
+            }
+            header.setField(Fields.contentDisposition(dispositionType,
+                    parameters));
+        }
+    }
+
+    /**
      * Determines if the MIME type of this <code>Entity</code> matches the
      * given one. MIME types are case-insensitive.
      * 
@@ -397,4 +549,24 @@
         return header;
     }
 
+    /**
+     * Obtains the header field with the specified name.
+     * 
+     * @param <F>
+     *            concrete field type.
+     * @param fieldName
+     *            name of the field to retrieve.
+     * @return the header field or <code>null</code> if this entity has no
+     *         header or the header contains no such field.
+     */
+    <F extends Field> F obtainField(String fieldName) {
+        Header header = getHeader();
+        if (header == null)
+            return null;
+
+        @SuppressWarnings("unchecked")
+        F field = (F) header.getField(fieldName);
+        return field;
+    }
+
 }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Message.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Message.java?rev=739602&r1=739601&r2=739602&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Message.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/message/Message.java Sat Jan 31 20:47:48 2009
@@ -404,14 +404,4 @@
         }
     }
 
-    private <F extends Field> F obtainField(String fieldName) {
-        Header header = getHeader();
-        if (header == null)
-            return null;
-
-        @SuppressWarnings("unchecked")
-        F field = (F) header.getField(fieldName);
-        return field;
-    }
-
 }

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=739602&r1=739601&r2=739602&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 Sat Jan 31 20:47:48 2009
@@ -125,13 +125,45 @@
 
     public void testContentDispositionStringNullParameters() throws Exception {
         ContentDispositionField field = Fields.contentDisposition("inline",
-                null);
+                (Map<String, String>) null);
         assertTrue(field.isValidField());
 
         String expectedRaw = "Content-Disposition: inline";
         assertEquals(expectedRaw, field.getRaw());
     }
 
+    public void testContentDispositionFilename() throws Exception {
+        ContentDispositionField field = Fields.contentDisposition("attachment",
+                "some file.dat");
+        assertTrue(field.isValidField());
+
+        assertEquals("attachment", field.getDispositionType());
+        assertEquals("some file.dat", field.getFilename());
+    }
+
+    public void testContentDispositionFilenameSize() throws Exception {
+        ContentDispositionField field = Fields.contentDisposition("attachment",
+                "some file.dat", 300);
+        assertTrue(field.isValidField());
+
+        assertEquals("attachment", field.getDispositionType());
+        assertEquals("some file.dat", field.getFilename());
+        assertEquals(300, field.getSize());
+    }
+
+    public void testContentDispositionFilenameSizeDate() throws Exception {
+        ContentDispositionField field = Fields.contentDisposition("attachment",
+                "some file.dat", 300, new Date(1000), new Date(2000), new Date(3000));
+        assertTrue(field.isValidField());
+
+        assertEquals("attachment", field.getDispositionType());
+        assertEquals("some file.dat", field.getFilename());
+        assertEquals(300, field.getSize());
+        assertEquals(new Date(1000), field.getCreationDate());
+        assertEquals(new Date(2000), field.getModificationDate());
+        assertEquals(new Date(3000), field.getReadDate());
+    }
+
     public void testInvalidContentDisposition() throws Exception {
         ContentDispositionField field = Fields.contentDisposition("inline; "
                 + "filename=some file.dat");

Added: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/message/EntityTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/message/EntityTest.java?rev=739602&view=auto
==============================================================================
--- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/message/EntityTest.java (added)
+++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/message/EntityTest.java Sat Jan 31 20:47:48 2009
@@ -0,0 +1,86 @@
+/****************************************************************
+ * 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.james.mime4j.message;
+
+import org.apache.james.mime4j.field.Field;
+import org.apache.james.mime4j.message.Entity;
+
+import junit.framework.TestCase;
+
+public class EntityTest extends TestCase {
+
+    public void testGetDispositionType() throws Exception {
+        Entity entity = new BodyPart();
+
+        assertNull(entity.getDispositionType());
+
+        Header header = new Header();
+        header.setField(Field.parse("Content-Disposition", "inline"));
+        entity.setHeader(header);
+
+        assertEquals("inline", entity.getDispositionType());
+    }
+
+    public void testSetContentDispositionType() throws Exception {
+        Entity entity = new BodyPart();
+
+        entity.setContentDisposition("attachment");
+
+        assertEquals("attachment", entity.getHeader().getField(
+                "Content-Disposition").getBody());
+    }
+
+    public void testSetContentDispositionTypeFilename() throws Exception {
+        Entity entity = new BodyPart();
+
+        entity.setContentDisposition("attachment", "some file.dat");
+
+        assertEquals("attachment; filename=\"some file.dat\"", entity
+                .getHeader().getField("Content-Disposition").getBody());
+    }
+
+    public void testGetFilename() throws Exception {
+        Entity entity = new BodyPart();
+
+        assertNull(entity.getFilename());
+
+        Header header = new Header();
+        header.setField(Field.parse("Content-Disposition",
+                "attachment; filename=\"some file.dat\""));
+        entity.setHeader(header);
+
+        assertEquals("some file.dat", entity.getFilename());
+    }
+
+    public void testSetFilename() throws Exception {
+        Entity entity = new BodyPart();
+
+        entity.setFilename("file name.ext");
+
+        assertEquals("attachment; filename=\"file name.ext\"", entity
+                .getHeader().getField("Content-Disposition").getBody());
+
+        entity.setFilename(null);
+
+        assertEquals("attachment", entity.getHeader().getField(
+                "Content-Disposition").getBody());
+    }
+
+}