mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-13 14:12:11 +00:00
Refactored estimation data serializers + added mark passings count
This commit is contained in:
1 parent
24f922bde2
commit
122dfb293c
7 files changed
+297
-210
No files matched your search
+20
@@ -0,0 +1,20 @@
|
||||
package com.sap.sailing.domain.maneuverdetection;
|
||||
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sse.common.Bearing;
|
||||
import com.sap.sse.common.Distance;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
*
|
||||
*/
|
||||
public interface GpsFixWithEstimationData extends GPSFixMoving {
|
||||
|
||||
Wind getWind();
|
||||
|
||||
Bearing getRelativeBearingToNextMarkAfterManeuver();
|
||||
|
||||
Distance getDistanceToClosestMark();
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.sap.sailing.domain.maneuverdetection.impl;
|
||||
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.tracking.impl.GPSFixMovingImpl;
|
||||
import com.sap.sailing.domain.maneuverdetection.GpsFixWithEstimationData;
|
||||
import com.sap.sse.common.Bearing;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
*
|
||||
*/
|
||||
public class GpsFixWithEstimationDataImpl extends GPSFixMovingImpl implements GpsFixWithEstimationData {
|
||||
|
||||
private static final long serialVersionUID = -6952863819352430365L;
|
||||
|
||||
private Wind wind;
|
||||
private Bearing relativeBearingToNextMarkAfterManeuver;
|
||||
private Distance distanceToClosestMark;
|
||||
|
||||
public GpsFixWithEstimationDataImpl(Position position, TimePoint timePoint, SpeedWithBearing speedWithBearing,
|
||||
Wind wind, Bearing relativeBearingToNextMarkAfterManeuver, Distance distanceToClosestMark) {
|
||||
super(position, timePoint, speedWithBearing);
|
||||
this.wind = wind;
|
||||
this.relativeBearingToNextMarkAfterManeuver = relativeBearingToNextMarkAfterManeuver;
|
||||
this.distanceToClosestMark = distanceToClosestMark;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Wind getWind() {
|
||||
return wind;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bearing getRelativeBearingToNextMarkAfterManeuver() {
|
||||
return relativeBearingToNextMarkAfterManeuver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Distance getDistanceToClosestMark() {
|
||||
return distanceToClosestMark;
|
||||
}
|
||||
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.maneuverdetection.impl.TrackTimeInfo;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
* @see CompetitorTrackWithEstimationDataJsonSerializer
|
||||
*/
|
||||
public interface CompetitorTrackElementsJsonSerializer {
|
||||
|
||||
JSONArray serialize(TrackedRace trackedRace, Competitor competitor, TimePoint from, TimePoint to,
|
||||
TrackTimeInfo trackTimeInfo);
|
||||
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import java.util.NavigableSet;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.maneuverdetection.impl.ManeuverDetectorImpl;
|
||||
import com.sap.sailing.domain.maneuverdetection.impl.TrackTimeInfo;
|
||||
import com.sap.sailing.domain.polars.PolarDataService;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
*
|
||||
*/
|
||||
public class CompetitorTrackWithEstimationDataJsonSerializer extends AbstractTrackedRaceDataJsonSerializer {
|
||||
public static final String elements = "elements";
|
||||
public static final String BOAT_CLASS = "boatClass";
|
||||
public static final String COMPETITOR_NAME = "competitorName";
|
||||
public static final String AVG_INTERVAL_BETWEEN_FIXES_IN_SECONDS = "avgIntervalBetweenFixesInSeconds";
|
||||
public static final String DISTANCE_TRAVELLED_IN_METERS = "distanceTravelledInMeters";
|
||||
public static final String START_TIME_POINT = "startUnixTime";
|
||||
public static final String END_TIME_POINT = "endUnixTime";
|
||||
public static final String FIXES_COUNT_FOR_POLARS = "fixesCountForPolars";
|
||||
public static final String MARK_PASSINGS_COUNT = "markPassingsCount";
|
||||
|
||||
private final BoatClassJsonSerializer boatClassJsonSerializer;
|
||||
private final CompetitorTrackElementsJsonSerializer elementsJsonSerializer;
|
||||
private final PolarDataService polarDataService;
|
||||
private final Integer startBeforeStartLineInSeconds;
|
||||
private final Integer endBeforeStartLineInSeconds;
|
||||
private final Integer startAfterFinishLineInSeconds;
|
||||
private final Integer endAfterFinishLineInSeconds;
|
||||
|
||||
public CompetitorTrackWithEstimationDataJsonSerializer(PolarDataService polarDataService,
|
||||
BoatClassJsonSerializer boatClassJsonSerializer,
|
||||
CompetitorTrackElementsJsonSerializer elementsJsonSerializer, Integer startBeforeStartLineInSeconds,
|
||||
Integer endBeforeStartLineInSeconds, Integer startAfterFinishLineInSeconds,
|
||||
Integer endAfterFinishLineInSeconds) {
|
||||
this.polarDataService = polarDataService;
|
||||
this.boatClassJsonSerializer = boatClassJsonSerializer;
|
||||
this.elementsJsonSerializer = elementsJsonSerializer;
|
||||
this.startBeforeStartLineInSeconds = startBeforeStartLineInSeconds;
|
||||
this.endBeforeStartLineInSeconds = endBeforeStartLineInSeconds;
|
||||
this.startAfterFinishLineInSeconds = startAfterFinishLineInSeconds;
|
||||
this.endAfterFinishLineInSeconds = endAfterFinishLineInSeconds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(TrackedRace trackedRace) {
|
||||
final JSONObject result = new JSONObject();
|
||||
JSONArray byCompetitorJson = new JSONArray();
|
||||
result.put(BYCOMPETITOR, byCompetitorJson);
|
||||
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
|
||||
ManeuverDetectorImpl maneuverDetector = new ManeuverDetectorImpl(trackedRace, competitor);
|
||||
TrackTimeInfo trackTimeInfo = maneuverDetector.getTrackTimeInfo();
|
||||
TimePoint from = null;
|
||||
TimePoint to = null;
|
||||
if (startBeforeStartLineInSeconds != null) {
|
||||
from = trackTimeInfo.getTrackStartTimePoint()
|
||||
.minus(new MillisecondsDurationImpl(startBeforeStartLineInSeconds * 1000L));
|
||||
} else if (startAfterFinishLineInSeconds != null) {
|
||||
from = trackTimeInfo.getTrackEndTimePoint()
|
||||
.plus(new MillisecondsDurationImpl(startAfterFinishLineInSeconds * 1000L));
|
||||
} else {
|
||||
from = trackTimeInfo.getTrackStartTimePoint();
|
||||
}
|
||||
if (endAfterFinishLineInSeconds != null) {
|
||||
to = trackTimeInfo.getTrackEndTimePoint()
|
||||
.plus(new MillisecondsDurationImpl(endAfterFinishLineInSeconds * 1000L));
|
||||
} else if (endBeforeStartLineInSeconds != null) {
|
||||
to = trackTimeInfo.getTrackStartTimePoint()
|
||||
.minus(new MillisecondsDurationImpl(endBeforeStartLineInSeconds * 1000L));
|
||||
} else {
|
||||
to = trackTimeInfo.getTrackEndTimePoint();
|
||||
}
|
||||
if (trackTimeInfo != null) {
|
||||
final JSONObject forCompetitorJson = new JSONObject();
|
||||
byCompetitorJson.add(forCompetitorJson);
|
||||
forCompetitorJson.put(COMPETITOR_NAME, competitor.getName());
|
||||
forCompetitorJson.put(BOAT_CLASS, boatClassJsonSerializer
|
||||
.serialize(trackedRace.getRace().getBoatOfCompetitor(competitor).getBoatClass()));
|
||||
forCompetitorJson.put(FIXES_COUNT_FOR_POLARS, getFixesCountForPolars(trackedRace, competitor));
|
||||
Duration averageIntervalBetweenFixes = trackedRace.getTrack(competitor)
|
||||
.getAverageIntervalBetweenFixes();
|
||||
forCompetitorJson.put(AVG_INTERVAL_BETWEEN_FIXES_IN_SECONDS,
|
||||
averageIntervalBetweenFixes == null ? 0 : averageIntervalBetweenFixes.asSeconds());
|
||||
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
Double distanceTravelledInMeters = null;
|
||||
if (trackTimeInfo.getTrackStartTimePoint() != null && trackTimeInfo.getTrackEndTimePoint() != null) {
|
||||
distanceTravelledInMeters = track.getDistanceTraveled(trackTimeInfo.getTrackStartTimePoint(),
|
||||
trackTimeInfo.getTrackEndTimePoint()).getMeters();
|
||||
}
|
||||
forCompetitorJson.put(DISTANCE_TRAVELLED_IN_METERS, distanceTravelledInMeters);
|
||||
forCompetitorJson.put(START_TIME_POINT, trackTimeInfo.getTrackStartTimePoint() == null ? null
|
||||
: trackTimeInfo.getTrackStartTimePoint().asMillis());
|
||||
forCompetitorJson.put(END_TIME_POINT, trackTimeInfo.getTrackEndTimePoint() == null ? null
|
||||
: trackTimeInfo.getTrackEndTimePoint().asMillis());
|
||||
int markPassingsCount = getMarkPassingsCount(trackedRace, competitor);
|
||||
forCompetitorJson.put(MARK_PASSINGS_COUNT, markPassingsCount);
|
||||
forCompetitorJson.put(elements,
|
||||
elementsJsonSerializer.serialize(trackedRace, competitor, from, to, trackTimeInfo));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private int getMarkPassingsCount(TrackedRace trackedRace, Competitor competitor) {
|
||||
int markPassingsCount = 0;
|
||||
NavigableSet<MarkPassing> markPassings = trackedRace.getMarkPassings(competitor, false);
|
||||
trackedRace.lockForRead(markPassings);
|
||||
try {
|
||||
markPassingsCount = Util.size(markPassings);
|
||||
} finally {
|
||||
trackedRace.unlockAfterRead(markPassings);
|
||||
}
|
||||
return markPassingsCount;
|
||||
}
|
||||
|
||||
private long getFixesCountForPolars(TrackedRace trackedRace, Competitor competitor) {
|
||||
BoatClass boatClass = trackedRace.getRace().getBoatOfCompetitor(competitor).getBoatClass();
|
||||
Long fixesCountForBoatPolars = polarDataService.getFixCountPerBoatClass().get(boatClass);
|
||||
return fixesCountForBoatPolars == null ? 0L : fixesCountForBoatPolars;
|
||||
}
|
||||
|
||||
}
|
||||
+13
-101
@@ -4,11 +4,8 @@ import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.maneuverdetection.CompleteManeuverCurveWithEstimationData;
|
||||
import com.sap.sailing.domain.maneuverdetection.ManeuverDetectorWithEstimationDataSupport;
|
||||
import com.sap.sailing.domain.maneuverdetection.impl.ManeuverDetectorImpl;
|
||||
@@ -17,116 +14,37 @@ import com.sap.sailing.domain.maneuverdetection.impl.ManeuverSpot;
|
||||
import com.sap.sailing.domain.maneuverdetection.impl.TrackTimeInfo;
|
||||
import com.sap.sailing.domain.polars.PolarDataService;
|
||||
import com.sap.sailing.domain.tracking.CompleteManeuverCurve;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.Maneuver;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
*
|
||||
*/
|
||||
public class CompleteManeuverCurvesWithEstimationDataJsonSerializer extends AbstractTrackedRaceDataJsonSerializer {
|
||||
public static final String MANEUVER_CURVES = "maneuverCurves";
|
||||
public static final String BOAT_CLASS = "boatClass";
|
||||
public static final String COMPETITOR_NAME = "competitorName";
|
||||
public static final String AVG_INTERVAL_BETWEEN_FIXES_IN_SECONDS = "avgIntervalBetweenFixesInSeconds";
|
||||
public static final String DISTANCE_TRAVELLED_IN_METERS = "distanceTravelledInMeters";
|
||||
public static final String START_TIME_POINT = "startUnixTime";
|
||||
public static final String END_TIME_POINT = "endUnixTime";
|
||||
public static final String FIXES_COUNT_FOR_POLARS = "fixesCountForPolars";
|
||||
|
||||
private final BoatClassJsonSerializer boatClassJsonSerializer;
|
||||
private final CompleteManeuverCurveWithEstimationDataJsonSerializer maneuverWithEstimationDataJsonSerializer;
|
||||
public class CompleteManeuverCurvesWithEstimationDataJsonSerializer implements CompetitorTrackElementsJsonSerializer {
|
||||
private final PolarDataService polarDataService;
|
||||
private final Integer startBeforeStartLineInSeconds;
|
||||
private final Integer endBeforeStartLineInSeconds;
|
||||
private final Integer startAfterFinishLineInSeconds;
|
||||
private final Integer endAfterFinishLineInSeconds;
|
||||
private final CompleteManeuverCurveWithEstimationDataJsonSerializer maneuverWithEstimationDataJsonSerializer;
|
||||
|
||||
public CompleteManeuverCurvesWithEstimationDataJsonSerializer(PolarDataService polarDataService,
|
||||
BoatClassJsonSerializer boatClassJsonSerializer,
|
||||
CompleteManeuverCurveWithEstimationDataJsonSerializer maneuverWithEstimationDataJsonSerializer,
|
||||
Integer startBeforeStartLineInSeconds, Integer endBeforeStartLineInSeconds,
|
||||
Integer startAfterFinishLineInSeconds, Integer endAfterFinishLineInSeconds) {
|
||||
CompleteManeuverCurveWithEstimationDataJsonSerializer maneuverWithEstimationDataJsonSerializer) {
|
||||
this.polarDataService = polarDataService;
|
||||
this.boatClassJsonSerializer = boatClassJsonSerializer;
|
||||
this.maneuverWithEstimationDataJsonSerializer = maneuverWithEstimationDataJsonSerializer;
|
||||
this.startBeforeStartLineInSeconds = startBeforeStartLineInSeconds;
|
||||
this.endBeforeStartLineInSeconds = endBeforeStartLineInSeconds;
|
||||
this.startAfterFinishLineInSeconds = startAfterFinishLineInSeconds;
|
||||
this.endAfterFinishLineInSeconds = endAfterFinishLineInSeconds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(TrackedRace trackedRace) {
|
||||
final JSONObject result = new JSONObject();
|
||||
JSONArray byCompetitorJson = new JSONArray();
|
||||
result.put(BYCOMPETITOR, byCompetitorJson);
|
||||
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
|
||||
ManeuverDetectorImpl maneuverDetector = new ManeuverDetectorImpl(trackedRace, competitor);
|
||||
TrackTimeInfo trackTimeInfo = maneuverDetector.getTrackTimeInfo();
|
||||
TimePoint from = null;
|
||||
TimePoint to = null;
|
||||
if (startBeforeStartLineInSeconds != Integer.MIN_VALUE) {
|
||||
from = trackTimeInfo.getTrackStartTimePoint()
|
||||
.minus(new MillisecondsDurationImpl(startBeforeStartLineInSeconds * 1000L));
|
||||
} else if (startAfterFinishLineInSeconds != Integer.MIN_VALUE) {
|
||||
from = trackTimeInfo.getTrackEndTimePoint()
|
||||
.plus(new MillisecondsDurationImpl(startAfterFinishLineInSeconds * 1000L));
|
||||
}
|
||||
if (endAfterFinishLineInSeconds != Integer.MIN_VALUE) {
|
||||
to = trackTimeInfo.getTrackEndTimePoint()
|
||||
.plus(new MillisecondsDurationImpl(endAfterFinishLineInSeconds * 1000L));
|
||||
} else if (endBeforeStartLineInSeconds != Integer.MIN_VALUE) {
|
||||
to = trackTimeInfo.getTrackStartTimePoint()
|
||||
.minus(new MillisecondsDurationImpl(endBeforeStartLineInSeconds * 1000L));
|
||||
}
|
||||
if (trackTimeInfo != null) {
|
||||
if (from != null ^ to != null) {
|
||||
if (from == null) {
|
||||
from = trackTimeInfo.getTrackStartTimePoint();
|
||||
}
|
||||
if (to == null) {
|
||||
to = trackTimeInfo.getTrackEndTimePoint();
|
||||
}
|
||||
}
|
||||
final JSONObject forCompetitorJson = new JSONObject();
|
||||
byCompetitorJson.add(forCompetitorJson);
|
||||
forCompetitorJson.put(COMPETITOR_NAME, competitor.getName());
|
||||
forCompetitorJson.put(BOAT_CLASS, boatClassJsonSerializer
|
||||
.serialize(trackedRace.getRace().getBoatOfCompetitor(competitor).getBoatClass()));
|
||||
final JSONArray completeManeuverCurvesWithEstimationData = new JSONArray();
|
||||
Iterable<CompleteManeuverCurveWithEstimationData> completeManeuvers = from != null
|
||||
? getCompleteManeuverCurvesWithEstimationData(trackedRace, competitor, from, to)
|
||||
: getCompleteManeuverCurvesWithEstimationData(trackedRace, competitor);
|
||||
for (CompleteManeuverCurveWithEstimationData maneuver : completeManeuvers) {
|
||||
completeManeuverCurvesWithEstimationData
|
||||
.add(maneuverWithEstimationDataJsonSerializer.serialize(maneuver));
|
||||
}
|
||||
forCompetitorJson.put(FIXES_COUNT_FOR_POLARS, getFixesCountForPolars(trackedRace, competitor));
|
||||
forCompetitorJson.put(MANEUVER_CURVES, completeManeuverCurvesWithEstimationData);
|
||||
Duration averageIntervalBetweenFixes = trackedRace.getTrack(competitor)
|
||||
.getAverageIntervalBetweenFixes();
|
||||
forCompetitorJson.put(AVG_INTERVAL_BETWEEN_FIXES_IN_SECONDS,
|
||||
averageIntervalBetweenFixes == null ? 0 : averageIntervalBetweenFixes.asSeconds());
|
||||
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
Double distanceTravelledInMeters = null;
|
||||
if (trackTimeInfo.getTrackStartTimePoint() != null && trackTimeInfo.getTrackEndTimePoint() != null) {
|
||||
distanceTravelledInMeters = track.getDistanceTraveled(trackTimeInfo.getTrackStartTimePoint(),
|
||||
trackTimeInfo.getTrackEndTimePoint()).getMeters();
|
||||
}
|
||||
forCompetitorJson.put(DISTANCE_TRAVELLED_IN_METERS, distanceTravelledInMeters);
|
||||
forCompetitorJson.put(START_TIME_POINT, trackTimeInfo.getTrackStartTimePoint() == null ? null
|
||||
: trackTimeInfo.getTrackStartTimePoint().asMillis());
|
||||
forCompetitorJson.put(END_TIME_POINT, trackTimeInfo.getTrackEndTimePoint() == null ? null
|
||||
: trackTimeInfo.getTrackEndTimePoint().asMillis());
|
||||
}
|
||||
public JSONArray serialize(TrackedRace trackedRace, Competitor competitor, TimePoint from, TimePoint to,
|
||||
TrackTimeInfo trackTimeInfo) {
|
||||
final JSONArray completeManeuverCurvesWithEstimationData = new JSONArray();
|
||||
Iterable<CompleteManeuverCurveWithEstimationData> completeManeuvers = trackTimeInfo.getTrackStartTimePoint()
|
||||
.equals(from) && trackTimeInfo.getTrackEndTimePoint().equals(to)
|
||||
? getCompleteManeuverCurvesWithEstimationData(trackedRace, competitor)
|
||||
: getCompleteManeuverCurvesWithEstimationData(trackedRace, competitor, from, to);
|
||||
for (CompleteManeuverCurveWithEstimationData maneuver : completeManeuvers) {
|
||||
completeManeuverCurvesWithEstimationData.add(maneuverWithEstimationDataJsonSerializer.serialize(maneuver));
|
||||
}
|
||||
return result;
|
||||
return completeManeuverCurvesWithEstimationData;
|
||||
}
|
||||
|
||||
private Iterable<CompleteManeuverCurveWithEstimationData> getCompleteManeuverCurvesWithEstimationData(
|
||||
@@ -155,10 +73,4 @@ public class CompleteManeuverCurvesWithEstimationDataJsonSerializer extends Abst
|
||||
return maneuversWithEstimationData;
|
||||
}
|
||||
|
||||
private long getFixesCountForPolars(TrackedRace trackedRace, Competitor competitor) {
|
||||
BoatClass boatClass = trackedRace.getRace().getBoatOfCompetitor(competitor).getBoatClass();
|
||||
Long fixesCountForBoatPolars = polarDataService.getFixCountPerBoatClass().get(boatClass);
|
||||
return fixesCountForBoatPolars == null ? 0L : fixesCountForBoatPolars;
|
||||
}
|
||||
|
||||
}
|
||||
+35
-96
@@ -14,16 +14,14 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.Bearing;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
*
|
||||
*/
|
||||
public class GpsFixesWithEstimationDataJsonSerializer extends AbstractTrackedRaceDataJsonSerializer {
|
||||
public class GpsFixesWithEstimationDataJsonSerializer implements CompetitorTrackElementsJsonSerializer {
|
||||
public static final String GPS_FIXES = "gpsFixes";
|
||||
public static final String BOAT_CLASS = "boatClass";
|
||||
public static final String COMPETITOR_NAME = "competitorName";
|
||||
@@ -35,117 +33,58 @@ public class GpsFixesWithEstimationDataJsonSerializer extends AbstractTrackedRac
|
||||
public static final String RELATIVE_BEARING_TO_NEXT_MARK = "relativeBearingToNextMark";
|
||||
public static final String CLOSEST_DISTANCE_TO_MARK = "closestDistanceToMarkInMeters";
|
||||
|
||||
private final BoatClassJsonSerializer boatClassJsonSerializer;
|
||||
private final GPSFixMovingJsonSerializer gpsFixMovingJsonSerializer;
|
||||
private final boolean addWind;
|
||||
private final boolean addNextWaypoint;
|
||||
private final ManeuverWindJsonSerializer windJsonSerializer;
|
||||
private final Boolean smoothFixes;
|
||||
private Integer startBeforeStartLineInSeconds;
|
||||
private Integer endBeforeStartLineInSeconds;
|
||||
private Integer startAfterFinishLineInSeconds;
|
||||
private Integer endAfterFinishLineInSeconds;
|
||||
|
||||
public GpsFixesWithEstimationDataJsonSerializer(BoatClassJsonSerializer boatClassJsonSerializer,
|
||||
GPSFixMovingJsonSerializer gpsFixMovingJsonSerializer, ManeuverWindJsonSerializer windJsonSerializer,
|
||||
boolean addWind, boolean addNextWaypoint, Boolean smoothFixes, Integer startBeforeStartLineInSeconds,
|
||||
Integer endBeforeStartLineInSeconds, Integer startAfterFinishLineInSeconds,
|
||||
Integer endAfterFinishLineInSeconds) {
|
||||
this.boatClassJsonSerializer = boatClassJsonSerializer;
|
||||
public GpsFixesWithEstimationDataJsonSerializer(GPSFixMovingJsonSerializer gpsFixMovingJsonSerializer,
|
||||
ManeuverWindJsonSerializer windJsonSerializer, boolean addWind, boolean addNextWaypoint,
|
||||
Boolean smoothFixes) {
|
||||
this.gpsFixMovingJsonSerializer = gpsFixMovingJsonSerializer;
|
||||
this.windJsonSerializer = windJsonSerializer;
|
||||
this.addWind = addWind;
|
||||
this.addNextWaypoint = addNextWaypoint;
|
||||
this.smoothFixes = smoothFixes;
|
||||
this.startBeforeStartLineInSeconds = startBeforeStartLineInSeconds;
|
||||
this.endBeforeStartLineInSeconds = endBeforeStartLineInSeconds;
|
||||
this.startAfterFinishLineInSeconds = startAfterFinishLineInSeconds;
|
||||
this.endAfterFinishLineInSeconds = endAfterFinishLineInSeconds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(TrackedRace trackedRace) {
|
||||
final JSONObject result = new JSONObject();
|
||||
JSONArray byCompetitorJson = new JSONArray();
|
||||
result.put(BYCOMPETITOR, byCompetitorJson);
|
||||
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
|
||||
ManeuverDetectorImpl maneuverDetector = new ManeuverDetectorImpl(trackedRace, competitor);
|
||||
ManeuverDetectorWithEstimationDataSupportDecoratorImpl estimationDataSupportDecoratorImpl = new ManeuverDetectorWithEstimationDataSupportDecoratorImpl(
|
||||
maneuverDetector, null);
|
||||
TrackTimeInfo trackTimeInfo = maneuverDetector.getTrackTimeInfo();
|
||||
TimePoint from = null;
|
||||
TimePoint to = null;
|
||||
if (startBeforeStartLineInSeconds != Integer.MIN_VALUE) {
|
||||
from = trackTimeInfo.getTrackStartTimePoint()
|
||||
.minus(new MillisecondsDurationImpl(startBeforeStartLineInSeconds * 1000L));
|
||||
} else if (startAfterFinishLineInSeconds != Integer.MIN_VALUE) {
|
||||
from = trackTimeInfo.getTrackEndTimePoint()
|
||||
.plus(new MillisecondsDurationImpl(startAfterFinishLineInSeconds * 1000L));
|
||||
} else {
|
||||
from = trackTimeInfo.getTrackStartTimePoint();
|
||||
}
|
||||
if (endAfterFinishLineInSeconds != Integer.MIN_VALUE) {
|
||||
to = trackTimeInfo.getTrackEndTimePoint()
|
||||
.plus(new MillisecondsDurationImpl(endAfterFinishLineInSeconds * 1000L));
|
||||
} else if (endBeforeStartLineInSeconds != Integer.MIN_VALUE) {
|
||||
to = trackTimeInfo.getTrackStartTimePoint()
|
||||
.minus(new MillisecondsDurationImpl(endBeforeStartLineInSeconds * 1000L));
|
||||
} else {
|
||||
to = trackTimeInfo.getTrackEndTimePoint();
|
||||
}
|
||||
if (trackTimeInfo != null) {
|
||||
final JSONObject forCompetitorJson = new JSONObject();
|
||||
byCompetitorJson.add(forCompetitorJson);
|
||||
forCompetitorJson.put(COMPETITOR_NAME, competitor.getName());
|
||||
forCompetitorJson.put(BOAT_CLASS, boatClassJsonSerializer
|
||||
.serialize(trackedRace.getRace().getBoatOfCompetitor(competitor).getBoatClass()));
|
||||
final JSONArray gpsFixesWithEstimationData = new JSONArray();
|
||||
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
track.lockForRead();
|
||||
try {
|
||||
for (GPSFixMoving gpsFix : track.getFixes(from, true, to, true)) {
|
||||
JSONObject serializedGpsFix = gpsFixMovingJsonSerializer.serialize(gpsFix);
|
||||
if (addWind) {
|
||||
Wind wind = trackedRace.getWind(gpsFix.getPosition(), gpsFix.getTimePoint());
|
||||
JSONObject serializedWind = wind == null ? null : windJsonSerializer.serialize(wind);
|
||||
serializedGpsFix.put(WIND, serializedWind);
|
||||
}
|
||||
if (addNextWaypoint) {
|
||||
Distance closestDistanceToMark = estimationDataSupportDecoratorImpl
|
||||
.getClosestDistanceToMark(gpsFix.getTimePoint());
|
||||
SpeedWithBearing speedWithBearing = smoothFixes
|
||||
? track.getEstimatedSpeed(gpsFix.getTimePoint()) : gpsFix.getSpeed();
|
||||
Bearing relativeBearingToNextMark = speedWithBearing == null ? null
|
||||
: estimationDataSupportDecoratorImpl.getRelativeBearingToNextMark(
|
||||
gpsFix.getTimePoint(), speedWithBearing.getBearing());
|
||||
serializedGpsFix.put(CLOSEST_DISTANCE_TO_MARK,
|
||||
closestDistanceToMark == null ? null : closestDistanceToMark.getMeters());
|
||||
serializedGpsFix.put(RELATIVE_BEARING_TO_NEXT_MARK,
|
||||
relativeBearingToNextMark == null ? null : relativeBearingToNextMark.getDegrees());
|
||||
}
|
||||
gpsFixesWithEstimationData.add(serializedGpsFix);
|
||||
}
|
||||
} finally {
|
||||
track.unlockAfterRead();
|
||||
public JSONArray serialize(TrackedRace trackedRace, Competitor competitor, TimePoint from, TimePoint to,
|
||||
TrackTimeInfo trackTimeInfo) {
|
||||
final JSONArray gpsFixesWithEstimationData = new JSONArray();
|
||||
ManeuverDetectorImpl maneuverDetector = new ManeuverDetectorImpl(trackedRace, competitor);
|
||||
ManeuverDetectorWithEstimationDataSupportDecoratorImpl estimationDataSupportDecoratorImpl = new ManeuverDetectorWithEstimationDataSupportDecoratorImpl(
|
||||
maneuverDetector, null);
|
||||
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
track.lockForRead();
|
||||
try {
|
||||
for (GPSFixMoving gpsFix : track.getFixes(from, true, to, true)) {
|
||||
JSONObject serializedGpsFix = gpsFixMovingJsonSerializer.serialize(gpsFix);
|
||||
if (addWind) {
|
||||
Wind wind = trackedRace.getWind(gpsFix.getPosition(), gpsFix.getTimePoint());
|
||||
JSONObject serializedWind = wind == null ? null : windJsonSerializer.serialize(wind);
|
||||
serializedGpsFix.put(WIND, serializedWind);
|
||||
}
|
||||
forCompetitorJson.put(GPS_FIXES, gpsFixesWithEstimationData);
|
||||
Duration averageIntervalBetweenFixes = trackedRace.getTrack(competitor)
|
||||
.getAverageIntervalBetweenFixes();
|
||||
forCompetitorJson.put(AVG_INTERVAL_BETWEEN_FIXES_IN_SECONDS,
|
||||
averageIntervalBetweenFixes == null ? 0 : averageIntervalBetweenFixes.asSeconds());
|
||||
Double distanceTravelledInMeters = null;
|
||||
if (trackTimeInfo.getTrackStartTimePoint() != null && trackTimeInfo.getTrackEndTimePoint() != null) {
|
||||
distanceTravelledInMeters = track.getDistanceTraveled(trackTimeInfo.getTrackStartTimePoint(),
|
||||
trackTimeInfo.getTrackEndTimePoint()).getMeters();
|
||||
if (addNextWaypoint) {
|
||||
Distance closestDistanceToMark = estimationDataSupportDecoratorImpl
|
||||
.getClosestDistanceToMark(gpsFix.getTimePoint());
|
||||
SpeedWithBearing speedWithBearing = smoothFixes ? track.getEstimatedSpeed(gpsFix.getTimePoint())
|
||||
: gpsFix.getSpeed();
|
||||
Bearing relativeBearingToNextMark = speedWithBearing == null ? null
|
||||
: estimationDataSupportDecoratorImpl.getRelativeBearingToNextMark(gpsFix.getTimePoint(),
|
||||
speedWithBearing.getBearing());
|
||||
serializedGpsFix.put(CLOSEST_DISTANCE_TO_MARK,
|
||||
closestDistanceToMark == null ? null : closestDistanceToMark.getMeters());
|
||||
serializedGpsFix.put(RELATIVE_BEARING_TO_NEXT_MARK,
|
||||
relativeBearingToNextMark == null ? null : relativeBearingToNextMark.getDegrees());
|
||||
}
|
||||
forCompetitorJson.put(DISTANCE_TRAVELLED_IN_METERS, distanceTravelledInMeters);
|
||||
forCompetitorJson.put(START_TIME_POINT, trackTimeInfo.getTrackStartTimePoint() == null ? null
|
||||
: trackTimeInfo.getTrackStartTimePoint().asMillis());
|
||||
forCompetitorJson.put(END_TIME_POINT, trackTimeInfo.getTrackEndTimePoint() == null ? null
|
||||
: trackTimeInfo.getTrackEndTimePoint().asMillis());
|
||||
gpsFixesWithEstimationData.add(serializedGpsFix);
|
||||
}
|
||||
} finally {
|
||||
track.unlockAfterRead();
|
||||
}
|
||||
return result;
|
||||
return gpsFixesWithEstimationData;
|
||||
}
|
||||
|
||||
}
|
||||
+24
-13
@@ -78,6 +78,7 @@ import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.CompetitorAndBoatJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.CompetitorTrackWithEstimationDataJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.CompleteManeuverCurveWithEstimationDataJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.CompleteManeuverCurvesWithEstimationDataJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.DefaultWindTrackJsonSerializer;
|
||||
@@ -1053,14 +1054,17 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
.type(MediaType.TEXT_PLAIN).build();
|
||||
} else {
|
||||
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
|
||||
CompleteManeuverCurvesWithEstimationDataJsonSerializer serializer = new CompleteManeuverCurvesWithEstimationDataJsonSerializer(
|
||||
CompetitorTrackWithEstimationDataJsonSerializer serializer = new CompetitorTrackWithEstimationDataJsonSerializer(
|
||||
getService().getPolarDataService(), new DetailedBoatClassJsonSerializer(),
|
||||
new CompleteManeuverCurveWithEstimationDataJsonSerializer(
|
||||
new ManeuverMainCurveWithEstimationDataJsonSerializer(),
|
||||
new ManeuverCurveWithUnstableCourseAndSpeedWithEstimationDataJsonSerializer(),
|
||||
new ManeuverWindJsonSerializer(), new PositionJsonSerializer()),
|
||||
startBeforeStartLineInSeconds, endBeforeStartLineInSeconds, startAfterFinishLineInSeconds,
|
||||
endAfterFinishLineInSeconds);
|
||||
new CompleteManeuverCurvesWithEstimationDataJsonSerializer(getService().getPolarDataService(),
|
||||
new CompleteManeuverCurveWithEstimationDataJsonSerializer(
|
||||
new ManeuverMainCurveWithEstimationDataJsonSerializer(),
|
||||
new ManeuverCurveWithUnstableCourseAndSpeedWithEstimationDataJsonSerializer(),
|
||||
new ManeuverWindJsonSerializer(), new PositionJsonSerializer())),
|
||||
getNullableValueFromDefault(startBeforeStartLineInSeconds),
|
||||
getNullableValueFromDefault(endBeforeStartLineInSeconds),
|
||||
getNullableValueFromDefault(startAfterFinishLineInSeconds),
|
||||
getNullableValueFromDefault(endAfterFinishLineInSeconds));
|
||||
JSONObject jsonMarkPassings = serializer.serialize(trackedRace);
|
||||
String json = jsonMarkPassings.toJSONString();
|
||||
return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
|
||||
@@ -1068,7 +1072,7 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
|
||||
@GET
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
@Path("{regattaname}/races/{racename}/gpsFixesWithEstimationData")
|
||||
@@ -1098,11 +1102,14 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
.type(MediaType.TEXT_PLAIN).build();
|
||||
} else {
|
||||
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
|
||||
GpsFixesWithEstimationDataJsonSerializer serializer = new GpsFixesWithEstimationDataJsonSerializer(
|
||||
new DetailedBoatClassJsonSerializer(), new GPSFixMovingJsonSerializer(),
|
||||
new ManeuverWindJsonSerializer(), addWind, addNextWaypoint, smoothFixes,
|
||||
startBeforeStartLineInSeconds, endBeforeStartLineInSeconds, startAfterFinishLineInSeconds,
|
||||
endAfterFinishLineInSeconds);
|
||||
CompetitorTrackWithEstimationDataJsonSerializer serializer = new CompetitorTrackWithEstimationDataJsonSerializer(
|
||||
getService().getPolarDataService(), new DetailedBoatClassJsonSerializer(),
|
||||
new GpsFixesWithEstimationDataJsonSerializer(new GPSFixMovingJsonSerializer(),
|
||||
new ManeuverWindJsonSerializer(), addWind, addNextWaypoint, smoothFixes),
|
||||
getNullableValueFromDefault(startBeforeStartLineInSeconds),
|
||||
getNullableValueFromDefault(endBeforeStartLineInSeconds),
|
||||
getNullableValueFromDefault(startAfterFinishLineInSeconds),
|
||||
getNullableValueFromDefault(endAfterFinishLineInSeconds));
|
||||
JSONObject jsonMarkPassings = serializer.serialize(trackedRace);
|
||||
String json = jsonMarkPassings.toJSONString();
|
||||
return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
|
||||
@@ -1111,6 +1118,10 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
return response;
|
||||
}
|
||||
|
||||
private Integer getNullableValueFromDefault(Integer value) {
|
||||
return Integer.MIN_VALUE == value ? null : value;
|
||||
}
|
||||
|
||||
@GET
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
@Path("{regattaname}/races")
|
||||
|
||||
Reference in new issue
Block a user