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 bt...@apache.org on 2022/10/17 03:11:57 UTC

[james-mime4j] 07/14: MIME4J-318 Fasten ContentDispositionFieldLenientImpl

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-mime4j.git

commit e2ad9a2da0c4385aad2dcd82caf37ccb4b1f6124
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jun 21 11:06:21 2022 +0700

    MIME4J-318 Fasten ContentDispositionFieldLenientImpl
    
     - Prevent useless copies
     - Rely on Java 8 time API
    
     From 32 ns down to 9ns.
---
 .../james/mime4j/util/MimeParameterMapping.java    | 10 ++---
 .../field/ContentDispositionFieldLenientImpl.java  | 48 ++++++++--------------
 2 files changed, 19 insertions(+), 39 deletions(-)

diff --git a/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java b/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java
index 91d370ca..1e98ac4d 100644
--- a/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java
+++ b/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java
@@ -28,19 +28,15 @@ public class MimeParameterMapping {
     private final Map<String, String> parameters = new HashMap<>();
 
     public Map<String, String> getParameters() {
-        Map<String,String> result = new HashMap<>();
-        for (Map.Entry<String, String > entry : parameters.entrySet()) {
-            result.put(entry.getKey(), decodeParameterValue(entry.getValue()) );
-        }
-        return result;
+        return parameters;
     }
 
     public void addParameter(String name, String value) {
         String key = removeSectionFromName(name).toLowerCase();
         if (parameters.containsKey(key)) {
-            parameters.put(key, parameters.get(key) + value);
+            parameters.put(key, decodeParameterValue(parameters.get(key) + value));
         } else {
-            parameters.put(key, value);
+            parameters.put(key, decodeParameterValue(value));
         }
     }
 
diff --git a/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java b/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java
index 9d9f01e2..6abc127b 100644
--- a/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java
+++ b/dom/src/main/java/org/apache/james/mime4j/field/ContentDispositionFieldLenientImpl.java
@@ -19,17 +19,17 @@
 
 package org.apache.james.mime4j.field;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
+import java.text.ParsePosition;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.ResolverStyle;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.TimeZone;
 
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.FieldParser;
@@ -46,9 +46,7 @@ import org.apache.james.mime4j.util.MimeParameterMapping;
  */
 public class ContentDispositionFieldLenientImpl extends AbstractField implements ContentDispositionField {
 
-    private static final String DEFAULT_DATE_FORMAT = "EEE, dd MMM yyyy hh:mm:ss ZZZZ";
-
-    private final List<String> datePatterns;
+    private static final DateTimeFormatter DEFAULT_DATE_FORMAT = DateTimeFieldLenientImpl.RFC_5322;
 
     private boolean parsed = false;
 
@@ -65,14 +63,8 @@ public class ContentDispositionFieldLenientImpl extends AbstractField implements
     private Date readDate;
 
     ContentDispositionFieldLenientImpl(final Field rawField,
-            final Collection<String> dateParsers, final DecodeMonitor monitor) {
+                                       final DecodeMonitor monitor) {
         super(rawField, monitor);
-        this.datePatterns = new ArrayList<String>();
-        if (dateParsers != null) {
-            this.datePatterns.addAll(dateParsers);
-        } else {
-            this.datePatterns.add(DEFAULT_DATE_FORMAT);
-        }
     }
 
     public String getDispositionType() {
@@ -86,7 +78,7 @@ public class ContentDispositionFieldLenientImpl extends AbstractField implements
         if (!parsed) {
             parse();
         }
-        return parameters.get(name.toLowerCase());
+        return parameters.get(name);
     }
 
     public Map<String, String> getParameters() {
@@ -168,14 +160,11 @@ public class ContentDispositionFieldLenientImpl extends AbstractField implements
         } else {
             dispositionType = null;
         }
-        parameters.clear();
         MimeParameterMapping mapping = new MimeParameterMapping();
         for (NameValuePair pair : body.getParams()) {
             mapping.addParameter(pair.getName(), pair.getValue());
         }
-        for (Map.Entry<String, String> entry : mapping.getParameters().entrySet()) {
-            parameters.put(entry.getKey(), entry.getValue());
-        }
+        parameters.putAll(mapping.getParameters());
     }
 
     private Date parseDate(final String paramName) {
@@ -183,18 +172,13 @@ public class ContentDispositionFieldLenientImpl extends AbstractField implements
         if (value == null) {
             return null;
         }
-        for (String datePattern: datePatterns) {
-            try {
-                SimpleDateFormat parser = new SimpleDateFormat(datePattern, Locale.US);
-                parser.setTimeZone(TimeZone.getTimeZone("GMT"));
-                parser.setLenient(true);
-                return parser.parse(value);
-            } catch (ParseException ignore) {
-            }
-        }
-        if (monitor.isListening()) {
-            monitor.warn(paramName + " parameter is invalid: " + value,
+        try {
+            return Date.from(Instant.from(DEFAULT_DATE_FORMAT.parse(value, new ParsePosition(0))));
+        } catch (Exception ignore) {
+            if (monitor.isListening()) {
+                monitor.warn(paramName + " parameter is invalid: " + value,
                     paramName + " parameter is ignored");
+            }
         }
         return null;
     }
@@ -202,7 +186,7 @@ public class ContentDispositionFieldLenientImpl extends AbstractField implements
     public static final FieldParser<ContentDispositionField> PARSER = new FieldParser<ContentDispositionField>() {
 
         public ContentDispositionField parse(final Field rawField, final DecodeMonitor monitor) {
-            return new ContentDispositionFieldLenientImpl(rawField, null, monitor);
+            return new ContentDispositionFieldLenientImpl(rawField, monitor);
         }
 
     };


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