Skip to content

Commit bfc1c5b

Browse files
committed
Core: Convert FormatDateTimeFormatter to DateFormatter (elastic#36396)
This commit creates JodaDateFormatter to replace FormatDateTimeFormatter. It converts all uses of the old class to DateFormatter to allow a future change to use JavaDateFormatter when appropriate.
1 parent 50a3dfa commit bfc1c5b

File tree

26 files changed

+164
-143
lines changed

26 files changed

+164
-143
lines changed

client/rest-high-level/src/main/java/org/elasticsearch/client/watcher/WatchStatusDateParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
package org.elasticsearch.client.watcher;
2121

2222
import org.elasticsearch.ElasticsearchParseException;
23-
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
23+
import org.elasticsearch.common.time.DateFormatter;
2424
import org.elasticsearch.common.xcontent.XContentParser;
2525
import org.elasticsearch.index.mapper.DateFieldMapper;
2626
import org.joda.time.DateTime;
@@ -30,7 +30,7 @@
3030

3131
public final class WatchStatusDateParser {
3232

33-
private static final FormatDateTimeFormatter FORMATTER = DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER;
33+
private static final DateFormatter FORMATTER = DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER;
3434

3535
private WatchStatusDateParser() {
3636
// Prevent instantiation.

server/src/main/java/org/elasticsearch/cluster/metadata/IndexGraveyard.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ public int hashCode() {
429429

430430
@Override
431431
public String toString() {
432-
return "[index=" + index + ", deleteDate=" + Joda.getStrictStandardDateFormatter().printer().print(deleteDateInMillis) + "]";
432+
return "[index=" + index + ", deleteDate=" + Joda.getStrictStandardDateFormatter().formatMillis(deleteDateInMillis) + "]";
433433
}
434434

435435
@Override

server/src/main/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolver.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.elasticsearch.common.Nullable;
2727
import org.elasticsearch.common.Strings;
2828
import org.elasticsearch.common.collect.Tuple;
29-
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
29+
import org.elasticsearch.common.joda.JodaDateFormatter;
3030
import org.elasticsearch.common.regex.Regex;
3131
import org.elasticsearch.common.settings.Settings;
3232
import org.elasticsearch.common.time.DateMathParser;
@@ -936,11 +936,11 @@ String resolveExpression(String expression, final Context context) {
936936
dateFormatter = DateTimeFormat.forPattern(dateFormatterPattern);
937937
}
938938
DateTimeFormatter parser = dateFormatter.withLocale(Locale.ROOT).withZone(timeZone);
939-
FormatDateTimeFormatter formatter = new FormatDateTimeFormatter(dateFormatterPattern, parser, parser);
939+
JodaDateFormatter formatter = new JodaDateFormatter(dateFormatterPattern, parser, parser);
940940
DateMathParser dateMathParser = formatter.toDateMathParser();
941941
long millis = dateMathParser.parse(mathExpression, context::getStartTime, false,
942942
DateUtils.dateTimeZoneToZoneId(timeZone));
943-
String time = formatter.printer().print(millis);
943+
String time = formatter.formatMillis(millis);
944944
beforePlaceHolderSb.append(time);
945945
inPlaceHolderSb = new StringBuilder();
946946
inPlaceHolder = false;

server/src/main/java/org/elasticsearch/common/joda/Joda.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.common.joda;
2121

2222
import org.elasticsearch.common.Strings;
23+
import org.elasticsearch.common.time.DateFormatter;
2324
import org.joda.time.Chronology;
2425
import org.joda.time.DateTime;
2526
import org.joda.time.DateTimeField;
@@ -47,14 +48,14 @@
4748

4849
public class Joda {
4950

50-
public static FormatDateTimeFormatter forPattern(String input) {
51+
public static JodaDateFormatter forPattern(String input) {
5152
return forPattern(input, Locale.ROOT);
5253
}
5354

5455
/**
5556
* Parses a joda based pattern, including some named ones (similar to the built in Joda ISO ones).
5657
*/
57-
public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
58+
public static JodaDateFormatter forPattern(String input, Locale locale) {
5859
if (Strings.hasLength(input)) {
5960
input = input.trim();
6061
}
@@ -104,7 +105,7 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
104105
} else if ("dateOptionalTime".equals(input) || "date_optional_time".equals(input)) {
105106
// in this case, we have a separate parser and printer since the dataOptionalTimeParser can't print
106107
// this sucks we should use the root local by default and not be dependent on the node
107-
return new FormatDateTimeFormatter(input,
108+
return new JodaDateFormatter(input,
108109
ISODateTimeFormat.dateOptionalTimeParser().withLocale(locale).withZone(DateTimeZone.UTC),
109110
ISODateTimeFormat.dateTime().withLocale(locale).withZone(DateTimeZone.UTC));
110111
} else if ("dateTime".equals(input) || "date_time".equals(input)) {
@@ -181,7 +182,7 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
181182
} else if ("strictDateOptionalTime".equals(input) || "strict_date_optional_time".equals(input)) {
182183
// in this case, we have a separate parser and printer since the dataOptionalTimeParser can't print
183184
// this sucks we should use the root local by default and not be dependent on the node
184-
return new FormatDateTimeFormatter(input,
185+
return new JodaDateFormatter(input,
185186
StrictISODateTimeFormat.dateOptionalTimeParser().withLocale(locale).withZone(DateTimeZone.UTC),
186187
StrictISODateTimeFormat.dateTime().withLocale(locale).withZone(DateTimeZone.UTC));
187188
} else if ("strictDateTime".equals(input) || "strict_date_time".equals(input)) {
@@ -235,14 +236,14 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
235236
DateTimeParser[] parsers = new DateTimeParser[formats.length];
236237

237238
if (formats.length == 1) {
238-
formatter = forPattern(input, locale).parser();
239+
formatter = forPattern(input, locale).parser;
239240
} else {
240241
DateTimeFormatter dateTimeFormatter = null;
241242
for (int i = 0; i < formats.length; i++) {
242-
FormatDateTimeFormatter currentFormatter = forPattern(formats[i], locale);
243-
DateTimeFormatter currentParser = currentFormatter.parser();
243+
JodaDateFormatter currentFormatter = forPattern(formats[i], locale);
244+
DateTimeFormatter currentParser = currentFormatter.parser;
244245
if (dateTimeFormatter == null) {
245-
dateTimeFormatter = currentFormatter.printer();
246+
dateTimeFormatter = currentFormatter.printer;
246247
}
247248
parsers[i] = currentParser.getParser();
248249
}
@@ -260,10 +261,10 @@ public static FormatDateTimeFormatter forPattern(String input, Locale locale) {
260261
}
261262

262263
formatter = formatter.withLocale(locale).withZone(DateTimeZone.UTC);
263-
return new FormatDateTimeFormatter(input, formatter, formatter);
264+
return new JodaDateFormatter(input, formatter, formatter);
264265
}
265266

266-
public static FormatDateTimeFormatter getStrictStandardDateFormatter() {
267+
public static DateFormatter getStrictStandardDateFormatter() {
267268
// 2014/10/10
268269
DateTimeFormatter shortFormatter = new DateTimeFormatterBuilder()
269270
.appendFixedDecimal(DateTimeFieldType.year(), 4)
@@ -294,7 +295,7 @@ public static FormatDateTimeFormatter getStrictStandardDateFormatter() {
294295
new DateTimeParser[]{longFormatter.getParser(), shortFormatter.getParser(), new EpochTimeParser(true)});
295296

296297
DateTimeFormatter formatter = builder.toFormatter().withLocale(Locale.ROOT).withZone(DateTimeZone.UTC);
297-
return new FormatDateTimeFormatter("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis", formatter, formatter);
298+
return new JodaDateFormatter("yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis", formatter, formatter);
298299
}
299300

300301

server/src/main/java/org/elasticsearch/common/joda/FormatDateTimeFormatter.java renamed to server/src/main/java/org/elasticsearch/common/joda/JodaDateFormatter.java

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,36 @@
1919

2020
package org.elasticsearch.common.joda;
2121

22+
import org.elasticsearch.common.time.DateFormatter;
2223
import org.elasticsearch.common.time.DateMathParser;
2324
import org.elasticsearch.common.time.DateUtils;
2425
import org.joda.time.DateTime;
26+
import org.joda.time.DateTimeZone;
2527
import org.joda.time.format.DateTimeFormatter;
2628

29+
import java.time.Instant;
2730
import java.time.ZoneId;
31+
import java.time.ZonedDateTime;
32+
import java.time.temporal.TemporalAccessor;
2833
import java.util.Locale;
2934

30-
/**
31-
* A simple wrapper around {@link DateTimeFormatter} that retains the
32-
* format that was used to create it.
33-
*/
34-
public class FormatDateTimeFormatter {
35-
36-
private final String pattern;
35+
public class JodaDateFormatter implements DateFormatter {
36+
final String pattern;
3737

38-
private final DateTimeFormatter parser;
38+
final DateTimeFormatter parser;
3939

40-
private final DateTimeFormatter printer;
40+
final DateTimeFormatter printer;
4141

42-
public FormatDateTimeFormatter(String pattern, DateTimeFormatter parser, DateTimeFormatter printer) {
42+
public JodaDateFormatter(String pattern, DateTimeFormatter parser, DateTimeFormatter printer) {
4343
this.pattern = pattern;
4444
this.printer = printer.withDefaultYear(1970);
4545
this.parser = parser.withDefaultYear(1970);
4646
}
4747

48-
public String pattern() {
49-
return pattern;
48+
@Override
49+
public TemporalAccessor parse(String input) {
50+
DateTime dt = parser.parseDateTime(input);
51+
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(dt.getMillis()), DateUtils.dateTimeZoneToZoneId(dt.getZone()));
5052
}
5153

5254
public long parseMillis(String input) {
@@ -57,12 +59,26 @@ public DateTime parseJoda(String input) {
5759
return parser.parseDateTime(input);
5860
}
5961

60-
public DateTimeFormatter parser() {
61-
return parser;
62+
@Override
63+
public DateFormatter withZone(ZoneId zoneId) {
64+
DateTimeZone timeZone = DateUtils.zoneIdToDateTimeZone(zoneId);
65+
DateTimeFormatter parser = this.parser.withZone(timeZone);
66+
DateTimeFormatter printer = this.printer.withZone(timeZone);
67+
return new JodaDateFormatter(pattern, parser, printer);
6268
}
6369

64-
public DateTimeFormatter printer() {
65-
return this.printer;
70+
@Override
71+
public DateFormatter withLocale(Locale locale) {
72+
DateTimeFormatter parser = this.parser.withLocale(locale);
73+
DateTimeFormatter printer = this.printer.withLocale(locale);
74+
return new JodaDateFormatter(pattern, parser, printer);
75+
}
76+
77+
@Override
78+
public String format(TemporalAccessor accessor) {
79+
DateTimeZone timeZone = DateUtils.zoneIdToDateTimeZone(ZoneId.from(accessor));
80+
DateTime dateTime = new DateTime(Instant.from(accessor).toEpochMilli(), timeZone);
81+
return printer.print(dateTime);
6682
}
6783

6884
public String formatJoda(DateTime dateTime) {
@@ -73,26 +89,22 @@ public String formatMillis(long millis) {
7389
return printer.print(millis);
7490
}
7591

76-
public FormatDateTimeFormatter withZone(ZoneId zoneId) {
77-
DateTimeFormatter parser = this.parser.withZone(DateUtils.zoneIdToDateTimeZone(zoneId));
78-
DateTimeFormatter printer = this.printer.withZone(DateUtils.zoneIdToDateTimeZone(zoneId));
79-
return new FormatDateTimeFormatter(pattern, parser, printer);
80-
}
81-
82-
public FormatDateTimeFormatter withLocale(Locale locale) {
83-
DateTimeFormatter parser = this.parser.withLocale(locale);
84-
DateTimeFormatter printer = this.printer.withLocale(locale);
85-
return new FormatDateTimeFormatter(this.pattern, parser, printer);
92+
@Override
93+
public String pattern() {
94+
return pattern;
8695
}
8796

97+
@Override
8898
public Locale locale() {
89-
return parser.getLocale();
99+
return printer.getLocale();
90100
}
91101

102+
@Override
92103
public ZoneId zone() {
93-
return DateUtils.dateTimeZoneToZoneId(parser.getZone());
104+
return DateUtils.dateTimeZoneToZoneId(printer.getZone());
94105
}
95106

107+
@Override
96108
public DateMathParser toDateMathParser() {
97109
return new JodaDateMathParser(this);
98110
}

server/src/main/java/org/elasticsearch/common/joda/JodaDateMathParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939
*/
4040
public class JodaDateMathParser implements DateMathParser {
4141

42-
private final FormatDateTimeFormatter dateTimeFormatter;
42+
private final JodaDateFormatter dateTimeFormatter;
4343

44-
public JodaDateMathParser(FormatDateTimeFormatter dateTimeFormatter) {
44+
public JodaDateMathParser(JodaDateFormatter dateTimeFormatter) {
4545
Objects.requireNonNull(dateTimeFormatter);
4646
this.dateTimeFormatter = dateTimeFormatter;
4747
}
@@ -189,7 +189,7 @@ private long parseMath(String mathString, long time, boolean roundUp, DateTimeZo
189189
}
190190

191191
private long parseDateTime(String value, DateTimeZone timeZone, boolean roundUpIfNoTime) {
192-
DateTimeFormatter parser = dateTimeFormatter.parser();
192+
DateTimeFormatter parser = dateTimeFormatter.parser;
193193
if (timeZone != null) {
194194
parser = parser.withZone(timeZone);
195195
}

server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
import org.elasticsearch.common.Explicit;
3838
import org.elasticsearch.common.Nullable;
3939
import org.elasticsearch.common.geo.ShapeRelation;
40-
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
4140
import org.elasticsearch.common.joda.Joda;
4241
import org.elasticsearch.common.settings.Settings;
42+
import org.elasticsearch.common.time.DateFormatter;
4343
import org.elasticsearch.common.time.DateMathParser;
4444
import org.elasticsearch.common.time.DateUtils;
4545
import org.elasticsearch.common.util.LocaleUtils;
@@ -65,7 +65,7 @@
6565
public class DateFieldMapper extends FieldMapper {
6666

6767
public static final String CONTENT_TYPE = "date";
68-
public static final FormatDateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = Joda.forPattern(
68+
public static final DateFormatter DEFAULT_DATE_TIME_FORMATTER = Joda.forPattern(
6969
"strict_date_optional_time||epoch_millis", Locale.ROOT);
7070

7171
public static class Defaults {
@@ -109,7 +109,7 @@ public boolean isDateTimeFormatterSet() {
109109
return dateTimeFormatterSet;
110110
}
111111

112-
public Builder dateTimeFormatter(FormatDateTimeFormatter dateTimeFormatter) {
112+
public Builder dateTimeFormatter(DateFormatter dateTimeFormatter) {
113113
fieldType().setDateTimeFormatter(dateTimeFormatter);
114114
dateTimeFormatterSet = true;
115115
return this;
@@ -122,7 +122,7 @@ public void locale(Locale locale) {
122122
@Override
123123
protected void setupFieldType(BuilderContext context) {
124124
super.setupFieldType(context);
125-
FormatDateTimeFormatter dateTimeFormatter = fieldType().dateTimeFormatter;
125+
DateFormatter dateTimeFormatter = fieldType().dateTimeFormatter;
126126
if (!locale.equals(dateTimeFormatter.locale())) {
127127
fieldType().setDateTimeFormatter(dateTimeFormatter.withLocale(locale));
128128
}
@@ -179,7 +179,7 @@ public Mapper.Builder<?,?> parse(String name, Map<String, Object> node, ParserCo
179179
}
180180

181181
public static final class DateFieldType extends MappedFieldType {
182-
protected FormatDateTimeFormatter dateTimeFormatter;
182+
protected DateFormatter dateTimeFormatter;
183183
protected DateMathParser dateMathParser;
184184

185185
DateFieldType() {
@@ -230,11 +230,11 @@ public void checkCompatibility(MappedFieldType fieldType, List<String> conflicts
230230
}
231231
}
232232

233-
public FormatDateTimeFormatter dateTimeFormatter() {
233+
public DateFormatter dateTimeFormatter() {
234234
return dateTimeFormatter;
235235
}
236236

237-
public void setDateTimeFormatter(FormatDateTimeFormatter dateTimeFormatter) {
237+
public void setDateTimeFormatter(DateFormatter dateTimeFormatter) {
238238
checkIfFrozen();
239239
this.dateTimeFormatter = dateTimeFormatter;
240240
this.dateMathParser = dateTimeFormatter.toDateMathParser();
@@ -385,7 +385,7 @@ public Object valueForDisplay(Object value) {
385385

386386
@Override
387387
public DocValueFormat docValueFormat(@Nullable String format, DateTimeZone timeZone) {
388-
FormatDateTimeFormatter dateTimeFormatter = this.dateTimeFormatter;
388+
DateFormatter dateTimeFormatter = this.dateTimeFormatter;
389389
if (format != null) {
390390
dateTimeFormatter = Joda.forPattern(format);
391391
}

server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.elasticsearch.Version;
2525
import org.elasticsearch.common.Strings;
2626
import org.elasticsearch.common.collect.Tuple;
27-
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
27+
import org.elasticsearch.common.time.DateFormatter;
2828
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
2929
import org.elasticsearch.common.xcontent.XContentHelper;
3030
import org.elasticsearch.common.xcontent.XContentParser;
@@ -691,7 +691,7 @@ private static Mapper.Builder<?,?> createBuilderFromFieldType(final ParseContext
691691
return new NumberFieldMapper.Builder(name, NumberFieldMapper.NumberType.FLOAT);
692692
}
693693

694-
private static Mapper.Builder<?, ?> newDateBuilder(String name, FormatDateTimeFormatter dateTimeFormatter, Version indexCreated) {
694+
private static Mapper.Builder<?, ?> newDateBuilder(String name, DateFormatter dateTimeFormatter, Version indexCreated) {
695695
DateFieldMapper.Builder builder = new DateFieldMapper.Builder(name);
696696
if (dateTimeFormatter != null) {
697697
builder.dateTimeFormatter(dateTimeFormatter);
@@ -737,7 +737,7 @@ private static Mapper.Builder<?,?> createBuilderFromDynamicValue(final ParseCont
737737
// We refuse to match pure numbers, which are too likely to be
738738
// false positives with date formats that include eg.
739739
// `epoch_millis` or `YYYY`
740-
for (FormatDateTimeFormatter dateTimeFormatter : context.root().dynamicDateTimeFormatters()) {
740+
for (DateFormatter dateTimeFormatter : context.root().dynamicDateTimeFormatters()) {
741741
try {
742742
dateTimeFormatter.parseMillis(text);
743743
} catch (IllegalArgumentException e) {

0 commit comments

Comments
 (0)