Merge branch 'master' into permission-vertical

Change-Id: I34c3acf3abc16da5f37319b0e128a567fda24ab2
This commit is contained in:
Axel Uhl committed 2018-04-12 14:29:32 +02:00
commit 4819b285ae
233 files changed
+2555 -2829

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);
}
}
@@ -2,6 +2,7 @@ package com.sap.sailing.server.gateway.deserialization.impl;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.UUID;
import java.util.logging.Logger;
@@ -11,6 +12,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 +23,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 +69,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;
@@ -78,16 +80,42 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
team = teamJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_TEAM));
}
final DynamicBoat boat = getBoat(object);
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);
}
}
/**
* Looks for the {@link CompetitorJsonConstants#FIELD_BOAT} field and if present and there is a
* {@link #boatJsonDeserializer} set, the boat is deserialized from that field and returned; otherwise, {@code null}
* is returned.
*/
protected DynamicBoat getBoat(JSONObject object) throws ClassNotFoundException, NoSuchMethodException,
InstantiationException, IllegalAccessException, InvocationTargetException, JsonDeserializationException {
final DynamicBoat boat;
if (boatJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_BOAT) != null) {
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_BOAT));
} else {
boat = null;
}
return boat;
}
}
@@ -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);
}
}
}
@@ -2,32 +2,21 @@ package com.sap.sailing.server.gateway.deserialization.impl;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.net.URI;
import java.lang.reflect.InvocationTargetException;
import java.util.UUID;
import java.util.logging.Logger;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatFactory;
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;
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 CompetitorWithBoatRefJsonDeserializer implements JsonDeserializer<Competitor> {
private final CompetitorFactory competitorFactory;
public class CompetitorWithBoatRefJsonDeserializer extends CompetitorJsonDeserializer {
private final BoatFactory boatFactory;
private final JsonDeserializer<DynamicTeam> teamJsonDeserializer;
private static final Logger logger = Logger.getLogger(CompetitorWithBoatRefJsonDeserializer.class.getName());
public static CompetitorWithBoatRefJsonDeserializer create(SharedDomainFactory baseDomainFactory) {
return new CompetitorWithBoatRefJsonDeserializer(baseDomainFactory, baseDomainFactory, new TeamJsonDeserializer(new PersonJsonDeserializer(
@@ -39,77 +28,29 @@ public class CompetitorWithBoatRefJsonDeserializer implements JsonDeserializer<C
}
public CompetitorWithBoatRefJsonDeserializer(CompetitorFactory competitorFactory, BoatFactory boatFactory, JsonDeserializer<DynamicTeam> teamJsonDeserializer) {
this.competitorFactory = competitorFactory;
super(competitorFactory, teamJsonDeserializer, /* boat deserializer */ null);
this.boatFactory = boatFactory;
this.teamJsonDeserializer = teamJsonDeserializer;
}
/**
* Looks for {@link CompetitorJsonConstants#FIELD_BOAT_ID} in the JSON {@code object}. If found, the boat is looked
* up in the {@link #boatFactory} and the lookup result is returned; otherwise, {@code null} is returned.
*/
@Override
public Competitor deserialize(JSONObject object) throws JsonDeserializationException {
Serializable competitorId = (Serializable) object.get(CompetitorJsonSerializer.FIELD_ID);
try {
{
Class<?> competitorIdClass = Class.forName((String) object.get(CompetitorJsonConstants.FIELD_ID_TYPE));
if (Number.class.isAssignableFrom(competitorIdClass)) {
Constructor<?> constructorFromString = competitorIdClass.getConstructor(String.class);
competitorId = (Serializable) constructorFromString.newInstance(competitorId.toString());
} else if (UUID.class.isAssignableFrom(competitorIdClass)) {
competitorId = Helpers.tryUuidConversion(competitorId);
}
protected DynamicBoat getBoat(JSONObject object) throws ClassNotFoundException, NoSuchMethodException,
InstantiationException, IllegalAccessException, InvocationTargetException {
// if we find a boat identifier we try to find the boat with the boatfactory
Serializable boatId = (Serializable) object.get(CompetitorJsonConstants.FIELD_BOAT_ID);
if (boatId != null) {
Class<?> boatIdClass = Class.forName((String) object.get(CompetitorJsonConstants.FIELD_BOAT_ID_TYPE));
if (Number.class.isAssignableFrom(boatIdClass)) {
Constructor<?> constructorFromString = boatIdClass.getConstructor(String.class);
boatId = (Serializable) constructorFromString.newInstance(boatId.toString());
} else if (UUID.class.isAssignableFrom(boatIdClass)) {
boatId = Helpers.tryUuidConversion(boatId);
}
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;
if (teamJsonDeserializer != null && object.get(CompetitorJsonConstants.FIELD_TEAM) != null) {
team = teamJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonConstants.FIELD_TEAM));
}
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);
// if we find a boat identifier we try to find the boat with the boatfactory
Serializable boatId = (Serializable) object.get(CompetitorJsonConstants.FIELD_BOAT_ID);
if (boatId != null) {
Class<?> boatIdClass = Class.forName((String) object.get(CompetitorJsonConstants.FIELD_BOAT_ID_TYPE));
if (Number.class.isAssignableFrom(boatIdClass)) {
Constructor<?> constructorFromString = boatIdClass.getConstructor(String.class);
boatId = (Serializable) constructorFromString.newInstance(boatId.toString());
} else if (UUID.class.isAssignableFrom(boatIdClass)) {
boatId = Helpers.tryUuidConversion(boatId);
}
}
final Boat existingBoat = boatId != null ? boatFactory.getExistingBoatById(boatId) : null;
if (existingBoat != null) {
return competitorFactory.getOrCreateCompetitorWithBoat(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag, (DynamicBoat) existingBoat);
} else {
return competitorFactory.getOrCreateCompetitor(competitorId, name, shortName, displayColor, email,
flagImageURI, team, timeOnTimeFactor,
timeOnDistanceAllowanceInSecondsPerNauticalMile == null ? null :
new MillisecondsDurationImpl((long) (timeOnDistanceAllowanceInSecondsPerNauticalMile*1000)), searchTag);
}
} catch (Exception e) {
throw new JsonDeserializationException(e);
}
final DynamicBoat existingBoat = (DynamicBoat) (boatId != null ? boatFactory.getExistingBoatById(boatId) : null);
return existingBoat;
}
}
@@ -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;
}
}
@@ -7,7 +7,9 @@ import java.util.UUID;
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.Nationality;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.common.tracking.impl.CompetitorJsonConstants;
@@ -15,21 +17,46 @@ 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());
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() {
this(null);
this(null, null);
}
public CompetitorJsonSerializer(JsonSerializer<Team> teamJsonSerializer) {
public CompetitorJsonSerializer(JsonSerializer<Team> teamJsonSerializer, JsonSerializer<Boat> boatJsonSerializer) {
this.teamJsonSerializer = teamJsonSerializer;
this.boatJsonSerializer = boatJsonSerializer;
}
public static JSONObject getCompetitorIdQuery(Competitor competitor) {
@@ -68,6 +95,9 @@ public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
if (teamJsonSerializer != null) {
result.put(CompetitorJsonConstants.FIELD_TEAM, teamJsonSerializer.serialize(competitor.getTeam()));
}
if (boatJsonSerializer != null && competitor.hasBoat()) {
result.put(CompetitorJsonConstants.FIELD_BOAT, boatJsonSerializer.serialize(((CompetitorWithBoat) competitor).getBoat()));
}
result.put(CompetitorJsonConstants.FIELD_TIME_ON_TIME_FACTOR, competitor.getTimeOnTimeFactor());
result.put(CompetitorJsonConstants.FIELD_TIME_ON_DISTANCE_ALLOWANCE_IN_SECONDS_PER_NAUTICAL_MILE,
competitor.getTimeOnDistanceAllowancePerNauticalMile() == null ? null :
@@ -75,7 +105,7 @@ public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
return result;
}
protected Color getColor(Competitor competitor ) {
protected Color getColor(Competitor competitor) {
return competitor.getColor();
}
}
@@ -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;
}
}