summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2025-11-09 01:01:03 -0500
committersowgro <tpoke.ferrari@gmail.com>2025-11-09 01:01:03 -0500
commit7a87c716e85a12c72c24173b88b2e07729d85241 (patch)
treea1c995918bf83b74834b47b2013da196a4a97632 /src
parente56ad78ddba089b5bb93af96e33ee7c42b7d0b51 (diff)
downloaddesignproject-design-6-7a87c716e85a12c72c24173b88b2e07729d85241.tar.gz
designproject-design-6-7a87c716e85a12c72c24173b88b2e07729d85241.tar.bz2
designproject-design-6-7a87c716e85a12c72c24173b88b2e07729d85241.zip
complete serialization
Diffstat (limited to '')
-rw-r--r--src/main/java/design/model/League.java21
-rw-r--r--src/main/java/design/persistence/JSONLeagueDatabase.java72
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java8
-rw-r--r--src/main/java/design/persistence/LeagueDatabase.java8
4 files changed, 92 insertions, 17 deletions
diff --git a/src/main/java/design/model/League.java b/src/main/java/design/model/League.java
index 98c9bdd..eb9eef5 100644
--- a/src/main/java/design/model/League.java
+++ b/src/main/java/design/model/League.java
@@ -1,16 +1,19 @@
package design.model;
+import com.fasterxml.jackson.annotation.JsonCreator;
+
import java.util.Date;
public abstract class League {
- private final int id;
+ private int id;
private final String name;
private final Date registrationDate;
private final Date startDate;
private final Date endDate;
private final Golfer owner;
- public League(int id, String name, Date registrationDate, Date startDate, Date endDate, Golfer owner) {
+ @JsonCreator
+ private League(int id, String name, Date registrationDate, Date startDate, Date endDate, Golfer owner) {
this.id = id;
this.name = name;
this.registrationDate = registrationDate;
@@ -19,6 +22,15 @@ public abstract class League {
this.owner = owner;
}
+ public League(String name, Date registrationDate, Date startDate, Date endDate, Golfer owner) {
+ this.id = -1;
+ this.name = name;
+ this.registrationDate = registrationDate;
+ this.startDate = startDate;
+ this.endDate = endDate;
+ this.owner = owner;
+ }
+
public int getId() {
return id;
}
@@ -42,4 +54,9 @@ public abstract class League {
public Golfer getOwner() {
return owner;
}
+
+ public void setId(int id) {
+ assert this.id == -1;
+ this.id = id;
+ }
}
diff --git a/src/main/java/design/persistence/JSONLeagueDatabase.java b/src/main/java/design/persistence/JSONLeagueDatabase.java
index 01f4fc3..78e1903 100644
--- a/src/main/java/design/persistence/JSONLeagueDatabase.java
+++ b/src/main/java/design/persistence/JSONLeagueDatabase.java
@@ -1,11 +1,26 @@
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.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.File;
+import java.io.IOException;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
+import static design.persistence.JSONPersonalDatabase.*;
+
public class JSONLeagueDatabase implements LeagueDatabase {
private static JSONLeagueDatabase INSTANCE;
@@ -18,19 +33,44 @@ public class JSONLeagueDatabase implements LeagueDatabase {
}
private final Map<Integer, League> cache;
+ private final ObjectMapper mapper;
private final File file;
+ private int nextLeagueID;
public JSONLeagueDatabase(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());
+ module.addDeserializer(Golfer.class, new GolferUsernameDeserializer());
+ module.addSerializer(Golfer.class, new GolferUsernameSerializer());
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ 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);
+ }
+
+ this.nextLeagueID = cache.values().stream().mapToInt(League::getId).max().orElse(0) + 1;
}
- private void load() {
- //TODO impl
+ private void load() throws IOException {
+ League[] data = mapper.readValue(file, League[].class);
+ cache.clear();
+ Arrays.stream(data).forEach(i -> cache.put(i.getId(), i));
}
- private void save() {
- //TODO impl
+ private void save() throws IOException {
+ League[] data = cache.values().toArray(League[]::new);
+ mapper.writer(new CustomPrettyPrinter()).writeValue(file, data);
}
@Override
@@ -44,20 +84,38 @@ public class JSONLeagueDatabase implements LeagueDatabase {
}
@Override
- public void addLeague(League league) {
+ public void addLeague(League league) throws IOException {
+ league.setId(nextLeagueID++);
cache.putIfAbsent(league.getId(), league);
save();
}
@Override
- public void removeLeague(League league) {
+ public void removeLeague(League league) throws IOException {
cache.remove(league.getId());
save();
}
@Override
- public void updateLeague(League league) {
+ public void updateLeague(League league) throws IOException {
cache.put(league.getId(), league);
save();
}
+
+ protected static class GolferUsernameSerializer extends JsonSerializer<Golfer> {
+ @Override
+ public void serialize(Golfer course, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ gen.writeString(course.getUsername());
+ }
+ }
+
+ protected static class GolferUsernameDeserializer extends JsonDeserializer<Golfer> {
+ PersonalDatabase personalDB = PersonalDatabase.instance();
+
+ @Override
+ public Golfer deserialize(JsonParser p, DeserializationContext context) throws IOException {
+ String username = p.getValueAsString();
+ return personalDB.getGolfer(username);
+ }
+ }
}
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
index 70aa1ab..00b6398 100644
--- a/src/main/java/design/persistence/JSONPersonalDatabase.java
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -11,13 +11,11 @@ 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.Club;
import design.model.Course;
import design.model.Golfer;
import java.io.File;
import java.io.IOException;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -102,14 +100,14 @@ public class JSONPersonalDatabase implements PersonalDatabase {
save();
}
- private static class CourseIdSerializer extends JsonSerializer<Course> {
+ protected 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> {
+ protected static class CourseIdDeserializer extends JsonDeserializer<Course> {
MasterDatabase masterDB = MasterDatabase.instance();
@Override
@@ -119,7 +117,7 @@ public class JSONPersonalDatabase implements PersonalDatabase {
}
}
- private static class CustomPrettyPrinter extends DefaultPrettyPrinter {
+ protected static class CustomPrettyPrinter extends DefaultPrettyPrinter {
public CustomPrettyPrinter() {
super._arrayIndenter = new DefaultIndenter();
super._objectFieldValueSeparatorWithSpaces = _separators.getObjectFieldValueSeparator() + " ";
diff --git a/src/main/java/design/persistence/LeagueDatabase.java b/src/main/java/design/persistence/LeagueDatabase.java
index 2ab3e30..953624d 100644
--- a/src/main/java/design/persistence/LeagueDatabase.java
+++ b/src/main/java/design/persistence/LeagueDatabase.java
@@ -2,6 +2,8 @@ package design.persistence;
import design.model.League;
+import java.io.IOException;
+
public interface LeagueDatabase {
static LeagueDatabase instance() {
return JSONLeagueDatabase.instance();
@@ -11,9 +13,9 @@ public interface LeagueDatabase {
League[] getLeagues();
- void addLeague(League league);
+ void addLeague(League league) throws IOException;
- void removeLeague(League league);
+ void removeLeague(League league) throws IOException;
- void updateLeague(League league);
+ void updateLeague(League league) throws IOException;
}