Adjusted leaderboard calculation logic for meta leaderboard to show

current act as live in overall leaderboard view
This commit is contained in:
Benjamin Barth committed 2015-12-01 11:34:36 +01:00
1 parent 76910cd613
commit 465de8dda2
6 files changed
+2586 -2505

No files matched your search

@@ -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;
}
}
@@ -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;
}
}
@@ -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;
@@ -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());
}
}
}
@@ -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();