mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 06:18:12 +00:00
Added new REST method for wind data retrieval
This commit is contained in:
1 parent
63aaf9b5fb
commit
a9d9d21b8a
2 files changed
+140
No files matched your search
+111
@@ -0,0 +1,111 @@
|
||||
package com.sap.sailing.server.gateway.serialization.impl;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.Wind;
|
||||
import com.sap.sailing.domain.common.WindSource;
|
||||
import com.sap.sailing.domain.common.WindSourceType;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.tracking.WindTrack;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Vladislav Chumak (D069712)
|
||||
*
|
||||
*/
|
||||
public class RaceWindJsonSerializer extends AbstractTrackedRaceDataJsonSerializer {
|
||||
public static final String WIND_SOURCES = "windSources";
|
||||
public static final String TYPE = "type";
|
||||
public static final String FIRST_POSITION = "firstPosition";
|
||||
public static final String START_TIME_POINT = "startUnixTime";
|
||||
public static final String END_TIME_POINT = "endUnixTime";
|
||||
public static final String SAMPLING_RATE = "samplingRate";
|
||||
public static final String FIXES = "fixes";
|
||||
|
||||
private final PositionJsonSerializer positionSerializer = new PositionJsonSerializer();
|
||||
private final WindJsonSerializer windSerializer = new WindJsonSerializer(positionSerializer);
|
||||
|
||||
@Override
|
||||
public JSONObject serialize(TrackedRace trackedRace) {
|
||||
final TimePoint finalFrom = trackedRace.getStartOfTracking();
|
||||
final TimePoint finalTo = Util.getEarliestOfTimePoints(trackedRace.getEndOfTracking(),
|
||||
trackedRace.getTimePointOfNewestEvent());
|
||||
List<WindSource> highQualityWindSources = trackedRace.getWindSources().stream()
|
||||
.filter(windSource -> windSource.getType() == WindSourceType.EXPEDITION
|
||||
|| windSource.getType() == WindSourceType.RACECOMMITTEE)
|
||||
.collect(Collectors.toList());
|
||||
JSONArray windSourcesJson = new JSONArray();
|
||||
TimePoint earliestTimePoint = null;
|
||||
TimePoint latestTimePoint = null;
|
||||
Position firstPosition = null;
|
||||
double bestSamplingRate = Double.MAX_VALUE;
|
||||
for (WindSource windSource : highQualityWindSources) {
|
||||
WindTrack windTrack = trackedRace.getOrCreateWindTrack(windSource);
|
||||
windTrack.lockForRead();
|
||||
try {
|
||||
Iterator<Wind> iterator = windTrack.getFixes(finalFrom, true, finalTo, true).iterator();
|
||||
if (iterator.hasNext()) {
|
||||
Wind fix = iterator.next();
|
||||
if (fix.getPosition() != null) {
|
||||
JSONArray windFixesJson = new JSONArray();
|
||||
TimePoint firstWindSourceTimePoint = fix.getTimePoint();
|
||||
TimePoint lastWindSourceTimePoint = null;
|
||||
Position firstWindSourcePosition = fix.getPosition();
|
||||
if (firstPosition == null) {
|
||||
firstPosition = firstWindSourcePosition;
|
||||
}
|
||||
if (earliestTimePoint == null || earliestTimePoint.after(fix.getTimePoint())) {
|
||||
earliestTimePoint = fix.getTimePoint();
|
||||
}
|
||||
do {
|
||||
JSONObject windJson = windSerializer.serialize(fix);
|
||||
windFixesJson.add(windJson);
|
||||
if (iterator.hasNext()) {
|
||||
fix = iterator.next();
|
||||
} else {
|
||||
lastWindSourceTimePoint = fix.getTimePoint();
|
||||
if (latestTimePoint == null || latestTimePoint.before(fix.getTimePoint())) {
|
||||
latestTimePoint = fix.getTimePoint();
|
||||
}
|
||||
fix = null;
|
||||
}
|
||||
} while (fix != null);
|
||||
Duration duration = firstWindSourceTimePoint.until(lastWindSourceTimePoint);
|
||||
JSONObject windSourceJson = new JSONObject();
|
||||
windSourceJson.put(TYPE, windSource.getType().name());
|
||||
windSourceJson.put(FIRST_POSITION, positionSerializer.serialize(firstWindSourcePosition));
|
||||
windSourceJson.put(START_TIME_POINT, firstWindSourceTimePoint.asMillis());
|
||||
windSourceJson.put(END_TIME_POINT, lastWindSourceTimePoint.asMillis());
|
||||
double samplingRate = duration.asSeconds() > 0 ? windFixesJson.size() / duration.asSeconds() : 0;
|
||||
windSourceJson.put(SAMPLING_RATE, samplingRate);
|
||||
windSourceJson.put(FIXES, windFixesJson);
|
||||
windSourcesJson.add(windSourceJson);
|
||||
if (bestSamplingRate > samplingRate) {
|
||||
bestSamplingRate = samplingRate;
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
windTrack.unlockAfterRead();
|
||||
}
|
||||
}
|
||||
final JSONObject result = new JSONObject();
|
||||
if (!windSourcesJson.isEmpty()) {
|
||||
result.put(FIRST_POSITION, positionSerializer.serialize(firstPosition));
|
||||
result.put(START_TIME_POINT, earliestTimePoint.asMillis());
|
||||
result.put(END_TIME_POINT, latestTimePoint.asMillis());
|
||||
result.put(SAMPLING_RATE, bestSamplingRate);
|
||||
result.put(WIND_SOURCES, windSourcesJson);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+29
@@ -105,6 +105,7 @@ import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializ
|
||||
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.PositionJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.RaceEntriesJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.RaceWindJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.SeriesJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.TargetTimeInfoSerializer;
|
||||
@@ -934,6 +935,34 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
@GET
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
@Path("{regattaname}/races/{racename}/highQualityWindFixes")
|
||||
public Response getHighQualityWindFixes(@PathParam("regattaname") String regattaName,
|
||||
@PathParam("racename") String raceName) {
|
||||
Response response;
|
||||
Regatta regatta = findRegattaByName(regattaName);
|
||||
if (regatta == null) {
|
||||
response = Response.status(Status.NOT_FOUND)
|
||||
.entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.")
|
||||
.type(MediaType.TEXT_PLAIN).build();
|
||||
} else {
|
||||
RaceDefinition race = findRaceByName(regatta, raceName);
|
||||
if (race == null) {
|
||||
response = Response.status(Status.NOT_FOUND)
|
||||
.entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.")
|
||||
.type(MediaType.TEXT_PLAIN).build();
|
||||
} else {
|
||||
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
|
||||
RaceWindJsonSerializer serializer = new RaceWindJsonSerializer();
|
||||
JSONObject jsonWindTracks = serializer.serialize(trackedRace);
|
||||
String json = jsonWindTracks.toJSONString();
|
||||
return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
@GET
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
|
||||
Reference in new issue
Block a user