From 5adffc7d2e08109f3ff5b96ea29b796badb74697 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 6 Sep 2019 22:20:38 +0200 Subject: [PATCH] factored ORC certificate serialization into a JSON serializer/deserializer pair and use in Mongo persistence Change-Id: Ia25225b571506287d1dd17087afd868bb19d0c83 --- .../impl/DomainObjectFactoryImpl.java | 72 ++-------- .../impl/MongoObjectFactoryImpl.java | 115 +++------------ .../impl/MongoRaceLogStoreVisitor.java | 7 + .../orc/ORCCertificateAssignmentEvent.java | 12 ++ .../RaceLogORCCertificateAssignmentEvent.java | 7 + ...gattaLogORCCertificateAssignmentEvent.java | 13 +- ...BaseORCCertificateAssignmentEventImpl.java | 41 ++++++ ...eLogORCCertificateAssignmentEventImpl.java | 45 ++++++ .../abstractlog/race/RaceLogEventVisitor.java | 54 +++---- .../impl/AbstractRaceLogChangedVisitor.java | 6 + .../race/impl/BaseRaceLogEventVisitor.java | 8 +- .../domain/orc/TestORCPerformanceCurve.java | 2 - .../impl/RaceColumnRaceLogReplicator.java | 7 +- ...tStoringAndLoadingRaceORCLegDataEvent.java | 2 - .../impl/ORCCertificateJsonDeserializer.java | 92 ++++++++++++ ...LogDenoteForTrackingEventDeserializer.java | 1 - ...ertificateAssignmentEventDeserializer.java | 40 ++++++ .../impl/ORCCertificateJsonSerializer.java | 136 ++++++++++++++++++ .../racelog/impl/RaceLogEventSerializer.java | 16 ++- ...CCertificateAssignmentEventSerializer.java | 39 +++++ .../racelog/RaceLogEventSerializerTest.java | 8 +- 21 files changed, 520 insertions(+), 203 deletions(-) create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/ORCCertificateAssignmentEvent.java create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RaceLogORCCertificateAssignmentEvent.java create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/BaseORCCertificateAssignmentEventImpl.java create mode 100755 java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/RaceLogORCCertificateAssignmentEventImpl.java create mode 100755 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/ORCCertificateJsonDeserializer.java create mode 100755 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogORCCertificateAssignmentEventDeserializer.java create mode 100755 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/ORCCertificateJsonSerializer.java create mode 100755 java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogORCCertificateAssignmentEventSerializer.java diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 8f6771ff548..73f50861b4d 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -44,10 +44,10 @@ import com.mongodb.client.model.RenameCollectionOptions; import com.mongodb.client.result.DeleteResult; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; -import com.sap.sailing.domain.abstractlog.orc.RegattaLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; -import com.sap.sailing.domain.abstractlog.orc.impl.RegattaLogORCCertificateAssignmentEventImpl; +import com.sap.sailing.domain.abstractlog.orc.RegattaLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.impl.RaceLogORCLegDataEventImpl; +import com.sap.sailing.domain.abstractlog.orc.impl.RegattaLogORCCertificateAssignmentEventImpl; import com.sap.sailing.domain.abstractlog.race.CompetitorResult.MergeState; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLog; @@ -194,16 +194,13 @@ import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.dto.AnniversaryType; import com.sap.sailing.domain.common.dto.EventType; import com.sap.sailing.domain.common.impl.DegreePosition; -import com.sap.sailing.domain.common.impl.KnotSpeedImpl; import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; -import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sailing.domain.common.impl.NauticalMileDistance; import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.common.orc.ORCCertificate; import com.sap.sailing.domain.common.orc.ORCPerformanceCurveLegTypes; -import com.sap.sailing.domain.common.orc.impl.ORCCertificateImpl; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; @@ -254,13 +251,13 @@ import com.sap.sailing.server.gateway.deserialization.impl.DeviceConfigurationJs import com.sap.sailing.server.gateway.deserialization.impl.Helpers; import com.sap.sailing.server.gateway.deserialization.impl.LegacyCompetitorWithContainedBoatJsonDeserializer; import com.sap.sailing.server.gateway.deserialization.impl.RegattaConfigurationJsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.racelog.impl.ORCCertificateJsonDeserializer; import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJsonSerializer; import com.sap.sse.common.Bearing; import com.sap.sse.common.Color; import com.sap.sse.common.Distance; import com.sap.sse.common.Duration; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; -import com.sap.sse.common.Speed; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; import com.sap.sse.common.TypeBasedServiceFinder; @@ -274,7 +271,6 @@ import com.sap.sse.common.impl.DegreeBearingImpl; import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.RGBColor; -import com.sap.sse.common.impl.SecondsDurationImpl; import com.sap.sse.common.impl.TimeRangeImpl; import com.sap.sse.common.media.MimeType; import com.sap.sse.shared.media.ImageDescriptor; @@ -2048,7 +2044,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } private void loadRegattaLogEvents(RegattaLog targetRegattaLog, Document query, - RegattaLikeIdentifier regattaLogIdentifier) { + RegattaLikeIdentifier regattaLogIdentifier) throws JsonDeserializationException, ParseException { MongoCollection collection = database.getCollection(CollectionNames.REGATTA_LOGS.name()); for (Document o : collection.find(query)) { try { @@ -2062,7 +2058,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } } - private RegattaLogEvent loadRegattaLogEvent(Document o, RegattaLikeIdentifier regattaLogIdentifier) { + private RegattaLogEvent loadRegattaLogEvent(Document o, RegattaLikeIdentifier regattaLogIdentifier) + throws JsonDeserializationException, ParseException { Document dbObject = (Document) o.get(FieldNames.REGATTA_LOG_EVENT.name()); TimePoint logicalTimePoint = loadTimePoint(dbObject); TimePoint createdAt = loadTimePoint(dbObject, FieldNames.REGATTA_LOG_EVENT_CREATED_AT); @@ -2222,57 +2219,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } private RegattaLogORCCertificateAssignmentEvent loadRegattaLogORCCertificateAssignmentEvent(TimePoint createdAt, - AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Document dbObject) { - String sailnumber = dbObject.getString(FieldNames.ORC_CERTIFICATE_SAILNUMBER.name()); - String boatclass = dbObject.getString(FieldNames.ORC_CERTIFICATE_BOATCLASS.name()); - Distance length = new MeterDistance(dbObject.getDouble(FieldNames.ORC_CERTIFICATE_LENGTH.name())); - Duration gph = new SecondsDurationImpl(dbObject.getDouble(FieldNames.ORC_CERTIFICATE_GPH.name())); - Double cdl = dbObject.getDouble(FieldNames.ORC_CERTIFICATE_CDL.name()); - - Map> velocityPredictionsPerTrueWindSpeedAndAngle = new HashMap<>(); - Map beatAngles = new HashMap<>(); - Map beatVMGPredictionPerTrueWindSpeed = new HashMap<>(); - Map beatAllowancePerTrueWindSpeed = new HashMap<>(); - Map runAngles = new HashMap<>(); - Map runVMGPredictionPerTrueWindSpeed = new HashMap<>(); - Map runAllowancePerTrueWindSpeed = new HashMap<>(); - Map circularRandomSpeedPredictionPerTrueWindSpeed = new HashMap<>(); - Map nonSpinnakerSpeedPredictionPerTrueWindSpeed = new HashMap<>(); - - for (Speed tws : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS) { - String twsKey = MongoObjectFactoryImpl.speedToKnotsString(tws); - beatAngles.put(tws, new DegreeBearingImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_BEAT_ANGLES.name())).getDouble(twsKey))); - beatVMGPredictionPerTrueWindSpeed.put(tws, new KnotSpeedImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_BEAT_VMG_PREDICTIONS.name())).getDouble(twsKey))); - beatAllowancePerTrueWindSpeed.put(tws, new SecondsDurationImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_BEAT_ALLOWANCES.name())).getDouble(twsKey))); - runAngles.put(tws, new DegreeBearingImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_RUN_ANGLES.name())).getDouble(twsKey))); - runVMGPredictionPerTrueWindSpeed.put(tws, new KnotSpeedImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_RUN_VMG_PREDICTIONS.name())).getDouble(twsKey))); - runAllowancePerTrueWindSpeed.put(tws, new SecondsDurationImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_RUN_ALLOWANCES.name())).getDouble(twsKey))); - circularRandomSpeedPredictionPerTrueWindSpeed.put(tws, new KnotSpeedImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_CIRCULAR_RANDOM_SPEED_PREDICTIONS.name())).getDouble(twsKey))); - nonSpinnakerSpeedPredictionPerTrueWindSpeed.put(tws, new KnotSpeedImpl( - ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_NON_SPINNAKER_SPEED_PREDICTIONS.name())).getDouble(twsKey))); - - Map velocityPredictionAtCurrentTrueWindSpeedPerTrueWindAngle = new HashMap<>(); - for (Bearing twa : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES) { - String twaKey = MongoObjectFactoryImpl.bearingToDegreeString(twa); - velocityPredictionAtCurrentTrueWindSpeedPerTrueWindAngle.put(twa, new KnotSpeedImpl( - ((Document) ((Document) dbObject.get(FieldNames.ORC_CERTIFICATE_TWA_SPEED_PREDICTIONS.name())) - .get(twaKey)).getDouble(twsKey))); - } - velocityPredictionsPerTrueWindSpeedAndAngle.put(tws, velocityPredictionAtCurrentTrueWindSpeedPerTrueWindAngle); - } - - ORCCertificate certificate = new ORCCertificateImpl(sailnumber, boatclass, length, gph, cdl, - velocityPredictionsPerTrueWindSpeedAndAngle, beatAngles, beatVMGPredictionPerTrueWindSpeed, - beatAllowancePerTrueWindSpeed, runAngles, runVMGPredictionPerTrueWindSpeed, - runAllowancePerTrueWindSpeed, circularRandomSpeedPredictionPerTrueWindSpeed, - nonSpinnakerSpeedPredictionPerTrueWindSpeed); + AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Document dbObject) + throws JsonDeserializationException, ParseException { + final Document certificateDbObject = (Document) dbObject.get(FieldNames.ORC_CERTIFICATE.name()); + final JsonWriterSettings writerSettings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build(); + JSONObject json = Helpers.toJSONObjectSafe(new JSONParser().parse(certificateDbObject.toJson(writerSettings))); + final ORCCertificate certificate = new ORCCertificateJsonDeserializer().deserialize(json); Serializable competitorId = (Serializable) dbObject.get(FieldNames.COMPETITOR_ID.name()); return new RegattaLogORCCertificateAssignmentEventImpl(createdAt, logicalTimePoint, author, id, certificate, competitorId); } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 9046b7f6aa8..77926df4082 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -27,8 +27,9 @@ import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.result.DeleteResult; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; -import com.sap.sailing.domain.abstractlog.orc.RegattaLogORCCertificateAssignmentEvent; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; +import com.sap.sailing.domain.abstractlog.orc.RegattaLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.race.CompetitorResult; import com.sap.sailing.domain.abstractlog.race.CompetitorResults; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; @@ -102,7 +103,6 @@ import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.dto.AnniversaryType; import com.sap.sailing.domain.common.orc.ORCCertificate; -import com.sap.sailing.domain.common.orc.impl.ORCCertificateImpl; import com.sap.sailing.domain.common.racelog.tracking.TransformationException; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; @@ -129,6 +129,7 @@ import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerialize import com.sap.sailing.server.gateway.serialization.impl.CompetitorWithBoatRefJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.RegattaConfigurationJsonSerializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.ORCCertificateJsonSerializer; import com.sap.sse.common.Bearing; import com.sap.sse.common.Duration; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; @@ -998,11 +999,27 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { return result; } - private Object storeORCLegDataEvent(RaceLogORCLegDataEvent event) { + public Document storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogORCCertificateAssignmentEvent event) { + Document result = new Document(); + storeRaceLogIdentifier(raceLogIdentifier, result); + result.put(FieldNames.RACE_LOG_EVENT.name(), storeORCCertificateAssignmentEvent(event)); + return result; + } + + private Document storeORCCertificateAssignmentEvent(RaceLogORCCertificateAssignmentEvent event) { Document result = new Document(); storeRaceLogEventProperties(event, result); result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogORCLegDataEvent.class.getSimpleName()); - result.put(FieldNames.ORC_LEG_NR.name(), event.getLegNr()); // TODO Null handling + result.append(FieldNames.COMPETITOR_ID.name(), event.getCompetitorID()); + result.append(FieldNames.ORC_CERTIFICATE.name(), createORCCertificateObject(event.getCertificate())); + return result; + } + + private Document storeORCLegDataEvent(RaceLogORCLegDataEvent event) { + Document result = new Document(); + storeRaceLogEventProperties(event, result); + result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogORCLegDataEvent.class.getSimpleName()); + result.put(FieldNames.ORC_LEG_NR.name(), event.getLegNr()); result.put(FieldNames.ORC_LEG_LENGTH_IN_NAUTICAL_MILES.name(), event.getLength().getNauticalMiles()); result.put(FieldNames.ORC_LEG_TWA_IN_DEG.name(), event.getTwa().getDegrees()); result.put(FieldNames.ORC_LEG_TYPE.name(), event.getType().name()); @@ -1816,95 +1833,9 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { } } - static String speedToKnotsString(Speed speed) { - String result = null; - if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[0])) { - result = FieldNames.ORC_CERTIFICATE_TWS_6KT.name(); - } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[1])) { - result = FieldNames.ORC_CERTIFICATE_TWS_8KT.name(); - } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[2])) { - result = FieldNames.ORC_CERTIFICATE_TWS_10KT.name(); - } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[3])) { - result = FieldNames.ORC_CERTIFICATE_TWS_12KT.name(); - } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[4])) { - result = FieldNames.ORC_CERTIFICATE_TWS_14KT.name(); - } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[5])) { - result = FieldNames.ORC_CERTIFICATE_TWS_16KT.name(); - } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[6])) { - result = FieldNames.ORC_CERTIFICATE_TWS_20KT.name(); - } - return result; - } - - static String bearingToDegreeString(Bearing bearing) { - String result = null; - if(bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[0])) { - result = FieldNames.ORC_CERTIFICATE_R52_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[1])) { - result = FieldNames.ORC_CERTIFICATE_R60_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[2])) { - result = FieldNames.ORC_CERTIFICATE_R75_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[3])) { - result = FieldNames.ORC_CERTIFICATE_R90_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[4])) { - result = FieldNames.ORC_CERTIFICATE_R110_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[5])) { - result = FieldNames.ORC_CERTIFICATE_R120_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[6])) { - result = FieldNames.ORC_CERTIFICATE_R135_PREDICTION.name(); - } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[7])) { - result = FieldNames.ORC_CERTIFICATE_R150_PREDICTION.name(); - } - return result; - } - private Document createORCCertificateObject(ORCCertificate certificate) { - Document result = new Document(FieldNames.ORC_CERTIFICATE_SAILNUMBER.name(), certificate.getSailnumber()); - result.append(FieldNames.ORC_CERTIFICATE_BOATCLASS.name(), certificate.getBoatclass()); - result.append(FieldNames.ORC_CERTIFICATE_GPH.name(), certificate.getGPH()); - result.append(FieldNames.ORC_CERTIFICATE_CDL.name(), certificate.getCDL()); - result.append(FieldNames.ORC_CERTIFICATE_LENGTH.name(), certificate.getLengthOverAll().getMeters()); - - Document beatAngles = new Document(); - Document runAngles = new Document(); - Document beatAllowances = new Document(); - Document runAllowances = new Document(); - Document beatVMGPredictions = new Document(); - Document runVMGPredictions = new Document(); - Document windwardLeewardPredictions = new Document(); - Document circularRandomPredictions = new Document(); - Document longDistancePredictions = new Document(); - Document nonSpinnakerPredictions = new Document(); - Document velocityPredictionsPerTrueWindSpeedAndAngle = new Document(); - for (Speed tws : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS) { - String keyTWS = speedToKnotsString(tws); - Document velocityPredictionsPerTrueWindAngle = new Document(); - beatAngles.append(keyTWS, certificate.getBeatAngles().get(tws).getDegrees()); - runAngles.append(keyTWS, certificate.getRunAngles().get(tws).getDegrees()); - beatAllowances.append(keyTWS, certificate.getBeatAllowances().get(tws).asSeconds()); - runAllowances.append(keyTWS, certificate.getRunAllowances().get(tws).asSeconds()); - beatVMGPredictions.append(keyTWS, certificate.getBeatVMGPredictions().get(tws).getKnots()); - runVMGPredictions.append(keyTWS, certificate.getRunVMGPredictions().get(tws).getKnots()); - windwardLeewardPredictions.append(keyTWS, certificate.getWindwardLeewardSpeedPrediction().get(tws).getKnots()); - circularRandomPredictions.append(keyTWS, certificate.getCircularRandomSpeedPredictions().get(tws).getKnots()); - longDistancePredictions.append(keyTWS, certificate.getLongDistanceSpeedPredictions().get(tws).getKnots()); - nonSpinnakerPredictions.append(keyTWS, certificate.getNonSpinnakerSpeedPredictions().get(tws).getKnots()); - for (Bearing twa : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES) { - String keyTWA = bearingToDegreeString(twa); - velocityPredictionsPerTrueWindAngle.append(keyTWA, certificate.getVelocityPredictionPerTrueWindSpeedAndAngle().get(tws).get(twa).getKnots()); - } - velocityPredictionsPerTrueWindSpeedAndAngle.append(keyTWS, velocityPredictionsPerTrueWindAngle); - } - - result.append(FieldNames.ORC_CERTIFICATE_BEAT_ANGLES.name(), beatAngles); - result.append(FieldNames.ORC_CERTIFICATE_RUN_ANGLES.name(), runAngles); - result.append(FieldNames.ORC_CERTIFICATE_BEAT_ALLOWANCES.name(), beatAllowances); - result.append(FieldNames.ORC_CERTIFICATE_RUN_ALLOWANCES.name(), runAllowances); - result.append(FieldNames.ORC_CERTIFICATE_BEAT_VMG_PREDICTIONS.name(), beatVMGPredictions); - result.append(FieldNames.ORC_CERTIFICATE_RUN_VMG_PREDICTIONS.name(), runVMGPredictions); - result.append(FieldNames.ORC_CERTIFICATE_CIRCULAR_RANDOM_SPEED_PREDICTIONS.name(), circularRandomPredictions); - result.append(FieldNames.ORC_CERTIFICATE_NON_SPINNAKER_SPEED_PREDICTIONS.name(), nonSpinnakerPredictions); - result.append(FieldNames.ORC_CERTIFICATE_TWA_SPEED_PREDICTIONS.name(), velocityPredictionsPerTrueWindSpeedAndAngle); + final ORCCertificateJsonSerializer serializer = new ORCCertificateJsonSerializer(); + final Document result = Document.parse(serializer.serialize(certificate).toString()); return result; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java index 2ae9bac10fd..1ea93683c5e 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoRaceLogStoreVisitor.java @@ -4,6 +4,7 @@ import java.util.logging.Logger; import org.bson.Document; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; @@ -195,4 +196,10 @@ public class MongoRaceLogStoreVisitor implements RaceLogEventVisitor { Document object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); mongoObjectFactory.storeRaceLogEventEvent(object); } + + @Override + public void visit(RaceLogORCCertificateAssignmentEvent event) { + Document object = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event); + mongoObjectFactory.storeRaceLogEventEvent(object); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/ORCCertificateAssignmentEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/ORCCertificateAssignmentEvent.java new file mode 100755 index 00000000000..400ec238f61 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/ORCCertificateAssignmentEvent.java @@ -0,0 +1,12 @@ +package com.sap.sailing.domain.abstractlog.orc; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEvent; +import com.sap.sailing.domain.common.orc.ORCCertificate; + +public interface ORCCertificateAssignmentEvent extends AbstractLogEvent { + Serializable getCompetitorID(); + + ORCCertificate getCertificate(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RaceLogORCCertificateAssignmentEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RaceLogORCCertificateAssignmentEvent.java new file mode 100755 index 00000000000..8d13a4bfcce --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RaceLogORCCertificateAssignmentEvent.java @@ -0,0 +1,7 @@ +package com.sap.sailing.domain.abstractlog.orc; + +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; + +public interface RaceLogORCCertificateAssignmentEvent extends ORCCertificateAssignmentEvent, RaceLogEvent { +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RegattaLogORCCertificateAssignmentEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RegattaLogORCCertificateAssignmentEvent.java index af0733f33ff..ed4f09b521e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RegattaLogORCCertificateAssignmentEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/RegattaLogORCCertificateAssignmentEvent.java @@ -1,16 +1,7 @@ package com.sap.sailing.domain.abstractlog.orc; -import java.io.Serializable; - import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent; -import com.sap.sailing.domain.common.orc.ORCCertificate; +import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEventVisitor; -// TODO Here is needed a solution/concept to use this kind of events in race and regatta logs. -// Additionally the logic shouldn't be implemented at two different places. -public interface RegattaLogORCCertificateAssignmentEvent extends RegattaLogEvent { - - public Serializable getCompetitorID(); - - public ORCCertificate getCertificate(); - +public interface RegattaLogORCCertificateAssignmentEvent extends ORCCertificateAssignmentEvent, RegattaLogEvent { } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/BaseORCCertificateAssignmentEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/BaseORCCertificateAssignmentEventImpl.java new file mode 100755 index 00000000000..693c1571a10 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/BaseORCCertificateAssignmentEventImpl.java @@ -0,0 +1,41 @@ +package com.sap.sailing.domain.abstractlog.orc.impl; + +import java.io.Serializable; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.impl.AbstractLogEventImpl; +import com.sap.sailing.domain.abstractlog.orc.ORCCertificateAssignmentEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.orc.ORCCertificate; +import com.sap.sse.common.TimePoint; + +public abstract class BaseORCCertificateAssignmentEventImpl extends AbstractLogEventImpl implements ORCCertificateAssignmentEvent { + private static final long serialVersionUID = -3186019736784868848L; + + private ORCCertificate certificate; + private Serializable competitorID; + + public BaseORCCertificateAssignmentEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, + AbstractLogEventAuthor author, Serializable pId, ORCCertificate certificate, Competitor competitor) { + super(createdAt, logicalTimePoint, author, pId); + this.certificate = certificate; + this.competitorID = competitor.getId(); + } + + public BaseORCCertificateAssignmentEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, + AbstractLogEventAuthor author, Serializable pId, ORCCertificate certificate, Serializable competitorID) { + super(createdAt, logicalTimePoint, author, pId); + this.certificate = certificate; + this.competitorID = competitorID; + } + + @Override + public ORCCertificate getCertificate() { + return certificate; + } + + @Override + public Serializable getCompetitorID() { + return competitorID; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/RaceLogORCCertificateAssignmentEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/RaceLogORCCertificateAssignmentEventImpl.java new file mode 100755 index 00000000000..53588270764 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/orc/impl/RaceLogORCCertificateAssignmentEventImpl.java @@ -0,0 +1,45 @@ +package com.sap.sailing.domain.abstractlog.orc.impl; + +import java.io.Serializable; +import java.util.List; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventData; +import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; +import com.sap.sailing.domain.abstractlog.race.impl.RaceLogEventDataImpl; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.common.orc.ORCCertificate; +import com.sap.sse.common.TimePoint; + +public class RaceLogORCCertificateAssignmentEventImpl extends BaseORCCertificateAssignmentEventImpl implements RaceLogORCCertificateAssignmentEvent { + private static final long serialVersionUID = 3506411337361892600L; + private final RaceLogEventData raceLogEventData; + + public RaceLogORCCertificateAssignmentEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, + AbstractLogEventAuthor author, Serializable pId, int passId, ORCCertificate certificate, Competitor competitor) { + super(createdAt, logicalTimePoint, author, pId, certificate, competitor); + this.raceLogEventData = new RaceLogEventDataImpl(/* involvedBoats */ null, passId); + } + + public RaceLogORCCertificateAssignmentEventImpl(TimePoint createdAt, TimePoint logicalTimePoint, + AbstractLogEventAuthor author, Serializable pId, int passId, ORCCertificate certificate, Serializable competitorID) { + super(createdAt, logicalTimePoint, author, pId, certificate, competitorID); + this.raceLogEventData = new RaceLogEventDataImpl(/* involvedBoats */ null, passId); + } + + @Override + public void accept(RaceLogEventVisitor visitor) { + visitor.visit(this); + } + + @Override + public int getPassId() { + return raceLogEventData.getPassId(); + } + + @Override + public List getInvolvedCompetitors() { + return raceLogEventData.getInvolvedCompetitors(); + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java index 62a24542c5f..1912bbe5697 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventVisitor.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.abstractlog.race; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent; @@ -7,55 +8,56 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogRegisterCompetito import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEvent; import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogUseCompetitorsFromRaceLogEvent; - public interface RaceLogEventVisitor { - public void visit(RaceLogRevokeEvent event); + void visit(RaceLogRevokeEvent event); - public void visit(RaceLogFlagEvent event); + void visit(RaceLogFlagEvent event); - public void visit(RaceLogPassChangeEvent event); + void visit(RaceLogPassChangeEvent event); - public void visit(RaceLogRaceStatusEvent event); + void visit(RaceLogRaceStatusEvent event); - public void visit(RaceLogStartTimeEvent event); + void visit(RaceLogStartTimeEvent event); - public void visit(RaceLogCourseDesignChangedEvent event); + void visit(RaceLogCourseDesignChangedEvent event); - public void visit(RaceLogFinishPositioningListChangedEvent event); + void visit(RaceLogFinishPositioningListChangedEvent event); - public void visit(RaceLogFinishPositioningConfirmedEvent event); + void visit(RaceLogFinishPositioningConfirmedEvent event); - public void visit(RaceLogPathfinderEvent event); + void visit(RaceLogPathfinderEvent event); - public void visit(RaceLogGateLineOpeningTimeEvent event); + void visit(RaceLogGateLineOpeningTimeEvent event); - public void visit(RaceLogStartProcedureChangedEvent event); + void visit(RaceLogStartProcedureChangedEvent event); - public void visit(RaceLogProtestStartTimeEvent event); + void visit(RaceLogProtestStartTimeEvent event); - public void visit(RaceLogWindFixEvent event); + void visit(RaceLogWindFixEvent event); - public void visit(RaceLogDenoteForTrackingEvent event); + void visit(RaceLogDenoteForTrackingEvent event); - public void visit(RaceLogStartTrackingEvent event); + void visit(RaceLogStartTrackingEvent event); - public void visit(RaceLogRegisterCompetitorEvent event); + void visit(RaceLogRegisterCompetitorEvent event); - public void visit(RaceLogAdditionalScoringInformationEvent additionalScoringInformation); + void visit(RaceLogAdditionalScoringInformationEvent additionalScoringInformation); - public void visit(RaceLogFixedMarkPassingEvent event); + void visit(RaceLogFixedMarkPassingEvent event); - public void visit(RaceLogSuppressedMarkPassingsEvent event); + void visit(RaceLogSuppressedMarkPassingsEvent event); - public void visit(RaceLogDependentStartTimeEvent event); + void visit(RaceLogDependentStartTimeEvent event); - public void visit(RaceLogStartOfTrackingEvent event); + void visit(RaceLogStartOfTrackingEvent event); - public void visit(RaceLogEndOfTrackingEvent event); + void visit(RaceLogEndOfTrackingEvent event); - public void visit(RaceLogUseCompetitorsFromRaceLogEvent event); + void visit(RaceLogUseCompetitorsFromRaceLogEvent event); - public void visit(RaceLogTagEvent event); + void visit(RaceLogTagEvent event); - public void visit(RaceLogORCLegDataEvent event); + void visit(RaceLogORCLegDataEvent event); + + void visit(RaceLogORCCertificateAssignmentEvent event); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java index a06899d6d94..dde3cafb49a 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/AbstractRaceLogChangedVisitor.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.abstractlog.race.impl; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; @@ -150,4 +151,9 @@ public abstract class AbstractRaceLogChangedVisitor implements RaceLogEventVisit public void visit(RaceLogORCLegDataEvent event) { notifyListenerAboutEventAdded(event); } + + @Override + public void visit(RaceLogORCCertificateAssignmentEvent event) { + notifyListenerAboutEventAdded(event); + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java index 47aa747b21f..140b5eb1521 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/BaseRaceLogEventVisitor.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.abstractlog.race.impl; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; @@ -149,11 +150,16 @@ public abstract class BaseRaceLogEventVisitor implements RaceLogEventVisitor { @Override public void visit(RaceLogTagEvent event) { - //TODO maybe add overridding visit methods for subclasses of this class D067890 + } @Override public void visit(RaceLogORCLegDataEvent orcLegDataEventImpl) { } + + @Override + public void visit(RaceLogORCCertificateAssignmentEvent event) { + + } } \ No newline at end of file diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java index f32590c1290..7b6c2ea26b9 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java @@ -31,8 +31,6 @@ import com.sap.sailing.domain.common.orc.impl.ORCPerformanceCurveCourseImpl; import com.sap.sailing.domain.common.orc.impl.ORCPerformanceCurveLegImpl; import com.sap.sailing.domain.orc.impl.ORCCertificateImporterJSON; import com.sap.sailing.domain.orc.impl.ORCPerformanceCurveImpl; -import com.sap.sse.common.Bearing; -import com.sap.sse.common.Distance; import com.sap.sse.common.Duration; import com.sap.sse.common.impl.DegreeBearingImpl; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java index 9fc32098239..04d6ca9fcf4 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnRaceLogReplicator.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.base.impl; import java.io.Serializable; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; @@ -173,6 +174,10 @@ public class RaceColumnRaceLogReplicator implements RaceLogEventVisitor, Seriali @Override public void visit(RaceLogORCLegDataEvent event) { notifyOnAdd(event); - + } + + @Override + public void visit(RaceLogORCCertificateAssignmentEvent event) { + notifyOnAdd(event); } } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingRaceORCLegDataEvent.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingRaceORCLegDataEvent.java index e345f53dfc6..81b42d0c270 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingRaceORCLegDataEvent.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingRaceORCLegDataEvent.java @@ -22,10 +22,8 @@ import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.orc.impl.RaceLogORCLegDataEventImpl; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; -import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.common.impl.NauticalMileDistance; import com.sap.sailing.domain.common.orc.ORCPerformanceCurveLegTypes; import com.sap.sailing.domain.persistence.PersistenceFactory; diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/ORCCertificateJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/ORCCertificateJsonDeserializer.java new file mode 100755 index 00000000000..79bcb8cba1e --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/ORCCertificateJsonDeserializer.java @@ -0,0 +1,92 @@ +package com.sap.sailing.server.gateway.deserialization.racelog.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.common.impl.KnotSpeedImpl; +import com.sap.sailing.domain.common.impl.MeterDistance; +import com.sap.sailing.domain.common.orc.ORCCertificate; +import com.sap.sailing.domain.common.orc.impl.ORCCertificateImpl; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.ORCCertificateJsonSerializer; +import com.sap.sse.common.Bearing; +import com.sap.sse.common.Distance; +import com.sap.sse.common.Duration; +import com.sap.sse.common.Speed; +import com.sap.sse.common.impl.DegreeBearingImpl; +import com.sap.sse.common.impl.SecondsDurationImpl; + +public class ORCCertificateJsonDeserializer implements JsonDeserializer { + + @Override + public ORCCertificate deserialize(JSONObject json) throws JsonDeserializationException { + String sailnumber = (String) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_SAILNUMBER); + String boatclass = (String) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_BOATCLASS); + Distance length = new MeterDistance( + ((Number) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_LENGTH)).doubleValue()); + Duration gph = new SecondsDurationImpl( + ((Number) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_GPH)).doubleValue()); + final Number cdlAsNumber = (Number) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_CDL); + Double cdl = cdlAsNumber == null ? null : cdlAsNumber.doubleValue(); + Map> velocityPredictionsPerTrueWindSpeedAndAngle = new HashMap<>(); + Map beatAngles = new HashMap<>(); + Map beatVMGPredictionPerTrueWindSpeed = new HashMap<>(); + Map beatAllowancePerTrueWindSpeed = new HashMap<>(); + Map runAngles = new HashMap<>(); + Map runVMGPredictionPerTrueWindSpeed = new HashMap<>(); + Map runAllowancePerTrueWindSpeed = new HashMap<>(); + Map circularRandomSpeedPredictionPerTrueWindSpeed = new HashMap<>(); + Map nonSpinnakerSpeedPredictionPerTrueWindSpeed = new HashMap<>(); + for (Speed tws : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS) { + String twsKey = ORCCertificateJsonSerializer.speedToKnotsString(tws); + beatAngles.put(tws, new DegreeBearingImpl( + ((Number) ((JSONObject) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_BEAT_ANGLES)) + .get(twsKey)).doubleValue())); + beatVMGPredictionPerTrueWindSpeed.put(tws, + new KnotSpeedImpl(((Number) ((JSONObject) json + .get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_BEAT_VMG_PREDICTIONS)).get(twsKey)) + .doubleValue())); + beatAllowancePerTrueWindSpeed.put(tws, new SecondsDurationImpl( + ((Number) ((JSONObject) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_BEAT_ALLOWANCES)) + .get(twsKey)).doubleValue())); + runAngles.put(tws, new DegreeBearingImpl( + ((Number) ((JSONObject) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_RUN_ANGLES)) + .get(twsKey)).doubleValue())); + runVMGPredictionPerTrueWindSpeed.put(tws, + new KnotSpeedImpl(((Number) ((JSONObject) json + .get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_RUN_VMG_PREDICTIONS)).get(twsKey)) + .doubleValue())); + runAllowancePerTrueWindSpeed.put(tws, new SecondsDurationImpl( + ((Number) ((JSONObject) json.get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_RUN_ALLOWANCES)) + .get(twsKey)).doubleValue())); + circularRandomSpeedPredictionPerTrueWindSpeed.put(tws, + new KnotSpeedImpl(((Number) ((JSONObject) json + .get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_CIRCULAR_RANDOM_SPEED_PREDICTIONS)) + .get(twsKey)).doubleValue())); + nonSpinnakerSpeedPredictionPerTrueWindSpeed.put(tws, + new KnotSpeedImpl(((Number) ((JSONObject) json + .get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_NON_SPINNAKER_SPEED_PREDICTIONS)) + .get(twsKey)).doubleValue())); + + Map velocityPredictionAtCurrentTrueWindSpeedPerTrueWindAngle = new HashMap<>(); + for (Bearing twa : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES) { + String twaKey = ORCCertificateJsonSerializer.bearingToDegreeString(twa); + velocityPredictionAtCurrentTrueWindSpeedPerTrueWindAngle.put(twa, + new KnotSpeedImpl(((Number) ((JSONObject) ((JSONObject) json + .get(ORCCertificateJsonSerializer.ORC_CERTIFICATE_TWA_SPEED_PREDICTIONS)).get(twaKey)) + .get(twsKey)).doubleValue())); + } + velocityPredictionsPerTrueWindSpeedAndAngle.put(tws, + velocityPredictionAtCurrentTrueWindSpeedPerTrueWindAngle); + } + final ORCCertificate certificate = new ORCCertificateImpl(sailnumber, boatclass, length, gph, cdl, + velocityPredictionsPerTrueWindSpeedAndAngle, beatAngles, beatVMGPredictionPerTrueWindSpeed, + beatAllowancePerTrueWindSpeed, runAngles, runVMGPredictionPerTrueWindSpeed, + runAllowancePerTrueWindSpeed, circularRandomSpeedPredictionPerTrueWindSpeed, + nonSpinnakerSpeedPredictionPerTrueWindSpeed); + return certificate; + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDenoteForTrackingEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDenoteForTrackingEventDeserializer.java index 89f21e22a5c..c8afaa2b7a7 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDenoteForTrackingEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogDenoteForTrackingEventDeserializer.java @@ -32,7 +32,6 @@ public class RaceLogDenoteForTrackingEventDeserializer extends BaseRaceLogEventD BoatClass boatClass = domainFactory.getOrCreateBoatClass( (String) object.get(RaceLogDenoteForTrackingEventSerializer.FIELD_BOAT_CLASS)); Serializable raceId = (Serializable) object.get(RaceLogDenoteForTrackingEventSerializer.FIELD_RACE_ID); - return new RaceLogDenoteForTrackingEventImpl(createdAt, timePoint, author, id, passId, raceName, boatClass, raceId); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogORCCertificateAssignmentEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogORCCertificateAssignmentEventDeserializer.java new file mode 100755 index 00000000000..a81181795a1 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogORCCertificateAssignmentEventDeserializer.java @@ -0,0 +1,40 @@ +package com.sap.sailing.server.gateway.deserialization.racelog.impl; + +import java.io.Serializable; +import java.util.List; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; +import com.sap.sailing.domain.abstractlog.orc.impl.RaceLogORCCertificateAssignmentEventImpl; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.impl.DynamicCompetitor; +import com.sap.sailing.domain.common.orc.ORCCertificate; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.serialization.racelog.impl.RaceLogORCCertificateAssignmentEventSerializer; +import com.sap.sse.common.TimePoint; + +/** + * Deserializer for {@link com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent ORCLegDataEvent}. + * + * @author Daniel Lisunkin (I505543) + * @author Axel Uhl (d043530) + */ +public class RaceLogORCCertificateAssignmentEventDeserializer extends BaseRaceLogEventDeserializer { + + public RaceLogORCCertificateAssignmentEventDeserializer(JsonDeserializer competitorDeserializer) { + super(competitorDeserializer); + } + + @Override + protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, + AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) + throws JsonDeserializationException { + final ORCCertificate certificate = new ORCCertificateJsonDeserializer().deserialize((JSONObject) object.get(RaceLogORCCertificateAssignmentEventSerializer.ORC_CERTIFICATE)); + final Serializable competitorID = (Serializable) object.get(RaceLogORCCertificateAssignmentEventSerializer.ORC_COMPETITOR_ID); + return new RaceLogORCCertificateAssignmentEventImpl(createdAt, timePoint, author, id, passId, certificate, competitorID); + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/ORCCertificateJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/ORCCertificateJsonSerializer.java new file mode 100755 index 00000000000..d9e58e61418 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/ORCCertificateJsonSerializer.java @@ -0,0 +1,136 @@ +package com.sap.sailing.server.gateway.serialization.racelog.impl; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.common.orc.ORCCertificate; +import com.sap.sailing.domain.common.orc.impl.ORCCertificateImpl; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.Bearing; +import com.sap.sse.common.Speed; + +public class ORCCertificateJsonSerializer implements JsonSerializer { + public static final String ORC_CERTIFICATE_BEAT_ANGLES = "beatAngles"; + public static final String ORC_CERTIFICATE_RUN_ANGLES = "runAngles"; + public static final String ORC_CERTIFICATE_BEAT_ALLOWANCES = "beatAllowances"; + public static final String ORC_CERTIFICATE_RUN_ALLOWANCES = "runAllowances"; + public static final String ORC_CERTIFICATE_BEAT_VMG_PREDICTIONS = "beatVmgPredictions"; + public static final String ORC_CERTIFICATE_RUN_VMG_PREDICTIONS = "runVmgPredictions"; + public static final String ORC_CERTIFICATE_CIRCULAR_RANDOM_SPEED_PREDICTIONS = "circularRandomSpeedPredictions"; + public static final String ORC_CERTIFICATE_NON_SPINNAKER_SPEED_PREDICTIONS = "nonSpinnakerSpeedPredictions"; + public static final String ORC_CERTIFICATE_TWA_SPEED_PREDICTIONS = "twaSpeedPredictions"; + public static final String ORC_CERTIFICATE_SAILNUMBER = "sailNumber"; + public static final String ORC_CERTIFICATE_BOATCLASS = "boatClass"; + public static final String ORC_CERTIFICATE_GPH = "gph"; + public static final String ORC_CERTIFICATE_CDL = "cdl"; + public static final String ORC_CERTIFICATE_LENGTH = "length"; + public static final String ORC_CERTIFICATE_TWS_6KT = "ORC_CERTIFICATE_TWS_6KT"; + public static final String ORC_CERTIFICATE_TWS_8KT = "ORC_CERTIFICATE_TWS_8KT"; + public static final String ORC_CERTIFICATE_TWS_10KT = "ORC_CERTIFICATE_TWS_10KT"; + public static final String ORC_CERTIFICATE_TWS_12KT = "ORC_CERTIFICATE_TWS_12KT"; + public static final String ORC_CERTIFICATE_TWS_14KT = "ORC_CERTIFICATE_TWS_14KT"; + public static final String ORC_CERTIFICATE_TWS_16KT = "ORC_CERTIFICATE_TWS_16KT"; + public static final String ORC_CERTIFICATE_TWS_20KT = "ORC_CERTIFICATE_TWS_20KT"; + public static final String ORC_CERTIFICATE_R52_PREDICTION = "ORC_CERTIFICATE_R52_PREDICTION"; + public static final String ORC_CERTIFICATE_R60_PREDICTION = "ORC_CERTIFICATE_R60_PREDICTION"; + public static final String ORC_CERTIFICATE_R75_PREDICTION = "ORC_CERTIFICATE_R75_PREDICTION"; + public static final String ORC_CERTIFICATE_R90_PREDICTION = "ORC_CERTIFICATE_R90_PREDICTION"; + public static final String ORC_CERTIFICATE_R110_PREDICTION = "ORC_CERTIFICATE_R110_PREDICTION"; + public static final String ORC_CERTIFICATE_R120_PREDICTION = "ORC_CERTIFICATE_R120_PREDICTION"; + public static final String ORC_CERTIFICATE_R135_PREDICTION = "ORC_CERTIFICATE_R135_PREDICTION"; + public static final String ORC_CERTIFICATE_R150_PREDICTION = "ORC_CERTIFICATE_R150_PREDICTION"; + + @Override + public JSONObject serialize(ORCCertificate certificate) { + JSONObject result = new JSONObject(); + result.put(ORC_CERTIFICATE_SAILNUMBER, certificate.getSailnumber()); + result.put(ORC_CERTIFICATE_BOATCLASS, certificate.getBoatclass()); + result.put(ORC_CERTIFICATE_GPH, certificate.getGPH()); + result.put(ORC_CERTIFICATE_CDL, certificate.getCDL()); + result.put(ORC_CERTIFICATE_LENGTH, certificate.getLengthOverAll().getMeters()); + + JSONObject beatAngles = new JSONObject(); + JSONObject runAngles = new JSONObject(); + JSONObject beatAllowances = new JSONObject(); + JSONObject runAllowances = new JSONObject(); + JSONObject beatVMGPredictions = new JSONObject(); + JSONObject runVMGPredictions = new JSONObject(); + JSONObject windwardLeewardPredictions = new JSONObject(); + JSONObject circularRandomPredictions = new JSONObject(); + JSONObject longDistancePredictions = new JSONObject(); + JSONObject nonSpinnakerPredictions = new JSONObject(); + JSONObject velocityPredictionsPerTrueWindSpeedAndAngle = new JSONObject(); + for (Speed tws : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS) { + String keyTWS = speedToKnotsString(tws); + JSONObject velocityPredictionsPerTrueWindAngle = new JSONObject(); + beatAngles.put(keyTWS, certificate.getBeatAngles().get(tws).getDegrees()); + runAngles.put(keyTWS, certificate.getRunAngles().get(tws).getDegrees()); + beatAllowances.put(keyTWS, certificate.getBeatAllowances().get(tws).asSeconds()); + runAllowances.put(keyTWS, certificate.getRunAllowances().get(tws).asSeconds()); + beatVMGPredictions.put(keyTWS, certificate.getBeatVMGPredictions().get(tws).getKnots()); + runVMGPredictions.put(keyTWS, certificate.getRunVMGPredictions().get(tws).getKnots()); + windwardLeewardPredictions.put(keyTWS, certificate.getWindwardLeewardSpeedPrediction().get(tws).getKnots()); + circularRandomPredictions.put(keyTWS, certificate.getCircularRandomSpeedPredictions().get(tws).getKnots()); + longDistancePredictions.put(keyTWS, certificate.getLongDistanceSpeedPredictions().get(tws).getKnots()); + nonSpinnakerPredictions.put(keyTWS, certificate.getNonSpinnakerSpeedPredictions().get(tws).getKnots()); + for (Bearing twa : ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES) { + String keyTWA = bearingToDegreeString(twa); + velocityPredictionsPerTrueWindAngle.put(keyTWA, certificate.getVelocityPredictionPerTrueWindSpeedAndAngle().get(tws).get(twa).getKnots()); + } + velocityPredictionsPerTrueWindSpeedAndAngle.put(keyTWS, velocityPredictionsPerTrueWindAngle); + } + + result.put(ORC_CERTIFICATE_BEAT_ANGLES, beatAngles); + result.put(ORC_CERTIFICATE_RUN_ANGLES, runAngles); + result.put(ORC_CERTIFICATE_BEAT_ALLOWANCES, beatAllowances); + result.put(ORC_CERTIFICATE_RUN_ALLOWANCES, runAllowances); + result.put(ORC_CERTIFICATE_BEAT_VMG_PREDICTIONS, beatVMGPredictions); + result.put(ORC_CERTIFICATE_RUN_VMG_PREDICTIONS, runVMGPredictions); + result.put(ORC_CERTIFICATE_CIRCULAR_RANDOM_SPEED_PREDICTIONS, circularRandomPredictions); + result.put(ORC_CERTIFICATE_NON_SPINNAKER_SPEED_PREDICTIONS, nonSpinnakerPredictions); + result.put(ORC_CERTIFICATE_TWA_SPEED_PREDICTIONS, velocityPredictionsPerTrueWindSpeedAndAngle); + return result; + } + + public static String speedToKnotsString(Speed speed) { + String result = null; + if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[0])) { + result = ORC_CERTIFICATE_TWS_6KT; + } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[1])) { + result = ORC_CERTIFICATE_TWS_8KT; + } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[2])) { + result = ORC_CERTIFICATE_TWS_10KT; + } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[3])) { + result = ORC_CERTIFICATE_TWS_12KT; + } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[4])) { + result = ORC_CERTIFICATE_TWS_14KT; + } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[5])) { + result = ORC_CERTIFICATE_TWS_16KT; + } else if (speed.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_SPEEDS[6])) { + result = ORC_CERTIFICATE_TWS_20KT; + } + return result; + } + + public static String bearingToDegreeString(Bearing bearing) { + String result = null; + if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[0])) { + result = ORC_CERTIFICATE_R52_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[1])) { + result = ORC_CERTIFICATE_R60_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[2])) { + result = ORC_CERTIFICATE_R75_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[3])) { + result = ORC_CERTIFICATE_R90_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[4])) { + result = ORC_CERTIFICATE_R110_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[5])) { + result = ORC_CERTIFICATE_R120_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[6])) { + result = ORC_CERTIFICATE_R135_PREDICTION; + } else if (bearing.equals(ORCCertificateImpl.ALLOWANCES_TRUE_WIND_ANGLES[7])) { + result = ORC_CERTIFICATE_R150_PREDICTION; + } + return result; + } + +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java index cd2441981de..b9ce7846236 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogEventSerializer.java @@ -2,6 +2,7 @@ package com.sap.sailing.server.gateway.serialization.racelog.impl; import org.json.simple.JSONObject; +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; import com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent; @@ -84,7 +85,8 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac new RaceLogUseCompetitorsFromRaceLogEventSerializer(competitorSerializer), new RaceLogEndOfTrackingEventSerializer(competitorSerializer), new RaceLogTagEventSerializer(competitorSerializer), - new RaceLogORCLegDataEventSerializer(competitorSerializer)); + new RaceLogORCLegDataEventSerializer(competitorSerializer), + new RaceLogORCCertificateAssignmentEventSerializer(competitorSerializer)); } private final JsonSerializer flagEventSerializer; @@ -112,6 +114,7 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac private final JsonSerializer endOfTrackingEventSerializer; private final JsonSerializer tagSerializer; private final JsonSerializer orcLegDataEventSerializer; + private final JsonSerializer orcCertificateAssignmentEventSerializer; private JsonSerializer chosenSerializer; @@ -141,8 +144,8 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac JsonSerializer useCompetitorsFromRaceLogEventSerializer, JsonSerializer endOfTrackingEventSerializer, JsonSerializer tagSerializer, - JsonSerializer orcLegDataEventSerializer) { - + JsonSerializer orcLegDataEventSerializer, + JsonSerializer orcCertificateAssignmentEventSerializer) { this.flagEventSerializer = flagEventSerializer; this.startTimeSerializer = startTimeSerializer; this.raceStatusSerializer = raceStatusSerializer; @@ -168,7 +171,7 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac this.useCompetitorsFromRaceLogEventSerializer = useCompetitorsFromRaceLogEventSerializer; this.tagSerializer = tagSerializer; this.orcLegDataEventSerializer = orcLegDataEventSerializer; - + this.orcCertificateAssignmentEventSerializer = orcCertificateAssignmentEventSerializer; this.chosenSerializer = null; } @@ -310,4 +313,9 @@ public class RaceLogEventSerializer implements JsonSerializer, Rac public void visit(RaceLogORCLegDataEvent event) { chosenSerializer = orcLegDataEventSerializer; } + + @Override + public void visit(RaceLogORCCertificateAssignmentEvent event) { + chosenSerializer = orcCertificateAssignmentEventSerializer; + } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogORCCertificateAssignmentEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogORCCertificateAssignmentEventSerializer.java new file mode 100755 index 00000000000..d22ec10024f --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogORCCertificateAssignmentEventSerializer.java @@ -0,0 +1,39 @@ +package com.sap.sailing.server.gateway.serialization.racelog.impl; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.orc.RaceLogORCCertificateAssignmentEvent; +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +/** + * Serializer for {@link com.sap.sailing.domain.abstractlog.orc.RaceLogORCLegDataEvent ORCLegDataEvent}. + * + * @author Daniel Lisunkin (i505543) + * @author Axel Uhl (d043530) + */ +public class RaceLogORCCertificateAssignmentEventSerializer extends BaseRaceLogEventSerializer { + + public static final String VALUE_CLASS = RaceLogORCCertificateAssignmentEvent.class.getSimpleName(); + public static final String ORC_CERTIFICATE = "certificate"; + public static final String ORC_COMPETITOR_ID = "competitorId"; + + public RaceLogORCCertificateAssignmentEventSerializer(JsonSerializer competitorSerializer) { + super(competitorSerializer); + } + + @Override + public JSONObject serialize(RaceLogEvent object) { + RaceLogORCCertificateAssignmentEvent certificateAssignmentEvent = (RaceLogORCCertificateAssignmentEvent) object; + JSONObject result = super.serialize(certificateAssignmentEvent); + result.put(ORC_CERTIFICATE, new ORCCertificateJsonSerializer().serialize(certificateAssignmentEvent.getCertificate())); + result.put(ORC_COMPETITOR_ID, certificateAssignmentEvent.getCompetitorID()); + return result; + } + + @Override + protected String getClassFieldValue() { + return VALUE_CLASS; + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index a18dc727921..2715ed03d51 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -72,7 +72,8 @@ public class RaceLogEventSerializerTest { private JsonSerializer endOfTrackingEventSerializer; private JsonSerializer tagEventSerializer; private JsonSerializer orcLegDataEventSerializer; - + private JsonSerializer orcCertificateAssignmentEventSerializer; + private AbstractLogEventAuthor author = new LogEventAuthorImpl("Test Author", 1); @@ -104,7 +105,7 @@ public class RaceLogEventSerializerTest { endOfTrackingEventSerializer = mock(JsonSerializer.class); tagEventSerializer = mock(JsonSerializer.class); orcLegDataEventSerializer = mock(JsonSerializer.class); - + orcCertificateAssignmentEventSerializer = mock(JsonSerializer.class); serializer = new RaceLogEventSerializer(flagEventSerializer, startTimeSerializer, raceStatusSerializer, passChangedSerializer, courseDesignChangedEventSerializer, finishPositioningListChangedEventSerializer, finishPositioningConfirmedEventSerializer, @@ -115,7 +116,8 @@ public class RaceLogEventSerializerTest { fixedMarkPassingEventSerializer, suppressedMarkPassingsSerializer, additionalScoringInformationSerializer, dependentStartTimeEventSerializer, startOfTrackingEventSerializer, useCompetitorsFromRaceLogEventSerializer, - endOfTrackingEventSerializer, tagEventSerializer, orcLegDataEventSerializer); + endOfTrackingEventSerializer, tagEventSerializer, orcLegDataEventSerializer, + orcCertificateAssignmentEventSerializer); } @Test