From 242a672faf80afd40260e8ae2d00ad15adeda255 Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Wed, 18 Apr 2018 11:22:59 +0200 Subject: [PATCH 01/14] Changed RegattaJsonSerializer to write also 'canBoatsOfCompetitorsChangePerRace' attribute and (optinally) the boats used in the regatta --- .../impl/RegattaJsonSerializer.java | 34 +++++++++++++++---- .../gateway/jaxrs/api/RegattasResource.java | 8 ++--- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java index 5f4a4192b0c..eec99654c76 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java @@ -3,7 +3,9 @@ package com.sap.sailing.server.gateway.serialization.impl; import org.json.simple.JSONArray; import org.json.simple.JSONObject; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CompetitorWithBoat; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; import com.sap.sailing.server.gateway.serialization.JsonSerializer; @@ -16,19 +18,26 @@ public class RegattaJsonSerializer implements JsonSerializer { public static final String FIELD_SCORINGSYSTEM = "scoringSystem"; public static final String FIELD_SERIES = "series"; public static final String FIELD_COMPETITORS = "competitors"; + public static final String FIELD_BOATS = "boats"; public static final String FIELD_TRACKED_RACES = "trackedRaces"; public static final String FIELD_COURSE_AREA_ID = "courseAreaId"; + public static final String FIELD_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE = "canBoatsOfCompetitorsChangePerRace"; private final JsonSerializer seriesSerializer; private final JsonSerializer competitorSerializer; + private final JsonSerializer competitorWithBoatSerializer; + private final JsonSerializer boatSerializer; public RegattaJsonSerializer() { - this(null, null); + this(null, null, null); } - public RegattaJsonSerializer(JsonSerializer seriesSerializer, JsonSerializer competitorSerializer) { + public RegattaJsonSerializer(JsonSerializer seriesSerializer, + JsonSerializer competitorSerializer, JsonSerializer boatSerializer) { this.seriesSerializer = seriesSerializer; this.competitorSerializer = competitorSerializer; + this.boatSerializer = boatSerializer; + this.competitorWithBoatSerializer = competitorSerializer != null ? new CompetitorWithBoatRefJsonSerializer(competitorSerializer) : null; } public JSONObject serialize(Regatta regatta) { @@ -37,8 +46,10 @@ public class RegattaJsonSerializer implements JsonSerializer { result.put(FIELD_START_DATE, regatta.getStartDate() != null ? regatta.getStartDate().asMillis() : null); result.put(FIELD_END_DATE, regatta.getEndDate() != null ? regatta.getEndDate().asMillis() : null); result.put(FIELD_SCORINGSYSTEM, regatta.getScoringScheme().getType().name()); - result.put(FIELD_BOATCLASS, regatta.getBoatClass() != null ? regatta.getBoatClass().getName(): null); - result.put(FIELD_COURSE_AREA_ID, regatta.getDefaultCourseArea() != null ? regatta.getDefaultCourseArea().getId().toString(): null); + result.put(FIELD_BOATCLASS, regatta.getBoatClass() != null ? regatta.getBoatClass().getName() : null); + result.put(FIELD_COURSE_AREA_ID, + regatta.getDefaultCourseArea() != null ? regatta.getDefaultCourseArea().getId().toString() : null); + result.put(FIELD_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE, regatta.canBoatsOfCompetitorsChangePerRace()); if (seriesSerializer != null) { JSONArray seriesJson = new JSONArray(); for (Series series : regatta.getSeries()) { @@ -48,11 +59,22 @@ public class RegattaJsonSerializer implements JsonSerializer { } if (competitorSerializer != null) { JSONArray competitorsJson = new JSONArray(); - for (Competitor competitor: regatta.getAllCompetitors()) { - competitorsJson.add(competitorSerializer.serialize(competitor)); + for (Competitor competitor : regatta.getAllCompetitors()) { + if (competitor.hasBoat()) { + competitorsJson.add(competitorWithBoatSerializer.serialize((CompetitorWithBoat) competitor)); + } else { + competitorsJson.add(competitorSerializer.serialize(competitor)); + } } result.put(FIELD_COMPETITORS, competitorsJson); } + if (boatSerializer != null) { + JSONArray boatsJson = new JSONArray(); + for (Boat boat: regatta.getAllBoats()) { + boatsJson.add(boatSerializer.serialize(boat)); + } + result.put(FIELD_BOATS, boatsJson); + } return result; } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java index 6a8ccc03adf..1ef19015d0e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java @@ -190,9 +190,8 @@ public class RegattasResource extends AbstractSailingServerResource { } else { SeriesJsonSerializer seriesJsonSerializer = new SeriesJsonSerializer(new FleetJsonSerializer( new ColorJsonSerializer())); - JsonSerializer regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, null); + JsonSerializer regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, null, null); JSONObject serializedRegatta = regattaSerializer.serialize(regatta); - String json = serializedRegatta.toJSONString(); response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } @@ -217,8 +216,9 @@ public class RegattasResource extends AbstractSailingServerResource { } else { NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer( - new PersonJsonSerializer(nationalityJsonSerializer)), new BoatJsonSerializer(new BoatClassJsonSerializer())); - JsonSerializer regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer); + new PersonJsonSerializer(nationalityJsonSerializer)), null); + BoatJsonSerializer boatJsonSerializer = new BoatJsonSerializer(new BoatClassJsonSerializer()); + JsonSerializer regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer, boatJsonSerializer); JSONObject serializedRegatta = regattaSerializer.serialize(regatta); String json = serializedRegatta.toJSONString(); response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); From 4aebd93edfaa91bb6014d6ab3c09019d0a1ca42f Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Wed, 18 Apr 2018 11:58:51 +0200 Subject: [PATCH 02/14] fix for regatta.getAllBoats() for case where no raceDefinition can be found --- .../src/com/sap/sailing/domain/base/impl/RegattaImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index e43126fd9f9..1b5176989f0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -467,7 +467,9 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene hasRaceColumns = true; for (final Fleet fleet : rc.getFleets()) { RaceDefinition raceDefinition = rc.getRaceDefinition(fleet); - Util.addAll(raceDefinition.getBoats(), result); + if (raceDefinition != null) { + Util.addAll(raceDefinition.getBoats(), result); + } } } final RegattaLog regattaLog = getRegattaLog(); From af353909e50ad48f50590ec7c4ea66141a32c078 Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Wed, 18 Apr 2018 12:28:46 +0200 Subject: [PATCH 03/14] added 'canBoatsOfCompetitorsChangePerRace' and 'type' on leaderboardResource --- .../jaxrs/api/AbstractLeaderboardsResource.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java index 89b5fd4d5ea..9441959b140 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java @@ -18,6 +18,7 @@ import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.regattalike.HasRegattaLike; import com.sap.sailing.domain.tracking.MarkPassing; @@ -96,6 +97,8 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer jsonLeaderboard.put("displayName", displayName == null ? leaderboard.name : displayName); jsonLeaderboard.put("resultTimepoint", leaderboard.getTimePoint() != null ? leaderboard.getTimePoint().getTime() : null); jsonLeaderboard.put("resultState", resultState.name()); + jsonLeaderboard.put("type", leaderboard.type); + jsonLeaderboard.put("canBoatsOfCompetitorsChangePerRace", leaderboard.canBoatsOfCompetitorsChangePerRace); jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount); jsonLeaderboard.put("higherScoreIsBetter", leaderboard.isHigherScoreBetter()); jsonLeaderboard.put("scoringComment", leaderboard.getComment()); @@ -126,6 +129,13 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer jsonLeaderboard.put("displayName", displayName == null ? leaderboard.getName() : displayName); jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.asMillis() : null); jsonLeaderboard.put("resultState", resultState.name()); + jsonLeaderboard.put("type", leaderboard.getLeaderboardType().toString()); + if (leaderboard instanceof RegattaLeaderboard) { + RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard; + jsonLeaderboard.put("canBoatsOfCompetitorsChangePerRace", regattaLeaderboard.getRegatta().canBoatsOfCompetitorsChangePerRace()); + } else { + jsonLeaderboard.put("canBoatsOfCompetitorsChangePerRace", false); + } jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount); SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); if (scoreCorrection != null) { From ec7e0993dd419d710eedbf0727d5691f4111d6a0 Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Wed, 18 Apr 2018 18:03:03 +0200 Subject: [PATCH 04/14] Writes the attribute 'boat' (of type boatDTO) which can be part of LeaderboardRowDTO or LeaderboardEntryDTO to the leaderboard json API --- .../jaxrs/api/AbstractLeaderboardsResource.java | 12 +++++++++++- .../gateway/jaxrs/api/LeaderboardsResourceV2.java | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java index 9441959b140..6c4bb04b2c6 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java @@ -14,6 +14,7 @@ import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.NoWindException; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; @@ -117,11 +118,20 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer final String displayName = leaderboard.getDisplayName(competitor); jsonCompetitor.put("displayName", displayName == null ? competitor.getName() : displayName); jsonCompetitor.put("id", competitor.getIdAsString()); - jsonCompetitor.put("sailID", competitor.getSailID()); + jsonCompetitor.put("sailID", competitor.getSailID()); // only for backward compatibility jsonCompetitor.put("nationality", competitor.getThreeLetterIocCountryCode()); jsonCompetitor.put("countryCode", competitor.getTwoLetterIsoCountryCode()); } + protected void writeBoatData(JSONObject jsonBoat, BoatDTO boat) { + jsonBoat.put("name", boat.getName()); + jsonBoat.put("displayName", boat.getDisplayName()); + jsonBoat.put("id", boat.getIdAsString()); + jsonBoat.put("sailId", boat.getSailId()); + jsonBoat.put("boatClass", boat.getBoatClass().getName()); + jsonBoat.put("color", boat.getColor() != null ? boat.getColor().toString() : null); + } + private void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, ResultStates resultState, TimePoint resultTimePoint, Integer maxCompetitorsCount) { jsonLeaderboard.put("name", leaderboard.getName()); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index 9a7c4e59ec8..a53c4316abf 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -31,6 +31,7 @@ import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.ManeuverType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; @@ -136,6 +137,12 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { } JSONObject jsonCompetitor = new JSONObject(); writeCompetitorBaseData(jsonCompetitor, competitor, leaderboardDTO); + BoatDTO rowBoatDTO = leaderboardRowDTO.boat; + if (rowBoatDTO != null) { + JSONObject jsonBoat = new JSONObject(); + writeBoatData(jsonBoat, rowBoatDTO); + jsonCompetitor.put("boat", jsonBoat); + } jsonCompetitor.put("rank", competitorCounter); jsonCompetitor.put("carriedPoints", leaderboardRowDTO.carriedPoints); jsonCompetitor.put("netPoints", leaderboardRowDTO.netPoints); @@ -147,6 +154,12 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { JSONObject jsonEntry = new JSONObject(); jsonRaceColumns.put(raceColumnName, jsonEntry); LeaderboardEntryDTO leaderboardEntry = leaderboardRowDTO.fieldsByRaceColumnName.get(raceColumnName); + BoatDTO entryBoatDTO = leaderboardEntry.boat; + if (entryBoatDTO != null) { + JSONObject jsonBoat = new JSONObject(); + writeBoatData(jsonBoat, rowBoatDTO); + jsonCompetitor.put("boat", jsonBoat); + } final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet; jsonEntry.put("fleet", fleetOfCompetitor == null ? "" : fleetOfCompetitor.getName()); jsonEntry.put("totalPoints", leaderboardEntry.totalPoints); From 8a614c3027498cf45f8c5b1b9dd6fd2dd0f90565 Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Wed, 18 Apr 2018 18:18:27 +0200 Subject: [PATCH 05/14] little bug fix --- .../server/gateway/jaxrs/api/LeaderboardsResourceV2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index a53c4316abf..1e8a53ca1e6 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -157,7 +157,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { BoatDTO entryBoatDTO = leaderboardEntry.boat; if (entryBoatDTO != null) { JSONObject jsonBoat = new JSONObject(); - writeBoatData(jsonBoat, rowBoatDTO); + writeBoatData(jsonBoat, entryBoatDTO); jsonCompetitor.put("boat", jsonBoat); } final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet; From 746c1737999e5e4e2f0b007d942356b97066d253 Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Wed, 18 Apr 2018 18:36:32 +0200 Subject: [PATCH 06/14] another small fix --- .../server/gateway/jaxrs/api/LeaderboardsResourceV2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index 1e8a53ca1e6..7aa63099d37 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -158,7 +158,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { if (entryBoatDTO != null) { JSONObject jsonBoat = new JSONObject(); writeBoatData(jsonBoat, entryBoatDTO); - jsonCompetitor.put("boat", jsonBoat); + jsonEntry.put("boat", jsonBoat); } final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet; jsonEntry.put("fleet", fleetOfCompetitor == null ? "" : fleetOfCompetitor.getName()); From 9b1518520a9214078ee3bc3d59d54cc23a395073 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 19 Apr 2018 21:28:01 +0200 Subject: [PATCH 07/14] formatting/whitespace changes only Change-Id: Id0cfe3f3a65069ebc3625c27419dd37839bd20c8 --- .../sap/sailing/domain/base/impl/RegattaImpl.java | 6 ++---- .../gateway/jaxrs/api/LeaderboardsResource.java | 12 +----------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 1b5176989f0..0071b6de40b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -460,8 +460,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public Iterable getAllBoats() { - Set result = new HashSet(); - + Set result = new HashSet<>(); boolean hasRaceColumns = false; for (RaceColumn rc : getRaceColumns()) { hasRaceColumns = true; @@ -474,12 +473,11 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } final RegattaLog regattaLog = getRegattaLog(); if (!hasRaceColumns) { - // If no race exists, the regatta log-provided competitor registrations will not have + // If no race exists, the regatta log-provided boat registrations will not have // been considered yet; add them: final Map regattaLogProvidedCompetitorsAndBoats = new CompetitorsAndBoatsInLogAnalyzer<>(regattaLog).analyze(); Util.addAll(regattaLogProvidedCompetitorsAndBoats.values(), result); } - return result; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 9e603d6aacc..c3de43ce3ee 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -149,7 +149,6 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { @DefaultValue("Live") @QueryParam("resultState") ResultStates resultState, @QueryParam("maxCompetitorsCount") Integer maxCompetitorsCount) { Response response; - TimePoint requestTimePoint = MillisecondsTimePoint.now(); Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboard == null) { @@ -166,10 +165,8 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint, maxCompetitorsCount); } - StringWriter sw = new StringWriter(); jsonLeaderboard.writeJSONString(sw); - String json = sw.getBuffer().toString(); response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } catch (NoWindException | InterruptedException | ExecutionException | IOException e) { @@ -177,7 +174,6 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { .type(MediaType.TEXT_PLAIN).build(); } } - return response; } @@ -188,17 +184,13 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { resultTimePoint, Collections. emptyList(), /* addOverallDetails */ false, getService(), getService().getBaseDomainFactory(), /* fillTotalPointsUncorrected */false); - JSONObject jsonLeaderboard = new JSONObject(); - writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, maxCompetitorsCount); - JSONArray jsonCompetitorEntries = new JSONArray(); jsonLeaderboard.put("competitors", jsonCompetitorEntries); int counter = 1; for (CompetitorWithBoatDTO competitor : leaderboardDTO.competitors) { LeaderboardRowDTO leaderboardRowDTO = leaderboardDTO.rows.get(competitor); - if (maxCompetitorsCount != null && counter > maxCompetitorsCount) { break; } @@ -215,9 +207,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { .getCompetitorOrderingPerRaceColumnName().get(raceColumn.getName()); JSONObject jsonEntry = new JSONObject(); jsonRaceColumns.put(raceColumn.getName(), jsonEntry); - LeaderboardEntryDTO leaderboardEntry = leaderboardRowDTO.fieldsByRaceColumnName.get(raceColumn - .getName()); - + LeaderboardEntryDTO leaderboardEntry = leaderboardRowDTO.fieldsByRaceColumnName.get(raceColumn.getName()); final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet; jsonEntry.put("fleet", fleetOfCompetitor == null ? "" : fleetOfCompetitor.getName()); jsonEntry.put("totalPoints", leaderboardEntry.totalPoints); From c8561c8f6c3bcabceec720672116a17278342051 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 19 Apr 2018 21:28:13 +0200 Subject: [PATCH 08/14] serialize boats separately only if competitors can change boats; remain compatible and serialize boats with competitors if they can't Change-Id: I0d7b93b83d8b8046aa56c71b4ca675b5152eb09d --- .../serialization/impl/RegattaJsonSerializer.java | 13 +++---------- .../server/gateway/jaxrs/api/RegattasResource.java | 4 ++-- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java index eec99654c76..8e37fc9c85f 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java @@ -5,7 +5,6 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.CompetitorWithBoat; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; import com.sap.sailing.server.gateway.serialization.JsonSerializer; @@ -25,7 +24,6 @@ public class RegattaJsonSerializer implements JsonSerializer { private final JsonSerializer seriesSerializer; private final JsonSerializer competitorSerializer; - private final JsonSerializer competitorWithBoatSerializer; private final JsonSerializer boatSerializer; public RegattaJsonSerializer() { @@ -37,7 +35,6 @@ public class RegattaJsonSerializer implements JsonSerializer { this.seriesSerializer = seriesSerializer; this.competitorSerializer = competitorSerializer; this.boatSerializer = boatSerializer; - this.competitorWithBoatSerializer = competitorSerializer != null ? new CompetitorWithBoatRefJsonSerializer(competitorSerializer) : null; } public JSONObject serialize(Regatta regatta) { @@ -60,17 +57,13 @@ public class RegattaJsonSerializer implements JsonSerializer { if (competitorSerializer != null) { JSONArray competitorsJson = new JSONArray(); for (Competitor competitor : regatta.getAllCompetitors()) { - if (competitor.hasBoat()) { - competitorsJson.add(competitorWithBoatSerializer.serialize((CompetitorWithBoat) competitor)); - } else { - competitorsJson.add(competitorSerializer.serialize(competitor)); - } + competitorsJson.add(competitorSerializer.serialize(competitor)); } result.put(FIELD_COMPETITORS, competitorsJson); } - if (boatSerializer != null) { + if (regatta.canBoatsOfCompetitorsChangePerRace() && boatSerializer != null) { JSONArray boatsJson = new JSONArray(); - for (Boat boat: regatta.getAllBoats()) { + for (Boat boat : regatta.getAllBoats()) { boatsJson.add(boatSerializer.serialize(boat)); } result.put(FIELD_BOATS, boatsJson); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java index a94b42a4da2..d92b694e0fa 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java @@ -215,9 +215,9 @@ public class RegattasResource extends AbstractSailingServerResource { response = getBadRegattaErrorResponse(regattaName); } else { NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); - CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer( - new PersonJsonSerializer(nationalityJsonSerializer)), null); BoatJsonSerializer boatJsonSerializer = new BoatJsonSerializer(new BoatClassJsonSerializer()); + CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer( + new PersonJsonSerializer(nationalityJsonSerializer)), boatJsonSerializer); JsonSerializer regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer, boatJsonSerializer); JSONObject serializedRegatta = regattaSerializer.serialize(regatta); String json = serializedRegatta.toJSONString(); From 96677487af8a40b45ad2b06a3955b42b6b2bf88a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 19 Apr 2018 21:31:55 +0200 Subject: [PATCH 09/14] use LeaderboardType enum literals' name() representation, not toString(), for leaderboard type field Change-Id: I3c8b04d498c1774efb35bf29d0f51991a0a9bcb8 --- .../gateway/jaxrs/api/AbstractLeaderboardsResource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java index 6c4bb04b2c6..65b56a6505e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java @@ -98,7 +98,7 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer jsonLeaderboard.put("displayName", displayName == null ? leaderboard.name : displayName); jsonLeaderboard.put("resultTimepoint", leaderboard.getTimePoint() != null ? leaderboard.getTimePoint().getTime() : null); jsonLeaderboard.put("resultState", resultState.name()); - jsonLeaderboard.put("type", leaderboard.type); + jsonLeaderboard.put("type", leaderboard.type.name()); jsonLeaderboard.put("canBoatsOfCompetitorsChangePerRace", leaderboard.canBoatsOfCompetitorsChangePerRace); jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount); jsonLeaderboard.put("higherScoreIsBetter", leaderboard.isHigherScoreBetter()); @@ -139,7 +139,7 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer jsonLeaderboard.put("displayName", displayName == null ? leaderboard.getName() : displayName); jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.asMillis() : null); jsonLeaderboard.put("resultState", resultState.name()); - jsonLeaderboard.put("type", leaderboard.getLeaderboardType().toString()); + jsonLeaderboard.put("type", leaderboard.getLeaderboardType().name()); if (leaderboard instanceof RegattaLeaderboard) { RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard; jsonLeaderboard.put("canBoatsOfCompetitorsChangePerRace", regattaLeaderboard.getRegatta().canBoatsOfCompetitorsChangePerRace()); From ab0efda1ba882817840468aa077e6308314a7477 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 19 Apr 2018 22:11:47 +0200 Subject: [PATCH 10/14] removed redundancies between the two leaderboard service variants Change-Id: I7186fbc350809c9acccec5cc99d82cf6d2565fff --- .../gateway/test/jaxrs/EventResourceTest.java | 3 +- .../test/jaxrs/LeaderboardsResourceTest.java | 31 +++++++------ .../api/AbstractLeaderboardsResource.java | 46 +++++++++---------- .../jaxrs/api/LeaderboardsResource.java | 16 +++---- .../jaxrs/api/LeaderboardsResourceV2.java | 5 +- 5 files changed, 50 insertions(+), 51 deletions(-) diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java index 760de829531..61c29225db0 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/EventResourceTest.java @@ -25,6 +25,7 @@ import com.sap.sailing.domain.common.NotFoundException; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; +import com.sap.sailing.server.gateway.jaxrs.api.AbstractLeaderboardsResource; import com.sap.sailing.server.gateway.jaxrs.api.EventsResource; import com.sap.sailing.server.gateway.jaxrs.api.LeaderboardGroupsResource; import com.sap.sailing.server.gateway.jaxrs.api.LeaderboardsResource; @@ -159,7 +160,7 @@ public class EventResourceTest extends AbstractJaxRsApiTest { } private Response getLeaderboard(String name) { - return leaderboardsResource.getLeaderboard(name, LeaderboardsResource.ResultStates.Final, null); + return leaderboardsResource.getLeaderboard(name, AbstractLeaderboardsResource.ResultStates.Final, null); } private boolean hasAtLeastOneCourseArea(JSONObject objEvent) { diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java index f7d855a5091..9412cfa4c9b 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java @@ -31,6 +31,7 @@ import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithStartTimeAndRanks; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.server.gateway.jaxrs.api.AbstractLeaderboardsResource; import com.sap.sailing.server.gateway.jaxrs.api.LeaderboardsResource; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -83,7 +84,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { dropAndCreateRegatta(); LeaderboardsResource resource = spyResource(new LeaderboardsResource()); - Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -93,7 +94,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { String jsonResultState = (String) jsonObject.get("resultState"); assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); - assertTrue(LeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); + assertTrue(AbstractLeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); // resultTimepoint should be null if there are no 'final' results yet TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); @@ -108,7 +109,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { dropAndCreateRegatta(); LeaderboardsResource resource = spyResource(new LeaderboardsResource()); - Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -118,7 +119,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { String jsonResultState = (String) jsonObject.get("resultState"); assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); - assertTrue(LeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); + assertTrue(AbstractLeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); assertNull(resultTimePoint); @@ -126,7 +127,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { regattaLeaderboard.getScoreCorrection().setTimePointOfLastCorrectionsValidity(MillisecondsTimePoint.now()); LeaderboardsResource resource2 = spyResource(new LeaderboardsResource()); - Response leaderboardReponse2 = resource2.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse2 = resource2.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); String jsonString2 = (String) leaderboardReponse2.getEntity(); obj= JSONValue.parse(jsonString2); @@ -141,7 +142,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { dropAndCreateRegatta(); LeaderboardsResource resource = spyResource(new LeaderboardsResource()); - Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Live, null); + Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Live, null); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -151,7 +152,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { String jsonResultState = (String) jsonObject.get("resultState"); assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); - assertTrue(LeaderboardsResource.ResultStates.Live.name().equals(jsonResultState)); + assertTrue(AbstractLeaderboardsResource.ResultStates.Live.name().equals(jsonResultState)); TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); assertNotNull(resultTimePoint); @@ -171,7 +172,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // call the servlet for the first time LeaderboardsResource resource = spyResource(new LeaderboardsResource()); - Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -181,7 +182,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { String jsonResultState = (String) jsonObject.get("resultState"); assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); - assertTrue(LeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); + assertTrue(AbstractLeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); assertNotNull(resultTimePoint); @@ -190,7 +191,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { Thread.sleep(100); LeaderboardsResource resource2 = spyResource(new LeaderboardsResource()); - Response leaderboardReponse2 = resource2.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse2 = resource2.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); String jsonString2 = (String) leaderboardReponse2.getEntity(); Object obj2= JSONValue.parse(jsonString2); @@ -213,7 +214,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { Integer maxCompetitorsCount = 2; LeaderboardsResource resource = spyResource(new LeaderboardsResource()); - Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -223,7 +224,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { String jsonResultState = (String) jsonObject.get("resultState"); assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); - assertTrue(LeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); + assertTrue(AbstractLeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); assertNull(resultTimePoint); @@ -232,7 +233,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // first call for 'all' competitors LeaderboardsResource resource2 = spyResource(new LeaderboardsResource()); - Response leaderboardReponse2 = resource2.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse2 = resource2.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); jsonString = (String) leaderboardReponse2.getEntity(); obj= JSONValue.parse(jsonString); @@ -244,7 +245,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // second call with maxCompetitorsCount set LeaderboardsResource resource3 = spyResource(new LeaderboardsResource()); - Response leaderboardReponse3 = resource3.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, maxCompetitorsCount); + Response leaderboardReponse3 = resource3.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, maxCompetitorsCount); jsonString = (String) leaderboardReponse3.getEntity(); obj= JSONValue.parse(jsonString); @@ -256,7 +257,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // third call for 'all' competitors LeaderboardsResource resource4 = spyResource(new LeaderboardsResource()); - Response leaderboardReponse4 = resource4.getLeaderboard(regatta.getName(), LeaderboardsResource.ResultStates.Final, null); + Response leaderboardReponse4 = resource4.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Final, null); jsonString = (String) leaderboardReponse4.getEntity(); obj= JSONValue.parse(jsonString); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java index 65b56a6505e..3397787b6bf 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java @@ -1,7 +1,8 @@ package com.sap.sailing.server.gateway.jaxrs.api; -import java.util.Date; import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ExecutionException; import java.util.logging.Logger; import org.json.simple.JSONArray; @@ -17,7 +18,6 @@ import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; -import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; @@ -91,27 +91,6 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer return jsonLeaderboard; } - protected void writeCommonLeaderboardData(JSONObject jsonLeaderboard, LeaderboardDTO leaderboard, - 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", leaderboard.getTimePoint() != null ? leaderboard.getTimePoint().getTime() : null); - jsonLeaderboard.put("resultState", resultState.name()); - jsonLeaderboard.put("type", leaderboard.type.name()); - jsonLeaderboard.put("canBoatsOfCompetitorsChangePerRace", leaderboard.canBoatsOfCompetitorsChangePerRace); - jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount); - jsonLeaderboard.put("higherScoreIsBetter", leaderboard.isHigherScoreBetter()); - jsonLeaderboard.put("scoringComment", leaderboard.getComment()); - Date lastUpdateTimepoint = leaderboard.getTimePointOfLastCorrectionsValidity(); - jsonLeaderboard.put("lastScoringUpdate", lastUpdateTimepoint != null ? lastUpdateTimepoint.getTime() : null); - JSONArray jsonColumnNames = new JSONArray(); - jsonLeaderboard.put("columnNames", jsonColumnNames); - for (RaceColumnDTO raceColumn : leaderboard.getRaceList()) { - jsonColumnNames.add(raceColumn.getName()); - } - } - protected void writeCompetitorBaseData(JSONObject jsonCompetitor, CompetitorWithBoatDTO competitor, LeaderboardDTO leaderboard) { jsonCompetitor.put("name", competitor.getName()); jsonCompetitor.put("shortName", competitor.getShortName()); @@ -132,7 +111,7 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer jsonBoat.put("color", boat.getColor() != null ? boat.getColor().toString() : null); } - private void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, + protected void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, ResultStates resultState, TimePoint resultTimePoint, Integer maxCompetitorsCount) { jsonLeaderboard.put("name", leaderboard.getName()); final String displayName = leaderboard.getDisplayName(); @@ -209,4 +188,23 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer } return result; } + + protected abstract JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint, + ResultStates resultState, Integer maxCompetitorsCount, List raceColumnNames, + List raceDetailNames) throws NoWindException, InterruptedException, ExecutionException; + + protected JSONObject getLeaderboardJson(ResultStates resultState, Integer maxCompetitorsCount, + TimePoint requestTimePoint, Leaderboard leaderboard, TimePoint timePoint, List raceColumnNames, + List raceDetailNames) + throws NoWindException, InterruptedException, ExecutionException { + final JSONObject jsonLeaderboard; + if (timePoint != null || resultState == ResultStates.Live) { + jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetailNames); + } else { + jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint, + maxCompetitorsCount); + } + return jsonLeaderboard; + } + } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index c3de43ce3ee..36d3f972ca7 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -159,12 +159,8 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { try { TimePoint timePoint = calculateTimePointForResultState(leaderboard, resultState); JSONObject jsonLeaderboard; - if (timePoint != null || resultState == ResultStates.Live) { - jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount); - } else { - jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint, - maxCompetitorsCount); - } + jsonLeaderboard = getLeaderboardJson(resultState, maxCompetitorsCount, requestTimePoint, leaderboard, timePoint, + /* race column names */ null, /* race detail names */ null); StringWriter sw = new StringWriter(); jsonLeaderboard.writeJSONString(sw); String json = sw.getBuffer().toString(); @@ -177,15 +173,17 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { return response; } - private JSONObject getLeaderboardJson(Leaderboard leaderboard, - TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount) + @Override + protected JSONObject getLeaderboardJson(Leaderboard leaderboard, + TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount, List raceColumnNames, + List raceDetailNames) throws NoWindException, InterruptedException, ExecutionException { LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO( resultTimePoint, Collections. emptyList(), /* addOverallDetails */ false, getService(), getService().getBaseDomainFactory(), /* fillTotalPointsUncorrected */false); JSONObject jsonLeaderboard = new JSONObject(); - writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, maxCompetitorsCount); + writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, resultTimePoint, maxCompetitorsCount); JSONArray jsonCompetitorEntries = new JSONArray(); jsonLeaderboard.put("competitors", jsonCompetitorEntries); int counter = 1; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index 7aa63099d37..b3571542233 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -95,7 +95,8 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { return response; } - private JSONObject getLeaderboardJson(Leaderboard leaderboard, + @Override + protected JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount, List raceColumnNames, List raceDetailNames) throws NoWindException, InterruptedException, ExecutionException { @@ -106,7 +107,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { false, getService(), getService().getBaseDomainFactory(), /* fillTotalPointsUncorrected */false); JSONObject jsonLeaderboard = new JSONObject(); - writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, maxCompetitorsCount); + writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, resultTimePoint, maxCompetitorsCount); Map>> competitorRanksPerRaceColumnsAndFleets = new HashMap<>(); for (String raceColumnName : raceColumnsToShow) { List competitorsFromBestToWorst = leaderboardDTO.getCompetitorsFromBestToWorst(raceColumnName); From 8b355d710d2e276bc155142a103dc5088c2f26bc Mon Sep 17 00:00:00 2001 From: Frank Mittag Date: Fri, 20 Apr 2018 11:24:32 +0200 Subject: [PATCH 11/14] fixed value of 'resultTimepoint' for live leaderboards json exports -> take leaderboardDTO.timepoint instead of requested timepoint as only the leaderboard calculation determines the real result timepoint. --- .../gateway/jaxrs/api/AbstractLeaderboardsResource.java | 5 +++-- .../server/gateway/jaxrs/api/LeaderboardsResource.java | 2 +- .../server/gateway/jaxrs/api/LeaderboardsResourceV2.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java index 3397787b6bf..8f980b645a0 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java @@ -1,5 +1,6 @@ package com.sap.sailing.server.gateway.jaxrs.api; +import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.concurrent.ExecutionException; @@ -112,11 +113,11 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer } protected void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, - ResultStates resultState, TimePoint resultTimePoint, Integer maxCompetitorsCount) { + ResultStates resultState, Date resultTimePoint, Integer maxCompetitorsCount) { jsonLeaderboard.put("name", leaderboard.getName()); final String displayName = leaderboard.getDisplayName(); jsonLeaderboard.put("displayName", displayName == null ? leaderboard.getName() : displayName); - jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.asMillis() : null); + jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.getTime() : null); jsonLeaderboard.put("resultState", resultState.name()); jsonLeaderboard.put("type", leaderboard.getLeaderboardType().name()); if (leaderboard instanceof RegattaLeaderboard) { diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 36d3f972ca7..2eb18860638 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -183,7 +183,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { false, getService(), getService().getBaseDomainFactory(), /* fillTotalPointsUncorrected */false); JSONObject jsonLeaderboard = new JSONObject(); - writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, resultTimePoint, maxCompetitorsCount); + writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, leaderboardDTO.getTimePoint(), maxCompetitorsCount); JSONArray jsonCompetitorEntries = new JSONArray(); jsonLeaderboard.put("competitors", jsonCompetitorEntries); int counter = 1; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index b3571542233..2cdadbe198a 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -107,7 +107,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { false, getService(), getService().getBaseDomainFactory(), /* fillTotalPointsUncorrected */false); JSONObject jsonLeaderboard = new JSONObject(); - writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, resultTimePoint, maxCompetitorsCount); + writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, leaderboardDTO.getTimePoint(), maxCompetitorsCount); Map>> competitorRanksPerRaceColumnsAndFleets = new HashMap<>(); for (String raceColumnName : raceColumnsToShow) { List competitorsFromBestToWorst = leaderboardDTO.getCompetitorsFromBestToWorst(raceColumnName); From d387814b085b40923887c67b4c050b316a4a93e4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 20 Apr 2018 11:37:42 +0200 Subject: [PATCH 12/14] use assertEquals Change-Id: I6c2444f2fba25a4abd183cab31bc427f08af33ce --- .../gateway/test/jaxrs/LeaderboardsResourceTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java index 9412cfa4c9b..193caf04f74 100644 --- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java +++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceTest.java @@ -118,8 +118,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { String jsonLeaderboardName = (String) jsonObject.get("name"); String jsonResultState = (String) jsonObject.get("resultState"); - assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); - assertTrue(AbstractLeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); + assertEquals(regattaLeaderboard.getName(), jsonLeaderboardName); + assertEquals(AbstractLeaderboardsResource.ResultStates.Final.name(), jsonResultState); TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); assertNull(resultTimePoint); @@ -140,23 +140,17 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { @Test public void testExportLeaderboardWithLiveResultStateAsJson() throws Exception { dropAndCreateRegatta(); - LeaderboardsResource resource = spyResource(new LeaderboardsResource()); Response leaderboardReponse = resource.getLeaderboard(regatta.getName(), AbstractLeaderboardsResource.ResultStates.Live, null); - String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); JSONObject jsonObject = (JSONObject) obj; - String jsonLeaderboardName = (String) jsonObject.get("name"); String jsonResultState = (String) jsonObject.get("resultState"); - assertTrue(regattaLeaderboard.getName().equals(jsonLeaderboardName)); assertTrue(AbstractLeaderboardsResource.ResultStates.Live.name().equals(jsonResultState)); - TimePoint resultTimePoint = parseTimepointFromJsonNumber((Long) jsonObject.get("resultTimepoint")); assertNotNull(resultTimePoint); - JSONArray jsonCompetitors = (JSONArray) jsonObject.get("competitors"); assertTrue(jsonCompetitors.size() == 4); } From f13e517f66a9fad0fd233317e198f705afb44ead Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 20 Apr 2018 11:40:56 +0200 Subject: [PATCH 13/14] removed unused requestTimePoint parameter Change-Id: I66d383b27bc6cdd3f148be523c1bbf5d8cb6b138 --- .../gateway/jaxrs/api/AbstractLeaderboardsResource.java | 6 ++---- .../server/gateway/jaxrs/api/LeaderboardsResourceV2.java | 8 +------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java index 8f980b645a0..5d060ae042e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/AbstractLeaderboardsResource.java @@ -49,8 +49,7 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer return result; } - protected JSONObject createEmptyLeaderboardJson(Leaderboard leaderboard, ResultStates resultState, - TimePoint requestTimePoint, Integer maxCompetitorsCount) throws NoWindException { + protected JSONObject createEmptyLeaderboardJson(Leaderboard leaderboard, ResultStates resultState, Integer maxCompetitorsCount) throws NoWindException { JSONObject jsonLeaderboard = new JSONObject(); writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, null, maxCompetitorsCount); JSONArray jsonCompetitorEntries = new JSONArray(); @@ -202,8 +201,7 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer if (timePoint != null || resultState == ResultStates.Live) { jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetailNames); } else { - jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint, - maxCompetitorsCount); + jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount); } return jsonLeaderboard; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index 2cdadbe198a..01766df3e00 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -57,8 +57,6 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { @QueryParam("time") String time, @QueryParam("timeasmillis") Long timeasmillis, @QueryParam("maxCompetitorsCount") Integer maxCompetitorsCount) { Response response; - - TimePoint requestTimePoint = MillisecondsTimePoint.now(); Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboard == null) { response = Response.status(Status.NOT_FOUND) @@ -77,13 +75,10 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { if (timePoint != null || resultState == ResultStates.Live) { jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetails); } else { - jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint, - maxCompetitorsCount); + jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount); } - StringWriter sw = new StringWriter(); jsonLeaderboard.writeJSONString(sw); - String json = sw.getBuffer().toString(); response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } catch (NoWindException | InterruptedException | ExecutionException | IOException e) { @@ -91,7 +86,6 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { .type(MediaType.TEXT_PLAIN).build(); } } - return response; } From c5370ad0bed7a34a7ade6a545b105e7ec6f1fcf2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 20 Apr 2018 11:42:41 +0200 Subject: [PATCH 14/14] consolidated imports Change-Id: Ia96ff4e252ee741da2bdc018bd0ca91a0420e94a --- .../sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java index 01766df3e00..b90da9520b1 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResourceV2.java @@ -43,7 +43,6 @@ import com.sap.sse.InvalidDateException; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Pair; -import com.sap.sse.common.impl.MillisecondsTimePoint; @Path("/v2/leaderboards") public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {