From 2bbeda0d4543c301c4e7ea17399df298bbc4b0db Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sun, 10 May 2020 19:37:46 +0200 Subject: [PATCH] bug3465: fix duplicates in RegattaOverview list --- .../client/RegattaOverviewPanel.java | 7 ------ .../gwt/ui/server/SailingServiceImpl.java | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java index 5def1e80d2f..32f164ec8cd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java @@ -81,7 +81,6 @@ public class RegattaOverviewPanel extends SimplePanel { final ErrorReporter errorReporter, final StringMessages stringMessages, RegattaOverviewContextDefinition regattaOverviewContextDefinition) { - this.sailingService = sailingService; this.stringMessages = stringMessages; this.errorReporter = errorReporter; @@ -91,29 +90,24 @@ public class RegattaOverviewPanel extends SimplePanel { this.eventDTO = null; this.raceGroupDTOs = new ArrayList(); this.userService = userService; - mainPanel = new VerticalPanel(); setWidget(mainPanel); mainPanel.setWidth("100%"); mainPanel.addStyleName(style.contentWrapper()); - refreshNowButton = new Anchor(stringMessages.refreshNow()); refreshNowButton.setStyleName(RES.mainCss().button()); refreshNowButton.addStyleName(style.button()); - refreshNowButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { regattaRaceStatesComponent.loadAndUpdateEventLog(); } - }); settingsButton = new Anchor(" ", true); settingsButton.ensureDebugId("RegattaOverviewSettingsButton"); settingsButton.setStyleName(style.settingsButton()); settingsButton.addStyleName(RES.mainCss().button()); settingsButton.addStyleName(style.button()); - settingsButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -138,7 +132,6 @@ public class RegattaOverviewPanel extends SimplePanel { startStopUpdatingButton.addStyleName(style.refreshButton_live()); } } - }); // FIXME The chained calls from here are independent from each other and should be implemented with Dispatching Framework sailingService.getEventById(regattaOverviewContextDefinition.getEvent(), false, new MarkedAsyncCallback( diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index e302378f79a..0756debdfb0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -5561,15 +5561,19 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet newEvent.getWindFinderReviewedSpotsCollectionIds()); } + private Triple getLeaderboardSlotKey(RegattaOverviewEntryDTO entry) { + return new Triple<>(entry.leaderboardName, entry.raceInfo.raceName, entry.raceInfo.fleetName); + } + @Override public List getRaceStateEntriesForRaceGroup(UUID eventId, List visibleCourseAreaIds, List visibleRegattas, boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, Duration clientTimeZoneOffset) throws NoWindException, InterruptedException, ExecutionException { - List result = new ArrayList(); Calendar dayToCheck = Calendar.getInstance(); dayToCheck.setTime(new Date()); Event event = getService().getEvent(eventId); getSecurityService().checkCurrentUserReadPermission(event); + final Map, RegattaOverviewEntryDTO> entriesByRaceIdentifier = new HashMap<>(); if (event != null) { for (CourseArea courseArea : event.getVenue().getCourseAreas()) { if (visibleCourseAreaIds.contains(courseArea.getId())) { @@ -5579,20 +5583,24 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet // race entries that either have no course area explicitly defined or otherwise have // a course area that is part of the visibleCourseAreaIds if (Util.contains(leaderboard.getCourseAreas(), courseArea)) { - Util.addAll( - Util.filter( - getRaceStateEntriesForLeaderboard(leaderboard.getName(), + for (final RegattaOverviewEntryDTO entry : getRaceStateEntriesForLeaderboard(leaderboard.getName(), showOnlyCurrentlyRunningRaces, showOnlyRacesOfSameDay, clientTimeZoneOffset, - visibleRegattas), - entry->entry.courseAreaIdAsString == null || visibleCourseAreaIds.contains(UUID.fromString( - entry.courseAreaIdAsString))), result); + visibleRegattas)) { + // use "leaderboard slot key" consisting of leaderboard name / race column name / fleet name + // because the raceInfo.raceIdentifier could be null as no TrackedRace has to be attached + if (!entriesByRaceIdentifier.containsKey(getLeaderboardSlotKey(entry)) && + (entry.courseAreaIdAsString == null || visibleCourseAreaIds.contains(UUID.fromString( + entry.courseAreaIdAsString)))) { + entriesByRaceIdentifier.put(getLeaderboardSlotKey(entry), entry); + } + } } } } } } } - return result; + return new ArrayList<>(entriesByRaceIdentifier.values()); } /**