mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-28 14:57:12 +00:00
Adjusted leaderboard calculation logic for meta leaderboard to show
current act as live in overall leaderboard view
This commit is contained in:
1 parent
76910cd613
commit
465de8dda2
6 files changed
+2586
-2505
No files matched your search
+433
-430
@@ -1,430 +1,433 @@
|
||||
package com.sap.sailing.domain.common.dto;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sailing.domain.common.LeaderboardType;
|
||||
import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
public abstract class AbstractLeaderboardDTO implements Serializable {
|
||||
private static final long serialVersionUID = -205106531931903527L;
|
||||
|
||||
public String name;
|
||||
|
||||
private List<RaceColumnDTO> races;
|
||||
public Map<CompetitorDTO, String> competitorDisplayNames;
|
||||
public Map<CompetitorDTO, LeaderboardRowDTO> rows;
|
||||
public boolean hasCarriedPoints;
|
||||
public int[] discardThresholds;
|
||||
|
||||
/**
|
||||
* Set to the non-<code>null</code> regatta name if this DTO represents a <code>RegattaLeaderboard</code>.
|
||||
*/
|
||||
public String regattaName;
|
||||
public String displayName;
|
||||
public UUID defaultCourseAreaId;
|
||||
public String defaultCourseAreaName;
|
||||
public ScoringSchemeType scoringScheme;
|
||||
public LeaderboardType type;
|
||||
|
||||
private Long delayToLiveInMillisForLatestRace;
|
||||
|
||||
public AbstractLeaderboardDTO() {
|
||||
races = new ArrayList<RaceColumnDTO>();
|
||||
}
|
||||
|
||||
public Set<BoatClassDTO> getBoatClasses() {
|
||||
Set<BoatClassDTO> result = new HashSet<BoatClassDTO>();
|
||||
if(rows != null) {
|
||||
for (CompetitorDTO competitor : rows.keySet()) {
|
||||
result.add(competitor.getBoatClass());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public String getDisplayName(CompetitorDTO competitor) {
|
||||
if (competitorDisplayNames == null || competitorDisplayNames.get(competitor) == null) {
|
||||
return competitor.getName();
|
||||
} else {
|
||||
return competitorDisplayNames.get(competitor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If the race column whose name is specified in <code>raceColumnName</code> has at least one competitor who has valid
|
||||
* {@link LeaderboardEntryDTO#legDetails} for that race column, the maximum number of entries of all such competitors in
|
||||
* the leg details is returned, telling the number of legs that the race column shall display. Otherwise, -1 is returned.
|
||||
* If you specify an non null <code>preselectedRace</code> the leg count is calculated only for that race for the column
|
||||
* holding that race. All other columns will be unaffected by <code>preselectedRace</code> and will return their regular
|
||||
* leg count. Note that this may lead to a situation where some competitors may have sailed more legs than others because
|
||||
* their fleet association may have varied across races.<p>
|
||||
*
|
||||
* See also bug 2604 and bug 2035.
|
||||
*/
|
||||
public int getLegCount(String raceColumnName, RaceIdentifier preselectedRace) {
|
||||
int result = -1;
|
||||
final boolean preselectedRaceIsInRaceColumn = isRaceInColumn(preselectedRace, raceColumnName);
|
||||
for (LeaderboardRowDTO row : rows.values()) {
|
||||
LeaderboardEntryDTO leaderboardEntryDTO = row.fieldsByRaceColumnName.get(raceColumnName);
|
||||
if (leaderboardEntryDTO != null && leaderboardEntryDTO.legDetails != null
|
||||
// when no race is pre-selected, always use the actual leg count;
|
||||
// otherwise, if the pre-selected race is in the column identified by
|
||||
// raceColumnName, use the entry only if it's in the pre-selected race;
|
||||
// otherwise (a race is pre-selected but a different column's leg count
|
||||
// is requested), use the regular leg count as is.
|
||||
&& (preselectedRace == null || !preselectedRaceIsInRaceColumn || preselectedRace.equals(leaderboardEntryDTO.race))) {
|
||||
result = Math.max(result, leaderboardEntryDTO.legDetails.size());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private boolean isRaceInColumn(RaceIdentifier preselectedRace, String raceColumnName) {
|
||||
RaceColumnDTO raceColumn = getRaceColumnByName(raceColumnName);
|
||||
return raceColumn.containsRace(preselectedRace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells if the <code>competitor</code> scored (and therefore presumably participated) in a medal race represented
|
||||
* in this leaderboard.
|
||||
*/
|
||||
public boolean scoredInMedalRace(CompetitorDTO competitor) {
|
||||
LeaderboardRowDTO row = rows.get(competitor);
|
||||
for (RaceColumnDTO race : races) {
|
||||
if (race.isMedalRace() && row.fieldsByRaceColumnName.get(race.getRaceColumnName()).totalPoints > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Double getNetPoints(CompetitorDTO competitor, String nameOfLastRaceSoFar) {
|
||||
Double netPoints = null;
|
||||
LeaderboardRowDTO row = rows.get(competitor);
|
||||
if (row != null) {
|
||||
LeaderboardEntryDTO field = row.fieldsByRaceColumnName.get(nameOfLastRaceSoFar);
|
||||
if (field != null && field.netPoints != null) {
|
||||
netPoints = field.netPoints;
|
||||
}
|
||||
}
|
||||
return netPoints;
|
||||
}
|
||||
|
||||
public boolean raceIsTracked(String raceColumnName) {
|
||||
for (RaceColumnDTO race : races) {
|
||||
if (race.getRaceColumnName().equals(raceColumnName)) {
|
||||
for (FleetDTO fleet : race.getFleets()) {
|
||||
if (race.isTrackedRace(fleet)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public boolean raceIsMedalRace(String raceColumnName) {
|
||||
return getRaceColumnByName(raceColumnName).isMedalRace();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the {@link RaceColumnDTO} by the name <code>raceColumnName</code> doesn't exist yet within this leaderboard
|
||||
* DTO, it is created, setting is {@link RaceColumnDTO#isValidInTotalScore()} to <code>true</code>. This method
|
||||
* ensures that a fleet named <code>fleetName</code> is present. If it's not present yet, it's added to the race
|
||||
* column's fleet name list. The <code>trackedRaceIdentifier</code> and <code>race</code> are associated with the
|
||||
* column for the fleet identified by <code>fleetName</code>.
|
||||
*
|
||||
* @param explicitFactor
|
||||
* factor by which to multiply the race column's points for the overall score; if <code>null</code>, the
|
||||
* default will be determined by whether or not the column is marked as medal race
|
||||
* @param effectiveFactor
|
||||
* is what you get when you call {@link RaceColumn#getFactor()} on the race column that the resulting
|
||||
* {@link RaceColumnDTO} represents
|
||||
* @param regattaName
|
||||
* must not be <code>null</code> if <code>seriesName</code> is not <code>null</code>; specified
|
||||
* separately from <code>trackedRaceIdentifier</code> because a column may belong to regatta/series
|
||||
* despite not having a tracked race associated
|
||||
* @param seriesName
|
||||
* if <code>null</code>, this method will produce a {@link RaceColumnDTO}, otherwise a
|
||||
* {@link RaceColumnInSeriesDTO}
|
||||
* @param fleetDTO
|
||||
* must not be null
|
||||
*/
|
||||
public RaceColumnDTO addRace(String raceColumnName, Double explicitFactor, double effectiveFactor,
|
||||
String regattaName, String seriesName, FleetDTO fleetDTO, boolean medalRace, RegattaAndRaceIdentifier trackedRaceIdentifier, RaceDTO race) {
|
||||
assert fleetDTO != null;
|
||||
RaceColumnDTO raceColumnDTO = getRaceColumnByName(raceColumnName);
|
||||
if (raceColumnDTO == null) {
|
||||
raceColumnDTO = RaceColumnDTOFactory.INSTANCE.createRaceColumnDTO(raceColumnName, medalRace,
|
||||
explicitFactor, regattaName, seriesName);
|
||||
races.add(raceColumnDTO);
|
||||
}
|
||||
raceColumnDTO.setEffectiveFactor(effectiveFactor);
|
||||
boolean contains = false;
|
||||
for (FleetDTO fleet : raceColumnDTO.getFleets()) {
|
||||
if (fleet.getName().equals(fleetDTO.getName())) {
|
||||
contains = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!contains) {
|
||||
raceColumnDTO.addFleet(fleetDTO);
|
||||
}
|
||||
raceColumnDTO.setRaceIdentifier(fleetDTO, trackedRaceIdentifier);
|
||||
raceColumnDTO.setRace(fleetDTO, race);
|
||||
return raceColumnDTO;
|
||||
}
|
||||
|
||||
public RaceColumnDTO createEmptyRaceColumn(String raceColumnName, boolean medalRace, String regattaName, String seriesName) {
|
||||
final RaceColumnDTO raceColumn = RaceColumnDTOFactory.INSTANCE.createRaceColumnDTO(raceColumnName,
|
||||
medalRace, /* explicit factor */ null, regattaName, seriesName);
|
||||
races.add(raceColumn);
|
||||
return raceColumn;
|
||||
}
|
||||
|
||||
public RaceColumnDTO getRaceColumnByName(String raceColumnName) {
|
||||
for (RaceColumnDTO race : races) {
|
||||
if (race.getRaceColumnName().equals(raceColumnName)) {
|
||||
return race;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getRaceColumnsCount() {
|
||||
return races.size();
|
||||
}
|
||||
|
||||
public int getRacesCount() {
|
||||
int result = 0;
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
result += race.getFleets().size();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getTrackedRacesCount() {
|
||||
int result = 0;
|
||||
for (RaceColumnDTO raceColumn : getRaceList()) {
|
||||
for (FleetDTO fleet : raceColumn.getFleets()) {
|
||||
RaceDTO race = raceColumn.getRace(fleet);
|
||||
if(race != null && race.trackedRace != null && race.trackedRace.hasGPSData && race.trackedRace.hasWindData) {
|
||||
result++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<RaceColumnDTO> getRaceList() {
|
||||
return races;
|
||||
}
|
||||
|
||||
public void setRaceList(List<RaceColumnDTO> raceList) {
|
||||
this.races = raceList;
|
||||
}
|
||||
|
||||
public boolean raceListContains(String raceColumnName) {
|
||||
return getRaceColumnByName(raceColumnName) != null;
|
||||
}
|
||||
|
||||
public void moveRaceUp(String raceColumnName) {
|
||||
RaceColumnDTO race = getRaceColumnByName(raceColumnName);
|
||||
int index = races.indexOf(race);
|
||||
index--;
|
||||
if (index >= 0) {
|
||||
races.remove(index + 1);
|
||||
races.add(index, race);
|
||||
}
|
||||
}
|
||||
|
||||
public void moveRaceDown(String raceColumnName) {
|
||||
RaceColumnDTO race = getRaceColumnByName(raceColumnName);
|
||||
int index = races.indexOf(race);
|
||||
if (index != -1) {
|
||||
index++;
|
||||
if (index < races.size()) {
|
||||
races.remove(index - 1);
|
||||
races.add(index, race);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setIsMedalRace(String raceColumnName, boolean medalRace) {
|
||||
getRaceColumnByName(raceColumnName).setMedalRace(medalRace);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The earliest start date of the races, or <code>null</code> if no start dates of the races are available.
|
||||
*/
|
||||
public Date getStartDate() {
|
||||
Date leaderboardStart = null;
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
for (FleetDTO fleet: race.getFleets()) {
|
||||
Date raceStart = race.getStartDate(fleet);
|
||||
if (raceStart != null) {
|
||||
if (leaderboardStart == null) {
|
||||
leaderboardStart = new Date();
|
||||
} else {
|
||||
leaderboardStart = leaderboardStart.before(raceStart) ? leaderboardStart : raceStart;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return leaderboardStart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the {@link PlacemarkOrderDTO} of all races in this leaderboard, if the PlacemarkOrderDTO for the race is
|
||||
* available, and fills all {@link PlacemarkDTO} in a new PlacemarkOrderDTO.<br />
|
||||
* The order of the races in this leaderboard determine the order of the PlacemarkDTOs in the PlacemarkOrderDTO.
|
||||
*
|
||||
* @return The places of this leaderboard in form of a {@link PlacemarkOrderDTO}, or <code>null</code> if the
|
||||
* {@link PlacemarkOrderDTO places} of no race are available
|
||||
*/
|
||||
public PlacemarkOrderDTO getPlaces() {
|
||||
PlacemarkOrderDTO leaderboardPlaces = null;
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
PlacemarkOrderDTO racePlaces = race.getPlaces();
|
||||
if (racePlaces != null) {
|
||||
if (leaderboardPlaces == null) {
|
||||
leaderboardPlaces = new PlacemarkOrderDTO();
|
||||
}
|
||||
leaderboardPlaces.getPlacemarks().addAll(racePlaces.getPlacemarks());
|
||||
}
|
||||
}
|
||||
return leaderboardPlaces;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return <code>true</code> if the leaderboard contains a race which is live
|
||||
*/
|
||||
public boolean hasLiveRace(long serverTimePointAsMillis) {
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
for (FleetDTO fleet : race.getFleets()) {
|
||||
if (race.isLive(fleet, serverTimePointAsMillis)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<Util.Pair<RaceColumnDTO, FleetDTO>> getLiveRaces(long serverTimePointAsMillis) {
|
||||
List<Util.Pair<RaceColumnDTO, FleetDTO>> result = new ArrayList<Util.Pair<RaceColumnDTO, FleetDTO>>();
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
for (FleetDTO fleet : race.getFleets()) {
|
||||
if (race.isLive(fleet, serverTimePointAsMillis)) {
|
||||
result.add(new Util.Pair<RaceColumnDTO, FleetDTO>(race, fleet));
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((competitorDisplayNames == null) ? 0 : competitorDisplayNames.hashCode());
|
||||
result = prime * result + Arrays.hashCode(discardThresholds);
|
||||
result = prime * result + (hasCarriedPoints ? 1231 : 1237);
|
||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||
result = prime * result + ((scoringScheme == null) ? 0 : scoringScheme.hashCode());
|
||||
if (races == null) {
|
||||
result = prime * result;
|
||||
} else {
|
||||
List<String> raceNames = new ArrayList<String>();
|
||||
for (RaceColumnDTO race : races) {
|
||||
raceNames.add(race.getName());
|
||||
}
|
||||
result = prime * result + raceNames.hashCode();
|
||||
}
|
||||
result = prime * result + ((rows == null) ? 0 : rows.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
AbstractLeaderboardDTO other = (AbstractLeaderboardDTO) obj;
|
||||
if (competitorDisplayNames == null) {
|
||||
if (other.competitorDisplayNames != null)
|
||||
return false;
|
||||
} else if (!competitorDisplayNames.equals(other.competitorDisplayNames))
|
||||
return false;
|
||||
if (!Arrays.equals(discardThresholds, other.discardThresholds))
|
||||
return false;
|
||||
if (hasCarriedPoints != other.hasCarriedPoints)
|
||||
return false;
|
||||
if (type != other.type)
|
||||
return false;
|
||||
if (scoringScheme != other.scoringScheme)
|
||||
return false;
|
||||
if (name == null) {
|
||||
if (other.name != null)
|
||||
return false;
|
||||
} else if (!name.equals(other.name))
|
||||
return false;
|
||||
if (races == null) {
|
||||
if (other.races != null)
|
||||
return false;
|
||||
} else {
|
||||
// compare race column names only, not the contents
|
||||
if (races.size() != (other.races==null?0:other.races.size())) {
|
||||
return false;
|
||||
}
|
||||
List<String> raceColumnNames = new ArrayList<String>(races.size());
|
||||
List<String> otherRaceColumnNames = new ArrayList<String>(races.size());
|
||||
for (RaceColumnDTO race : races) {
|
||||
raceColumnNames.add(race.getName());
|
||||
}
|
||||
if (other.races != null) {
|
||||
for (RaceColumnDTO otherRace : other.races) {
|
||||
otherRaceColumnNames.add(otherRace.getName());
|
||||
}
|
||||
}
|
||||
if (!raceColumnNames.equals(otherRaceColumnNames))
|
||||
return false;
|
||||
if (rows == null) {
|
||||
if (other.rows != null)
|
||||
return false;
|
||||
} else if (!rows.equals(other.rows))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isDisplayNameSet(CompetitorDTO competitor) {
|
||||
return competitorDisplayNames.get(competitor) != null;
|
||||
}
|
||||
|
||||
public Long getDelayToLiveInMillisForLatestRace() {
|
||||
return delayToLiveInMillisForLatestRace;
|
||||
}
|
||||
|
||||
public void setDelayToLiveInMillisForLatestRace(Long delayToLiveInMillisForLatestRace) {
|
||||
this.delayToLiveInMillisForLatestRace = delayToLiveInMillisForLatestRace;
|
||||
}
|
||||
}
|
||||
package com.sap.sailing.domain.common.dto;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sailing.domain.common.LeaderboardType;
|
||||
import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
public abstract class AbstractLeaderboardDTO implements Serializable {
|
||||
private static final long serialVersionUID = -205106531931903527L;
|
||||
|
||||
public String name;
|
||||
|
||||
private List<RaceColumnDTO> races;
|
||||
public Map<CompetitorDTO, String> competitorDisplayNames;
|
||||
public Map<CompetitorDTO, LeaderboardRowDTO> rows;
|
||||
public boolean hasCarriedPoints;
|
||||
public int[] discardThresholds;
|
||||
|
||||
/**
|
||||
* Set to the non-<code>null</code> regatta name if this DTO represents a <code>RegattaLeaderboard</code>.
|
||||
*/
|
||||
public String regattaName;
|
||||
public String displayName;
|
||||
public UUID defaultCourseAreaId;
|
||||
public String defaultCourseAreaName;
|
||||
public ScoringSchemeType scoringScheme;
|
||||
public LeaderboardType type;
|
||||
|
||||
private Long delayToLiveInMillisForLatestRace;
|
||||
|
||||
public AbstractLeaderboardDTO() {
|
||||
races = new ArrayList<RaceColumnDTO>();
|
||||
}
|
||||
|
||||
public Set<BoatClassDTO> getBoatClasses() {
|
||||
Set<BoatClassDTO> result = new HashSet<BoatClassDTO>();
|
||||
if(rows != null) {
|
||||
for (CompetitorDTO competitor : rows.keySet()) {
|
||||
result.add(competitor.getBoatClass());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public String getDisplayName(CompetitorDTO competitor) {
|
||||
if (competitorDisplayNames == null || competitorDisplayNames.get(competitor) == null) {
|
||||
return competitor.getName();
|
||||
} else {
|
||||
return competitorDisplayNames.get(competitor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If the race column whose name is specified in <code>raceColumnName</code> has at least one competitor who has valid
|
||||
* {@link LeaderboardEntryDTO#legDetails} for that race column, the maximum number of entries of all such competitors in
|
||||
* the leg details is returned, telling the number of legs that the race column shall display. Otherwise, -1 is returned.
|
||||
* If you specify an non null <code>preselectedRace</code> the leg count is calculated only for that race for the column
|
||||
* holding that race. All other columns will be unaffected by <code>preselectedRace</code> and will return their regular
|
||||
* leg count. Note that this may lead to a situation where some competitors may have sailed more legs than others because
|
||||
* their fleet association may have varied across races.<p>
|
||||
*
|
||||
* See also bug 2604 and bug 2035.
|
||||
*/
|
||||
public int getLegCount(String raceColumnName, RaceIdentifier preselectedRace) {
|
||||
int result = -1;
|
||||
final boolean preselectedRaceIsInRaceColumn = isRaceInColumn(preselectedRace, raceColumnName);
|
||||
for (LeaderboardRowDTO row : rows.values()) {
|
||||
LeaderboardEntryDTO leaderboardEntryDTO = row.fieldsByRaceColumnName.get(raceColumnName);
|
||||
if (leaderboardEntryDTO != null && leaderboardEntryDTO.legDetails != null
|
||||
// when no race is pre-selected, always use the actual leg count;
|
||||
// otherwise, if the pre-selected race is in the column identified by
|
||||
// raceColumnName, use the entry only if it's in the pre-selected race;
|
||||
// otherwise (a race is pre-selected but a different column's leg count
|
||||
// is requested), use the regular leg count as is.
|
||||
&& (preselectedRace == null || !preselectedRaceIsInRaceColumn || preselectedRace.equals(leaderboardEntryDTO.race))) {
|
||||
result = Math.max(result, leaderboardEntryDTO.legDetails.size());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private boolean isRaceInColumn(RaceIdentifier preselectedRace, String raceColumnName) {
|
||||
RaceColumnDTO raceColumn = getRaceColumnByName(raceColumnName);
|
||||
return raceColumn.containsRace(preselectedRace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells if the <code>competitor</code> scored (and therefore presumably participated) in a medal race represented
|
||||
* in this leaderboard.
|
||||
*/
|
||||
public boolean scoredInMedalRace(CompetitorDTO competitor) {
|
||||
LeaderboardRowDTO row = rows.get(competitor);
|
||||
for (RaceColumnDTO race : races) {
|
||||
if (race.isMedalRace() && row.fieldsByRaceColumnName.get(race.getRaceColumnName()).totalPoints > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Double getNetPoints(CompetitorDTO competitor, String nameOfLastRaceSoFar) {
|
||||
Double netPoints = null;
|
||||
LeaderboardRowDTO row = rows.get(competitor);
|
||||
if (row != null) {
|
||||
LeaderboardEntryDTO field = row.fieldsByRaceColumnName.get(nameOfLastRaceSoFar);
|
||||
if (field != null && field.netPoints != null) {
|
||||
netPoints = field.netPoints;
|
||||
}
|
||||
}
|
||||
return netPoints;
|
||||
}
|
||||
|
||||
public boolean raceIsTracked(String raceColumnName) {
|
||||
for (RaceColumnDTO race : races) {
|
||||
if (race.getRaceColumnName().equals(raceColumnName)) {
|
||||
for (FleetDTO fleet : race.getFleets()) {
|
||||
if (race.isTrackedRace(fleet)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public boolean raceIsMedalRace(String raceColumnName) {
|
||||
return getRaceColumnByName(raceColumnName).isMedalRace();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the {@link RaceColumnDTO} by the name <code>raceColumnName</code> doesn't exist yet within this leaderboard
|
||||
* DTO, it is created, setting is {@link RaceColumnDTO#isValidInTotalScore()} to <code>true</code>. This method
|
||||
* ensures that a fleet named <code>fleetName</code> is present. If it's not present yet, it's added to the race
|
||||
* column's fleet name list. The <code>trackedRaceIdentifier</code> and <code>race</code> are associated with the
|
||||
* column for the fleet identified by <code>fleetName</code>.
|
||||
*
|
||||
* @param explicitFactor
|
||||
* factor by which to multiply the race column's points for the overall score; if <code>null</code>, the
|
||||
* default will be determined by whether or not the column is marked as medal race
|
||||
* @param effectiveFactor
|
||||
* is what you get when you call {@link RaceColumn#getFactor()} on the race column that the resulting
|
||||
* {@link RaceColumnDTO} represents
|
||||
* @param regattaName
|
||||
* must not be <code>null</code> if <code>seriesName</code> is not <code>null</code>; specified
|
||||
* separately from <code>trackedRaceIdentifier</code> because a column may belong to regatta/series
|
||||
* despite not having a tracked race associated
|
||||
* @param seriesName
|
||||
* if <code>null</code>, this method will produce a {@link RaceColumnDTO}, otherwise a
|
||||
* {@link RaceColumnInSeriesDTO}
|
||||
* @param fleetDTO
|
||||
* must not be null
|
||||
* @param isMetaLeaderboardColumn
|
||||
*/
|
||||
public RaceColumnDTO addRace(String raceColumnName, Double explicitFactor, double effectiveFactor,
|
||||
String regattaName, String seriesName, FleetDTO fleetDTO, boolean medalRace,
|
||||
RegattaAndRaceIdentifier trackedRaceIdentifier, RaceDTO race, boolean isMetaLeaderboardColumn) {
|
||||
assert fleetDTO != null;
|
||||
RaceColumnDTO raceColumnDTO = getRaceColumnByName(raceColumnName);
|
||||
if (raceColumnDTO == null) {
|
||||
raceColumnDTO = RaceColumnDTOFactory.INSTANCE.createRaceColumnDTO(raceColumnName, medalRace,
|
||||
explicitFactor, regattaName, seriesName, isMetaLeaderboardColumn);
|
||||
races.add(raceColumnDTO);
|
||||
}
|
||||
raceColumnDTO.setEffectiveFactor(effectiveFactor);
|
||||
boolean contains = false;
|
||||
for (FleetDTO fleet : raceColumnDTO.getFleets()) {
|
||||
if (fleet.getName().equals(fleetDTO.getName())) {
|
||||
contains = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!contains) {
|
||||
raceColumnDTO.addFleet(fleetDTO);
|
||||
}
|
||||
raceColumnDTO.setRaceIdentifier(fleetDTO, trackedRaceIdentifier);
|
||||
raceColumnDTO.setRace(fleetDTO, race);
|
||||
return raceColumnDTO;
|
||||
}
|
||||
|
||||
public RaceColumnDTO createEmptyRaceColumn(String raceColumnName, boolean medalRace, String regattaName,
|
||||
String seriesName, boolean isMetaLeaderboardColumn) {
|
||||
final RaceColumnDTO raceColumn = RaceColumnDTOFactory.INSTANCE.createRaceColumnDTO(raceColumnName,
|
||||
medalRace, /* explicit factor */ null, regattaName, seriesName, isMetaLeaderboardColumn);
|
||||
races.add(raceColumn);
|
||||
return raceColumn;
|
||||
}
|
||||
|
||||
public RaceColumnDTO getRaceColumnByName(String raceColumnName) {
|
||||
for (RaceColumnDTO race : races) {
|
||||
if (race.getRaceColumnName().equals(raceColumnName)) {
|
||||
return race;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getRaceColumnsCount() {
|
||||
return races.size();
|
||||
}
|
||||
|
||||
public int getRacesCount() {
|
||||
int result = 0;
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
result += race.getFleets().size();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public int getTrackedRacesCount() {
|
||||
int result = 0;
|
||||
for (RaceColumnDTO raceColumn : getRaceList()) {
|
||||
for (FleetDTO fleet : raceColumn.getFleets()) {
|
||||
RaceDTO race = raceColumn.getRace(fleet);
|
||||
if(race != null && race.trackedRace != null && race.trackedRace.hasGPSData && race.trackedRace.hasWindData) {
|
||||
result++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<RaceColumnDTO> getRaceList() {
|
||||
return races;
|
||||
}
|
||||
|
||||
public void setRaceList(List<RaceColumnDTO> raceList) {
|
||||
this.races = raceList;
|
||||
}
|
||||
|
||||
public boolean raceListContains(String raceColumnName) {
|
||||
return getRaceColumnByName(raceColumnName) != null;
|
||||
}
|
||||
|
||||
public void moveRaceUp(String raceColumnName) {
|
||||
RaceColumnDTO race = getRaceColumnByName(raceColumnName);
|
||||
int index = races.indexOf(race);
|
||||
index--;
|
||||
if (index >= 0) {
|
||||
races.remove(index + 1);
|
||||
races.add(index, race);
|
||||
}
|
||||
}
|
||||
|
||||
public void moveRaceDown(String raceColumnName) {
|
||||
RaceColumnDTO race = getRaceColumnByName(raceColumnName);
|
||||
int index = races.indexOf(race);
|
||||
if (index != -1) {
|
||||
index++;
|
||||
if (index < races.size()) {
|
||||
races.remove(index - 1);
|
||||
races.add(index, race);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setIsMedalRace(String raceColumnName, boolean medalRace) {
|
||||
getRaceColumnByName(raceColumnName).setMedalRace(medalRace);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The earliest start date of the races, or <code>null</code> if no start dates of the races are available.
|
||||
*/
|
||||
public Date getStartDate() {
|
||||
Date leaderboardStart = null;
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
for (FleetDTO fleet: race.getFleets()) {
|
||||
Date raceStart = race.getStartDate(fleet);
|
||||
if (raceStart != null) {
|
||||
if (leaderboardStart == null) {
|
||||
leaderboardStart = new Date();
|
||||
} else {
|
||||
leaderboardStart = leaderboardStart.before(raceStart) ? leaderboardStart : raceStart;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return leaderboardStart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the {@link PlacemarkOrderDTO} of all races in this leaderboard, if the PlacemarkOrderDTO for the race is
|
||||
* available, and fills all {@link PlacemarkDTO} in a new PlacemarkOrderDTO.<br />
|
||||
* The order of the races in this leaderboard determine the order of the PlacemarkDTOs in the PlacemarkOrderDTO.
|
||||
*
|
||||
* @return The places of this leaderboard in form of a {@link PlacemarkOrderDTO}, or <code>null</code> if the
|
||||
* {@link PlacemarkOrderDTO places} of no race are available
|
||||
*/
|
||||
public PlacemarkOrderDTO getPlaces() {
|
||||
PlacemarkOrderDTO leaderboardPlaces = null;
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
PlacemarkOrderDTO racePlaces = race.getPlaces();
|
||||
if (racePlaces != null) {
|
||||
if (leaderboardPlaces == null) {
|
||||
leaderboardPlaces = new PlacemarkOrderDTO();
|
||||
}
|
||||
leaderboardPlaces.getPlacemarks().addAll(racePlaces.getPlacemarks());
|
||||
}
|
||||
}
|
||||
return leaderboardPlaces;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return <code>true</code> if the leaderboard contains a race which is live
|
||||
*/
|
||||
public boolean hasLiveRace(long serverTimePointAsMillis) {
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
for (FleetDTO fleet : race.getFleets()) {
|
||||
if (race.isLive(fleet, serverTimePointAsMillis)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<Util.Pair<RaceColumnDTO, FleetDTO>> getLiveRaces(long serverTimePointAsMillis) {
|
||||
List<Util.Pair<RaceColumnDTO, FleetDTO>> result = new ArrayList<Util.Pair<RaceColumnDTO, FleetDTO>>();
|
||||
for (RaceColumnDTO race : getRaceList()) {
|
||||
for (FleetDTO fleet : race.getFleets()) {
|
||||
if (race.isLive(fleet, serverTimePointAsMillis)) {
|
||||
result.add(new Util.Pair<RaceColumnDTO, FleetDTO>(race, fleet));
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((competitorDisplayNames == null) ? 0 : competitorDisplayNames.hashCode());
|
||||
result = prime * result + Arrays.hashCode(discardThresholds);
|
||||
result = prime * result + (hasCarriedPoints ? 1231 : 1237);
|
||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||
result = prime * result + ((scoringScheme == null) ? 0 : scoringScheme.hashCode());
|
||||
if (races == null) {
|
||||
result = prime * result;
|
||||
} else {
|
||||
List<String> raceNames = new ArrayList<String>();
|
||||
for (RaceColumnDTO race : races) {
|
||||
raceNames.add(race.getName());
|
||||
}
|
||||
result = prime * result + raceNames.hashCode();
|
||||
}
|
||||
result = prime * result + ((rows == null) ? 0 : rows.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
AbstractLeaderboardDTO other = (AbstractLeaderboardDTO) obj;
|
||||
if (competitorDisplayNames == null) {
|
||||
if (other.competitorDisplayNames != null)
|
||||
return false;
|
||||
} else if (!competitorDisplayNames.equals(other.competitorDisplayNames))
|
||||
return false;
|
||||
if (!Arrays.equals(discardThresholds, other.discardThresholds))
|
||||
return false;
|
||||
if (hasCarriedPoints != other.hasCarriedPoints)
|
||||
return false;
|
||||
if (type != other.type)
|
||||
return false;
|
||||
if (scoringScheme != other.scoringScheme)
|
||||
return false;
|
||||
if (name == null) {
|
||||
if (other.name != null)
|
||||
return false;
|
||||
} else if (!name.equals(other.name))
|
||||
return false;
|
||||
if (races == null) {
|
||||
if (other.races != null)
|
||||
return false;
|
||||
} else {
|
||||
// compare race column names only, not the contents
|
||||
if (races.size() != (other.races==null?0:other.races.size())) {
|
||||
return false;
|
||||
}
|
||||
List<String> raceColumnNames = new ArrayList<String>(races.size());
|
||||
List<String> otherRaceColumnNames = new ArrayList<String>(races.size());
|
||||
for (RaceColumnDTO race : races) {
|
||||
raceColumnNames.add(race.getName());
|
||||
}
|
||||
if (other.races != null) {
|
||||
for (RaceColumnDTO otherRace : other.races) {
|
||||
otherRaceColumnNames.add(otherRace.getName());
|
||||
}
|
||||
}
|
||||
if (!raceColumnNames.equals(otherRaceColumnNames))
|
||||
return false;
|
||||
if (rows == null) {
|
||||
if (other.rows != null)
|
||||
return false;
|
||||
} else if (!rows.equals(other.rows))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isDisplayNameSet(CompetitorDTO competitor) {
|
||||
return competitorDisplayNames.get(competitor) != null;
|
||||
}
|
||||
|
||||
public Long getDelayToLiveInMillisForLatestRace() {
|
||||
return delayToLiveInMillisForLatestRace;
|
||||
}
|
||||
|
||||
public void setDelayToLiveInMillisForLatestRace(Long delayToLiveInMillisForLatestRace) {
|
||||
this.delayToLiveInMillisForLatestRace = delayToLiveInMillisForLatestRace;
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
package com.sap.sailing.domain.common.dto;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class MetaLeaderboardRaceColumnDTO extends RaceColumnDTO {
|
||||
|
||||
private static final long serialVersionUID = 6152752963316150432L;
|
||||
|
||||
private ArrayList<RaceDTO> raceList = new ArrayList<RaceDTO>();
|
||||
|
||||
public boolean isLive(FleetDTO fleet, long serverTimePointAsMillis) {
|
||||
for (RaceDTO race : raceList) {
|
||||
if (race.isLive(serverTimePointAsMillis)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void addRace(RaceDTO race) {
|
||||
raceList.add(race);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((raceList == null) ? 0 : raceList.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
MetaLeaderboardRaceColumnDTO other = (MetaLeaderboardRaceColumnDTO) obj;
|
||||
if (raceList == null) {
|
||||
if (other.raceList != null)
|
||||
return false;
|
||||
} else if (!raceList.equals(other.raceList))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
+6
-4
@@ -7,15 +7,17 @@ public class RaceColumnDTOFactory {
|
||||
* @param regattaName
|
||||
* must not be <code>null</code> if <code>seriesName</code> is not <code>null</code>
|
||||
* @param seriesName
|
||||
* when <code>null</code>, a regular {@link RaceColumnDTO} will be produced and initialized from the
|
||||
* properties passed; otherwise, a {@link RaceColumnInSeriesDTO} will be created.
|
||||
* when <code>null</code>, a regular {@link RaceColumnDTO} or {@link MetaLeaderboardRaceColumnDTO} will
|
||||
* be produced (depending on <code>isMetaLeaderboardColumn</code>) and initialized from the properties
|
||||
* passed; otherwise, a {@link RaceColumnInSeriesDTO} will be created.
|
||||
*/
|
||||
public RaceColumnDTO createRaceColumnDTO(String columnName, boolean isMedal, Double explicitFactor, String regattaName, String seriesName) {
|
||||
public RaceColumnDTO createRaceColumnDTO(String columnName, boolean isMedal, Double explicitFactor,
|
||||
String regattaName, String seriesName, boolean isMetaLeaderboardColumn) {
|
||||
final RaceColumnDTO raceColumnDTO;
|
||||
if (seriesName != null) {
|
||||
raceColumnDTO = new RaceColumnInSeriesDTO(seriesName, regattaName);
|
||||
} else {
|
||||
raceColumnDTO = new RaceColumnDTO();
|
||||
raceColumnDTO = isMetaLeaderboardColumn ? new MetaLeaderboardRaceColumnDTO() : new RaceColumnDTO();
|
||||
}
|
||||
fillRaceColumnDTO(raceColumnDTO, columnName, isMedal, explicitFactor);
|
||||
return raceColumnDTO;
|
||||
|
||||
+1932
-1907
File diff suppressed because it is too large.
Load diff
+162
-162
@@ -1,162 +1,162 @@
|
||||
package com.sap.sailing.gwt.ui.test;
|
||||
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
import com.sap.sailing.domain.common.dto.FleetDTO;
|
||||
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
|
||||
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
|
||||
import com.sap.sailing.gwt.ui.server.SailingServiceImpl;
|
||||
|
||||
public class TestColumnSwapping {
|
||||
|
||||
private LeaderboardDTO lb = null;
|
||||
private static final String LEADERBOARDNAME = "test";
|
||||
private static final String DEFAULT_FLEET_NAME = "Default";
|
||||
private static final FleetDTO DEFAULT_FLEET = new FleetDTO(DEFAULT_FLEET_NAME, /* ordering */ 0, /* color */ null);
|
||||
private SailingServiceImpl service;
|
||||
private LeaderboardDTO leaderboardOriginalDTO;
|
||||
private LeaderboardDTO leaderboardDTO;
|
||||
private Collection<String> leglist;
|
||||
private Date leaderboardCreationDate;
|
||||
private SailingServiceImpl sailingService = null;
|
||||
|
||||
// Test-Data
|
||||
private final String TEST_LEADERBOARD_NAME = "test_board";
|
||||
private final String[] races = { "1", "2", "3" };
|
||||
private final boolean[] isMedalRace = { false, false, true };
|
||||
|
||||
@Before
|
||||
public void prepareColumnSwapping() {
|
||||
service = new SailingServiceImplMock();
|
||||
int[] disc = { 5, 8, 9, 0, 7, 5, 43 };
|
||||
service.removeLeaderboard(LEADERBOARDNAME);
|
||||
service.createFlexibleLeaderboard(LEADERBOARDNAME, null, disc, ScoringSchemeType.LOW_POINT, null);
|
||||
service.addColumnToLeaderboard("Race1", LEADERBOARDNAME, true);
|
||||
service.addColumnToLeaderboard("Race2", LEADERBOARDNAME, true);
|
||||
service.addColumnToLeaderboard("Race3", LEADERBOARDNAME, true);
|
||||
leglist = new ArrayList<String>();
|
||||
leglist.add("Race1");
|
||||
leglist.add("Race2");
|
||||
leglist.add("Race3");
|
||||
leaderboardCreationDate = new Date();
|
||||
try {
|
||||
// get Leaderboard with name and current date
|
||||
leaderboardOriginalDTO = new LeaderboardDTO(null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
|
||||
@Override
|
||||
public String generateRandomUUID() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
}, /* hasOverallDetails */ false);
|
||||
leaderboardOriginalDTO.addRace("Race1", /* explicitFactor */ null, 2., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null);
|
||||
leaderboardOriginalDTO.addRace("Race3", /* explicitFactor */ null, 2., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null);
|
||||
leaderboardOriginalDTO.addRace("Race2", /* explicitFactor */ null, 2., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testColumnSwapping() {
|
||||
testColumnSwappingFabian();
|
||||
testLeaderBoardDTOMethods();
|
||||
testSailingService();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSailingService() {
|
||||
sailingService = new SailingServiceImplMock();
|
||||
assertNotNull("Sailingservice != NULL", sailingService);
|
||||
int td[] = { 5, 8 };
|
||||
sailingService.removeLeaderboard(TEST_LEADERBOARD_NAME);
|
||||
sailingService.createFlexibleLeaderboard(TEST_LEADERBOARD_NAME, null, td, ScoringSchemeType.LOW_POINT, null);
|
||||
for (int i = 0; i < races.length; i++)
|
||||
sailingService.addColumnToLeaderboard(races[i], TEST_LEADERBOARD_NAME, isMedalRace[i]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnUp(TEST_LEADERBOARD_NAME, races[2]);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[0], true);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[2], false);
|
||||
try {
|
||||
for (int i = 0; i < races.length; i++)
|
||||
sailingService.addColumnToLeaderboard(races[i], TEST_LEADERBOARD_NAME, isMedalRace[i]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnUp(TEST_LEADERBOARD_NAME, races[2]);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[0], true);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[2], false);
|
||||
lb = sailingService.getLeaderboardByName(TEST_LEADERBOARD_NAME, new Date(), /* races to load */ null, /* addOverallDetails */ true, /* previous leaderboard ID */ null,
|
||||
/* fillNetPointsUncorrected */ false).getLeaderboardDTO(/* previousVersion */ null);
|
||||
} catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
fail(e.getLocalizedMessage());
|
||||
}
|
||||
assertNotNull("LeaderboardDTO != NULL", lb);
|
||||
|
||||
// asserted data
|
||||
String[] raceNames = new String[] { "3", "2", "1" };
|
||||
boolean[] medalRace = { true, false, false };
|
||||
|
||||
for (int i = 0; i < lb.getRaceList().size(); i++) {
|
||||
assertEquals("Race[" + i + "] == " + raceNames[i], raceNames[i], lb.getRaceList().get(i).getName());
|
||||
assertTrue("Race[" + i + "] is " + (medalRace[i] ? "" : "no ") + "medalrace.",
|
||||
lb.raceIsMedalRace(races[i]) == medalRace[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLeaderBoardDTOMethods() {
|
||||
lb = new LeaderboardDTO(null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
|
||||
@Override
|
||||
public String generateRandomUUID() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
}, /* hasOverallDetails */ false);
|
||||
assertNotNull("Leaderboard != NULL", lb);
|
||||
lb.addRace("1", /* explicitFactor */ null, 1., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, false, null, null);
|
||||
lb.addRace("2", /* explicitFactor */ null, 1., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, false, null, null);
|
||||
lb.addRace("3", /* explicitFactor */ null, 1., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null);
|
||||
lb.moveRaceDown("1");
|
||||
String[] s = new String[] { "2", "1", "3" };
|
||||
for (int i = 0; i < lb.getRaceList().size(); i++) {
|
||||
assertEquals("Race[" + i + "] = " + s[i], s[i], lb.getRaceList().get(i).getName());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testColumnSwappingFabian() {
|
||||
service.moveLeaderboardColumnUp(LEADERBOARDNAME, "Race3");
|
||||
try {
|
||||
leaderboardDTO = service.getLeaderboardByName(LEADERBOARDNAME, leaderboardCreationDate, leglist, /* addOverallDetails */
|
||||
true, /* previous leaderboard ID */null, /* fillNetPointsUncorrected */false).getLeaderboardDTO(/* previousVersion */null);
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// check if leaderboardDTO an dleaderboardOriginalDTO same
|
||||
List<RaceColumnDTO> leaderboardList = leaderboardDTO.getRaceList();
|
||||
List<RaceColumnDTO> leaderboardOriginalList = leaderboardOriginalDTO.getRaceList();
|
||||
|
||||
// ??????? assert races in list
|
||||
assertArrayEquals(leaderboardList.toArray(), leaderboardOriginalList.toArray());
|
||||
|
||||
for (RaceColumnDTO raceDTO : leaderboardOriginalList) {
|
||||
assert leaderboardDTO.raceIsMedalRace(raceDTO.getRaceColumnName()) == leaderboardOriginalDTO.raceIsMedalRace(raceDTO.getRaceColumnName());
|
||||
assert leaderboardDTO.raceIsTracked(raceDTO.getRaceColumnName()) == leaderboardOriginalDTO.raceIsTracked(raceDTO.getRaceColumnName());
|
||||
}
|
||||
}
|
||||
}
|
||||
package com.sap.sailing.gwt.ui.test;
|
||||
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
import com.sap.sailing.domain.common.dto.FleetDTO;
|
||||
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
|
||||
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
|
||||
import com.sap.sailing.gwt.ui.server.SailingServiceImpl;
|
||||
|
||||
public class TestColumnSwapping {
|
||||
|
||||
private LeaderboardDTO lb = null;
|
||||
private static final String LEADERBOARDNAME = "test";
|
||||
private static final String DEFAULT_FLEET_NAME = "Default";
|
||||
private static final FleetDTO DEFAULT_FLEET = new FleetDTO(DEFAULT_FLEET_NAME, /* ordering */ 0, /* color */ null);
|
||||
private SailingServiceImpl service;
|
||||
private LeaderboardDTO leaderboardOriginalDTO;
|
||||
private LeaderboardDTO leaderboardDTO;
|
||||
private Collection<String> leglist;
|
||||
private Date leaderboardCreationDate;
|
||||
private SailingServiceImpl sailingService = null;
|
||||
|
||||
// Test-Data
|
||||
private final String TEST_LEADERBOARD_NAME = "test_board";
|
||||
private final String[] races = { "1", "2", "3" };
|
||||
private final boolean[] isMedalRace = { false, false, true };
|
||||
|
||||
@Before
|
||||
public void prepareColumnSwapping() {
|
||||
service = new SailingServiceImplMock();
|
||||
int[] disc = { 5, 8, 9, 0, 7, 5, 43 };
|
||||
service.removeLeaderboard(LEADERBOARDNAME);
|
||||
service.createFlexibleLeaderboard(LEADERBOARDNAME, null, disc, ScoringSchemeType.LOW_POINT, null);
|
||||
service.addColumnToLeaderboard("Race1", LEADERBOARDNAME, true);
|
||||
service.addColumnToLeaderboard("Race2", LEADERBOARDNAME, true);
|
||||
service.addColumnToLeaderboard("Race3", LEADERBOARDNAME, true);
|
||||
leglist = new ArrayList<String>();
|
||||
leglist.add("Race1");
|
||||
leglist.add("Race2");
|
||||
leglist.add("Race3");
|
||||
leaderboardCreationDate = new Date();
|
||||
try {
|
||||
// get Leaderboard with name and current date
|
||||
leaderboardOriginalDTO = new LeaderboardDTO(null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
|
||||
@Override
|
||||
public String generateRandomUUID() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
}, /* hasOverallDetails */ false);
|
||||
leaderboardOriginalDTO.addRace("Race1", /* explicitFactor */ null, 2., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null, false);
|
||||
leaderboardOriginalDTO.addRace("Race3", /* explicitFactor */ null, 2., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null, false);
|
||||
leaderboardOriginalDTO.addRace("Race2", /* explicitFactor */ null, 2., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null, false);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testColumnSwapping() {
|
||||
testColumnSwappingFabian();
|
||||
testLeaderBoardDTOMethods();
|
||||
testSailingService();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSailingService() {
|
||||
sailingService = new SailingServiceImplMock();
|
||||
assertNotNull("Sailingservice != NULL", sailingService);
|
||||
int td[] = { 5, 8 };
|
||||
sailingService.removeLeaderboard(TEST_LEADERBOARD_NAME);
|
||||
sailingService.createFlexibleLeaderboard(TEST_LEADERBOARD_NAME, null, td, ScoringSchemeType.LOW_POINT, null);
|
||||
for (int i = 0; i < races.length; i++)
|
||||
sailingService.addColumnToLeaderboard(races[i], TEST_LEADERBOARD_NAME, isMedalRace[i]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnUp(TEST_LEADERBOARD_NAME, races[2]);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[0], true);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[2], false);
|
||||
try {
|
||||
for (int i = 0; i < races.length; i++)
|
||||
sailingService.addColumnToLeaderboard(races[i], TEST_LEADERBOARD_NAME, isMedalRace[i]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnDown(TEST_LEADERBOARD_NAME, races[0]);
|
||||
sailingService.moveLeaderboardColumnUp(TEST_LEADERBOARD_NAME, races[2]);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[0], true);
|
||||
sailingService.updateIsMedalRace(TEST_LEADERBOARD_NAME, races[2], false);
|
||||
lb = sailingService.getLeaderboardByName(TEST_LEADERBOARD_NAME, new Date(), /* races to load */ null, /* addOverallDetails */ true, /* previous leaderboard ID */ null,
|
||||
/* fillNetPointsUncorrected */ false).getLeaderboardDTO(/* previousVersion */ null);
|
||||
} catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
fail(e.getLocalizedMessage());
|
||||
}
|
||||
assertNotNull("LeaderboardDTO != NULL", lb);
|
||||
|
||||
// asserted data
|
||||
String[] raceNames = new String[] { "3", "2", "1" };
|
||||
boolean[] medalRace = { true, false, false };
|
||||
|
||||
for (int i = 0; i < lb.getRaceList().size(); i++) {
|
||||
assertEquals("Race[" + i + "] == " + raceNames[i], raceNames[i], lb.getRaceList().get(i).getName());
|
||||
assertTrue("Race[" + i + "] is " + (medalRace[i] ? "" : "no ") + "medalrace.",
|
||||
lb.raceIsMedalRace(races[i]) == medalRace[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLeaderBoardDTOMethods() {
|
||||
lb = new LeaderboardDTO(null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
|
||||
@Override
|
||||
public String generateRandomUUID() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
}, /* hasOverallDetails */ false);
|
||||
assertNotNull("Leaderboard != NULL", lb);
|
||||
lb.addRace("1", /* explicitFactor */ null, 1., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, false, null, null, false);
|
||||
lb.addRace("2", /* explicitFactor */ null, 1., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, false, null, null, false);
|
||||
lb.addRace("3", /* explicitFactor */ null, 1., /* regattaName */ null, /* seriesName */ null, DEFAULT_FLEET, true, null, null, false);
|
||||
lb.moveRaceDown("1");
|
||||
String[] s = new String[] { "2", "1", "3" };
|
||||
for (int i = 0; i < lb.getRaceList().size(); i++) {
|
||||
assertEquals("Race[" + i + "] = " + s[i], s[i], lb.getRaceList().get(i).getName());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testColumnSwappingFabian() {
|
||||
service.moveLeaderboardColumnUp(LEADERBOARDNAME, "Race3");
|
||||
try {
|
||||
leaderboardDTO = service.getLeaderboardByName(LEADERBOARDNAME, leaderboardCreationDate, leglist, /* addOverallDetails */
|
||||
true, /* previous leaderboard ID */null, /* fillNetPointsUncorrected */false).getLeaderboardDTO(/* previousVersion */null);
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// check if leaderboardDTO an dleaderboardOriginalDTO same
|
||||
List<RaceColumnDTO> leaderboardList = leaderboardDTO.getRaceList();
|
||||
List<RaceColumnDTO> leaderboardOriginalList = leaderboardOriginalDTO.getRaceList();
|
||||
|
||||
// ??????? assert races in list
|
||||
assertArrayEquals(leaderboardList.toArray(), leaderboardOriginalList.toArray());
|
||||
|
||||
for (RaceColumnDTO raceDTO : leaderboardOriginalList) {
|
||||
assert leaderboardDTO.raceIsMedalRace(raceDTO.getRaceColumnName()) == leaderboardOriginalDTO.raceIsMedalRace(raceDTO.getRaceColumnName());
|
||||
assert leaderboardDTO.raceIsTracked(raceDTO.getRaceColumnName()) == leaderboardOriginalDTO.raceIsTracked(raceDTO.getRaceColumnName());
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-2
@@ -233,6 +233,7 @@ import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
|
||||
import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuseCache;
|
||||
import com.sap.sailing.domain.leaderboard.caching.LiveLeaderboardUpdater;
|
||||
import com.sap.sailing.domain.leaderboard.meta.MetaLeaderboardColumn;
|
||||
import com.sap.sailing.domain.persistence.DomainObjectFactory;
|
||||
import com.sap.sailing.domain.persistence.MongoObjectFactory;
|
||||
import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory;
|
||||
@@ -853,7 +854,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
final RaceColumnDTO raceColumnDTO = columnFactory.createRaceColumnDTO(raceColumn.getName(),
|
||||
raceColumn.isMedalRace(), raceColumn.getExplicitFactor(),
|
||||
raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getRegatta().getName() : null,
|
||||
raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getSeries().getName() : null);
|
||||
raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getSeries().getName() : null,
|
||||
raceColumn instanceof MetaLeaderboardColumn);
|
||||
raceColumnDTOs.add(raceColumnDTO);
|
||||
}
|
||||
return raceColumnDTOs;
|
||||
@@ -2384,7 +2386,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
RaceColumnDTO raceColumnDTO = leaderboardDTO.addRace(raceColumn.getName(), raceColumn.getExplicitFactor(), raceColumn.getFactor(),
|
||||
raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getRegatta().getName() : null,
|
||||
raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getSeries().getName() : null,
|
||||
fleetDTO, raceColumn.isMedalRace(), raceIdentifier, raceDTO);
|
||||
fleetDTO, raceColumn.isMedalRace(), raceIdentifier, raceDTO, raceColumn instanceof MetaLeaderboardColumn);
|
||||
RaceLog raceLog = raceColumn.getRaceLog(fleet);
|
||||
RaceLogTrackingState raceLogTrackingState = raceLog == null ? RaceLogTrackingState.NOT_A_RACELOG_TRACKED_RACE :
|
||||
new RaceLogTrackingStateAnalyzer(raceLog).analyze();
|
||||
|
||||
Reference in new issue
Block a user