diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/LeaderboardNameConstants.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/LeaderboardNameConstants.java
index 259243684c7..18947f19765 100755
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/LeaderboardNameConstants.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/LeaderboardNameConstants.java
@@ -14,6 +14,7 @@ public interface LeaderboardNameConstants {
static final String SCORINGSCHEME = "scoringScheme";
static final String SCORINGCOMMENT = "scoringComment";
static final String LASTSCORINGUPDATE = "lastScoringUpdate";
+ static final String LASTSCORINGUPDATE_MILLIS = "lastScoringUpdate-ms";
static final String REGATTANAME = "regattaName";
static final String SERIES = "series";
static final String ISMEDALSERIES = "isMedalSeries";
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
index e0b28d6e334..1bcf2c8abaf 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
@@ -5,6 +5,14 @@
What's New - SAP Sailing Analytics
+
June 2024
+
+ - Added the timepoint-ms and lastScoringUpdate-ms fields to the
+ /sailingserver/api/v1/leaderboardgroups/{id|name}
+ response which reports the time point as the number of milliseconds since the epoch (1970-01-01T00:00:00Z, "Unix time").
+ The timepoint and lastScoringUpdate fields' format is not easily machine-readable,
+ but we're not changing the format for reasons of backward compatibility.
+
April 2024
- Added the trueheading-deg field to the competitor GPS fix export if the tracker has provided it.
diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/LeaderboardGroupConstants.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/LeaderboardGroupConstants.java
index 21bfd9dd926..4647d78a2c2 100755
--- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/LeaderboardGroupConstants.java
+++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/LeaderboardGroupConstants.java
@@ -6,6 +6,7 @@ public interface LeaderboardGroupConstants {
String DISPLAYNAME = "displayName";
String DESCRIPTION = "description";
String TIMEPOINT = "timepoint";
+ String TIMEPOINT_MILLIS = "timepoint-ms";
String EVENTS = "events";
String LEADERBOARDS = "leaderboards";
}
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java
index fa3a4daa718..7d95f9cfce6 100644
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java
@@ -139,15 +139,16 @@ public class LeaderboardGroupsResource extends AbstractSailingServerResource {
.type(MediaType.TEXT_PLAIN).build();
} else {
if (getSecurityService().hasCurrentUserReadPermission(leaderboardGroup)) {
- TimePoint timePoint = MillisecondsTimePoint.now();
- JSONObject jsonLeaderboardGroup = new JSONObject();
+ final TimePoint timePoint = MillisecondsTimePoint.now();
+ final JSONObject jsonLeaderboardGroup = new JSONObject();
jsonLeaderboardGroup.put(LeaderboardGroupConstants.NAME, leaderboardGroup.getName());
jsonLeaderboardGroup.put(LeaderboardGroupConstants.ID, leaderboardGroup.getId().toString());
jsonLeaderboardGroup.put(LeaderboardGroupConstants.DISPLAYNAME, leaderboardGroup.getDisplayName());
jsonLeaderboardGroup.put(LeaderboardGroupConstants.DESCRIPTION, leaderboardGroup.getDescription());
jsonLeaderboardGroup.put(LeaderboardGroupConstants.TIMEPOINT, timePoint.toString());
+ jsonLeaderboardGroup.put(LeaderboardGroupConstants.TIMEPOINT_MILLIS, timePoint.asMillis());
final Set eventsReferencingLeaderboardGroup = new HashSet<>();
- JSONArray idsOfEventsReferencingLeaderboardGroup = new JSONArray();
+ final JSONArray idsOfEventsReferencingLeaderboardGroup = new JSONArray();
for (final Event event : getService().getAllEvents()) {
if (Util.contains(event.getLeaderboardGroups(), leaderboardGroup)) {
eventsReferencingLeaderboardGroup.add(event);
@@ -173,6 +174,8 @@ public class LeaderboardGroupsResource extends AbstractSailingServerResource {
TimePoint lastUpdateTimepoint = scoreCorrection.getTimePointOfLastCorrectionsValidity();
jsonLeaderboard.put(LeaderboardNameConstants.LASTSCORINGUPDATE,
lastUpdateTimepoint != null ? lastUpdateTimepoint.asDate().toString() : null);
+ jsonLeaderboard.put(LeaderboardNameConstants.LASTSCORINGUPDATE_MILLIS,
+ lastUpdateTimepoint != null ? lastUpdateTimepoint.asMillis() : null);
} else {
jsonLeaderboard.put(LeaderboardNameConstants.SCORINGCOMMENT, null);
jsonLeaderboard.put(LeaderboardNameConstants.LASTSCORINGUPDATE, null);