diff options
Diffstat (limited to 'src/main/java')
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; } |
