From dd918eb7cec2e5c4ee30ea5257de67daa1144981 Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 24 May 2016 15:16:46 +0200 Subject: [PATCH 1/2] added a webservice to retreive the entry list for a race /api/v1/regattas/{regattaname}/races/{racename}/entries --- .../impl/CompetitorJsonSerializer.java | 15 +++++- ...petitorWithChangingBoatJsonSerializer.java | 49 +++++++++++++++++++ .../impl/RaceEntriesJsonSerializer.java | 36 ++++++++++++++ .../gateway/jaxrs/api/RegattasResource.java | 36 ++++++++++++++ 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorWithChangingBoatJsonSerializer.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RaceEntriesJsonSerializer.java diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java index a7809bbed07..60bb0ccff27 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java @@ -13,6 +13,7 @@ import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants; import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.Color; import com.sap.sse.common.CountryCode; public class CompetitorJsonSerializer implements JsonSerializer { @@ -53,7 +54,8 @@ public class CompetitorJsonSerializer implements JsonSerializer { result.put(idKeyAndValue.getKey(), idKeyAndValue.getValue()); } result.put(CompetitorJsonConstants.FIELD_NAME, competitor.getName()); - result.put(CompetitorJsonConstants.FIELD_DISPLAY_COLOR, competitor.getColor() == null ? null : competitor.getColor().getAsHtml()); + Color color = getColor(competitor); + result.put(CompetitorJsonConstants.FIELD_DISPLAY_COLOR, color == null ? null : color.getAsHtml()); result.put(CompetitorJsonConstants.FIELD_EMAIL, competitor.getEmail()); result.put(CompetitorJsonConstants.FIELD_SEARCHTAG, competitor.getSearchTag()); result.put(CompetitorJsonConstants.FIELD_SAIL_ID, competitor.getBoat() == null ? "" : competitor.getBoat().getSailID()); @@ -69,7 +71,7 @@ public class CompetitorJsonSerializer implements JsonSerializer { result.put(CompetitorJsonConstants.FIELD_TEAM, teamJsonSerializer.serialize(competitor.getTeam())); } if (boatJsonSerializer != null) { - result.put(CompetitorJsonConstants.FIELD_BOAT, boatJsonSerializer.serialize(competitor.getBoat())); + result.put(CompetitorJsonConstants.FIELD_BOAT, boatJsonSerializer.serialize(getBoat(competitor))); } result.put(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR, competitor.getTimeOnTimeFactor()); result.put(CompetitorJsonConstants.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE, @@ -82,4 +84,13 @@ public class CompetitorJsonSerializer implements JsonSerializer { Serializable competitorId = competitor.getId() instanceof UUID ? competitor.getId().toString() : competitor.getId(); return competitorId; } + + protected Color getColor(Competitor competitor ) { + return competitor.getColor(); + } + + protected Boat getBoat(Competitor competitor ) { + return competitor.getBoat(); + } + } diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorWithChangingBoatJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorWithChangingBoatJsonSerializer.java new file mode 100644 index 00000000000..3e2056ab668 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorWithChangingBoatJsonSerializer.java @@ -0,0 +1,49 @@ +package com.sap.sailing.server.gateway.serialization.impl; + +import com.sap.sailing.domain.base.Boat; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Team; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sse.common.Color; + +/** + * This is a workaround for the serialization of a competitor with changing boats. + * The class should be removed after bug https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=2822 is resolved. + * @author Frank + * + */ +public class CompetitorWithChangingBoatJsonSerializer extends CompetitorJsonSerializer { + private final RaceDefinition race; + + public CompetitorWithChangingBoatJsonSerializer() { + this(null, null, null); + } + + public CompetitorWithChangingBoatJsonSerializer(RaceDefinition race, JsonSerializer teamJsonSerializer, JsonSerializer boatSerializer) { + super(teamJsonSerializer, boatSerializer); + this.race = race; + } + + @Override + protected Color getColor(Competitor competitor ) { + if (race != null) { + Boat boatOfCompetitor = race.getBoatOfCompetitorById(competitor.getId()); + if (boatOfCompetitor != null) { + return boatOfCompetitor.getColor(); + } + } + return super.getColor(competitor); + } + + @Override + protected Boat getBoat(Competitor competitor ) { + if (race != null) { + Boat boatOfCompetitor = race.getBoatOfCompetitorById(competitor.getId()); + if (boatOfCompetitor != null) { + return boatOfCompetitor; + } + } + return super.getBoat(competitor); + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RaceEntriesJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RaceEntriesJsonSerializer.java new file mode 100644 index 00000000000..37f9c7bc4eb --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RaceEntriesJsonSerializer.java @@ -0,0 +1,36 @@ +package com.sap.sailing.server.gateway.serialization.impl; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public class RaceEntriesJsonSerializer implements JsonSerializer { + public static final String FIELD_NAME = "name"; + public static final String FIELD_COMPETITORS = "competitors"; + + private final JsonSerializer competitorSerializer; + + public RaceEntriesJsonSerializer() { + this(null); + } + + public RaceEntriesJsonSerializer(JsonSerializer competitorSerializer) { + this.competitorSerializer = competitorSerializer; + } + + public JSONObject serialize(RaceDefinition race) { + JSONObject result = new JSONObject(); + result.put(FIELD_NAME, race.getName()); + if(competitorSerializer != null) { + JSONArray competitorsJson = new JSONArray(); + for (Competitor competitor: race.getCompetitors()) { + competitorsJson.add(competitorSerializer.serialize(competitor)); + } + result.put(FIELD_COMPETITORS, competitorsJson); + } + 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 3466bf85592..b17b3503fbe 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 @@ -59,10 +59,12 @@ import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.CompetitorWithChangingBoatJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.DurationJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.RaceEntriesJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.SeriesJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer; @@ -172,6 +174,40 @@ public class RegattasResource extends AbstractSailingServerResource { return response; } + /** + * Gets all entries for a race. + * + * @param regattaName + * the name of the regatta + * @return + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/entries") + public Response getEntries(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); + CompetitorJsonSerializer competitorJsonSerializer = new CompetitorWithChangingBoatJsonSerializer(race, new TeamJsonSerializer( + new PersonJsonSerializer(nationalityJsonSerializer)), new BoatJsonSerializer( + new BoatClassJsonSerializer())); + JsonSerializer raceEntriesSerializer = new RaceEntriesJsonSerializer(competitorJsonSerializer); + JSONObject serializedRaceEntries = raceEntriesSerializer.serialize(race); + + String json = serializedRaceEntries.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + /** * Gets all GPS positions of the competitors for a given race. * From 3f4bee04b89d8efeea6c0cb90c70d7b8b9fb11b0 Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 24 May 2016 15:30:48 +0200 Subject: [PATCH 2/2] added documentaion for the race entries service --- .../webservices/api/v1/index.html | 4 ++ .../webservices/api/v1/raceEntriesGetDoc.html | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 java/com.sap.sailing.server.gateway/webservices/api/v1/raceEntriesGetDoc.html diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html index 53e849021ed..ec1b88be1a8 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html @@ -60,6 +60,10 @@ name to make sure you get to the event you're interested in. /api/v1/regattas/{name}/entries Gets the entries of a regatta + + /api/v1/regattas/{regattaname}/races/{racename}/entries + Gets the entries of a race + /api/v1/regattas/{regattaname}/races/{racename}/firstlegbearing Gets the bearing of the first leg diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/raceEntriesGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceEntriesGetDoc.html new file mode 100644 index 00000000000..f4e7276481c --- /dev/null +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/raceEntriesGetDoc.html @@ -0,0 +1,46 @@ + + + + + + + + SAP Sailing Analytics Webservices API Version 1.0 Beta + + +

SAP Sailing Analytics Webservices API Version 1.0 Beta

+

URL: /api/v1/regattas/{regattaname}/races/{racename}/entries

+ +Description: +

The service gets the entries (competitor list) of a race

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Webservice Type:REST
Output format:Json
Mandatory parameters:None
Optional parameters:None
Request method:GET
Example:http://www.sapsailing.com/sailingserver/api/v1/regattas/Kieler Woche (5o5)/races/Race 1/entries
+
+Back to Web Service Overview + +