added a new 'timepoint' attribute to LeaderboardDTO to know also for 'live leaderboard' requests where the request timepoint is 'null' the timepoint for which leaderboard has been calculated.

Used this timepoint than for the 'resultTimepoint' of the leaderboard API
This commit is contained in:
Frank Mittag committed 2018-03-02 14:05:36 +01:00
1 parent 6badca4e8c
commit fca55ba44e
6 files changed
+28 -22

No files matched your search

@@ -42,6 +42,9 @@ public class LeaderboardDTO extends AbstractLeaderboardDTO implements Serializab
private Map<String, List<CompetitorDTO>> competitorOrderingPerRaceColumnName;
/** timpoint of the leaderboard */
private Date timePoint;
private Date timePointOfLastCorrectionsValidity;
private String comment;
@@ -63,9 +66,10 @@ public class LeaderboardDTO extends AbstractLeaderboardDTO implements Serializab
* @param uuidGenerator used to provide the {@link #id ID} for this object (see also {@link #getId()}) and for any clones produced
* from it by the {@link #clone()} operation.
*/
public LeaderboardDTO(Date timePointOfLastCorrectionsValidity, String comment, ScoringSchemeType scoringScheme, boolean higherScoreIsBetter, UUIDGenerator uuidGenerator, boolean hasOverallDetails) {
public LeaderboardDTO(Date timepoint, Date timePointOfLastCorrectionsValidity, String comment, ScoringSchemeType scoringScheme, boolean higherScoreIsBetter, UUIDGenerator uuidGenerator, boolean hasOverallDetails) {
initCollections();
id = uuidGenerator.generateRandomUUID();
this.timePoint = timepoint;
this.timePointOfLastCorrectionsValidity = timePointOfLastCorrectionsValidity;
this.scoringScheme = scoringScheme;
this.comment = comment;
@@ -157,6 +161,13 @@ public class LeaderboardDTO extends AbstractLeaderboardDTO implements Serializab
return timePointOfLastCorrectionsValidity;
}
/**
* Returns the timepoint for which the leaderboard has been created.
*/
public Date getTimePoint() {
return timePoint;
}
@Override
public int hashCode() {
return super.hashCode() ^ ((competitors == null) ? 0 : competitors.hashCode());
@@ -352,7 +352,7 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard {
throws NoWindException {
long startOfRequestHandling = System.currentTimeMillis();
final LeaderboardDTOCalculationReuseCache cache = new LeaderboardDTOCalculationReuseCache(timePoint);
final LeaderboardDTO result = new LeaderboardDTO(this.getScoreCorrection().getTimePointOfLastCorrectionsValidity() == null ? null
final LeaderboardDTO result = new LeaderboardDTO(timePoint.asDate(), this.getScoreCorrection().getTimePointOfLastCorrectionsValidity() == null ? null
: this.getScoreCorrection().getTimePointOfLastCorrectionsValidity().asDate(),
this.getScoreCorrection() == null ? null : this.getScoreCorrection().getComment(),
this.getScoringScheme() == null ? null : this.getScoringScheme().getType(), this
@@ -55,7 +55,7 @@ public class TestColumnSwapping {
leaderboardCreationDate = new Date();
try {
// get Leaderboard with name and current date
leaderboardOriginalDTO = new LeaderboardDTO(null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
leaderboardOriginalDTO = new LeaderboardDTO(new Date(), null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
@Override
public String generateRandomUUID() {
return UUID.randomUUID().toString();
@@ -119,7 +119,7 @@ public class TestColumnSwapping {
@Test
public void testLeaderBoardDTOMethods() {
lb = new LeaderboardDTO(null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
lb = new LeaderboardDTO(new Date(), null, null, ScoringSchemeType.LOW_POINT, /* higherScoreIsBetter */ false, new LeaderboardDTO.UUIDGenerator() {
@Override
public String generateRandomUUID() {
return UUID.randomUUID().toString();
@@ -85,11 +85,11 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer
}
protected void writeCommonLeaderboardData(JSONObject jsonLeaderboard, LeaderboardDTO leaderboard,
ResultStates resultState, TimePoint resultTimePoint, Integer maxCompetitorsCount) {
ResultStates resultState, Integer maxCompetitorsCount) {
jsonLeaderboard.put("name", leaderboard.name);
final String displayName = leaderboard.getDisplayName();
jsonLeaderboard.put("displayName", displayName == null ? leaderboard.name : displayName);
jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.asMillis() : null);
jsonLeaderboard.put("resultTimepoint", leaderboard.getTimePoint() != null ? leaderboard.getTimePoint().getTime() : null);
jsonLeaderboard.put("resultState", resultState.name());
jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount);
jsonLeaderboard.put("higherScoreIsBetter", leaderboard.isHigherScoreBetter());
@@ -155,12 +155,10 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
.type(MediaType.TEXT_PLAIN).build();
} else {
try {
TimePoint resultTimePoint = calculateTimePointForResultState(leaderboard, resultState);
TimePoint timePoint = calculateTimePointForResultState(leaderboard, resultState);
JSONObject jsonLeaderboard;
if (resultTimePoint != null) {
Util.Triple<TimePoint, ResultStates, Integer> resultStateAndTimePoint = new Util.Triple<>(
resultTimePoint, resultState, maxCompetitorsCount);
jsonLeaderboard = getLeaderboardJson(leaderboard, resultStateAndTimePoint);
if (timePoint != null || resultState == ResultStates.Live) {
jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount);
} else {
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint,
maxCompetitorsCount);
@@ -181,19 +179,16 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
}
private JSONObject getLeaderboardJson(Leaderboard leaderboard,
Util.Triple<TimePoint, ResultStates, Integer> timePointAndResultStateAndMaxCompetitorsCount)
TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount)
throws NoWindException, InterruptedException, ExecutionException {
LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO(
timePointAndResultStateAndMaxCompetitorsCount.getA(), Collections.<String> emptyList(), /* addOverallDetails */
resultTimePoint, Collections.<String> emptyList(), /* addOverallDetails */
false, getService(), getService().getBaseDomainFactory(),
/* fillTotalPointsUncorrected */false);
TimePoint resultTimePoint = timePointAndResultStateAndMaxCompetitorsCount.getA();
ResultStates resultState = timePointAndResultStateAndMaxCompetitorsCount.getB();
Integer maxCompetitorsCount = timePointAndResultStateAndMaxCompetitorsCount.getC();
JSONObject jsonLeaderboard = new JSONObject();
writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, resultTimePoint, maxCompetitorsCount);
writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, maxCompetitorsCount);
JSONArray jsonCompetitorEntries = new JSONArray();
jsonLeaderboard.put("competitors", jsonCompetitorEntries);
@@ -63,16 +63,16 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
.type(MediaType.TEXT_PLAIN).build();
} else {
try {
TimePoint resultTimePoint;
TimePoint timePoint;
try {
resultTimePoint = parseTimePoint(time, timeasmillis, calculateTimePointForResultState(leaderboard, resultState));
timePoint = parseTimePoint(time, timeasmillis, calculateTimePointForResultState(leaderboard, resultState));
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the time.")
.type(MediaType.TEXT_PLAIN).build();
}
JSONObject jsonLeaderboard;
if (resultTimePoint != null || resultState == ResultStates.Live) {
jsonLeaderboard = getLeaderboardJson(leaderboard, resultTimePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetails);
if (timePoint != null || resultState == ResultStates.Live) {
jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetails);
} else {
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint,
maxCompetitorsCount);
@@ -107,7 +107,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
JSONObject jsonLeaderboard = new JSONObject();
writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, resultTimePoint, maxCompetitorsCount);
writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, maxCompetitorsCount);
Map<String, Map<String, Map<CompetitorDTO, Integer>>> competitorRanksPerRaceColumnsAndFleets = new HashMap<>();
for (String raceColumnName : raceColumnsToShow) {