From 6facaa1745af24366d3ea95b1f7e03ec7cde66f2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 29 May 2019 09:57:45 +0200 Subject: [PATCH] added competitorAndBoatIdsOnly to both leaderboard end points Change-Id: I4950bfbd49d2a8c0cb7d33bd3ef58bcb02f4c2ad --- .../gateway/test/jaxrs/EventResourceTest.java | 3 +- .../test/jaxrs/LeaderboardsResourceTest.java | 30 ++++++++++----- .../api/AbstractLeaderboardsResource.java | 38 ++++++++++--------- .../jaxrs/api/LeaderboardsResource.java | 10 ++--- .../jaxrs/api/LeaderboardsResourceV2.java | 13 ++++--- .../webservices/api/v1/leaderboardGetDoc.html | 11 ++++++ .../webservices/api/v2/leaderboardGetDoc.html | 11 ++++++ 7 files changed, 77 insertions(+), 39 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 22f76048cfb..3d726b6b0de 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 @@ -148,7 +148,8 @@ public class EventResourceTest extends AbstractJaxRsApiTest { } private Response getLeaderboard(String name) { - return leaderboardsResource.getLeaderboard(name, AbstractLeaderboardsResource.ResultStates.Final, null, null); + return leaderboardsResource.getLeaderboard(name, AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); } 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 d2cfb0129ac..c218d131d20 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 @@ -86,7 +86,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { dropAndCreateRegatta(); Response leaderboardReponse = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -111,7 +112,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { dropAndCreateRegatta(); Response leaderboardReponse = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -129,7 +131,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { regattaLeaderboard.getScoreCorrection().setTimePointOfLastCorrectionsValidity(MillisecondsTimePoint.now()); Response leaderboardReponse2 = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString2 = (String) leaderboardReponse2.getEntity(); obj= JSONValue.parse(jsonString2); @@ -143,7 +146,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { public void testExportLeaderboardWithLiveResultStateAsJson() throws Exception { dropAndCreateRegatta(); Response leaderboardReponse = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Live, null, null); + AbstractLeaderboardsResource.ResultStates.Live, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); JSONObject jsonObject = (JSONObject) obj; @@ -168,7 +172,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // call the servlet for the first time Response leaderboardReponse = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -187,7 +192,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { Thread.sleep(100); Response leaderboardReponse2 = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString2 = (String) leaderboardReponse2.getEntity(); Object obj2= JSONValue.parse(jsonString2); @@ -210,7 +216,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { Integer maxCompetitorsCount = 2; Response leaderboardReponse = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); String jsonString = (String) leaderboardReponse.getEntity(); Object obj= JSONValue.parse(jsonString); @@ -229,7 +236,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // first call for 'all' competitors Response leaderboardReponse2 = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); jsonString = (String) leaderboardReponse2.getEntity(); obj= JSONValue.parse(jsonString); @@ -241,7 +249,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // second call with maxCompetitorsCount set Response leaderboardReponse3 = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, maxCompetitorsCount, null); + AbstractLeaderboardsResource.ResultStates.Final, maxCompetitorsCount, null, + /* competitorAndBoatIdsOnly */ false); jsonString = (String) leaderboardReponse3.getEntity(); obj= JSONValue.parse(jsonString); @@ -253,7 +262,8 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest { // third call for 'all' competitors Response leaderboardReponse4 = leaderboardsResource.getLeaderboard(regatta.getName(), - AbstractLeaderboardsResource.ResultStates.Final, null, null); + AbstractLeaderboardsResource.ResultStates.Final, null, null, + /* competitorAndBoatIdsOnly */ false); 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 8fbe1ab213b..03bea35290e 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 @@ -92,24 +92,28 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer return jsonLeaderboard; } - protected void writeCompetitorBaseData(JSONObject jsonCompetitor, CompetitorDTO competitor, LeaderboardDTO leaderboard) { - jsonCompetitor.put("name", competitor.getName()); - jsonCompetitor.put("shortName", competitor.getShortName()); - final String displayName = leaderboard.getDisplayName(competitor); - jsonCompetitor.put("displayName", displayName == null ? competitor.getName() : displayName); + protected void writeCompetitorBaseData(JSONObject jsonCompetitor, CompetitorDTO competitor, LeaderboardDTO leaderboard, boolean competitorAndBoatIdsOnly) { jsonCompetitor.put("id", competitor.getIdAsString()); - jsonCompetitor.put("sailID", competitor.hasBoat() ? ((CompetitorWithBoatDTO) competitor).getSailID() : null); // only for backward compatibility - jsonCompetitor.put("nationality", competitor.getThreeLetterIocCountryCode()); - jsonCompetitor.put("countryCode", competitor.getTwoLetterIsoCountryCode()); + if (!competitorAndBoatIdsOnly) { + jsonCompetitor.put("name", competitor.getName()); + jsonCompetitor.put("shortName", competitor.getShortName()); + final String displayName = leaderboard.getDisplayName(competitor); + jsonCompetitor.put("displayName", displayName == null ? competitor.getName() : displayName); + jsonCompetitor.put("sailID", competitor.hasBoat() ? ((CompetitorWithBoatDTO) competitor).getSailID() : null); // 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()); + protected void writeBoatData(JSONObject jsonBoat, BoatDTO boat, boolean competitorAndBoatIdsOnly) { 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); + if (!competitorAndBoatIdsOnly) { + jsonBoat.put("name", boat.getName()); + jsonBoat.put("displayName", boat.getDisplayName()); + jsonBoat.put("sailId", boat.getSailId()); + jsonBoat.put("boatClass", boat.getBoatClass().getName()); + jsonBoat.put("color", boat.getColor() != null ? boat.getColor().toString() : null); + } } protected void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, @@ -192,15 +196,15 @@ public abstract class AbstractLeaderboardsResource extends AbstractSailingServer protected abstract JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount, List raceColumnNames, - List raceDetailNames) throws NoWindException, InterruptedException, ExecutionException; + List raceDetailNames, boolean competitorAndBoatIdsOnly) 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 { + List raceDetailNames, boolean competitorAndBoatIdsOnly) throws NoWindException, InterruptedException, ExecutionException { final JSONObject jsonLeaderboard; if (timePoint != null || resultState == ResultStates.Live) { jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, - raceColumnNames, raceDetailNames); + raceColumnNames, raceDetailNames, competitorAndBoatIdsOnly); } else { jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount); } 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 bc4e269648d..8033c415bed 100755 --- 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 @@ -180,9 +180,9 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { public Response getLeaderboard(@PathParam("name") String leaderboardName, @DefaultValue("Live") @QueryParam("resultState") ResultStates resultState, @QueryParam("maxCompetitorsCount") Integer maxCompetitorsCount, - @QueryParam("secret") String regattaSecret) { + @QueryParam("secret") String regattaSecret, + @DefaultValue("false") @QueryParam("competitorAndBoatIdsOnly") boolean competitorAndBoatIdsOnly) { ShardingContext.setShardingConstraint(ShardingType.LEADERBOARDNAME, leaderboardName); - try { Response response; TimePoint requestTimePoint = MillisecondsTimePoint.now(); @@ -200,7 +200,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { TimePoint timePoint = calculateTimePointForResultState(leaderboard, resultState); JSONObject jsonLeaderboard; jsonLeaderboard = getLeaderboardJson(resultState, maxCompetitorsCount, requestTimePoint, - leaderboard, timePoint, /* race column names */ null, /* race detail names */ null); + leaderboard, timePoint, /* race column names */ null, /* race detail names */ null, competitorAndBoatIdsOnly); StringWriter sw = new StringWriter(); jsonLeaderboard.writeJSONString(sw); String json = sw.getBuffer().toString(); @@ -220,7 +220,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { @Override protected JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount, List raceColumnNames, - List raceDetailNames) + List raceDetailNames, boolean competitorIdsOnly) throws NoWindException, InterruptedException, ExecutionException { LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO( resultTimePoint, Collections. emptyList(), /* addOverallDetails */ @@ -238,7 +238,7 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { break; } JSONObject jsonCompetitor = new JSONObject(); - writeCompetitorBaseData(jsonCompetitor, competitor, leaderboardDTO); + writeCompetitorBaseData(jsonCompetitor, competitor, leaderboardDTO, competitorIdsOnly); jsonCompetitor.put("rank", counter); jsonCompetitor.put("carriedPoints", leaderboardRowDTO.carriedPoints); jsonCompetitor.put("netPoints", leaderboardRowDTO.netPoints); 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 5eb49e06e77..f7e91341b25 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 @@ -62,7 +62,8 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { @QueryParam("raceDetails") final List raceDetails, @QueryParam("time") String time, @QueryParam("timeasmillis") Long timeasmillis, @QueryParam("maxCompetitorsCount") Integer maxCompetitorsCount, - @QueryParam("secret") String regattaSecret) { + @QueryParam("secret") String regattaSecret, + @DefaultValue("false") @QueryParam("competitorAndBoatIdsOnly") boolean competitorAndBoatIdsOnly) { ShardingContext.setShardingConstraint(ShardingType.LEADERBOARDNAME, leaderboardName); try { Response response; @@ -86,7 +87,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { } JSONObject jsonLeaderboard; if (timePoint != null || resultState == ResultStates.Live) { - jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetails); + jsonLeaderboard = getLeaderboardJson(leaderboard, timePoint, resultState, maxCompetitorsCount, raceColumnNames, raceDetails, competitorAndBoatIdsOnly); } else { jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, maxCompetitorsCount); } @@ -108,7 +109,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { @Override protected JSONObject getLeaderboardJson(Leaderboard leaderboard, TimePoint resultTimePoint, ResultStates resultState, Integer maxCompetitorsCount, - List raceColumnNames, List raceDetailNames) + List raceColumnNames, List raceDetailNames, boolean competitorAndBoatIdsOnly) throws NoWindException, InterruptedException, ExecutionException { List raceColumnsToShow = calculateRaceColumnsToShow(raceColumnNames, leaderboard.getRaceColumns()); List raceDetailsToShow = calculateRaceDetailTypesToShow(raceDetailNames); @@ -171,11 +172,11 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { break; } JSONObject jsonCompetitor = new JSONObject(); - writeCompetitorBaseData(jsonCompetitor, competitor, leaderboardDTO); + writeCompetitorBaseData(jsonCompetitor, competitor, leaderboardDTO, competitorAndBoatIdsOnly); BoatDTO rowBoatDTO = leaderboardRowDTO.boat; if (rowBoatDTO != null) { JSONObject jsonBoat = new JSONObject(); - writeBoatData(jsonBoat, rowBoatDTO); + writeBoatData(jsonBoat, rowBoatDTO, competitorAndBoatIdsOnly); jsonCompetitor.put("boat", jsonBoat); } jsonCompetitor.put("rank", ranks.get(competitor)); @@ -192,7 +193,7 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { BoatDTO entryBoatDTO = leaderboardEntry.boat; if (entryBoatDTO != null) { JSONObject jsonBoat = new JSONObject(); - writeBoatData(jsonBoat, entryBoatDTO); + writeBoatData(jsonBoat, entryBoatDTO, competitorAndBoatIdsOnly); jsonEntry.put("boat", jsonBoat); } final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet; diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html index b1a091d1842..9d11e0aa75a 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/leaderboardGetDoc.html @@ -36,6 +36,17 @@   maxCompetitorsCount [1000 = Default] + +   + +
competitorAndBoatIdsOnly [Default = false, true] if true, only IDs and no further attributes + will be delivered for competitor and boat JSON objects in the result document. This can help + save bandwidth if the competitor and boat data have been received already during previous calls + and the current call is only an update. Note, however, that competitor and boat data may change, + so every now and then it is advisable to still set this to false to obtain the full up-to-date + fields for all competitors and boats again.
+ + Request method: GET diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html index 5384a7436d5..ddd6ef186d5 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v2/leaderboardGetDoc.html @@ -52,6 +52,17 @@ There is also the 'ALL' shortcut constant which can be used to get all available   raceDetails [Default = RACE_GAP_TO_LEADER_IN_SECONDS, RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS, RACE_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD_IN_METERS, CURRENT_LEG] + +   + +
competitorAndBoatIdsOnly [Default = false, true] if true, only IDs and no further attributes + will be delivered for competitor and boat JSON objects in the result document. This can help + save bandwidth if the competitor and boat data have been received already during previous calls + and the current call is only an update. Note, however, that competitor and boat data may change, + so every now and then it is advisable to still set this to false to obtain the full up-to-date + fields for all competitors and boats again.
+ +