36
36
import org .opensearch .core .common .Strings ;
37
37
38
38
import java .text .ParsePosition ;
39
+ import java .time .DateTimeException ;
39
40
import java .time .ZoneId ;
40
41
import java .time .format .DateTimeFormatter ;
41
42
import java .time .format .DateTimeFormatterBuilder ;
52
53
import java .util .Locale ;
53
54
import java .util .Map ;
54
55
import java .util .Objects ;
55
- import java .util .concurrent .CopyOnWriteArrayList ;
56
56
import java .util .function .BiConsumer ;
57
57
import java .util .stream .Collectors ;
58
58
@@ -70,11 +70,11 @@ class JavaDateFormatter implements DateFormatter {
70
70
71
71
private final String format ;
72
72
private final String printFormat ;
73
- private final DateTimeFormatter printer ;
74
- private final List <DateTimeFormatter > parsers ;
73
+ private final OpenSearchDateTimePrinter printer ;
74
+ private final List <OpenSearchDateTimeFormatter > parsers ;
75
75
private final JavaDateFormatter roundupParser ;
76
76
private final Boolean canCacheLastParsedFormatter ;
77
- private volatile DateTimeFormatter lastParsedformatter = null ;
77
+ private volatile OpenSearchDateTimeFormatter lastParsedformatter = null ;
78
78
79
79
/**
80
80
* A round up formatter
@@ -83,11 +83,11 @@ class JavaDateFormatter implements DateFormatter {
83
83
*/
84
84
static class RoundUpFormatter extends JavaDateFormatter {
85
85
86
- RoundUpFormatter (String format , List <DateTimeFormatter > roundUpParsers ) {
86
+ RoundUpFormatter (String format , List <OpenSearchDateTimeFormatter > roundUpParsers ) {
87
87
super (format , firstFrom (roundUpParsers ), null , roundUpParsers );
88
88
}
89
89
90
- private static DateTimeFormatter firstFrom (List <DateTimeFormatter > roundUpParsers ) {
90
+ private static OpenSearchDateTimeFormatter firstFrom (List <OpenSearchDateTimeFormatter > roundUpParsers ) {
91
91
return roundUpParsers .get (0 );
92
92
}
93
93
@@ -101,14 +101,18 @@ JavaDateFormatter getRoundupParser() {
101
101
JavaDateFormatter (
102
102
String format ,
103
103
String printFormat ,
104
- DateTimeFormatter printer ,
104
+ OpenSearchDateTimePrinter printer ,
105
105
Boolean canCacheLastParsedFormatter ,
106
- DateTimeFormatter ... parsers
106
+ OpenSearchDateTimeFormatter ... parsers
107
107
) {
108
108
this (format , printFormat , printer , ROUND_UP_BASE_FIELDS , canCacheLastParsedFormatter , parsers );
109
109
}
110
110
111
111
JavaDateFormatter (String format , DateTimeFormatter printer , DateTimeFormatter ... parsers ) {
112
+ this (format , format , wrapFormatter (printer ), false , wrapAllFormatters (parsers ));
113
+ }
114
+
115
+ JavaDateFormatter (String format , OpenSearchDateTimePrinter printer , OpenSearchDateTimeFormatter ... parsers ) {
112
116
this (format , format , printer , false , parsers );
113
117
}
114
118
@@ -127,19 +131,19 @@ JavaDateFormatter getRoundupParser() {
127
131
JavaDateFormatter (
128
132
String format ,
129
133
String printFormat ,
130
- DateTimeFormatter printer ,
134
+ OpenSearchDateTimePrinter printer ,
131
135
BiConsumer <DateTimeFormatterBuilder , DateTimeFormatter > roundupParserConsumer ,
132
136
Boolean canCacheLastParsedFormatter ,
133
- DateTimeFormatter ... parsers
137
+ OpenSearchDateTimeFormatter ... parsers
134
138
) {
135
139
if (printer == null ) {
136
140
throw new IllegalArgumentException ("printer may not be null" );
137
141
}
138
- long distinctZones = Arrays .stream (parsers ).map (DateTimeFormatter ::getZone ).distinct ().count ();
142
+ long distinctZones = Arrays .stream (parsers ).map (OpenSearchDateTimeFormatter ::getZone ).distinct ().count ();
139
143
if (distinctZones > 1 ) {
140
144
throw new IllegalArgumentException ("formatters must have the same time zone" );
141
145
}
142
- long distinctLocales = Arrays .stream (parsers ).map (DateTimeFormatter ::getLocale ).distinct ().count ();
146
+ long distinctLocales = Arrays .stream (parsers ).map (OpenSearchDateTimeFormatter ::getLocale ).distinct ().count ();
143
147
if (distinctLocales > 1 ) {
144
148
throw new IllegalArgumentException ("formatters must have the same locale" );
145
149
}
@@ -149,12 +153,12 @@ JavaDateFormatter getRoundupParser() {
149
153
this .canCacheLastParsedFormatter = canCacheLastParsedFormatter ;
150
154
151
155
if (parsers .length == 0 ) {
152
- this .parsers = Collections .singletonList (printer );
156
+ this .parsers = Collections .singletonList (( OpenSearchDateTimeFormatter ) printer );
153
157
} else {
154
158
this .parsers = Arrays .asList (parsers );
155
159
}
156
160
List <DateTimeFormatter > roundUp = createRoundUpParser (format , roundupParserConsumer );
157
- this .roundupParser = new RoundUpFormatter (format , roundUp );
161
+ this .roundupParser = new RoundUpFormatter (format , wrapAllFormatters ( roundUp ) );
158
162
}
159
163
160
164
JavaDateFormatter (
@@ -163,7 +167,7 @@ JavaDateFormatter getRoundupParser() {
163
167
BiConsumer <DateTimeFormatterBuilder , DateTimeFormatter > roundupParserConsumer ,
164
168
DateTimeFormatter ... parsers
165
169
) {
166
- this (format , format , printer , roundupParserConsumer , false , parsers );
170
+ this (format , format , wrapFormatter ( printer ) , roundupParserConsumer , false , wrapAllFormatters ( parsers ) );
167
171
}
168
172
169
173
/**
@@ -181,7 +185,8 @@ private List<DateTimeFormatter> createRoundUpParser(
181
185
) {
182
186
if (format .contains ("||" ) == false ) {
183
187
List <DateTimeFormatter > roundUpParsers = new ArrayList <>();
184
- for (DateTimeFormatter parser : this .parsers ) {
188
+ for (OpenSearchDateTimeFormatter customparser : this .parsers ) {
189
+ DateTimeFormatter parser = customparser .getFormatter ();
185
190
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder ();
186
191
builder .append (parser );
187
192
roundupParserConsumer .accept (builder , parser );
@@ -201,12 +206,12 @@ public static DateFormatter combined(
201
206
assert formatters .size () > 0 ;
202
207
assert printFormatter != null ;
203
208
204
- List <DateTimeFormatter > parsers = new ArrayList <>(formatters .size ());
205
- List <DateTimeFormatter > roundUpParsers = new ArrayList <>(formatters .size ());
209
+ List <OpenSearchDateTimeFormatter > parsers = new ArrayList <>(formatters .size ());
210
+ List <OpenSearchDateTimeFormatter > roundUpParsers = new ArrayList <>(formatters .size ());
206
211
207
212
assert printFormatter instanceof JavaDateFormatter ;
208
213
JavaDateFormatter javaPrintFormatter = (JavaDateFormatter ) printFormatter ;
209
- DateTimeFormatter printer = javaPrintFormatter .getPrinter ();
214
+ OpenSearchDateTimePrinter printer = javaPrintFormatter .getPrinter ();
210
215
for (DateFormatter formatter : formatters ) {
211
216
assert formatter instanceof JavaDateFormatter ;
212
217
JavaDateFormatter javaDateFormatter = (JavaDateFormatter ) formatter ;
@@ -227,9 +232,9 @@ public static DateFormatter combined(
227
232
private JavaDateFormatter (
228
233
String format ,
229
234
String printFormat ,
230
- DateTimeFormatter printer ,
231
- List <DateTimeFormatter > roundUpParsers ,
232
- List <DateTimeFormatter > parsers ,
235
+ OpenSearchDateTimePrinter printer ,
236
+ List <OpenSearchDateTimeFormatter > roundUpParsers ,
237
+ List <OpenSearchDateTimeFormatter > parsers ,
233
238
Boolean canCacheLastParsedFormatter
234
239
) {
235
240
this .format = format ;
@@ -245,6 +250,15 @@ private JavaDateFormatter(
245
250
DateTimeFormatter printer ,
246
251
List <DateTimeFormatter > roundUpParsers ,
247
252
List <DateTimeFormatter > parsers
253
+ ) {
254
+ this (format , format , wrapFormatter (printer ), wrapAllFormatters (roundUpParsers ), wrapAllFormatters (parsers ), false );
255
+ }
256
+
257
+ private JavaDateFormatter (
258
+ String format ,
259
+ OpenSearchDateTimePrinter printer ,
260
+ List <OpenSearchDateTimeFormatter > roundUpParsers ,
261
+ List <OpenSearchDateTimeFormatter > parsers
248
262
) {
249
263
this (format , format , printer , roundUpParsers , parsers , false );
250
264
}
@@ -253,7 +267,7 @@ JavaDateFormatter getRoundupParser() {
253
267
return roundupParser ;
254
268
}
255
269
256
- DateTimeFormatter getPrinter () {
270
+ OpenSearchDateTimePrinter getPrinter () {
257
271
return printer ;
258
272
}
259
273
@@ -265,7 +279,7 @@ public TemporalAccessor parse(String input) {
265
279
266
280
try {
267
281
return doParse (input );
268
- } catch (DateTimeParseException e ) {
282
+ } catch (DateTimeException e ) {
269
283
throw new IllegalArgumentException ("failed to parse date field [" + input + "] with format [" + format + "]" , e );
270
284
}
271
285
}
@@ -289,14 +303,14 @@ private TemporalAccessor doParse(String input) {
289
303
Object object = null ;
290
304
if (canCacheLastParsedFormatter && lastParsedformatter != null ) {
291
305
ParsePosition pos = new ParsePosition (0 );
292
- object = lastParsedformatter .toFormat (). parseObject (input , pos );
306
+ object = lastParsedformatter .parseObject (input , pos );
293
307
if (parsingSucceeded (object , input , pos )) {
294
308
return (TemporalAccessor ) object ;
295
309
}
296
310
}
297
- for (DateTimeFormatter formatter : parsers ) {
311
+ for (OpenSearchDateTimeFormatter formatter : parsers ) {
298
312
ParsePosition pos = new ParsePosition (0 );
299
- object = formatter .toFormat (). parseObject (input , pos );
313
+ object = formatter .parseObject (input , pos );
300
314
if (parsingSucceeded (object , input , pos )) {
301
315
lastParsedformatter = formatter ;
302
316
return (TemporalAccessor ) object ;
@@ -312,16 +326,28 @@ private boolean parsingSucceeded(Object object, String input, ParsePosition pos)
312
326
return object != null && pos .getIndex () == input .length ();
313
327
}
314
328
329
+ private static OpenSearchDateTimeFormatter wrapFormatter (DateTimeFormatter formatter ) {
330
+ return new OpenSearchDateTimeFormatter (formatter );
331
+ }
332
+
333
+ private static OpenSearchDateTimeFormatter [] wrapAllFormatters (DateTimeFormatter ... formatters ) {
334
+ return Arrays .stream (formatters ).map (JavaDateFormatter ::wrapFormatter ).toArray (OpenSearchDateTimeFormatter []::new );
335
+ }
336
+
337
+ private static List <OpenSearchDateTimeFormatter > wrapAllFormatters (List <DateTimeFormatter > formatters ) {
338
+ return formatters .stream ().map (JavaDateFormatter ::wrapFormatter ).collect (Collectors .toList ());
339
+ }
340
+
315
341
@ Override
316
342
public DateFormatter withZone (ZoneId zoneId ) {
317
343
// shortcurt to not create new objects unnecessarily
318
344
if (zoneId .equals (zone ())) {
319
345
return this ;
320
346
}
321
- List <DateTimeFormatter > parsers = new CopyOnWriteArrayList <>(
347
+ List <OpenSearchDateTimeFormatter > parsers = new ArrayList <>(
322
348
this .parsers .stream ().map (p -> p .withZone (zoneId )).collect (Collectors .toList ())
323
349
);
324
- List <DateTimeFormatter > roundUpParsers = this .roundupParser .getParsers ()
350
+ List <OpenSearchDateTimeFormatter > roundUpParsers = this .roundupParser .getParsers ()
325
351
.stream ()
326
352
.map (p -> p .withZone (zoneId ))
327
353
.collect (Collectors .toList ());
@@ -334,10 +360,10 @@ public DateFormatter withLocale(Locale locale) {
334
360
if (locale .equals (locale ())) {
335
361
return this ;
336
362
}
337
- List <DateTimeFormatter > parsers = new CopyOnWriteArrayList <>(
363
+ List <OpenSearchDateTimeFormatter > parsers = new ArrayList <>(
338
364
this .parsers .stream ().map (p -> p .withLocale (locale )).collect (Collectors .toList ())
339
365
);
340
- List <DateTimeFormatter > roundUpParsers = this .roundupParser .getParsers ()
366
+ List <OpenSearchDateTimeFormatter > roundUpParsers = this .roundupParser .getParsers ()
341
367
.stream ()
342
368
.map (p -> p .withLocale (locale ))
343
369
.collect (Collectors .toList ());
@@ -396,7 +422,7 @@ public String toString() {
396
422
return String .format (Locale .ROOT , "format[%s] locale[%s]" , format , locale ());
397
423
}
398
424
399
- Collection <DateTimeFormatter > getParsers () {
425
+ Collection <OpenSearchDateTimeFormatter > getParsers () {
400
426
return parsers ;
401
427
}
402
428
}
0 commit comments