diff --git a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml
index da021315194..259c6a63361 100644
--- a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml
+++ b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml
@@ -35,11 +35,11 @@
- RCRaceLogs
- com.sap.sailing.server.gateway.impl.rc.RaceLogsJsonExportServlet
+ RCQueryRaceLog
+ com.sap.sailing.server.gateway.impl.rc.QueryRaceLogJsonExportServlet
- RCRaceLogs
+ RCQueryRaceLog
/rc/racelogs
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/EventsJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/EventsJsonExportServlet.java
index 389c2ecfe11..e38ea1e8597 100644
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/EventsJsonExportServlet.java
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/EventsJsonExportServlet.java
@@ -24,8 +24,7 @@ public class EventsJsonExportServlet extends JsonExportServlet {
JsonSerializer eventSerializer = createSerializer();
JSONArray result = new JSONArray();
- for (Event event : getService().getAllEvents())
- {
+ for (Event event : getService().getAllEvents()) {
result.add(eventSerializer.serialize(event));
}
result.writeJSONString(response.getWriter());
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/LeaderboardJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/LeaderboardJsonExportServlet.java
index 98356376326..c76350b5729 100644
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/LeaderboardJsonExportServlet.java
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/LeaderboardJsonExportServlet.java
@@ -1,6 +1,7 @@
package com.sap.sailing.server.gateway.impl.rc;
import java.io.IOException;
+import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -8,6 +9,8 @@ import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONArray;
+import com.sap.sailing.domain.base.CourseArea;
+import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.server.gateway.impl.JsonExportServlet;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
@@ -29,20 +32,51 @@ public class LeaderboardJsonExportServlet extends JsonExportServlet {
throws ServletException, IOException {
String courseAreaFilter = request.getParameter(PARAM_COURSE_AREA_FILTER);
- if (courseAreaFilter != null) {
- System.out.println("Filter by course area: " + courseAreaFilter);
+ if (courseAreaFilter == null) {
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Need to set a course area filter.");
+ return;
}
- /// TODO: implement course are filtering
+ UUID courseAreaId = toUUID(courseAreaFilter);
+ if (courseAreaId == null) {
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Course are filter must be valid UUID.");
+ return;
+ }
+
+ CourseArea filterCourseArea = getCourseArea(courseAreaId);
JsonSerializer serializer = createSerializer();
JSONArray result = new JSONArray();
+
for (Leaderboard leaderboard : getService().getLeaderboards().values()) {
-
- result.add(serializer.serialize(leaderboard));
+ if (leaderboard.getDefaultCourseArea().equals(filterCourseArea)) {
+ result.add(serializer.serialize(leaderboard));
+ }
}
result.writeJSONString(response.getWriter());
}
+
+ private CourseArea getCourseArea(UUID courseAreaId) {
+ for (Event event : getService().getAllEvents()) {
+ if (event.getVenue() == null) {
+ continue;
+ }
+ for (CourseArea courseArea : event.getVenue().getCourseAreas()) {
+ if (courseArea.getId().equals(courseAreaId)) {
+ return courseArea;
+ }
+ }
+ }
+ return null;
+ }
+
+ private UUID toUUID(String value) {
+ try {
+ return UUID.fromString(value);
+ } catch (IllegalArgumentException iae) {
+ return null;
+ }
+ }
private static JsonSerializer createSerializer() {
return new LeaderboardJsonSerializer(
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ModifyRaceLogJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ModifyRaceLogJsonExportServlet.java
new file mode 100644
index 00000000000..8233746e423
--- /dev/null
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/ModifyRaceLogJsonExportServlet.java
@@ -0,0 +1,97 @@
+package com.sap.sailing.server.gateway.impl.rc;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+import org.json.simple.parser.ParseException;
+
+import com.sap.sailing.domain.base.Fleet;
+import com.sap.sailing.domain.base.RaceColumn;
+import com.sap.sailing.domain.leaderboard.Leaderboard;
+import com.sap.sailing.domain.racelog.RaceLogEvent;
+import com.sap.sailing.domain.tracking.DynamicTrackedRace;
+import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
+import com.sap.sailing.domain.tracking.TrackedRace;
+import com.sap.sailing.domain.tracking.TrackedRegatta;
+import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
+import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
+import com.sap.sailing.server.gateway.impl.JsonExportServlet;
+
+
+public class ModifyRaceLogJsonExportServlet extends JsonExportServlet {
+ private static final long serialVersionUID = 2197006949440887925L;
+
+ /// TODO: for presentation purpose only - implementation needed
+ @SuppressWarnings("unused")
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ /// TODO: split race identifier into its part (leaderboard name, series name, fleet name, race column name)
+ try {
+ Object requestBody = JSONValue.parseWithException(request.getReader());
+ JSONObject requestObject = Helpers.toJSONObjectSafe(requestBody);
+
+ /// TODO: deserialize request (including identifier and to-be-added event)
+ String leaderboardName = "";
+ String seriesName = "";
+ String fleetName = "";
+ String raceColumnName = "";
+ RaceLogEvent raceLogEvent = null;
+
+ Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
+ if (leaderboard == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such leaderboard found.");
+ return;
+ }
+
+ Fleet fleet = leaderboard.getFleet(fleetName);
+ if (fleet == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such fleet found.");
+ return;
+ }
+
+ RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
+ if (raceColumn == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such race column found.");
+ return;
+ }
+
+ TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
+ if (trackedRace == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such tracked race found.");
+ return;
+ }
+
+ DynamicTrackedRace dynamicTrackedRace = getDynamicTrackedRace(trackedRace);
+ if (dynamicTrackedRace == null) {
+ response.sendError(
+ HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Tracked race cannot be modified right now.");
+ return;
+ }
+
+ dynamicTrackedRace.recordRaceLogEvent(raceLogEvent);
+ } catch (ParseException e) {
+ throw new JsonDeserializationException("Invalid JSON in request body.", e);
+ }
+ }
+
+ private DynamicTrackedRace getDynamicTrackedRace(TrackedRace trackedRace) {
+ TrackedRegatta trackedRegatta = trackedRace.getTrackedRegatta();
+ if (trackedRegatta == null) {
+ return null;
+ }
+ DynamicTrackedRegatta dynamicTrackedRegatta = getService().getTrackedRegatta(trackedRegatta.getRegatta());
+ if (dynamicTrackedRegatta == null) {
+ return null;
+ }
+ return dynamicTrackedRegatta.getExistingTrackedRace(trackedRace.getRace());
+ }
+
+}
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/QueryRaceLogJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/QueryRaceLogJsonExportServlet.java
new file mode 100644
index 00000000000..6819eaaabe0
--- /dev/null
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/QueryRaceLogJsonExportServlet.java
@@ -0,0 +1,73 @@
+package com.sap.sailing.server.gateway.impl.rc;
+
+import java.io.IOException;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONValue;
+import org.json.simple.parser.ParseException;
+
+import com.sap.sailing.domain.base.Competitor;
+import com.sap.sailing.domain.racelog.RaceLog;
+import com.sap.sailing.domain.racelog.RaceLogEvent;
+import com.sap.sailing.domain.tracking.TrackedRace;
+import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
+import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
+import com.sap.sailing.server.gateway.impl.JsonExportServlet;
+import com.sap.sailing.server.gateway.serialization.JsonSerializer;
+import com.sap.sailing.server.gateway.serialization.impl.CompetitorIdJsonSerializer;
+import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogCourseAreaChangedEventSerializer;
+import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogEventSerializer;
+import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogFlagEventSerializer;
+import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogStartTimeEventSerializer;
+
+
+public class QueryRaceLogJsonExportServlet extends JsonExportServlet {
+ private static final long serialVersionUID = 2197006949440887925L;
+ private static final Logger logger = Logger.getLogger(QueryRaceLogJsonExportServlet.class.getName());
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ try {
+ Object requestBody = JSONValue.parseWithException(request.getReader());
+ JSONArray requestedIdentifiers = Helpers.toJSONArraySafe(requestBody);
+
+ for (Object element : requestedIdentifiers) {
+ logger.info(String.format("Client requests race log for race with identifier %s.", element));
+ /// TODO: deserialize identifier and look up TrackedRace
+ }
+ /// TODO: Return RaceLogs for found TrackedRaces...
+
+ } catch (ParseException e) {
+ throw new JsonDeserializationException("Invalid JSON in request body.", e);
+ }
+ }
+
+ protected JSONArray serizalizeTrack(TrackedRace trackedRace) {
+ JsonSerializer serializer = createSerializer();
+ JSONArray result = new JSONArray();
+
+ RaceLog log = trackedRace.getRaceLog();
+ log.lockForRead();
+ for (RaceLogEvent event : log.getFixes()) {
+ result.add(serializer.serialize(event));
+ }
+ log.unlockAfterRead();
+
+ return result;
+ }
+
+ private static JsonSerializer createSerializer() {
+ JsonSerializer competitorSerializer = new CompetitorIdJsonSerializer();
+ return new RaceLogEventSerializer(
+ new RaceLogFlagEventSerializer(competitorSerializer),
+ new RaceLogStartTimeEventSerializer(competitorSerializer),
+ new RaceLogCourseAreaChangedEventSerializer(competitorSerializer));
+ }
+
+}
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceLogsJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceLogsJsonExportServlet.java
deleted file mode 100644
index 8469b2baf32..00000000000
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceLogsJsonExportServlet.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.sap.sailing.server.gateway.impl.rc;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONValue;
-import org.json.simple.parser.ParseException;
-
-import com.sap.sailing.domain.base.Competitor;
-import com.sap.sailing.domain.base.RaceDefinition;
-import com.sap.sailing.domain.base.Regatta;
-import com.sap.sailing.domain.common.RegattaNameAndRaceName;
-import com.sap.sailing.domain.racelog.RaceLogEvent;
-import com.sap.sailing.domain.tracking.DynamicTrackedRace;
-import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
-import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
-import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
-import com.sap.sailing.server.gateway.impl.JsonExportServlet;
-import com.sap.sailing.server.gateway.serialization.JsonSerializer;
-import com.sap.sailing.server.gateway.serialization.impl.CompetitorIdJsonSerializer;
-import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogCourseAreaChangedEventSerializer;
-import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogEventSerializer;
-import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogFlagEventSerializer;
-import com.sap.sailing.server.gateway.serialization.impl.racelog.RaceLogStartTimeEventSerializer;
-
-
-public class RaceLogsJsonExportServlet extends JsonExportServlet {
- private static final long serialVersionUID = 2197006949440887925L;
-
-
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- try {
- Object requestBody = JSONValue.parseWithException(request.getReader());
- JSONArray requestedIds = Helpers.toJSONArraySafe(requestBody);
-
- for (Object element : requestedIds) {
- System.out.println(element);
- }
-
- } catch (ParseException e) {
- throw new JsonDeserializationException("Invalid JSON in request body.", e);
- }
-
- }
-
-
- private DynamicTrackedRace getDynamicTrackedRace(String regattaName, String raceName) {
- RegattaNameAndRaceName raceAndRegattaIdentifier = new RegattaNameAndRaceName(regattaName, raceName);
-
- RaceDefinition raceDefinition = getService().getRace(raceAndRegattaIdentifier);
- Regatta regatta = getService().getRegatta(raceAndRegattaIdentifier);
-
- DynamicTrackedRegatta trackedRegatta = getService().getTrackedRegatta(regatta);
- DynamicTrackedRace trackedRace = trackedRegatta.getExistingTrackedRace(raceDefinition);
-
- return trackedRace;
- }
-
- private boolean validateParameter(HttpServletResponse response, String... parameters) throws IOException {
- for (String parameter : parameters) {
- if (parameter == null) {
- response.sendError(HttpServletResponse.SC_BAD_REQUEST);
- return false;
- }
- }
- return true;
- }
-
- private static JsonSerializer createSerializer() {
- JsonSerializer competitorSerializer = new CompetitorIdJsonSerializer();
- return new RaceLogEventSerializer(
- new RaceLogFlagEventSerializer(competitorSerializer),
- new RaceLogStartTimeEventSerializer(competitorSerializer),
- new RaceLogCourseAreaChangedEventSerializer(competitorSerializer));
- }
- /*@Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- TrackedRace trackedRace = getTrackedRace(request);
- if (trackedRace == null)
- {
- response.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- JSONArray result = serizalizeTrack(trackedRace);
- result.writeJSONString(response.getWriter());
- }
-
- private JSONArray serizalizeTrack(TrackedRace trackedRace) {
- JsonSerializer rcEventSerializer = createSerializer();
- JSONArray result = new JSONArray();
-
- RaceLog track = trackedRace.getRaceLog();
- track.lockForRead();
- for (RaceLogEvent event : track.getFixes()) {
- result.add(rcEventSerializer.serialize(event));
- }
- track.unlockAfterRead();
-
- return result;
- }
-
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- String regattaName = request.getParameter(PARAM_NAME_REGATTANAME);
- String raceName = request.getParameter(PARAM_NAME_RACENAME);
- if (!validateParameter(response, regattaName, raceName)) return;
-
- DynamicTrackedRace trackedRace = getDynamicTrackedRace(regattaName, raceName);
- if (trackedRace == null)
- {
- response.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- // TODO: add event to trackedRace...
- // trackedRace.recordRaceCommitteeEvent(null);
- response.sendError(HttpServletResponse.SC_NO_CONTENT);
-
- }*/
-
-}