summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/design/model/League.java19
-rw-r--r--src/main/java/design/model/Match.java22
-rw-r--r--src/main/java/design/model/ScrambleLeague.java25
-rw-r--r--src/main/java/design/model/StrokeLeague.java23
-rw-r--r--src/main/java/design/model/statistics/LeagueStats.java50
-rw-r--r--src/main/java/design/persistence/Serializers.java31
6 files changed, 158 insertions, 12 deletions
diff --git a/src/main/java/design/model/League.java b/src/main/java/design/model/League.java
index 8793c86..2a7366a 100644
--- a/src/main/java/design/model/League.java
+++ b/src/main/java/design/model/League.java
@@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import java.util.Map;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
@@ -25,6 +26,7 @@ public abstract class League {
private final Date endDate;
private final Golfer owner;
private final List<Match> schedule;
+ private final List<Match> completedMatches;
private boolean completed;
@JsonCreator
@@ -37,6 +39,13 @@ public abstract class League {
this.owner = owner;
this.schedule = schedule != null ? schedule : new ArrayList<>();
this.completed = false;
+
+ this.completedMatches = new ArrayList<>();
+ for(Match m : this.schedule){
+ if(m.checkCompletion()){
+ completedMatches.add(m);
+ }
+ }
}
public League(String name, Date registrationDate, Date startDate, Date endDate, Golfer owner) {
@@ -48,6 +57,8 @@ public abstract class League {
this.owner = owner;
this.schedule = new ArrayList<>();
this.completed = false;
+
+ this.completedMatches = new ArrayList<>();
}
public int getId() {
@@ -82,6 +93,10 @@ public abstract class League {
return completed;
}
+ public List<Match> getCompletedMatches() {
+ return completedMatches;
+ }
+
public void addMatchToSchedule(Match match) {
if(match.getDateScheduled().after(endDate)){
throw new IllegalArgumentException("Cannot create match after league has ended");
@@ -112,4 +127,8 @@ public abstract class League {
public abstract void recordPlay(Golfer player, Match match, Round round);
public abstract void finalizeLeague();
+
+ public abstract Map<?, Integer> getResults();
+
+ public abstract void finalizeMatch(Match match);
}
diff --git a/src/main/java/design/model/Match.java b/src/main/java/design/model/Match.java
index 4f01c98..525f281 100644
--- a/src/main/java/design/model/Match.java
+++ b/src/main/java/design/model/Match.java
@@ -5,28 +5,34 @@ import com.fasterxml.jackson.annotation.JsonCreator;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
public class Match {
private final Course course;
private final Date dateScheduled;
private final LocalDateTime start;
+ private final LocalDateTime end;
private final int holeCount;
private final List<Round> rounds;
+ private final Map<Integer, Round> roundMap = new HashMap<>();
@JsonCreator
- private Match(Course course, Date dateScheduled, LocalDateTime start, int holeCount, List<Round> rounds) {
+ private Match(Course course, Date dateScheduled, LocalDateTime start, LocalDateTime end, int holeCount, List<Round> rounds) {
this.course = course;
this.dateScheduled = dateScheduled;
this.start = start;
+ this.end = end;
this.holeCount = holeCount;
this.rounds = rounds;
}
- public Match(Course course, Date dateScheduled, LocalDateTime start, int holeCount) {
+ public Match(Course course, Date dateScheduled, LocalDateTime start, LocalDateTime end, int holeCount) {
this.course = course;
this.dateScheduled = dateScheduled;
this.start = start;
+ this.end = end;
this.holeCount = holeCount;
this.rounds = new ArrayList<>();
}
@@ -54,4 +60,16 @@ public class Match {
public Round[] getRounds() {
return rounds.toArray(Round[]::new);
}
+
+ public boolean checkCompletion() {
+ return LocalDateTime.now().isAfter(end);
+ }
+
+ public void addRoundFor(int participantIndex, Round r) {
+ roundMap.put(participantIndex, r);
+ }
+
+ public Round getRoundFor(int participantIndex) {
+ return roundMap.get(participantIndex);
+ }
}
diff --git a/src/main/java/design/model/ScrambleLeague.java b/src/main/java/design/model/ScrambleLeague.java
index 1fb8f1d..adf2105 100644
--- a/src/main/java/design/model/ScrambleLeague.java
+++ b/src/main/java/design/model/ScrambleLeague.java
@@ -58,14 +58,16 @@ public class ScrambleLeague extends League {
public String getType() {
return "scramble";
}
+
@Override
public void recordPlay(Golfer player, Match match, Round round){
if(!isPlayable()) return;
Team team = player.getTeam();
if (team == null) return;
- int strokes = round.getTotalSwings();
- team.addMemberRound(player, strokes);
+ int index = participants.indexOf(team);
+ team.addMemberRound(player, round.getTotalSwings());
match.addRound(round);
+ match.addRoundFor(index, round);
}
@Override
@@ -81,4 +83,23 @@ public class ScrambleLeague extends League {
public Map<Team, Integer> getTotalTeamScores(){
return Collections.unmodifiableMap(totalTeamScores);
}
+
+ @Override
+ public Map<Team, Integer> getResults() {
+ return getTotalTeamScores();
+ }
+
+ @Override
+ public void finalizeMatch(Match match) {
+ getCompletedMatches().add(match);
+ for(int i = 0; i < participants.size(); i++){
+ Team team = participants.get(i);
+ Round round = match.getRoundFor(i);
+ if(round != null){
+ for(Golfer member : team.getMembers()){
+ member.addRound(round);
+ }
+ }
+ }
+ }
}
diff --git a/src/main/java/design/model/StrokeLeague.java b/src/main/java/design/model/StrokeLeague.java
index d051fd0..48889b7 100644
--- a/src/main/java/design/model/StrokeLeague.java
+++ b/src/main/java/design/model/StrokeLeague.java
@@ -49,11 +49,13 @@ public class StrokeLeague extends League {
public String getType() {
return "stroke";
}
+
public void recordPlay(Golfer player, Match match, Round round){
if(!isPlayable() || !participants.contains(player)) return;
- int strokes = round.getTotalSwings();
- totalStrokes.merge(player, strokes, Integer::sum);
+ int index = participants.indexOf(player);
+ totalStrokes.merge(player, round.getTotalSwings(), Integer::sum);
match.addRound(round);
+ match.addRoundFor(index, round);
}
@Override
@@ -65,4 +67,21 @@ public class StrokeLeague extends League {
public Map<Golfer, Integer> getTotalStrokes(){
return Collections.unmodifiableMap(totalStrokes);
}
+
+ @Override
+ public Map<Golfer, Integer> getResults() {
+ return getTotalStrokes();
+ }
+
+ @Override
+ public void finalizeMatch(Match match) {
+ getCompletedMatches().add(match);
+ for(int i = 0; i < participants.size(); i++){
+ Golfer player = participants.get(i);
+ Round round = match.getRoundFor(i);
+ if(round != null){
+ player.addRound(round);
+ }
+ }
+ }
}
diff --git a/src/main/java/design/model/statistics/LeagueStats.java b/src/main/java/design/model/statistics/LeagueStats.java
new file mode 100644
index 0000000..c80df07
--- /dev/null
+++ b/src/main/java/design/model/statistics/LeagueStats.java
@@ -0,0 +1,50 @@
+package design.model.statistics;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import design.model.League;
+import design.model.Match;
+import design.model.Round;
+
+public class LeagueStats implements Statistics{
+ private final League league;
+
+ public LeagueStats(League league) {
+ this.league = league;
+ }
+
+ public List<Match> getMatchesPlayed() {
+ return league.getCompletedMatches();
+ }
+
+ public Map<?, Integer> getScores() {
+ return league.getResults();
+ }
+
+ public List<? extends Map.Entry<?, Integer>> getStandings(){
+ return league.getResults().entrySet().stream().sorted(Map.Entry.comparingByValue()).<Map.Entry<?, Integer>>map(e -> e).toList();
+ }
+
+ public List<?> getWinners(){
+ List<? extends Map.Entry<?, Integer>> standings = getStandings();
+ int bestScore = standings.get(0).getValue();
+ return standings.stream().filter(entry -> entry.getValue() == bestScore).map(Map.Entry::getKey).toList();
+ }
+
+ @Override
+ public Round[] getRounds(){
+ return league.getCompletedMatches().stream().flatMap(match -> Arrays.stream(match.getRounds())).toArray(Round[]::new);
+ }
+
+ @Override
+ public int get_score(){
+ return Arrays.stream(getRounds()).mapToInt(Round::getTotalSwings).sum();
+ }
+
+ @Override
+ public double get_distance(){
+ return Arrays.stream(getRounds()).mapToDouble(Round::getTotalDistance).sum();
+ }
+}
diff --git a/src/main/java/design/persistence/Serializers.java b/src/main/java/design/persistence/Serializers.java
index 246dbf1..d690633 100644
--- a/src/main/java/design/persistence/Serializers.java
+++ b/src/main/java/design/persistence/Serializers.java
@@ -13,10 +13,19 @@ import design.model.Golfer;
import design.model.League;
import java.io.IOException;
+import java.util.Map;
import java.time.LocalDateTime;
import java.util.List;
public class Serializers {
+ public static void configureMapper(ObjectMapper mapper) {
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+ mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
+ mapper.registerModule(new JavaTimeModule());
+ mapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+ }
+
public static class CustomPrettyPrinter extends DefaultPrettyPrinter {
public CustomPrettyPrinter() {
super._arrayIndenter = new DefaultIndenter();
@@ -86,11 +95,21 @@ public class Serializers {
}
}
- public static void configureMapper(ObjectMapper mapper) {
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
- mapper.registerModule(new JavaTimeModule());
- mapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+ @SuppressWarnings("rawtypes")
+ public static class MapListSerializer extends JsonSerializer<Map> {
+
+ @Override
+ public void serialize(Map value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ gen.writeObject(value.entrySet());
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ public static class MapListDeserializer extends JsonDeserializer<Map> {
+
+ @Override
+ public Map deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+ return Map.ofEntries(p.readValueAs(Map.Entry[].class));
+ }
}
}