diff options
Diffstat (limited to '')
| -rw-r--r-- | src/main/java/design/model/League.java | 19 | ||||
| -rw-r--r-- | src/main/java/design/model/Match.java | 22 | ||||
| -rw-r--r-- | src/main/java/design/model/ScrambleLeague.java | 25 | ||||
| -rw-r--r-- | src/main/java/design/model/StrokeLeague.java | 23 | ||||
| -rw-r--r-- | src/main/java/design/model/statistics/LeagueStats.java | 50 | ||||
| -rw-r--r-- | src/main/java/design/persistence/Serializers.java | 31 |
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)); + } } } |
