summaryrefslogtreecommitdiff
path: root/src/main/java/design/persistence
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/design/persistence')
-rw-r--r--src/main/java/design/persistence/JSONLeagueDatabase.java100
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java50
-rw-r--r--src/main/java/design/persistence/LeagueDatabase.java21
-rw-r--r--src/main/java/design/persistence/MasterDatabase.java2
-rw-r--r--src/main/java/design/persistence/PersonalDatabase.java5
-rw-r--r--src/main/java/design/persistence/Serializers.java79
-rw-r--r--src/main/java/design/persistence/XMLParser.java32
7 files changed, 256 insertions, 33 deletions
diff --git a/src/main/java/design/persistence/JSONLeagueDatabase.java b/src/main/java/design/persistence/JSONLeagueDatabase.java
new file mode 100644
index 0000000..8b201e6
--- /dev/null
+++ b/src/main/java/design/persistence/JSONLeagueDatabase.java
@@ -0,0 +1,100 @@
+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.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;
+
+public class JSONLeagueDatabase implements LeagueDatabase {
+
+ private static JSONLeagueDatabase INSTANCE;
+
+ public static JSONLeagueDatabase instance() {
+ if (INSTANCE == null) {
+ INSTANCE = new JSONLeagueDatabase("data/leaguedb.json");
+ }
+ return INSTANCE;
+ }
+
+ 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 Serializers.CourseIdDeserializer());
+ module.addSerializer(Course.class, new Serializers.CourseIdSerializer());
+ module.addDeserializer(Golfer.class, new Serializers.GolferUsernameDeserializer());
+ module.addSerializer(Golfer.class, new Serializers.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() throws IOException {
+ League[] data = mapper.readValue(file, League[].class);
+ cache.clear();
+ Arrays.stream(data).forEach(i -> cache.put(i.getId(), i));
+ }
+
+ private void save() throws IOException {
+ League[] data = cache.values().toArray(League[]::new);
+ mapper.writer(new Serializers.CustomPrettyPrinter()).writeValue(file, data);
+ }
+
+ @Override
+ public League getLeague(int id) {
+ return cache.get(id);
+ }
+
+ @Override
+ public League[] getLeagues() {
+ return cache.values().toArray(League[]::new);
+ }
+
+ @Override
+ public void addLeague(League league) throws IOException {
+ league.setId(nextLeagueID++);
+ cache.putIfAbsent(league.getId(), league);
+ save();
+ }
+
+ @Override
+ public void removeLeague(League league) throws IOException {
+ cache.remove(league.getId());
+ save();
+ }
+
+ @Override
+ public void updateLeague(League league) throws IOException {
+ cache.put(league.getId(), league);
+ save();
+ }
+}
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
index 70aa1ab..2f003cb 100644
--- a/src/main/java/design/persistence/JSONPersonalDatabase.java
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -3,21 +3,16 @@ 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.Club;
import design.model.Course;
import design.model.Golfer;
+import design.model.League;
import java.io.File;
import java.io.IOException;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -46,8 +41,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule module = new SimpleModule();
- module.addDeserializer(Course.class, new CourseIdDeserializer());
- module.addSerializer(Course.class, new CourseIdSerializer());
+ 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());
mapper.registerModule(module);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
@@ -70,7 +67,7 @@ public class JSONPersonalDatabase implements PersonalDatabase {
private void save() throws IOException {
Golfer[] data = cache.values().toArray(Golfer[]::new);
- mapper.writer(new CustomPrettyPrinter()).writeValue(file, data);
+ mapper.writer(new Serializers.CustomPrettyPrinter()).writeValue(file, data);
}
// turns that collection into a real array of golfers
@@ -102,33 +99,20 @@ public class JSONPersonalDatabase implements PersonalDatabase {
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);
- }
+ @Override
+ public File exportData() throws IOException{
+ save();
+ return file;
}
- private static class CustomPrettyPrinter extends DefaultPrettyPrinter {
- public CustomPrettyPrinter() {
- super._arrayIndenter = new DefaultIndenter();
- super._objectFieldValueSeparatorWithSpaces = _separators.getObjectFieldValueSeparator() + " ";
- super._arrayEmptySeparator = "";
+ @Override
+ public void importData(File newFile) throws IOException {
+ Golfer[] newGolfers = mapper.readValue(newFile, Golfer[].class);
+ cache.clear();
+ for (Golfer g : newGolfers) {
+ cache.put(g.getUsername(), g);
}
- @Override
- public CustomPrettyPrinter createInstance() {
- return new CustomPrettyPrinter();
- }
+ save();
}
}
diff --git a/src/main/java/design/persistence/LeagueDatabase.java b/src/main/java/design/persistence/LeagueDatabase.java
new file mode 100644
index 0000000..953624d
--- /dev/null
+++ b/src/main/java/design/persistence/LeagueDatabase.java
@@ -0,0 +1,21 @@
+package design.persistence;
+
+import design.model.League;
+
+import java.io.IOException;
+
+public interface LeagueDatabase {
+ static LeagueDatabase instance() {
+ return JSONLeagueDatabase.instance();
+ }
+
+ League getLeague(int id);
+
+ League[] getLeagues();
+
+ void addLeague(League league) throws IOException;
+
+ void removeLeague(League league) throws IOException;
+
+ void updateLeague(League league) throws IOException;
+}
diff --git a/src/main/java/design/persistence/MasterDatabase.java b/src/main/java/design/persistence/MasterDatabase.java
index 59e3ebd..86e326b 100644
--- a/src/main/java/design/persistence/MasterDatabase.java
+++ b/src/main/java/design/persistence/MasterDatabase.java
@@ -10,6 +10,8 @@ public interface MasterDatabase {
}
Course[] getCourses();
+
CourseList getCourseList(); // unique from courses as this is a composite of ICourses.
+
Course getCourse(int id);
}
diff --git a/src/main/java/design/persistence/PersonalDatabase.java b/src/main/java/design/persistence/PersonalDatabase.java
index adb865d..186474e 100644
--- a/src/main/java/design/persistence/PersonalDatabase.java
+++ b/src/main/java/design/persistence/PersonalDatabase.java
@@ -2,6 +2,7 @@ package design.persistence;
import design.model.Golfer;
import java.io.IOException;
+import java.io.File;
public interface PersonalDatabase {
@@ -18,4 +19,8 @@ public interface PersonalDatabase {
void removeGolfer(Golfer golfer) throws IOException;
void updateGolfer(Golfer golfer) throws IOException;
+
+ void importData(File newFile) throws IOException;
+
+ File exportData() throws IOException;
}
diff --git a/src/main/java/design/persistence/Serializers.java b/src/main/java/design/persistence/Serializers.java
new file mode 100644
index 0000000..3940b44
--- /dev/null
+++ b/src/main/java/design/persistence/Serializers.java
@@ -0,0 +1,79 @@
+package design.persistence;
+
+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.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import design.model.Course;
+import design.model.Golfer;
+import design.model.League;
+
+import java.io.IOException;
+
+public class Serializers {
+ 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<Course> {
+ @Override
+ public void serialize(Course course, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ gen.writeNumber(course.getId());
+ }
+ }
+
+ public static class CourseIdDeserializer extends JsonDeserializer<Course> {
+ @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<League> {
+ @Override
+ public void serialize(League value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ gen.writeNumber(value.getId());
+ }
+ }
+
+ public static class LeagueIDDeserializer extends JsonDeserializer<League> {
+ @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<Golfer> {
+ @Override
+ public void serialize(Golfer course, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ gen.writeString(course.getUsername());
+ }
+ }
+
+ public static class GolferUsernameDeserializer extends JsonDeserializer<Golfer> {
+
+ @Override
+ public Golfer deserialize(JsonParser p, DeserializationContext context) throws IOException {
+ PersonalDatabase personalDB = PersonalDatabase.instance();
+ String username = p.getValueAsString();
+ return personalDB.getGolfer(username);
+ }
+ }
+}
diff --git a/src/main/java/design/persistence/XMLParser.java b/src/main/java/design/persistence/XMLParser.java
new file mode 100644
index 0000000..472931a
--- /dev/null
+++ b/src/main/java/design/persistence/XMLParser.java
@@ -0,0 +1,32 @@
+package design.persistence;
+import java.io.File;
+import java.io.IOException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import design.model.Golfer;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+
+
+public class XMLParser {
+
+ private final ObjectMapper jsonMapper = new ObjectMapper();
+ private final XmlMapper xmlMapper = new XmlMapper();
+
+ public File exportData() throws IOException {
+ File jsonData = JSONPersonalDatabase.instance().exportData();
+ Golfer[] golfers = jsonMapper.readValue(jsonData, Golfer[].class);
+ File xmlFile = new File("data/data.xml");
+ xmlMapper.writerWithDefaultPrettyPrinter().writeValue(xmlFile, golfers);
+ return xmlFile;
+ }
+
+ public void importData(File xmlFile) throws IOException {
+ Golfer[] golfers = xmlMapper.readValue(xmlFile, Golfer[].class);
+ File tempJson = File.createTempFile("imported", ".json");
+ jsonMapper.writerWithDefaultPrettyPrinter().writeValue(tempJson, golfers);
+ JSONPersonalDatabase.instance().importData(tempJson);
+ tempJson.delete();
+ }
+}