package design.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import java.util.ArrayList; import java.util.List; import design.model.undo.Memento; import design.model.undo.Originator; @JsonPropertyOrder({ "clubs", "nextClubId" }) public class Golfer implements Originator { private String username; private int passwordHash; private String fullName; private final List courses; private final List rounds; private final List clubs; // Keep track of golfer's clubs private int nextClubId; @JsonCreator private Golfer(String username, int passwordHash, String fullName, List courses, List rounds, List clubs) { this.username = username; this.passwordHash = passwordHash; this.fullName = fullName; this.courses = courses; this.rounds = rounds; this.clubs = clubs; this.nextClubId = this.clubs.stream().mapToInt(Club::getId).max().orElse(0) + 1; } public Golfer(String fullName, String username, String password) { this.fullName = fullName; this.username = username; this.passwordHash = password.hashCode(); this.courses = new ArrayList<>(); this.rounds = new ArrayList<>(); this.clubs = new ArrayList<>(); this.nextClubId = 1; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public void setPassword(String password) { this.passwordHash = password.hashCode(); } public boolean checkPassword(String password) { return passwordHash == password.hashCode(); } public Course[] getCourses() { return courses.toArray(Course[]::new); } public void addCourse(Course course) { courses.add(course); } public void removeCourse(Course course) { courses.remove(course); } public boolean hasCourses() { return !courses.isEmpty(); } public Round[] getRounds() { return rounds.toArray(Round[]::new); } public void addRound(Round round) { rounds.add(round); } public Club addClub(Club c) { clubs.add(c); c.setId(nextClubId++); return c; } public boolean hasClubs() { return !clubs.isEmpty(); } public boolean hasClub(Club c) { return clubs.contains(c); } public Club[] getClubs() { return clubs.toArray(Club[]::new); } @Override public String toString() { return String.format("%s (@%s)", fullName, username); } public void removeClub(Club c) { clubs.remove(c); } // Takes a snapshot of the golfer private static class GolferMemento implements Memento { private final String username; private final int passwordHash; private final String fullName; private final List courses; private final List rounds; private final List clubs; private final int nextClubId; GolferMemento(Golfer g) { this.username = g.username; this.passwordHash = g.passwordHash; this.fullName = g.fullName; this.courses = new ArrayList<>(g.courses); this.rounds = new ArrayList<>(g.rounds); this.clubs = new ArrayList<>(g.clubs); this.nextClubId = g.nextClubId; } } @Override public Memento createMemento() { return new GolferMemento(this); } @Override public void restore(Memento memento) { GolferMemento gm = (GolferMemento) memento; this.username = gm.username; this.passwordHash = gm.passwordHash; this.fullName = gm.fullName; this.courses.clear(); this.courses.addAll(gm.courses); this.rounds.clear(); this.rounds.addAll(gm.rounds); this.clubs.clear(); this.clubs.addAll(gm.clubs); this.nextClubId = gm.nextClubId; } }