initial version of a json service getting the race states for all races of an event

This commit is contained in:
fmittag committed 2013-05-23 20:17:11 +02:00
1 parent 9fe35de42a
commit 5476d74f05
4 files changed
+149 -3

No files matched your search

@@ -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();
}
@@ -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>
@@ -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;
}
}