Serialization code for basic events

Integration in servlets
This commit is contained in:
Lukas Niemeier committed 2013-01-14 01:12:38 +01:00
1 parent cfff8bfee4
commit bfb062128c
7 files changed
+403

No files matched your search

@@ -0,0 +1,18 @@
package com.sap.sailing.server.gateway.serialization;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.racecommittee.RaceCommitteeEvent;
public class RaceCommitteeEventSerializer implements JsonSerializer<RaceCommitteeEvent> {
@Override
public JSONObject serialize(RaceCommitteeEvent object) {
JSONObject result = new JSONObject();
result.put("id", object.getId().toString());
result.put("timestamp", object.getTimePoint().asMillis());
result.put("passId", object.getPassId());
return result;
}
}
@@ -0,0 +1,28 @@
package com.sap.sailing.server.gateway.serialization;
import com.sap.sailing.domain.racecommittee.RaceCommitteeEvent;
import com.sap.sailing.domain.racecommittee.RaceCommitteeFlagEvent;
import com.sap.sailing.domain.racecommittee.RaceCommitteeStartTimeEvent;
public class RaceCommitteeEventSerializerFactory {
private JsonSerializer<RaceCommitteeEvent> baseEventSerializer;
public RaceCommitteeEventSerializerFactory() {
this.baseEventSerializer = new RaceCommitteeEventSerializer();
}
public JsonSerializer<RaceCommitteeEvent> getSerializer(RaceCommitteeEvent event) {
if (event instanceof RaceCommitteeFlagEvent) {
return new RaceCommitteeFlagEventSerializer(baseEventSerializer);
}
if (event instanceof RaceCommitteeStartTimeEvent) {
return new RaceCommitteeStartTimeEventSerializer(baseEventSerializer);
}
throw new UnsupportedOperationException(
String.format(
"There is no serializer defined for event type %s",
event.getClass().getName()));
}
}
@@ -0,0 +1,32 @@
package com.sap.sailing.server.gateway.serialization;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.racecommittee.RaceCommitteeEvent;
import com.sap.sailing.domain.racecommittee.RaceCommitteeFlagEvent;
/**
* Implements JsonSerializer<RaceCommitteeEvent> to enable a consistent interface when used
* with {@link RaceCommitteeEventSerializerFactory}, see type-safeness of generics.
*/
public class RaceCommitteeFlagEventSerializer implements JsonSerializer<RaceCommitteeEvent> {
private JsonSerializer<RaceCommitteeEvent> baseSerializer;
public RaceCommitteeFlagEventSerializer(JsonSerializer<RaceCommitteeEvent> baseSerializer) {
this.baseSerializer = baseSerializer;
}
@Override
public JSONObject serialize(RaceCommitteeEvent object) {
// We have to cast here, see class comment
RaceCommitteeFlagEvent flagEvent = (RaceCommitteeFlagEvent) object;
JSONObject result = baseSerializer.serialize(flagEvent);
result.put("upperFlag", flagEvent.getUpperFlag());
result.put("lowerFlag", flagEvent.getLowerFlag());
result.put("displayed", flagEvent.isDisplayed());
return result;
}
}
@@ -0,0 +1,29 @@
package com.sap.sailing.server.gateway.serialization;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.racecommittee.RaceCommitteeEvent;
import com.sap.sailing.domain.racecommittee.RaceCommitteeStartTimeEvent;
/**
* Implements JsonSerializer<RaceCommitteeEvent> to enable a consistent interface when used
* with {@link RaceCommitteeEventSerializerFactory}, see type-safeness of generics.
*/
public class RaceCommitteeStartTimeEventSerializer implements JsonSerializer<RaceCommitteeEvent> {
private JsonSerializer<RaceCommitteeEvent> baseSerializer;
public RaceCommitteeStartTimeEventSerializer(JsonSerializer<RaceCommitteeEvent> baseSerializer) {
this.baseSerializer = baseSerializer;
}
@Override
public JSONObject serialize(RaceCommitteeEvent object) {
// We have to cast here, see class comment
RaceCommitteeStartTimeEvent startTimeEvent = (RaceCommitteeStartTimeEvent) object;
JSONObject result = baseSerializer.serialize(startTimeEvent);
result.put("startTime", startTimeEvent.getStartTime().asMillis());
return result;
}
}
@@ -0,0 +1,142 @@
package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import java.util.Collections;
import java.util.Date;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.racecommittee.Flags;
import com.sap.sailing.domain.racecommittee.RaceCommitteeEvent;
import com.sap.sailing.domain.racecommittee.RaceCommitteeEventTrack;
import com.sap.sailing.domain.racecommittee.RaceCommitteeFlagEvent;
import com.sap.sailing.domain.racecommittee.RaceCommitteeStore;
import com.sap.sailing.domain.racecommittee.impl.EmptyRaceCommitteeStore;
import com.sap.sailing.domain.racecommittee.impl.RaceCommitteeEventTrackImpl;
import com.sap.sailing.domain.racecommittee.impl.RaceCommitteeFlagEventImpl;
import com.sap.sailing.domain.racecommittee.impl.RaceCommitteeStartTimeEventImpl;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.RaceCommitteeEventSerializer;
import com.sap.sailing.server.gateway.serialization.RaceCommitteeEventSerializerFactory;
public class EventTrackRaceCommitteeServlet extends JsonExportServlet {
private static final long serialVersionUID = 2197006949440887925L;
@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) {
JSONArray result = new JSONArray();
RaceCommitteeEventSerializerFactory serializerFactory = new RaceCommitteeEventSerializerFactory();
RaceCommitteeEventTrack track = trackedRace.getOrCreateRaceCommitteeEventTrack();
track.lockForRead();
for (RaceCommitteeEvent event : track.getFixes()) {
result.add(serializerFactory.getSerializer(event).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_ACCEPTED);
}
private DynamicTrackedRace getDynamicTrackedRace(String regattaName,
String raceName) {
RegattaNameAndRaceName nameIdentifier = new RegattaNameAndRaceName(regattaName, raceName);
DynamicTrackedRace trackedRace =
getService().getOrCreateTrackedRegatta(
getService().getRegattaByName(regattaName)).
getExistingTrackedRace(getService().getRace(nameIdentifier));
return trackedRace;
}
@Override
protected TrackedRace getTrackedRace(HttpServletRequest request) {
RaceCommitteeStore store = new FakeStore();
TrackedRace trackedRace = new DynamicTrackedRaceImpl(
null,
new RaceDefinitionImpl("Race One",
new CourseImpl("Course IA", Collections.<Waypoint>emptyList()),
new BoatClassImpl("MyBoats", false),
Collections.<Competitor>emptyList()),
EmptyWindStore.INSTANCE,
1, 1, 1,
store);
return trackedRace;
}
class FakeStore extends EmptyRaceCommitteeStore implements RaceCommitteeStore {
@Override
public RaceCommitteeEventTrack getRaceCommitteeEventTrack(
TrackedRegatta trackedRegatta, TrackedRace trackedRace) {
RaceCommitteeEventTrack track = new RaceCommitteeEventTrackImpl("karlos");
track.add(
new RaceCommitteeFlagEventImpl(new MillisecondsTimePoint(new Date()), UUID.randomUUID(), null,
0, Flags.ALPHA, Flags.NOVEMBER, true));
return track;
}
}
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;
}
}
@@ -0,0 +1,83 @@
package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import java.util.Collections;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.CourseAreaImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.server.gateway.serialization.CourseAreaJsonSerializer;
import com.sap.sailing.server.gateway.serialization.EventJsonSerializer;
import com.sap.sailing.server.gateway.serialization.VenueJsonSerializer;
public class EventsRaceCommitteeServlet extends JsonExportServlet {
private static final long serialVersionUID = 4515246650108245796L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EventJsonSerializer serializer =
new EventJsonSerializer(
new VenueJsonSerializer(
new CourseAreaJsonSerializer()));
JSONArray result = new JSONArray();
for (Event event : getService().getAllEvents())
{
result.add(serializer.serialize(event));
}
result.writeJSONString(response.getWriter());
}
private Iterable<Event> exampleEvents()
{
Event kielerWocheEvent = getService().addEvent(
"Kieler Woche 2012 - Where Sailing meets people",
"Schilksee",
"http://www.youtube.com",
true, Collections.<String>emptyList());
Venue schilksee = kielerWocheEvent.getVenue();
CourseArea alpha = new CourseAreaImpl("Alpha");
schilksee.addCourseArea(alpha);
//Fleet allBoats = new FleetImpl("Blue");
//Series series = null;//new SeriesData("Qualification", false, Arrays.asList(allBoats));
Regatta regatta = getService().getOrCreateRegatta(
"470er Men",
"470er",
UUID.fromString("b2775b10-5b3f-11e2-bcfd-0800200c9a66"));
kielerWocheEvent.addRegatta(regatta);
RaceDefinition myRace = new RaceDefinitionImpl(
"Race One",
new CourseImpl("Downwind", Collections.<Waypoint>emptyList()),
regatta.getBoatClass(),
Collections.<Competitor>emptyList(),
UUID.fromString("c2775b10-5b3f-11e2-bcfd-0800200c9a66"));
regatta.addRace(myRace);
alpha.addRace(myRace);
return Collections.<Event>singleton(kielerWocheEvent);
}
}
@@ -0,0 +1,71 @@
package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import java.io.Serializable;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.server.gateway.serialization.BoatClassJsonSerializer;
import com.sap.sailing.server.gateway.serialization.RaceDefinitionJsonSerializer;
import com.sap.sailing.server.gateway.serialization.RegattaJsonSerializer;
public class RegattasRaceCommitteeServlet extends JsonExportServlet {
private static final long serialVersionUID = -5661776042560467182L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Event event = getEvent(request);
if (event == null)
{
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
RegattaJsonSerializer serializer = new RegattaJsonSerializer(
new BoatClassJsonSerializer(),
new RaceDefinitionJsonSerializer());
JSONArray result = new JSONArray();
for (Regatta regatta : event.getRegattas())
{
result.add(serializer.serialize(regatta));
}
result.writeJSONString(response.getWriter());
}
private Event getEvent(HttpServletRequest request) {
// PathInfo is prefixed by forward slash
String pathInfo = request.getPathInfo();
if (pathInfo.length() < 2)
{
return null;
}
// Strip leading slash...
pathInfo = pathInfo.substring(1);
try {
// ... and get event!
Serializable id = getEventId(pathInfo);
return getService().getEvent(id);
}
catch (IllegalArgumentException iae)
{
return null;
}
}
private Serializable getEventId(String idValue) {
return UUID.fromString(idValue);
}
}