Skip to content

Commit c481399

Browse files
committed
fixup! fixup! fixup! fixup! fixup! Support for jsonformat in duration deserializer based on Duration::of(long,TemporalUnit). ref FasterXML#184
1 parent 343abbc commit c481399

File tree

3 files changed

+30
-26
lines changed

3 files changed

+30
-26
lines changed

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,12 @@ public class DurationDeserializer extends JSR310DeserializerBase<Duration>
5555

5656
/**
5757
* Since 2.12
58+
* When set, values will be deserialized using the specified unit. Using this parser will tipically
59+
* override the value specified in {@link DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS} as it is
60+
* considered that the unit set in {@link JsonFormat#pattern()} has precedence since is more specific.
61+
* @see [jackson-modules-java8#184] for more info
5862
*/
59-
private DurationPattern _durationPattern;
63+
private DurationUnitParser _durationUnitParser;
6064

6165
private DurationDeserializer()
6266
{
@@ -70,9 +74,9 @@ protected DurationDeserializer(DurationDeserializer base, Boolean leniency) {
7074
super(base, leniency);
7175
}
7276

73-
protected DurationDeserializer(DurationDeserializer base, DurationPattern durationPattern) {
77+
protected DurationDeserializer(DurationDeserializer base, DurationUnitParser durationUnitParser) {
7478
super(base, base._isLenient);
75-
_durationPattern = durationPattern;
79+
_durationUnitParser = durationUnitParser;
7680
}
7781

7882
@Override
@@ -94,15 +98,15 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
9498
}
9599
}
96100
if (format.hasPattern()) {
97-
deser = DurationPattern.from(format.getPattern())
101+
deser = DurationUnitParser.from(format.getPattern())
98102
.map(deser::withPattern)
99103
.orElse(deser);
100104
}
101105
}
102106
return deser;
103107
}
104108

105-
private DurationDeserializer withPattern(DurationPattern pattern) {
109+
private DurationDeserializer withPattern(DurationUnitParser pattern) {
106110
return new DurationDeserializer(this, pattern);
107111
}
108112

@@ -113,14 +117,14 @@ public Duration deserialize(JsonParser parser, DeserializationContext context) t
113117
{
114118
case JsonTokenId.ID_NUMBER_FLOAT:
115119
BigDecimal decValue = parser.getDecimalValue();
116-
if (_durationPattern != null) {
117-
return _durationPattern.parse(decValue.longValue());
120+
if (_durationUnitParser != null) {
121+
return _durationUnitParser.parse(decValue.longValue());
118122
}
119123
return DecimalUtils.extractSecondsAndNanos(decValue, Duration::ofSeconds);
120124
case JsonTokenId.ID_NUMBER_INT:
121125
long intValue = parser.getLongValue();
122-
if (_durationPattern != null) {
123-
return _durationPattern.parse(intValue);
126+
if (_durationUnitParser != null) {
127+
return _durationUnitParser.parse(intValue);
124128
}
125129
return _fromTimestamp(context, intValue);
126130
case JsonTokenId.ID_STRING:
@@ -160,8 +164,8 @@ && _isValidTimestampString(value)) {
160164
}
161165

162166
try {
163-
if (_durationPattern != null) {
164-
return _durationPattern.parse(NumberInput.parseLong(value));
167+
if (_durationUnitParser != null) {
168+
return _durationUnitParser.parse(NumberInput.parseLong(value));
165169
}
166170

167171
return Duration.parse(value);
@@ -177,21 +181,21 @@ protected Duration _fromTimestamp(DeserializationContext ctxt, long ts) {
177181
return Duration.ofMillis(ts);
178182
}
179183

180-
protected static class DurationPattern {
184+
protected static class DurationUnitParser {
181185
final TemporalUnit unit;
182186

183-
DurationPattern(TemporalUnit unit) {
187+
DurationUnitParser(TemporalUnit unit) {
184188
this.unit = unit;
185189
}
186190

187191
Duration parse(long value) {
188192
return Duration.of(value, unit);
189193
}
190194

191-
static Optional<DurationPattern> from(String pattern) {
195+
static Optional<DurationUnitParser> from(String unit) {
192196
return Stream.of(ChronoUnit.values())
193-
.filter(u -> u.toString().equalsIgnoreCase(pattern))
194-
.map(DurationPattern::new)
197+
.filter(u -> u.toString().equalsIgnoreCase(unit))
198+
.map(DurationUnitParser::new)
195199
.findFirst();
196200
}
197201
}
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
package com.fasterxml.jackson.datatype.jsr310.deser;
22

3-
import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer.DurationPattern;
3+
import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer.DurationUnitParser;
44
import org.junit.Test;
55

66
import static java.util.Optional.empty;
77
import static org.junit.Assert.assertEquals;
88

9-
public class DurationPatternEmptyTest {
9+
public class DurationUnitParserEmptyTest {
1010

1111
@Test
1212
public void shouldReturnEmpty_whenNull() {
13-
assertEquals(empty(), DurationPattern.from(null));
13+
assertEquals(empty(), DurationUnitParser.from(null));
1414
}
1515

1616
@Test
1717
public void shouldReturnEmpty_whenEmptyString() {
18-
assertEquals(empty(), DurationPattern.from(""));
18+
assertEquals(empty(), DurationUnitParser.from(""));
1919
}
2020

2121
@Test
2222
public void shouldReturnEmpty_whenSpaces() {
23-
assertEquals(empty(), DurationPattern.from(" "));
23+
assertEquals(empty(), DurationUnitParser.from(" "));
2424
}
2525

2626
@Test
2727
public void shouldReturnEmpty_whenDoesNotMatchAnyTemporalUnit() {
28-
assertEquals(empty(), DurationPattern.from("DOESNOTMATCH"));
28+
assertEquals(empty(), DurationUnitParser.from("DOESNOTMATCH"));
2929
}
3030
}

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationPatternTest.java renamed to datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationUnitParserTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.fasterxml.jackson.datatype.jsr310.deser;
22

3-
import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer.DurationPattern;
3+
import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer.DurationUnitParser;
44
import org.junit.Test;
55
import org.junit.runner.RunWith;
66
import org.junit.runners.Parameterized;
@@ -19,19 +19,19 @@
1919
import static org.junit.Assert.assertEquals;
2020

2121
@RunWith(Parameterized.class)
22-
public class DurationPatternTest {
22+
public class DurationUnitParserTest {
2323

2424
private final String stringPattern;
2525
private final TemporalUnit temporalUnit;
2626

27-
public DurationPatternTest(String stringPattern, TemporalUnit temporalUnit) {
27+
public DurationUnitParserTest(String stringPattern, TemporalUnit temporalUnit) {
2828
this.stringPattern = stringPattern;
2929
this.temporalUnit = temporalUnit;
3030
}
3131

3232
@Test
3333
public void shouldMapToTemporalUnit() {
34-
Optional<DurationPattern> durationPattern = DurationPattern.from(stringPattern);
34+
Optional<DurationUnitParser> durationPattern = DurationUnitParser.from(stringPattern);
3535

3636
assertEquals(of(temporalUnit), durationPattern.map(dp -> dp.unit));
3737
}

0 commit comments

Comments
 (0)