29
29
import java .time .temporal .ChronoField ;
30
30
import java .time .temporal .TemporalAccessor ;
31
31
import java .time .temporal .TemporalField ;
32
+ import java .util .ArrayList ;
32
33
import java .util .Arrays ;
33
34
import java .util .Collection ;
34
35
import java .util .Collections ;
@@ -57,19 +58,33 @@ class JavaDateFormatter implements DateFormatter {
57
58
private final String format ;
58
59
private final DateTimeFormatter printer ;
59
60
private final List <DateTimeFormatter > parsers ;
60
- private final DateTimeFormatter roundupParser ;
61
+ private final JavaDateFormatter roundupParser ;
61
62
62
- private JavaDateFormatter (String format , DateTimeFormatter printer , DateTimeFormatter roundupParser , List <DateTimeFormatter > parsers ) {
63
- this .format = format ;
64
- this .printer = printer ;
65
- this .roundupParser = roundupParser ;
66
- this .parsers = parsers ;
63
+ static class RoundUpFormatter extends JavaDateFormatter {
64
+
65
+ RoundUpFormatter (String format , List <DateTimeFormatter > roundUpParsers ) {
66
+ super (format , firstFrom (roundUpParsers ),null , roundUpParsers );
67
+ }
68
+
69
+ private static DateTimeFormatter firstFrom (List <DateTimeFormatter > roundUpParsers ) {
70
+ return roundUpParsers .get (0 );
71
+ }
72
+
73
+ @ Override
74
+ JavaDateFormatter getRoundupParser () {
75
+ throw new UnsupportedOperationException ("RoundUpFormatter does not have another roundUpFormatter" );
76
+ }
67
77
}
78
+
79
+ // named formatters use default roundUpParser
68
80
JavaDateFormatter (String format , DateTimeFormatter printer , DateTimeFormatter ... parsers ) {
69
81
this (format , printer , builder -> ROUND_UP_BASE_FIELDS .forEach (builder ::parseDefaulting ), parsers );
70
82
}
71
83
72
- JavaDateFormatter (String format , DateTimeFormatter printer , Consumer <DateTimeFormatterBuilder > roundupParserConsumer ,
84
+ // subclasses override roundUpParser
85
+ JavaDateFormatter (String format ,
86
+ DateTimeFormatter printer ,
87
+ Consumer <DateTimeFormatterBuilder > roundupParserConsumer ,
73
88
DateTimeFormatter ... parsers ) {
74
89
if (printer == null ) {
75
90
throw new IllegalArgumentException ("printer may not be null" );
@@ -90,20 +105,51 @@ private JavaDateFormatter(String format, DateTimeFormatter printer, DateTimeForm
90
105
} else {
91
106
this .parsers = Arrays .asList (parsers );
92
107
}
108
+ //this is when the RoundUp Formatter is created. In further merges (with ||) it will only append this one to a list.
109
+ List <DateTimeFormatter > roundUp = createRoundUpParser (format , roundupParserConsumer );
110
+ this .roundupParser = new RoundUpFormatter (format , roundUp ) ;
111
+ }
93
112
94
- DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder ();
113
+ private List <DateTimeFormatter > createRoundUpParser (String format ,
114
+ Consumer <DateTimeFormatterBuilder > roundupParserConsumer ) {
95
115
if (format .contains ("||" ) == false ) {
116
+ DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder ();
96
117
builder .append (this .parsers .get (0 ));
118
+ roundupParserConsumer .accept (builder );
119
+ return Arrays .asList (builder .toFormatter (locale ()));
97
120
}
98
- roundupParserConsumer .accept (builder );
99
- DateTimeFormatter roundupFormatter = builder .toFormatter (locale ());
100
- if (printer .getZone () != null ) {
101
- roundupFormatter = roundupFormatter .withZone (zone ());
121
+ return null ;
122
+ }
123
+
124
+ public static DateFormatter combined (String input , List <DateFormatter > formatters ) {
125
+ assert formatters .size () > 0 ;
126
+
127
+ List <DateTimeFormatter > parsers = new ArrayList <>(formatters .size ());
128
+ List <DateTimeFormatter > roundUpParsers = new ArrayList <>(formatters .size ());
129
+
130
+ DateTimeFormatter printer = null ;
131
+ for (DateFormatter formatter : formatters ) {
132
+ assert formatter instanceof JavaDateFormatter ;
133
+ JavaDateFormatter javaDateFormatter = (JavaDateFormatter ) formatter ;
134
+ if (printer == null ) {
135
+ printer = javaDateFormatter .getPrinter ();
136
+ }
137
+ parsers .addAll (javaDateFormatter .getParsers ());
138
+ roundUpParsers .addAll (javaDateFormatter .getRoundupParser ().getParsers ());
102
139
}
103
- this .roundupParser = roundupFormatter ;
140
+
141
+ return new JavaDateFormatter (input , printer , roundUpParsers , parsers );
142
+ }
143
+
144
+ private JavaDateFormatter (String format , DateTimeFormatter printer , List <DateTimeFormatter > roundUpParsers ,
145
+ List <DateTimeFormatter > parsers ) {
146
+ this .format = format ;
147
+ this .printer = printer ;
148
+ this .roundupParser = roundUpParsers != null ? new RoundUpFormatter (format , roundUpParsers ) : null ;
149
+ this .parsers = parsers ;
104
150
}
105
151
106
- DateTimeFormatter getRoundupParser () {
152
+ JavaDateFormatter getRoundupParser () {
107
153
return roundupParser ;
108
154
}
109
155
@@ -162,8 +208,12 @@ public DateFormatter withZone(ZoneId zoneId) {
162
208
if (zoneId .equals (zone ())) {
163
209
return this ;
164
210
}
165
- return new JavaDateFormatter (format , printer .withZone (zoneId ), getRoundupParser ().withZone (zoneId ),
166
- parsers .stream ().map (p -> p .withZone (zoneId )).collect (Collectors .toList ()));
211
+ List <DateTimeFormatter > parsers = this .parsers .stream ().map (p -> p .withZone (zoneId )).collect (Collectors .toList ());
212
+ List <DateTimeFormatter > roundUpParsers = this .roundupParser .getParsers ()
213
+ .stream ()
214
+ .map (p -> p .withZone (zoneId ))
215
+ .collect (Collectors .toList ());
216
+ return new JavaDateFormatter (format , printer .withZone (zoneId ), roundUpParsers , parsers );
167
217
}
168
218
169
219
@ Override
@@ -172,8 +222,12 @@ public DateFormatter withLocale(Locale locale) {
172
222
if (locale .equals (locale ())) {
173
223
return this ;
174
224
}
175
- return new JavaDateFormatter (format , printer .withLocale (locale ), getRoundupParser ().withLocale (locale ),
176
- parsers .stream ().map (p -> p .withLocale (locale )).collect (Collectors .toList ()));
225
+ List <DateTimeFormatter > parsers = this .parsers .stream ().map (p -> p .withLocale (locale )).collect (Collectors .toList ());
226
+ List <DateTimeFormatter > roundUpParsers = this .roundupParser .getParsers ()
227
+ .stream ()
228
+ .map (p -> p .withLocale (locale ))
229
+ .collect (Collectors .toList ());
230
+ return new JavaDateFormatter (format , printer .withLocale (locale ), roundUpParsers , parsers );
177
231
}
178
232
179
233
@ Override
0 commit comments