diff --git a/.gitignore b/.gitignore index fe558a3..a7a1fb9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /Database-Storage/target/ /TrueSkill/target/ /TournamentManagerWeb/target/ -/MTG/target/ \ No newline at end of file +/MTG/target/ +/target/ \ No newline at end of file diff --git a/Database-Storage/DB.mwb b/Database-Storage/DB.mwb index 9371af1..bcde4d1 100644 Binary files a/Database-Storage/DB.mwb and b/Database-Storage/DB.mwb differ diff --git a/Database-Storage/DB.mwb.bak b/Database-Storage/DB.mwb.bak index 3817b03..2f912df 100644 Binary files a/Database-Storage/DB.mwb.bak and b/Database-Storage/DB.mwb.bak differ diff --git a/Database-Storage/pom.xml b/Database-Storage/pom.xml index 4c6dede..89b722a 100644 --- a/Database-Storage/pom.xml +++ b/Database-Storage/pom.xml @@ -57,5 +57,11 @@ 2.3.1 jar + + org.hamcrest + hamcrest-all + 1.3 + test + diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Format.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Format.java index 2ad3499..1bb3e69 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Format.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Format.java @@ -44,7 +44,9 @@ public class Format implements Serializable @Size(max = 255) @Column(name = "description") private String description; - private static final long serialVersionUID = 1L; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "format") + private List teamHasFormatRecordList; + private static final long serialVersionUID = -6764484082819653225L; @EmbeddedId protected FormatPK formatPK; @JoinColumn(name = "game_id", referencedColumnName = "id", insertable = false, @@ -53,6 +55,8 @@ public class Format implements Serializable private Game game; @OneToMany(cascade = CascadeType.ALL, mappedBy = "format") private List matchEntryList; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "format") + private List tournamentList; public Format() { @@ -105,6 +109,17 @@ public void setMatchEntryList(List matchEntryList) this.matchEntryList = matchEntryList; } + @XmlTransient + public List getTournamentList() + { + return tournamentList; + } + + public void setTournamentList(List tournamentList) + { + this.tournamentList = tournamentList; + } + @Override public int hashCode() { @@ -129,8 +144,40 @@ public boolean equals(Object object) @Override public String toString() { - return "com.github.javydreamercsw.database.storage.db.Format[ formatPK=" + - formatPK + " ]"; + return "com.github.javydreamercsw.database.storage.db.Format[ formatPK=" + + formatPK + " ]"; + } + + + @XmlTransient + public List getTeamHasFormatRecordList() + { + return teamHasFormatRecordList; + } + + public void setTeamHasFormatRecordList(List teamHasFormatRecordList) + { + this.teamHasFormatRecordList = teamHasFormatRecordList; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; } public String getName() diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Game.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Game.java index 451340a..932be39 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Game.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Game.java @@ -35,6 +35,14 @@ }) public class Game implements Serializable { + @Basic(optional = false) + @NotNull + @Size(min = 1, max = 45) + @Column(name = "name") + private String name; + @Size(max = 255) + @Column(name = "description") + private String description; private static final long serialVersionUID = -6267533299417173163L; @Id @Basic(optional = false) @@ -48,14 +56,6 @@ public class Game implements Serializable initialValue = 1) @Column(name = "id") private Integer id; - @Basic(optional = false) - @NotNull - @Size(min = 1, max = 45) - @Column(name = "name") - private String name; - @Size(max = 255) - @Column(name = "description") - private String description; @OneToMany(cascade = CascadeType.ALL, mappedBy = "game") private List formatList; @OneToMany(cascade = CascadeType.ALL, mappedBy = "game") @@ -80,25 +80,6 @@ public void setId(Integer id) this.id = id; } - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public String getDescription() - { - return description; - } - - public void setDescription(String description) - { - this.description = description; - } @XmlTransient public List getFormatList() @@ -148,4 +129,24 @@ public void setRecordList(List recordList) { this.recordList = recordList; } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/MatchResult.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/MatchResult.java index c9b5640..155b22e 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/MatchResult.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/MatchResult.java @@ -128,23 +128,23 @@ public String toString() + matchResultPK + " ]"; } - public boolean getLocked() + public boolean getRanked() { - return locked; + return ranked; } - public void setLocked(boolean locked) + public void setRanked(boolean ranked) { - this.locked = locked; + this.ranked = ranked; } - public boolean getRanked() + public boolean getLocked() { - return ranked; + return locked; } - public void setRanked(boolean ranked) + public void setLocked(boolean locked) { - this.ranked = ranked; + this.locked = locked; } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Record.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Record.java index fb4bc98..9fab6b5 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Record.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Record.java @@ -38,6 +38,9 @@ }) public class Record implements Serializable { + private static final long serialVersionUID = -893880954416960217L; + @EmbeddedId + protected RecordPK recordPK; @Basic(optional = false) @NotNull @Column(name = "wins") @@ -65,9 +68,6 @@ public class Record implements Serializable }) @ManyToMany private List tournamentHasTeamList; - private static final long serialVersionUID = 1L; - @EmbeddedId - protected RecordPK recordPK; @JoinColumn(name = "game_id", referencedColumnName = "id", insertable = false, updatable = false) @ManyToOne(optional = false) diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Round.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Round.java index 0e2f45b..8cc0092 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Round.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Round.java @@ -4,15 +4,19 @@ import java.util.ArrayList; import java.util.List; +import javax.persistence.Basic; import javax.persistence.CascadeType; +import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; +import javax.validation.constraints.NotNull; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @@ -33,12 +37,22 @@ public class Round implements Serializable private static final long serialVersionUID = 1L; @EmbeddedId protected RoundPK roundPK; - @JoinColumn(name = "tournament_id", referencedColumnName = "id", - insertable = false, updatable = false) + @JoinColumns( + { + @JoinColumn(name = "tournament_id", referencedColumnName = "id", + insertable = false, updatable = false), + @JoinColumn(name = "tournament_tournament_format_id", + referencedColumnName = "tournament_format_id", + insertable = false, updatable = false) + }) @ManyToOne(optional = false) private Tournament tournament; @OneToMany(cascade = CascadeType.ALL, mappedBy = "round") private List matchEntryList; + @Basic(optional = false) + @NotNull + @Column(name = "roundNumber") + private int roundNumber; public Round() { @@ -103,7 +117,7 @@ public boolean equals(Object object) return false; } Round other = (Round) object; - return !((this.roundPK == null && other.roundPK != null) + return !((this.roundPK == null && other.roundPK != null) || (this.roundPK != null && !this.roundPK.equals(other.roundPK))); } @@ -113,4 +127,14 @@ public String toString() return "com.github.javydreamercsw.database.storage.db.Round[ roundPK=" + roundPK + " ]"; } + + public int getRoundNumber() + { + return roundNumber; + } + + public void setRoundNumber(int roundNumber) + { + this.roundNumber = roundNumber; + } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Team.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Team.java index bab914a..b85de55 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Team.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Team.java @@ -37,6 +37,8 @@ public class Team implements Serializable @Size(max = 245) @Column(name = "name") private String name; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "team") + private List teamHasFormatRecordList; private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @@ -61,6 +63,7 @@ public Team() matchHasTeamList = new ArrayList<>(); playerList = new ArrayList<>(); tournamentHasTeamList = new ArrayList<>(); + teamHasFormatRecordList = new ArrayList<>(); } public Team(String name) @@ -79,7 +82,6 @@ public void setId(Integer id) this.id = id; } - @XmlTransient public List getPlayerList() { @@ -140,6 +142,17 @@ public String toString() return "com.github.javydreamercsw.database.storage.db.Team[ id=" + id + " ]"; } + @XmlTransient + public List getTeamHasFormatRecordList() + { + return teamHasFormatRecordList; + } + + public void setTeamHasFormatRecordList(List teamHasFormatRecordList) + { + this.teamHasFormatRecordList = teamHasFormatRecordList; + } + public String getName() { return name; diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TeamHasFormatRecord.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TeamHasFormatRecord.java new file mode 100644 index 0000000..ac9dd03 --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TeamHasFormatRecord.java @@ -0,0 +1,178 @@ +package com.github.javydreamercsw.database.storage.db; + +import java.io.Serializable; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import javax.xml.bind.annotation.XmlRootElement; + +@Entity +@Table(name = "team_has_format_record") +@XmlRootElement +@NamedQueries( + { + @NamedQuery(name = "TeamHasFormatRecord.findAll", + query = "SELECT t FROM TeamHasFormatRecord t"), + @NamedQuery(name = "TeamHasFormatRecord.findByTeamId", + query = "SELECT t FROM TeamHasFormatRecord t WHERE t.teamHasFormatRecordPK.teamId = :teamId"), + @NamedQuery(name = "TeamHasFormatRecord.findByFormatId", + query = "SELECT t FROM TeamHasFormatRecord t WHERE t.teamHasFormatRecordPK.formatId = :formatId"), + @NamedQuery(name = "TeamHasFormatRecord.findByFormatGameId", + query = "SELECT t FROM TeamHasFormatRecord t WHERE t.teamHasFormatRecordPK.formatGameId = :formatGameId"), + @NamedQuery(name = "TeamHasFormatRecord.findByMean", + query = "SELECT t FROM TeamHasFormatRecord t WHERE t.mean = :mean"), + @NamedQuery(name = "TeamHasFormatRecord.findByStandardDeviation", + query = "SELECT t FROM TeamHasFormatRecord t WHERE t.standardDeviation = :standardDeviation") + }) +public class TeamHasFormatRecord implements Serializable +{ + private static final long serialVersionUID = 1517758449111184848L; + @Basic(optional = false) + @NotNull + @Column(name = "mean") + private double mean; + @Basic(optional = false) + @NotNull + @Column(name = "standard_deviation") + private double standardDeviation; + @Basic(optional = false) + @NotNull + @Column(name = "points") + private int points; + @EmbeddedId + protected TeamHasFormatRecordPK teamHasFormatRecordPK; + @JoinColumns( + { + @JoinColumn(name = "format_id", referencedColumnName = "id", + insertable = false, updatable = false), + @JoinColumn(name = "format_game_id", referencedColumnName = "game_id", + insertable = false, updatable = false) + }) + @ManyToOne(optional = false) + private Format format; + @JoinColumn(name = "team_id", referencedColumnName = "id", + insertable = false, updatable = false) + @ManyToOne(optional = false) + private Team team; + + public TeamHasFormatRecord() + { + } + + public TeamHasFormatRecord(TeamHasFormatRecordPK teamHasFormatRecordPK) + { + this.teamHasFormatRecordPK = teamHasFormatRecordPK; + } + + public TeamHasFormatRecord(TeamHasFormatRecordPK teamHasFormatRecordPK, + double mean, double standardDeviation) + { + this.teamHasFormatRecordPK = teamHasFormatRecordPK; + this.mean = mean; + this.standardDeviation = standardDeviation; + } + + public TeamHasFormatRecord(int teamId, int formatId, int formatGameId) + { + this.teamHasFormatRecordPK = new TeamHasFormatRecordPK(teamId, formatId, formatGameId); + } + + public TeamHasFormatRecordPK getTeamHasFormatRecordPK() + { + return teamHasFormatRecordPK; + } + + public void setTeamHasFormatRecordPK(TeamHasFormatRecordPK teamHasFormatRecordPK) + { + this.teamHasFormatRecordPK = teamHasFormatRecordPK; + } + + public Format getFormat() + { + return format; + } + + public void setFormat(Format format) + { + this.format = format; + } + + public Team getTeam() + { + return team; + } + + public void setTeam(Team team) + { + this.team = team; + } + + @Override + public int hashCode() + { + int hash = 0; + hash += (teamHasFormatRecordPK != null ? teamHasFormatRecordPK.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) + { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof TeamHasFormatRecord)) + { + return false; + } + TeamHasFormatRecord other = (TeamHasFormatRecord) object; + return !((this.teamHasFormatRecordPK == null + && other.teamHasFormatRecordPK != null) + || (this.teamHasFormatRecordPK != null + && !this.teamHasFormatRecordPK.equals(other.teamHasFormatRecordPK))); + } + + @Override + public String toString() + { + return "Points: " + getPoints() + "\nMean: " + getMean() + "\nSD: " + + getStandardDeviation(); + } + + public double getMean() + { + return mean; + } + + public void setMean(double mean) + { + this.mean = mean; + } + + public double getStandardDeviation() + { + return standardDeviation; + } + + public void setStandardDeviation(double standardDeviation) + { + this.standardDeviation = standardDeviation; + } + + public int getPoints() + { + return points; + } + + public void setPoints(int points) + { + this.points = points; + } +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TeamHasFormatRecordPK.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TeamHasFormatRecordPK.java new file mode 100644 index 0000000..31e38a9 --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TeamHasFormatRecordPK.java @@ -0,0 +1,112 @@ +package com.github.javydreamercsw.database.storage.db; + +import java.io.Serializable; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.validation.constraints.NotNull; + +/** + * + * @author Javier Ortiz Bultron + */ +@Embeddable +public class TeamHasFormatRecordPK implements Serializable +{ + private static final long serialVersionUID = 11371362902792432L; + @Basic(optional = false) + @NotNull + @Column(name = "team_id") + private int teamId; + @Basic(optional = false) + @NotNull + @Column(name = "format_id") + private int formatId; + @Basic(optional = false) + @NotNull + @Column(name = "format_game_id") + private int formatGameId; + + public TeamHasFormatRecordPK() + { + } + + public TeamHasFormatRecordPK(int teamId, int formatId, int formatGameId) + { + this.teamId = teamId; + this.formatId = formatId; + this.formatGameId = formatGameId; + } + + public int getTeamId() + { + return teamId; + } + + public void setTeamId(int teamId) + { + this.teamId = teamId; + } + + public int getFormatId() + { + return formatId; + } + + public void setFormatId(int formatId) + { + this.formatId = formatId; + } + + public int getFormatGameId() + { + return formatGameId; + } + + public void setFormatGameId(int formatGameId) + { + this.formatGameId = formatGameId; + } + + @Override + public int hashCode() + { + int hash = 0; + hash += (int) teamId; + hash += (int) formatId; + hash += (int) formatGameId; + return hash; + } + + @Override + public boolean equals(Object object) + { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof TeamHasFormatRecordPK)) + { + return false; + } + TeamHasFormatRecordPK other = (TeamHasFormatRecordPK) object; + if (this.teamId != other.teamId) + { + return false; + } + if (this.formatId != other.formatId) + { + return false; + } + if (this.formatGameId != other.formatGameId) + { + return false; + } + return true; + } + + @Override + public String toString() + { + return "com.github.javydreamercsw.database.storage.db.TeamHasFormatRecordPK[ teamId=" + teamId + ", formatId=" + formatId + ", formatGameId=" + formatGameId + " ]"; + } + +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Tournament.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Tournament.java index 915de45..9c5cc97 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Tournament.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/Tournament.java @@ -1,21 +1,22 @@ package com.github.javydreamercsw.database.storage.db; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; +import javax.persistence.EmbeddedId; import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; -import javax.persistence.TableGenerator; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; @@ -25,19 +26,34 @@ @Table(name = "tournament") @XmlRootElement @NamedQueries( - { - @NamedQuery(name = "Tournament.findAll", query = "SELECT t FROM Tournament t"), - @NamedQuery(name = "Tournament.findById", - query = "SELECT t FROM Tournament t WHERE t.id = :id"), - @NamedQuery(name = "Tournament.findByName", - query = "SELECT t FROM Tournament t WHERE t.name = :name"), - @NamedQuery(name = "Tournament.findByWinPoints", - query = "SELECT t FROM Tournament t WHERE t.winPoints = :winPoints"), - @NamedQuery(name = "Tournament.findByDrawPoints", - query = "SELECT t FROM Tournament t WHERE t.drawPoints = :drawPoints"), - @NamedQuery(name = "Tournament.findByLossPoints", - query = "SELECT t FROM Tournament t WHERE t.lossPoints = :lossPoints") - }) +{ + @NamedQuery(name = "Tournament.findAll", + query = "SELECT t FROM Tournament t"), + @NamedQuery(name = "Tournament.findById", + query = "SELECT t FROM Tournament t WHERE t.tournamentPK.id = :id"), + @NamedQuery(name = "Tournament.findByTournamentFormatId", + query = "SELECT t FROM Tournament t WHERE t.tournamentPK.tournamentFormatId = :tournamentFormatId"), + @NamedQuery(name = "Tournament.findByName", + query = "SELECT t FROM Tournament t WHERE t.name = :name"), + @NamedQuery(name = "Tournament.findByWinPoints", + query = "SELECT t FROM Tournament t WHERE t.winPoints = :winPoints"), + @NamedQuery(name = "Tournament.findByDrawPoints", + query = "SELECT t FROM Tournament t WHERE t.drawPoints = :drawPoints"), + @NamedQuery(name = "Tournament.findByLossPoints", + query = "SELECT t FROM Tournament t WHERE t.lossPoints = :lossPoints"), + @NamedQuery(name = "Tournament.findByStartDate", + query = "SELECT t FROM Tournament t WHERE t.startDate = :startDate"), + @NamedQuery(name = "Tournament.findByEndDate", + query = "SELECT t FROM Tournament t WHERE t.endDate = :endDate"), + @NamedQuery(name = "Tournament.findBySignupDate", + query = "SELECT t FROM Tournament t WHERE t.signupDate = :signupDate"), + @NamedQuery(name = "Tournament.findBySignupTimeLimit", + query = "SELECT t FROM Tournament t WHERE t.signupTimeLimit = :signupTimeLimit"), + @NamedQuery(name = "Tournament.findByRoundTimeLimit", + query = "SELECT t FROM Tournament t WHERE t.roundTimeLimit = :roundTimeLimit"), + @NamedQuery(name = "Tournament.findByNoShowTimeLimit", + query = "SELECT t FROM Tournament t WHERE t.noShowTimeLimit = :noShowTimeLimit") +}) public class Tournament implements Serializable { @Basic(optional = false) @@ -57,22 +73,46 @@ public class Tournament implements Serializable @NotNull @Column(name = "lossPoints") private int lossPoints; - private static final long serialVersionUID = 1L; - @Id - @GeneratedValue(strategy = GenerationType.TABLE, generator = "TournamentGen") - @TableGenerator(name = "TournamentGen", table = "tm_id", - pkColumnName = "table_name", - valueColumnName = "last_id", - pkColumnValue = "tournament", - allocationSize = 1, - initialValue = 1) @Basic(optional = false) - @Column(name = "id") - private Integer id; - @OneToMany(cascade = CascadeType.ALL, mappedBy = "tournament") - private List roundList; + @NotNull + @Column(name = "startDate") + private LocalDateTime startDate; + @Column(name = "endDate") + private LocalDateTime endDate; + @Basic(optional = false) + @NotNull + @Column(name = "signupDate") + private LocalDateTime signupDate; + @Basic(optional = false) + @NotNull + @Column(name = "signupTimeLimit") + private int signupTimeLimit; + @Basic(optional = false) + @NotNull + @Column(name = "roundTimeLimit") + private int roundTimeLimit; + @Basic(optional = false) + @NotNull + @Column(name = "noShowTimeLimit") + private int noShowTimeLimit; + private static final long serialVersionUID = -6583090940281361773L; + @EmbeddedId + protected TournamentPK tournamentPK; + @JoinColumns( + { + @JoinColumn(name = "format_id", referencedColumnName = "id"), + @JoinColumn(name = "format_game_id", referencedColumnName = "game_id") + }) + @ManyToOne(optional = false) + private Format format; + @JoinColumn(name = "tournament_format_id", referencedColumnName = "id", + insertable = false, updatable = false) + @ManyToOne(optional = false) + private TournamentFormat tournamentFormat; @OneToMany(cascade = CascadeType.ALL, mappedBy = "tournament") private List tournamentHasTeamList; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "tournament") + private List roundList; public Tournament() { @@ -94,26 +134,39 @@ public Tournament(String name, int winPoints, int drawPoints, int lossPoints) tournamentHasTeamList = new ArrayList<>(); } - public Integer getId() + public Tournament(int tournamentFormatId) { - return id; + this.tournamentPK = new TournamentPK(tournamentFormatId); } - public void setId(Integer id) + public TournamentPK getTournamentPK() { - this.id = id; + return tournamentPK; } + public void setTournamentPK(TournamentPK tournamentPK) + { + this.tournamentPK = tournamentPK; + } - @XmlTransient - public List getRoundList() + public Format getFormat() { - return roundList; + return format; } - public void setRoundList(List roundList) + public void setFormat(Format format) { - this.roundList = roundList; + this.format = format; + } + + public TournamentFormat getTournamentFormat() + { + return tournamentFormat; + } + + public void setTournamentFormat(TournamentFormat tournamentFormat) + { + this.tournamentFormat = tournamentFormat; } @XmlTransient @@ -127,11 +180,22 @@ public void setTournamentHasTeamList(List tournamentHasTeamLi this.tournamentHasTeamList = tournamentHasTeamList; } + @XmlTransient + public List getRoundList() + { + return roundList; + } + + public void setRoundList(List roundList) + { + this.roundList = roundList; + } + @Override public int hashCode() { int hash = 0; - hash += (id != null ? id.hashCode() : 0); + hash += (tournamentPK != null ? tournamentPK.hashCode() : 0); return hash; } @@ -144,15 +208,77 @@ public boolean equals(Object object) return false; } Tournament other = (Tournament) object; - return !((this.id == null && other.id != null) - || (this.id != null && !this.id.equals(other.id))); + return !((this.tournamentPK == null && other.tournamentPK != null) + || (this.tournamentPK != null + && !this.tournamentPK.equals(other.tournamentPK))); } @Override public String toString() { - return "com.github.javydreamercsw.database.storage.db.Tournament[ id=" - + id + " ]"; + return "com.github.javydreamercsw.database.storage.db.Tournament[ tournamentPK=" + + tournamentPK + " ]"; + } + + + public LocalDateTime getStartDate() + { + return startDate; + } + + public void setStartDate(LocalDateTime startDate) + { + this.startDate = startDate; + } + + public LocalDateTime getEndDate() + { + return endDate; + } + + public void setEndDate(LocalDateTime endDate) + { + this.endDate = endDate; + } + + public LocalDateTime getSignupDate() + { + return signupDate; + } + + public void setSignupDate(LocalDateTime signupDate) + { + this.signupDate = signupDate; + } + + public int getSignupTimeLimit() + { + return signupTimeLimit; + } + + public void setSignupTimeLimit(int signupTimeLimit) + { + this.signupTimeLimit = signupTimeLimit; + } + + public int getRoundTimeLimit() + { + return roundTimeLimit; + } + + public void setRoundTimeLimit(int roundTimeLimit) + { + this.roundTimeLimit = roundTimeLimit; + } + + public int getNoShowTimeLimit() + { + return noShowTimeLimit; + } + + public void setNoShowTimeLimit(int noShowTimeLimit) + { + this.noShowTimeLimit = noShowTimeLimit; } public String getName() diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentFormat.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentFormat.java new file mode 100644 index 0000000..c436c3f --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentFormat.java @@ -0,0 +1,144 @@ +package com.github.javydreamercsw.database.storage.db; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Basic; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.TableGenerator; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; + +@Entity +@Table(name = "tournament_format") +@XmlRootElement +@NamedQueries( +{ + @NamedQuery(name = "TournamentFormat.findAll", + query = "SELECT t FROM TournamentFormat t"), + @NamedQuery(name = "TournamentFormat.findById", + query = "SELECT t FROM TournamentFormat t WHERE t.id = :id"), + @NamedQuery(name = "TournamentFormat.findByFormatName", + query = "SELECT t FROM TournamentFormat t WHERE t.formatName = :formatName"), + @NamedQuery(name = "TournamentFormat.findByImplementationClass", + query = "SELECT t FROM TournamentFormat t WHERE t.implementationClass = :implementationClass") +}) +public class TournamentFormat implements Serializable +{ + @Basic(optional = false) + @NotNull + @Size(min = 1, max = 45) + @Column(name = "format_name") + private String formatName; + @Basic(optional = false) + @NotNull + @Size(min = 1, max = 255) + @Column(name = "implementation_class") + private String implementationClass; + private static final long serialVersionUID = 1L; + @Id + @Basic(optional = false) + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.TABLE, generator = "TournamentFormatGen") + @TableGenerator(name = "TournamentFormatGen", table = "tm_id", + pkColumnName = "table_name", + valueColumnName = "last_id", + pkColumnValue = "tournament_format", + allocationSize = 1, + initialValue = 1) + private Integer id; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "tournamentFormat") + private List tournamentList; + + public TournamentFormat() + { + tournamentList = new ArrayList<>(); + } + + public TournamentFormat(String formatName, String implementationClass) + { + this(); + this.formatName = formatName; + this.implementationClass = implementationClass; + } + + public Integer getId() + { + return id; + } + + public void setId(Integer id) + { + this.id = id; + } + + public String getFormatName() + { + return formatName; + } + + public void setFormatName(String formatName) + { + this.formatName = formatName; + } + + public String getImplementationClass() + { + return implementationClass; + } + + public void setImplementationClass(String implementationClass) + { + this.implementationClass = implementationClass; + } + + @XmlTransient + public List getTournamentList() + { + return tournamentList; + } + + public void setTournamentList(List tournamentList) + { + this.tournamentList = tournamentList; + } + + @Override + public int hashCode() + { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) + { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof TournamentFormat)) + { + return false; + } + TournamentFormat other = (TournamentFormat) object; + return !((this.id == null && other.id != null) + || (this.id != null && !this.id.equals(other.id))); + } + + @Override + public String toString() + { + return "com.github.javydreamercsw.database.storage.db.TournamentFormat[ id=" + id + " ]"; + } +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentHasTeam.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentHasTeam.java index b03dc9c..5443661 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentHasTeam.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentHasTeam.java @@ -6,6 +6,7 @@ import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; @@ -19,7 +20,8 @@ @XmlRootElement @NamedQueries( { - @NamedQuery(name = "TournamentHasTeam.findAll", query = "SELECT t FROM TournamentHasTeam t"), + @NamedQuery(name = "TournamentHasTeam.findAll", + query = "SELECT t FROM TournamentHasTeam t"), @NamedQuery(name = "TournamentHasTeam.findByTournamentId", query = "SELECT t FROM TournamentHasTeam t WHERE t.tournamentHasTeamPK.tournamentId = :tournamentId"), @NamedQuery(name = "TournamentHasTeam.findByTeamId", @@ -36,8 +38,14 @@ public class TournamentHasTeam implements Serializable updatable = false) @ManyToOne(optional = false) private Team team; - @JoinColumn(name = "tournament_id", referencedColumnName = "id", - insertable = false, updatable = false) + @JoinColumns( + { + @JoinColumn(name = "tournament_id", referencedColumnName = "id", + insertable = false, updatable = false), + @JoinColumn(name = "tournament_tournament_format_id", + referencedColumnName = "tournament_format_id", + insertable = false, updatable = false) + }) @ManyToOne(optional = false) private Tournament tournament; diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentPK.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentPK.java new file mode 100644 index 0000000..67df055 --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/TournamentPK.java @@ -0,0 +1,93 @@ +package com.github.javydreamercsw.database.storage.db; + +import java.io.Serializable; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.TableGenerator; +import javax.validation.constraints.NotNull; + +@Embeddable +public class TournamentPK implements Serializable +{ + private static final long serialVersionUID = -5852922586504031795L; + @Basic(optional = false) + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.TABLE, generator = "TournamentGen") + @TableGenerator(name = "TournamentGen", table = "tm_id", + pkColumnName = "table_name", + valueColumnName = "last_id", + pkColumnValue = "tournament", + allocationSize = 1, + initialValue = 1) + private int id; + @Basic(optional = false) + @NotNull + @Column(name = "tournament_format_id") + private int tournamentFormatId; + + public TournamentPK() + { + + } + + public TournamentPK(int tournamentFormatId) + { + this.tournamentFormatId = tournamentFormatId; + } + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public int getTournamentFormatId() + { + return tournamentFormatId; + } + + public void setTournamentFormatId(int tournamentFormatId) + { + this.tournamentFormatId = tournamentFormatId; + } + + @Override + public int hashCode() + { + int hash = 0; + hash += (int) id; + hash += (int) tournamentFormatId; + return hash; + } + + @Override + public boolean equals(Object object) + { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof TournamentPK)) + { + return false; + } + TournamentPK other = (TournamentPK) object; + if (this.id != other.id) + { + return false; + } + return this.tournamentFormatId == other.tournamentFormatId; + } + + @Override + public String toString() + { + return "com.github.javydreamercsw.database.storage.db.TournamentPK[ id=" + + id + ", tournamentFormatId=" + tournamentFormatId + " ]"; + } +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/FormatJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/FormatJpaController.java index 966e3c6..12b8c56 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/FormatJpaController.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/FormatJpaController.java @@ -15,6 +15,8 @@ import com.github.javydreamercsw.database.storage.db.FormatPK; import com.github.javydreamercsw.database.storage.db.Game; import com.github.javydreamercsw.database.storage.db.MatchEntry; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; +import com.github.javydreamercsw.database.storage.db.Tournament; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.PreexistingEntityException; @@ -38,6 +40,14 @@ public void create(Format format) throws PreexistingEntityException, Exception { format.setMatchEntryList(new ArrayList<>()); } + if (format.getTournamentList() == null) + { + format.setTournamentList(new ArrayList<>()); + } + if (format.getTeamHasFormatRecordList() == null) + { + format.setTeamHasFormatRecordList(new ArrayList<>()); + } format.getFormatPK().setGameId(format.getGame().getId()); EntityManager em = null; try @@ -57,6 +67,20 @@ public void create(Format format) throws PreexistingEntityException, Exception attachedMatchEntryList.add(matchEntryListMatchEntryToAttach); } format.setMatchEntryList(attachedMatchEntryList); + List attachedTournamentList = new ArrayList<>(); + for (Tournament tournamentListTournamentToAttach : format.getTournamentList()) + { + tournamentListTournamentToAttach = em.getReference(tournamentListTournamentToAttach.getClass(), tournamentListTournamentToAttach.getTournamentPK()); + attachedTournamentList.add(tournamentListTournamentToAttach); + } + format.setTournamentList(attachedTournamentList); + List attachedTeamHasFormatRecordList = new ArrayList<>(); + for (TeamHasFormatRecord teamHasFormatRecordListTeamHasFormatRecordToAttach : format.getTeamHasFormatRecordList()) + { + teamHasFormatRecordListTeamHasFormatRecordToAttach = em.getReference(teamHasFormatRecordListTeamHasFormatRecordToAttach.getClass(), teamHasFormatRecordListTeamHasFormatRecordToAttach.getTeamHasFormatRecordPK()); + attachedTeamHasFormatRecordList.add(teamHasFormatRecordListTeamHasFormatRecordToAttach); + } + format.setTeamHasFormatRecordList(attachedTeamHasFormatRecordList); em.persist(format); if (game != null) { @@ -74,6 +98,28 @@ public void create(Format format) throws PreexistingEntityException, Exception oldFormatOfMatchEntryListMatchEntry = em.merge(oldFormatOfMatchEntryListMatchEntry); } } + for (Tournament tournamentListTournament : format.getTournamentList()) + { + Format oldFormatOfTournamentListTournament = tournamentListTournament.getFormat(); + tournamentListTournament.setFormat(format); + tournamentListTournament = em.merge(tournamentListTournament); + if (oldFormatOfTournamentListTournament != null) + { + oldFormatOfTournamentListTournament.getTournamentList().remove(tournamentListTournament); + oldFormatOfTournamentListTournament = em.merge(oldFormatOfTournamentListTournament); + } + } + for (TeamHasFormatRecord teamHasFormatRecordListTeamHasFormatRecord : format.getTeamHasFormatRecordList()) + { + Format oldFormatOfTeamHasFormatRecordListTeamHasFormatRecord = teamHasFormatRecordListTeamHasFormatRecord.getFormat(); + teamHasFormatRecordListTeamHasFormatRecord.setFormat(format); + teamHasFormatRecordListTeamHasFormatRecord = em.merge(teamHasFormatRecordListTeamHasFormatRecord); + if (oldFormatOfTeamHasFormatRecordListTeamHasFormatRecord != null) + { + oldFormatOfTeamHasFormatRecordListTeamHasFormatRecord.getTeamHasFormatRecordList().remove(teamHasFormatRecordListTeamHasFormatRecord); + oldFormatOfTeamHasFormatRecordListTeamHasFormatRecord = em.merge(oldFormatOfTeamHasFormatRecordListTeamHasFormatRecord); + } + } em.getTransaction().commit(); } catch (Exception ex) @@ -106,6 +152,10 @@ public void edit(Format format) throws IllegalOrphanException, NonexistentEntity Game gameNew = format.getGame(); List matchEntryListOld = persistentFormat.getMatchEntryList(); List matchEntryListNew = format.getMatchEntryList(); + List tournamentListOld = persistentFormat.getTournamentList(); + List tournamentListNew = format.getTournamentList(); + List teamHasFormatRecordListOld = persistentFormat.getTeamHasFormatRecordList(); + List teamHasFormatRecordListNew = format.getTeamHasFormatRecordList(); List illegalOrphanMessages = null; for (MatchEntry matchEntryListOldMatchEntry : matchEntryListOld) { @@ -118,6 +168,28 @@ public void edit(Format format) throws IllegalOrphanException, NonexistentEntity illegalOrphanMessages.add("You must retain MatchEntry " + matchEntryListOldMatchEntry + " since its format field is not nullable."); } } + for (Tournament tournamentListOldTournament : tournamentListOld) + { + if (!tournamentListNew.contains(tournamentListOldTournament)) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("You must retain Tournament " + tournamentListOldTournament + " since its format field is not nullable."); + } + } + for (TeamHasFormatRecord teamHasFormatRecordListOldTeamHasFormatRecord : teamHasFormatRecordListOld) + { + if (!teamHasFormatRecordListNew.contains(teamHasFormatRecordListOldTeamHasFormatRecord)) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("You must retain TeamHasFormatRecord " + teamHasFormatRecordListOldTeamHasFormatRecord + " since its format field is not nullable."); + } + } if (illegalOrphanMessages != null) { throw new IllegalOrphanException(illegalOrphanMessages); @@ -135,6 +207,22 @@ public void edit(Format format) throws IllegalOrphanException, NonexistentEntity } matchEntryListNew = attachedMatchEntryListNew; format.setMatchEntryList(matchEntryListNew); + List attachedTournamentListNew = new ArrayList<>(); + for (Tournament tournamentListNewTournamentToAttach : tournamentListNew) + { + tournamentListNewTournamentToAttach = em.getReference(tournamentListNewTournamentToAttach.getClass(), tournamentListNewTournamentToAttach.getTournamentPK()); + attachedTournamentListNew.add(tournamentListNewTournamentToAttach); + } + tournamentListNew = attachedTournamentListNew; + format.setTournamentList(tournamentListNew); + List attachedTeamHasFormatRecordListNew = new ArrayList<>(); + for (TeamHasFormatRecord teamHasFormatRecordListNewTeamHasFormatRecordToAttach : teamHasFormatRecordListNew) + { + teamHasFormatRecordListNewTeamHasFormatRecordToAttach = em.getReference(teamHasFormatRecordListNewTeamHasFormatRecordToAttach.getClass(), teamHasFormatRecordListNewTeamHasFormatRecordToAttach.getTeamHasFormatRecordPK()); + attachedTeamHasFormatRecordListNew.add(teamHasFormatRecordListNewTeamHasFormatRecordToAttach); + } + teamHasFormatRecordListNew = attachedTeamHasFormatRecordListNew; + format.setTeamHasFormatRecordList(teamHasFormatRecordListNew); format = em.merge(format); if (gameOld != null && !gameOld.equals(gameNew)) { @@ -160,6 +248,34 @@ public void edit(Format format) throws IllegalOrphanException, NonexistentEntity } } } + for (Tournament tournamentListNewTournament : tournamentListNew) + { + if (!tournamentListOld.contains(tournamentListNewTournament)) + { + Format oldFormatOfTournamentListNewTournament = tournamentListNewTournament.getFormat(); + tournamentListNewTournament.setFormat(format); + tournamentListNewTournament = em.merge(tournamentListNewTournament); + if (oldFormatOfTournamentListNewTournament != null && !oldFormatOfTournamentListNewTournament.equals(format)) + { + oldFormatOfTournamentListNewTournament.getTournamentList().remove(tournamentListNewTournament); + oldFormatOfTournamentListNewTournament = em.merge(oldFormatOfTournamentListNewTournament); + } + } + } + for (TeamHasFormatRecord teamHasFormatRecordListNewTeamHasFormatRecord : teamHasFormatRecordListNew) + { + if (!teamHasFormatRecordListOld.contains(teamHasFormatRecordListNewTeamHasFormatRecord)) + { + Format oldFormatOfTeamHasFormatRecordListNewTeamHasFormatRecord = teamHasFormatRecordListNewTeamHasFormatRecord.getFormat(); + teamHasFormatRecordListNewTeamHasFormatRecord.setFormat(format); + teamHasFormatRecordListNewTeamHasFormatRecord = em.merge(teamHasFormatRecordListNewTeamHasFormatRecord); + if (oldFormatOfTeamHasFormatRecordListNewTeamHasFormatRecord != null && !oldFormatOfTeamHasFormatRecordListNewTeamHasFormatRecord.equals(format)) + { + oldFormatOfTeamHasFormatRecordListNewTeamHasFormatRecord.getTeamHasFormatRecordList().remove(teamHasFormatRecordListNewTeamHasFormatRecord); + oldFormatOfTeamHasFormatRecordListNewTeamHasFormatRecord = em.merge(oldFormatOfTeamHasFormatRecordListNewTeamHasFormatRecord); + } + } + } em.getTransaction().commit(); } catch (Exception ex) @@ -211,6 +327,24 @@ public void destroy(FormatPK id) throws IllegalOrphanException, NonexistentEntit } illegalOrphanMessages.add("This Format (" + format + ") cannot be destroyed since the MatchEntry " + matchEntryListOrphanCheckMatchEntry + " in its matchEntryList field has a non-nullable format field."); } + List tournamentListOrphanCheck = format.getTournamentList(); + for (Tournament tournamentListOrphanCheckTournament : tournamentListOrphanCheck) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("This Format (" + format + ") cannot be destroyed since the Tournament " + tournamentListOrphanCheckTournament + " in its tournamentList field has a non-nullable format field."); + } + List teamHasFormatRecordListOrphanCheck = format.getTeamHasFormatRecordList(); + for (TeamHasFormatRecord teamHasFormatRecordListOrphanCheckTeamHasFormatRecord : teamHasFormatRecordListOrphanCheck) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("This Format (" + format + ") cannot be destroyed since the TeamHasFormatRecord " + teamHasFormatRecordListOrphanCheckTeamHasFormatRecord + " in its teamHasFormatRecordList field has a non-nullable format field."); + } if (illegalOrphanMessages != null) { throw new IllegalOrphanException(illegalOrphanMessages); diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/RoundJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/RoundJpaController.java index c58fbc7..0b3ba9c 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/RoundJpaController.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/RoundJpaController.java @@ -39,7 +39,7 @@ public void create(Round round) throws PreexistingEntityException, Exception { round.setMatchEntryList(new ArrayList<>()); } - round.getRoundPK().setTournamentId(round.getTournament().getId()); + round.getRoundPK().setTournamentId(round.getTournament().getTournamentPK().getId()); EntityManager em = null; try { @@ -48,7 +48,7 @@ public void create(Round round) throws PreexistingEntityException, Exception Tournament tournament = round.getTournament(); if (tournament != null) { - tournament = em.getReference(tournament.getClass(), tournament.getId()); + tournament = em.getReference(tournament.getClass(), tournament.getTournamentPK()); round.setTournament(tournament); } List attachedMatchEntryList = new ArrayList<>(); @@ -96,7 +96,7 @@ public void create(Round round) throws PreexistingEntityException, Exception public void edit(Round round) throws IllegalOrphanException, NonexistentEntityException, Exception { - round.getRoundPK().setTournamentId(round.getTournament().getId()); + round.getRoundPK().setTournamentId(round.getTournament().getTournamentPK().getId()); EntityManager em = null; try { @@ -125,7 +125,7 @@ public void edit(Round round) throws IllegalOrphanException, NonexistentEntityEx } if (tournamentNew != null) { - tournamentNew = em.getReference(tournamentNew.getClass(), tournamentNew.getId()); + tournamentNew = em.getReference(tournamentNew.getClass(), tournamentNew.getTournamentPK()); round.setTournament(tournamentNew); } List attachedMatchEntryListNew = new ArrayList<>(); @@ -294,5 +294,5 @@ public int getRoundCount() em.close(); } } - + } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamHasFormatRecordJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamHasFormatRecordJpaController.java new file mode 100644 index 0000000..910eb2a --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamHasFormatRecordJpaController.java @@ -0,0 +1,257 @@ +package com.github.javydreamercsw.database.storage.db.controller; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityNotFoundException; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import com.github.javydreamercsw.database.storage.db.Format; +import com.github.javydreamercsw.database.storage.db.Team; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecordPK; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.PreexistingEntityException; +import com.github.javydreamercsw.database.storage.db.server.AbstractController; + +public class TeamHasFormatRecordJpaController extends AbstractController implements Serializable +{ + private static final long serialVersionUID = 2465839189233391174L; + public TeamHasFormatRecordJpaController(EntityManagerFactory emf) + { + super(emf); + } + + public void create(TeamHasFormatRecord teamHasFormatRecord) throws PreexistingEntityException, Exception + { + if (teamHasFormatRecord.getTeamHasFormatRecordPK() == null) + { + teamHasFormatRecord.setTeamHasFormatRecordPK(new TeamHasFormatRecordPK()); + } + teamHasFormatRecord.getTeamHasFormatRecordPK().setFormatGameId(teamHasFormatRecord.getFormat().getFormatPK().getGameId()); + teamHasFormatRecord.getTeamHasFormatRecordPK().setFormatId(teamHasFormatRecord.getFormat().getFormatPK().getId()); + teamHasFormatRecord.getTeamHasFormatRecordPK().setTeamId(teamHasFormatRecord.getTeam().getId()); + EntityManager em = null; + try + { + em = getEntityManager(); + em.getTransaction().begin(); + Format format = teamHasFormatRecord.getFormat(); + if (format != null) + { + format = em.getReference(format.getClass(), format.getFormatPK()); + teamHasFormatRecord.setFormat(format); + } + Team team = teamHasFormatRecord.getTeam(); + if (team != null) + { + team = em.getReference(team.getClass(), team.getId()); + teamHasFormatRecord.setTeam(team); + } + em.persist(teamHasFormatRecord); + if (format != null) + { + format.getTeamHasFormatRecordList().add(teamHasFormatRecord); + format = em.merge(format); + } + if (team != null) + { + team.getTeamHasFormatRecordList().add(teamHasFormatRecord); + team = em.merge(team); + } + em.getTransaction().commit(); + } + catch (Exception ex) + { + if (findTeamHasFormatRecord(teamHasFormatRecord.getTeamHasFormatRecordPK()) != null) + { + throw new PreexistingEntityException("TeamHasFormatRecord " + teamHasFormatRecord + " already exists.", ex); + } + throw ex; + } + finally + { + if (em != null) + { + em.close(); + } + } + } + + public void edit(TeamHasFormatRecord teamHasFormatRecord) throws NonexistentEntityException, Exception + { + teamHasFormatRecord.getTeamHasFormatRecordPK().setFormatGameId(teamHasFormatRecord.getFormat().getFormatPK().getGameId()); + teamHasFormatRecord.getTeamHasFormatRecordPK().setFormatId(teamHasFormatRecord.getFormat().getFormatPK().getId()); + teamHasFormatRecord.getTeamHasFormatRecordPK().setTeamId(teamHasFormatRecord.getTeam().getId()); + EntityManager em = null; + try + { + em = getEntityManager(); + em.getTransaction().begin(); + TeamHasFormatRecord persistentTeamHasFormatRecord = em.find(TeamHasFormatRecord.class, teamHasFormatRecord.getTeamHasFormatRecordPK()); + Format formatOld = persistentTeamHasFormatRecord.getFormat(); + Format formatNew = teamHasFormatRecord.getFormat(); + Team teamOld = persistentTeamHasFormatRecord.getTeam(); + Team teamNew = teamHasFormatRecord.getTeam(); + if (formatNew != null) + { + formatNew = em.getReference(formatNew.getClass(), formatNew.getFormatPK()); + teamHasFormatRecord.setFormat(formatNew); + } + if (teamNew != null) + { + teamNew = em.getReference(teamNew.getClass(), teamNew.getId()); + teamHasFormatRecord.setTeam(teamNew); + } + teamHasFormatRecord = em.merge(teamHasFormatRecord); + if (formatOld != null && !formatOld.equals(formatNew)) + { + formatOld.getTeamHasFormatRecordList().remove(teamHasFormatRecord); + formatOld = em.merge(formatOld); + } + if (formatNew != null && !formatNew.equals(formatOld)) + { + formatNew.getTeamHasFormatRecordList().add(teamHasFormatRecord); + formatNew = em.merge(formatNew); + } + if (teamOld != null && !teamOld.equals(teamNew)) + { + teamOld.getTeamHasFormatRecordList().remove(teamHasFormatRecord); + teamOld = em.merge(teamOld); + } + if (teamNew != null && !teamNew.equals(teamOld)) + { + teamNew.getTeamHasFormatRecordList().add(teamHasFormatRecord); + teamNew = em.merge(teamNew); + } + em.getTransaction().commit(); + } + catch (Exception ex) + { + String msg = ex.getLocalizedMessage(); + if (msg == null || msg.length() == 0) + { + TeamHasFormatRecordPK id = teamHasFormatRecord.getTeamHasFormatRecordPK(); + if (findTeamHasFormatRecord(id) == null) + { + throw new NonexistentEntityException("The teamHasFormatRecord with id " + id + " no longer exists."); + } + } + throw ex; + } + finally + { + if (em != null) + { + em.close(); + } + } + } + + public void destroy(TeamHasFormatRecordPK id) throws NonexistentEntityException + { + EntityManager em = null; + try + { + em = getEntityManager(); + em.getTransaction().begin(); + TeamHasFormatRecord teamHasFormatRecord; + try + { + teamHasFormatRecord = em.getReference(TeamHasFormatRecord.class, id); + teamHasFormatRecord.getTeamHasFormatRecordPK(); + } + catch (EntityNotFoundException enfe) + { + throw new NonexistentEntityException("The teamHasFormatRecord with id " + id + " no longer exists.", enfe); + } + Format format = teamHasFormatRecord.getFormat(); + if (format != null) + { + format.getTeamHasFormatRecordList().remove(teamHasFormatRecord); + format = em.merge(format); + } + Team team = teamHasFormatRecord.getTeam(); + if (team != null) + { + team.getTeamHasFormatRecordList().remove(teamHasFormatRecord); + team = em.merge(team); + } + em.remove(teamHasFormatRecord); + em.getTransaction().commit(); + } + finally + { + if (em != null) + { + em.close(); + } + } + } + + public List findTeamHasFormatRecordEntities() + { + return findTeamHasFormatRecordEntities(true, -1, -1); + } + + public List findTeamHasFormatRecordEntities(int maxResults, int firstResult) + { + return findTeamHasFormatRecordEntities(false, maxResults, firstResult); + } + + private List findTeamHasFormatRecordEntities(boolean all, int maxResults, int firstResult) + { + EntityManager em = getEntityManager(); + try + { + CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); + cq.select(cq.from(TeamHasFormatRecord.class)); + Query q = em.createQuery(cq); + if (!all) + { + q.setMaxResults(maxResults); + q.setFirstResult(firstResult); + } + return q.getResultList(); + } + finally + { + em.close(); + } + } + + public TeamHasFormatRecord findTeamHasFormatRecord(TeamHasFormatRecordPK id) + { + EntityManager em = getEntityManager(); + try + { + return em.find(TeamHasFormatRecord.class, id); + } + finally + { + em.close(); + } + } + + public int getTeamHasFormatRecordCount() + { + EntityManager em = getEntityManager(); + try + { + CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); + Root rt = cq.from(TeamHasFormatRecord.class); + cq.select(em.getCriteriaBuilder().count(rt)); + Query q = em.createQuery(cq); + return ((Long) q.getSingleResult()).intValue(); + } + finally + { + em.close(); + } + } + +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamJpaController.java index 7a3805b..8b54a5d 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamJpaController.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TeamJpaController.java @@ -14,6 +14,7 @@ import com.github.javydreamercsw.database.storage.db.MatchHasTeam; import com.github.javydreamercsw.database.storage.db.Player; import com.github.javydreamercsw.database.storage.db.Team; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; import com.github.javydreamercsw.database.storage.db.TournamentHasTeam; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; @@ -42,6 +43,10 @@ public void create(Team team) { team.setTournamentHasTeamList(new ArrayList<>()); } + if (team.getTeamHasFormatRecordList() == null) + { + team.setTeamHasFormatRecordList(new ArrayList<>()); + } EntityManager em = null; try { @@ -68,6 +73,13 @@ public void create(Team team) attachedTournamentHasTeamList.add(tournamentHasTeamListTournamentHasTeamToAttach); } team.setTournamentHasTeamList(attachedTournamentHasTeamList); + List attachedTeamHasFormatRecordList = new ArrayList<>(); + for (TeamHasFormatRecord teamHasFormatRecordListTeamHasFormatRecordToAttach : team.getTeamHasFormatRecordList()) + { + teamHasFormatRecordListTeamHasFormatRecordToAttach = em.getReference(teamHasFormatRecordListTeamHasFormatRecordToAttach.getClass(), teamHasFormatRecordListTeamHasFormatRecordToAttach.getTeamHasFormatRecordPK()); + attachedTeamHasFormatRecordList.add(teamHasFormatRecordListTeamHasFormatRecordToAttach); + } + team.setTeamHasFormatRecordList(attachedTeamHasFormatRecordList); em.persist(team); for (Player playerListPlayer : team.getPlayerList()) { @@ -96,6 +108,17 @@ public void create(Team team) oldTeamOfTournamentHasTeamListTournamentHasTeam = em.merge(oldTeamOfTournamentHasTeamListTournamentHasTeam); } } + for (TeamHasFormatRecord teamHasFormatRecordListTeamHasFormatRecord : team.getTeamHasFormatRecordList()) + { + Team oldTeamOfTeamHasFormatRecordListTeamHasFormatRecord = teamHasFormatRecordListTeamHasFormatRecord.getTeam(); + teamHasFormatRecordListTeamHasFormatRecord.setTeam(team); + teamHasFormatRecordListTeamHasFormatRecord = em.merge(teamHasFormatRecordListTeamHasFormatRecord); + if (oldTeamOfTeamHasFormatRecordListTeamHasFormatRecord != null) + { + oldTeamOfTeamHasFormatRecordListTeamHasFormatRecord.getTeamHasFormatRecordList().remove(teamHasFormatRecordListTeamHasFormatRecord); + oldTeamOfTeamHasFormatRecordListTeamHasFormatRecord = em.merge(oldTeamOfTeamHasFormatRecordListTeamHasFormatRecord); + } + } em.getTransaction().commit(); } finally @@ -121,6 +144,8 @@ public void edit(Team team) throws IllegalOrphanException, NonexistentEntityExce List matchHasTeamListNew = team.getMatchHasTeamList(); List tournamentHasTeamListOld = persistentTeam.getTournamentHasTeamList(); List tournamentHasTeamListNew = team.getTournamentHasTeamList(); + List teamHasFormatRecordListOld = persistentTeam.getTeamHasFormatRecordList(); + List teamHasFormatRecordListNew = team.getTeamHasFormatRecordList(); List illegalOrphanMessages = null; for (MatchHasTeam matchHasTeamListOldMatchHasTeam : matchHasTeamListOld) { @@ -144,6 +169,17 @@ public void edit(Team team) throws IllegalOrphanException, NonexistentEntityExce illegalOrphanMessages.add("You must retain TournamentHasTeam " + tournamentHasTeamListOldTournamentHasTeam + " since its team field is not nullable."); } } + for (TeamHasFormatRecord teamHasFormatRecordListOldTeamHasFormatRecord : teamHasFormatRecordListOld) + { + if (!teamHasFormatRecordListNew.contains(teamHasFormatRecordListOldTeamHasFormatRecord)) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("You must retain TeamHasFormatRecord " + teamHasFormatRecordListOldTeamHasFormatRecord + " since its team field is not nullable."); + } + } if (illegalOrphanMessages != null) { throw new IllegalOrphanException(illegalOrphanMessages); @@ -172,6 +208,14 @@ public void edit(Team team) throws IllegalOrphanException, NonexistentEntityExce } tournamentHasTeamListNew = attachedTournamentHasTeamListNew; team.setTournamentHasTeamList(tournamentHasTeamListNew); + List attachedTeamHasFormatRecordListNew = new ArrayList<>(); + for (TeamHasFormatRecord teamHasFormatRecordListNewTeamHasFormatRecordToAttach : teamHasFormatRecordListNew) + { + teamHasFormatRecordListNewTeamHasFormatRecordToAttach = em.getReference(teamHasFormatRecordListNewTeamHasFormatRecordToAttach.getClass(), teamHasFormatRecordListNewTeamHasFormatRecordToAttach.getTeamHasFormatRecordPK()); + attachedTeamHasFormatRecordListNew.add(teamHasFormatRecordListNewTeamHasFormatRecordToAttach); + } + teamHasFormatRecordListNew = attachedTeamHasFormatRecordListNew; + team.setTeamHasFormatRecordList(teamHasFormatRecordListNew); team = em.merge(team); for (Player playerListOldPlayer : playerListOld) { @@ -217,6 +261,20 @@ public void edit(Team team) throws IllegalOrphanException, NonexistentEntityExce } } } + for (TeamHasFormatRecord teamHasFormatRecordListNewTeamHasFormatRecord : teamHasFormatRecordListNew) + { + if (!teamHasFormatRecordListOld.contains(teamHasFormatRecordListNewTeamHasFormatRecord)) + { + Team oldTeamOfTeamHasFormatRecordListNewTeamHasFormatRecord = teamHasFormatRecordListNewTeamHasFormatRecord.getTeam(); + teamHasFormatRecordListNewTeamHasFormatRecord.setTeam(team); + teamHasFormatRecordListNewTeamHasFormatRecord = em.merge(teamHasFormatRecordListNewTeamHasFormatRecord); + if (oldTeamOfTeamHasFormatRecordListNewTeamHasFormatRecord != null && !oldTeamOfTeamHasFormatRecordListNewTeamHasFormatRecord.equals(team)) + { + oldTeamOfTeamHasFormatRecordListNewTeamHasFormatRecord.getTeamHasFormatRecordList().remove(teamHasFormatRecordListNewTeamHasFormatRecord); + oldTeamOfTeamHasFormatRecordListNewTeamHasFormatRecord = em.merge(oldTeamOfTeamHasFormatRecordListNewTeamHasFormatRecord); + } + } + } em.getTransaction().commit(); } catch (Exception ex) @@ -277,6 +335,15 @@ public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntity } illegalOrphanMessages.add("This Team (" + team + ") cannot be destroyed since the TournamentHasTeam " + tournamentHasTeamListOrphanCheckTournamentHasTeam + " in its tournamentHasTeamList field has a non-nullable team field."); } + List teamHasFormatRecordListOrphanCheck = team.getTeamHasFormatRecordList(); + for (TeamHasFormatRecord teamHasFormatRecordListOrphanCheckTeamHasFormatRecord : teamHasFormatRecordListOrphanCheck) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("This Team (" + team + ") cannot be destroyed since the TeamHasFormatRecord " + teamHasFormatRecordListOrphanCheckTeamHasFormatRecord + " in its teamHasFormatRecordList field has a non-nullable team field."); + } if (illegalOrphanMessages != null) { throw new IllegalOrphanException(illegalOrphanMessages); @@ -359,5 +426,5 @@ public int getTeamCount() em.close(); } } - + } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentFormatJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentFormatJpaController.java new file mode 100644 index 0000000..8efc1e2 --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentFormatJpaController.java @@ -0,0 +1,257 @@ +package com.github.javydreamercsw.database.storage.db.controller; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityNotFoundException; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentFormat; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.PreexistingEntityException; +import com.github.javydreamercsw.database.storage.db.server.AbstractController; + +public class TournamentFormatJpaController extends AbstractController implements Serializable +{ + private static final long serialVersionUID = 8124092964263662804L; + + public TournamentFormatJpaController(EntityManagerFactory emf) + { + super(emf); + } + + public void create(TournamentFormat tournamentFormat) throws PreexistingEntityException, Exception + { + if (tournamentFormat.getTournamentList() == null) + { + tournamentFormat.setTournamentList(new ArrayList<>()); + } + EntityManager em = null; + try + { + em = getEntityManager(); + em.getTransaction().begin(); + List attachedTournamentList = new ArrayList<>(); + for (Tournament tournamentListTournamentToAttach : tournamentFormat.getTournamentList()) + { + tournamentListTournamentToAttach = em.getReference(tournamentListTournamentToAttach.getClass(), tournamentListTournamentToAttach.getTournamentPK()); + attachedTournamentList.add(tournamentListTournamentToAttach); + } + tournamentFormat.setTournamentList(attachedTournamentList); + em.persist(tournamentFormat); + for (Tournament tournamentListTournament : tournamentFormat.getTournamentList()) + { + TournamentFormat oldTournamentFormatOfTournamentListTournament = tournamentListTournament.getTournamentFormat(); + tournamentListTournament.setTournamentFormat(tournamentFormat); + tournamentListTournament = em.merge(tournamentListTournament); + if (oldTournamentFormatOfTournamentListTournament != null) + { + oldTournamentFormatOfTournamentListTournament.getTournamentList().remove(tournamentListTournament); + oldTournamentFormatOfTournamentListTournament = em.merge(oldTournamentFormatOfTournamentListTournament); + } + } + em.getTransaction().commit(); + } + catch (Exception ex) + { + if (tournamentFormat.getId() != null + && findTournamentFormat(tournamentFormat.getId()) != null) + { + throw new PreexistingEntityException("TournamentFormat " + tournamentFormat + " already exists.", ex); + } + throw ex; + } + finally + { + if (em != null) + { + em.close(); + } + } + } + + public void edit(TournamentFormat tournamentFormat) throws IllegalOrphanException, NonexistentEntityException, Exception + { + EntityManager em = null; + try + { + em = getEntityManager(); + em.getTransaction().begin(); + TournamentFormat persistentTournamentFormat = em.find(TournamentFormat.class, tournamentFormat.getId()); + List tournamentListOld = persistentTournamentFormat.getTournamentList(); + List tournamentListNew = tournamentFormat.getTournamentList(); + List illegalOrphanMessages = null; + for (Tournament tournamentListOldTournament : tournamentListOld) + { + if (!tournamentListNew.contains(tournamentListOldTournament)) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("You must retain Tournament " + tournamentListOldTournament + " since its tournamentFormat field is not nullable."); + } + } + if (illegalOrphanMessages != null) + { + throw new IllegalOrphanException(illegalOrphanMessages); + } + List attachedTournamentListNew = new ArrayList<>(); + for (Tournament tournamentListNewTournamentToAttach : tournamentListNew) + { + tournamentListNewTournamentToAttach = em.getReference(tournamentListNewTournamentToAttach.getClass(), tournamentListNewTournamentToAttach.getTournamentPK()); + attachedTournamentListNew.add(tournamentListNewTournamentToAttach); + } + tournamentListNew = attachedTournamentListNew; + tournamentFormat.setTournamentList(tournamentListNew); + tournamentFormat = em.merge(tournamentFormat); + for (Tournament tournamentListNewTournament : tournamentListNew) + { + if (!tournamentListOld.contains(tournamentListNewTournament)) + { + TournamentFormat oldTournamentFormatOfTournamentListNewTournament = tournamentListNewTournament.getTournamentFormat(); + tournamentListNewTournament.setTournamentFormat(tournamentFormat); + tournamentListNewTournament = em.merge(tournamentListNewTournament); + if (oldTournamentFormatOfTournamentListNewTournament != null && !oldTournamentFormatOfTournamentListNewTournament.equals(tournamentFormat)) + { + oldTournamentFormatOfTournamentListNewTournament.getTournamentList().remove(tournamentListNewTournament); + oldTournamentFormatOfTournamentListNewTournament = em.merge(oldTournamentFormatOfTournamentListNewTournament); + } + } + } + em.getTransaction().commit(); + } + catch (Exception ex) + { + String msg = ex.getLocalizedMessage(); + if (msg == null || msg.length() == 0) + { + Integer id = tournamentFormat.getId(); + if (findTournamentFormat(id) == null) + { + throw new NonexistentEntityException("The tournamentFormat with id " + id + " no longer exists."); + } + } + throw ex; + } + finally + { + if (em != null) + { + em.close(); + } + } + } + + public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException + { + EntityManager em = null; + try + { + em = getEntityManager(); + em.getTransaction().begin(); + TournamentFormat tournamentFormat; + try + { + tournamentFormat = em.getReference(TournamentFormat.class, id); + tournamentFormat.getId(); + } + catch (EntityNotFoundException enfe) + { + throw new NonexistentEntityException("The tournamentFormat with id " + id + " no longer exists.", enfe); + } + List illegalOrphanMessages = null; + List tournamentListOrphanCheck = tournamentFormat.getTournamentList(); + for (Tournament tournamentListOrphanCheckTournament : tournamentListOrphanCheck) + { + if (illegalOrphanMessages == null) + { + illegalOrphanMessages = new ArrayList<>(); + } + illegalOrphanMessages.add("This TournamentFormat (" + tournamentFormat + ") cannot be destroyed since the Tournament " + tournamentListOrphanCheckTournament + " in its tournamentList field has a non-nullable tournamentFormat field."); + } + if (illegalOrphanMessages != null) + { + throw new IllegalOrphanException(illegalOrphanMessages); + } + em.remove(tournamentFormat); + em.getTransaction().commit(); + } + finally + { + if (em != null) + { + em.close(); + } + } + } + + public List findTournamentFormatEntities() + { + return findTournamentFormatEntities(true, -1, -1); + } + + public List findTournamentFormatEntities(int maxResults, int firstResult) + { + return findTournamentFormatEntities(false, maxResults, firstResult); + } + + private List findTournamentFormatEntities(boolean all, int maxResults, int firstResult) + { + EntityManager em = getEntityManager(); + try + { + CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); + cq.select(cq.from(TournamentFormat.class)); + Query q = em.createQuery(cq); + if (!all) + { + q.setMaxResults(maxResults); + q.setFirstResult(firstResult); + } + return q.getResultList(); + } + finally + { + em.close(); + } + } + + public TournamentFormat findTournamentFormat(Integer id) + { + EntityManager em = getEntityManager(); + try + { + return em.find(TournamentFormat.class, id); + } + finally + { + em.close(); + } + } + + public int getTournamentFormatCount() + { + EntityManager em = getEntityManager(); + try + { + CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); + Root rt = cq.from(TournamentFormat.class); + cq.select(em.getCriteriaBuilder().count(rt)); + Query q = em.createQuery(cq); + return ((Long) q.getSingleResult()).intValue(); + } + finally + { + em.close(); + } + } + +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentHasTeamJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentHasTeamJpaController.java index bcbfdcd..80bc46c 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentHasTeamJpaController.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentHasTeamJpaController.java @@ -39,8 +39,8 @@ public void create(TournamentHasTeam tournamentHasTeam) throws PreexistingEntity { tournamentHasTeam.setRecordList(new ArrayList<>()); } - tournamentHasTeam.getTournamentHasTeamPK().setTournamentId(tournamentHasTeam.getTournament().getId()); tournamentHasTeam.getTournamentHasTeamPK().setTeamId(tournamentHasTeam.getTeam().getId()); + tournamentHasTeam.getTournamentHasTeamPK().setTournamentId(tournamentHasTeam.getTournament().getTournamentPK().getId()); EntityManager em = null; try { @@ -55,7 +55,7 @@ public void create(TournamentHasTeam tournamentHasTeam) throws PreexistingEntity Tournament tournament = tournamentHasTeam.getTournament(); if (tournament != null) { - tournament = em.getReference(tournament.getClass(), tournament.getId()); + tournament = em.getReference(tournament.getClass(), tournament.getTournamentPK()); tournamentHasTeam.setTournament(tournament); } List attachedRecordList = new ArrayList<>(); @@ -102,8 +102,8 @@ public void create(TournamentHasTeam tournamentHasTeam) throws PreexistingEntity public void edit(TournamentHasTeam tournamentHasTeam) throws NonexistentEntityException, Exception { - tournamentHasTeam.getTournamentHasTeamPK().setTournamentId(tournamentHasTeam.getTournament().getId()); tournamentHasTeam.getTournamentHasTeamPK().setTeamId(tournamentHasTeam.getTeam().getId()); + tournamentHasTeam.getTournamentHasTeamPK().setTournamentId(tournamentHasTeam.getTournament().getTournamentPK().getId()); EntityManager em = null; try { @@ -123,7 +123,7 @@ public void edit(TournamentHasTeam tournamentHasTeam) throws NonexistentEntityEx } if (tournamentNew != null) { - tournamentNew = em.getReference(tournamentNew.getClass(), tournamentNew.getId()); + tournamentNew = em.getReference(tournamentNew.getClass(), tournamentNew.getTournamentPK()); tournamentHasTeam.setTournament(tournamentNew); } List attachedRecordListNew = new ArrayList<>(); @@ -302,5 +302,5 @@ public int getTournamentHasTeamCount() em.close(); } } - + } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentJpaController.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentJpaController.java index a12e9aa..959a65a 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentJpaController.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/controller/TournamentJpaController.java @@ -11,44 +11,57 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; +import com.github.javydreamercsw.database.storage.db.Format; import com.github.javydreamercsw.database.storage.db.Round; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentFormat; import com.github.javydreamercsw.database.storage.db.TournamentHasTeam; +import com.github.javydreamercsw.database.storage.db.TournamentPK; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.PreexistingEntityException; import com.github.javydreamercsw.database.storage.db.server.AbstractController; public class TournamentJpaController extends AbstractController implements Serializable { - private static final long serialVersionUID = -3241408395907726172L; - + private static final long serialVersionUID = 2285164831364920828L; public TournamentJpaController(EntityManagerFactory emf) { super(emf); } - public void create(Tournament tournament) + public void create(Tournament tournament) throws PreexistingEntityException, Exception { - if (tournament.getRoundList() == null) + if (tournament.getTournamentPK() == null) { - tournament.setRoundList(new ArrayList<>()); + tournament.setTournamentPK(new TournamentPK()); } if (tournament.getTournamentHasTeamList() == null) { tournament.setTournamentHasTeamList(new ArrayList<>()); } + if (tournament.getRoundList() == null) + { + tournament.setRoundList(new ArrayList<>()); + } + tournament.getTournamentPK().setTournamentFormatId(tournament.getTournamentFormat().getId()); EntityManager em = null; try { em = getEntityManager(); em.getTransaction().begin(); - List attachedRoundList = new ArrayList<>(); - for (Round roundListRoundToAttach : tournament.getRoundList()) + Format format = tournament.getFormat(); + if (format != null) { - roundListRoundToAttach = em.getReference(roundListRoundToAttach.getClass(), roundListRoundToAttach.getRoundPK()); - attachedRoundList.add(roundListRoundToAttach); + format = em.getReference(format.getClass(), format.getFormatPK()); + tournament.setFormat(format); + } + TournamentFormat tournamentFormat = tournament.getTournamentFormat(); + if (tournamentFormat != null) + { + tournamentFormat = em.getReference(tournamentFormat.getClass(), tournamentFormat.getId()); + tournament.setTournamentFormat(tournamentFormat); } - tournament.setRoundList(attachedRoundList); List attachedTournamentHasTeamList = new ArrayList<>(); for (TournamentHasTeam tournamentHasTeamListTournamentHasTeamToAttach : tournament.getTournamentHasTeamList()) { @@ -56,17 +69,23 @@ public void create(Tournament tournament) attachedTournamentHasTeamList.add(tournamentHasTeamListTournamentHasTeamToAttach); } tournament.setTournamentHasTeamList(attachedTournamentHasTeamList); + List attachedRoundList = new ArrayList<>(); + for (Round roundListRoundToAttach : tournament.getRoundList()) + { + roundListRoundToAttach = em.getReference(roundListRoundToAttach.getClass(), roundListRoundToAttach.getRoundPK()); + attachedRoundList.add(roundListRoundToAttach); + } + tournament.setRoundList(attachedRoundList); em.persist(tournament); - for (Round roundListRound : tournament.getRoundList()) + if (format != null) { - Tournament oldTournamentOfRoundListRound = roundListRound.getTournament(); - roundListRound.setTournament(tournament); - roundListRound = em.merge(roundListRound); - if (oldTournamentOfRoundListRound != null) - { - oldTournamentOfRoundListRound.getRoundList().remove(roundListRound); - oldTournamentOfRoundListRound = em.merge(oldTournamentOfRoundListRound); - } + format.getTournamentList().add(tournament); + format = em.merge(format); + } + if (tournamentFormat != null) + { + tournamentFormat.getTournamentList().add(tournament); + tournamentFormat = em.merge(tournamentFormat); } for (TournamentHasTeam tournamentHasTeamListTournamentHasTeam : tournament.getTournamentHasTeamList()) { @@ -79,8 +98,27 @@ public void create(Tournament tournament) oldTournamentOfTournamentHasTeamListTournamentHasTeam = em.merge(oldTournamentOfTournamentHasTeamListTournamentHasTeam); } } + for (Round roundListRound : tournament.getRoundList()) + { + Tournament oldTournamentOfRoundListRound = roundListRound.getTournament(); + roundListRound.setTournament(tournament); + roundListRound = em.merge(roundListRound); + if (oldTournamentOfRoundListRound != null) + { + oldTournamentOfRoundListRound.getRoundList().remove(roundListRound); + oldTournamentOfRoundListRound = em.merge(oldTournamentOfRoundListRound); + } + } em.getTransaction().commit(); } + catch (Exception ex) + { + if (findTournament(tournament.getTournamentPK()) != null) + { + throw new PreexistingEntityException("Tournament " + tournament + " already exists.", ex); + } + throw ex; + } finally { if (em != null) @@ -92,51 +130,58 @@ public void create(Tournament tournament) public void edit(Tournament tournament) throws IllegalOrphanException, NonexistentEntityException, Exception { + tournament.getTournamentPK().setTournamentFormatId(tournament.getTournamentFormat().getId()); EntityManager em = null; try { em = getEntityManager(); em.getTransaction().begin(); - Tournament persistentTournament = em.find(Tournament.class, tournament.getId()); - List roundListOld = persistentTournament.getRoundList(); - List roundListNew = tournament.getRoundList(); + Tournament persistentTournament = em.find(Tournament.class, tournament.getTournamentPK()); + Format formatOld = persistentTournament.getFormat(); + Format formatNew = tournament.getFormat(); + TournamentFormat tournamentFormatOld = persistentTournament.getTournamentFormat(); + TournamentFormat tournamentFormatNew = tournament.getTournamentFormat(); List tournamentHasTeamListOld = persistentTournament.getTournamentHasTeamList(); List tournamentHasTeamListNew = tournament.getTournamentHasTeamList(); + List roundListOld = persistentTournament.getRoundList(); + List roundListNew = tournament.getRoundList(); List illegalOrphanMessages = null; - for (Round roundListOldRound : roundListOld) + for (TournamentHasTeam tournamentHasTeamListOldTournamentHasTeam : tournamentHasTeamListOld) { - if (!roundListNew.contains(roundListOldRound)) + if (!tournamentHasTeamListNew.contains(tournamentHasTeamListOldTournamentHasTeam)) { if (illegalOrphanMessages == null) { illegalOrphanMessages = new ArrayList<>(); } - illegalOrphanMessages.add("You must retain Round " + roundListOldRound + " since its tournament field is not nullable."); + illegalOrphanMessages.add("You must retain TournamentHasTeam " + tournamentHasTeamListOldTournamentHasTeam + " since its tournament field is not nullable."); } } - for (TournamentHasTeam tournamentHasTeamListOldTournamentHasTeam : tournamentHasTeamListOld) + for (Round roundListOldRound : roundListOld) { - if (!tournamentHasTeamListNew.contains(tournamentHasTeamListOldTournamentHasTeam)) + if (!roundListNew.contains(roundListOldRound)) { if (illegalOrphanMessages == null) { illegalOrphanMessages = new ArrayList<>(); } - illegalOrphanMessages.add("You must retain TournamentHasTeam " + tournamentHasTeamListOldTournamentHasTeam + " since its tournament field is not nullable."); + illegalOrphanMessages.add("You must retain Round " + roundListOldRound + " since its tournament field is not nullable."); } } if (illegalOrphanMessages != null) { throw new IllegalOrphanException(illegalOrphanMessages); } - List attachedRoundListNew = new ArrayList<>(); - for (Round roundListNewRoundToAttach : roundListNew) + if (formatNew != null) { - roundListNewRoundToAttach = em.getReference(roundListNewRoundToAttach.getClass(), roundListNewRoundToAttach.getRoundPK()); - attachedRoundListNew.add(roundListNewRoundToAttach); + formatNew = em.getReference(formatNew.getClass(), formatNew.getFormatPK()); + tournament.setFormat(formatNew); + } + if (tournamentFormatNew != null) + { + tournamentFormatNew = em.getReference(tournamentFormatNew.getClass(), tournamentFormatNew.getId()); + tournament.setTournamentFormat(tournamentFormatNew); } - roundListNew = attachedRoundListNew; - tournament.setRoundList(roundListNew); List attachedTournamentHasTeamListNew = new ArrayList<>(); for (TournamentHasTeam tournamentHasTeamListNewTournamentHasTeamToAttach : tournamentHasTeamListNew) { @@ -145,20 +190,34 @@ public void edit(Tournament tournament) throws IllegalOrphanException, Nonexiste } tournamentHasTeamListNew = attachedTournamentHasTeamListNew; tournament.setTournamentHasTeamList(tournamentHasTeamListNew); + List attachedRoundListNew = new ArrayList<>(); + for (Round roundListNewRoundToAttach : roundListNew) + { + roundListNewRoundToAttach = em.getReference(roundListNewRoundToAttach.getClass(), roundListNewRoundToAttach.getRoundPK()); + attachedRoundListNew.add(roundListNewRoundToAttach); + } + roundListNew = attachedRoundListNew; + tournament.setRoundList(roundListNew); tournament = em.merge(tournament); - for (Round roundListNewRound : roundListNew) + if (formatOld != null && !formatOld.equals(formatNew)) { - if (!roundListOld.contains(roundListNewRound)) - { - Tournament oldTournamentOfRoundListNewRound = roundListNewRound.getTournament(); - roundListNewRound.setTournament(tournament); - roundListNewRound = em.merge(roundListNewRound); - if (oldTournamentOfRoundListNewRound != null && !oldTournamentOfRoundListNewRound.equals(tournament)) - { - oldTournamentOfRoundListNewRound.getRoundList().remove(roundListNewRound); - oldTournamentOfRoundListNewRound = em.merge(oldTournamentOfRoundListNewRound); - } - } + formatOld.getTournamentList().remove(tournament); + formatOld = em.merge(formatOld); + } + if (formatNew != null && !formatNew.equals(formatOld)) + { + formatNew.getTournamentList().add(tournament); + formatNew = em.merge(formatNew); + } + if (tournamentFormatOld != null && !tournamentFormatOld.equals(tournamentFormatNew)) + { + tournamentFormatOld.getTournamentList().remove(tournament); + tournamentFormatOld = em.merge(tournamentFormatOld); + } + if (tournamentFormatNew != null && !tournamentFormatNew.equals(tournamentFormatOld)) + { + tournamentFormatNew.getTournamentList().add(tournament); + tournamentFormatNew = em.merge(tournamentFormatNew); } for (TournamentHasTeam tournamentHasTeamListNewTournamentHasTeam : tournamentHasTeamListNew) { @@ -174,6 +233,20 @@ public void edit(Tournament tournament) throws IllegalOrphanException, Nonexiste } } } + for (Round roundListNewRound : roundListNew) + { + if (!roundListOld.contains(roundListNewRound)) + { + Tournament oldTournamentOfRoundListNewRound = roundListNewRound.getTournament(); + roundListNewRound.setTournament(tournament); + roundListNewRound = em.merge(roundListNewRound); + if (oldTournamentOfRoundListNewRound != null && !oldTournamentOfRoundListNewRound.equals(tournament)) + { + oldTournamentOfRoundListNewRound.getRoundList().remove(roundListNewRound); + oldTournamentOfRoundListNewRound = em.merge(oldTournamentOfRoundListNewRound); + } + } + } em.getTransaction().commit(); } catch (Exception ex) @@ -181,7 +254,7 @@ public void edit(Tournament tournament) throws IllegalOrphanException, Nonexiste String msg = ex.getLocalizedMessage(); if (msg == null || msg.length() == 0) { - Integer id = tournament.getId(); + TournamentPK id = tournament.getTournamentPK(); if (findTournament(id) == null) { throw new NonexistentEntityException("The tournament with id " + id + " no longer exists."); @@ -198,7 +271,7 @@ public void edit(Tournament tournament) throws IllegalOrphanException, Nonexiste } } - public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException + public void destroy(TournamentPK id) throws IllegalOrphanException, NonexistentEntityException { EntityManager em = null; try @@ -209,35 +282,47 @@ public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntity try { tournament = em.getReference(Tournament.class, id); - tournament.getId(); + tournament.getTournamentPK(); } catch (EntityNotFoundException enfe) { throw new NonexistentEntityException("The tournament with id " + id + " no longer exists.", enfe); } List illegalOrphanMessages = null; - List roundListOrphanCheck = tournament.getRoundList(); - for (Round roundListOrphanCheckRound : roundListOrphanCheck) + List tournamentHasTeamListOrphanCheck = tournament.getTournamentHasTeamList(); + for (TournamentHasTeam tournamentHasTeamListOrphanCheckTournamentHasTeam : tournamentHasTeamListOrphanCheck) { if (illegalOrphanMessages == null) { illegalOrphanMessages = new ArrayList<>(); } - illegalOrphanMessages.add("This Tournament (" + tournament + ") cannot be destroyed since the Round " + roundListOrphanCheckRound + " in its roundList field has a non-nullable tournament field."); + illegalOrphanMessages.add("This Tournament (" + tournament + ") cannot be destroyed since the TournamentHasTeam " + tournamentHasTeamListOrphanCheckTournamentHasTeam + " in its tournamentHasTeamList field has a non-nullable tournament field."); } - List tournamentHasTeamListOrphanCheck = tournament.getTournamentHasTeamList(); - for (TournamentHasTeam tournamentHasTeamListOrphanCheckTournamentHasTeam : tournamentHasTeamListOrphanCheck) + List roundListOrphanCheck = tournament.getRoundList(); + for (Round roundListOrphanCheckRound : roundListOrphanCheck) { if (illegalOrphanMessages == null) { illegalOrphanMessages = new ArrayList<>(); } - illegalOrphanMessages.add("This Tournament (" + tournament + ") cannot be destroyed since the TournamentHasTeam " + tournamentHasTeamListOrphanCheckTournamentHasTeam + " in its tournamentHasTeamList field has a non-nullable tournament field."); + illegalOrphanMessages.add("This Tournament (" + tournament + ") cannot be destroyed since the Round " + roundListOrphanCheckRound + " in its roundList field has a non-nullable tournament field."); } if (illegalOrphanMessages != null) { throw new IllegalOrphanException(illegalOrphanMessages); } + Format format = tournament.getFormat(); + if (format != null) + { + format.getTournamentList().remove(tournament); + format = em.merge(format); + } + TournamentFormat tournamentFormat = tournament.getTournamentFormat(); + if (tournamentFormat != null) + { + tournamentFormat.getTournamentList().remove(tournament); + tournamentFormat = em.merge(tournamentFormat); + } em.remove(tournament); em.getTransaction().commit(); } @@ -281,7 +366,7 @@ private List findTournamentEntities(boolean all, int maxResults, int } } - public Tournament findTournament(Integer id) + public Tournament findTournament(TournamentPK id) { EntityManager em = getEntityManager(); try @@ -310,5 +395,5 @@ public int getTournamentCount() em.close(); } } - + } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManager.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManager.java index 1f677b7..074763c 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManager.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManager.java @@ -5,6 +5,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -33,8 +35,10 @@ import com.github.javydreamercsw.database.storage.db.Player; import com.github.javydreamercsw.database.storage.db.Team; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentFormat; import com.github.javydreamercsw.tournament.manager.api.GameFormat; import com.github.javydreamercsw.tournament.manager.api.IGame; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; import com.github.javydreamercsw.tournament.manager.api.storage.StorageException; import com.googlecode.flyway.core.Flyway; import com.googlecode.flyway.core.api.MigrationInfo; @@ -59,15 +63,10 @@ public class DataBaseManager private static final Logger LOG = Logger.getLogger(DataBaseManager.class.getSimpleName()); private static boolean dbError = false; - private static DBState state; + private static DBState state = DBState.START_UP; public static final String JNDI_DATASOURCE_NAME = "java:comp/env/jdbc/TMDB"; - public DataBaseManager() - { - state = DBState.START_UP; - } - public static EntityManagerFactory getEntityManagerFactory() { if (emf == null) @@ -371,18 +370,6 @@ public static List namedQuery(String query) return namedQuery(query, null, false); } - /** - * Named query that will modify the database - * - * @param query query to execute - * @param parameters query parameters - */ - public static void namedUpdateQuery(String query, - Map parameters) - { - namedQuery(query, parameters, true); - } - /** * Named query (not for updates) * @@ -425,8 +412,17 @@ private static List namedQuery(String query, public static void close() { - getEntityManager().close(); - getEntityManagerFactory().close(); + if (em != null) + { + em.close(); + } + if (emf != null) + { + emf.close(); + } + //Set it to null so it's recreated with new Persistence Unit next time is requested. + emf = null; + em = null; } public static EntityTransaction getTransaction() @@ -434,16 +430,6 @@ public static EntityTransaction getTransaction() return getEntityManager().getTransaction(); } - /** - * Named query that will modify the database - * - * @param query query to execute - */ - public static void namedUpdateQuery(String query) - { - namedQuery(query, null, true); - } - public static List nativeQuery(String query) { EntityTransaction transaction = getEntityManager().getTransaction(); @@ -473,6 +459,8 @@ public static void nativeUpdateQuery(String query) @SuppressWarnings("empty-statement") public static void loadDemoData() throws Exception { + Random r = new Random(); + // Add players for (int i = 0; i < 10; i++) { @@ -486,18 +474,9 @@ public static void loadDemoData() throws Exception } } - // Add a tournaments - for (int i = 0; i < 10; i++) - { - Tournament t = new Tournament("Tournament " + (i + 1)); - t.setWinPoints(3); - t.setLossPoints(0); - t.setDrawPoints(1); - TournamentService.getInstance().saveTournament(t); - } - IGame gameAPI = Lookup.getDefault().lookup(IGame.class); - Optional fg = GameService.getInstance().findGameByName(gameAPI.getName()); + Optional fg + = GameService.getInstance().findGameByName(gameAPI.getName()); Game game; if (fg.isPresent()) { @@ -526,9 +505,37 @@ public static void loadDemoData() throws Exception FormatService.getInstance().saveFormat(newFormat); } } + + // Add a tournaments + List formats = new ArrayList<>(); + formats.addAll(Lookup.getDefault().lookupAll(TournamentInterface.class)); + + for (TournamentInterface format : formats) + { + TournamentFormat tf = new TournamentFormat(format.getName(), + format.getClass().getCanonicalName()); + TournamentService.getInstance().saveTournamentFormat(tf); + } + + for (int i = 0; i < 10; i++) + { + // Set a random start date: + int startDay = r.nextInt(31); + Tournament t = new Tournament("Tournament " + (i + 1)); + t.setWinPoints(3); + t.setLossPoints(0); + t.setDrawPoints(1); + t.setStartDate(LocalDateTime.now().minusDays(startDay)); + + t.setFormat(FormatService.getInstance().getAll().get(0)); + t.setTournamentFormat(TournamentService.getInstance() + .findFormat(formats.get(r.nextInt(formats.size())).getName())); + TournamentService.getInstance().saveTournament(t); + } + List formatList = FormatService.getInstance() .findFormatByGame(gameAPI.getName()); - Random r = new Random(); + // Add matches for (int i = 0; i < 10; i++) { @@ -545,26 +552,75 @@ public static void loadDemoData() throws Exception //Add a result boolean win = r.nextBoolean(); + boolean ranked = r.nextBoolean(); MatchService.getInstance().setResult(match.getMatchHasTeamList().get(0), MatchService.getInstance().getResultType(win ? "result.win" : "result.loss").get()); MatchService.getInstance().setResult(match.getMatchHasTeamList().get(1), MatchService.getInstance().getResultType(win ? "result.loss" : "result.win").get()); + MatchService.getInstance().setRanked(match, ranked); + + // Lock the results so records are updated. + MatchService.getInstance().lockMatchResult(match); + + // Update rankings + MatchService.getInstance().updateRankings(match); + } + } - //Lock the results so records are updated. - match.getMatchHasTeamList().forEach(mht - -> + /** + * Load stuff from the Lookup. + * + * @throws java.lang.Exception + */ + public static void load() throws Exception + { + for (TournamentInterface format : Lookup.getDefault() + .lookupAll(TournamentInterface.class)) + { + // Register the tournament formats + if (TournamentService.getInstance().findFormat(format.getName()) == null) { - try - { - MatchService.getInstance().lockMatchResult(mht.getMatchResult()); - } - catch (Exception ex) + TournamentFormat tf = new TournamentFormat(format.getName(), + format.getClass().getCanonicalName()); + TournamentService.getInstance().addFormat(tf); + } + } + for (IGame gameAPI : Lookup.getDefault().lookupAll(IGame.class)) + { + // Add game to DB if not there + Optional result + = GameService.getInstance().findGameByName(gameAPI.getName()); + + Game game; + if (result.isPresent()) + { + game = result.get(); + } + else + { + game = new Game(gameAPI.getName()); + GameService.getInstance().saveGame(game); + } + + //Load formats + for (GameFormat format : gameAPI.gameFormats()) + { + // Check if it exists in the databse + Optional f + = FormatService.getInstance() + .findFormatForGame(gameAPI.getName(), format.getName()); + if (!f.isPresent()) { - Exceptions.printStackTrace(ex); + // Let's create it. + Format newFormat = new Format(); + newFormat.setName(format.getName()); + newFormat.setDescription(format.getDescription()); + newFormat.setGame(game); + FormatService.getInstance().saveFormat(newFormat); } - }); + } } } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/FormatService.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/FormatService.java index 052662b..a6de069 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/FormatService.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/FormatService.java @@ -197,7 +197,11 @@ public void deleteFormat(Format format) { fc.destroy(format.getFormatPK()); } - catch (NonexistentEntityException | IllegalOrphanException ex) + catch (IllegalOrphanException ex) + { + Exceptions.printStackTrace(ex); + } + catch (NonexistentEntityException ex) { Exceptions.printStackTrace(ex); } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/GameService.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/GameService.java index 062c075..b5b53ba 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/GameService.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/GameService.java @@ -1,6 +1,5 @@ package com.github.javydreamercsw.database.storage.db.server; -import java.util.HashMap; import java.util.List; import java.util.Optional; @@ -58,9 +57,6 @@ public static GameService getInstance() public Optional findGameByName(String name) { - HashMap parameters = new HashMap<>(); - parameters.put("name", name); - Game game = null; for (Game g : gc.findGameEntities()) { @@ -97,13 +93,13 @@ public void saveGame(Game game) Exceptions.printStackTrace(ex); } } - + @Override public List getAll() { return gc.findGameEntities(); } - + public void deleteGame(Game game) { try diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/LocalDateTimeAttributeConverter.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/LocalDateTimeAttributeConverter.java new file mode 100644 index 0000000..e34bdfb --- /dev/null +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/LocalDateTimeAttributeConverter.java @@ -0,0 +1,22 @@ +package com.github.javydreamercsw.database.storage.db.server; + +import java.sql.Timestamp; +import java.time.LocalDateTime; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter(autoApply = true) +public class LocalDateTimeAttributeConverter + implements AttributeConverter { + + @Override + public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) { + return (locDateTime == null ? null : Timestamp.valueOf(locDateTime)); + } + + @Override + public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) { + return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime()); + } +} diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/MatchService.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/MatchService.java index fabd228..6e37224 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/MatchService.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/MatchService.java @@ -1,11 +1,15 @@ package com.github.javydreamercsw.database.storage.db.server; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import org.openide.util.Exceptions; +import org.openide.util.Lookup; import com.github.javydreamercsw.database.storage.db.MatchEntry; import com.github.javydreamercsw.database.storage.db.MatchEntryPK; @@ -13,14 +17,26 @@ import com.github.javydreamercsw.database.storage.db.MatchHasTeamPK; import com.github.javydreamercsw.database.storage.db.MatchResult; import com.github.javydreamercsw.database.storage.db.MatchResultType; +import com.github.javydreamercsw.database.storage.db.Player; import com.github.javydreamercsw.database.storage.db.Record; import com.github.javydreamercsw.database.storage.db.Team; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecordPK; import com.github.javydreamercsw.database.storage.db.controller.MatchEntryJpaController; import com.github.javydreamercsw.database.storage.db.controller.MatchHasTeamJpaController; import com.github.javydreamercsw.database.storage.db.controller.MatchResultJpaController; import com.github.javydreamercsw.database.storage.db.controller.MatchResultTypeJpaController; +import com.github.javydreamercsw.database.storage.db.controller.TeamHasFormatRecordJpaController; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.tournament.manager.UIPlayer; +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentException; +import com.github.javydreamercsw.tournament.manager.api.standing.RankingProvider; +import com.github.javydreamercsw.trueskill.TrueSkillRankingProvider; + +import de.gesundkrank.jskills.IPlayer; +import de.gesundkrank.jskills.Rating; public class MatchService extends Service { @@ -32,6 +48,10 @@ public class MatchService extends Service = new MatchResultJpaController(DataBaseManager.getEntityManagerFactory()); private MatchResultTypeJpaController mrtc = new MatchResultTypeJpaController(DataBaseManager.getEntityManagerFactory()); + private final RankingProvider rp + = Lookup.getDefault().lookup(RankingProvider.class); + private final TeamHasFormatRecordJpaController thfrc + = new TeamHasFormatRecordJpaController(DataBaseManager.getEntityManagerFactory()); /** * Helper class to initialize the singleton Service in a thread-safe way and @@ -181,7 +201,7 @@ public boolean addTeam(MatchEntry match, Team team) throws Exception boolean found = false; for (Record r : player.getRecordList()) { - if (Objects.equals(r.getGame().getId(), + if (Objects.equals(r.getGame().getId(), match.getFormat().getGame().getId())) { found = true; @@ -293,6 +313,35 @@ public void setResult(MatchHasTeam mht, MatchResultType mrt) mht.setMatchResult(mr); } + /** + * Lock the match result.This is meant not to be undone as it calculates + * experience and update records which is dependent on when it happens. + * + * @param me Match Result to lock. + * @throws TournamentException + */ + public void lockMatchResult(MatchEntry me) throws TournamentException + { + for (MatchHasTeam mht : findMatch(me.getMatchEntryPK()).getMatchHasTeamList()) + { + if (mht != null) + { + try + { + lockMatchResult(mht.getMatchResult()); + } + catch (Exception ex) + { + throw new TournamentException(ex); + } + } + else + { + throw new TournamentException("Missing result!"); + } + } + } + /** * Lock the match result.This is meant not to be undone as it calculates * experience and update records which is dependent on when it happens. @@ -313,6 +362,10 @@ public void lockMatchResult(MatchResult mr) throws Exception switch (mr.getMatchResultType().getType()) { case "result.loss": + //Fall thru + case "result.forfeit": + //Fall thru + case "result.no_show": record.setLoses(record.getLoses() + 1); break; case "result.draw": @@ -320,10 +373,6 @@ public void lockMatchResult(MatchResult mr) throws Exception break; //Various reasons leading to a win. case "result.win": - //Fall thru - case "result.forfeit": - //Fall thru - case "result.no_show": record.setWins(record.getWins() + 1); break; } @@ -342,7 +391,7 @@ public void lockMatchResult(MatchResult mr) throws Exception /** * Update a match result. - * + * * @param mr Match result to update. * @throws Exception If result doesn't exist. */ @@ -357,4 +406,324 @@ public void updateResult(MatchResult mr) throws Exception throw new Exception("Trying to update non existing result!"); } } + + /** + * Set match results ranked or unranked. + * + * @param match Match to update. + * @param ranked true for ranked, false for unranked. + * @throws TournamentException if results are already locked. + * @throws Exception If there's an error updating the result. + */ + public void setRanked(MatchEntry match, boolean ranked) + throws TournamentException, Exception + { + for (MatchHasTeam mht : match.getMatchHasTeamList()) + { + if (!mht.getMatchResult().getLocked()) + { + mht.getMatchResult().setRanked(ranked); + MatchService.getInstance().updateResult(mht.getMatchResult()); + } + else + { + throw new TournamentException("Rsults already locked!"); + } + } + } + + /** + * Update rankings for the match. This assumes that all losers were eliminated + * at the same time. + * + * @param me Match entry to check. + * @throws TournamentException + */ + public void updateRankings(final MatchEntry me) throws TournamentException + { + updateRankings(me, new HashMap<>()); + } + + /** + * Update rankings for the match. This allows to give extra credits for losing + * teams that lasted longer in the match. Use 1 for the key of the winner, 2 + * for the runner up and so on. Value implemented as a list to handle ties on + * each place. + * + * @param me Match entry to check. + * @param order Map indicating the place as key and a list of team id's as + * value. + * @throws TournamentException + */ + public void updateRankings(final MatchEntry me, + Map> order) throws TournamentException + { + TrueSkillRankingProvider p = (TrueSkillRankingProvider) rp; + // First make sure that everyone has a result + MatchEntry match = findMatch(me.getMatchEntryPK()); + for (MatchHasTeam mht : match.getMatchHasTeamList()) + { + if (mht.getMatchResult() == null || !mht.getMatchResult().getLocked()) + { + throw new TournamentException("Not all teams have a locked result!"); + } + } + + TeamInterface[] teams = new TeamInterface[match.getMatchHasTeamList().size()]; + int[] resultOrder = new int[match.getMatchHasTeamList().size()]; + //Ok, now check the order if any + if (order.isEmpty()) + { + order.put(1, new ArrayList<>()); + order.put(2, new ArrayList<>()); + // Create an order with the winner as first place and everyone else tied for second. + for (MatchHasTeam mht : match.getMatchHasTeamList()) + { + switch (mht.getMatchResult().getMatchResultType().getType()) + { + case "result.win": + order.get(1).add(mht.getTeam().getId()); + break; + default: + order.get(2).add(mht.getTeam().getId()); + } + } + } + + //Convert into the JSkill interface for calculations + for (MatchHasTeam mht : match.getMatchHasTeamList()) + { + try + { + p.addTeam(TeamService.getInstance().convertToTeam(mht.getTeam(), + me.getFormat())); + } + catch (Exception ex) + { + throw new TournamentException(ex); + } + } + + int count = 0; + for (Entry> entry : order.entrySet()) + { + for (Integer t : entry.getValue()) + { + teams[count] = TeamService.getInstance() + .convertToTeam(TeamService.getInstance().findTeam(t), + me.getFormat()); + resultOrder[count++] = entry.getKey(); + } + } + + /** + * Quality of the match is used to determine how even the match up is. It'll + * be a number between 0% and 100%. + * + * The closest to zero the higher reward for the lower ranked for a win and + * the lower reward for the higher ranked for the win. This number takes + * into account all the skills from all the teams in the match. + */ + double quality = getMatchQuality(teams); + + // Make the calculations + Map ratings + = p.getCalculator().calculateNewRatings(p.getGameInfo(), + de.gesundkrank.jskills.Team.concat(teams), + resultOrder); + + // Now persist to database + for (Entry entry : ratings.entrySet()) + { + Optional temp + = PlayerService.getInstance() + .findPlayerById(((UIPlayer) entry.getKey()).getID()); + if (temp.isPresent()) + { + Player player = temp.get(); + + // This assumes that the first tema is the team only contaiining the player. + Team team = player.getTeamList().get(0); + + int totalPoints = (int) getMatchPointsEarned(team, me, quality); + + // Change modifier based on who beated who + try + { + if (TeamService.getInstance().hasFormatRecord(team, me.getFormat())) + { + //Update it + TeamHasFormatRecord thfr + = TeamService.getInstance().getFormatRecord(team, me.getFormat()); + thfr.setMean(entry.getValue().getMean()); + thfr.setStandardDeviation(entry.getValue().getStandardDeviation()); + thfr.setPoints(thfr.getPoints() + totalPoints); + if (thfr.getPoints() < 0) + { + // Don't go below zero. + thfr.setPoints(0); + } + thfrc.edit(thfr); + } + else + { + TeamHasFormatRecord thfr + = new TeamHasFormatRecord(new TeamHasFormatRecordPK( + team.getId(), + me.getFormat().getFormatPK().getId(), + me.getFormat().getFormatPK().getGameId()), + entry.getValue().getMean(), + entry.getValue().getStandardDeviation()); + thfr.setFormat(me.getFormat()); + thfr.setTeam(team); + //If it'll go below zero ignore it. + thfr.setPoints(totalPoints > 0 ? totalPoints : 0); + thfrc.create(thfr); + team.getTeamHasFormatRecordList().add(thfr); + } + } + catch (Exception ex) + { + throw new TournamentException(ex); + } + TeamService.getInstance().saveTeam(team); + } + } + } + + /** + * Calculate the point modifier based on the match quality. + * + * @param quality Match quality + * @return modifier. + */ + protected double calculateModifier(double quality) + { + double modifier; + if (quality >= 90) + { + modifier = 1.0; + } + else if (quality >= 80) + { + modifier = 1.1; + } + else if (quality >= 70) + { + modifier = 1.2; + } + else if (quality >= 60) + { + modifier = 1.3; + } + else if (quality >= 50) + { + modifier = 1.4; + } + else if (quality >= 40) + { + modifier = 1.5; + } + else if (quality >= 30) + { + modifier = 1.6; + } + else if (quality >= 20) + { + modifier = 1.7; + } + else if (quality >= 10) + { + modifier = 1.8; + } + else + { + modifier = 2.0; + } + return modifier; + } + + /** + * Calculate match points to add/remove based on the result of the match. + * + * @param team Team to calculate points for. + * @param me Match to calculate points for. + * @param quality Match quality + * @return points earned/lost. + */ + protected double getMatchPointsEarned(Team team, MatchEntry me, double quality) + { + double base = 10.0; + + // Find result to adjust base accordingly + for (MatchHasTeam mht : findMatch(me.getMatchEntryPK()).getMatchHasTeamList()) + { + if (Objects.equals(mht.getTeam().getId(), team.getId())) + { + switch (mht.getMatchResult().getMatchResultType().getType()) + { + case "result.loss": + // Fall thru + case "result.forfeit": + // Fall thru + case "result.no_show": + // Points are substracted in a loss. + base *= -1; + break; + case "result.draw": + base = 0.0; + break; + default: + // No modification + break; + } + break; + } + } + + return base * calculateModifier(quality); + } + + /** + * Get math quality. + * + * @param me Match entry. + * @return Quality of the match, in percentage. + * @throws TournamentException if there's an error converting teams. + */ + public double getMatchQuality(MatchEntry me) throws TournamentException + { + TeamInterface[] teams = new TeamInterface[me.getMatchHasTeamList().size()]; + //Convert into the JSkill interface for calculations + + int count = 0; + for (MatchHasTeam mht : me.getMatchHasTeamList()) + { + try + { + teams[count] = TeamService.getInstance().convertToTeam(mht.getTeam(), + me.getFormat()); + count++; + } + catch (Exception ex) + { + throw new TournamentException(ex); + } + } + + return getMatchQuality(teams); + } + + /** + * Get math quality. + * + * @param teams Teams to get quality from. + * @return Quality of the match, in percentage. + */ + public double getMatchQuality(TeamInterface[] teams) + { + return ((TrueSkillRankingProvider) rp).getCalculator().calculateMatchQuality( + ((TrueSkillRankingProvider) rp).getGameInfo(), + de.gesundkrank.jskills.Team.concat(teams)) * 100; + } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/PlayerService.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/PlayerService.java index 639f3bb..54ed4c8 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/PlayerService.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/PlayerService.java @@ -205,9 +205,19 @@ public void savePlayer(Player player) throws Exception } } - @Override + @Override public List getAll() { return pc.findPlayerEntities(); } + + /** + * Convert a player to a UIPlayer. + * @param p Player to transform + * @return transformed player. + */ + public UIPlayer convertToUIPlayer(Player p) + { + return new UIPlayer(p.getName(), p.getId()); + } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TeamService.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TeamService.java index de6e246..54ffc64 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TeamService.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TeamService.java @@ -5,26 +5,33 @@ import org.openide.util.Exceptions; +import com.github.javydreamercsw.database.storage.db.Format; import com.github.javydreamercsw.database.storage.db.MatchHasTeam; import com.github.javydreamercsw.database.storage.db.Player; import com.github.javydreamercsw.database.storage.db.Team; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; import com.github.javydreamercsw.database.storage.db.TournamentHasTeam; import com.github.javydreamercsw.database.storage.db.controller.MatchHasTeamJpaController; +import com.github.javydreamercsw.database.storage.db.controller.TeamHasFormatRecordJpaController; import com.github.javydreamercsw.database.storage.db.controller.TeamJpaController; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import de.gesundkrank.jskills.Rating; + public class TeamService extends Service { private TeamJpaController tc = new TeamJpaController(DataBaseManager.getEntityManagerFactory()); private MatchHasTeamJpaController mhtc = new MatchHasTeamJpaController(DataBaseManager.getEntityManagerFactory()); + private final TeamHasFormatRecordJpaController thfrc + = new TeamHasFormatRecordJpaController(DataBaseManager.getEntityManagerFactory()); private TeamService() { } - + /** * Helper class to initialize the singleton Service in a thread-safe way and * to keep the initialization ordering clear between the two services. See @@ -64,7 +71,7 @@ public List findTeams(String value) if (value.trim().isEmpty()) { - result.addAll(tc.findTeamEntities()); + result.addAll(getAll()); } else { @@ -120,6 +127,10 @@ public void deleteTeam(Team t) { TournamentService.getInstance().deleteTeamFromTournament(tht); } + for (TeamHasFormatRecord thfr : t.getTeamHasFormatRecordList()) + { + thfrc.destroy(thfr.getTeamHasFormatRecordPK()); + } tc.destroy(t.getId()); } catch (IllegalOrphanException | NonexistentEntityException ex) @@ -149,7 +160,7 @@ public void addMembers(Team team, Player... players) { for (Player p : players) { - addMember(team, p, false); + addMember(team, p); } saveTeam(team); } @@ -159,21 +170,80 @@ public void addMembers(Team team, Player... players) * * @param team Team to add players to. * @param player Player to add. - * @param save Save team as part of this transaction. */ - public void addMember(Team team, Player player, boolean save) + public void addMember(Team team, Player player) { team.getPlayerList().add(player); player.getTeamList().add(team); - if (save) - { - saveTeam(team); - } + saveTeam(team); } - + @Override public List getAll() { return tc.findTeamEntities(); } + + /** + * Convert a team form the database representation to the JSKill + * representation. + * + * @param t Team to convert. + * @param format Format to get ratings for. + * @return converted team. + */ + public com.github.javydreamercsw.tournament.manager.Team convertToTeam(Team t, + Format format) + { + com.github.javydreamercsw.tournament.manager.Team team + = new com.github.javydreamercsw.tournament.manager.Team(t.getId(), + new ArrayList<>()); + t.getPlayerList().forEach(player -> + { + Rating r; + if (hasFormatRecord(t, format)) + { + TeamHasFormatRecord thfr = getFormatRecord(t, format); + r = new Rating(thfr.getMean(), thfr.getStandardDeviation()); + } + else + { + r = new Rating(0.0, 0.0); + } + team.addPlayer(PlayerService.getInstance().convertToUIPlayer(player), r); + }); + return team; + } + + /** + * Check if this team has a record entry in the database for this format. + * + * @param team Team to check. + * @param format Format to check + * @return true if exists, false otherwise. + */ + public boolean hasFormatRecord(Team team, Format format) + { + return getFormatRecord(team, format) != null; + } + + /** + * Get the teams record for the specified format. + * + * @param team Team to check. + * @param format Format to check. + * @return Record or null if not found. + */ + public TeamHasFormatRecord getFormatRecord(Team team, Format format) + { + for (TeamHasFormatRecord thfr + : findTeam(team.getId()).getTeamHasFormatRecordList()) + { + if (thfr.getFormat().getFormatPK().equals(format.getFormatPK())) + { + return thfr; + } + } + return null; + } } diff --git a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TournamentService.java b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TournamentService.java index e8a53c4..2f89f59 100644 --- a/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TournamentService.java +++ b/Database-Storage/src/main/java/com/github/javydreamercsw/database/storage/db/server/TournamentService.java @@ -1,19 +1,39 @@ package com.github.javydreamercsw.database.storage.db.server; +import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import com.github.javydreamercsw.database.storage.db.MatchEntry; +import com.github.javydreamercsw.database.storage.db.MatchHasTeam; +import com.github.javydreamercsw.database.storage.db.MatchResultType; +import com.github.javydreamercsw.database.storage.db.Player; import com.github.javydreamercsw.database.storage.db.Round; +import com.github.javydreamercsw.database.storage.db.RoundPK; import com.github.javydreamercsw.database.storage.db.Team; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentFormat; import com.github.javydreamercsw.database.storage.db.TournamentHasTeam; +import com.github.javydreamercsw.database.storage.db.TournamentPK; import com.github.javydreamercsw.database.storage.db.controller.RoundJpaController; +import com.github.javydreamercsw.database.storage.db.controller.TournamentFormatJpaController; import com.github.javydreamercsw.database.storage.db.controller.TournamentHasTeamJpaController; import com.github.javydreamercsw.database.storage.db.controller.TournamentJpaController; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.tournament.manager.UIPlayer; +import com.github.javydreamercsw.tournament.manager.api.Encounter; +import com.github.javydreamercsw.tournament.manager.api.EncounterResult; +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentException; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentListener; +import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; public class TournamentService extends Service { @@ -23,6 +43,9 @@ public class TournamentService extends Service = new TournamentHasTeamJpaController(DataBaseManager.getEntityManagerFactory()); private RoundJpaController rc = new RoundJpaController(DataBaseManager.getEntityManagerFactory()); + private TournamentFormatJpaController tfc + = new TournamentFormatJpaController(DataBaseManager.getEntityManagerFactory()); + private Map tournamentMap = new HashMap<>(); private TournamentService() { @@ -67,7 +90,7 @@ public List findTournaments(String value) List result = new ArrayList<>(); tc.findTournamentEntities().forEach(tournament -> { - if (tournament.getName().toLowerCase().contains(value)) + if (tournament.getName().toLowerCase().contains(value.toLowerCase())) { result.add(tournament); } @@ -75,22 +98,12 @@ public List findTournaments(String value) return result; } - public void saveTournament(Tournament t) + public void saveTournament(Tournament t) throws NonexistentEntityException, + IllegalOrphanException, Exception { - if (t.getId() != null && tc.findTournament(t.getId()) != null) + if (t.getTournamentPK() != null && tc.findTournament(t.getTournamentPK()) != null) { - try - { - tc.edit(t); - } - catch (NonexistentEntityException ex) - { - Exceptions.printStackTrace(ex); - } - catch (Exception ex) - { - Exceptions.printStackTrace(ex); - } + tc.edit(t); } else { @@ -98,27 +111,24 @@ public void saveTournament(Tournament t) } } - public void deleteTournament(Tournament t) + public void deleteTournament(Tournament t) throws IllegalOrphanException, + NonexistentEntityException { - try + for (Round round : t.getRoundList()) { - tc.destroy(t.getId()); + deleteRound(round); } - catch (IllegalOrphanException | NonexistentEntityException ex) + + for (TournamentHasTeam tht : t.getTournamentHasTeamList()) { - Exceptions.printStackTrace(ex); + deleteTeamFromTournament(tht); } + tc.destroy(t.getTournamentPK()); } - public List findTournament(Integer id) + public Tournament findTournament(TournamentPK id) { - List results = new ArrayList<>(); - Tournament t = tc.findTournament(id); - if (t != null) - { - results.add(t); - } - return results; + return tc.findTournament(id); } /** @@ -144,9 +154,8 @@ public void addTeams(Tournament t, Team... teams) throws Exception { for (Team team : teams) { - addTeam(t, team, false); + addTeam(t, team); } - saveTournament(t); } /** @@ -154,32 +163,18 @@ public void addTeams(Tournament t, Team... teams) throws Exception * * @param t Tournament * @param team Team to add + * @throws IllegalOrphanException if an orphan is left * @throws Exception if there's an error adding team. */ - public void addTeam(Tournament t, Team team) throws Exception - { - addTeam(t, team, true); - } - - /** - * Add team to the tournament. - * - * @param t Tournament - * @param team Team to add - * @param save Save the tournament as part of this transaction. - * @throws Exception if there's an error adding team. - */ - public void addTeam(Tournament t, Team team, boolean save) throws Exception + public void addTeam(Tournament t, Team team) throws IllegalOrphanException, + Exception { TournamentHasTeam tht = new TournamentHasTeam(); tht.setTeam(team); tht.setTournament(t); - t.getTournamentHasTeamList().add(tht); thtc.create(tht); - if (save) - { - saveTournament(t); - } + t.getTournamentHasTeamList().add(tht); + saveTournament(t); } /** @@ -204,6 +199,7 @@ public void addRound(Tournament t, boolean save) throws Exception { Round round = new Round(); round.setTournament(t); + round.setRoundNumber(t.getRoundList().size() + 1); rc.create(round); t.getRoundList().add(round); if (save) @@ -229,4 +225,391 @@ public List getAll() { return tc.findTournamentEntities(); } + + /** + * Delete round. + * + * @param round + * @throws IllegalOrphanException + * @throws NonexistentEntityException + */ + public void deleteRound(Round round) throws IllegalOrphanException, + NonexistentEntityException + { + for (MatchEntry me : round.getMatchEntryList()) + { + MatchService.getInstance().deleteMatch(me); + } + rc.destroy(round.getRoundPK()); + } + + /** + * Find a tournament format. + * + * @param name format name + * @return Format or null if not found. + */ + public TournamentFormat findFormat(String name) + { + for (TournamentFormat tf : tfc.findTournamentFormatEntities()) + { + if (tf.getFormatName().equals(name)) + { + return tf; + } + } + return null; + } + + /** + * Add a tournament format + * + * @param tf Format to add + * @throws Exception if something goes wrong creating it. + */ + public void addFormat(TournamentFormat tf) throws Exception + { + tfc.create(tf); + } + + public List getFormats() + { + return tfc.findTournamentFormatEntities(); + } + + /** + * Start the tournament.This will set up the first round. + * + * @param tournament Tournament to start. + * @param listeners Tournament listeners + * @throws TournamentException If something goes wrong. + */ + public void startTournament(Tournament tournament, + TournamentListener... listeners) throws TournamentException + { + try + { + // Check it has not been started already. + if (hasStarted(tournament)) + { + throw new TournamentException("Tournament has already been started!"); + } + // Check it's not over already. + if (isOver(tournament)) + { + throw new TournamentException("Tournament is already over!"); + } + + // First get the Tournament Format + Class format + = (Class) Class.forName(tournament + .getTournamentFormat().getImplementationClass()); + + //Convert the DB teams to the JSkill implementation + List teams = new ArrayList<>(); + tournament.getTournamentHasTeamList().forEach(tht -> + { + List players = new ArrayList<>(); + tht.getTeam().getPlayerList().forEach(player -> + { + players.add(new UIPlayer(player.getName(), player.getId())); + }); + teams.add(new com.github.javydreamercsw.tournament.manager.Team( + tht.getTeam().getId(), + tht.getTeam().getName(), players)); + }); + TournamentInterface tf + = Lookup.getDefault().lookup(format) + .createTournament(teams, + tournament.getWinPoints(), + tournament.getLossPoints(), + tournament.getDrawPoints()); + tournamentMap.put(tournament.getTournamentPK(), tf); + + // Add listeners + for (TournamentListener listner : listeners) + { + addTournamentListener(tournament, listner); + } + + // Create first round. + startNextRound(tournament); + } + catch (ClassNotFoundException | TournamentException ex) + { + Exceptions.printStackTrace(ex); + throw new TournamentException("Unable to create tournament!", ex); + } + } + + /** + * Start next round. + * + * @param tournament tournament to start the next round of. + * @throws TournamentException if tournament has not been started or is + * already over. + */ + public void startNextRound(Tournament tournament) throws TournamentException + { + if (isOver(tournament)) + { + throw new TournamentException("Tournament is already over!"); + } + + try + { + if (tournament.getRoundList().isEmpty()) + { + // Mark as started. + tournament.setStartDate(LocalDateTime.now()); + saveTournament(tournament); + } + + // Get the tournament implementation to build the next round. + TournamentInterface ti = tournamentMap.get(tournament.getTournamentPK()); + + ti.nextRound(); + Map pairings = ti.getPairings(); + if (pairings != null && !pairings.isEmpty()) + { + try + { + // Create a round + TournamentService.getInstance().addRound(tournament); + + Round currentRound + = tournament.getRoundList().get(tournament.getRoundList().size() - 1); + // Persist the round in the database. + for (Encounter encounter : pairings.values()) + { + MatchEntry me = new MatchEntry(); + me.setRound(currentRound); + me.setFormat(tournament.getFormat()); + MatchService.getInstance().saveMatch(me); + for (TeamInterface team : encounter.getEncounterSummary().keySet()) + { + MatchService.getInstance().addTeam(me, + TeamService.getInstance().findTeam(team.getTeamId())); + } + currentRound.getMatchEntryList().add(me); + } + } + catch (Exception ex) + { + Exceptions.printStackTrace(ex); + throw new TournamentException("Error creating round!", ex); + } + ti.getListeners().forEach(listener -> listener + .roundStart(tournament.getRoundList().size())); + } + else + { + // Tournament is over! + // Mark as ended. + tournament.setEndDate(LocalDateTime.now()); + saveTournament(tournament); + } + } + catch (IllegalOrphanException ex) + { + Exceptions.printStackTrace(ex); + } + catch (Exception ex) + { + Exceptions.printStackTrace(ex); + } + } + + /** + * Checks if tournament already has started. + * + * @param tournament Tournament to check + * @return true if started, false otherwise. + */ + public boolean hasStarted(Tournament tournament) + { + return findTournament(tournament.getTournamentPK()).getStartDate() != null; + } + + /** + * Checks if tournament already finished. + * + * @param tournament Tournament to check + * @return true if is over, false otherwise. + */ + public boolean isOver(Tournament tournament) + { + return findTournament(tournament.getTournamentPK()).getEndDate() != null; + } + + /** + * get a round by id. + * + * @param roundPK ID. + * @return Round with the given ID or null if not found. + */ + public Round getRound(RoundPK roundPK) + { + return rc.findRound(roundPK); + } + + /** + * Add a round time listener. + * + * @param tournament Tournament to add listener to. + * @param listener Listener to add. + * @throws TournamentException if tournament is not found. + */ + public void addTournamentListener(Tournament tournament, + TournamentListener listener) throws TournamentException + { + if (tournamentMap.containsKey(tournament.getTournamentPK())) + { + tournamentMap.get(tournament.getTournamentPK()) + .addTournamentListener(listener); + } + else + { + throw new TournamentException("Tournament not found!"); + } + } + + /** + * Remove a round time listener. + * + * @param tournament Tournament to remove listener from. + * @param listener Listener to remove. + * @throws TournamentException if tournament is not found. + */ + public void removeRoundListener(Tournament tournament, + TournamentListener listener) throws TournamentException + { + if (tournamentMap.containsKey(tournament.getTournamentPK())) + { + tournamentMap.get(tournament.getTournamentPK()) + .removeTournamentListener(listener); + } + else + { + throw new TournamentException("Tournament not found!"); + } + } + + public void setResult(Tournament tournament, MatchHasTeam mht, + MatchResultType rt) throws Exception + { + // Update the running tournament results. + final TournamentInterface ti + = tournamentMap.get(tournament.getTournamentPK()); + + synchronized (ti) + { + // Update database + MatchService.getInstance().setResult(mht, rt); + for (Player player : mht.getTeam().getPlayerList()) + { + // Update runtime + for (Encounter e : ti.getRound(tournament.getRoundList().size()).values()) + { + for (TeamInterface team : e.getEncounterSummary().keySet()) + { + if (team.hasMember(player.getId())) + { + EncounterResult result; + switch (rt.getType()) + { + case "result.noshow": + result = EncounterResult.NO_SHOW; + break; + case "result.forfeit": + result = EncounterResult.FORFEIT; + break; + case "result.loss": + result = EncounterResult.LOSS; + break; + case "result.draw": + result = EncounterResult.DRAW; + break; + default: + result = EncounterResult.WIN; + } + e.updateResult(team, result); + } + } + } + } + int roundNumber = mht.getMatchEntry().getRound().getRoundNumber(); + if (isRoundOver(tournament, roundNumber)) + { + ti.processRound(roundNumber); + ti.getListeners().forEach(listener -> listener.roundOver(roundNumber)); + } + } + } + + /** + * Check if the round is over or not. + * + * @param t Tournament to check + * @param round Round to check + * @return true if over, false otherwise. + */ + public boolean isRoundOver(Tournament t, int round) + { + return getRound(t, round).getMatchEntryList().stream().noneMatch((me) + -> (!me.getMatchHasTeamList().stream().noneMatch((mht) + -> (mht.getMatchResult() == null)))); + } + + /** + * Get round for a tournament. + * + * @param t Tournament to get round from. + * @param round Round number to get. + * @return The round or null if not found. + */ + public Round getRound(Tournament t, int round) + { + List rounds = findTournament(t.getTournamentPK()).getRoundList(); + if (rounds.size() >= round) + { + return rounds.get(round - 1); + } + return null; + } + + public void checkStatus(Tournament t) + { + + } + + /** + * Save a tournament Format. + * + * @param tf format to save + * @throws NonexistentEntityException If editing and it doesn't exist. + * @throws Exception If something goes wrong persisting to database. + */ + public void saveTournamentFormat(TournamentFormat tf) + throws NonexistentEntityException, Exception + { + if (tf.getId() == null) + { + tfc.create(tf); + } + else + { + tfc.edit(tf); + } + } + + /** + * Get all Tournament Formats. + * + * @return All formats in the database. + */ + public List getAllFormats() + { + return tfc.findTournamentFormatEntities(); + } } diff --git a/Database-Storage/src/main/resources/META-INF/persistence.xml b/Database-Storage/src/main/resources/META-INF/persistence.xml index 46f05f3..ce02ed0 100644 --- a/Database-Storage/src/main/resources/META-INF/persistence.xml +++ b/Database-Storage/src/main/resources/META-INF/persistence.xml @@ -12,7 +12,9 @@ com.github.javydreamercsw.database.storage.db.Record com.github.javydreamercsw.database.storage.db.Round com.github.javydreamercsw.database.storage.db.Team + com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord com.github.javydreamercsw.database.storage.db.Tournament + com.github.javydreamercsw.database.storage.db.TournamentFormat com.github.javydreamercsw.database.storage.db.TournamentHasTeam @@ -38,7 +40,9 @@ com.github.javydreamercsw.database.storage.db.Record com.github.javydreamercsw.database.storage.db.Round com.github.javydreamercsw.database.storage.db.Team + com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord com.github.javydreamercsw.database.storage.db.Tournament + com.github.javydreamercsw.database.storage.db.TournamentFormat com.github.javydreamercsw.database.storage.db.TournamentHasTeam @@ -65,7 +69,9 @@ com.github.javydreamercsw.database.storage.db.Record com.github.javydreamercsw.database.storage.db.Round com.github.javydreamercsw.database.storage.db.Team + com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord com.github.javydreamercsw.database.storage.db.Tournament + com.github.javydreamercsw.database.storage.db.TournamentFormat com.github.javydreamercsw.database.storage.db.TournamentHasTeam diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/AbstractServerTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/AbstractServerTest.java index 4a909be..4e5010a 100644 --- a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/AbstractServerTest.java +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/AbstractServerTest.java @@ -1,5 +1,6 @@ package com.github.javydreamercsw.database.storage.db; +import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; @@ -10,6 +11,7 @@ import com.github.javydreamercsw.database.storage.db.server.MatchService; import com.github.javydreamercsw.database.storage.db.server.PlayerService; import com.github.javydreamercsw.database.storage.db.server.TeamService; +import com.github.javydreamercsw.database.storage.db.server.TournamentService; /** * @@ -23,13 +25,25 @@ public AbstractServerTest() } @BeforeClass - public void setup() throws NonexistentEntityException, IllegalOrphanException + public void setup() throws NonexistentEntityException, IllegalOrphanException, + Exception { DataBaseManager.setPersistenceUnitName("TestTMPU"); + cleanDB(); + DataBaseManager.load(); + } + + @AfterClass + protected void cleanDB() throws NonexistentEntityException, IllegalOrphanException + { for (MatchEntry match : MatchService.getInstance().getAll()) { MatchService.getInstance().deleteMatch(match); } + for (Tournament tournament : TournamentService.getInstance().getAll()) + { + TournamentService.getInstance().deleteTournament(tournament); + } TeamService.getInstance().getAll().forEach(team -> TeamService.getInstance().deleteTeam(team)); PlayerService.getInstance().getAll().forEach(player diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/BundleTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/BundleTest.java new file mode 100644 index 0000000..46f3ccf --- /dev/null +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/BundleTest.java @@ -0,0 +1,28 @@ +package com.github.javydreamercsw.database.storage.db.server; + +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; + +import java.util.MissingResourceException; + +import org.openide.util.NbBundle; +import org.testng.annotations.Test; + +public class BundleTest +{ + @Test + public void testBundle() + { + assertNotNull(NbBundle.getMessage(DataBaseManager.class, "message.db.locked")); + + try + { + NbBundle.getMessage(DataBaseManager.class, "dummy"); + fail("Expected MissingResourceException!"); + } + catch (MissingResourceException ex) + { + // Expected + } + } +} diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManagerTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManagerTest.java index d4a3a75..cfe3bc3 100644 --- a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManagerTest.java +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/DataBaseManagerTest.java @@ -5,12 +5,17 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.openide.util.Lookup; import org.testng.annotations.Test; import com.github.javydreamercsw.database.storage.db.AbstractServerTest; import com.github.javydreamercsw.database.storage.db.MatchEntry; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; +import com.github.javydreamercsw.tournament.manager.api.IGame; public class DataBaseManagerTest extends AbstractServerTest { @@ -22,11 +27,14 @@ public class DataBaseManagerTest extends AbstractServerTest @Test public void testLoadDemoData() throws Exception { + cleanDB(); //Load demo data DataBaseManager.loadDemoData(); assertFalse(PlayerService.getInstance().getAll().isEmpty()); assertFalse(TournamentService.getInstance().getAll().isEmpty()); + assertFalse(TournamentService.getInstance().getAllFormats().isEmpty()); + assertFalse(FormatService.getInstance().getAll().isEmpty()); assertFalse(MatchService.getInstance().getAll().isEmpty()); assertFalse(TeamService.getInstance().getAll().isEmpty()); assertFalse(RecordService.getInstance().getAll().isEmpty()); @@ -36,7 +44,7 @@ public void testLoadDemoData() throws Exception assertEquals(me.getMatchHasTeamList().size(), 2); assertNotNull(me.getFormat()); }); - + List results = DataBaseManager.namedQuery("MatchEntry.findAll"); assertTrue(results.size() > 0); @@ -46,5 +54,32 @@ public void testLoadDemoData() throws Exception assertEquals(m.getMatchHasTeamList().size(), 2); assertNotNull(m.getFormat()); }); + + results = DataBaseManager.namedQuery("TeamHasFormatRecord.findAll"); + assertTrue(results.size() > 0); + + results.forEach(result -> + { + TeamHasFormatRecord m = (TeamHasFormatRecord) result; + assertNotNull(m.getTeam()); + assertNotNull(m.getFormat()); + }); + + FormatService.getInstance().getAll().forEach(format -> + { + if (format.getMatchEntryList().size() > 0) + { + assertTrue(format.getTeamHasFormatRecordList().size() > 0); + } + }); + } + + @Test + public void testNamedQuery() + { + Map parameters = new HashMap<>(); + parameters.put("name", Lookup.getDefault().lookup(IGame.class).getName()); + + assertFalse(DataBaseManager.namedQuery("Game.findByName", parameters).isEmpty()); } } diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/FormatServiceTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/FormatServiceTest.java index d23a613..bc7ea72 100644 --- a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/FormatServiceTest.java +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/FormatServiceTest.java @@ -1,14 +1,11 @@ package com.github.javydreamercsw.database.storage.db.server; +import static org.testng.Assert.*; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.fail; +import java.util.List; +import java.util.Optional; -import java.util.stream.Stream; - -import org.openide.util.Exceptions; +import org.openide.util.Lookup; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -17,39 +14,20 @@ import com.github.javydreamercsw.database.storage.db.Game; import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.tournament.manager.api.IGame; public class FormatServiceTest extends AbstractServerTest { - private Game game = new Game("Test"); + private Game game; @BeforeClass @Override - public void setup() throws NonexistentEntityException, IllegalOrphanException + public void setup() throws NonexistentEntityException, IllegalOrphanException, + Exception { super.setup(); - GameService.getInstance().saveGame(game); - Stream.of("Commander", - "Beatdown", - "Legacy", - "Standard", - "Draft") - .forEach(name -> - { - if (!FormatService.getInstance().findFormatByName(name).isPresent()) - { - try - { - Format format = new Format(name); - format.setGame(game); - FormatService.getInstance().saveFormat(format); - } - catch (Exception ex) - { - Exceptions.printStackTrace(ex); - fail(); - } - } - }); + game = GameService.getInstance().findGameByName(Lookup.getDefault() + .lookup(IGame.class).getName()).get(); } /** @@ -58,8 +36,7 @@ public void setup() throws NonexistentEntityException, IllegalOrphanException @Test public void testFindFormats() { - System.out.println("findFormats"); - assertFalse(FormatService.getInstance().findFormats("").isEmpty()); + assertFalse(FormatService.getInstance().getAll().isEmpty()); } /** @@ -68,10 +45,10 @@ public void testFindFormats() @Test public void testFindFormatByName() { - System.out.println("findFormatByName"); - assertEquals(1, FormatService.getInstance().findFormats("Commander").size()); - - assertEquals(0, FormatService.getInstance().findFormats("Commander2").size()); + assertEquals(1, FormatService.getInstance() + .findFormats(game.getFormatList().get(0).getName()).size()); + assertEquals(0, FormatService.getInstance() + .findFormats(game.getFormatList().get(0).getName() + "2").size()); } /** @@ -80,12 +57,12 @@ public void testFindFormatByName() @Test public void testFindFormatOrThrow() { - System.out.println("findFormatOrThrow"); - assertNotNull(FormatService.getInstance().findFormatOrThrow("Commander")); - + assertNotNull(FormatService.getInstance() + .findFormatOrThrow(game.getFormatList().get(0).getName())); try { - FormatService.getInstance().findFormatOrThrow("Commander2"); + FormatService.getInstance() + .findFormatOrThrow(game.getFormatList().get(0).getName() + "2"); fail("Expected exception!"); } catch (IllegalStateException ex) @@ -100,10 +77,10 @@ public void testFindFormatOrThrow() @Test public void testFindFormatById() { - System.out.println("findCategoryById"); assertNotNull(FormatService.getInstance() .findFormatById(FormatService.getInstance() - .findFormatByName("Commander").get().getFormatPK())); + .findFormatByName(game.getFormatList().get(0).getName()).get() + .getFormatPK())); } /** @@ -114,7 +91,6 @@ public void testFindFormatById() @Test public void testDeleteFormat() throws Exception { - System.out.println("deleteFormat"); Format format = new Format("test"); format.setGame(game); assertEquals(FormatService.getInstance().findFormats("test").size(), 0); @@ -124,4 +100,36 @@ public void testDeleteFormat() throws Exception .findFormatByName(format.getName()).get()); assertEquals(FormatService.getInstance().findFormats("test").size(), 0); } + + /** + * Test of findFormatForGame method, of class FormatService. + */ + @Test + public void testFindFormatForGame() + { + Optional result = FormatService.getInstance().findFormatForGame(game.getName(), + game.getFormatList().get(0).getName()); + assertTrue(result.isPresent()); + + result = FormatService.getInstance().findFormatForGame(game.getName(), + game.getFormatList().get(0).getName() + "x"); + assertFalse(result.isPresent()); + + result = FormatService.getInstance().findFormatForGame(game.getName() + "x", + game.getFormatList().get(0).getName()); + assertFalse(result.isPresent()); + } + + /** + * Test of findFormatByGame method, of class FormatService. + */ + @Test + public void testFindFormatByGame() + { + List result = FormatService.getInstance().findFormatByGame(game); + assertFalse(result.isEmpty()); + + result = FormatService.getInstance().findFormatByGame(game.getName() + "2"); + assertTrue(result.isEmpty()); + } } diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/MatchServiceTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/MatchServiceTest.java index ea3b8fa..7d74b93 100644 --- a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/MatchServiceTest.java +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/MatchServiceTest.java @@ -3,21 +3,31 @@ import static org.testng.Assert.*; import java.util.List; +import java.util.Optional; import java.util.Random; import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import com.github.javydreamercsw.database.storage.db.AbstractServerTest; -import com.github.javydreamercsw.database.storage.db.Format; import com.github.javydreamercsw.database.storage.db.Game; import com.github.javydreamercsw.database.storage.db.MatchEntry; import com.github.javydreamercsw.database.storage.db.MatchHasTeam; import com.github.javydreamercsw.database.storage.db.MatchResult; import com.github.javydreamercsw.database.storage.db.MatchResultType; import com.github.javydreamercsw.database.storage.db.Player; +import com.github.javydreamercsw.database.storage.db.Team; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.tournament.manager.api.IGame; import com.github.javydreamercsw.tournament.manager.api.TournamentException; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; /** * @@ -25,32 +35,63 @@ */ public class MatchServiceTest extends AbstractServerTest { - /** - * Test of write2DB method, of class MatchServer. - * - * @throws - * com.github.javydreamercsw.tournament.manager.api.TournamentException - */ - @Test - public void testMatchService() throws TournamentException, Exception + private Game game; + private MatchEntry me; + private Tournament t = new Tournament("Test 1"); + + @BeforeClass + @Override + public void setup() throws NonexistentEntityException, IllegalOrphanException, + Exception { - Tournament t = new Tournament("Test 1"); + super.setup(); + game = GameService.getInstance().findGameByName(Lookup.getDefault() + .lookup(IGame.class).getName()).get(); + t.setTournamentFormat(TournamentService.getInstance() + .findFormat(Lookup.getDefault().lookup(TournamentInterface.class) + .getName())); + t.setFormat(FormatService.getInstance().getAll().get(0)); TournamentService.getInstance().saveTournament(t); TournamentService.getInstance().addRound(t); - Game game = new Game("Test Game"); GameService.getInstance().saveGame(game); - Format format = new Format("Default"); - format.setGame(game); - FormatService.getInstance().saveFormat(format); - - MatchEntry me = new MatchEntry(); - me.setFormat(format); + me = new MatchEntry(); + me.setFormat(game.getFormatList().get(0)); me.setRound(t.getRoundList().get(0)); MatchService.getInstance().saveMatch(me); + } + + @AfterMethod + public void reset() + { + TeamService.getInstance().getAll().forEach(team -> + { + try + { + MatchService.getInstance().removeTeam(me, team); + } + catch (NonexistentEntityException ex) + { + Exceptions.printStackTrace(ex); + fail(); + } + }); + assertTrue(MatchService.getInstance().findMatch(me.getMatchEntryPK()) + .getMatchHasTeamList().isEmpty()); + } + + /** + * Test of write2DB method, of class MatchServer. + * + * @throws + * com.github.javydreamercsw.tournament.manager.api.TournamentException + */ + @Test + public void testMatchService() throws TournamentException, Exception + { MatchEntry match = MatchService.getInstance().findMatch(me.getMatchEntryPK()); assertNotNull(me.getFormat()); @@ -110,7 +151,12 @@ public void testMatchService() throws TournamentException, Exception { switch (result.getMatchResultType().getType()) { + //Various reasons leading to a loss. case "result.loss": + //Fall thru + case "result.forfeit": + //Fall thru + case "result.no_show": assertEquals(p.getRecordList().get(0).getWins(), 0); assertEquals(p.getRecordList().get(0).getLoses(), 1); assertEquals(p.getRecordList().get(0).getDraws(), 0); @@ -120,12 +166,7 @@ public void testMatchService() throws TournamentException, Exception assertEquals(p.getRecordList().get(0).getLoses(), 0); assertEquals(p.getRecordList().get(0).getDraws(), 1); break; - //Various reasons leading to a win. case "result.win": - //Fall thru - case "result.forfeit": - //Fall thru - case "result.no_show": assertEquals(p.getRecordList().get(0).getWins(), 1); assertEquals(p.getRecordList().get(0).getLoses(), 0); assertEquals(p.getRecordList().get(0).getDraws(), 0); @@ -143,5 +184,130 @@ public void testMatchService() throws TournamentException, Exception + p.getRecordList().get(0).getLoses() + p.getRecordList().get(0).getWins() > 0); }); + + MatchService.getInstance().saveMatch(me); + + MatchService.getInstance().lockMatchResult(me); + + MatchService.getInstance().updateRankings(me); + + //Check the stats + me.getMatchHasTeamList().forEach(mht -> + { + Team dbTeam = TeamService.getInstance().findTeam(mht.getTeam().getId()); + TeamHasFormatRecord thfr + = TeamService.getInstance().getFormatRecord(dbTeam, me.getFormat()); + assertNotNull(thfr); + assertTrue(thfr.getMean() + thfr.getStandardDeviation() != 0); + }); + } + + @Test + public void testFindMatchesWithFormat() + { + assertEquals(MatchService.getInstance().findMatchesWithFormat("").size(), + game.getFormatList().size()); + + assertEquals(MatchService.getInstance() + .findMatchesWithFormat(game.getFormatList().get(0).getName()).size(), 1); + + assertTrue(MatchService.getInstance() + .findMatchesWithFormat(game.getFormatList().get(0).getName() + "x") + .isEmpty()); + } + + @DataProvider + public Object[][] getQualityToTest() + { + Object[][] data = new Object[10][]; + for (int i = 10; i >0; i--) + { + data[10-i] = new Object[] + { + i * 10.0 + }; + } + return data; + } + + @Test(dataProvider = "getQualityToTest") + public void testcalculateBasePoints(double quality) throws Exception + { + // Add teams + Optional p1 = PlayerService.getInstance().findPlayerByName("Player 1"); + Optional p2 = PlayerService.getInstance().findPlayerByName("Player 2"); + Player player = p1.isPresent() ? p1.get() : new Player("Player 1"); + PlayerService.getInstance().savePlayer(player); + + Player player2 = p2.isPresent() ? p2.get() : new Player("Player 2"); + PlayerService.getInstance().savePlayer(player2); + + TeamService.getInstance().getAll().forEach(team -> + { + try + { + MatchService.getInstance().addTeam(me, team); + } + catch (Exception ex) + { + Exceptions.printStackTrace(ex); + fail(); + } + }); + + double calculatedQuality; + do + { + int count = 0; + for (MatchHasTeam mht : me.getMatchHasTeamList()) + { + MatchService.getInstance().setResult(mht, + count == 0 ? MatchService.getInstance().getResultType("result.win").get() + : MatchService.getInstance().getResultType("result.loss").get()); + count++; + } + TeamHasFormatRecord thfr1 = TeamService.getInstance().getFormatRecord( + MatchService.getInstance().findMatch(me.getMatchEntryPK()) + .getMatchHasTeamList().get(0).getTeam(), + game.getFormatList().get(0)); + + double player1Points = thfr1 == null ? 0.0 : thfr1.getPoints(); + + MatchService.getInstance().lockMatchResult(me); + MatchService.getInstance().updateRankings(me); + + // Check results + MatchService.getInstance().findMatch(me.getMatchEntryPK()) + .getMatchHasTeamList().forEach((mht) -> + { + if (mht.getMatchResult().getMatchResultType().getType().equals("result.win")) + { + assertEquals(TeamService.getInstance().getFormatRecord(mht.getTeam(), + game.getFormatList().get(0)).getPoints() - player1Points, + 10.0 * MatchService.getInstance().calculateModifier(quality)); + } + else + { + assertEquals(TeamService.getInstance().getFormatRecord(mht.getTeam(), + game.getFormatList().get(0)).getPoints(), 0); + } + }); + + calculatedQuality = MatchService.getInstance().getMatchQuality(me); + } + while (calculatedQuality > quality); + + TeamService.getInstance().getAll().forEach(team -> + { + try + { + MatchService.getInstance().removeTeam(me, team); + } + catch (NonexistentEntityException ex) + { + Exceptions.printStackTrace(ex); + fail(); + } + }); } } diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TeamServiceTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TeamServiceTest.java index f171141..812f780 100644 --- a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TeamServiceTest.java +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TeamServiceTest.java @@ -2,8 +2,12 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import static org.testng.Assert.fail; +import java.util.ArrayList; +import java.util.List; + import org.openide.util.Exceptions; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -43,9 +47,9 @@ public void setup() @Test public void testFindTeams() { - System.out.println("findTeams"); assertEquals(TeamService.getInstance().findTeams("Player 1").size(), 1); assertEquals(TeamService.getInstance().findTeams("Player 3").size(), 0); + assertEquals(TeamService.getInstance().findTeams("").size(), 2); } /** @@ -54,7 +58,6 @@ public void testFindTeams() @Test public void testFindTeam() { - System.out.println("findTeam"); assertNotNull(TeamService.getInstance().findTeam(TeamService.getInstance() .findTeams("Player 1").get(0).getId())); } @@ -65,14 +68,25 @@ public void testFindTeam() @Test public void testSaveTeam() { - System.out.println("saveTeam"); Team team = new Team(); team.setName("The Players"); TeamService.getInstance().saveTeam(team); assertNotNull(team.getId()); - TeamService.getInstance().addMembers(team, - PlayerService.getInstance().findPlayerByName("Player 1").get(), - PlayerService.getInstance().findPlayerByName("Player 2").get()); + assertEquals(TeamService.getInstance().findTeam(team.getId()) + .getPlayerList().size(), 0); + List players = new ArrayList<>(); + + players.add(PlayerService.getInstance().findPlayerByName("Player 1").get()); + players.add(PlayerService.getInstance().findPlayerByName("Player 2").get()); + + TeamService.getInstance().addMembers(team,players); + + assertEquals(TeamService.getInstance().findTeam(team.getId()) + .getPlayerList().size(), 2); + + TeamService.getInstance().deleteTeam(team); + + assertNull(TeamService.getInstance().findTeam(team.getId())); } } diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TestTournamentFormat.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TestTournamentFormat.java new file mode 100644 index 0000000..2437216 --- /dev/null +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TestTournamentFormat.java @@ -0,0 +1,55 @@ +package com.github.javydreamercsw.database.storage.db.server; + + +import java.util.List; + +import org.openide.util.lookup.ServiceProvider; + +import com.github.javydreamercsw.tournament.manager.AbstractTournament; +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; + +@ServiceProvider(service = TournamentInterface.class) +public class TestTournamentFormat extends AbstractTournament + implements TournamentInterface +{ + public TestTournamentFormat() + { + super(3, 0, 1, true); + } + + public TestTournamentFormat(int winPoints, int lossPoints, int drawPoints, + boolean pairAlikeRecords) + { + super(winPoints, lossPoints, drawPoints, pairAlikeRecords); + } + + public TestTournamentFormat(int winPoints, int lossPoints, int drawPoints) + { + super(winPoints, lossPoints, drawPoints); + } + + @Override + public String getName() + { + return "Dummy Tournament Format"; + } + + @Override + public int getMinimumAmountOfRounds() + { + return 2; + } + + @Override + public TournamentInterface createTournament(List teams, + int winPoints, int lossPoints, int drawPoints) + throws TournamentSignupException + { + TestTournamentFormat dummy = new TestTournamentFormat(winPoints, lossPoints, + drawPoints, true); + dummy.addTeams(teams); + return dummy; + } +} diff --git a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TournamentServiceTest.java b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TournamentServiceTest.java index e788dc1..3907e53 100644 --- a/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TournamentServiceTest.java +++ b/Database-Storage/src/test/java/com/github/javydreamercsw/database/storage/db/server/TournamentServiceTest.java @@ -1,13 +1,32 @@ package com.github.javydreamercsw.database.storage.db.server; -import static org.testng.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.testng.Assert.*; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import com.github.javydreamercsw.database.storage.db.AbstractServerTest; +import com.github.javydreamercsw.database.storage.db.MatchEntry; +import com.github.javydreamercsw.database.storage.db.MatchHasTeam; import com.github.javydreamercsw.database.storage.db.Player; +import com.github.javydreamercsw.database.storage.db.Round; import com.github.javydreamercsw.database.storage.db.Team; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentPK; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentListener; /** * @@ -15,17 +34,32 @@ */ public class TournamentServiceTest extends AbstractServerTest { - /** - * Test of write2DB method, of class TournamentHasTeamServer. - * - * @throws java.lang.Exception - */ - @Test - public void testWrite2DB() throws Exception + private Tournament t; + + @BeforeClass + @Override + public void setup() throws NonexistentEntityException, IllegalOrphanException { - Tournament t = new Tournament("Test"); - TournamentService.getInstance().saveTournament(t); + try + { + super.setup(); + t = new Tournament("Test"); + t.setTournamentFormat(TournamentService.getInstance() + .findFormat(Lookup.getDefault().lookup(TournamentInterface.class) + .getName())); + t.setFormat(FormatService.getInstance().getAll().get(0)); + TournamentService.getInstance().saveTournament(t); + } + catch (Exception ex) + { + Exceptions.printStackTrace(ex); + fail(); + } + } + @Test + public void testAddTeam() throws Exception + { Player player = new Player("Player 1"); PlayerService.getInstance().savePlayer(player); @@ -40,5 +74,293 @@ public void testWrite2DB() throws Exception TournamentService.getInstance().addTeam(t, team); assertEquals(t.getTournamentHasTeamList().size(), 1); + + TournamentService.getInstance().deleteTeamFromTournament(t + .getTournamentHasTeamList().get(0)); + } + + @Test + public void testFindTournament() + { + assertNotNull(TournamentService.getInstance().findTournament(t.getTournamentPK())); + assertNull(TournamentService.getInstance().findTournament(new TournamentPK(2_000))); + } + + @Test + public void testFindTournaments() + { + assertEquals(TournamentService.getInstance().findTournaments(t.getName()) + .size(), 1); + assertEquals(TournamentService.getInstance().findTournaments(t.getName() + + "x").size(), 0); + } + + @Test + public void testSaveAndDelete() throws IllegalOrphanException, + NonexistentEntityException, Exception + { + Tournament t2 = new Tournament("Test 2"); + t2.setTournamentFormat(TournamentService.getInstance() + .findFormat(Lookup.getDefault().lookup(TournamentInterface.class) + .getName())); + assertEquals(TournamentService.getInstance().findTournaments(t2.getName()) + .size(), 0); + t2.setFormat(FormatService.getInstance().getAll().get(0)); + TournamentService.getInstance().saveTournament(t2); + + assertEquals(TournamentService.getInstance().findTournaments(t2.getName()) + .size(), 1); + + LocalDateTime now = LocalDateTime.now(); + t2.setStartDate(now); + t2.setEndDate(now.plusHours(1)); + t2.setSignupTimeLimit(10); + t2.setRoundTimeLimit(30); + + TournamentService.getInstance().saveTournament(t2); + + Tournament retrieved = TournamentService.getInstance() + .findTournament(t2.getTournamentPK()); + assertThat(t2.getStartDate(), equalTo(retrieved.getStartDate())); + assertThat(t2.getEndDate(), equalTo(retrieved.getEndDate())); + assertThat(t2.getSignupTimeLimit(), equalTo(retrieved.getSignupTimeLimit())); + assertThat(t2.getRoundTimeLimit(), equalTo(retrieved.getRoundTimeLimit())); + + TournamentService.getInstance().deleteTournament(t2); + + assertEquals(TournamentService.getInstance().findTournaments(t2.getName()) + .size(), 0); + } + + @Test + public void testAddTeams() throws Exception + { + Tournament tournament = new Tournament("Add Team"); + tournament.setTournamentFormat(TournamentService.getInstance() + .findFormat(Lookup.getDefault().lookup(TournamentInterface.class) + .getName())); + tournament.setFormat(FormatService.getInstance().getAll().get(0)); + TournamentService.getInstance().saveTournament(tournament); + + Player player3 = new Player("Player 3"); + PlayerService.getInstance().savePlayer(player3); + + Player player4 = new Player("Player 4"); + PlayerService.getInstance().savePlayer(player4); + + Team team2 = new Team("Test Team 2"); + team2.getPlayerList().add(player3); + team2.getPlayerList().add(player4); + TeamService.getInstance().saveTeam(team2); + Player player5 = new Player("Player 5"); + PlayerService.getInstance().savePlayer(player5); + + Player player6 = new Player("Player 6"); + PlayerService.getInstance().savePlayer(player6); + + Team team3 = new Team("Test Team"); + team3.getPlayerList().add(player3); + team3.getPlayerList().add(player5); + TeamService.getInstance().saveTeam(team3); + + List teams = new ArrayList<>(); + teams.add(team3); + teams.add(team2); + + TournamentService.getInstance().addTeams(tournament, teams); + + assertEquals(TournamentService.getInstance().findTournament(tournament + .getTournamentPK()).getTournamentHasTeamList().size(), 2); + } + + @DataProvider + public Object[][] getScenarios() + { + return new Object[][] + { + { + 4, 2, 1 // Two teams of 2 people. Should be done in one round. + }, + { + 2, 1, 1 // Two teams of 1 people. Should be done in one round. + }, + { + 8, 1, 3 // Eight teams of 1 people. Should be done in 3 rounds. + }, + { + 16, 2, 3 // Eight teams of 1 people. Should be done in 3 rounds. + } + }; + } + + /** + * This tests the whole workflow of the tournament. + * + * @param amountOfPlayers Players to test with. + * @param playersPerTeam Amount of players in a team. + * @param expectedRounds Expected amount of rounds. + * @throws IllegalOrphanException + */ + @Test(dataProvider = "getScenarios") + public void testTournament(final int amountOfPlayers, + final int playersPerTeam, final int expectedRounds) + throws IllegalOrphanException, Exception + { + Tournament tournament = new Tournament("Workflow"); + tournament.setTournamentFormat(TournamentService.getInstance() + .findFormat(Lookup.getDefault().lookup(TournamentInterface.class) + .getName())); + tournament.setFormat(FormatService.getInstance().getAll().get(0)); + TournamentService.getInstance().saveTournament(tournament); + + int i = TournamentService.getInstance().getAll().size() + 1; + + Player last = null; + for (int x = 1; x <= amountOfPlayers; x++) + { + Player player = new Player("Player " + i); + PlayerService.getInstance().savePlayer(player); + + if (x % playersPerTeam == 0 && x >= 1) + { + // Create a team with previous player + Team team = new Team("Test Team " + (x / playersPerTeam)); + if (last != null) + { + team.getPlayerList().add(last); + } + team.getPlayerList().add(player); + TeamService.getInstance().saveTeam(team); + TournamentService.getInstance().addTeam(tournament, team); + last = null; + } + else + { + // Save for next team + last = player; + } + i++; + } + + assertEquals(tournament.getTournamentHasTeamList().size(), + amountOfPlayers / playersPerTeam); + + assertEquals(tournament.getRoundList().size(), 0); + + assertFalse(TournamentService.getInstance().hasStarted(tournament)); + + int currentRound = 0; + List roundStarted = new ArrayList<>(); + List roundOver = new ArrayList<>(); + // Start the tournament + TournamentService.getInstance().startTournament(tournament, + new TournamentListener() + { + @Override + public void roundStart(int round) + { + roundStarted.add(round); + } + + @Override + public void roundTimeOver() + { + // Do nothing + } + + @Override + public void roundOver(int round) + { + roundOver.add(round); + } + + @Override + public void noshow() + { + // Do nothing + } + }); + + currentRound++; + + assertTrue(TournamentService.getInstance().hasStarted(tournament)); + + assertEquals(currentRound, (int) roundStarted.get(roundStarted.size() - 1)); + + assertEquals(tournament.getRoundList().size(), currentRound); + + assertEquals(tournament.getRoundList().get(0).getMatchEntryList().size(), + amountOfPlayers / (playersPerTeam * 2)); + + Round retrievedRound = TournamentService.getInstance() + .getRound(tournament.getRoundList().get(0).getRoundPK()); + + assertNotNull(retrievedRound); + + assertEquals(retrievedRound.getMatchEntryList().size(), + amountOfPlayers / (playersPerTeam * 2)); + + assertFalse(TournamentService.getInstance().isRoundOver(tournament, + currentRound)); + + Random random = new Random(); + + //Now simulate matches and monitor the persistence of the round as it progresses. + while (!TournamentService.getInstance().isOver(tournament)) + { + // Simulate matches in the current round + for (MatchEntry me : retrievedRound.getMatchEntryList()) + { + int teams = me.getMatchHasTeamList().size(); + int winner = random.nextInt(teams); + int count = 0; + for (MatchHasTeam mht : me.getMatchHasTeamList()) + { + if (count == winner) + { + TournamentService.getInstance().setResult(tournament, mht, + MatchService.getInstance().getResultType("result.win").get()); + } + else + { + TournamentService.getInstance().setResult(tournament, mht, + MatchService.getInstance().getResultType("result.loss").get()); + } + count++; + } + } + + // Round should be over + assertTrue(TournamentService.getInstance().isRoundOver(tournament, + currentRound)); + + assertEquals((int) roundOver.get(roundOver.size() - 1), currentRound); + + TournamentService.getInstance().startNextRound(tournament); + if (!TournamentService.getInstance().isOver(tournament)) + { + currentRound++; + + Round r = tournament.getRoundList() + .get(tournament.getRoundList().size() - 1); + + assertFalse(r.getMatchEntryList().isEmpty()); + + retrievedRound = TournamentService.getInstance().getRound(r.getRoundPK()); + + assertNotNull(retrievedRound); + + assertFalse(retrievedRound.getMatchEntryList().isEmpty()); + } + else + { + + assertEquals(currentRound, expectedRounds); + } + assertTrue(currentRound <= expectedRounds, + "Unexpected amount of rounds.\nExpected: " + expectedRounds + + "\nFound: " + currentRound + "\n"); + } + TournamentService.getInstance().deleteTournament(tournament); } } diff --git a/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/DoubleElimination.java b/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/DoubleElimination.java new file mode 100644 index 0000000..ab9005a --- /dev/null +++ b/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/DoubleElimination.java @@ -0,0 +1,41 @@ +package com.github.javydreamercsw.tournament.manager.elimination.tournament; + +import java.util.List; + +import org.openide.util.lookup.ServiceProvider; + +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; + +@ServiceProvider(service = TournamentInterface.class) +public class DoubleElimination extends Elimination +{ + public DoubleElimination() + { + super(2, false); + } + + public DoubleElimination(int winPoints, int lossPoints, int drawPoints, + boolean pairAlikeRecords) + { + super(2, winPoints, lossPoints, drawPoints, pairAlikeRecords); + } + + @Override + public String getName() + { + return "Double Elimination"; + } + + @Override + public TournamentInterface createTournament(List teams, + int winPoints, int lossPoints, int drawPoints) + throws TournamentSignupException + { + DoubleElimination de = new DoubleElimination(winPoints, lossPoints, + drawPoints, true); + de.addTeams(teams); + return de; + } +} diff --git a/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/Elimination.java b/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/Elimination.java index 40ea37f..71f940d 100644 --- a/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/Elimination.java +++ b/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/Elimination.java @@ -10,12 +10,10 @@ import java.util.logging.Logger; import org.apache.commons.lang3.ArrayUtils; -import org.openide.util.lookup.ServiceProvider; import com.github.javydreamercsw.tournament.manager.AbstractTournament; import com.github.javydreamercsw.tournament.manager.api.Encounter; import com.github.javydreamercsw.tournament.manager.api.TeamInterface; -import com.github.javydreamercsw.tournament.manager.api.TournamentException; import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; @@ -23,14 +21,12 @@ * * @author Javier A. Ortiz Bultron */ -@ServiceProvider(service = TournamentInterface.class) -public class Elimination extends AbstractTournament +public abstract class Elimination extends AbstractTournament implements TournamentInterface { private static final Logger LOG = Logger.getLogger(Elimination.class.getName()); - private final int eliminations; /** * Provide eliminations and pairing option. Defaults to 3 points for a win, 0 @@ -41,8 +37,7 @@ public class Elimination extends AbstractTournament */ public Elimination(int eliminations, boolean pairAlikeRecords) { - super(3, 0, 1, pairAlikeRecords); - this.eliminations = eliminations; + super(3, 0, 1, eliminations, pairAlikeRecords); } /** @@ -52,7 +47,6 @@ public Elimination(int eliminations, boolean pairAlikeRecords) public Elimination() { super(3, 0, 1, false); - this.eliminations = 1; } /** @@ -66,14 +60,7 @@ public Elimination() public Elimination(int eliminations, int winPoints, int lossPoints, int drawPoints, boolean pairAlikeRecords) { - super(winPoints, lossPoints, drawPoints, pairAlikeRecords); - this.eliminations = eliminations; - } - - @Override - public String getName() - { - return "Single Elimination"; + super(winPoints, lossPoints, drawPoints, eliminations, pairAlikeRecords); } @Override @@ -104,36 +91,6 @@ public Map getPairings() { if (pairingHistory.get(getRound()) == null) { - //Remove teams with loses from tournament - List toRemove - = new ArrayList<>(); - for (TeamInterface team : getActiveTeams()) - { - //Loss or draw gets you eliminated - if (team.getTeamMembers().get(0).getRecord().getLosses() - + team.getTeamMembers().get(0).getRecord() - .getDraws() >= eliminations) - { - toRemove.add(team); - } - } - List errors = new ArrayList<>(); - toRemove.forEach((t) -> - { - if (!errors.contains(t)) - { - try - { - LOG.log(Level.FINE, "Removing player: {0}", t.toString()); - removeTeam(t); - } - catch (TournamentException ex) - { - LOG.log(Level.FINE, null, ex); - errors.add(t); - } - } - }); if (pairAlikeRecords) { Map pairings @@ -194,7 +151,7 @@ public Map getPairings() pending = players.get(lucky); //Exclude the lucky one from the rest of processing exclude = ArrayUtils.add(exclude, lucky); - LOG.log(Level.INFO, "Pairing {0} with lower level", pending); + LOG.log(Level.FINE, "Pairing {0} with lower level", pending); } //We have an even number, pair them together while (players.size() - exclude.length >= 2) @@ -255,15 +212,6 @@ public int getMinimumAmountOfRounds() * will be n= 2^r competitors. In the opening round, 2^r - n competitors * will get a bye. */ - return log(teams.size(), 2); - } - - @Override - public TournamentInterface createTournament(List teams, - int winPoints, int lossPoints, int drawPoints) - { - Elimination swiss = new Elimination(1, winPoints, lossPoints, drawPoints, true); - swiss.teams.addAll(teams); - return swiss; + return log(getAmountOfTeams(), 2); } } diff --git a/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/SingleElimination.java b/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/SingleElimination.java new file mode 100644 index 0000000..208a15f --- /dev/null +++ b/Elimination-Tournament/src/main/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/SingleElimination.java @@ -0,0 +1,43 @@ +package com.github.javydreamercsw.tournament.manager.elimination.tournament; + +import java.util.List; + +import org.openide.util.lookup.ServiceProvider; + +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; + +@ServiceProvider(service = TournamentInterface.class) +public class SingleElimination extends Elimination +{ + public SingleElimination() + { + super(1, false); + } + + public SingleElimination(int winPoints, int lossPoints, int drawPoints, + boolean pairAlikeRecords) + { + super(1, winPoints, lossPoints, drawPoints, pairAlikeRecords); + } + + + + @Override + public String getName() + { + return "Single Elimination"; + } + + @Override + public TournamentInterface createTournament(List teams, + int winPoints, int lossPoints, int drawPoints) + throws TournamentSignupException + { + SingleElimination se = new SingleElimination(winPoints, lossPoints, + drawPoints, true); + se.addTeams(teams); + return se; + } +} diff --git a/Elimination-Tournament/src/test/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/EliminationTest.java b/Elimination-Tournament/src/test/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/EliminationTest.java index bf9b1c4..019349e 100644 --- a/Elimination-Tournament/src/test/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/EliminationTest.java +++ b/Elimination-Tournament/src/test/java/com/github/javydreamercsw/tournament/manager/elimination/tournament/EliminationTest.java @@ -1,11 +1,12 @@ package com.github.javydreamercsw.tournament.manager.elimination.tournament; - +import java.util.List; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; import com.github.javydreamercsw.tournament.manager.AbstractTournamentTester; +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; /** @@ -23,7 +24,21 @@ public TournamentInterface generateRandomTournament() { int eliminations = new Random().nextInt(2) + 1; LOG.log(Level.INFO, "Eliminations: {0}", eliminations); - return new Elimination(eliminations, new Random().nextBoolean()); + return new Elimination(eliminations, 3, 0, 1, new Random().nextBoolean()) + { + @Override + public String getName() + { + return "Elimination: " + eliminations; + } + + @Override + public TournamentInterface createTournament(List teams, + int winPoints, int lossPoints, int drawPoints) + { + return null; + } + }; } @Override diff --git a/Swiss-Tournament/src/main/java/com/github/javydreamercsw/swiss/tournament/Swiss.java b/Swiss-Tournament/src/main/java/com/github/javydreamercsw/swiss/tournament/Swiss.java index d674f78..7a533ef 100644 --- a/Swiss-Tournament/src/main/java/com/github/javydreamercsw/swiss/tournament/Swiss.java +++ b/Swiss-Tournament/src/main/java/com/github/javydreamercsw/swiss/tournament/Swiss.java @@ -13,6 +13,7 @@ import com.github.javydreamercsw.tournament.manager.api.Encounter; import com.github.javydreamercsw.tournament.manager.api.TeamInterface; import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; /** * Swiss tournament is an elimination tournament without eliminations. Just @@ -84,14 +85,14 @@ public int getMinimumAmountOfRounds() { * there will be n= 2^r competitors. In the opening round, 2^r - n * competitors will get a bye. */ - return log(teams.size(), 2); + return log(getAmountOfTeams(), 2); } @Override public TournamentInterface createTournament(List teams, - int winPoints, int lossPoints, int drawPoints) { + int winPoints, int lossPoints, int drawPoints) throws TournamentSignupException { Swiss swiss = new Swiss(winPoints, lossPoints, drawPoints); - swiss.teams.addAll(teams); + swiss.addTeams(teams); return swiss; } } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/AbstractTournament.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/AbstractTournament.java index d5af816..fc59b46 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/AbstractTournament.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/AbstractTournament.java @@ -6,6 +6,7 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -21,20 +22,22 @@ import com.github.javydreamercsw.tournament.manager.api.Encounter; import com.github.javydreamercsw.tournament.manager.api.EncounterResult; -import com.github.javydreamercsw.tournament.manager.api.NoShowListener; import com.github.javydreamercsw.tournament.manager.api.ResultListener; -import com.github.javydreamercsw.tournament.manager.api.RoundTimeListener; import com.github.javydreamercsw.tournament.manager.api.TeamInterface; import com.github.javydreamercsw.tournament.manager.api.TournamentException; import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentListener; import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; import com.github.javydreamercsw.tournament.manager.api.Variables; - import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; public abstract class AbstractTournament implements TournamentInterface { private int format = 1; + /** + * Amount of non-wins to be eliminated. + */ + private final int eliminations; /** * Encounter id */ @@ -46,7 +49,7 @@ public abstract class AbstractTournament implements TournamentInterface /** * Teams that registered. */ - protected final List teams = new ArrayList<>(); + private final List teams = new ArrayList<>(); /** * Current list of active teams. This is an exact copy of teams before the * tournament starts. After it starts, teams that get eliminated or drop out @@ -79,12 +82,30 @@ public abstract class AbstractTournament implements TournamentInterface private final int drawPoints; private long no_show_time; private long round_time; - private final List noShowListeners - = new ArrayList<>(); - private final List roundTimeListeners + private final List listeners = new ArrayList<>(); protected final boolean pairAlikeRecords; private int id = -1; + + public AbstractTournament(int winPoints, int lossPoints, int drawPoints, + int eliminations, boolean pairAlikeRecords) + { + this.winPoints = winPoints; + this.lossPoints = lossPoints; + this.drawPoints = drawPoints; + this.pairAlikeRecords = pairAlikeRecords; + this.eliminations = eliminations; + } + + public AbstractTournament(int winPoints, int lossPoints, int drawPoints, + int eliminations) + { + this.winPoints = winPoints; + this.lossPoints = lossPoints; + this.drawPoints = drawPoints; + this.pairAlikeRecords = false; + this.eliminations = eliminations; + } public AbstractTournament(int winPoints, int lossPoints, int drawPoints, boolean pairAlikeRecords) @@ -93,6 +114,7 @@ public AbstractTournament(int winPoints, int lossPoints, int drawPoints, this.lossPoints = lossPoints; this.drawPoints = drawPoints; this.pairAlikeRecords = pairAlikeRecords; + this.eliminations = 1; } public AbstractTournament(int winPoints, int lossPoints, int drawPoints) @@ -101,6 +123,7 @@ public AbstractTournament(int winPoints, int lossPoints, int drawPoints) this.lossPoints = lossPoints; this.drawPoints = drawPoints; this.pairAlikeRecords = false; + this.eliminations = 1; } @Override @@ -258,6 +281,7 @@ public int getRandomWithExclusion(Random rnd, int start, int end, Integer[] excl @Override public void nextRound() throws TournamentException { + processRound(round); //Increase round round++; //Calculate pairings @@ -296,7 +320,7 @@ public TreeMap> getRankings() { TreeMap> rankings = new TreeMap<>((Integer o1, Integer o2) -> o2.compareTo(o1)); - teams.forEach((player) -> + getTeams().forEach((player) -> { int points = getPoints(player); if (rankings.get(points) == null) @@ -344,12 +368,47 @@ public void displayRankings() } } + @Override + public void processRound(int round) + { + //Remove teams with loses from tournament + List toRemove + = new ArrayList<>(); + for (TeamInterface team : getActiveTeams()) + { + //Loss or draw gets you eliminated + if (team.getTeamMembers().get(0).getRecord().getLosses() + + team.getTeamMembers().get(0).getRecord().getDraws() >= + getEliminations()) + { + toRemove.add(team); + } + } + List errors = new ArrayList<>(); + toRemove.forEach((t) -> + { + if (!errors.contains(t)) + { + try + { + LOG.log(Level.FINE, "Player: {0} is eliminated!", t.toString()); + removeTeam(t); + } + catch (TournamentException ex) + { + LOG.log(Level.FINE, null, ex); + errors.add(t); + } + } + }); + } + @Override public Map getPairings() { synchronized (getActiveTeams()) { - if (pairingHistory.get(getRound()) == null) + if (pairingHistory.get(getRound()) == null && getActiveTeams().size() > 1) { if (pairAlikeRecords) { @@ -458,7 +517,8 @@ public Map getPairings() { }; Random rnd = new Random(); - while (exclude.length < getActiveTeams().size() && getActiveTeams().size() > 1) + while (exclude.length < getActiveTeams().size() + && getActiveTeams().size() > 1) { int player1 = getRandomWithExclusion(rnd, 0, @@ -559,38 +619,20 @@ public long getRoundTime() } @Override - public void addNoShowListener(NoShowListener nsl) + public void addTournamentListener(TournamentListener rtl) { - if (!noShowListeners.contains(nsl)) + if (!listeners.contains(rtl)) { - noShowListeners.add(nsl); + listeners.add(rtl); } } @Override - public void removeNoShowListener(NoShowListener nsl) + public void removeTournamentListener(TournamentListener rtl) { - if (noShowListeners.contains(nsl)) + if (listeners.contains(rtl)) { - noShowListeners.remove(nsl); - } - } - - @Override - public void addRoundTimeListener(RoundTimeListener rtl) - { - if (!roundTimeListeners.contains(rtl)) - { - roundTimeListeners.add(rtl); - } - } - - @Override - public void removeRoundTimeListener(RoundTimeListener rtl) - { - if (roundTimeListeners.contains(rtl)) - { - roundTimeListeners.remove(rtl); + listeners.remove(rtl); } } @@ -633,6 +675,7 @@ public void updateResults(int encounterId, } break; case NO_SHOW: + case FORFEIT: //Fall thru case LOSS: //All others are winners @@ -766,4 +809,35 @@ protected void setFormat(int format) { this.format = format; } + + @Override + public void addTeams(List teams) + throws TournamentSignupException + { + for (TeamInterface team : teams) + { + addTeam(team); + } + } + + @Override + public List getTeams() + { + return Collections.unmodifiableList(teams); + } + + @Override + public List getListeners() + { + return Collections.unmodifiableList(listeners); + } + + /** + * @return the eliminations + */ + @Override + public int getEliminations() + { + return eliminations; + } } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/Team.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/Team.java index 9bcfdfb..7a37d68 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/Team.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/Team.java @@ -7,13 +7,12 @@ import org.openide.util.Lookup; -import de.gesundkrank.jskills.Rating; - import com.github.javydreamercsw.tournament.manager.api.TeamInterface; import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; - import com.github.javydreamercsw.tournament.manager.api.standing.RecordInterface; +import de.gesundkrank.jskills.Rating; + /** * * @author Javier A. Ortiz Bultron @@ -23,13 +22,14 @@ public class Team extends de.gesundkrank.jskills.Team implements TeamInterface private static final long serialVersionUID = 8398904493889254598L; private final String name; private RecordInterface record = null; + private final int teamId; - public Team(List teamMembers) + public Team(int id, List teamMembers) { - this("", teamMembers); + this(id, "", teamMembers); } - public Team(String name, List teamMembers) + public Team(int id, String name, List teamMembers) { this.name = name; teamMembers.forEach(member -> @@ -37,11 +37,12 @@ public Team(String name, List teamMembers) put(member, new Rating(0, 0)); }); record = Lookup.getDefault().lookup(RecordInterface.class).getNewInstance(); + this.teamId = id; } - public Team(TournamentPlayerInterface p1) + public Team(int id, TournamentPlayerInterface p1) { - this("", Arrays.asList(p1)); + this(id, "", Arrays.asList(p1)); } /** @@ -91,16 +92,7 @@ public String toString() @Override public boolean hasMember(TournamentPlayerInterface member) { - boolean found = false; - for (TournamentPlayerInterface player : getTeamMembers()) - { - if (player.getName().equals(member.getName())) - { - found = true; - break; - } - } - return found; + return hasMember(member.getID()); } @Override @@ -110,8 +102,33 @@ public RecordInterface getRecord() } @Override - public TeamInterface createTeam(String name, List players) + public TeamInterface createTeam(int id, String name, + List players) { - return new Team(name, players); + return new Team(id, name, players); + } + + /** + * @return the teamId + */ + @Override + public int getTeamId() + { + return teamId; + } + + @Override + public boolean hasMember(int memberId) + { + boolean found = false; + for (TournamentPlayerInterface player : getTeamMembers()) + { + if (player.getID() == memberId) + { + found = true; + break; + } + } + return found; } } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/UIPlayer.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/UIPlayer.java index ce95223..48ff145 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/UIPlayer.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/UIPlayer.java @@ -8,7 +8,6 @@ import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; import com.github.javydreamercsw.tournament.manager.api.Variables; - import com.github.javydreamercsw.tournament.manager.api.standing.RecordInterface; /** @@ -66,7 +65,7 @@ public String getName() @Override public int getID() { - return getId(); + return id; } @Override @@ -99,14 +98,6 @@ public TournamentPlayerInterface createInstance(String name, int id) return createInstance(name, id, 0, 0, 0); } - /** - * @return the id - */ - public int getId() - { - return id; - } - @Override public void setName(String name) { diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/Encounter.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/Encounter.java index bfa98e9..babb269 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/Encounter.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/Encounter.java @@ -7,8 +7,6 @@ import java.util.logging.Level; import java.util.logging.Logger; -import com.github.javydreamercsw.tournament.manager.Team; - /** * Where to parties face off * @@ -16,7 +14,6 @@ */ public class Encounter { - private final Map results = new HashMap<>(); private final int id; @@ -46,23 +43,6 @@ public Encounter(int id, int format, TeamInterface team1, TeamInterface team2, this.format = format; } - /** - * Create an encounter between two players. - * - * @param id encounter id - * @param format encounter format - * @param team1 team 1 - * @param team2 team 2 - */ - public Encounter(int id, int format, TournamentPlayerInterface team1, - TournamentPlayerInterface team2) - { - results.put(new Team(team1), EncounterResult.UNDECIDED); - results.put(new Team(team2), EncounterResult.UNDECIDED); - this.id = id; - this.format = format; - } - public void updateResult(TeamInterface team, EncounterResult result) throws TournamentException { @@ -92,6 +72,7 @@ public void updateResult(TeamInterface team, p.getRecord().draw(); break; case NO_SHOW: + case FORFEIT: //Fall thru case LOSS: p.getRecord().loss(); @@ -156,11 +137,11 @@ public String toString() StringBuilder sb = new StringBuilder(); results.keySet().forEach((t) -> { - if (!sb.toString().isEmpty()) - { - sb.append(" vs. "); - } - sb.append(t.toString()); + if (!sb.toString().isEmpty()) + { + sb.append(" vs. "); + } + sb.append(t.toString()); }); return MessageFormat.format("Encounter {0} ({1})", id, sb.toString()); } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/EncounterResult.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/EncounterResult.java index 5ea1dc4..58b59c4 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/EncounterResult.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/EncounterResult.java @@ -6,5 +6,5 @@ */ public enum EncounterResult { - WIN, LOSS, DRAW, NO_SHOW, UNDECIDED; + WIN, LOSS, DRAW, NO_SHOW, FORFEIT, UNDECIDED; } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/NoShowListener.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/NoShowListener.java deleted file mode 100644 index 52b9f92..0000000 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/NoShowListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.javydreamercsw.tournament.manager.api; - -/** - * - * @author Javier A. Ortiz Bultron - */ -public interface NoShowListener { - - /** - * No show time is up! - */ - public void noshow(); -} diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/RoundTimeListener.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/RoundTimeListener.java deleted file mode 100644 index 062d78d..0000000 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/RoundTimeListener.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.javydreamercsw.tournament.manager.api; - -/** - * - * @author Javier A. Ortiz Bultron - */ -public interface RoundTimeListener { - - /** - * Round time is up! - */ - public void roundTimeOver(); -} diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TeamInterface.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TeamInterface.java index 2c7f761..f4d8020 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TeamInterface.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TeamInterface.java @@ -2,10 +2,10 @@ import java.util.List; -import de.gesundkrank.jskills.ITeam; - import com.github.javydreamercsw.tournament.manager.api.standing.RecordInterface; +import de.gesundkrank.jskills.ITeam; + /** * * @author Javier A. Ortiz Bultron @@ -30,6 +30,14 @@ public interface TeamInterface extends ITeam * @return true if found */ boolean hasMember(TournamentPlayerInterface member); + + /** + * Checks if a player is part of this team. + * + * @param memberId member id to look for. + * @return true if found + */ + boolean hasMember(int memberId); /** * Get the team's record. @@ -41,9 +49,18 @@ public interface TeamInterface extends ITeam /** * Create a team. * + * @param id Team id. * @param name Team name. * @param players Team members. * @return */ - TeamInterface createTeam(String name, List players); + TeamInterface createTeam(int id, String name, + List players); + + /** + * Get the team's id. + * + * @return ID for this team. + */ + public int getTeamId(); } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentInterface.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentInterface.java index db5fdad..06530c6 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentInterface.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentInterface.java @@ -6,7 +6,6 @@ import com.github.javydreamercsw.tournament.manager.Team; import com.github.javydreamercsw.tournament.manager.UIPlayer; - import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; /** @@ -14,250 +13,278 @@ * * @author Javier A. Ortiz Bultron */ -public interface TournamentInterface { - - /** - * Default BYE player. - */ - public final TeamInterface BYE = new Team(new UIPlayer("BYE", -1)); - - /** - * Get tournament name. - * - * @return tournament name - */ - public String getName(); - - /** - * Get the pairings for the current round. - * - * @return pairings for the current round. Null if there's a clear winner. - */ - public Map getPairings(); - - /** - * Get current round number. - * - * @return current round number - */ - public int getRound(); - - /** - * Get specific round. - * - * @param round round to look for - * @return round or null if not found. - */ - public Map getRound(int round); - - /** - * Get specific round. - * - * @param round round to look for - * @param encounters encounters to set to this round - */ - public void setRound(int round, Map encounters); - - /** - * Add player. - * - * @throws TournamentSignupException - * - * @param team TournamentPlayerInterface to add - */ - public void addTeam(TeamInterface team) - throws TournamentSignupException; - - /** - * Remove a player. - * - * @param team TournamentPlayerInterface to remove. - * @throws TournamentSignupException - * @throws TournamentException - */ - public void removeTeam(TeamInterface team) - throws TournamentSignupException, TournamentException; - - /** - * Advance the tournament to next round. - * - * @throws TournamentException if there can't be a next round. - */ - public void nextRound() throws TournamentException; - - /** - * Amount of active teams. - * - * @return active teams - */ - public int getAmountOfTeams(); - - /** - * Display pairings in text. - */ - public void showPairings(); - - /** - * Status of current round. - * - * @return true if complete (All encounters have a result) - */ - public boolean roundComplete(); - - /** - * Update results. - * - * @param encounterID encounter id to update results for - * @param team TournamentPlayerInterface - * @param result Encounter - * @throws TournamentException - */ - public void updateResults(int encounterID, - TeamInterface team, EncounterResult result) - throws TournamentException; - - /** - * Get the current rankings. - * - * @return current rankings - */ - public TreeMap> getRankings(); - - /** - * If no one drops, the amount of minimum rounds expected based on entries. - * - * @return amount of minimum rounds expected based on entries - */ - public int getMinimumAmountOfRounds(); - - /** - * Amount of points in the tournament. - * - * @param team player to get points from. - * @return points in the tournament - */ - public int getPoints(TeamInterface team); - - /** - * @return the winPoints - */ - public int getWinPoints(); - - /** - * @return the lossPoints - */ - public int getLossPoints(); - - /** - * @return the drawPoints - */ - public int getDrawPoints(); - - /** - * Get the winning team. - * - * @return winning team - */ - public TeamInterface getWinnerTeam(); - - /** - * Set the time allowed before no shows (milliseconds from pairings). - * - * @param time Date of no show. - */ - public void setNoShowTime(long time); - - /** - * Get the no show time. - * - * @return time allowed before no shows (milliseconds from pairings) - */ - public long getNoShowTime(); - - /** - * Set the time for the round to end (milliseconds from pairings). - * - * @param time round end time. - */ - public void setRoundTime(long time); - - /** - * Get the round time. - * - * @return time for the round to end (milliseconds from pairings) - */ - public long getRoundTime(); - - /** - * Add a no show listener. - * - * @param nsl no show listener - */ - public void addNoShowListener(NoShowListener nsl); - - /** - * Remove a no show listener. - * - * @param nsl no show listener - */ - public void removeNoShowListener(NoShowListener nsl); - - /** - * Add a round time listener. - * - * @param rtl round time listener - */ - public void addRoundTimeListener(RoundTimeListener rtl); - - /** - * Remove a round time listener. - * - * @param rtl round time listener - */ - public void removeRoundTimeListener(RoundTimeListener rtl); - - /** - * Check if the team has not been eliminated/dropped - * - * @param t team to check - * @return true if still active - */ - public boolean isTeamActive(TeamInterface t); - - /** - * List of teams still active. - * - * @return teams still active - */ - public List getActiveTeams(); - - /** - * Display rankings. - */ - public void displayRankings(); - - /** - * Return the ID for this tournament. - * - * @return ID for this tournament - */ - public int getId(); - - /** - * Set the ID for this tournament. - * - * @param id ID for this tournament - */ - public void setId(int id); - - /** - * Create a tournament. - * @param teams - * @param winPoints - * @param lossPoints - * @param drawPoints - * @return - */ - public TournamentInterface createTournament(List teams, - int winPoints, int lossPoints, int drawPoints); +public interface TournamentInterface +{ + + /** + * Default BYE player. + */ + public final TeamInterface BYE = new Team(-1, new UIPlayer("BYE", -1)); + + /** + * Get tournament name. + * + * @return tournament name + */ + public String getName(); + + /** + * Get the pairings for the current round. + * + * @return pairings for the current round. Null if there's a clear winner. + */ + public Map getPairings(); + + /** + * Get current round number. + * + * @return current round number + */ + public int getRound(); + + /** + * Get specific round. + * + * @param round round to look for + * @return round or null if not found. + */ + public Map getRound(int round); + + /** + * Get specific round. + * + * @param round round to look for + * @param encounters encounters to set to this round + */ + public void setRound(int round, Map encounters); + + /** + * Add teams. + * + * @throws TournamentSignupException + * + * @param teams Teams to add + */ + public void addTeams(List teams) + throws TournamentSignupException; + + /** + * Add team. + * + * @throws TournamentSignupException + * + * @param team TeamInterface to add + */ + public void addTeam(TeamInterface team) + throws TournamentSignupException; + + /** + * Remove a player. + * + * @param team TournamentPlayerInterface to remove. + * @throws TournamentSignupException + * @throws TournamentException + */ + public void removeTeam(TeamInterface team) + throws TournamentSignupException, TournamentException; + + /** + * Advance the tournament to next round. + * + * @throws TournamentException if there can't be a next round. + */ + public void nextRound() throws TournamentException; + + /** + * Amount of active teams. + * + * @return active teams + */ + public int getAmountOfTeams(); + + /** + * Display pairings in text. + */ + public void showPairings(); + + /** + * Status of current round. + * + * @return true if complete (All encounters have a result) + */ + public boolean roundComplete(); + + /** + * Update results. + * + * @param encounterID encounter id to update results for + * @param team TournamentPlayerInterface + * @param result Encounter + * @throws TournamentException + */ + public void updateResults(int encounterID, + TeamInterface team, EncounterResult result) + throws TournamentException; + + /** + * Get the current rankings. + * + * @return current rankings + */ + public TreeMap> getRankings(); + + /** + * If no one drops, the amount of minimum rounds expected based on entries. + * + * @return amount of minimum rounds expected based on entries + */ + public int getMinimumAmountOfRounds(); + + /** + * Amount of points in the tournament. + * + * @param team player to get points from. + * @return points in the tournament + */ + public int getPoints(TeamInterface team); + + /** + * @return the winPoints + */ + public int getWinPoints(); + + /** + * @return the lossPoints + */ + public int getLossPoints(); + + /** + * @return the drawPoints + */ + public int getDrawPoints(); + + /** + * Get the winning team. + * + * @return winning team + */ + public TeamInterface getWinnerTeam(); + + /** + * Set the time allowed before no shows (milliseconds from pairings). + * + * @param time Date of no show. + */ + public void setNoShowTime(long time); + + /** + * Get the no show time. + * + * @return time allowed before no shows (milliseconds from pairings) + */ + public long getNoShowTime(); + + /** + * Set the time for the round to end (milliseconds from pairings). + * + * @param time round end time. + */ + public void setRoundTime(long time); + + /** + * Get the round time. + * + * @return time for the round to end (milliseconds from pairings) + */ + public long getRoundTime(); + + /** + * Add a round time listener. + * + * @param tl round time listener + */ + public void addTournamentListener(TournamentListener tl); + + /** + * Remove a round time listener. + * + * @param tl round time listener + */ + public void removeTournamentListener(TournamentListener tl); + + /** + * Get listeners. + * + * @return Unmodifiable list of registered listeners. + */ + public List getListeners(); + + /** + * Check if the team has not been eliminated/dropped + * + * @param t team to check + * @return true if still active + */ + public boolean isTeamActive(TeamInterface t); + + /** + * List of teams still active. + * + * @return teams still active + */ + public List getActiveTeams(); + + /** + * Display rankings. + */ + public void displayRankings(); + + /** + * Return the ID for this tournament. + * + * @return ID for this tournament + */ + public int getId(); + + /** + * Set the ID for this tournament. + * + * @param id ID for this tournament + */ + public void setId(int id); + + /** + * Create a tournament. + * + * @param teams Teams to add + * @param winPoints Points per win + * @param lossPoints Poinst per loss + * @param drawPoints Points per draw + * @return Created tournament + * @throws TournamentSignupException if something goes wrong adding players. + */ + public TournamentInterface createTournament(List teams, + int winPoints, int lossPoints, int drawPoints) + throws TournamentSignupException; + + /** + * Get teams. + * + * @return Unmodifiable list of teams in this tournament. + */ + public List getTeams(); + + /** + * Process the round. Any eliminations and other changes to the pool of + * players must be done here. + * + * @param round Round to process. + */ + public void processRound(int round); + + /** + * Get the amount of non-wins to be eliminated from the tournament. + * @return amount of non-wins to be eliminated from the tournament + */ + public int getEliminations(); } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentListener.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentListener.java new file mode 100644 index 0000000..93545fe --- /dev/null +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/TournamentListener.java @@ -0,0 +1,31 @@ +package com.github.javydreamercsw.tournament.manager.api; + +/** + * + * @author Javier A. Ortiz Bultron + */ +public interface TournamentListener +{ + /** + * Round started! + * + * @param round Round number started. + */ + public void roundStart(int round); + + /** + * Round time is up! + */ + public void roundTimeOver(); + + /** + * Round ended. + * @param round Round number ended. + */ + public void roundOver(int round); + + /** + * No show time is up! + */ + public void noshow(); +} diff --git a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/standing/RankingProvider.java b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/standing/RankingProvider.java index ab61f15..cf8e7ea 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/standing/RankingProvider.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/tournament/manager/api/standing/RankingProvider.java @@ -9,11 +9,10 @@ public interface RankingProvider { /** - * Add a match into the rankings. + * Add teams into the rankings. * - * @param title Match title. * @param teams Teams participating on the match. * @throws java.lang.Exception */ - void addMatch(String title, TeamInterface... teams) throws Exception; + void addTeam(TeamInterface... teams) throws Exception; } diff --git a/TMCore/src/main/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProvider.java b/TMCore/src/main/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProvider.java index a9a76de..773c303 100644 --- a/TMCore/src/main/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProvider.java +++ b/TMCore/src/main/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProvider.java @@ -8,6 +8,10 @@ import org.openide.util.lookup.ServiceProvider; +import com.github.javydreamercsw.tournament.manager.api.TeamInterface; +import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; +import com.github.javydreamercsw.tournament.manager.api.standing.RankingProvider; + import de.gesundkrank.jskills.GameInfo; import de.gesundkrank.jskills.Player; import de.gesundkrank.jskills.SkillCalculator; @@ -16,11 +20,6 @@ import de.gesundkrank.jskills.trueskill.TwoPlayerTrueSkillCalculator; import de.gesundkrank.jskills.trueskill.TwoTeamTrueSkillCalculator; -import com.github.javydreamercsw.tournament.manager.api.TeamInterface; -import com.github.javydreamercsw.tournament.manager.api.TournamentPlayerInterface; - -import com.github.javydreamercsw.tournament.manager.api.standing.RankingProvider; - /** * * @author Javier A. Ortiz Bultron @@ -33,7 +32,7 @@ public class TrueSkillRankingProvider implements RankingProvider private SkillCalculator calculator; @Override - public void addMatch(String title, TeamInterface... teams) throws Exception + public void addTeam(TeamInterface... teams) throws Exception { for (TeamInterface team : teams) { diff --git a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTest.java b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTest.java index 29d9f14..e8dc8ac 100644 --- a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTest.java +++ b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTest.java @@ -14,12 +14,11 @@ import org.openide.util.Exceptions; import com.github.javydreamercsw.tournament.manager.api.EncounterResult; -import com.github.javydreamercsw.tournament.manager.api.NoShowListener; -import com.github.javydreamercsw.tournament.manager.api.RoundTimeListener; import com.github.javydreamercsw.tournament.manager.api.TeamInterface; import com.github.javydreamercsw.tournament.manager.api.TournamentException; import com.github.javydreamercsw.tournament.manager.api.TournamentInterface; import com.github.javydreamercsw.tournament.manager.signup.TournamentSignupException; +import com.github.javydreamercsw.tournament.manager.api.TournamentListener; /** * @@ -59,7 +58,7 @@ public void testGetRound() public void testAddPlayer() { System.out.println("addPlayer"); - TeamInterface team = new Team(new UIPlayer("Test", 1)); + TeamInterface team = new Team(1, new UIPlayer("Test", 1)); AbstractTournament instance = new AbstractTournamentImpl(); try { @@ -89,7 +88,7 @@ public void testAddPlayer() public void testRemovePlayer() { System.out.println("removePlayer"); - TeamInterface team = new Team(new UIPlayer("Test", 0)); + TeamInterface team = new Team(2, new UIPlayer("Test", 2)); AbstractTournament instance = new AbstractTournamentImpl(); boolean failure = false; try @@ -230,25 +229,13 @@ public long getRoundTime() } @Override - public void addNoShowListener(NoShowListener nsl) + public void addTournamentListener(TournamentListener rtl) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override - public void removeNoShowListener(NoShowListener nsl) - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void addRoundTimeListener(RoundTimeListener rtl) - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public void removeRoundTimeListener(RoundTimeListener rtl) + public void removeTournamentListener(TournamentListener rtl) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } diff --git a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTester.java b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTester.java index f74c853..3eea2b2 100644 --- a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTester.java +++ b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/AbstractTournamentTester.java @@ -3,6 +3,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; import java.text.MessageFormat; import java.util.ArrayList; @@ -73,7 +74,7 @@ public void testGetPairings() throws TournamentSignupException { try { - tournament.addTeam(new Team(new UIPlayer(MessageFormat + tournament.addTeam(new Team(i, new UIPlayer(MessageFormat .format("Player #{0}", i), i))); } catch (TournamentSignupException ex) @@ -137,7 +138,7 @@ public void testGetPairings() throws TournamentSignupException { try { - tournament.addTeam(new Team(new UIPlayer(MessageFormat.format("Player #{0}", i), i))); + tournament.addTeam(new Team(i, new UIPlayer(MessageFormat.format("Player #{0}", i), i))); } catch (TournamentSignupException ex) { @@ -220,7 +221,7 @@ public void testSimulateTournament() { try { - tournament.addTeam(new Team( + tournament.addTeam(new Team(y, new UIPlayer(MessageFormat.format("Player #{0}", (y + 1)), y))); } catch (TournamentSignupException ex) @@ -236,6 +237,28 @@ public void testSimulateTournament() boolean ignore = false; while (tournament.getAmountOfTeams() > 1) { + //Random player drop + if (tournament.getActiveTeams().size() > 1 && random.nextBoolean()) + { + TeamInterface toDrop + = tournament.getActiveTeams().get(random + .nextInt(tournament.getAmountOfTeams())); + LOG.log(Level.INFO, "Player: {0} dropped!", toDrop.toString()); + try + { + tournament.removeTeam(toDrop); + } + catch (TournamentSignupException ex) + { + LOG.log(Level.SEVERE, null, ex); + fail(); + } + catch (TournamentException ex) + { + LOG.log(Level.SEVERE, null, ex); + fail(); + } + } try { tournament.nextRound(); @@ -269,7 +292,7 @@ public void testSimulateTournament() EncounterResult.values()[result]); } if (player1.equals(TournamentInterface.BYE) - || player2.equals(TournamentInterface.BYE) + || player2.equals(TournamentInterface.BYE) && tournament.getActiveTeams().size() == 1) { //Only one player left, we got a winner! @@ -284,28 +307,6 @@ public void testSimulateTournament() LOG.log(Level.SEVERE, null, ex); fail(); } - //Random player drop - if (tournament.getActiveTeams().size() > 1 && random.nextBoolean()) - { - TeamInterface toDrop - = tournament.getActiveTeams().get(random - .nextInt(tournament.getAmountOfTeams())); - LOG.log(Level.INFO, "Player: {0} dropped!", toDrop.toString()); - try - { - tournament.removeTeam(toDrop); - } - catch (TournamentSignupException ex) - { - LOG.log(Level.SEVERE, null, ex); - fail(); - } - catch (TournamentException ex) - { - LOG.log(Level.SEVERE, null, ex); - fail(); - } - } } if (!ignore) { @@ -354,9 +355,4 @@ public void testSimulateTournament() * @return */ public abstract TournamentInterface generateRandomTournament(); - - private void fail() - { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } } diff --git a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/EncounterTest.java b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/EncounterTest.java index 808dd74..cbc1102 100644 --- a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/EncounterTest.java +++ b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/EncounterTest.java @@ -29,8 +29,8 @@ public void testUpdateResult() try { System.out.println("updateResult"); - TeamInterface team1 = new Team(new UIPlayer("Player 1", 1)); - TeamInterface team2 = new Team(new UIPlayer("Player 2", 2)); + TeamInterface team1 = new Team(1, new UIPlayer("Player 1", 1)); + TeamInterface team2 = new Team(2, new UIPlayer("Player 2", 2)); Encounter instance = new Encounter(1, 1, team1, team2); instance.updateResult(team1, EncounterResult.WIN); instance.updateResult(team2, EncounterResult.LOSS); diff --git a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/TeamTest.java b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/TeamTest.java index 58d1e8b..d073c6a 100644 --- a/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/TeamTest.java +++ b/TMCore/src/test/java/com/github/javydreamercsw/tournament/manager/TeamTest.java @@ -23,10 +23,10 @@ public class TeamTest public void testGetTeamMembers() { System.out.println("getTeamMembers"); - Team instance = new Team(new UIPlayer("Test", 1)); + Team instance = new Team(1, new UIPlayer("Test", 1)); List result = instance.getTeamMembers(); assertEquals(1, result.size()); - instance = new Team(Arrays.asList(new UIPlayer("Test", 1), + instance = new Team(2, Arrays.asList(new UIPlayer("Test", 1), new UIPlayer("Player 2", 2))); result = instance.getTeamMembers(); assertEquals(2, result.size()); diff --git a/TMCore/src/test/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProviderNGTest.java b/TMCore/src/test/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProviderNGTest.java index d3ef0f8..3d5144b 100644 --- a/TMCore/src/test/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProviderNGTest.java +++ b/TMCore/src/test/java/com/github/javydreamercsw/trueskill/TrueSkillRankingProviderNGTest.java @@ -37,7 +37,7 @@ public TrueSkillRankingProviderNGTest() } /** - * Test of addMatch method, of class TrueSkillRankingProvider. + * Test of addTeam method, of class TrueSkillRankingProvider. * * @throws java.lang.Exception */ @@ -50,9 +50,9 @@ public void testMatch() throws Exception UIPlayer p2 = new UIPlayer("Player 2", ++playerCount); TeamInterface[] teams = new TeamInterface[] { - new Team(p1), new Team(p2) + new Team(1, p1), new Team(2, p2) }; - instance.addMatch("Test Match", teams); + instance.addTeam(teams); TrueSkillRankingProvider p = (TrueSkillRankingProvider) instance; List teamList = p.getTeamList(); assertEquals(teamList.size(), playerCount); @@ -79,10 +79,10 @@ public void testMatch() throws Exception UIPlayer p4 = new UIPlayer("Player 4", ++playerCount); teams = new TeamInterface[] { - new Team(p3), new Team(p4) + new Team(3, p3), new Team(4, p4) }; - instance.addMatch("Test Match 2", teams); + instance.addTeam(teams); teamList = p.getTeamList(); @@ -107,10 +107,10 @@ public void testMatch() throws Exception teams = new TeamInterface[] { - new Team(p1), new Team(p2), new Team(p3), new Team(p4) + new Team(1, p1), new Team(2, p2), new Team(3, p3), new Team(4, p4) }; - instance.addMatch("Test Match 3", teams); + instance.addTeam(teams); teamList = p.getTeamList(); diff --git a/TournamentManagerWeb/pom.xml b/TournamentManagerWeb/pom.xml index 86d67cf..e7c94b6 100755 --- a/TournamentManagerWeb/pom.xml +++ b/TournamentManagerWeb/pom.xml @@ -23,7 +23,7 @@ UTF-8 UTF-8 false - 11.0.1 + 12.0.3 9.4.11.v20180605 @@ -114,17 +114,13 @@ ${testng.version} test - + ${project.groupId} MTG ${project.version} - - org.vaadin.maxime - markdown-area - 1.0.2 - + mysql diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/MainLayout.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/MainLayout.java index 52ed6ea..bf3e2e3 100755 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/MainLayout.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/MainLayout.java @@ -27,6 +27,7 @@ import com.github.javydreamercsw.tournament.manager.ui.views.formatlist.FormatList; import com.github.javydreamercsw.tournament.manager.ui.views.matchlist.MatchList; import com.github.javydreamercsw.tournament.manager.ui.views.playerlist.PlayerList; +import com.github.javydreamercsw.tournament.manager.ui.views.rankings.RankingList; import com.github.javydreamercsw.tournament.manager.ui.views.tournamentlist.TournamentList; import com.github.javydreamercsw.tournament.manager.ui.views.welcome.Welcome; import com.vaadin.flow.component.Component; @@ -82,10 +83,15 @@ public MainLayout() throws NamingException RouterLink players = new RouterLink(null, PlayerList.class); players.add(new Icon(VaadinIcon.USERS), new Text("Players")); players.addClassName("main-layout__nav-item"); + + RouterLink rankings = new RouterLink(null, RankingList.class); + rankings.add(new Icon(VaadinIcon.TABLE), new Text("Rankings")); + rankings.addClassName("main-layout__nav-item"); List components = new ArrayList<>(); components.add(welcome); components.add(players); + components.add(rankings); if (demo) { diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/FormatLabelGenerator.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/FormatLabelGenerator.java new file mode 100644 index 0000000..2c3ff5b --- /dev/null +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/FormatLabelGenerator.java @@ -0,0 +1,15 @@ +package com.github.javydreamercsw.tournament.manager.ui.common; + +import com.github.javydreamercsw.database.storage.db.Format; +import com.vaadin.flow.component.ItemLabelGenerator; + +public class FormatLabelGenerator implements ItemLabelGenerator +{ + private static final long serialVersionUID = -738603579674658479L; + + @Override + public String apply(Format f) + { + return f.getName(); + } +} diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchResultTypeLabelGenerator.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/MatchResultTypeLabelGenerator.java similarity index 87% rename from TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchResultTypeLabelGenerator.java rename to TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/MatchResultTypeLabelGenerator.java index 02af836..7a86c28 100644 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchResultTypeLabelGenerator.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/MatchResultTypeLabelGenerator.java @@ -1,4 +1,4 @@ -package com.github.javydreamercsw.tournament.manager.ui.views.matchlist; +package com.github.javydreamercsw.tournament.manager.ui.common; import org.openide.util.NbBundle; diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/TournamentFormatLabelGenerator.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/TournamentFormatLabelGenerator.java new file mode 100644 index 0000000..cd0b8d4 --- /dev/null +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/common/TournamentFormatLabelGenerator.java @@ -0,0 +1,16 @@ +package com.github.javydreamercsw.tournament.manager.ui.common; + +import com.github.javydreamercsw.database.storage.db.TournamentFormat; +import com.vaadin.flow.component.ItemLabelGenerator; + +public class TournamentFormatLabelGenerator + implements ItemLabelGenerator +{ + private static final long serialVersionUID = -738603579674658479L; + + @Override + public String apply(TournamentFormat f) + { + return f.getFormatName(); + } +} diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchEditorDialog.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchEditorDialog.java index bc71273..bc9d70d 100644 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchEditorDialog.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/MatchEditorDialog.java @@ -15,6 +15,8 @@ */ package com.github.javydreamercsw.tournament.manager.ui.views.matchlist; +import com.github.javydreamercsw.tournament.manager.ui.common.FormatLabelGenerator; + import static com.github.javydreamercsw.tournament.manager.ui.views.TMView.CURRENT_GAME; import java.util.List; @@ -126,21 +128,12 @@ private void addFormat() .getAttribute(CURRENT_GAME)); cb.setLabel("Select a Format: "); - cb.setDataProvider(new ListDataProvider(formats)); + cb.setDataProvider(new ListDataProvider<>(formats)); cb.setItemLabelGenerator(new FormatLabelGenerator()); cb.setRequired(true); cb.setPreventInvalidInput(true); cb.setAllowCustomValue(false); - cb.addValueChangeListener(new ValueChangeListener() - { - private static final long serialVersionUID = 5377566605252849942L; - - @Override - public void valueChanged(ValueChangeEvent e) - { - validate(); - } - }); + cb.addValueChangeListener(listener -> validate()); getBinder().forField(cb).bind(MatchEntry::getFormat, MatchEntry::setFormat); @@ -202,8 +195,8 @@ private void addRanked() { if (mht.getMatchResult() != null) { - mht.getMatchResult().setRanked(ranked.getValue()); - MatchService.getInstance().updateResult(mht.getMatchResult()); + MatchService.getInstance().setRanked(getCurrentItem(), + ranked.getValue()); } } catch (Exception ex) diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/ResultForm.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/ResultForm.java index 5b3dedb..71272be 100644 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/ResultForm.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/matchlist/ResultForm.java @@ -1,5 +1,7 @@ package com.github.javydreamercsw.tournament.manager.ui.views.matchlist; +import com.github.javydreamercsw.tournament.manager.ui.common.MatchResultTypeLabelGenerator; + import org.openide.util.Exceptions; import com.github.javydreamercsw.database.storage.db.MatchEntry; @@ -33,7 +35,7 @@ public ResultForm(MatchList ml,Dialog dialog, MatchEntry me) resultGrid.addColumn(new ComponentRenderer<>((mht) -> { ComboBox cb = new ComboBox<>(); - cb.setDataProvider(new ListDataProvider(MatchService.getInstance().getResultTypes())); + cb.setDataProvider(new ListDataProvider<>(MatchService.getInstance().getResultTypes())); cb.setItemLabelGenerator(new MatchResultTypeLabelGenerator()); cb.setRequired(true); cb.setPreventInvalidInput(true); diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/rankings/RankingList.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/rankings/RankingList.java new file mode 100644 index 0000000..9a4d0d6 --- /dev/null +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/rankings/RankingList.java @@ -0,0 +1,90 @@ +package com.github.javydreamercsw.tournament.manager.ui.views.rankings; + +import static com.github.javydreamercsw.tournament.manager.ui.views.TMView.CURRENT_GAME; + +import java.util.List; + +import com.github.javydreamercsw.database.storage.db.Format; +import com.github.javydreamercsw.database.storage.db.TeamHasFormatRecord; +import com.github.javydreamercsw.database.storage.db.server.FormatService; +import com.github.javydreamercsw.tournament.manager.ui.MainLayout; +import com.github.javydreamercsw.tournament.manager.ui.common.FormatLabelGenerator; +import com.github.javydreamercsw.tournament.manager.ui.views.TMView; +import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.grid.Grid.SelectionMode; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.data.provider.ListDataProvider; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.VaadinService; + +/** + * Displays the list of rankings. + */ +@Route(value = "rankings", layout = MainLayout.class) +@PageTitle("Rankings") +public class RankingList extends TMView +{ + private static final long serialVersionUID = 495427102994660040L; + private final ComboBox format = new ComboBox<>("Format"); + private final Grid rankings = new Grid<>(); + private int index = 0; + + public RankingList() + { + VerticalLayout container = new VerticalLayout(); + // Add the top menu + HorizontalLayout header = new HorizontalLayout(); + + // Add the format selector + List formats = FormatService.getInstance().findFormatByGame( + (String) VaadinService.getCurrentRequest().getWrappedSession() + .getAttribute(CURRENT_GAME)); + + format.setDataProvider(new ListDataProvider<>(formats)); + format.setItemLabelGenerator(new FormatLabelGenerator()); + format.setRequired(true); + format.setPreventInvalidInput(true); + format.setAllowCustomValue(false); + format.addValueChangeListener(event -> updateView()); + format.setValue(formats.get(0)); + + header.add(format); + + rankings.addColumn(this::getRowIndex).setWidth("2em") + .setResizable(true); + rankings.addColumn(this::getTeam).setHeader("Team").setWidth("8em") + .setResizable(true); + rankings.addColumn(TeamHasFormatRecord::getPoints).setHeader("Points") + .setWidth("6em"); + rankings.setSelectionMode(SelectionMode.NONE); + + container.add(header, rankings); + add(container); + } + + private String getRowIndex(TeamHasFormatRecord thfr) + { + index++; + return String.valueOf(index); + } + + private String getTeam(TeamHasFormatRecord thfr) + { + return thfr.getTeam().getName(); + } + + @Override + public void updateView() + { + //Update rankings based on format + Format f = format.getValue(); + if (f != null) + { + // Get all the rankings for this format. + rankings.setItems(f.getTeamHasFormatRecordList()); + } + } +} diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentEditorDialog.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentEditorDialog.java index f1a4102..ad8b416 100644 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentEditorDialog.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentEditorDialog.java @@ -15,15 +15,28 @@ */ package com.github.javydreamercsw.tournament.manager.ui.views.tournamentlist; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; import com.github.javydreamercsw.database.storage.db.Format; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentFormat; import com.github.javydreamercsw.database.storage.db.server.TournamentService; import com.github.javydreamercsw.tournament.manager.ui.common.AbstractEditorDialog; +import com.github.javydreamercsw.tournament.manager.ui.common.TournamentFormatLabelGenerator; +import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.textfield.TextField; +import com.vaadin.flow.data.binder.Result; +import com.vaadin.flow.data.binder.ValueContext; +import com.vaadin.flow.data.converter.Converter; import com.vaadin.flow.data.converter.StringToIntegerConverter; +import com.vaadin.flow.data.provider.ListDataProvider; import com.vaadin.flow.data.validator.StringLengthValidator; /** @@ -36,6 +49,10 @@ public class TournamentEditorDialog extends AbstractEditorDialog private final TextField winPoints = new TextField("Points per win"); private final TextField lossPoints = new TextField("Points per loss"); private final TextField drawPoints = new TextField("Points per draw"); + private final ComboBox format = new ComboBox<>("Format"); + private final DatePicker signups = new DatePicker(); + private final ComboBox dateHour = new ComboBox<>(); + private final ComboBox dateMin = new ComboBox<>(); public TournamentEditorDialog(BiConsumer itemSaver, Consumer itemDeleter) @@ -46,6 +63,8 @@ public TournamentEditorDialog(BiConsumer itemSaver, addNameWinPoints(); addNameLossPoints(); addNameDrawPoints(); + addTournamentFormat(); + addSettings(); } @Override @@ -54,6 +73,100 @@ protected void confirmDelete() doDelete(getCurrentItem()); } + private void addSettings() + { + List minutes = new ArrayList<>(); + for (int i = 1; i <= 60; i++) + { + minutes.add(i); + } + + LocalDateTime now = LocalDateTime.now(); + + dateHour.setPlaceholder("Hour"); + dateHour.setDataProvider(new ListDataProvider<>(minutes.subList(0, 24))); + if (getCurrentItem() != null) + { + dateHour.setValue(getCurrentItem().getSignupDate() == null ? null + : getCurrentItem().getSignupDate().getHour()); + } + dateHour.addValueChangeListener(event -> + { + updateSignupDate(); + }); + + dateMin.setPlaceholder("Minutes"); + dateMin.setDataProvider(new ListDataProvider<>(minutes)); + if (getCurrentItem() != null) + { + dateMin.setValue(getCurrentItem().getSignupDate() == null ? null + : getCurrentItem().getSignupDate().getMinute()); + } + dateMin.addValueChangeListener(event -> + { + updateSignupDate(); + }); + + signups.setMin(now.toLocalDate()); + signups.setPlaceholder("Date signups open."); + if (getCurrentItem() != null) + { + signups.setValue(getCurrentItem().getSignupDate() == null ? null + : getCurrentItem().getSignupDate().toLocalDate()); + } + getFormLayout().add(signups); + getFormLayout().add(dateHour); + getFormLayout().add(dateMin); + signups.addValueChangeListener(event -> + { + updateSignupDate(); + }); + getBinder().forField(signups) + .withConverter(new Converter() + { + private static final long serialVersionUID = -4231752474899375998L; + + @Override + public Result convertToModel(LocalDate value, ValueContext context) + { + LocalTime lt + = LocalTime.of(dateHour.getValue() == null ? 0 + : dateHour.getValue(), + dateMin.getValue() == null ? 0 + : dateMin.getValue()); + return Result.ok(LocalDateTime.of(value, lt)); + } + + @Override + public LocalDate convertToPresentation(LocalDateTime value, ValueContext context) + { + if (value != null) + { + dateHour.setValue(value.getHour()); + dateMin.setValue(value.getMinute()); + } + return value == null ? null : value.toLocalDate(); + } + }) + .bind(Tournament::getSignupDate, Tournament::setSignupDate); + + ComboBox signupLength = new ComboBox<>(); + signupLength.setPlaceholder("Signup time limit."); + signupLength.setDataProvider(new ListDataProvider<>(minutes)); + + getFormLayout().add(signupLength); + getBinder().forField(signupLength) + .bind(Tournament::getSignupTimeLimit, Tournament::setSignupTimeLimit); + + ComboBox roundLength = new ComboBox<>(); + roundLength.setPlaceholder("Round time limit."); + roundLength.setDataProvider(new ListDataProvider<>(minutes)); + + getFormLayout().add(roundLength); + getBinder().forField(roundLength) + .bind(Tournament::getRoundTimeLimit, Tournament::setRoundTimeLimit); + } + private void addNameField() { getFormLayout().add(tournamentNameField); @@ -63,8 +176,23 @@ private void addNameField() .withValidator(new StringLengthValidator( "Tournament name must contain at least 3 printable characters", 3, null)) - .withValidator(name -> TournamentService.getInstance() - .findTournaments(name).isEmpty(), + .withValidator(name -> + { + boolean valid = true; + for (Tournament t + : TournamentService.getInstance().findTournaments(name)) + { + if (t.getName().equals(name) + && !t.getTournamentPK() + .equals(getCurrentItem().getTournamentPK())) + { + // Same name with different id. + valid = false; + break; + } + } + return valid; + }, "Tournament name must be unique") .bind(Tournament::getName, Tournament::setName); } @@ -73,6 +201,8 @@ private void addNameWinPoints() { getFormLayout().add(winPoints); + winPoints.addValueChangeListener(listener -> validate()); + getBinder().forField(winPoints) .withConverter( new StringToIntegerConverter("Must enter a number")) @@ -81,7 +211,9 @@ private void addNameWinPoints() private void addNameLossPoints() { - getFormLayout().add(lossPoints); + getFormLayout().add(lossPoints); + + lossPoints.addValueChangeListener(listener -> validate()); getBinder().forField(lossPoints) .withConverter( @@ -93,9 +225,79 @@ private void addNameDrawPoints() { getFormLayout().add(drawPoints); + drawPoints.addValueChangeListener(listener -> validate()); + getBinder().forField(drawPoints) .withConverter( new StringToIntegerConverter("Must enter a number")) .bind(Tournament::getDrawPoints, Tournament::setDrawPoints); } + + private void addTournamentFormat() + { + getFormLayout().add(format); + + List formats = new ArrayList<>(); + formats.addAll(TournamentService.getInstance().getFormats()); + + format.setDataProvider(new ListDataProvider<>(formats)); + format.setItemLabelGenerator(new TournamentFormatLabelGenerator()); + format.setRequired(true); + format.setPreventInvalidInput(true); + format.setAllowCustomValue(false); + format.addValueChangeListener(listener -> validate()); + + format.setEnabled(formats.size() > 1); + if (formats.size() == 1) + { + // Select the only option + format.setValue(formats.get(0)); + } + + getBinder().forField(format) + .bind(Tournament::getTournamentFormat, + Tournament::setTournamentFormat); + } + + @Override + protected boolean isValid() + { + if (getCurrentItem().getTournamentFormat() == null) + { + // No format + return false; + } + if (getCurrentItem().getWinPoints() <= getCurrentItem().getLossPoints() + || getCurrentItem().getWinPoints() <= getCurrentItem().getDrawPoints()) + { + // Win points are less than loss and/or draw. + return false; + } + +// if (getCurrentItem().getNoShowTimeLimit() == null +// || (getCurrentItem().getNoShowTimeLimit().getHour() +// + getCurrentItem().getNoShowTimeLimit().getMinute() == 0)) +// { +// // Must be valid +// return false; +// } + // All are zero + return getCurrentItem().getDrawPoints() + getCurrentItem().getLossPoints() + + getCurrentItem().getWinPoints() > 0; + } + + private void updateSignupDate() + { +// if (signups.getValue() != null +// && dateHour.getValue() != null +// && dateMin.getValue() != null) +// { +// LocalDateTime ldt = LocalDateTime.of(signups.getValue().getYear(), +// signups.getValue().getMonthValue(), +// signups.getValue().getDayOfMonth(), +// dateHour.getValue(), dateMin.getValue()); +// System.out.println("New Date: " + ldt); +// getCurrentItem().setSignupDate(ldt); +// } + } } diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentList.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentList.java index be5d5d5..7c9f135 100644 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentList.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentList.java @@ -20,7 +20,10 @@ import org.openide.util.Exceptions; import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.IllegalOrphanException; +import com.github.javydreamercsw.database.storage.db.controller.exceptions.NonexistentEntityException; import com.github.javydreamercsw.database.storage.db.server.TournamentService; +import com.github.javydreamercsw.tournament.manager.api.TournamentException; import com.github.javydreamercsw.tournament.manager.ui.MainLayout; import com.github.javydreamercsw.tournament.manager.ui.common.AbstractEditorDialog; import com.github.javydreamercsw.tournament.manager.ui.views.TMView; @@ -89,17 +92,22 @@ private void addSearchBar() viewToolbar.add(searchField, newButton); add(viewToolbar); } - + private String getRoundCount(Tournament t) { return Integer.toString(t.getRoundList().size()); } - + private String getTeamCount(Tournament t) { return Integer.toString(t.getTournamentHasTeamList().size()); } + private String getFormat(Tournament t) + { + return t.getTournamentFormat().getFormatName(); + } + private void addContent() { VerticalLayout container = new VerticalLayout(); @@ -112,21 +120,63 @@ private void addContent() .setWidth("6em"); grid.addColumn(this::getTeamCount).setHeader("Teams") .setWidth("6em"); + grid.addColumn(this::getFormat).setHeader("Format") + .setWidth("6em"); grid.addColumn(new ComponentRenderer<>(this::createEditButton)) .setFlexGrow(0); + grid.addColumn(new ComponentRenderer<>(this::createControlButton)) + .setFlexGrow(0); grid.setSelectionMode(SelectionMode.NONE); container.add(header, grid); add(container); } - private Button createEditButton(Tournament category) + private Button createControlButton(Tournament tournament) { - Button edit = new Button("Edit", event -> form.open(category, + if (TournamentService.getInstance().hasStarted(tournament)) + { + Button view = new Button("Manage", event -> + { + TournamentManager tm = new TournamentManager(tournament); + tm.open(); + }); + view.setIcon(new Icon("lumo", "view")); + view.addClassName("tournament__view"); + view.getElement().setAttribute("theme", "tertiary"); + return view; + } + else + { + Button start = new Button("Start", event -> + { + try + { + TournamentService.getInstance().startTournament(tournament); + } + catch (TournamentException ex) + { + Exceptions.printStackTrace(ex); + Notification.show( + "Unable to start tournament!", + 3000, Position.BOTTOM_START); + } + }); + start.setIcon(new Icon("lumo", "start")); + start.addClassName("tournament__start"); + start.getElement().setAttribute("theme", "tertiary"); + return start; + } + } + + private Button createEditButton(Tournament tournament) + { + Button edit = new Button("Edit", event -> form.open(tournament, AbstractEditorDialog.Operation.EDIT)); edit.setIcon(new Icon("lumo", "edit")); edit.addClassName("tournament__edit"); edit.getElement().setAttribute("theme", "tertiary"); + edit.setEnabled(!TournamentService.getInstance().hasStarted(tournament)); return edit; } @@ -153,7 +203,7 @@ private void saveTournament(Tournament t, try { TournamentService.getInstance().saveTournament(t); - + Notification.show( "Tournament successfully " + operation.getNameInText() + "ed.", 3000, Position.BOTTOM_START); @@ -167,10 +217,7 @@ private void saveTournament(Tournament t, private void deleteTournament(Tournament t) { - List matchesInCategory = TournamentService.getInstance() - .findTournament(t.getId()); - - if (matchesInCategory.isEmpty()) + if (TournamentService.getInstance().findTournament(t.getTournamentPK()) != null) { try { @@ -180,7 +227,7 @@ private void deleteTournament(Tournament t) Position.BOTTOM_START); updateView(); } - catch (Exception ex) + catch (IllegalOrphanException | NonexistentEntityException ex) { Exceptions.printStackTrace(ex); } diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentManager.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentManager.java new file mode 100644 index 0000000..15dc26e --- /dev/null +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/tournamentlist/TournamentManager.java @@ -0,0 +1,51 @@ +package com.github.javydreamercsw.tournament.manager.ui.views.tournamentlist; + +import java.util.ArrayList; +import java.util.List; + +import com.github.javydreamercsw.database.storage.db.Tournament; +import com.github.javydreamercsw.database.storage.db.TournamentPK; +import com.github.javydreamercsw.database.storage.db.server.TournamentService; +import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.dialog.Dialog; +import com.vaadin.flow.component.html.Label; +import com.vaadin.flow.component.html.NativeButton; +import com.vaadin.flow.data.provider.ListDataProvider; + +public class TournamentManager extends Dialog +{ + private static final long serialVersionUID = -9151481749063166946L; + private final TournamentPK id; + private final Label title; + private final ComboBox cb = new ComboBox<>("Round"); + + public TournamentManager(Tournament tournament) + { + this.id = tournament.getTournamentPK(); + setSizeFull(); + setCloseOnEsc(true); + setCloseOnOutsideClick(false); + title = new Label("Tournament: " + tournament.getName()); + add(title); + cb.addValueChangeListener(listener -> update()); + add(cb); + + NativeButton closeButton = new NativeButton("Close", event -> + { + close(); + }); + add(closeButton); + } + + private void update() + { + Tournament t = TournamentService.getInstance().findTournament(id); + List rounds = new ArrayList<>(); + for (int i = 1; i <= t.getRoundList().size(); i++) + { + rounds.add(i); + } + cb.setDataProvider(new ListDataProvider<>(rounds)); + cb.setValue(t.getRoundList().size()); + } +} diff --git a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/welcome/Welcome.java b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/welcome/Welcome.java index 6071cc1..6fe3060 100644 --- a/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/welcome/Welcome.java +++ b/TournamentManagerWeb/src/main/java/com/github/javydreamercsw/tournament/manager/ui/views/welcome/Welcome.java @@ -2,20 +2,14 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; import javax.naming.InitialContext; import javax.naming.NamingException; import org.openide.util.Exceptions; import org.openide.util.Lookup; -import org.vaadin.maxime.MarkdownArea; -import com.github.javydreamercsw.database.storage.db.Format; -import com.github.javydreamercsw.database.storage.db.Game; import com.github.javydreamercsw.database.storage.db.server.DataBaseManager; -import com.github.javydreamercsw.database.storage.db.server.FormatService; -import com.github.javydreamercsw.database.storage.db.server.GameService; import com.github.javydreamercsw.database.storage.db.server.PlayerService; import com.github.javydreamercsw.tournament.manager.api.IGame; import com.github.javydreamercsw.tournament.manager.ui.MainLayout; @@ -26,6 +20,7 @@ import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.notification.Notification.Position; +import com.vaadin.flow.component.textfield.TextArea; import com.vaadin.flow.data.provider.ListDataProvider; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; @@ -35,23 +30,66 @@ public class Welcome extends TMView { private static final long serialVersionUID = 1252548231807630022L; - private static boolean demo = false; - + static { try { InitialContext context = new InitialContext(); - + String JNDIDB = (String) context .lookup("java:comp/env/tm/JNDIDB"); - + DataBaseManager.setPersistenceUnitName(JNDIDB); - demo = (Boolean) context + boolean demo = (Boolean) context .lookup("java:comp/env/tm/demo"); + + // Check if it's configured for demo + if (demo && PlayerService.getInstance().getAll().isEmpty()) + { + try + { + Notification.show( + "Loading demo data...", + 3000, Position.MIDDLE); + + DataBaseManager.loadDemoData(); + + Notification.show( + "Loading demo data done!", + 3000, Position.MIDDLE); + } + catch (Exception ex) + { + Notification.show( + "Error loading demo data!", + 3000, Position.MIDDLE); + Exceptions.printStackTrace(ex); + } + } + else + { + try + { + DataBaseManager.load(); + } + catch (Exception ex) + { + Notification.show( + "Error loading demo data!", + 3000, Position.MIDDLE); + Exceptions.printStackTrace(ex); + } + Notification.show( + "Loading data done!", + 3000, Position.MIDDLE); + } } catch (NamingException ex) { + Notification.show( + "Error loading demo data!", + 3000, Position.MIDDLE); Exceptions.printStackTrace(ex); } } @@ -60,12 +98,12 @@ public Welcome() { addClassName("welcome-list"); setDefaultHorizontalComponentAlignment(Alignment.STRETCH); - MarkdownArea mda = new MarkdownArea("Hello world !"); + TextArea mda = new TextArea("Hello world !"); List games = new ArrayList<>(); games.addAll(Lookup.getDefault().lookupAll(IGame.class)); ComboBox cb = new ComboBox<>(); cb.setLabel("Select a Game: "); - cb.setDataProvider(new ListDataProvider(games)); + cb.setDataProvider(new ListDataProvider<>(games)); cb.setItemLabelGenerator(new GameLabelGenerator()); cb.addValueChangeListener(new ValueChangeListener() { @@ -75,72 +113,7 @@ public Welcome() public void valueChanged(ValueChangeEvent e) { IGame gameAPI = cb.getValue(); - // Update everything to the new game. - - // Add game to DB if not there - Optional result - = GameService.getInstance().findGameByName(gameAPI.getName()); - - Game game; - if (result.isPresent()) - { - game = result.get(); - } - else - { - game = new Game(gameAPI.getName()); - GameService.getInstance().saveGame(game); - } - - //Load formats - gameAPI.gameFormats().forEach(format -> - { - // Check if it exists in the databse - Optional f - = FormatService.getInstance() - .findFormatForGame(gameAPI.getName(), format.getName()); - if (!f.isPresent()) - { - try - { - // Let's create it. - Format newFormat = new Format(); - newFormat.setName(format.getName()); - newFormat.setDescription(format.getDescription()); - newFormat.setGame(game); - FormatService.getInstance().saveFormat(newFormat); - } - catch (Exception ex) - { - Exceptions.printStackTrace(ex); - } - } - }); saveValue(CURRENT_GAME, gameAPI.getName()); - - // Check if it's configured for demo - if (demo && PlayerService.getInstance().getAll().isEmpty()) - { - try - { - Notification.show( - "Loading demo data...", - 3000, Position.MIDDLE); - - DataBaseManager.loadDemoData(); - - Notification.show( - "Loading demo data done!", - 3000, Position.MIDDLE); - } - catch (Exception ex) - { - Notification.show( - "Error loading demo data!", - 3000, Position.MIDDLE); - Exceptions.printStackTrace(ex); - } - } } }); cb.setEnabled(games.size() > 1); diff --git a/pom.xml b/pom.xml index f0b6d94..d584fca 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,36 @@ maven-resources-plugin 3.1.0 + + org.apache.maven.plugins + maven-site-plugin + 3.7.1 + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.0.0 + + + org.jacoco + jacoco-maven-plugin + 0.8.2 + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire.version} + + + org.apache.maven.plugins + maven-failsafe-plugin + ${surefire.version} + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${surefire.version} + @@ -39,19 +69,116 @@ - org.codehaus.mojo - cobertura-maven-plugin - 2.7 + org.apache.maven.plugins + maven-site-plugin + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + org.jacoco + jacoco-maven-plugin + + + + pre-unit-test + + prepare-agent + + + + ${project.build.directory}/coverage-reports/jacoco-ut.exec + + surefireArgLine + + + + + post-unit-test + test + + report + + + + ${project.build.directory}/coverage-reports/jacoco-ut.exec + + ${project.reporting.outputDirectory}/jacoco-ut + + + + + + **/controller/**/* + **/db/* + + + + + org.apache.maven.plugins + maven-surefire-plugin - - html - xml - - + + ${surefireArgLine} + + ${skipTests} + + + **/IT*.java + + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.0.0 + + false + + + + + summary + index + dependencies + team + licenses + scm + mailing-lists + issue-management + modules + + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + org.jacoco + jacoco-maven-plugin + + + + TMCore Elimination-Tournament @@ -64,6 +191,7 @@ UTF-8 RELEASE802 6.14.3 + 2.22.1