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..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,24 +460,24 @@ 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; 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(); 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.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..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 @@ -3,6 +3,7 @@ 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.Regatta; import com.sap.sailing.domain.base.Series; @@ -16,19 +17,24 @@ 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 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; } public JSONObject serialize(Regatta regatta) { @@ -37,8 +43,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 +56,18 @@ public class RegattaJsonSerializer implements JsonSerializer { } if (competitorSerializer != null) { JSONArray competitorsJson = new JSONArray(); - for (Competitor competitor: regatta.getAllCompetitors()) { + for (Competitor competitor : regatta.getAllCompetitors()) { competitorsJson.add(competitorSerializer.serialize(competitor)); } result.put(FIELD_COMPETITORS, competitorsJson); } + if (regatta.canBoatsOfCompetitorsChangePerRace() && 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.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..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 @@ -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); @@ -117,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(LeaderboardsResource.ResultStates.Final.name().equals(jsonResultState)); + assertEquals(regattaLeaderboard.getName(), jsonLeaderboardName); + assertEquals(AbstractLeaderboardsResource.ResultStates.Final.name(), 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); @@ -139,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(), LeaderboardsResource.ResultStates.Live, null); - + 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(LeaderboardsResource.ResultStates.Live.name().equals(jsonResultState)); - + 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); } @@ -171,7 +166,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 +176,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 +185,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 +208,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 +218,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 +227,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 +239,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 +251,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 89b5fd4d5ea..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 @@ -2,6 +2,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; @@ -14,10 +16,11 @@ 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; 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; @@ -46,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(); @@ -89,43 +91,40 @@ 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("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()); 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()); } - private void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, - ResultStates resultState, TimePoint resultTimePoint, Integer maxCompetitorsCount) { + 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); + } + + protected void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, + 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) { + 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) { @@ -189,4 +188,22 @@ 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, 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 43f52dd5dcf..c0c448e4511 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) { @@ -160,16 +159,10 @@ 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(); response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } catch (NoWindException | InterruptedException | ExecutionException | IOException e) { @@ -177,28 +170,25 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource { .type(MediaType.TEXT_PLAIN).build(); } } - 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, leaderboardDTO.getTimePoint(), 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 +205,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); 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 1faa8f75893..7884695830d 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 @@ -30,6 +30,7 @@ import com.sap.sailing.domain.common.DetailType; 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; @@ -42,7 +43,6 @@ import com.sap.sse.common.Distance; 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 { @@ -56,8 +56,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) @@ -76,13 +74,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) { @@ -90,11 +85,11 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource { .type(MediaType.TEXT_PLAIN).build(); } } - 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 { @@ -105,7 +100,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, leaderboardDTO.getTimePoint(), maxCompetitorsCount); Map>> competitorRanksPerRaceColumnsAndFleets = new HashMap<>(); for (String raceColumnName : raceColumnsToShow) { List competitorsFromBestToWorst = leaderboardDTO.getCompetitorsFromBestToWorst(raceColumnName); @@ -136,6 +131,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 +148,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, entryBoatDTO); + jsonEntry.put("boat", jsonBoat); + } final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet; jsonEntry.put("fleet", fleetOfCompetitor == null ? "" : fleetOfCompetitor.getName()); jsonEntry.put("totalPoints", leaderboardEntry.totalPoints); 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 377af181996..b497254f495 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(); } @@ -216,9 +215,10 @@ public class RegattasResource extends AbstractSailingServerResource { response = getBadRegattaErrorResponse(regattaName); } else { NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); + BoatJsonSerializer boatJsonSerializer = new BoatJsonSerializer(new BoatClassJsonSerializer()); CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer( - new PersonJsonSerializer(nationalityJsonSerializer)), new BoatJsonSerializer(new BoatClassJsonSerializer())); - JsonSerializer regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer); + new PersonJsonSerializer(nationalityJsonSerializer)), boatJsonSerializer); + 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();