diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java index e769a35ed4e..402417da056 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java @@ -17,21 +17,17 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastFlagsFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; -import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; -import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; -import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.common.RaceIdentifier; -import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; +import com.sap.sailing.server.gateway.jaxrs.api.RaceStateSerializer; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util.Pair; public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = -4820965681871902242L; @@ -79,6 +75,7 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { result.put(FIELD_EVENT_ID, event.getId().toString()); JSONArray raceStatesLogEntriesJson = new JSONArray(); result.put(FIELD_RACE_STATES, raceStatesLogEntriesJson); + RaceStateSerializer raceStateSerializer = new RaceStateSerializer(); for (CourseArea courseArea : event.getVenue().getCourseAreas()) { if(filterByCourseAreaParam == null || courseArea.getName().equals(filterByCourseAreaParam)) { for (Leaderboard leaderboard : getService().getLeaderboards().values()) { @@ -89,7 +86,7 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { if(!filterByDayOffset || isRaceStateOfSameDay(raceColumn, fleet, dayToCheck)) { - JSONObject raceStateJson = createRaceStateJsonObject(raceColumn, fleet); + JSONObject raceStateJson = raceStateSerializer.serialize(new Pair(raceColumn, fleet)); raceStateJson.put("courseAreaName", courseArea.getName()); raceStateJson.put("leaderboardName", leaderboardName); raceStateJson.put("leaderboardDisplayName", leaderboardDisplayName); @@ -122,50 +119,6 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { return result; } - private JSONObject createRaceStateJsonObject(RaceColumn raceColumn, Fleet fleet) { - JSONObject result = new JSONObject(); - result.put("raceName", raceColumn.getName()); - result.put("fleetName", fleet.getName()); - RaceIdentifier raceIdentifier = raceColumn.getRaceIdentifier(fleet); - result.put("trackedRaceName", raceIdentifier != null ? raceIdentifier.getRaceName() : null); - result.put("trackedRaceId", raceIdentifier != null ? raceIdentifier.toString() : null); - RaceLog raceLog = raceColumn.getRaceLog(fleet); - if (raceLog != null && !raceLog.isEmpty()) { - ReadonlyRaceState state = ReadonlyRaceStateImpl.create(raceLog); - RaceLogRaceStatus status = state.getStatus(); - TimePoint startTime = state.getStartTime(); - TimePoint finishedTime = state.getFinishedTime(); - JSONObject raceLogStateJson = new JSONObject(); - result.put("raceState", raceLogStateJson); - raceLogStateJson.put("startTime", startTime != null ? startTime.toString() : null); - raceLogStateJson.put("endTime", finishedTime != null ? finishedTime.toString() : null); - raceLogStateJson.put("lastStatus", status.name()); - ReadonlyGateStartRacingProcedure procedure = state.getTypedReadonlyRacingProcedure(ReadonlyGateStartRacingProcedure.class); - if (procedure != null) { - raceLogStateJson.put("pathfinderId", procedure.getPathfinder()); - raceLogStateJson.put("gateLineOpeningTime", procedure.getGateLaunchStopTime()); - } - AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); - RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); - LastFlagsFinder lastFlagFinder = new LastFlagsFinder(raceLog); - RaceLogFlagEvent lastFlagEvent = LastFlagsFinder.getMostRecent(lastFlagFinder.analyze()); - if (lastFlagEvent != null) { - setLastFlagField(raceLogStateJson, lastFlagEvent.getUpperFlag().name(), lastFlagEvent.getLowerFlag().name(), lastFlagEvent.isDisplayed()); - } else if (status.equals(RaceLogRaceStatus.UNSCHEDULED) && abortingFlagEvent != null) { - setLastFlagField(raceLogStateJson, abortingFlagEvent.getUpperFlag().name(), abortingFlagEvent.getLowerFlag().name(), abortingFlagEvent.isDisplayed()); - } else { - setLastFlagField(raceLogStateJson, null, null, null); - } - } - return result; - } - - private void setLastFlagField(JSONObject raceLogStateJson, String upperFlagName, String lowerFlagName, Boolean isDisplayed) { - raceLogStateJson.put("lastUpperFlag", upperFlagName); - raceLogStateJson.put("lastLowerFlag", lowerFlagName); - raceLogStateJson.put("displayed", isDisplayed); - } - /** * Tries to convert the given identifier to a UUID. When the identifier is not a UUID, null is returned. * @param identifierToConvert the identifier as a String diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java index ce7a2f336a9..57fce1587d5 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java @@ -6,6 +6,7 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -71,7 +72,8 @@ public class EventsResource extends AbstractSailingServerResource { @GET @Produces("application/json;charset=UTF-8") @Path("{eventId}/racestates") - public Response getRaceStates(@PathParam("eventId") String eventId) { + public Response getRaceStates(@PathParam("eventId") String eventId, @QueryParam("filterByLeaderboard") String filterByLeaderboard, + @QueryParam("filterByCourseArea") String filterByCourseArea, @QueryParam("filterByDayOffset") String filterByDayOffset) { return Response.noContent().build(); } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java new file mode 100644 index 00000000000..803886e34ad --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java @@ -0,0 +1,68 @@ +package com.sap.sailing.server.gateway.jaxrs.api; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastFlagsFinder; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util.Pair; + +public class RaceStateSerializer implements JsonSerializer> { + @Override + public JSONObject serialize(Pair raceColumnAndFleet) { + RaceColumn raceColumn = raceColumnAndFleet.getA(); + Fleet fleet = raceColumnAndFleet.getB(); + + JSONObject result = new JSONObject(); + result.put("raceName", raceColumn.getName()); + result.put("fleetName", fleet.getName()); + RaceIdentifier raceIdentifier = raceColumn.getRaceIdentifier(fleet); + result.put("trackedRaceName", raceIdentifier != null ? raceIdentifier.getRaceName() : null); + result.put("trackedRaceId", raceIdentifier != null ? raceIdentifier.toString() : null); + RaceLog raceLog = raceColumn.getRaceLog(fleet); + if (raceLog != null && !raceLog.isEmpty()) { + ReadonlyRaceState state = ReadonlyRaceStateImpl.create(raceLog); + RaceLogRaceStatus status = state.getStatus(); + TimePoint startTime = state.getStartTime(); + TimePoint finishedTime = state.getFinishedTime(); + JSONObject raceLogStateJson = new JSONObject(); + result.put("raceState", raceLogStateJson); + raceLogStateJson.put("startTime", startTime != null ? startTime.toString() : null); + raceLogStateJson.put("endTime", finishedTime != null ? finishedTime.toString() : null); + raceLogStateJson.put("lastStatus", status.name()); + ReadonlyGateStartRacingProcedure procedure = state.getTypedReadonlyRacingProcedure(ReadonlyGateStartRacingProcedure.class); + if (procedure != null) { + raceLogStateJson.put("pathfinderId", procedure.getPathfinder()); + raceLogStateJson.put("gateLineOpeningTime", procedure.getGateLaunchStopTime()); + } + AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); + RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); + LastFlagsFinder lastFlagFinder = new LastFlagsFinder(raceLog); + RaceLogFlagEvent lastFlagEvent = LastFlagsFinder.getMostRecent(lastFlagFinder.analyze()); + if (lastFlagEvent != null) { + setLastFlagField(raceLogStateJson, lastFlagEvent.getUpperFlag().name(), lastFlagEvent.getLowerFlag().name(), lastFlagEvent.isDisplayed()); + } else if (status.equals(RaceLogRaceStatus.UNSCHEDULED) && abortingFlagEvent != null) { + setLastFlagField(raceLogStateJson, abortingFlagEvent.getUpperFlag().name(), abortingFlagEvent.getLowerFlag().name(), abortingFlagEvent.isDisplayed()); + } else { + setLastFlagField(raceLogStateJson, null, null, null); + } + } + return result; + } + + private void setLastFlagField(JSONObject raceLogStateJson, String upperFlagName, String lowerFlagName, Boolean isDisplayed) { + raceLogStateJson.put("lastUpperFlag", upperFlagName); + raceLogStateJson.put("lastLowerFlag", lowerFlagName); + raceLogStateJson.put("displayed", isDisplayed); + } +}