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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org