summaryrefslogtreecommitdiff
path: root/src/main/java/design/persistence/JSONPersonalDatabase.java
diff options
context:
space:
mode:
authorTyler Ferrari <69283684+Sowgro@users.noreply.github.com>2025-10-03 21:46:13 -0400
committerGitHub <noreply@github.com>2025-10-03 21:46:13 -0400
commit578c6d6c2fc4127fdbdaa9d05c4c6888db5634bb (patch)
treec048f3ea1f72b4599d6888f90a6009fbc8dad8f1 /src/main/java/design/persistence/JSONPersonalDatabase.java
parent24926b9ec53aa4a3c3650d1e19c6baa170f178b7 (diff)
parent0d9775a779f656ab55a22e5df5f6f83f7069fa95 (diff)
downloaddesignproject-design-6-578c6d6c2fc4127fdbdaa9d05c4c6888db5634bb.tar.gz
designproject-design-6-578c6d6c2fc4127fdbdaa9d05c4c6888db5634bb.tar.bz2
designproject-design-6-578c6d6c2fc4127fdbdaa9d05c4c6888db5634bb.zip
Merge pull request #1 from RIT-SWEN-262/serialization-dev
Add Serialization / Deserialization
Diffstat (limited to '')
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
new file mode 100644
index 0000000..0efa362
--- /dev/null
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -0,0 +1,118 @@
+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.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 java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class JSONPersonalDatabase implements PersonalDatabase {
+
+ private final Map<String, Golfer> cache;
+ private final ObjectMapper mapper;
+ private final File file;
+
+ public JSONPersonalDatabase(String filename) {
+ this.file = new File(filename);
+ this.cache = new HashMap<>();
+ this.mapper = new ObjectMapper();
+
+ SimpleModule module = new SimpleModule();
+ module.addDeserializer(Course.class, new CourseIdDeserializer());
+ module.addSerializer(Course.class, new CourseIdSerializer());
+ mapper.registerModule(module);
+ mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+ mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
+ mapper.registerModule(new JavaTimeModule());
+
+ try {
+ load();
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private void load() throws IOException {
+ Golfer[] data = mapper.readValue(file, Golfer[].class);
+ cache.clear();
+ for (Golfer i : data) {
+ cache.put(i.getUsername(), i);
+ }
+ }
+
+ private void save() throws IOException {
+ Golfer[] data = cache.values().toArray(Golfer[]::new);
+ mapper.writer(new CustomPrettyPrinter()).writeValue(file, data);
+ }
+
+ @Override
+ public Golfer[] getGolfers() {
+ return new Golfer[0];
+ }
+
+ @Override
+ public Golfer getGolfer(String username) {
+ return cache.get(username);
+ }
+
+ @Override
+ public void addGolfer(Golfer golfer) throws IOException {
+ cache.put(golfer.getUsername(), golfer);
+ save();
+ }
+
+ @Override
+ public void removeGolfer(Golfer golfer) throws IOException {
+ cache.remove(golfer.getUsername());
+ save();
+ }
+
+ @Override
+ public void updateGolfer(Golfer golfer) throws IOException {
+ cache.put(golfer.getUsername(), golfer);
+ save();
+ }
+
+ private static class CourseIdSerializer extends JsonSerializer<Course> {
+ @Override
+ public void serialize(Course course, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ gen.writeNumber(course.getId());
+ }
+ }
+
+ private static class CourseIdDeserializer extends JsonDeserializer<Course> {
+ MasterDatabase masterDB = MasterDatabase.INSTANCE;
+
+ @Override
+ public Course deserialize(JsonParser p, DeserializationContext context) throws IOException {
+ int id = p.getValueAsInt();
+ return masterDB.getCourse(id);
+ }
+ }
+
+ private static class CustomPrettyPrinter extends DefaultPrettyPrinter {
+ public CustomPrettyPrinter() {
+ super._arrayIndenter = new DefaultIndenter();
+ super._objectFieldValueSeparatorWithSpaces = _separators.getObjectFieldValueSeparator() + " ";
+ super._arrayEmptySeparator = "";
+ }
+
+ @Override
+ public CustomPrettyPrinter createInstance() {
+ return new CustomPrettyPrinter();
+ }
+ }
+}