Merge remote-tracking branch 'origin/bug3991'

This commit is contained in:
fmittag
2016-12-23 18:27:01 +01:00
11 changed files with 123 additions and 55 deletions
@@ -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;
}
}
@@ -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) {
@@ -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();
@@ -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);
@@ -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;
}
}
@@ -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);
@@ -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();
@@ -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);
}
}
@@ -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";