mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-19 02:29:58 +00:00
attempt to detect the delay to live in millis of the race that started latest and apply it to the LeaderboardPanel's timer
This commit is contained in:
1 parent
98b6331799
commit
e6c4982c41
4 files changed
+79
-39
No files matched your search
+52
-30
@@ -1291,40 +1291,62 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
selectedRaceColumns.addAll(getRaceColumnsToAddImplicitly(leaderboard));
|
||||
setLeaderboard(leaderboard);
|
||||
adjustColumnLayout(leaderboard);
|
||||
adjustDelayToLive();
|
||||
getData().getList().clear();
|
||||
if (leaderboard != null) {
|
||||
getData().getList().addAll(getRowsToDisplay(leaderboard));
|
||||
for (int i = 0; i < getLeaderboardTable().getColumnCount(); i++) {
|
||||
SortableColumn<?, ?> c = (SortableColumn<?, ?>) getLeaderboardTable().getColumn(i);
|
||||
c.updateMinMax(leaderboard);
|
||||
// Toggle pre-selected race, if the setting is set and it isn't open yet
|
||||
if (!autoExpandPerformedOnce && isAutoExpandPreSelectedRace()
|
||||
&& c instanceof RaceColumn<?>
|
||||
&& ((RaceColumn<?>) c).getRace().hasTrackedRace(preSelectedRace)) {
|
||||
ExpandableSortableColumn<?> expandableSortableColumn = (ExpandableSortableColumn<?>) c;
|
||||
if (!expandableSortableColumn.isExpanded()) {
|
||||
expandableSortableColumn.toggleExpansion();
|
||||
autoExpandPerformedOnce = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Comparator<LeaderboardRowDTO> comparator = getComparatorForSelectedSorting();
|
||||
if (comparator != null) {
|
||||
Collections.sort(getData().getList(), comparator);
|
||||
} else {
|
||||
SortableColumn<LeaderboardRowDTO, ?> columnToSortFor = getDefaultSortColumn();
|
||||
// if no sorting was selected, sort by ascending rank and mark
|
||||
// table header so
|
||||
sort(columnToSortFor, true);
|
||||
}
|
||||
// Reselect the selected rows
|
||||
clearSelection();
|
||||
for (LeaderboardRowDTO row : data.getList()) {
|
||||
if (competitorSelectionProvider.isSelected(row.competitor)) {
|
||||
leaderboardSelectionModel.setSelected(row, true);
|
||||
getData().getList().addAll(getRowsToDisplay(leaderboard));
|
||||
for (int i = 0; i < getLeaderboardTable().getColumnCount(); i++) {
|
||||
SortableColumn<?, ?> c = (SortableColumn<?, ?>) getLeaderboardTable().getColumn(i);
|
||||
c.updateMinMax(leaderboard);
|
||||
// Toggle pre-selected race, if the setting is set and it isn't open yet
|
||||
if (!autoExpandPerformedOnce && isAutoExpandPreSelectedRace() && c instanceof RaceColumn<?>
|
||||
&& ((RaceColumn<?>) c).getRace().hasTrackedRace(preSelectedRace)) {
|
||||
ExpandableSortableColumn<?> expandableSortableColumn = (ExpandableSortableColumn<?>) c;
|
||||
if (!expandableSortableColumn.isExpanded()) {
|
||||
expandableSortableColumn.toggleExpansion();
|
||||
autoExpandPerformedOnce = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Comparator<LeaderboardRowDTO> comparator = getComparatorForSelectedSorting();
|
||||
if (comparator != null) {
|
||||
Collections.sort(getData().getList(), comparator);
|
||||
} else {
|
||||
SortableColumn<LeaderboardRowDTO, ?> columnToSortFor = getDefaultSortColumn();
|
||||
// if no sorting was selected, sort by ascending rank and mark
|
||||
// table header so
|
||||
sort(columnToSortFor, true);
|
||||
}
|
||||
// Reselect the selected rows
|
||||
clearSelection();
|
||||
for (LeaderboardRowDTO row : data.getList()) {
|
||||
if (competitorSelectionProvider.isSelected(row.competitor)) {
|
||||
leaderboardSelectionModel.setSelected(row, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Based on the {@link #selectedRaceColumns}' {@link RaceColumnDTO#getDelayToLiveInMillis()} for the race that has
|
||||
* the latest {@link RaceColumnDTO#getStartDate(FleetDTO) start time}, if no {@link #settingsUpdatedExplicitly
|
||||
* explicit setting changes} were performed, automatically adjusts the delay accordingly.
|
||||
*/
|
||||
private void adjustDelayToLive() {
|
||||
if (!settingsUpdatedExplicitly) {
|
||||
long latestNonNullDelayToLiveInMillis = 0; // if we don't fine anything, use zero delay ("now")
|
||||
Date latestStartTime = new Date(0l);
|
||||
for (RaceColumnDTO raceColumn : selectedRaceColumns) {
|
||||
for (FleetDTO fleet : raceColumn.getFleets()) {
|
||||
Date startTime = raceColumn.getStartDate(fleet);
|
||||
if (startTime != null && startTime.after(latestStartTime)) {
|
||||
Long delayToLiveInMillis = raceColumn.getDelayToLiveInMillis(fleet);
|
||||
if (delayToLiveInMillis != null) {
|
||||
latestNonNullDelayToLiveInMillis = delayToLiveInMillis;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
setDelayInMilliseconds(latestNonNullDelayToLiveInMillis);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+9
-2
@@ -431,11 +431,13 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
RegattaAndRaceIdentifier raceIdentifier = null;
|
||||
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
|
||||
final FleetDTO fleetDTO = createFleetDTO(fleet);
|
||||
if (trackedRace != null) {
|
||||
raceColumnDTO.setDelayToLiveInMillis(fleetDTO, trackedRace.getDelayToLiveInMillis());
|
||||
raceIdentifier = new RegattaNameAndRaceName(trackedRace.getTrackedRegatta().getRegatta()
|
||||
.getName(), trackedRace.getRace().getName());
|
||||
}
|
||||
result.addRace(raceColumn.getName(), createFleetDTO(fleet), raceColumn.isMedalRace(),
|
||||
result.addRace(raceColumn.getName(), fleetDTO, raceColumn.isMedalRace(),
|
||||
raceIdentifier, /* StrippedRaceDTO */ null);
|
||||
}
|
||||
result.setCompetitorsFromBestToWorst(raceColumnDTO, getCompetitorDTOList(leaderboard.getCompetitorsFromBestToWorst(raceColumn, timePoint)));
|
||||
@@ -1796,8 +1798,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
StrippedRaceDTO race = null;
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
RegattaAndRaceIdentifier raceIdentifier = null;
|
||||
long delayToLiveInMillis = 0;
|
||||
if (raceColumn.getTrackedRace(fleet) != null) {
|
||||
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
|
||||
delayToLiveInMillis = trackedRace.getDelayToLiveInMillis();
|
||||
raceIdentifier = new RegattaNameAndRaceName(trackedRace.getTrackedRegatta().getRegatta().getName(), trackedRace.getRace().getName());
|
||||
// Optional: Getting the places of the race
|
||||
PlacemarkOrderDTO racePlaces = withGeoLocationData ? getRacePlaces(trackedRace) : null;
|
||||
@@ -1807,7 +1811,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
race.startOfTracking = trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asDate();
|
||||
race.endOfRace = trackedRace.getEndOfRace() == null ? null : trackedRace.getEndOfRace().asDate();
|
||||
}
|
||||
leaderboardDTO.addRace(raceColumn.getName(), createFleetDTO(fleet), raceColumn.isMedalRace(), raceIdentifier, race);
|
||||
final FleetDTO fleetDTO = createFleetDTO(fleet);
|
||||
RaceColumnDTO raceColumnDTO = leaderboardDTO.addRace(raceColumn.getName(), fleetDTO,
|
||||
raceColumn.isMedalRace(), raceIdentifier, race);
|
||||
raceColumnDTO.setDelayToLiveInMillis(fleetDTO, delayToLiveInMillis);
|
||||
}
|
||||
}
|
||||
leaderboardDTO.hasCarriedPoints = leaderboard.hasCarriedPoints();
|
||||
|
||||
+8
-7
@@ -126,23 +126,24 @@ public abstract class AbstractLeaderboardDTO implements IsSerializable {
|
||||
* @param fleetDTO
|
||||
* must not be null
|
||||
*/
|
||||
public void addRace(String raceColumnName, FleetDTO fleetDTO, boolean medalRace,
|
||||
public RaceColumnDTO addRace(String raceColumnName, FleetDTO fleetDTO, boolean medalRace,
|
||||
RegattaAndRaceIdentifier trackedRaceIdentifier, StrippedRaceDTO race) {
|
||||
assert fleetDTO != null;
|
||||
RaceColumnDTO raceInLeaderboardDTO = getOrCreateRaceColumn(raceColumnName);
|
||||
RaceColumnDTO raceColumnDTO = getOrCreateRaceColumn(raceColumnName);
|
||||
boolean contains = false;
|
||||
for (FleetDTO fleet : raceInLeaderboardDTO.getFleets()) {
|
||||
for (FleetDTO fleet : raceColumnDTO.getFleets()) {
|
||||
if (fleet.name.equals(fleetDTO.name)) {
|
||||
contains = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!contains) {
|
||||
raceInLeaderboardDTO.addFleet(fleetDTO);
|
||||
raceColumnDTO.addFleet(fleetDTO);
|
||||
}
|
||||
raceInLeaderboardDTO.setMedalRace(medalRace);
|
||||
raceInLeaderboardDTO.setRaceIdentifier(fleetDTO, trackedRaceIdentifier);
|
||||
raceInLeaderboardDTO.setRace(fleetDTO, race);
|
||||
raceColumnDTO.setMedalRace(medalRace);
|
||||
raceColumnDTO.setRaceIdentifier(fleetDTO, trackedRaceIdentifier);
|
||||
raceColumnDTO.setRace(fleetDTO, race);
|
||||
return raceColumnDTO;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+10
@@ -17,11 +17,13 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable {
|
||||
private List<FleetDTO> fleets;
|
||||
private Map<FleetDTO, RegattaAndRaceIdentifier> trackedRaceIdentifiersPerFleet;
|
||||
private Map<FleetDTO, StrippedRaceDTO> racesPerFleet;
|
||||
private Map<FleetDTO, Long> delayToLiveInMillisPerFleet;
|
||||
|
||||
public RaceColumnDTO() {
|
||||
trackedRaceIdentifiersPerFleet = new HashMap<FleetDTO, RegattaAndRaceIdentifier>();
|
||||
racesPerFleet = new HashMap<FleetDTO, StrippedRaceDTO>();
|
||||
fleets = new ArrayList<FleetDTO>();
|
||||
delayToLiveInMillisPerFleet = new HashMap<FleetDTO, Long>();
|
||||
}
|
||||
|
||||
public String getRaceColumnName() {
|
||||
@@ -180,4 +182,12 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable {
|
||||
public void addFleet(FleetDTO fleet) {
|
||||
fleets.add(fleet);
|
||||
}
|
||||
|
||||
public long getDelayToLiveInMillis(FleetDTO fleet) {
|
||||
return delayToLiveInMillisPerFleet.get(fleet);
|
||||
}
|
||||
|
||||
public void setDelayToLiveInMillis(FleetDTO fleet, long delayToLiveInMillis) {
|
||||
this.delayToLiveInMillisPerFleet.put(fleet, delayToLiveInMillis);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user