mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-24 14:38:45 +00:00
Merge remote-tracking branch 'origin/bug3991'
This commit is contained in:
+33
-20
@@ -2,13 +2,15 @@ package com.sap.sailing.domain.racelog;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
public class RaceStateOfSameDayHelper {
|
||||
|
||||
public static boolean isRaceStateOfSameDay(TimePoint raceStartTimePoint, TimePoint raceFinishedTimePoint,
|
||||
TimePoint abortingTimePoint, Calendar now) {
|
||||
TimePoint abortingTimePoint, Calendar now, Duration clientTimeZoneOffset) {
|
||||
Date raceStartTime = null;
|
||||
Date raceFinishedTime = null;
|
||||
Date abortingTime = null;
|
||||
@@ -22,35 +24,46 @@ public class RaceStateOfSameDayHelper {
|
||||
if (abortingTimePoint != null) {
|
||||
abortingTime = abortingTimePoint.asDate();
|
||||
}
|
||||
|
||||
return isRaceStateOfSameDay(raceStartTime, raceFinishedTime, abortingTime, now);
|
||||
return isRaceStateOfSameDay(raceStartTime, raceFinishedTime, abortingTime, now, clientTimeZoneOffset);
|
||||
}
|
||||
|
||||
public static boolean isRaceStateOfSameDay(Date raceStartTime, Date raceFinishedTime, Calendar now) {
|
||||
boolean result = false;
|
||||
if (raceFinishedTime != null) {
|
||||
Calendar finishedTimeCal = Calendar.getInstance();
|
||||
finishedTimeCal.setTime(raceFinishedTime);
|
||||
if(isSameDay(now, finishedTimeCal)) {
|
||||
result = true;
|
||||
}
|
||||
} else if (raceStartTime != null) {
|
||||
Calendar startTimeCal = Calendar.getInstance();
|
||||
startTimeCal.setTime(raceStartTime);
|
||||
if(isSameDay(now, startTimeCal)) {
|
||||
result = true;
|
||||
public static boolean isRaceStateOfSameDay(Date raceStartTime, Date raceFinishedTime, Calendar now, Duration clientTimeZoneOffset) {
|
||||
final boolean result;
|
||||
final Calendar timeToCheck = Calendar.getInstance();
|
||||
// see if we shall and can adjust the time zone offset for determining the day boundaries:
|
||||
if (clientTimeZoneOffset != null) {
|
||||
final String[] availableTimeZoneIDsForOffset = TimeZone.getAvailableIDs((int) -clientTimeZoneOffset.asMillis());
|
||||
if (availableTimeZoneIDsForOffset != null && availableTimeZoneIDsForOffset.length > 0) {
|
||||
// found a time zone with the offset requested; note that this may not be the time zone the client really is in
|
||||
// but at least for the current time (which may be different from the "now" parameter) that time zone has
|
||||
// the clientTimeZoneOffset from UTC.
|
||||
final TimeZone tz = TimeZone.getTimeZone(availableTimeZoneIDsForOffset[0]);
|
||||
timeToCheck.setTimeZone(tz);
|
||||
now.setTimeZone(tz);
|
||||
}
|
||||
}
|
||||
|
||||
if (raceFinishedTime != null || raceStartTime != null) {
|
||||
if (raceFinishedTime != null) {
|
||||
timeToCheck.setTime(raceFinishedTime);
|
||||
} else if (raceStartTime != null) {
|
||||
timeToCheck.setTime(raceStartTime);
|
||||
}
|
||||
result = isSameDay(now, timeToCheck);
|
||||
} else {
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isRaceStateOfSameDay(Date raceStartTime, Date raceFinishedTime, Date abortingTime, Calendar now) {
|
||||
boolean result = isRaceStateOfSameDay(raceStartTime, raceFinishedTime, now);
|
||||
/**
|
||||
* The client's day starts at <code>00:00:00Z - clientTimeZoneOffset</code> and ends at <code>23:59:59Z - clientTimeZoneOffset</code>.
|
||||
*/
|
||||
public static boolean isRaceStateOfSameDay(Date raceStartTime, Date raceFinishedTime, Date abortingTime, Calendar now, Duration clientTimeZoneOffset) {
|
||||
boolean result = isRaceStateOfSameDay(raceStartTime, raceFinishedTime, now, clientTimeZoneOffset);
|
||||
if (!result && (abortingTime != null)) {
|
||||
Calendar abortingTimeCal = Calendar.getInstance();
|
||||
abortingTimeCal.setTime(abortingTime);
|
||||
if(isSameDay(now, abortingTimeCal)) {
|
||||
if (isSameDay(now, abortingTimeCal)) {
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -63,8 +63,10 @@ import com.sap.sailing.gwt.ui.shared.RaceGroupSeriesDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceInfoDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.util.NaturalComparator;
|
||||
import com.sap.sse.gwt.client.DateTimeUtil;
|
||||
import com.sap.sse.gwt.client.ErrorReporter;
|
||||
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
|
||||
import com.sap.sse.gwt.client.celltable.BaseCelltable;
|
||||
@@ -359,10 +361,11 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component
|
||||
return;
|
||||
}
|
||||
final long clientTimeWhenRequestWasSent = System.currentTimeMillis();
|
||||
final Duration clientTimeZoneOffset = DateTimeUtil.getClientTimezoneOffsetFromUTC();
|
||||
sailingService.getRaceStateEntriesForRaceGroup(eventId, Util.asList(settings.getVisibleCourseAreas()),
|
||||
Util.asList(settings.getVisibleRegattas()), settings.isShowOnlyCurrentlyRunningRaces(), settings
|
||||
.isShowOnlyRacesOfSameDay(),
|
||||
new MarkedAsyncCallback<List<RegattaOverviewEntryDTO>>(
|
||||
clientTimeZoneOffset, new MarkedAsyncCallback<List<RegattaOverviewEntryDTO>>(
|
||||
new AsyncCallback<List<RegattaOverviewEntryDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable cause) {
|
||||
|
||||
+4
-4
@@ -416,12 +416,12 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
|
||||
List<RaceGroupDTO> getRegattaStructureOfEvent(UUID eventId);
|
||||
|
||||
List<RegattaOverviewEntryDTO> getRaceStateEntriesForRaceGroup(UUID eventId, List<UUID> visibleCourseAreas,
|
||||
List<String> visibleRegattas, boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay)
|
||||
throws Exception;
|
||||
List<String> visibleRegattas, boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay,
|
||||
Duration clientTimeZoneOffset) throws Exception;
|
||||
|
||||
List<RegattaOverviewEntryDTO> getRaceStateEntriesForLeaderboard(String leaderboardName,
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, List<String> visibleRegattas)
|
||||
throws Exception;
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset,
|
||||
List<String> visibleRegattas) throws Exception;
|
||||
|
||||
void stopReplicatingFromMaster();
|
||||
|
||||
|
||||
+2
-2
@@ -565,10 +565,10 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
|
||||
|
||||
void getRaceStateEntriesForRaceGroup(UUID eventId, List<UUID> visibleCourseAreas, List<String> visibleRegattas,
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay,
|
||||
AsyncCallback<List<RegattaOverviewEntryDTO>> markedAsyncCallback);
|
||||
Duration clientTimeZoneOffset, AsyncCallback<List<RegattaOverviewEntryDTO>> markedAsyncCallback);
|
||||
|
||||
void getRaceStateEntriesForLeaderboard(String leaderboardName, boolean showOnlyCurrentlyRunningRaces,
|
||||
boolean showOnlyRacesOfSameDay, List<String> visibleRegattas,
|
||||
boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset, List<String> visibleRegattas,
|
||||
AsyncCallback<List<RegattaOverviewEntryDTO>> callback);
|
||||
|
||||
void stopAllReplicas(AsyncCallback<Void> asyncCallback);
|
||||
|
||||
+30
-18
@@ -4280,14 +4280,17 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
|
||||
@Override
|
||||
public List<RegattaOverviewEntryDTO> getRaceStateEntriesForLeaderboard(String leaderboardName,
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, final List<String> visibleRegattas)
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset, final List<String> visibleRegattas)
|
||||
throws NoWindException, InterruptedException, ExecutionException {
|
||||
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
|
||||
return getRaceStateEntriesForLeaderboard(leaderboard, showOnlyCurrentlyRunningRaces, showOnlyRacesOfSameDay, visibleRegattas);
|
||||
return getRaceStateEntriesForLeaderboard(leaderboard, showOnlyCurrentlyRunningRaces, showOnlyRacesOfSameDay, clientTimeZoneOffset, visibleRegattas);
|
||||
}
|
||||
|
||||
/**
|
||||
* The client's day starts at <code>00:00:00Z - clientTimeZoneOffset</code> and ends at <code>23:59:59Z - clientTimeZoneOffset</code>.
|
||||
*/
|
||||
private List<RegattaOverviewEntryDTO> getRaceStateEntriesForLeaderboard(Leaderboard leaderboard,
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, final List<String> visibleRegattas)
|
||||
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset, final List<String> visibleRegattas)
|
||||
throws NoWindException, InterruptedException, ExecutionException {
|
||||
List<RegattaOverviewEntryDTO> result = new ArrayList<RegattaOverviewEntryDTO>();
|
||||
Calendar dayToCheck = Calendar.getInstance();
|
||||
@@ -4306,8 +4309,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
for (Series series : regatta.getSeries()) {
|
||||
Map<String, List<RegattaOverviewEntryDTO>> entriesPerFleet = new HashMap<String, List<RegattaOverviewEntryDTO>>();
|
||||
for (RaceColumn raceColumn : series.getRaceColumns()) {
|
||||
getRegattaOverviewEntries(showOnlyRacesOfSameDay, dayToCheck,
|
||||
usedCourseArea, leaderboard, boatClass.getName(), regattaName, buyZoneRadius, series.getName(), raceColumn, entriesPerFleet);
|
||||
getRegattaOverviewEntries(showOnlyRacesOfSameDay, clientTimeZoneOffset, dayToCheck,
|
||||
usedCourseArea, leaderboard, boatClass.getName(), regattaName, buyZoneRadius,
|
||||
series.getName(), raceColumn, entriesPerFleet);
|
||||
}
|
||||
result.addAll(getRegattaOverviewEntriesToBeShown(showOnlyCurrentlyRunningRaces, entriesPerFleet));
|
||||
}
|
||||
@@ -4321,8 +4325,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
Distance buyZoneRadius = RegattaUtil.getCalculatedRegattaBuoyZoneRadius(null, boatClass);
|
||||
Map<String, List<RegattaOverviewEntryDTO>> entriesPerFleet = new HashMap<String, List<RegattaOverviewEntryDTO>>();
|
||||
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
|
||||
getRegattaOverviewEntries(showOnlyRacesOfSameDay, dayToCheck, usedCourseArea,
|
||||
leaderboard, boatClass == null ? "" : boatClass.getName(), regattaName, buyZoneRadius, LeaderboardNameConstants.DEFAULT_SERIES_NAME, raceColumn, entriesPerFleet);
|
||||
getRegattaOverviewEntries(showOnlyRacesOfSameDay, clientTimeZoneOffset, dayToCheck, usedCourseArea,
|
||||
leaderboard, boatClass == null ? "" : boatClass.getName(), regattaName, buyZoneRadius,
|
||||
LeaderboardNameConstants.DEFAULT_SERIES_NAME, raceColumn, entriesPerFleet);
|
||||
}
|
||||
result.addAll(getRegattaOverviewEntriesToBeShown(showOnlyCurrentlyRunningRaces, entriesPerFleet));
|
||||
}
|
||||
@@ -4438,13 +4443,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
|
||||
@Override
|
||||
public List<RegattaOverviewEntryDTO> getRaceStateEntriesForRaceGroup(UUID eventId, List<UUID> visibleCourseAreaIds,
|
||||
List<String> visibleRegattas, boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay)
|
||||
List<String> visibleRegattas, boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset)
|
||||
throws NoWindException, InterruptedException, ExecutionException {
|
||||
List<RegattaOverviewEntryDTO> result = new ArrayList<RegattaOverviewEntryDTO>();
|
||||
|
||||
Calendar dayToCheck = Calendar.getInstance();
|
||||
dayToCheck.setTime(new Date());
|
||||
|
||||
Event event = getService().getEvent(eventId);
|
||||
if (event != null) {
|
||||
for (CourseArea courseArea : event.getVenue().getCourseAreas()) {
|
||||
@@ -4453,7 +4456,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
final CourseArea leaderboardDefaultCourseArea = leaderboard.getDefaultCourseArea();
|
||||
if (leaderboardDefaultCourseArea != null && leaderboardDefaultCourseArea.equals(courseArea)) {
|
||||
result.addAll(getRaceStateEntriesForLeaderboard(leaderboard.getName(),
|
||||
showOnlyCurrentlyRunningRaces, showOnlyRacesOfSameDay, visibleRegattas));
|
||||
showOnlyCurrentlyRunningRaces, showOnlyRacesOfSameDay, clientTimeZoneOffset, visibleRegattas));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4462,14 +4465,18 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
return result;
|
||||
}
|
||||
|
||||
private void getRegattaOverviewEntries(boolean showOnlyRacesOfSameDay, Calendar dayToCheck,
|
||||
CourseArea courseArea, Leaderboard leaderboard, String boatClassName, String regattaName, Distance buyZoneRadius, String seriesName, RaceColumn raceColumn,
|
||||
/**
|
||||
* The client's day starts at <code>00:00:00Z - clientTimeZoneOffset</code> and ends at <code>23:59:59Z - clientTimeZoneOffset</code>.
|
||||
*/
|
||||
private void getRegattaOverviewEntries(boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset,
|
||||
Calendar dayToCheck, CourseArea courseArea, Leaderboard leaderboard, String boatClassName,
|
||||
String regattaName, Distance buyZoneRadius, String seriesName, RaceColumn raceColumn,
|
||||
Map<String, List<RegattaOverviewEntryDTO>> entriesPerFleet) {
|
||||
if (!raceColumn.isCarryForward()) {
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
RegattaOverviewEntryDTO entry = createRegattaOverviewEntryDTO(courseArea,
|
||||
leaderboard, boatClassName, regattaName, buyZoneRadius, seriesName, raceColumn, fleet,
|
||||
showOnlyRacesOfSameDay, dayToCheck);
|
||||
showOnlyRacesOfSameDay, clientTimeZoneOffset, dayToCheck);
|
||||
if (entry != null) {
|
||||
addRegattaOverviewEntryToEntriesPerFleet(entriesPerFleet, fleet, entry);
|
||||
}
|
||||
@@ -4517,9 +4524,13 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
}
|
||||
entriesPerFleet.get(fleet.getName()).add(entry);
|
||||
}
|
||||
|
||||
private RegattaOverviewEntryDTO createRegattaOverviewEntryDTO(CourseArea courseArea, Leaderboard leaderboard, String boatClassName,
|
||||
String regattaName, Distance buyZoneRadius, String seriesName, RaceColumn raceColumn, Fleet fleet, boolean showOnlyRacesOfSameDay, Calendar dayToCheck) {
|
||||
|
||||
/**
|
||||
* The client's day starts at <code>00:00:00Z - clientTimeZoneOffset</code> and ends at <code>23:59:59Z - clientTimeZoneOffset</code>.
|
||||
*/
|
||||
private RegattaOverviewEntryDTO createRegattaOverviewEntryDTO(CourseArea courseArea, Leaderboard leaderboard,
|
||||
String boatClassName, String regattaName, Distance buyZoneRadius, String seriesName, RaceColumn raceColumn,
|
||||
Fleet fleet, boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset, Calendar dayToCheck) {
|
||||
RegattaOverviewEntryDTO entry = new RegattaOverviewEntryDTO();
|
||||
if (courseArea != null) {
|
||||
entry.courseAreaName = courseArea.getName();
|
||||
@@ -4535,7 +4546,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
entry.currentServerTime = new Date();
|
||||
entry.buyZoneRadius = buyZoneRadius;
|
||||
if (showOnlyRacesOfSameDay) {
|
||||
if (!RaceStateOfSameDayHelper.isRaceStateOfSameDay(entry.raceInfo.startTime, entry.raceInfo.finishedTime, entry.raceInfo.abortingTimeInPassBefore, dayToCheck)) {
|
||||
if (!RaceStateOfSameDayHelper.isRaceStateOfSameDay(entry.raceInfo.startTime, entry.raceInfo.finishedTime,
|
||||
entry.raceInfo.abortingTimeInPassBefore, dayToCheck, clientTimeZoneOffset)) {
|
||||
entry = null;
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -13,6 +13,7 @@ import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.RaceColumn;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
|
||||
public class EventRaceStatesSerializer implements JsonSerializer<Pair<Event, Iterable<Leaderboard>>> {
|
||||
@@ -24,11 +25,13 @@ public class EventRaceStatesSerializer implements JsonSerializer<Pair<Event, Ite
|
||||
private final String filterByLeaderboardName;
|
||||
private final Calendar filterDay;
|
||||
private final RaceLogResolver raceLogResolver;
|
||||
private final Duration clientTimeZoneOffset;
|
||||
|
||||
public EventRaceStatesSerializer(String filterByCourseArea, String filterByLeaderboard, String filterByDayOffset, RaceLogResolver raceLogResolver) {
|
||||
public EventRaceStatesSerializer(String filterByCourseArea, String filterByLeaderboard, String filterByDayOffset, Duration clientTimeZoneOffset, RaceLogResolver raceLogResolver) {
|
||||
this.filterByCourseArea = filterByCourseArea;
|
||||
this.filterByLeaderboardName = filterByLeaderboard;
|
||||
this.raceLogResolver = raceLogResolver;
|
||||
this.clientTimeZoneOffset = clientTimeZoneOffset;
|
||||
Integer dayOffset = null;
|
||||
if (filterByDayOffset != null) {
|
||||
Calendar myFilterDay;
|
||||
@@ -51,14 +54,13 @@ public class EventRaceStatesSerializer implements JsonSerializer<Pair<Event, Ite
|
||||
public JSONObject serialize(Pair<Event, Iterable<Leaderboard>> eventAndLeaderboards) {
|
||||
Event event = eventAndLeaderboards.getA();
|
||||
Iterable<Leaderboard> leaderboards = eventAndLeaderboards.getB();
|
||||
|
||||
JSONObject result = new JSONObject();
|
||||
result.put(FIELD_EVENT_NAME, event.getName());
|
||||
result.put(FIELD_EVENT_ID, event.getId().toString());
|
||||
JSONArray raceStatesLogEntriesJson = new JSONArray();
|
||||
result.put(FIELD_RACE_STATES, raceStatesLogEntriesJson);
|
||||
for (CourseArea courseArea : event.getVenue().getCourseAreas()) {
|
||||
if(filterByCourseArea == null || courseArea.getName().equals(filterByCourseArea)) {
|
||||
if (filterByCourseArea == null || courseArea.getName().equals(filterByCourseArea)) {
|
||||
for (Leaderboard leaderboard : leaderboards) {
|
||||
RaceStateSerializer raceStateSerializer = new RaceStateSerializer(raceLogResolver);
|
||||
if (filterByLeaderboardName == null || leaderboard.getName().equals(filterByLeaderboardName)) {
|
||||
@@ -68,7 +70,7 @@ public class EventRaceStatesSerializer implements JsonSerializer<Pair<Event, Ite
|
||||
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
Pair<RaceColumn, Fleet> raceColumnAndFleet = new Pair<RaceColumn, Fleet>(raceColumn, fleet);
|
||||
if(filterDay == null || raceStateSerializer.isRaceStateOfSameDay(raceColumnAndFleet, filterDay)) {
|
||||
if (filterDay == null || raceStateSerializer.isRaceStateOfSameDay(raceColumnAndFleet, filterDay, clientTimeZoneOffset)) {
|
||||
JSONObject raceStateJson = raceStateSerializer.serialize(raceColumnAndFleet);
|
||||
raceStateJson.put("courseAreaName", courseArea.getName());
|
||||
raceStateJson.put("leaderboardName", leaderboardName);
|
||||
|
||||
+15
-2
@@ -24,7 +24,9 @@ import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerialize
|
||||
import com.sap.sailing.server.gateway.serialization.impl.EventBaseJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.LeaderboardGroupBaseJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.VenueJsonSerializer;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
|
||||
@Path("/v1/events")
|
||||
public class EventsResource extends AbstractSailingServerResource {
|
||||
@@ -80,7 +82,8 @@ public class EventsResource extends AbstractSailingServerResource {
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
@Path("{eventId}/racestates")
|
||||
public Response getRaceStates(@PathParam("eventId") String eventId, @QueryParam("filterByLeaderboard") String filterByLeaderboard,
|
||||
@QueryParam("filterByCourseArea") String filterByCourseArea, @QueryParam("filterByDayOffset") String filterByDayOffset) {
|
||||
@QueryParam("filterByCourseArea") String filterByCourseArea, @QueryParam("filterByDayOffset") String filterByDayOffset,
|
||||
@QueryParam("clientTimeZoneOffsetInMinutes") Integer clientTimeZoneOffsetInMinutes) {
|
||||
// TODO bug2589, bug3504: the following will require EVENT:READ permission; it requires cross-server links to be authentication aware...
|
||||
// SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermissionForObjects(Permission.Mode.READ, eventId));
|
||||
Response response;
|
||||
@@ -94,8 +97,18 @@ public class EventsResource extends AbstractSailingServerResource {
|
||||
if (event == null) {
|
||||
response = getBadEventErrorResponse(eventId);
|
||||
} else {
|
||||
final Duration clientTimeZoneOffset;
|
||||
if (filterByDayOffset != null) {
|
||||
if (clientTimeZoneOffsetInMinutes != null) {
|
||||
clientTimeZoneOffset = new MillisecondsDurationImpl(1000*60*clientTimeZoneOffsetInMinutes);
|
||||
} else {
|
||||
clientTimeZoneOffset = Duration.NULL;
|
||||
}
|
||||
} else {
|
||||
clientTimeZoneOffset = null;
|
||||
}
|
||||
EventRaceStatesSerializer eventRaceStatesSerializer = new EventRaceStatesSerializer(filterByCourseArea,
|
||||
filterByLeaderboard, filterByDayOffset, getService());
|
||||
filterByLeaderboard, filterByDayOffset, clientTimeZoneOffset, getService());
|
||||
JSONObject raceStatesJson = eventRaceStatesSerializer.serialize(new Pair<Event, Iterable<Leaderboard>>(event, getService().getLeaderboards().values()));
|
||||
String json = raceStatesJson.toJSONString();
|
||||
response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
|
||||
|
||||
+3
-3
@@ -20,6 +20,7 @@ import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
|
||||
import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper;
|
||||
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
|
||||
@@ -79,10 +80,9 @@ public class RaceStateSerializer implements JsonSerializer<Pair<RaceColumn, Flee
|
||||
raceLogStateJson.put("displayed", isDisplayed);
|
||||
}
|
||||
|
||||
public boolean isRaceStateOfSameDay(Pair<RaceColumn, Fleet> raceColumnAndFleet, Calendar dayToCheck) {
|
||||
public boolean isRaceStateOfSameDay(Pair<RaceColumn, Fleet> raceColumnAndFleet, Calendar dayToCheck, Duration clientTimeZoneOffset) {
|
||||
RaceColumn raceColumn = raceColumnAndFleet.getA();
|
||||
Fleet fleet = raceColumnAndFleet.getB();
|
||||
|
||||
boolean result = false;
|
||||
RaceLog raceLog = raceColumn.getRaceLog(fleet);
|
||||
if (raceLog != null && !raceLog.isEmpty()) {
|
||||
@@ -90,7 +90,7 @@ public class RaceStateSerializer implements JsonSerializer<Pair<RaceColumn, Flee
|
||||
TimePoint finishedTime = new FinishedTimeFinder(raceLog).analyze();
|
||||
RaceLogFlagEvent abortingFlagEvent = new AbortingFlagFinder(raceLog).analyze();
|
||||
TimePoint abortingTime = abortingFlagEvent != null ? abortingFlagEvent.getLogicalTimePoint() : null;
|
||||
result = RaceStateOfSameDayHelper.isRaceStateOfSameDay(startTime, finishedTime, abortingTime, dayToCheck);
|
||||
result = RaceStateOfSameDayHelper.isRaceStateOfSameDay(startTime, finishedTime, abortingTime, dayToCheck, clientTimeZoneOffset);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
<div>filterByLeaderboard (filters the race states by the name of the leaderboard)</div>
|
||||
<div>filterByCourseArea (filters the race states by the name of the course area)</div>
|
||||
<div>filterByDayOffset (filters the race states by a day offset for current day, e.g. 1 means yesterday)</div>
|
||||
<div>clientTimeZoneOffsetInMinutes (if filterByDayOffset was provided, this parameter specifies the minutes the client is behind UTC; e.g., -60 for GMT+1 which is CET, Europe/Berlin)</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.sap.sse.gwt.client;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
|
||||
/**
|
||||
* Utility methods mainly for GWT clients for time/date features
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public class DateTimeUtil {
|
||||
/**
|
||||
* @return a duration that is positive for time zones "west" of GMT/UTC and negative for those "east" of GMT/UTC,
|
||||
* representing the client's time zone. Conceptually, this duration would have to be "added" to the client's
|
||||
* local time to obtain GMT/UTC.
|
||||
*/
|
||||
@SuppressWarnings("deprecation") // uses the deprecated Date.getTimezoneOffset() method but that's also what GWT does and seems the only way
|
||||
public static Duration getClientTimezoneOffsetFromUTC() {
|
||||
return new MillisecondsDurationImpl(new Date().getTimezoneOffset() /* that is in minutes */ * 60 * 1000);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -29,7 +29,7 @@ import com.sap.sse.common.Util;
|
||||
public class WindHelper {
|
||||
private static String TAG = WindHelper.class.getName();
|
||||
|
||||
public static void isTrackedRace(final Context context, final ManagedRace race){
|
||||
public static void isTrackedRace(final Context context, final ManagedRace race) {
|
||||
try {
|
||||
Util.Triple<String, String, String> triple = FleetIdentifierImpl.unescape(race.getId());
|
||||
String path = "/sailingserver/api/v1/events/"+ getEventId(context) + "/racestates";
|
||||
|
||||
Reference in New Issue
Block a user