Bug 5101: Added an API to get the device statuses associated to a

regatta
This commit is contained in:
Steffen Schaefer committed 2019-07-24 15:07:34 +02:00
1 parent dbaccd2c67
commit 2af26765cf
1 file changed
+50
@@ -17,6 +17,7 @@ import java.util.concurrent.Callable;
import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
@@ -46,6 +47,8 @@ import com.sap.sailing.domain.abstractlog.regatta.RegattaLogEvent;
import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceCompetitorMappingEvent;
import com.sap.sailing.domain.abstractlog.regatta.events.RegattaLogDeviceMappingEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.events.impl.RegattaLogDeviceCompetitorMappingEventImpl;
import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.RegattaLogDeviceMappingFinder;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorWithBoat;
import com.sap.sailing.domain.base.Course;
@@ -77,6 +80,7 @@ import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException;
import com.sap.sailing.domain.racelogtracking.DeviceMappingWithRegattaLogEvent;
import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl;
import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
@@ -107,6 +111,7 @@ import com.sap.sailing.server.gateway.serialization.impl.CompleteManeuverCurveWi
import com.sap.sailing.server.gateway.serialization.impl.CompleteManeuverCurvesWithEstimationDataJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.DefaultWindTrackJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.DetailedBoatClassJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.DeviceIdentifierJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.DistanceJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.GPSFixJsonSerializer;
@@ -129,6 +134,7 @@ import com.sap.sailing.server.gateway.serialization.impl.TargetTimeInfoSerialize
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.TrackedRaceJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.WindJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler;
import com.sap.sailing.server.operationaltransformation.AddColumnToSeries;
import com.sap.sailing.server.operationaltransformation.UpdateSeries;
import com.sap.sse.InvalidDateException;
@@ -139,6 +145,7 @@ import com.sap.sse.common.Speed;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.WithID;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.RGBColor;
@@ -2277,4 +2284,47 @@ public class RegattasResource extends AbstractSailingServerResource {
}
return Response.ok().header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/tracking_devices")
public Response getTrackingStatus(@PathParam("regattaName") String regattaName) {
Regatta regatta = getService().getRegattaByName(regattaName);
if (regatta != null) {
// Deeper insights to tracking data is only available to users who can administer a regatta
SecurityUtils.getSubject().checkPermission(regatta.getIdentifier().getStringPermission(DefaultActions.UPDATE));
TrackingDeviceStatusSerializer serializer = new TrackingDeviceStatusSerializer(new DeviceIdentifierJsonSerializer(
getServiceFinderFactory().createServiceFinder(DeviceIdentifierJsonHandler.class)));
RegattaLogDeviceMappingFinder<WithID> regattaLogDeviceMappingFinder = new RegattaLogDeviceMappingFinder<WithID>(regatta.getRegattaLog());
Map<WithID, List<DeviceMappingWithRegattaLogEvent<WithID>>> foundMappings = regattaLogDeviceMappingFinder.analyze();
JSONObject result = new JSONObject();
foundMappings.forEach((item, mappings) -> {
JSONArray deviceStatusesOfTrackedItem = new JSONArray();
mappings.stream().map(DeviceMappingWithRegattaLogEvent<WithID>::getDevice).collect(Collectors.toSet())
.forEach(deviceIdentifier -> {
deviceStatusesOfTrackedItem.add(serializer.serialize(
TrackingDeviceStatus.calculateDeviceStatus(deviceIdentifier, getService())));
});
JSONObject itemObject = new JSONObject();
itemObject.put("deviceStatuses", deviceStatusesOfTrackedItem);
if (item instanceof Competitor) {
itemObject.put("competitorId", item.getId().toString());
((JSONArray) result.computeIfAbsent("competitors", k -> new JSONArray())).add(itemObject);
} else if (item instanceof Boat) {
itemObject.put("boatId", item.getId().toString());
((JSONArray) result.computeIfAbsent("boats", k -> new JSONArray())).add(itemObject);
} else if (item instanceof Mark) {
itemObject.put("markId", item.getId().toString());
((JSONArray) result.computeIfAbsent("marks", k -> new JSONArray())).add(itemObject);
}
});
return Response.ok(result.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8")
.build();
} else {
throw new IllegalStateException("Regatta named " + regattaName + " could not be resolved");
}
}
}