mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-10 22:30:56 +00:00
initial version of a json service getting the race states for all races of an event
This commit is contained in:
1 parent
9fe35de42a
commit
5476d74f05
4 files changed
+149
-3
No files matched your search
+5
-1
@@ -41,5 +41,9 @@ public interface RaceLog extends Track<RaceLogEvent> {
|
||||
* Remove a listener.
|
||||
*/
|
||||
void removeListener(RaceLogEventVisitor listener);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the race log is empty.
|
||||
*/
|
||||
boolean isEmpty();
|
||||
}
|
||||
+5
-1
@@ -93,6 +93,11 @@ public class RaceLogImpl extends TrackImpl<RaceLogEvent> implements RaceLog {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return getFirstRawFix() == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(RaceLogEventVisitor listener) {
|
||||
synchronized (listeners) {
|
||||
@@ -124,5 +129,4 @@ public class RaceLogImpl extends TrackImpl<RaceLogEvent> implements RaceLog {
|
||||
ois.defaultReadObject();
|
||||
listeners = new HashSet<RaceLogEventVisitor>();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -58,7 +58,16 @@
|
||||
<servlet-name>RCCompetitors</servlet-name>
|
||||
<url-pattern>/rc/competitors</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
|
||||
<servlet>
|
||||
<servlet-name>RCRegattaRaceStates</servlet-name>
|
||||
<servlet-class>com.sap.sailing.server.gateway.impl.rc.RegattaRaceStatesJsonGetServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>RCRegattaRaceStates</servlet-name>
|
||||
<url-pattern>/rc/regattaRaceStates</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<!-- RACE COMMITTEE END -->
|
||||
|
||||
<servlet>
|
||||
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
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;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
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.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.racelog.RaceLog;
|
||||
import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.GateLineOpeningTimeFinder;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.LastFlagFinder;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.PathfinderFinder;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
|
||||
import com.sap.sailing.server.gateway.AbstractJsonHttpServlet;
|
||||
|
||||
public class RegattaRaceStatesJsonGetServlet extends AbstractJsonHttpServlet {
|
||||
private static final long serialVersionUID = -4820965681871902242L;
|
||||
|
||||
private static final String PARAM_NAME_EVENTID = "eventId";
|
||||
|
||||
public static final String FIELD_EVENT_NAME = "name";
|
||||
public static final String FIELD_EVENT_ID = "id";
|
||||
public static final String FIELD_RACE_STATES = "raceStates";
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
String eventIdParam = request.getParameter(PARAM_NAME_EVENTID);
|
||||
if (eventIdParam == null) {
|
||||
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "You need to specify a event id using the "+
|
||||
PARAM_NAME_EVENTID + " parameter");
|
||||
} else {
|
||||
Event event = getService().getEvent(convertIdentifierStringToUuid(eventIdParam));
|
||||
if (event == null) {
|
||||
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Event "+eventIdParam+" not found");
|
||||
} else {
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
result.put(FIELD_EVENT_NAME, event.getName());
|
||||
result.put(FIELD_EVENT_ID, event.getId().toString());
|
||||
|
||||
JSONArray raceStatesLogEntriesJson = new JSONArray();
|
||||
result.put(FIELD_RACE_STATES, raceStatesLogEntriesJson);
|
||||
|
||||
for (CourseArea courseArea : event.getVenue().getCourseAreas()) {
|
||||
for (Leaderboard leaderboard : getService().getLeaderboards().values()) {
|
||||
if (leaderboard.getDefaultCourseArea() != null && leaderboard.getDefaultCourseArea().equals(courseArea)) {
|
||||
String regattaDisplayName = leaderboard.getDisplayName();
|
||||
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
JSONObject raceStateJson = createRaceStateJsonObject(raceColumn, fleet);
|
||||
raceStateJson.put("courseAreaName", courseArea.getName());
|
||||
raceStateJson.put("regattaName", regattaDisplayName);
|
||||
raceStatesLogEntriesJson.add(raceStateJson);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setJsonResponseHeader(response);
|
||||
result.writeJSONString(response.getWriter());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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("trackedRaceId", raceIdentifier != null ? raceIdentifier.toString() : null);
|
||||
|
||||
RaceLog raceLog = raceColumn.getRaceLog(fleet);
|
||||
if (raceLog != null && !raceLog.isEmpty()) {
|
||||
JSONObject raceLogStateJson = new JSONObject();
|
||||
result.put("raceState", raceLogStateJson);
|
||||
|
||||
StartTimeFinder startTimeFinder = new StartTimeFinder(raceLog);
|
||||
raceLogStateJson.put("startTime", startTimeFinder.getStartTime() != null ? startTimeFinder.getStartTime().toString() : null);
|
||||
|
||||
RaceStatusAnalyzer raceStatusAnalyzer = new RaceStatusAnalyzer(raceLog);
|
||||
raceLogStateJson.put("lastStatus", raceStatusAnalyzer.getStatus().name());
|
||||
|
||||
PathfinderFinder pathfinderFinder = new PathfinderFinder(raceLog);
|
||||
raceLogStateJson.put("pathfinderId", pathfinderFinder.getPathfinderId());
|
||||
|
||||
GateLineOpeningTimeFinder gateLineOpeningTimeFinder = new GateLineOpeningTimeFinder(raceLog);
|
||||
raceLogStateJson.put("gateLineOpeningTime", gateLineOpeningTimeFinder.getGateLineOpeningTime());
|
||||
|
||||
LastFlagFinder lastFlagFinder = new LastFlagFinder(raceLog);
|
||||
RaceLogFlagEvent lastFlagEvent = lastFlagFinder.getLastFlagEvent();
|
||||
if (lastFlagEvent != null) {
|
||||
raceLogStateJson.put("lastUpperFlag", lastFlagEvent.getUpperFlag().name());
|
||||
raceLogStateJson.put("lastLowerFlag", lastFlagEvent.getLowerFlag().name());
|
||||
raceLogStateJson.put("displayed", lastFlagEvent.isDisplayed());
|
||||
} else {
|
||||
raceLogStateJson.put("lastUpperFlag", null);
|
||||
raceLogStateJson.put("lastLowerFlag", null);
|
||||
raceLogStateJson.put("displayed", null);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private UUID convertIdentifierStringToUuid(String identifierToConvert) {
|
||||
UUID result = null;
|
||||
if (identifierToConvert != null) {
|
||||
try {
|
||||
result = UUID.fromString(identifierToConvert);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user