summaryrefslogtreecommitdiff
path: root/src/main/java/design/persistence/JSONPersonalDatabase.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/design/persistence/JSONPersonalDatabase.java')
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java65
1 files changed, 41 insertions, 24 deletions
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
index a2908f3..2f021d7 100644
--- a/src/main/java/design/persistence/JSONPersonalDatabase.java
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -1,14 +1,7 @@
package design.persistence;
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.core.StreamReadFeature;
import com.fasterxml.jackson.databind.*;
-import com.fasterxml.jackson.databind.json.JsonMapper;
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;
@@ -29,6 +22,12 @@ public class JSONPersonalDatabase implements PersonalDatabase {
return INSTANCE;
}
+ // static instance strictly for testing, to not add data to personaldb.json
+ static JSONPersonalDatabase testInstance(String filename) {
+ INSTANCE = new JSONPersonalDatabase(filename);
+ return INSTANCE;
+ }
+
private final Map<String, Golfer> cache;
private final ObjectMapper mapper;
private final File file;
@@ -36,23 +35,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
private JSONPersonalDatabase(String filename) {
this.file = new File(filename);
this.cache = new HashMap<>();
- this.mapper = JsonMapper.builder().enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION).build();
-
- // TODO: Once the saved JSON matches the model, consider removing.
- // TEMP: tolerate unknown props while the model stabilizes
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-
- SimpleModule module = new SimpleModule();
- module.addDeserializer(Course.class, new Serializers.CourseIdDeserializer());
- module.addSerializer(Course.class, new Serializers.CourseIdSerializer());
- module.addSerializer(League.class, new Serializers.LeagueIDSerializer());
- module.addDeserializer(League.class, new Serializers.LeagueIDDeserializer());
- module.addSerializer(Map.class, new Serializers.MapListSerializer());
- module.addDeserializer(Map.class, new Serializers.MapListDeserializer());
- mapper.registerModule(module);
- mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
- mapper.registerModule(new JavaTimeModule());
+ this.mapper = new ObjectMapper();
+
+ Serializers.configureMapper(mapper);
+ mapper.registerModule(this.getJacksonModule());
try {
load();
@@ -102,4 +88,35 @@ public class JSONPersonalDatabase implements PersonalDatabase {
cache.put(golfer.getUsername(), golfer);
save();
}
+
+ @Override
+ public void importData(Object rawData) throws IOException {
+ if (!(rawData instanceof Golfer[] data)) {
+ throw new ClassCastException();
+ }
+ cache.clear();
+ for (Golfer golfer : data) {
+ cache.put(golfer.getUsername(), golfer);
+ }
+ save();
+ }
+
+ @Override
+ public Golfer[] exportData() {
+ return getGolfers();
+ }
+
+ @Override
+ public SimpleModule getJacksonModule() {
+ return new SimpleModule()
+ .addSerializer(Course.class, new Serializers.CourseIdSerializer())
+ .addDeserializer(Course.class, new Serializers.CourseIdDeserializer())
+ .addSerializer(League.class, new Serializers.LeagueIDSerializer())
+ .addDeserializer(League.class, new Serializers.LeagueIDDeserializer());
+ }
+
+ @Override
+ public Class<?> getTargetClass() {
+ return Golfer[].class;
+ }
}