Skip to content

Commit

Permalink
api
Browse files Browse the repository at this point in the history
  • Loading branch information
oleg-cherednik committed Jan 2, 2024
1 parent 8851720 commit 5103a52
Show file tree
Hide file tree
Showing 13 changed files with 52 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,7 @@ private static ObjectMapper registerModules(ObjectMapper mapper, JsonSettings se
settings.getLocalDateTimeFormatter(),
settings.getOffsetTimeFormatter(),
settings.getOffsetDateTimeFormatter(),
settings.getZonedDateTimeFormatter(),
settings.getZoneModifier()));
settings.getZonedDateTimeFormatter()));
});

return mapper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,8 @@
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.UnaryOperator;

/**
* @author Oleg Cherednik
Expand All @@ -74,7 +72,6 @@ public class JacksonJavaTimeModule extends SimpleModule {
protected final transient DateTimeFormatter offsetTime;
protected final transient DateTimeFormatter offsetDateTime;
protected final transient DateTimeFormatter zonedDateTime;
protected final UnaryOperator<ZoneId> zoneModifier;

@Override
public void setupModule(SetupContext context) {
Expand Down Expand Up @@ -104,9 +101,9 @@ private void addSerializers(SetupContext context) {
ser.addSerializer(LocalDate.class, JacksonLocalDateSerializer.with(localDate));
ser.addSerializer(LocalTime.class, JacksonLocalTimeSerializer.with(localTime));
ser.addSerializer(LocalDateTime.class, JacksonLocalDateTimeSerializer.with(localDateTime));
ser.addSerializer(OffsetTime.class, JacksonOffsetTimeSerializer.with(offsetTime, zoneModifier));
ser.addSerializer(OffsetDateTime.class, JacksonOffsetDateTimeSerializer.with(offsetDateTime, zoneModifier));
ser.addSerializer(ZonedDateTime.class, JacksonZonedDateTimeSerializer.with(zonedDateTime, zoneModifier));
ser.addSerializer(OffsetTime.class, JacksonOffsetTimeSerializer.with(offsetTime));
ser.addSerializer(OffsetDateTime.class, JacksonOffsetDateTimeSerializer.with(offsetDateTime));
ser.addSerializer(ZonedDateTime.class, JacksonZonedDateTimeSerializer.with(zonedDateTime));

context.addSerializers(ser);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,10 @@ protected JacksonLocalDateTimeSerializer withFormat(Boolean useTimestamp,

@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (useTimestamp(provider))
if (useTimestamp(provider) || _formatter != null)
super.serialize(value, gen, provider);
else if (_formatter == null)
gen.writeString(value.toString());
else
gen.writeString(_formatter.format(value));
gen.writeString(value.toString());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.datatype.jsr310.ser.OffsetDateTimeSerializer;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import ru.olegcherednik.json.api.JsonSettings;

import java.time.ZoneId;
Expand All @@ -31,45 +33,37 @@
* @author Oleg Cherednik
* @since 01.12.2023
*/
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class JacksonOffsetDateTimeSerializer extends OffsetDateTimeSerializer {

private static final long serialVersionUID = -954133191249891146L;

public static final JacksonOffsetDateTimeSerializer INSTANCE = new JacksonOffsetDateTimeSerializer();

protected final UnaryOperator<ZoneId> zoneModifier;

public static JacksonOffsetDateTimeSerializer with(DateTimeFormatter df, UnaryOperator<ZoneId> zoneModifier) {
public static JacksonOffsetDateTimeSerializer with(DateTimeFormatter df) {
return new JacksonOffsetDateTimeSerializer(INSTANCE,
INSTANCE._useTimestamp,
INSTANCE._useNanoseconds,
df,
zoneModifier);
}

protected JacksonOffsetDateTimeSerializer() {
zoneModifier = JsonSettings.DEFAULT_ZONE_MODIFIER;
df);
}

protected JacksonOffsetDateTimeSerializer(JacksonOffsetDateTimeSerializer base,
Boolean useTimestamp,
Boolean useNanoseconds,
DateTimeFormatter df,
UnaryOperator<ZoneId> zoneModifier) {
DateTimeFormatter df) {
super(base, useTimestamp, useNanoseconds, df);
this.zoneModifier = zoneModifier;
}

@Override
protected JacksonOffsetDateTimeSerializer withFormat(Boolean useTimestamp,
DateTimeFormatter df,
JsonFormat.Shape shape) {
return new JacksonOffsetDateTimeSerializer(this, useTimestamp, _useNanoseconds, df, zoneModifier);
return new JacksonOffsetDateTimeSerializer(this, useTimestamp, _useNanoseconds, df);
}

@Override
protected JacksonOffsetDateTimeSerializer withFeatures(Boolean writeZoneId, Boolean useNanoseconds) {
return new JacksonOffsetDateTimeSerializer(this, _useTimestamp, useNanoseconds, _formatter, zoneModifier);
return new JacksonOffsetDateTimeSerializer(this, _useTimestamp, useNanoseconds, _formatter);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,12 @@
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.datatype.jsr310.ser.OffsetTimeSerializer;
import ru.olegcherednik.json.api.JsonSettings;

import java.io.IOException;
import java.time.Instant;
import java.time.OffsetTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.function.UnaryOperator;

/**
* @author Oleg Cherednik
Expand All @@ -43,44 +40,39 @@ public class JacksonOffsetTimeSerializer extends OffsetTimeSerializer {

public static final JacksonOffsetTimeSerializer INSTANCE = new JacksonOffsetTimeSerializer();

protected final UnaryOperator<ZoneId> zoneModifier;
protected final JsonFormat.Shape shape;

public static JacksonOffsetTimeSerializer with(DateTimeFormatter df, UnaryOperator<ZoneId> zoneModifier) {
public static JacksonOffsetTimeSerializer with(DateTimeFormatter df) {
return new JacksonOffsetTimeSerializer(INSTANCE,
INSTANCE._useTimestamp,
INSTANCE._useNanoseconds,
df,
zoneModifier,
INSTANCE.shape);
}

protected JacksonOffsetTimeSerializer() {
zoneModifier = JsonSettings.DEFAULT_ZONE_MODIFIER;
shape = null;
}

protected JacksonOffsetTimeSerializer(JacksonOffsetTimeSerializer base,
Boolean useTimestamp,
Boolean useNanoseconds,
DateTimeFormatter df,
UnaryOperator<ZoneId> zoneModifier,
JsonFormat.Shape shape) {
super(base, useTimestamp, useNanoseconds, df);
this.zoneModifier = zoneModifier;
this.shape = shape;
}

@Override
protected JacksonOffsetTimeSerializer withFormat(Boolean useTimestamp,
DateTimeFormatter df,
JsonFormat.Shape shape) {
return new JacksonOffsetTimeSerializer(this, useTimestamp, _useNanoseconds, df, zoneModifier, shape);
return new JacksonOffsetTimeSerializer(this, useTimestamp, _useNanoseconds, df, shape);
}

@Override
protected JacksonOffsetTimeSerializer withFeatures(Boolean writeZoneId, Boolean writeNanoseconds) {
return new JacksonOffsetTimeSerializer(this, _useTimestamp, writeNanoseconds, _formatter, zoneModifier, shape);
return new JacksonOffsetTimeSerializer(this, _useTimestamp, writeNanoseconds, _formatter, shape);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,83 +20,59 @@
package ru.olegcherednik.json.jackson.datetime.serializers;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer;
import ru.olegcherednik.json.api.JsonSettings;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.io.IOException;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
import java.util.function.UnaryOperator;

import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_WITH_CONTEXT_TIME_ZONE;

/**
* @author Oleg Cherednik
* @since 01.12.2023
*/
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class JacksonZonedDateTimeSerializer extends ZonedDateTimeSerializer {

private static final long serialVersionUID = -6441103051278765460L;

public static final JacksonZonedDateTimeSerializer INSTANCE = new JacksonZonedDateTimeSerializer();

protected final UnaryOperator<ZoneId> zoneModifier;

public static JacksonZonedDateTimeSerializer with(DateTimeFormatter df, UnaryOperator<ZoneId> zoneModifier) {
public static JacksonZonedDateTimeSerializer with(DateTimeFormatter df) {
return new JacksonZonedDateTimeSerializer(INSTANCE,
INSTANCE._useTimestamp,
INSTANCE._useNanoseconds,
df,
INSTANCE._shape,
Optional.ofNullable(INSTANCE._writeZoneId).orElse(false),
zoneModifier);
}

protected JacksonZonedDateTimeSerializer() {
zoneModifier = JsonSettings.DEFAULT_ZONE_MODIFIER;
Optional.ofNullable(INSTANCE._writeZoneId).orElse(false));
}

protected JacksonZonedDateTimeSerializer(JacksonZonedDateTimeSerializer base,
Boolean useTimestamp,
Boolean useNanoseconds,
DateTimeFormatter df,
JsonFormat.Shape shape,
Boolean writeZoneId,
UnaryOperator<ZoneId> zoneModifier) {
Boolean writeZoneId) {
super(base, useTimestamp, useNanoseconds, df, shape, writeZoneId);
this.zoneModifier = zoneModifier;
}

@Override
protected JacksonZonedDateTimeSerializer withFormat(Boolean useTimestamp,
DateTimeFormatter df,
JsonFormat.Shape shape) {
return new JacksonZonedDateTimeSerializer(this, useTimestamp, _useNanoseconds,
df, shape, _writeZoneId, zoneModifier);
return new JacksonZonedDateTimeSerializer(this, useTimestamp, _useNanoseconds, df, shape, _writeZoneId);
}

@Override
protected JacksonZonedDateTimeSerializer withFeatures(Boolean writeZoneId, Boolean writeNanoseconds) {
return new JacksonZonedDateTimeSerializer(this, _useTimestamp, writeNanoseconds,
_formatter, _shape, writeZoneId, zoneModifier);
}

@Override
public void serialize(ZonedDateTime value, JsonGenerator generator, SerializerProvider provider)
throws IOException {
super.serialize(value, generator, provider);
// if (_formatter == null || useTimestamp(provider))
// super.serialize(value, generator, provider);
// else if (_formatter.getZone() == null) {
// ZoneId zoneId = zoneModifier.apply(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getZone());
// generator.writeString(_formatter.withZone(zoneId).format(value));
// } else
// generator.writeString(_formatter.format(value));
_formatter, _shape, writeZoneId);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,6 @@ private DataTwo(@JsonProperty("instant") Instant instant,

@Getter
@EqualsAndHashCode
@ToString
private static final class DataThree {

@JsonFormat(shape = JsonFormat.Shape.NUMBER_INT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ public void foo() throws JsonProcessingException {
JsonSettings.DEFAULT.getLocalDateTimeFormatter(),
JsonSettings.DEFAULT.getOffsetTimeFormatter(),
JsonSettings.DEFAULT.getOffsetDateTimeFormatter(),
JsonSettings.DEFAULT.getZonedDateTimeFormatter(),
JsonSettings.DEFAULT.getZoneModifier()));
JsonSettings.DEFAULT.getZonedDateTimeFormatter()));

System.out.println(objectMapper.writeValueAsString(Collections.singletonMap(zdtLocal.minusYears(5).toInstant(), zdtLocal.toInstant())));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.testng.annotations.Test;
import ru.olegcherednik.json.api.Json;
import ru.olegcherednik.json.api.JsonSettings;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
Expand All @@ -43,7 +45,7 @@
@Test
public class JacksonLocalDateTimeSerializerTest {

private static final LocalDateTime LOCAL_DATE_TIME = LocalDateTime.parse("2023-12-10T19:22:40.758927");
private static final LocalDateTime LOCAL_DATE_TIME = LocalDateTime.parse("2023-12-10T19:22:40.758");

public void shouldUseToStringWhenDateFormatIsNull() throws JsonProcessingException {
SimpleModule module = createModule(null);
Expand All @@ -52,8 +54,12 @@ public void shouldUseToStringWhenDateFormatIsNull() throws JsonProcessingExcepti
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.registerModule(module);

String json = mapper.writeValueAsString(new Data(LOCAL_DATE_TIME));
assertThat(json).isEqualTo("{\"map\":{\"localDateTime\":\"2023-12-10T19:22:40.758927\"}}");
Data expected = new Data(LOCAL_DATE_TIME);
String json = mapper.writeValueAsString(expected);
assertThat(json).isEqualTo("{\"map\":{\"localDateTime\":\"2023-12-10T19:22:40.758\"}}");

Data actual = Json.readValue(json, Data.class);
assertThat(actual).isEqualTo(expected);
}

public void shouldUseArrayWhenWriteDateAsTimestamps() throws JsonProcessingException {
Expand All @@ -63,18 +69,27 @@ public void shouldUseArrayWhenWriteDateAsTimestamps() throws JsonProcessingExcep
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.registerModule(module);

String json = mapper.writeValueAsString(new Data(LOCAL_DATE_TIME));
assertThat(json).isEqualTo("{\"map\":{\"localDateTime\":[2023,12,10,19,22,40,758927000]}}");
Data expected = new Data(LOCAL_DATE_TIME);
String json = mapper.writeValueAsString(expected);
assertThat(json).isEqualTo("{\"map\":{\"localDateTime\":[2023,12,10,19,22,40,758000000]}}");

Data actual = Json.readValue(json, Data.class);
assertThat(actual).isEqualTo(expected);
}

public void shouldUseDateFormatWhenDateFormatNotNull() throws JsonProcessingException {
DateTimeFormatter df = DateTimeFormatter.ofPattern("dd-MM-yyyy'T'ss:MM:yyyy");
DateTimeFormatter df = DateTimeFormatter.ofPattern("'[one] 'yyyy-MM-dd'T'HH:mm:ss.SSS");
SimpleModule module = createModule(df);

ObjectMapper mapper = new ObjectMapper().registerModule(module);

String json = mapper.writeValueAsString(new Data(LOCAL_DATE_TIME));
assertThat(json).isEqualTo("{\"map\":{\"localDateTime\":\"10-12-2023T40:12:2023\"}}");
Data expected = new Data(LOCAL_DATE_TIME);
String json = mapper.writeValueAsString(expected);
assertThat(json).isEqualTo("{\"map\":{\"localDateTime\":\"[one] 2023-12-10T19:22:40.758\"}}");

JsonSettings settings = JsonSettings.builder().localDateTimeFormatter(df).build();
Data actual = Json.createReader(settings).readValue(json, Data.class);
assertThat(actual).isEqualTo(expected);
}

private static SimpleModule createModule(DateTimeFormatter df) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ private static SimpleModule createModule(DateTimeFormatter df) {
}

@Getter
@ToString
@EqualsAndHashCode
@SuppressWarnings("AssignmentOrReturnOfFieldWithMutableType")
private static final class Data {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.testng.annotations.Test;
import ru.olegcherednik.json.api.ZoneModifier;
import ru.olegcherednik.json.jackson.LocalTimeZone;
import ru.olegcherednik.json.jackson.LocalZoneId;

Expand Down Expand Up @@ -186,7 +185,7 @@ class Data {

private static SimpleModule createModule(DateTimeFormatter df) {
SimpleModule module = new SimpleModule();
module.addSerializer(OffsetDateTime.class, JacksonOffsetDateTimeSerializer.with(df, ZoneModifier.USE_ORIGINAL));
module.addSerializer(OffsetDateTime.class, JacksonOffsetDateTimeSerializer.with(df));
return module;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.testng.annotations.Test;
import ru.olegcherednik.json.api.ZoneModifier;
import ru.olegcherednik.json.jackson.LocalZoneId;

import java.time.OffsetTime;
Expand Down Expand Up @@ -160,7 +159,7 @@ class Data {

private static SimpleModule createModule(DateTimeFormatter df) {
SimpleModule module = new SimpleModule();
module.addSerializer(OffsetTime.class, JacksonOffsetTimeSerializer.with(df, ZoneModifier.USE_ORIGINAL));
module.addSerializer(OffsetTime.class, JacksonOffsetTimeSerializer.with(df));
return module;
}

Expand Down
Loading

0 comments on commit 5103a52

Please sign in to comment.