package design.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.util.ArrayList; import java.util.Date; import java.util.List; @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) @JsonSubTypes({ @JsonSubTypes.Type(value = ScrambleLeague.class, name = "scramble"), @JsonSubTypes.Type(value = StrokeLeague.class, name = "stroke") }) public abstract class League { private int id; private final String name; private final Date registrationDate; private final Date startDate; private final Date endDate; private final Golfer owner; private final List schedule; @JsonCreator protected League(int id, String name, Date registrationDate, Date startDate, Date endDate, Golfer owner, List schedule) { this.id = id; this.name = name; this.registrationDate = registrationDate; this.startDate = startDate; this.endDate = endDate; this.owner = owner; this.schedule = schedule != null ? schedule : new ArrayList<>(); } 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; this.schedule = new ArrayList<>(); } public int getId() { return id; } public String getName() { return name; } public Date getRegistrationDate() { return registrationDate; } public Date getStartDate() { return startDate; } public Date getEndDate() { return endDate; } public Golfer getOwner() { return owner; } public Match[] getSchedule() { return schedule.toArray(Match[]::new); } public void addMatchToSchedule(Match match) { Date date = match.getDateScheduled(); if(date.after(endDate)){ throw new IllegalArgumentException("Cannot create match after league has ended"); } schedule.add(match); } public void setId(int id) { assert this.id == -1; this.id = id; } }