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