From 16ada7f8a6a19c78b91572881dbf635cf5d86e6c Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 11 Apr 2018 10:15:10 +0200 Subject: [PATCH 01/10] Bug 4492: Adjusted StatisticsTest to correctly work with asynchronous event handling --- .../server/statistics/StatisticsTest.java | 16 ------------ .../TrackedRaceStatisticsCacheImpl.java | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/statistics/StatisticsTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/statistics/StatisticsTest.java index 7dcc02f55b1..2babe24c709 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/statistics/StatisticsTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/statistics/StatisticsTest.java @@ -42,8 +42,6 @@ import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.MarkPassing; -import com.sap.sailing.domain.tracking.RaceListener; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; @@ -94,20 +92,6 @@ public class StatisticsTest { private TrackedRaceStatisticsCacheImpl getStatisticsCacheWithRegattaAdded() throws Exception { TrackedRaceStatisticsCacheImpl trackedRaceStatisticsCache = new TrackedRaceStatisticsCacheImpl(); trackedRaceStatisticsCache.regattaAdded(regatta); - - // The following lines ensure that we received all necessary events from the TrackedRegatta - // When removing a listener we get a Future whose get method will block until all previously triggered events are processed. - RaceListener raceListener = new RaceListener() { - @Override - public void raceRemoved(TrackedRace trackedRace) { - } - @Override - public void raceAdded(TrackedRace trackedRace) { - } - }; - regatta.addRaceListener(raceListener, Optional.empty()); - regatta.removeRaceListener(raceListener).get(); - return trackedRaceStatisticsCache; } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java index bcca439e7d8..9b23b81db2f 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java @@ -76,7 +76,12 @@ public class TrackedRaceStatisticsCacheImpl extends AbstractTrackedRegattaAndRac /** * For testing purposes only! */ - public TrackedRaceStatistics getStatisticsWaitingForLatest(TrackedRace trackedRace) { + public TrackedRaceStatistics getStatisticsWaitingForLatest(TrackedRace trackedRace) throws InterruptedException { + synchronized (listeners) { + while (!listeners.containsKey(trackedRace)) { + listeners.wait(); + } + } return cache.get(trackedRace, true); } @@ -84,9 +89,12 @@ public class TrackedRaceStatisticsCacheImpl extends AbstractTrackedRegattaAndRac protected void onRaceAdded(RegattaAndRaceIdentifier raceIdentifier, DynamicTrackedRegatta trackedRegatta, DynamicTrackedRace trackedRace) { Listener listener = new Listener(trackedRace); - listeners.put(trackedRace, listener); - trackedRace.addListener(listener); - triggerUpdateDirect(trackedRace); + synchronized (listeners) { + listeners.put(trackedRace, listener); + trackedRace.addListener(listener); + triggerUpdateDirect(trackedRace); + listeners.notifyAll(); + } } private void triggerUpdateScheduled(final DynamicTrackedRace trackedRace) { @@ -116,9 +124,12 @@ public class TrackedRaceStatisticsCacheImpl extends AbstractTrackedRegattaAndRac @Override protected void onRaceRemoved(DynamicTrackedRace trackedRace) { - Listener listener = listeners.remove(trackedRace); - if (listener != null) { - trackedRace.removeListener(listener); + synchronized (listeners) { + Listener listener = listeners.remove(trackedRace); + if (listener != null) { + trackedRace.removeListener(listener); + } + listeners.notifyAll(); } // To prevent leakage of TrackedRace instances as keys in the cache, From ce659a6b97cd741213da645aca2e59b2444a523e Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 11 Apr 2018 10:18:41 +0200 Subject: [PATCH 02/10] Bug 4492: Adjusted test cases to correctly work with asynchronous event handling --- .../impl/CreateAndTrackWithRaceLogTest.java | 43 +++++-------------- .../fixtracker/RaceLogFixTrackerManager.java | 8 ++++ 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 286b25910ee..91b31618038 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -11,7 +11,6 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.util.Collections; -import java.util.Optional; import java.util.UUID; import org.junit.After; @@ -62,11 +61,11 @@ import com.sap.sailing.domain.racelogtracking.test.RaceLogTrackingTestHelper; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.RaceHandle; -import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.impl.RacingEventServiceImpl; +import com.sap.sailing.server.util.WaitForTrackedRaceUtil; import com.sap.sse.common.NoCorrespondingServiceRegisteredException; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -129,7 +128,7 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { Exception { RaceColumn column = leaderboard.getRaceColumnByName(columnName); exception.expect(NotDenotedForRaceLogTrackingException.class); - trackRace(column); + trackAndGetRace(column); } private void testSize(Track track, int expected) { @@ -201,15 +200,12 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { raceLog.add(new RaceLogRegisterCompetitorEventImpl(t(), author, 0, comp1, boat1)); raceLog.add(new RaceLogStartOfTrackingEventImpl(t(0), author, /* passId */ 0)); // start tracking - trackRace(column); - - - // now there is a tracked race - TrackedRace race = column.getTrackedRace(fleet); + TrackedRace race = trackAndGetRace(column); assertNotNull(race); RaceLogFixTrackerManager raceLogFixTrackerManager = new RaceLogFixTrackerManager((DynamicTrackedRace) race, sensorFixStore, null); + raceLogFixTrackerManager.waitForTracker(); race.waitForLoadingToFinish(); addFixes1(race, comp1, dev1); regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), t(), author, 0, comp1, dev1, t(11), t(20))); @@ -224,21 +220,10 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { addFixes3(race, comp1, dev1); } - private void trackRace(RaceColumn column) throws NotDenotedForRaceLogTrackingException, Exception { + private TrackedRace trackAndGetRace(RaceColumn column) throws NotDenotedForRaceLogTrackingException, Exception { final RaceHandle raceHandle = adapter.startTracking(service, leaderboard, column, fleet, /* trackWind */ false, /* correctWindDirectionByMagneticDeclination */ false); - - // The following lines ensure that we received all necessary events from the TrackedRegatta - // When removing a listener we get a Future whose get method will block until all previously triggered events are processed. - final RaceListener raceListener = new RaceListener() { - @Override - public void raceRemoved(TrackedRace trackedRace) { - } - @Override - public void raceAdded(TrackedRace trackedRace) { - } - }; - raceHandle.getTrackedRegatta().addRaceListener(raceListener, Optional.empty()); - raceHandle.getTrackedRegatta().removeRaceListener(raceListener).get(); + raceHandle.getRace(); + return WaitForTrackedRaceUtil.waitForTrackedRace(column, fleet, 10); } /** @@ -254,10 +239,7 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { raceLog = column.getRaceLog(fleet); adapter.denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, "race"); // start tracking - adapter.startTracking(service, leaderboard, column, fleet, /* trackWind */ false, /* correctWindDirectionByMagneticDeclination */ false); - - // now there is a trackedrace - TrackedRace race = column.getTrackedRace(fleet); + TrackedRace race = trackAndGetRace(column); assertNotNull(race); final TimePoint startTimeInRaceLog = new MillisecondsTimePoint(123456); final TimePoint endTimeInRaceLog = new MillisecondsTimePoint(234567); @@ -275,8 +257,7 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { // now remove the tracked race and track again; again, the explicit tracking times in the race log must prevail service.removeRace(regatta, race.getRace()); - trackRace(column); - TrackedRace race2 = column.getTrackedRace(fleet); + TrackedRace race2 = trackAndGetRace(column); assertEquals(explicitStartOfTracking, race2.getStartOfTracking()); assertEquals(explicitEndOfTracking, race2.getEndOfTracking()); } @@ -299,14 +280,12 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { regattaLog.add(new RegattaLogRegisterCompetitorEventImpl(t(), t(), author, UUID.randomUUID(), comp1)); raceLog.add(new RaceLogStartOfTrackingEventImpl(t(0), author, /* passId */ 0)); - trackRace(column); - - // now there is a trackedrace - TrackedRace race = column.getTrackedRace(fleet); + TrackedRace race = trackAndGetRace(column); assertNotNull(race); RaceLogFixTrackerManager raceLogFixTrackerManager = new RaceLogFixTrackerManager((DynamicTrackedRace) race, sensorFixStore, null); + raceLogFixTrackerManager.waitForTracker(); race.waitForLoadingToFinish(); addFixes1(race, comp1, dev1); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RaceLogFixTrackerManager.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RaceLogFixTrackerManager.java index d8c29226b0e..ea9aa77f0ef 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RaceLogFixTrackerManager.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/fixtracker/RaceLogFixTrackerManager.java @@ -90,6 +90,7 @@ public class RaceLogFixTrackerManager implements TrackingDataLoader { } else { stopTrackerIfStillRunning(/* preemptive */ false, /* willBeRemoved */ false); } + this.notifyAll(); } private void addRaceLog(RaceLog raceLog) { @@ -153,4 +154,11 @@ public class RaceLogFixTrackerManager implements TrackingDataLoader { } return false; } + + public synchronized FixLoaderAndTracker waitForTracker() throws InterruptedException { + while (tracker == null) { + this.wait(); + } + return tracker; + } } From 91e258dc962faa6395888d7013bf6f7fe3d0a233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Wed, 11 Apr 2018 12:56:42 +0200 Subject: [PATCH 03/10] 60inch, fix shortname/sailid not shown --- ...RaceWithRacemapAndLeaderBoardPresenterImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java index 62ddb8dfa09..a5631168ceb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java @@ -152,21 +152,21 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl final SingleRaceLeaderboardSettings leaderboardSettings = new SingleRaceLeaderboardSettings( /* maneuverDetailsToShow */ null, /* legDetailsToShow */ null, /* raceDetailsToShow */ null, /* overallDetailsToShow */ null, /* delayBetweenAutoAdvancesInMilliseconds */ null, - /* showAddedScores */ false, /* showCompetitorShortNameColumn */ false, + /* showAddedScores */ false, /* showCompetitorShortNameColumn */ true, /* showCompetitorFullNameColumn */ false, /* isCompetitorNationalityColumnVisible */ false, /* showCompetitorBoatInfoColumn */ false, /* showRaceRankColumn */ true); timer = new com.sap.sse.gwt.client.player.Timer( // perform the first request as "live" but don't by default auto-play PlayModes.Live, PlayStates.Playing, /* delayBetweenAutoAdvancesInMilliseconds */ LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS); - leaderboardPanel = new SingleRaceLeaderboardPanel(null,null,sailingService, new AsyncActionsExecutor(), leaderboardSettings, - true, lifeRace, getPlace().getRaceMapSelectionProvider(), timer, null, - getSlideCtx().getContextDefinition().getLeaderboardName(), errorReporter, StringMessages.INSTANCE, + leaderboardPanel = new SingleRaceLeaderboardPanel(null, null, sailingService, new AsyncActionsExecutor(), + leaderboardSettings, true, lifeRace, getPlace().getRaceMapSelectionProvider(), timer, null, + getSlideCtx().getContextDefinition().getLeaderboardName(), errorReporter, StringMessages.INSTANCE, false, null, false, null, false, true, false, false, false, new SixtyInchLeaderBoardStyle(true), FlagImageResolverImpl.get()); - - getPlace().getRaceMap().setQuickRanksDTOProvider(new QuickRanksDTOFromLeaderboardDTOProvider(new RaceCompetitorSet(getPlace().getRaceMapSelectionProvider()), lifeRace)); - + getPlace().getRaceMap().setQuickRanksDTOProvider(new QuickRanksDTOFromLeaderboardDTOProvider( + new RaceCompetitorSet(getPlace().getRaceMapSelectionProvider()), lifeRace)); + view.startingWith(this, panel, getPlace().getRaceMap(), leaderboardPanel); selectionTimer.schedule(SWITCH_COMPETITOR_DELAY); } From 4011e98c6d2b6e03b405aafe73b2276be11f5006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Wed, 11 Apr 2018 14:31:02 +0200 Subject: [PATCH 04/10] sixty inch, fixed two other cases with missing sailid --- .../boats/RaceEndWithBoatsPresenterImpl.java | 2 +- .../PreLiveRaceLeaderBoardWithImagePresenterImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java index 8336e6ff22c..8fd94fdc5ed 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/afterliveraceloop/boats/RaceEndWithBoatsPresenterImpl.java @@ -61,7 +61,7 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured Date: Thu, 12 Apr 2018 08:27:27 +0200 Subject: [PATCH 05/10] Bug 4492: fixed another timing problem in a test case --- .../impl/CreateAndTrackWithRaceLogTest.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java index 246b93049b0..b47ed62c6d1 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java @@ -12,6 +12,8 @@ import java.net.MalformedURLException; import java.net.URISyntaxException; import java.util.Collections; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -63,6 +65,7 @@ import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.RaceHandle; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.impl.RacingEventServiceImpl; import com.sap.sailing.server.util.WaitForTrackedRaceUtil; @@ -259,7 +262,7 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { // now remove the tracked race and track again; again, the explicit tracking times in the race log must prevail service.removeRace(regatta, race.getRace()); TrackedRace race2 = trackAndGetRace(column); - assertEquals(explicitStartOfTracking, race2.getStartOfTracking()); + assertEquals(explicitStartOfTracking, waitForStartOfTracking(race2)); assertEquals(explicitEndOfTracking, race2.getEndOfTracking()); } @@ -301,4 +304,35 @@ public class CreateAndTrackWithRaceLogTest extends RaceLogTrackingTestHelper { raceLogFixTrackerManager.stop(false, /* willBeRemoved */ false); addFixes3(race, comp1, dev1); } + + + /** + * Waits for startOfTracking being available for a given {@link TrackedRace}. + */ + public static TimePoint waitForStartOfTracking(TrackedRace trackedRace) { + final CompletableFuture future = new CompletableFuture<>(); + + final AbstractRaceChangeListener listener = new AbstractRaceChangeListener() { + @Override + public void startOfTrackingChanged(TimePoint oldStartOfTracking, TimePoint newStartOfTracking) { + if (newStartOfTracking != null) { + future.complete(newStartOfTracking); + trackedRace.removeListener(this); + } + } + }; + trackedRace.addListener(listener); + final TimePoint startOfTracking = trackedRace.getStartOfTracking(); + if (startOfTracking != null) { + trackedRace.removeListener(listener); + return startOfTracking; + } + + try { + return future.get(10, TimeUnit.SECONDS); + } catch (Exception e) { + trackedRace.removeListener(listener); + return null; + } + } } From dc04ebdcdb303f727ddf66da80595a265b770f86 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 12 Apr 2018 09:43:32 +0200 Subject: [PATCH 06/10] fixed typo in variable name Change-Id: I0e94e1d2d5a803576b25765076c1a9f2ba075fb6 --- ...iveRaceWithRacemapAndLeaderBoardPresenterImpl.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java index a5631168ceb..bc25a44f80b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/places/screens/liveraceloop/racemapwithleaderboard/LiveRaceWithRacemapAndLeaderBoardPresenterImpl.java @@ -140,11 +140,11 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl } SailingServiceAsync sailingService = getClientFactory().getSailingService(); ErrorReporter errorReporter = getClientFactory().getErrorReporter(); - RegattaAndRaceIdentifier lifeRace = getSlideCtx().getLiveRace(); + RegattaAndRaceIdentifier liveRace = getSlideCtx().getLiveRace(); ArrayList racesToShow = null; - if (lifeRace != null) { + if (liveRace != null) { racesToShow = new ArrayList<>(); - racesToShow.add(lifeRace.getRaceName()); + racesToShow.add(liveRace.getRaceName()); } else { view.showErrorNoLive(this, panel, new IllegalStateException("No race is live")); return; @@ -160,13 +160,12 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl PlayModes.Live, PlayStates.Playing, /* delayBetweenAutoAdvancesInMilliseconds */ LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS); leaderboardPanel = new SingleRaceLeaderboardPanel(null, null, sailingService, new AsyncActionsExecutor(), - leaderboardSettings, true, lifeRace, getPlace().getRaceMapSelectionProvider(), timer, null, + leaderboardSettings, true, liveRace, getPlace().getRaceMapSelectionProvider(), timer, null, getSlideCtx().getContextDefinition().getLeaderboardName(), errorReporter, StringMessages.INSTANCE, false, null, false, null, false, true, false, false, false, new SixtyInchLeaderBoardStyle(true), FlagImageResolverImpl.get()); getPlace().getRaceMap().setQuickRanksDTOProvider(new QuickRanksDTOFromLeaderboardDTOProvider( - new RaceCompetitorSet(getPlace().getRaceMapSelectionProvider()), lifeRace)); - + new RaceCompetitorSet(getPlace().getRaceMapSelectionProvider()), liveRace)); view.startingWith(this, panel, getPlace().getRaceMap(), leaderboardPanel); selectionTimer.schedule(SWITCH_COMPETITOR_DELAY); } From 6b1ffa52b5814b03cd277976dfdf859a0d62011a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 12 Apr 2018 10:18:51 +0200 Subject: [PATCH 07/10] removed extra ":" at end of string message Change-Id: I6f47ce07c8abe4260f9307887773d8158210697a --- .../sailing/domain/base/impl/TransientCompetitorStoreImpl.java | 1 - .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java index f91e7e23f87..426ba1433fa 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java @@ -725,7 +725,6 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab boatDTO = convertToBoatDTO(boat); } CompetitorDTO competitorDTO = new CompetitorDTOImpl(c, boatDTO); - return competitorDTO; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 036ce003fde..77047229f3f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1869,7 +1869,7 @@ selectCompetitorsToEliminate=Select competitors to eliminate trackedRaceAlreadyLinked=The race is already linked to a race column. Do you really want to change the link? boatAlreadyLinked=The boat is already linked to a competitor chooseAAutoplayConfiguration=Choose an autoplay configuration -raceRankShort=Race rank: +raceRankShort=Race rank showRaceRankColumn=Show race rank estimatedDistance=Estimated Distance estimatedTime=Estimated Time From 96d68ff07d3b28f044b286698740c58489c6da69 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 12 Apr 2018 10:57:44 +0200 Subject: [PATCH 08/10] show a short name only in the leaderboard if its not empty; set short name and e-mail to null if empty in edit dialog Change-Id: I49049ca5802de9609fbd272e354aa9b7ea49207c --- .../com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java | 2 +- .../sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java index 54592fb6494..aa249733c4d 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java @@ -63,7 +63,7 @@ public class CompetitorDTOImpl extends CompetitorWithoutBoatDTOImpl implements C @Override public String getShortInfo() { String result = null; - if (getShortName() != null) { + if (getShortName() != null && !getShortName().trim().isEmpty()) { result = getShortName(); } else if (getBoat() != null) { result = getBoat().getSailId() != null ? getBoat().getSailId() : getBoat().getName(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java index 28e66fcaab3..3ca32ce1378 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java @@ -185,7 +185,9 @@ public class CompetitorEditDialog extends DataEntryDialog { color = new InvalidColor(iae); } } - CompetitorDTO result = new CompetitorDTOImpl(name.getText(), shortName.getText(), color, email.getText(), + CompetitorDTO result = new CompetitorDTOImpl(name.getText(), + shortName.getText().trim().isEmpty() ? null : shortName.getText(), color, + email.getText().trim().isEmpty() ? null : email.getText(), /* twoLetterIsoCountryCode */ null, threeLetterIocCountryCode.getValue(threeLetterIocCountryCode.getSelectedIndex()), /* countryName */ null, competitorToEdit.getIdAsString(), From bbab535002a08335879e063e208b56aabbcafb4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Thu, 12 Apr 2018 11:13:33 +0200 Subject: [PATCH 09/10] 60inch, fix for npe in PreLiveRaceWithRacemap --- .../sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java index 041025e2c0c..f94d8820c74 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.autoplay.client.utils; import java.util.ArrayList; import java.util.Date; import java.util.Map; +import java.util.Map.Entry; import java.util.UUID; import com.google.gwt.core.client.GWT; @@ -290,6 +291,9 @@ public class AutoplayHelper { final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(currentLiveRace, result); RaceCompetitorSelectionModel competitorSelectionProvider = new RaceCompetitorSelectionModel( /* hasMultiSelection */ true, colorProvider); + for (Entry entry : result.entrySet()) { + competitorSelectionProvider.setBoat(entry.getKey(), entry.getValue()); + } competitorSelectionProvider.setCompetitors(competitors); RaceMap raceboardPerspective = new RaceMap(null, null, raceMapLifecycle, settings, sailingService, asyncActionsExecutor, errorReporter, raceboardTimer, competitorSelectionProvider, From 4ee125040937638dc7f71fa6b1598e40c9106dfe Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 12 Apr 2018 12:33:46 +0200 Subject: [PATCH 10/10] pass competitor/boat mapping through to RaceCompetitorSelectionModel; from there extract all competitors and boat mapping Change-Id: Ibbcd0d89fc0ab95811da8fd53969189483cadef6 --- .../widgets/startanalysis/card/StartAnalysisCard.java | 6 +----- .../gwt/autoplay/client/utils/AutoplayHelper.java | 9 ++------- .../sailing/gwt/ui/client/CompetitorSelectionModel.java | 2 +- .../gwt/ui/client/RaceCompetitorSelectionModel.java | 7 +++++-- .../ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java | 8 ++++---- .../com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java | 2 +- 6 files changed, 14 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java index e8aa94cfe14..e77052ae87b 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/widgets/startanalysis/card/StartAnalysisCard.java @@ -24,8 +24,6 @@ import com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.rankingtable. import com.sap.sailing.dashboards.gwt.shared.StartlineAdvantageType; import com.sap.sailing.dashboards.gwt.shared.dto.StartAnalysisDTO; import com.sap.sailing.domain.common.racelog.RacingProcedureType; -import com.sap.sailing.gwt.ui.client.CompetitorColorProvider; -import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl; import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; @@ -75,7 +73,6 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna private SailingServiceAsync sailingServiceAsync; private StringMessages stringMessages; private final RaceCompetitorSelectionModel competitorSelectionModel; - private final CompetitorColorProvider colorProvider; private final double WIND_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 185; private final double GEOMETRIC_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 210; @@ -87,8 +84,7 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna stringMessages = StringMessages.INSTANCE; this.sailingServiceAsync = sailingServiceAsync; this.raceMapResources = raceMapResources; - colorProvider = new CompetitorColorProviderImpl(); - competitorSelectionModel = new RaceCompetitorSelectionModel(/* hasMultiSelection */true, colorProvider); + competitorSelectionModel = new RaceCompetitorSelectionModel(/* hasMultiSelection */true); competitorSelectionModel.setCompetitors(startAnalysisDTO.getCompetitorDTOsFromStartAnaylsisCompetitorDTOs(), raceMap); initWidget(uiBinder.createAndBindUi(this)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java index 041025e2c0c..2e3661fdd7d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java @@ -197,16 +197,14 @@ public class AutoplayHelper { public void raceTimesInfosReceived(Map raceTimesInfo, long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest, long clientTimeWhenResponseWasReceived) { - // keep the creationTime updated upon liveChanges! creationTimer.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest, clientTimeWhenResponseWasReceived); creationTimer .setLivePlayDelayInMillis(raceTimesInfo.get(regattaAndRaceIdentifier).delayToLiveInMs); creationTimer.play(); - if (regattaAndRaceIdentifier != null) { - if(!mapAlreadyCreated){ + if (!mapAlreadyCreated) { mapAlreadyCreated = true; sailingService.getCompetitorBoats(regattaAndRaceIdentifier, new AsyncCallback>() { @@ -280,16 +278,13 @@ public class AutoplayHelper { typesToConsiderOnZoom.add(ZoomTypes.BUOYS); typesToConsiderOnZoom.add(ZoomTypes.BOATS); RaceMapZoomSettings autoFollowRace = new RaceMapZoomSettings(typesToConsiderOnZoom, true); - RaceMapSettings settings = new RaceMapSettings(autoFollowRace, new RaceMapHelpLinesSettings(), false, 15, 100000l, false, RaceMapSettings.DEFAULT_BUOY_ZONE_RADIUS, false, true, false, false, false, false, RaceMapSettings.getDefaultManeuvers(), false, false); - RaceMapLifecycle raceMapLifecycle = new RaceMapLifecycle(StringMessages.INSTANCE); - final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(currentLiveRace, result); RaceCompetitorSelectionModel competitorSelectionProvider = new RaceCompetitorSelectionModel( - /* hasMultiSelection */ true, colorProvider); + /* hasMultiSelection */ true, colorProvider, result); competitorSelectionProvider.setCompetitors(competitors); RaceMap raceboardPerspective = new RaceMap(null, null, raceMapLifecycle, settings, sailingService, asyncActionsExecutor, errorReporter, raceboardTimer, competitorSelectionProvider, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java index b9400ddab0a..3820f46b9ef 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java @@ -46,7 +46,7 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider { this.hasMultiSelection = hasMultiSelection; this.competitorColorProvider = competitorColorProvider; this.competitorsFilterSet = competitorsFilterSet; - this.allCompetitors = new LinkedHashSet(); + this.allCompetitors = new LinkedHashSet<>(); this.selectedCompetitors = new LinkedHashMap<>(); this.listeners = new HashSet(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceCompetitorSelectionModel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceCompetitorSelectionModel.java index 4a17af31d65..dd58672ea10 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceCompetitorSelectionModel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceCompetitorSelectionModel.java @@ -9,14 +9,17 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sse.common.Color; public class RaceCompetitorSelectionModel extends CompetitorSelectionModel implements RaceCompetitorSelectionProvider { - private final Map boatsOfCompetitors = new HashMap<>(); + private final Map boatsOfCompetitors; public RaceCompetitorSelectionModel(boolean hasMultiSelection) { super(hasMultiSelection); + boatsOfCompetitors = new HashMap<>(); } - public RaceCompetitorSelectionModel(boolean hasMultiSelection, CompetitorColorProvider competitorColorProvider) { + public RaceCompetitorSelectionModel(boolean hasMultiSelection, CompetitorColorProvider competitorColorProvider, Map boatsOfCompetitors) { super(hasMultiSelection, competitorColorProvider); + this.boatsOfCompetitors = boatsOfCompetitors; + addAll(boatsOfCompetitors.keySet()); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 9452d65a809..33bc3502c0e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -202,9 +202,9 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorsAndBoats); final RaceCompetitorSelectionProvider competitorSelection; if (showCompetitors) { - competitorSelection = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider); + competitorSelection = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider, competitorsAndBoats); } else { - competitorSelection = createEmptyFilterCompetitorModel(colorProvider); // show no competitors + competitorSelection = createEmptyFilterCompetitorModel(colorProvider, competitorsAndBoats); // show no competitors } final RaceMap raceMap = new RaceMap(null, null, new RaceMapLifecycle(getStringMessages()), raceMapSettings, sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, @@ -232,8 +232,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint timer.setTime(timer.getTime().getTime()-1000l); } - private RaceCompetitorSelectionProvider createEmptyFilterCompetitorModel(CompetitorColorProvider colorProvider) { - final RaceCompetitorSelectionModel result = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider); + private RaceCompetitorSelectionProvider createEmptyFilterCompetitorModel(CompetitorColorProvider colorProvider, Map competitorsAndBoats) { + final RaceCompetitorSelectionModel result = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider, competitorsAndBoats); final FilterSet> filterSet = result.getOrCreateCompetitorsFilterSet("Empty"); filterSet.addFilter(new Filter() { @Override public boolean matches(CompetitorDTO object) { return false; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index f0ad825a4b3..ca586d252ff 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -211,7 +211,7 @@ public class RaceBoardPanel timeRangeWithZoomModel = new TimeRangeWithZoomModel(); final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorsAndTheirBoats); - competitorSelectionProvider = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider); + competitorSelectionProvider = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider, competitorsAndTheirBoats); raceMapResources.raceMapStyle().ensureInjected(); RaceMapLifecycle raceMapLifecycle = lifecycle.getRaceMapLifecycle();