Merge remote-tracking branch 'server/master'

Change-Id: I08abd2c54fe0feb53e53e3fbc4685c4e5ee97de9
This commit is contained in:
Axel Uhl committed 2018-04-11 12:02:58 +02:00
commit dc63fb7277
28 files changed
+291 -275

No files matched your search

@@ -4,6 +4,7 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
@@ -26,8 +27,16 @@ public class CompetitorAndBoatJsonDeserializer implements JsonDeserializer<Pair<
@Override
public Pair<Competitor, Boat> deserialize(JSONObject competitorAndBoatJsonObject) throws JsonDeserializationException {
Competitor competitor = competitorDeserializer.deserialize(Helpers.getNestedObjectSafe(competitorAndBoatJsonObject, CompetitorAndBoatJsonSerializer.FIELD_COMPETITOR));
Boat boat = boatDeserializer.deserialize(Helpers.getNestedObjectSafe(competitorAndBoatJsonObject, CompetitorAndBoatJsonSerializer.FIELD_BOAT));
final Competitor competitor;
final Boat boat;
if (competitorAndBoatJsonObject.containsKey(CompetitorAndBoatJsonSerializer.FIELD_COMPETITOR)) {
competitor = competitorDeserializer.deserialize(Helpers.getNestedObjectSafe(competitorAndBoatJsonObject, CompetitorAndBoatJsonSerializer.FIELD_COMPETITOR));
boat = boatDeserializer.deserialize(Helpers.getNestedObjectSafe(competitorAndBoatJsonObject, CompetitorAndBoatJsonSerializer.FIELD_BOAT));
} else {
final CompetitorWithBoat competitorWithBoat = (CompetitorWithBoat) competitorDeserializer.deserialize(competitorAndBoatJsonObject);
competitor = competitorWithBoat;
boat = competitorWithBoat.getBoat();
}
return new Pair<Competitor, Boat>(competitor, boat);
}
}
@@ -11,6 +11,7 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorFactory;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
@@ -21,23 +22,24 @@ import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.RGBColor;
public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor> {
private final CompetitorFactory competitorFactory;
private final CompetitorFactory competitorWithBoatFactory;
private final JsonDeserializer<DynamicTeam> teamJsonDeserializer;
private final JsonDeserializer<DynamicBoat> boatJsonDeserializer;
private static final Logger logger = Logger.getLogger(CompetitorJsonDeserializer.class.getName());
public static CompetitorJsonDeserializer create(SharedDomainFactory baseDomainFactory) {
return new CompetitorJsonDeserializer(baseDomainFactory, new TeamJsonDeserializer(new PersonJsonDeserializer(
new NationalityJsonDeserializer(baseDomainFactory))));
new NationalityJsonDeserializer(baseDomainFactory))), new BoatJsonDeserializer(baseDomainFactory, new BoatClassJsonDeserializer(baseDomainFactory)));
}
public CompetitorJsonDeserializer(CompetitorFactory competitorFactory) {
this(competitorFactory, null);
public CompetitorJsonDeserializer(CompetitorFactory competitorWithBoatFactory) {
this(competitorWithBoatFactory, null, /* boatDeserializer */ null);
}
public CompetitorJsonDeserializer(CompetitorFactory competitorFactory, JsonDeserializer<DynamicTeam> teamJsonDeserializer) {
this.competitorFactory = competitorFactory;
public CompetitorJsonDeserializer(CompetitorFactory competitorWithBoatFactory, JsonDeserializer<DynamicTeam> teamJsonDeserializer, JsonDeserializer<DynamicBoat> boatDeserializer) {
this.competitorWithBoatFactory = competitorWithBoatFactory;
this.teamJsonDeserializer = teamJsonDeserializer;
this.boatJsonDeserializer = boatDeserializer;
}
@Override
@@ -66,7 +68,6 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
logger.warning("Illegal flag image URI " + e.getMessage());
}
}
final Color displayColor;
if (displayColorAsString == null || displayColorAsString.isEmpty()) {
displayColor = null;
@@ -74,18 +75,31 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
displayColor = new RGBColor(displayColorAsString);
}
DynamicTeam team = null;
DynamicBoat boat = null;
if (teamJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_TEAM) != null) {
team = teamJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_TEAM));
}
if (boatJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_BOAT) != null) {
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_BOAT));
}
final Double timeOnTimeFactor = (Double) object.get(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR);
final Double timeOnDistanceAllowanceInSecondsPerNauticalMile = (Double) object
.get(CompetitorJsonConstants.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE);
Competitor competitor = competitorFactory.getOrCreateCompetitor(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag);
return competitor;
final Competitor result;
if (boat == null) {
result = competitorWithBoatFactory.getOrCreateCompetitor(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag);
} else {
result = competitorWithBoatFactory.getOrCreateCompetitorWithBoat(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag, boat);
}
return result;
} catch (Exception e) {
throw new JsonDeserializationException(e);
}
@@ -1,103 +0,0 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.net.URI;
import java.util.UUID;
import java.util.logging.Logger;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.CompetitorFactory;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sse.common.Color;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.RGBColor;
public class CompetitorWithBoatJsonDeserializer implements JsonDeserializer<CompetitorWithBoat> {
private final CompetitorFactory competitorWithBoatFactory;
private final JsonDeserializer<DynamicTeam> teamJsonDeserializer;
private final JsonDeserializer<DynamicBoat> boatJsonDeserializer;
private static final Logger logger = Logger.getLogger(CompetitorWithBoatJsonDeserializer.class.getName());
public static CompetitorWithBoatJsonDeserializer create(SharedDomainFactory baseDomainFactory) {
return new CompetitorWithBoatJsonDeserializer(baseDomainFactory, new TeamJsonDeserializer(new PersonJsonDeserializer(
new NationalityJsonDeserializer(baseDomainFactory))), new BoatJsonDeserializer(baseDomainFactory, new BoatClassJsonDeserializer(baseDomainFactory)));
}
public CompetitorWithBoatJsonDeserializer(CompetitorFactory competitorWithBoatFactory) {
this(competitorWithBoatFactory, null, /* boatDeserializer */ null);
}
public CompetitorWithBoatJsonDeserializer(CompetitorFactory competitorWithBoatFactory, JsonDeserializer<DynamicTeam> teamJsonDeserializer, JsonDeserializer<DynamicBoat> boatDeserializer) {
this.competitorWithBoatFactory = competitorWithBoatFactory;
this.teamJsonDeserializer = teamJsonDeserializer;
this.boatJsonDeserializer = boatDeserializer;
}
@Override
public CompetitorWithBoat deserialize(JSONObject object) throws JsonDeserializationException {
Serializable competitorId = (Serializable) object.get(CompetitorJsonSerializer.FIELD_ID);
try {
Class<?> idClass = Class.forName((String) object.get(CompetitorJsonConstants.FIELD_ID_TYPE));
if (Number.class.isAssignableFrom(idClass)) {
Constructor<?> constructorFromString = idClass.getConstructor(String.class);
competitorId = (Serializable) constructorFromString.newInstance(competitorId.toString());
} else if (UUID.class.isAssignableFrom(idClass)) {
competitorId = Helpers.tryUuidConversion(competitorId);
}
String name = (String) object.get(CompetitorJsonConstants.FIELD_NAME);
String shortName = (String) object.get(CompetitorJsonConstants.FIELD_SHORT_NAME);
String displayColorAsString = (String) object.get(CompetitorJsonConstants.FIELD_DISPLAY_COLOR);
String email = (String) object.get(CompetitorJsonConstants.FIELD_EMAIL);
String searchTag = (String) object.get(CompetitorJsonConstants.FIELD_SEARCHTAG);
URI flagImageURI = null;
String flagImageURIAsString = (String) object.get(CompetitorJsonConstants.FIELD_FLAG_IMAGE_URI);
if (flagImageURIAsString != null) {
try {
flagImageURI = URI.create(flagImageURIAsString);
} catch (IllegalArgumentException e) {
logger.warning("Illegal flag image URI " + e.getMessage());
}
}
final Color displayColor;
if (displayColorAsString == null || displayColorAsString.isEmpty()) {
displayColor = null;
} else {
displayColor = new RGBColor(displayColorAsString);
}
DynamicTeam team = null;
DynamicBoat boat = null;
if (teamJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_TEAM) != null) {
team = teamJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_TEAM));
}
if (boatJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_BOAT) != null) {
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_BOAT));
String sailID = (String) object.get(CompetitorJsonConstants.FIELD_SAIL_ID);
boat.setSailId(sailID);
}
final Double timeOnTimeFactor = (Double) object.get(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR);
final Double timeOnDistanceAllowanceInSecondsPerNauticalMile = (Double) object
.get(CompetitorJsonConstants.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE);
CompetitorWithBoat competitorWithBoat = competitorWithBoatFactory.getOrCreateCompetitorWithBoat(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag, boat);
return competitorWithBoat;
} catch (Exception e) {
throw new JsonDeserializationException(e);
}
}
}
@@ -85,13 +85,10 @@ public class LegacyCompetitorWithContainedBoatJsonDeserializer implements JsonDe
if (boatJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_BOAT) != null) {
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_BOAT));
String sailID = (String) object.get(CompetitorJsonConstants.FIELD_SAIL_ID);
boat.setSailId(sailID);
}
final Double timeOnTimeFactor = (Double) object.get(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR);
final Double timeOnDistanceAllowanceInSecondsPerNauticalMile = (Double) object
.get(CompetitorJsonConstants.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE);
CompetitorWithBoat competitorWithBoat = new CompetitorWithBoatImpl(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
@@ -4,7 +4,6 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.common.DeviceIdentifier;
import com.sap.sailing.domain.racelogtracking.SmartphoneUUIDIdentifier;
@@ -17,7 +16,6 @@ import com.sap.sailing.server.gateway.deserialization.coursedata.impl.MarkDeseri
import com.sap.sailing.server.gateway.deserialization.coursedata.impl.WaypointDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.BoatJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorWithBoatJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.DeviceIdentifierJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.PositionJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.WindJsonDeserializer;
@@ -58,7 +56,6 @@ public class RaceLogEventDeserializer implements JsonDeserializer<RaceLogEvent>
public static RaceLogEventDeserializer create(SharedDomainFactory domainFactory,
JsonDeserializer<DeviceIdentifier> deviceDeserializer) {
JsonDeserializer<Competitor> competitorDeserializer = CompetitorJsonDeserializer.create(domainFactory);
JsonDeserializer<CompetitorWithBoat> competitorWithBoatDeserializer = CompetitorWithBoatJsonDeserializer.create(domainFactory);
return new RaceLogEventDeserializer(
new RaceLogFlagEventDeserializer(competitorDeserializer),
new RaceLogStartTimeEventDeserializer(competitorDeserializer),
@@ -82,7 +79,7 @@ public class RaceLogEventDeserializer implements JsonDeserializer<RaceLogEvent>
new RaceLogDenoteForTrackingEventDeserializer(competitorDeserializer, domainFactory),
new RaceLogStartTrackingEventDeserializer(competitorDeserializer),
new RaceLogRevokeEventDeserializer(competitorDeserializer),
new RaceLogRegisterCompetitorEventDeserializer(competitorDeserializer, competitorWithBoatDeserializer, BoatJsonDeserializer.create(domainFactory)),
new RaceLogRegisterCompetitorEventDeserializer(competitorDeserializer, BoatJsonDeserializer.create(domainFactory)),
new RaceLogAdditionalScoringInformationEventDeserializer(competitorDeserializer),
new RaceLogFixedMarkPassingEventDeserializer(competitorDeserializer),
new RaceLogSuppressedMarkPassingsEventDeserializer(competitorDeserializer),
@@ -10,7 +10,6 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.BoatJsonDeserializer;
@@ -18,30 +17,26 @@ import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogRegister
import com.sap.sse.common.TimePoint;
public class RaceLogRegisterCompetitorEventDeserializer extends BaseRaceLogEventDeserializer {
private final JsonDeserializer<CompetitorWithBoat> competitorWithBoatDeserializer;
private final BoatJsonDeserializer boatDeserializer;
public RaceLogRegisterCompetitorEventDeserializer(JsonDeserializer<Competitor> competitorDeserializer,
JsonDeserializer<CompetitorWithBoat> competitorWithBoatDeserializer, BoatJsonDeserializer boatDeserializer) {
BoatJsonDeserializer boatDeserializer) {
super(competitorDeserializer);
this.competitorWithBoatDeserializer = competitorWithBoatDeserializer;
this.boatDeserializer = boatDeserializer;
}
@Override
protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List<Competitor> competitors) throws JsonDeserializationException {
protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt,
AbstractLogEventAuthor author, TimePoint timePoint, int passId, List<Competitor> competitors)
throws JsonDeserializationException {
assert competitors.size() == 1 : "Expected exactly one competitor for RegisterCompetitorEvent";
JSONObject competitorWithBoatObject = (JSONObject) object.get(RaceLogRegisterCompetitorEventSerializer.FIELD_COMPETITOR_WITHBOAT);
if (competitorWithBoatObject != null) {
CompetitorWithBoat competitorWithBoat = competitorWithBoatDeserializer.deserialize(competitorWithBoatObject);
return new RaceLogRegisterCompetitorEventImpl(createdAt, timePoint, author, id, passId, competitorWithBoat);
} else {
JSONObject competitorObject = (JSONObject) object.get(RaceLogRegisterCompetitorEventSerializer.FIELD_COMPETITOR);
JSONObject boatObject = (JSONObject) object.get(RaceLogRegisterCompetitorEventSerializer.FIELD_BOAT);
Competitor competitor = competitorDeserializer.deserialize(competitorObject);
Boat boat = boatDeserializer.deserialize(boatObject);
return new RaceLogRegisterCompetitorEventImpl(createdAt, timePoint, author, id, passId, competitor, boat);
}
JSONObject competitorObject = (JSONObject) (object
.get(RaceLogRegisterCompetitorEventSerializer.FIELD_COMPETITOR_WITHBOAT) != null
? object.get(RaceLogRegisterCompetitorEventSerializer.FIELD_COMPETITOR_WITHBOAT)
: object.get(RaceLogRegisterCompetitorEventSerializer.FIELD_COMPETITOR));
JSONObject boatObject = (JSONObject) object.get(RaceLogRegisterCompetitorEventSerializer.FIELD_BOAT);
Competitor competitor = competitorDeserializer.deserialize(competitorObject);
Boat boat = boatDeserializer.deserialize(boatObject);
return new RaceLogRegisterCompetitorEventImpl(createdAt, timePoint, author, id, passId, competitor, boat);
}
}
@@ -1,9 +1,12 @@
package com.sap.sailing.server.gateway.serialization.impl;
import java.util.logging.Logger;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sse.common.Util.Pair;
@@ -11,6 +14,8 @@ import com.sap.sse.common.Util.Pair;
* Serializes a competitor AND a boat as a kind of pair (e.g. in the context of a race)
*/
public class CompetitorAndBoatJsonSerializer implements JsonSerializer<Pair<Competitor, Boat>> {
private static final Logger logger = Logger.getLogger(CompetitorAndBoatJsonSerializer.class.getName());
private final JsonSerializer<Competitor> competitorJsonSerializer;
private final JsonSerializer<Boat> boatJsonSerializer;
@@ -28,14 +33,33 @@ public class CompetitorAndBoatJsonSerializer implements JsonSerializer<Pair<Comp
@Override
public JSONObject serialize(Pair<Competitor, Boat> competitorAndBoat) {
JSONObject serializedCompetitorAndBoat = new JSONObject();
final JSONObject result;
JSONObject serializedCompetitor = competitorJsonSerializer.serialize(competitorAndBoat.getA());
JSONObject serializedBoat = boatJsonSerializer.serialize(competitorAndBoat.getB());
serializedCompetitorAndBoat.put(FIELD_COMPETITOR, serializedCompetitor);
serializedCompetitorAndBoat.put(FIELD_BOAT, serializedBoat);
return serializedCompetitorAndBoat;
// for compatibility, write a CompetitorWithBoat in the same format that a Competitor use to be
// serialized; only if the competitor has no boat, use the new format. The de-serializer will be
// able to distinguish based on the presence of the top-level FIELD_COMPETITOR field.
final boolean compatibilityMode;
if (competitorAndBoat.getA().hasBoat()) {
final CompetitorWithBoat competitorWithBoat = (CompetitorWithBoat) competitorAndBoat.getA();
final Boat boat = competitorWithBoat.getBoat();
if (boat != competitorAndBoat.getB()) {
logger.warning("Competitor "+competitorWithBoat+" has boat "+boat+" which is different from the boat to be serialized with it ("+
competitorAndBoat.getB());
compatibilityMode = false;
} else {
compatibilityMode = true;
}
} else {
compatibilityMode = false;
}
if (compatibilityMode) {
result = serializedCompetitor;
} else {
JSONObject serializedBoat = boatJsonSerializer.serialize(competitorAndBoat.getB());
result = new JSONObject();
result.put(FIELD_COMPETITOR, serializedCompetitor);
result.put(FIELD_BOAT, serializedBoat);
}
return result;
}
}
@@ -17,14 +17,37 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sse.common.Color;
import com.sap.sse.common.CountryCode;
/**
* Serializes a {@link Competitor} or {@link CompetitorWithBoat} object. If a {@link CompetitorWithBoat} object,
* the {@link CompetitorJsonConstants#FIELD_BOAT} field will be filled with a boat document as serialized by the
* {@link BoatJsonSerializer}. For {@link Competitor} objects with {@link Competitor#hasBoat()}{@code == false} the
* {@link CompetitorJsonConstants#FIELD_BOAT} field will not be set. This can also be used by the corresponding
* de-serializer to identify which class implementing the {@link Competitor} interface to instantiate.
*/
public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
public static final String FIELD_ID = "id";
private final JsonSerializer<Team> teamJsonSerializer;
private final JsonSerializer<Boat> boatJsonSerializer;
/**
* Creates a serializer for {@link Competitor} objects which by default, if the competitor
* {@link Competitor#hasBoat() has a boat attached} will serialize the boat in the
* {@link CompetitorJsonConstants#FIELD_BOAT} field of the resulting document. See {@link #create(boolean)} for a
* variant where callers can choose whether the {@link CompetitorJsonConstants#FIELD_BOAT} field shall be filled or
* not.
*/
public static CompetitorJsonSerializer create() {
return new CompetitorJsonSerializer(TeamJsonSerializer.create(), BoatJsonSerializer.create());
return create(/* serialize boat */ true);
}
/**
* Creates a serializer for {@link Competitor} objects which if {@code serializeBoat==true} and if the competitor
* {@link Competitor#hasBoat() has a boat attached} will serialize the boat in the
* {@link CompetitorJsonConstants#FIELD_BOAT} field of the resulting document.
*/
public static CompetitorJsonSerializer create(boolean serializeBoat) {
return new CompetitorJsonSerializer(TeamJsonSerializer.create(), serializeBoat?BoatJsonSerializer.create():null);
}
public CompetitorJsonSerializer() {
@@ -1,33 +0,0 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class CompetitorWithBoatJsonSerializer implements JsonSerializer<CompetitorWithBoat> {
private final JsonSerializer<Boat> boatJsonSerializer;
private final JsonSerializer<Competitor> competitorJsonSerializer;
public static CompetitorWithBoatJsonSerializer create() {
return new CompetitorWithBoatJsonSerializer(CompetitorJsonSerializer.create(), BoatJsonSerializer.create());
}
public CompetitorWithBoatJsonSerializer(JsonSerializer<Competitor> competitorJsonSerializer, JsonSerializer<Boat> boatJsonSerializer) {
this.competitorJsonSerializer = competitorJsonSerializer;
this.boatJsonSerializer = boatJsonSerializer;
}
@Override
public JSONObject serialize(CompetitorWithBoat competitor) {
JSONObject serializedCompetitor = competitorJsonSerializer.serialize(competitor);
serializedCompetitor.put(CompetitorJsonConstants.FIELD_SAIL_ID, competitor.getBoat() == null ? "" : competitor.getBoat().getSailID());
if (boatJsonSerializer != null && competitor.getBoat() != null) {
serializedCompetitor.put(CompetitorJsonConstants.FIELD_BOAT, boatJsonSerializer.serialize(competitor.getBoat()));
}
return serializedCompetitor;
}
}
@@ -12,7 +12,7 @@ public class CompetitorWithBoatRefJsonSerializer implements JsonSerializer<Compe
private final JsonSerializer<Competitor> competitorJsonSerializer;
public static CompetitorWithBoatRefJsonSerializer create() {
return new CompetitorWithBoatRefJsonSerializer(CompetitorJsonSerializer.create());
return new CompetitorWithBoatRefJsonSerializer(CompetitorJsonSerializer.create(/* serialize boat */ false));
}
public CompetitorWithBoatRefJsonSerializer(JsonSerializer<Competitor> competitorJsonSerializer) {
@@ -22,7 +22,6 @@ public class CompetitorWithBoatRefJsonSerializer implements JsonSerializer<Compe
@Override
public JSONObject serialize(CompetitorWithBoat competitor) {
JSONObject serializedCompetitor = competitorJsonSerializer.serialize(competitor);
Boat boat = competitor.getBoat();
if (boat != null) {
serializedCompetitor.put(CompetitorJsonConstants.FIELD_BOAT_ID_TYPE, boat.getId().getClass().getName());
@@ -37,7 +37,6 @@ import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSeri
import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorWithBoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.DeviceIdentifierJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.PositionJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.WindJsonSerializer;
@@ -74,7 +73,7 @@ public class RaceLogEventSerializer implements JsonSerializer<RaceLogEvent>, Rac
new RaceLogDenoteForTrackingEventSerializer(competitorSerializer),
new RaceLogStartTrackingEventSerializer(competitorSerializer),
new RaceLogRevokeEventSerializer(competitorSerializer),
new RaceLogRegisterCompetitorEventSerializer(competitorSerializer, CompetitorWithBoatJsonSerializer.create(), BoatJsonSerializer.create()),
new RaceLogRegisterCompetitorEventSerializer(competitorSerializer, BoatJsonSerializer.create()),
new RaceLogAdditionalScoringInformationSerializer(competitorSerializer),
new RaceLogFixedMarkPassingEventSerializer(competitorSerializer),
new RaceLogSuppressedMarkPassingsEventSerializer(competitorSerializer),
@@ -6,24 +6,32 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetitorEvent;
import com.sap.sailing.domain.abstractlog.shared.events.RegisterCompetitorEvent;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorWithBoatJsonSerializer;
public class RaceLogRegisterCompetitorEventSerializer extends BaseRaceLogEventSerializer {
public static final String VALUE_CLASS = RegisterCompetitorEvent.class.getSimpleName();
/**
* The following had been introduced temporarily during the development and initial deployment of
* bug2822. However, during subsequent cleanup activities the distinction between competitors with
* and without boat happens through the presence or absence, respectively, of the {@link CompetitorJsonConstants#FIELD_BOAT}
* field in the JSON document. Hence, a separate field is no longer needed. Only for backward compatibility
* for the rare case that some installation produced events with this field name does the field need to
* be preserved.
*/
public static final String FIELD_COMPETITOR_WITHBOAT = "competitorWithBoat";
public static final String FIELD_COMPETITOR = "competitor";
public static final String FIELD_BOAT = "boat";
private final CompetitorWithBoatJsonSerializer competitorWithBoatSerializer;
private final BoatJsonSerializer boatSerializer;
public RaceLogRegisterCompetitorEventSerializer(JsonSerializer<Competitor> competitorSerializer,
CompetitorWithBoatJsonSerializer competitorWithBoatSerializer, BoatJsonSerializer boatSerializer) {
BoatJsonSerializer boatSerializer) {
super(competitorSerializer);
this.competitorWithBoatSerializer = competitorWithBoatSerializer;
this.boatSerializer = boatSerializer;
}
@@ -35,16 +43,9 @@ public class RaceLogRegisterCompetitorEventSerializer extends BaseRaceLogEventSe
@Override
public JSONObject serialize(RaceLogEvent object) {
RaceLogRegisterCompetitorEvent registerCompetitorEvent = (RaceLogRegisterCompetitorEvent) object;
JSONObject result = super.serialize(registerCompetitorEvent);
if (registerCompetitorEvent.getCompetitor().hasBoat()) {
CompetitorWithBoat competitorWithBoat = (CompetitorWithBoat) registerCompetitorEvent.getCompetitor();
result.put(FIELD_COMPETITOR_WITHBOAT, competitorWithBoatSerializer.serialize(competitorWithBoat));
} else {
result.put(FIELD_COMPETITOR, competitorSerializer.serialize(registerCompetitorEvent.getCompetitor()));
result.put(FIELD_BOAT, boatSerializer.serialize(registerCompetitorEvent.getBoat()));
}
result.put(FIELD_COMPETITOR, competitorSerializer.serialize(registerCompetitorEvent.getCompetitor()));
result.put(FIELD_BOAT, boatSerializer.serialize(registerCompetitorEvent.getBoat()));
return result;
}
}
@@ -1,9 +1,13 @@
package com.sap.sailing.server.gateway.serialization.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.UUID;
import org.json.simple.JSONObject;
@@ -12,12 +16,19 @@ import org.json.simple.parser.ParseException;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.impl.DomainFactoryImpl;
import com.sap.sailing.domain.base.impl.TransientCompetitorStoreImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorAndBoatJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorJsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorAndBoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sse.common.Util.Pair;
public class CompetitorJsonSerializerTest {
@@ -28,9 +39,17 @@ public class CompetitorJsonSerializerTest {
@Before
public void setUp() {
competitor = mock(Competitor.class);
when(competitor.getTeam()).thenReturn(mock(Team.class));
serializer = new CompetitorJsonSerializer();
deserializer = new CompetitorJsonDeserializer(DomainFactory.INSTANCE.getCompetitorStore());
mockTeam(competitor);
serializer = CompetitorJsonSerializer.create();
// use a separate competitor store for the de-serializer
deserializer = CompetitorJsonDeserializer.create(new DomainFactoryImpl(new TransientCompetitorStoreImpl(), /* raceLogResolver */ null));
}
private void mockTeam(final Competitor competitor) {
final Team team = mock(Team.class);
when(team.getSailors()).thenReturn(Collections.emptySet());
when(team.getName()).thenReturn("The Team");
when(competitor.getTeam()).thenReturn(team);
}
/**
@@ -40,7 +59,6 @@ public class CompetitorJsonSerializerTest {
public void testIntegerId() throws JsonDeserializationException, ParseException {
Integer expectedId = Integer.valueOf(123);
when(competitor.getId()).thenReturn(expectedId);
JSONObject result = serializer.serialize(competitor);
assertEquals(
expectedId,
@@ -53,7 +71,6 @@ public class CompetitorJsonSerializerTest {
public void testStringId() throws JsonDeserializationException, ParseException {
String expectedId = "123";
when(competitor.getId()).thenReturn(expectedId);
JSONObject result = serializer.serialize(competitor);
assertEquals(
expectedId,
@@ -62,6 +79,104 @@ public class CompetitorJsonSerializerTest {
assertEquals(expectedId, deserializedCompetitor.getId());
}
@Test
public void testCompetitorWithBoat() throws JsonDeserializationException, ParseException {
final CompetitorWithBoat competitorWithBoat = mock(CompetitorWithBoat.class);
mockTeam(competitorWithBoat);
String expectedId = "123";
when(competitorWithBoat.getId()).thenReturn(expectedId);
final Boat boat = mock(Boat.class);
when(competitorWithBoat.hasBoat()).thenReturn(true);
when(competitorWithBoat.getBoat()).thenReturn(boat);
when(boat.getId()).thenReturn(UUID.randomUUID());
when(boat.getSailID()).thenReturn("1233");
when(boat.getBoatClass()).thenReturn(DomainFactory.INSTANCE.getOrCreateBoatClass("Tornado"));
JSONObject result = serializer.serialize(competitorWithBoat);
final Competitor deserializedCompetitor = deserializer.deserialize((JSONObject) new JSONParser().parse(result.toString()));
assertTrue(deserializedCompetitor.hasBoat());
assertTrue(deserializedCompetitor instanceof CompetitorWithBoat);
final CompetitorWithBoat deserializedCompetitorWithBoat = (CompetitorWithBoat) deserializedCompetitor;
assertEquals(boat.getId(), deserializedCompetitorWithBoat.getBoat().getId());
assertEquals(boat.getSailID(), deserializedCompetitorWithBoat.getBoat().getSailID());
}
@Test
public void testCompetitorAndBoatWithBoat() throws JsonDeserializationException, ParseException {
final CompetitorWithBoat competitorWithBoat = mock(CompetitorWithBoat.class);
mockTeam(competitorWithBoat);
String expectedId = "123";
when(competitorWithBoat.getId()).thenReturn(expectedId);
final Boat boat = mock(Boat.class);
when(competitorWithBoat.hasBoat()).thenReturn(true);
when(competitorWithBoat.getBoat()).thenReturn(boat);
when(boat.getId()).thenReturn(UUID.randomUUID());
when(boat.getSailID()).thenReturn("1233");
when(boat.getBoatClass()).thenReturn(DomainFactory.INSTANCE.getOrCreateBoatClass("Tornado"));
JSONObject result = CompetitorAndBoatJsonSerializer.create().serialize(new Pair<>(competitorWithBoat, boat));
final Pair<Competitor, Boat> deserializedCompetitorAndBoat = CompetitorAndBoatJsonDeserializer
.create(new DomainFactoryImpl(new TransientCompetitorStoreImpl(), /* raceLogResolver */ null))
.deserialize((JSONObject) new JSONParser().parse(result.toString()));
assertTrue(deserializedCompetitorAndBoat.getA().hasBoat());
assertTrue(deserializedCompetitorAndBoat.getA() instanceof CompetitorWithBoat);
final CompetitorWithBoat deserializedCompetitorWithBoat = (CompetitorWithBoat) deserializedCompetitorAndBoat.getA();
assertSame(deserializedCompetitorWithBoat.getBoat(), deserializedCompetitorAndBoat.getB());
assertEquals(boat.getId(), deserializedCompetitorWithBoat.getBoat().getId());
assertEquals(boat.getSailID(), deserializedCompetitorWithBoat.getBoat().getSailID());
}
@Test
public void testCompetitorAndBoatWithoutBoat() throws JsonDeserializationException, ParseException {
String expectedId = "1234";
when(competitor.getId()).thenReturn(expectedId);
when(competitor.hasBoat()).thenReturn(false);
final Boat boat = mock(Boat.class);
when(boat.getId()).thenReturn(UUID.randomUUID());
when(boat.getSailID()).thenReturn("12334");
when(boat.getBoatClass()).thenReturn(DomainFactory.INSTANCE.getOrCreateBoatClass("Tornado"));
JSONObject result = CompetitorAndBoatJsonSerializer.create().serialize(new Pair<>(competitor, boat));
final Pair<Competitor, Boat> deserializedCompetitorAndBoat = CompetitorAndBoatJsonDeserializer
.create(new DomainFactoryImpl(new TransientCompetitorStoreImpl(), /* raceLogResolver */ null))
.deserialize((JSONObject) new JSONParser().parse(result.toString()));
assertFalse(deserializedCompetitorAndBoat.getA().hasBoat());
assertFalse(deserializedCompetitorAndBoat.getA() instanceof CompetitorWithBoat);
assertEquals("12334", deserializedCompetitorAndBoat.getB().getSailID());
}
@Test
public void testCompetitorAndBoatWithNullBoat() throws JsonDeserializationException, ParseException {
final CompetitorWithBoat competitorWithBoat = mock(CompetitorWithBoat.class);
mockTeam(competitorWithBoat);
String expectedId = "1234";
when(competitorWithBoat.getId()).thenReturn(expectedId);
when(competitorWithBoat.hasBoat()).thenReturn(false);
when(competitorWithBoat.getBoat()).thenReturn(null);
final Boat boat = mock(Boat.class);
when(boat.getId()).thenReturn(UUID.randomUUID());
when(boat.getSailID()).thenReturn("1233");
when(boat.getBoatClass()).thenReturn(DomainFactory.INSTANCE.getOrCreateBoatClass("Tornado"));
JSONObject result = CompetitorAndBoatJsonSerializer.create().serialize(new Pair<>(competitorWithBoat, boat));
final Pair<Competitor, Boat> deserializedCompetitorAndBoat = CompetitorAndBoatJsonDeserializer
.create(new DomainFactoryImpl(new TransientCompetitorStoreImpl(), /* raceLogResolver */ null))
.deserialize((JSONObject) new JSONParser().parse(result.toString()));
assertFalse(deserializedCompetitorAndBoat.getA().hasBoat());
assertFalse(deserializedCompetitorAndBoat.getA() instanceof CompetitorWithBoat);
assertEquals("1233", deserializedCompetitorAndBoat.getB().getSailID());
}
@Test
public void testCompetitorWithNullBoat() throws JsonDeserializationException, ParseException {
final CompetitorWithBoat competitorWithBoat = mock(CompetitorWithBoat.class);
mockTeam(competitorWithBoat);
String expectedId = "1234";
when(competitorWithBoat.getId()).thenReturn(expectedId);
when(competitorWithBoat.hasBoat()).thenReturn(false);
when(competitorWithBoat.getBoat()).thenReturn(null);
JSONObject result = serializer.serialize(competitorWithBoat);
Competitor deserializedCompetitor = deserializer.deserialize((JSONObject) new JSONParser().parse(result.toString()));
assertFalse(deserializedCompetitor.hasBoat());
assertFalse(deserializedCompetitor instanceof CompetitorWithBoat);
}
@Test
public void testUUIDId() throws JsonDeserializationException, ParseException {
UUID expectedId = UUID.randomUUID();
@@ -52,8 +52,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest {
SharedDomainFactory factory = DomainFactory.INSTANCE;
serializer = new RaceLogFinishPositioningConfirmedEventSerializer(new CompetitorJsonSerializer(
new TeamJsonSerializer(new PersonJsonSerializer(new NationalityJsonSerializer())), new BoatJsonSerializer(new BoatClassJsonSerializer())));
deserializer = new RaceLogFinishPositioningConfirmedEventDeserializer(new CompetitorJsonDeserializer(factory.getCompetitorStore(), null));
deserializer = new RaceLogFinishPositioningConfirmedEventDeserializer(new CompetitorJsonDeserializer(factory.getCompetitorStore(), /* team deserializer */ null, /* boat deserializer */ null));
now = MillisecondsTimePoint.now();
positioningList = new CompetitorResultsImpl();
}
@@ -73,9 +72,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest {
MaxPointsReason.NONE, /* score */ null, /* finishingTime */ null, /* comment */ null, MergeState.OK));
event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, positioningList);
JSONObject jsonConfirmationEvent = serializer.serialize(event);
RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer
.deserialize(jsonConfirmationEvent);
RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer.deserialize(jsonConfirmationEvent);
assertEquals(event.getId(), deserializedEvent.getId());
assertEquals(event.getPassId(), deserializedEvent.getPassId());
assertEquals(event.getLogicalTimePoint(), deserializedEvent.getLogicalTimePoint());
@@ -92,9 +89,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest {
throws JsonDeserializationException {
event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, null);
JSONObject jsonConfirmationEvent = serializer.serialize(event);
RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer
.deserialize(jsonConfirmationEvent);
RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer.deserialize(jsonConfirmationEvent);
assertEquals(event.getId(), deserializedEvent.getId());
assertEquals(event.getPassId(), deserializedEvent.getPassId());
assertEquals(event.getLogicalTimePoint(), deserializedEvent.getLogicalTimePoint());
@@ -110,9 +105,7 @@ public class RaceLogFinishPositioningConfirmedEventSerializerTest {
throws JsonDeserializationException {
event = new RaceLogFinishPositioningConfirmedEventImpl(now, author, 0, positioningList);
JSONObject jsonConfirmationEvent = serializer.serialize(event);
RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer
.deserialize(jsonConfirmationEvent);
RaceLogFinishPositioningConfirmedEvent deserializedEvent = (RaceLogFinishPositioningConfirmedEvent) deserializer.deserialize(jsonConfirmationEvent);
assertEquals(event.getId(), deserializedEvent.getId());
assertEquals(event.getPassId(), deserializedEvent.getPassId());
assertEquals(event.getLogicalTimePoint(), deserializedEvent.getLogicalTimePoint());
@@ -53,11 +53,9 @@ public class RaceLogWindFixEventSerializerTest {
serializer = new RaceLogWindFixEventSerializer(new CompetitorJsonSerializer(new TeamJsonSerializer(
new PersonJsonSerializer(new NationalityJsonSerializer())), new BoatJsonSerializer(new BoatClassJsonSerializer())), new WindJsonSerializer(
new PositionJsonSerializer()));
deserializer = new RaceLogWindFixEventDeserializer(new CompetitorJsonDeserializer(factory.getCompetitorStore(), null),
deserializer = new RaceLogWindFixEventDeserializer(new CompetitorJsonDeserializer(factory.getCompetitorStore(), /* team deserializer */ null, /* boat deserializer */ null),
new WindJsonDeserializer(new PositionJsonDeserializer()));
now = MillisecondsTimePoint.now();
event = new RaceLogWindFixEventImpl(now, author, 0, createWindFix(), /* isMagnetic */ false);
}
@@ -65,13 +63,11 @@ public class RaceLogWindFixEventSerializerTest {
public void testSerializeAndDeserializeRaceLogWindFixEvent() throws JsonDeserializationException {
JSONObject jsonWindFixEvent = serializer.serialize(event);
RaceLogWindFixEvent deserializedEvent = (RaceLogWindFixEvent) deserializer.deserialize(jsonWindFixEvent);
assertEquals(event.getId(), deserializedEvent.getId());
assertEquals(event.getPassId(), deserializedEvent.getPassId());
assertEquals(event.getLogicalTimePoint(), deserializedEvent.getLogicalTimePoint());
assertEquals(0, Util.size(event.getInvolvedCompetitors()));
assertEquals(0, Util.size(deserializedEvent.getInvolvedCompetitors()));
compareWind(event.getWindFix(), deserializedEvent.getWindFix());
}
@@ -93,5 +89,4 @@ public class RaceLogWindFixEventSerializerTest {
SpeedWithBearing speedBearing = new KnotSpeedWithBearingImpl(10.4, bearing);
return new WindImpl(position, now, speedBearing);
}
}
@@ -7,22 +7,21 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.impl.CompetitorWithBoatImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class ManeuversJsonSerializer extends AbstractTrackedRaceDataJsonSerializer {
public final static String MANEUVERS = "maneuvers";
private final CompetitorWithBoatJsonSerializer competitorSerializer;
private final CompetitorAndBoatJsonSerializer competitorAndBoatSerializer;
private final ManeuverJsonSerializer maneuverSerializer;
public ManeuversJsonSerializer(CompetitorWithBoatJsonSerializer competitorSerializer, ManeuverJsonSerializer maneuverSerializer) {
public ManeuversJsonSerializer(CompetitorAndBoatJsonSerializer competitorSerializer, ManeuverJsonSerializer maneuverSerializer) {
super();
this.competitorSerializer = competitorSerializer;
this.competitorAndBoatSerializer = competitorSerializer;
this.maneuverSerializer = maneuverSerializer;
}
@@ -36,7 +35,7 @@ public class ManeuversJsonSerializer extends AbstractTrackedRaceDataJsonSerializ
Boat boat = competitorAndBoatEntry.getValue();
final JSONObject forCompetitorJson = new JSONObject();
byCompetitorJson.add(forCompetitorJson);
forCompetitorJson.put(COMPETITOR, competitorSerializer.serialize(new CompetitorWithBoatImpl(competitor, (DynamicBoat) boat)));
forCompetitorJson.put(COMPETITOR, competitorAndBoatSerializer.serialize(new Pair<>(competitor, boat)));
final JSONArray maneuvers = new JSONArray();
forCompetitorJson.put(MANEUVERS, maneuvers);
for (final Maneuver maneuver : getManeuversDuringRace(trackedRace, competitor)) {
@@ -11,10 +11,9 @@ import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.CompetitorWithBoatImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.Util.Pair;
public class MarkPassingsJsonSerializer extends AbstractTrackedRaceDataJsonSerializer {
public static final String ZERO_BASED_WAYPOINT_INDEX = "zeroBasedWaypointIndex";
@@ -27,7 +26,7 @@ public class MarkPassingsJsonSerializer extends AbstractTrackedRaceDataJsonSeria
public JSONObject serialize(TrackedRace trackedRace) {
final Course course = trackedRace.getRace().getCourse();
JSONObject result = new JSONObject();
CompetitorWithBoatJsonSerializer competitorWithBoatSerializer = CompetitorWithBoatJsonSerializer.create();
CompetitorAndBoatJsonSerializer competitorWithBoatSerializer = CompetitorAndBoatJsonSerializer.create();
CompetitorJsonSerializer competitorSerializer = CompetitorJsonSerializer.create();
JSONArray byCompetitorJson = new JSONArray();
result.put(BYCOMPETITOR, byCompetitorJson);
@@ -36,7 +35,7 @@ public class MarkPassingsJsonSerializer extends AbstractTrackedRaceDataJsonSeria
Boat boat = competitorAndBoatEntry.getValue();
JSONObject forCompetitorJson = new JSONObject();
byCompetitorJson.add(forCompetitorJson);
forCompetitorJson.put(COMPETITOR, competitorWithBoatSerializer.serialize(new CompetitorWithBoatImpl(competitor, (DynamicBoat) boat)));
forCompetitorJson.put(COMPETITOR, competitorWithBoatSerializer.serialize(new Pair<>(competitor, boat)));
final NavigableSet<MarkPassing> markPassingsForCompetitor = trackedRace.getMarkPassings(competitor);
JSONArray markPassingsForCompetitorJson = new JSONArray();
forCompetitorJson.put(MARKPASSINGS, markPassingsForCompetitorJson);
@@ -7,33 +7,32 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.impl.CompetitorWithBoatImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sse.common.Util.Pair;
public class RaceEntriesJsonSerializer implements JsonSerializer<RaceDefinition> {
public static final String FIELD_NAME = "name";
public static final String FIELD_COMPETITORS = "competitors";
private final JsonSerializer<CompetitorWithBoat> competitorWithBoatSerializer;
private final CompetitorAndBoatJsonSerializer competitorAndBoatSerializer;
public RaceEntriesJsonSerializer() {
this(null);
}
public RaceEntriesJsonSerializer(JsonSerializer<CompetitorWithBoat> competitorWithBoatSerializer) {
this.competitorWithBoatSerializer = competitorWithBoatSerializer;
public RaceEntriesJsonSerializer(CompetitorAndBoatJsonSerializer competitorAndBoatSerializer) {
this.competitorAndBoatSerializer = competitorAndBoatSerializer;
}
public JSONObject serialize(RaceDefinition race) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, race.getName());
if(competitorWithBoatSerializer != null) {
if(competitorAndBoatSerializer != null) {
JSONArray competitorsJson = new JSONArray();
for (Entry<Competitor, Boat> competitorAndBoatEntry: race.getCompetitorsAndTheirBoats().entrySet()) {
competitorsJson.add(competitorWithBoatSerializer.serialize(new CompetitorWithBoatImpl(competitorAndBoatEntry.getKey(),
competitorsJson.add(competitorAndBoatSerializer.serialize(new Pair<>(competitorAndBoatEntry.getKey(),
(DynamicBoat) competitorAndBoatEntry.getValue())));
}
result.put(FIELD_COMPETITORS, competitorsJson);
@@ -33,30 +33,26 @@ public class RegattaJsonSerializer implements JsonSerializer<Regatta> {
public JSONObject serialize(Regatta regatta) {
JSONObject result = new JSONObject();
result.put(FIELD_NAME, regatta.getName());
result.put(FIELD_START_DATE, regatta.getStartDate() != null ? regatta.getStartDate().asMillis() : null);
result.put(FIELD_END_DATE, regatta.getEndDate() != null ? regatta.getEndDate().asMillis() : null);
result.put(FIELD_SCORINGSYSTEM, regatta.getScoringScheme().getType().name());
result.put(FIELD_BOATCLASS, regatta.getBoatClass() != null ? regatta.getBoatClass().getName(): null);
result.put(FIELD_COURSE_AREA_ID, regatta.getDefaultCourseArea() != null ? regatta.getDefaultCourseArea().getId().toString(): null);
if(seriesSerializer != null) {
if (seriesSerializer != null) {
JSONArray seriesJson = new JSONArray();
for (Series series : regatta.getSeries()) {
seriesJson.add(seriesSerializer.serialize(series));
}
result.put(FIELD_SERIES, seriesJson);
}
if(competitorSerializer != null) {
if (competitorSerializer != null) {
JSONArray competitorsJson = new JSONArray();
for (Competitor competitor: regatta.getAllCompetitors()) {
competitorsJson.add(competitorSerializer.serialize(competitor));
}
result.put(FIELD_COMPETITORS, competitorsJson);
}
return result;
}
}
@@ -26,6 +26,7 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
@@ -52,6 +53,9 @@ public class CompetitorsResource extends AbstractSailingServerResource {
JSONObject json = new JSONObject();
json.put(CompetitorJsonConstants.FIELD_ID, competitor.getId().toString());
json.put(CompetitorJsonConstants.FIELD_NAME, competitor.getName());
if (competitor.hasBoat()) {
json.put(CompetitorJsonConstants.FIELD_SAIL_ID, ((CompetitorWithBoat) competitor).getBoat().getSailID());
}
json.put(CompetitorJsonConstants.FIELD_SHORT_NAME, competitor.getShortName());
final Nationality nationality = competitor.getTeam().getNationality();
json.put(CompetitorJsonConstants.FIELD_NATIONALITY, nationality==null?null:nationality.getThreeLetterIOCAcronym());
@@ -89,26 +93,21 @@ public class CompetitorsResource extends AbstractSailingServerResource {
@Path("{competitor-id}/team")
public Response getTeam(@PathParam("competitor-id") String competitorId) {
Competitor competitor = getService().getCompetitorStore().getExistingCompetitorByIdAsString(competitorId);
if (competitor == null) {
return Response.status(Status.NOT_FOUND)
.entity("Could not find a competitor with id '" + StringEscapeUtils.escapeHtml(competitorId) + "'.").type(MediaType.TEXT_PLAIN)
.build();
}
Team team = competitor.getTeam();
if (team == null) {
return Response.status(Status.NOT_FOUND)
.entity("Could not find a team associated with competitor '" + StringEscapeUtils.escapeHtml(competitorId) + "'.")
.type(MediaType.TEXT_PLAIN).build();
}
TeamJsonSerializer teamJsonSerializer = new TeamJsonSerializer(new PersonJsonSerializer(
new NationalityJsonSerializer()));
JSONObject teamJson = teamJsonSerializer.serialize(team);
String json = teamJson.toJSONString();
return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
}
@@ -64,9 +64,7 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.CompetitorWithBoatImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.DeviceIdentifier;
@@ -115,7 +113,7 @@ import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseJsonSe
import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorWithBoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorAndBoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.FlatGPSFixJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.MarkJsonSerializerWithPosition;
import com.sap.sse.InvalidDateException;
@@ -1030,11 +1028,11 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
return result;
});
}
CompetitorWithBoatJsonSerializer serializer = CompetitorWithBoatJsonSerializer.create();
CompetitorAndBoatJsonSerializer serializer = CompetitorAndBoatJsonSerializer.create();
JSONArray result = new JSONArray();
for (final Competitor c : competitors) {
Boat boat = trackedRace.getBoatOfCompetitor(c);
JSONObject jsonCompetitor = serializer.serialize(new CompetitorWithBoatImpl(c, (DynamicBoat) boat));
JSONObject jsonCompetitor = serializer.serialize(new Pair<>(c, boat));
result.add(jsonCompetitor);
}
String json = result.toJSONString();
@@ -78,8 +78,8 @@ import com.sap.sailing.server.gateway.serialization.impl.AbstractTrackedRaceData
import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorAndBoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorWithBoatJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompleteManeuverCurveWithEstimationDataJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompleteManeuverCurvesWithEstimationDataJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.DefaultWindTrackJsonSerializer;
@@ -246,10 +246,9 @@ public class RegattasResource extends AbstractSailingServerResource {
if (race == null) {
response = getBadRaceErrorResponse(regattaName, raceName);
} else {
CompetitorWithBoatJsonSerializer competitorJsonSerializer = CompetitorWithBoatJsonSerializer.create();
JsonSerializer<RaceDefinition> raceEntriesSerializer = new RaceEntriesJsonSerializer(competitorJsonSerializer);
CompetitorAndBoatJsonSerializer competitorAndBoatJsonSerializer = CompetitorAndBoatJsonSerializer.create();
JsonSerializer<RaceDefinition> raceEntriesSerializer = new RaceEntriesJsonSerializer(competitorAndBoatJsonSerializer);
JSONObject serializedRaceEntries = raceEntriesSerializer.serialize(race);
String json = serializedRaceEntries.toJSONString();
response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
}
@@ -339,7 +338,7 @@ public class RegattasResource extends AbstractSailingServerResource {
timeOnDistanceAllowancePerNauticalMileAsMillis == null ? null : new MillisecondsDurationImpl(timeOnDistanceAllowancePerNauticalMileAsMillis),
searchTag, (DynamicBoat) boat);
regatta.registerCompetitor(competitor);
response = Response.ok(CompetitorWithBoatJsonSerializer.create().serialize(competitor).toJSONString()).
response = Response.ok(CompetitorJsonSerializer.create().serialize(competitor).toJSONString()).
header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
}
return response;
@@ -1014,7 +1013,7 @@ public class RegattasResource extends AbstractSailingServerResource {
.build();
} else {
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
ManeuversJsonSerializer serializer = new ManeuversJsonSerializer(CompetitorWithBoatJsonSerializer.create(),
ManeuversJsonSerializer serializer = new ManeuversJsonSerializer(CompetitorAndBoatJsonSerializer.create(),
new ManeuverJsonSerializer(new GPSFixJsonSerializer(), new DistanceJsonSerializer()));
JSONObject jsonMarkPassings = serializer.serialize(trackedRace);
String json = jsonMarkPassings.toJSONString();