package design.persistence; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.util.DefaultIndenter; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import design.model.Course; import design.model.Golfer; import design.model.League; import java.io.IOException; import java.util.Map; import java.time.LocalDateTime; import java.util.List; public class Serializers { public static void configureMapper(ObjectMapper mapper) { mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)); mapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY)); mapper.registerModule(new JavaTimeModule()); mapper.registerModule(new SimpleModule() .addSerializer(Map.class, new Serializers.MapListSerializer()) .addDeserializer(Map.class, new Serializers.MapListDeserializer()) ); } public static class CustomPrettyPrinter extends DefaultPrettyPrinter { public CustomPrettyPrinter() { super._arrayIndenter = new DefaultIndenter(); super._objectFieldValueSeparatorWithSpaces = _separators.getObjectFieldValueSeparator() + " "; super._arrayEmptySeparator = ""; } @Override public CustomPrettyPrinter createInstance() { return new CustomPrettyPrinter(); } } public static class CourseIdSerializer extends JsonSerializer { @Override public void serialize(Course course, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeNumber(course.getId()); } } public static class CourseIdDeserializer extends JsonDeserializer { @Override public Course deserialize(JsonParser p, DeserializationContext context) throws IOException { MasterDatabase masterDB = MasterDatabase.instance(); int id = p.getValueAsInt(); return masterDB.getCourse(id); } } public static class LeagueIDSerializer extends JsonSerializer { @Override public void serialize(League value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeNumber(value.getId()); } } public static class LeagueIDDeserializer extends JsonDeserializer { @Override public League deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { LeagueDatabase leagueDB = LeagueDatabase.instance(); int id = p.getValueAsInt(); return leagueDB.getLeague(id); } } public static class GolferUsernameSerializer extends JsonSerializer { @Override public void serialize(Golfer course, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(course.getUsername()); } } public static class GolferUsernameDeserializer extends JsonDeserializer { @Override public Golfer deserialize(JsonParser p, DeserializationContext context) throws IOException { PersonalDatabase personalDB = PersonalDatabase.instance(); String username = p.getValueAsString(); return personalDB.getGolfer(username); } } public static class DateTimeStringSerializer extends JsonSerializer { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.toString()); } } @SuppressWarnings("rawtypes") public static class MapListSerializer extends JsonSerializer { @Override public void serialize(Map value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeObject(value.entrySet()); } } @SuppressWarnings("rawtypes") public static class MapListDeserializer extends JsonDeserializer { @Override public Map deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { return Map.ofEntries(p.readValueAs(Map.Entry[].class)); } } }