From a8bc97c9d25ff6ad680a178b31347f7953c59cd3 Mon Sep 17 00:00:00 2001 From: fmittag Date: Thu, 20 Sep 2012 17:55:57 +0200 Subject: [PATCH] - Added hasWindData() and hasGPSData() to TrackedRace to easily get information about races with unsufficient data for the raceboard. - Added the display of these new properties in the AdminConsole (TrackedRaces view) - unified usage of RaceAndRegattaIdentifier instead of RaceIdentifierer in many function calls - Refactored RaceDTO/StrippedRaceDTO and removed unused data in these classes --- .../sailing/domain/common/RaceFetcher.java | 2 +- .../domain/test/mock/MockedTrackedRace.java | 12 ++ ...ockedTrackedRaceWithStartTimeAndRanks.java | 12 ++ .../sailing/domain/tracking/TrackedRace.java | 15 ++- .../domain/tracking/impl/TrackedRaceImpl.java | 33 ++++++ java/com.sap.sailing.gwt.ui/Spectator.css | 26 ++++- .../images/btn-cta-blue.png | Bin 0 -> 779 bytes .../ui/actions/GetBoatPositionsAction.java | 6 +- .../actions/GetCompetitorsRaceDataAction.java | 6 +- .../ui/actions/GetCoursePositionsAction.java | 6 +- .../gwt/ui/actions/GetQuickRankAction.java | 6 +- .../gwt/ui/actions/GetRaceMapDataAction.java | 6 +- .../gwt/ui/actions/GetWindInfoAction.java | 8 +- .../adminconsole/LeaderboardConfigPanel.java | 6 +- .../ui/adminconsole/RacesListBoxPanel.java | 2 +- .../TrackedRaceChangedListener.java | 4 +- .../TrackedRacesListComposite.java | 86 +++++++++------ .../TrackedRacesManagementPanel.java | 14 +-- .../gwt/ui/adminconsole/WindPanel.java | 41 ++++--- .../ui/adminconsole/WindSettingDialog.java | 13 ++- .../sailing/gwt/ui/client/RaceTimePanel.java | 5 +- .../gwt/ui/client/RaceTimesInfoProvider.java | 18 +-- .../client/RaceTimesInfoProviderListener.java | 4 +- .../sailing/gwt/ui/client/SailingService.java | 39 ++++--- .../gwt/ui/client/SailingServiceAsync.java | 40 +++---- .../gwt/ui/client/SmallWindHistoryPanel.java | 3 +- .../gwt/ui/leaderboard/TVViewPanel.java | 7 +- .../gwt/ui/server/SailingServiceImpl.java | 104 +++++++++--------- .../gwt/ui/shared/AbstractLeaderboardDTO.java | 2 +- .../sailing/gwt/ui/shared/RaceColumnDTO.java | 26 +++-- .../sap/sailing/gwt/ui/shared/RaceDTO.java | 44 ++++---- .../gwt/ui/shared/RaceTimesInfoDTO.java | 10 +- .../gwt/ui/shared/RaceWithCompetitorsDTO.java | 22 ++++ .../sap/sailing/gwt/ui/shared/RegattaDTO.java | 23 ++-- .../gwt/ui/shared/StrippedRaceDTO.java | 32 ------ .../sailing/gwt/ui/shared/TrackedRaceDTO.java | 29 +++++ .../gwt/ui/shared/charts/RaceChart.java | 6 +- .../gwt/ui/shared/racemap/RaceMap.java | 6 +- .../ui/spectator/LeaderboardGroupPanel.java | 25 +++-- ...estStoringAndLoadingEventsAndRegattas.java | 2 +- ...LeaderboardCorrectionsReplicationTest.java | 3 +- .../sailing/server/RacingEventService.java | 3 +- .../server/impl/RacingEventServiceImpl.java | 5 +- ...ConnectTrackedRaceToLeaderboardColumn.java | 6 +- 44 files changed, 463 insertions(+), 305 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/images/btn-cta-blue.png create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceWithCompetitorsDTO.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/StrippedRaceDTO.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackedRaceDTO.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java index 5ff5712cb4a..7c68382fc95 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java @@ -11,5 +11,5 @@ public interface RaceFetcher { */ Object getTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName); - Object getExistingTrackedRace(RaceIdentifier regattaNameAndRaceName); + Object getExistingTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName); } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index e998db6c74e..f926691547f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -676,4 +676,16 @@ public class MockedTrackedRace implements DynamicTrackedRace { // TODO Auto-generated method stub return null; } + + @Override + public boolean hasWindData() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean hasGPSData() { + // TODO Auto-generated method stub + return false; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index d723273c464..372da05efba 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -440,4 +440,16 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { // TODO Auto-generated method stub return null; } + + @Override + public boolean hasWindData() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean hasGPSData() { + // TODO Auto-generated method stub + return false; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 933697c2f4d..21155035e17 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -355,7 +355,20 @@ public interface TrackedRace extends Serializable { * time as the direction the wind comes from. */ boolean raceIsKnownToStartUpwind(); - + + /** + * Many calculations require valid wind data. In order to prevent NoWindException's to be handled by those calculation + * this method can be used to check whether the tracked race has sufficient wind information available. + * @return true if {@link #getWind(Position, TimePoint)} delivers a (not null) wind fix. + */ + boolean hasWindData(); + + /** + * + * @return true if at least one GPS fix for one of the competitors is available for this race. + */ + boolean hasGPSData(); + /** * Adds a race change listener to the set of listeners that will be notified about changes to this race. * The listener won't be serialized together with this object. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index e105651c73a..8df3f814ba8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -31,6 +31,7 @@ import com.sap.sailing.domain.base.BearingWithConfidence; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Buoy; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.CourseChange; import com.sap.sailing.domain.base.CourseListener; import com.sap.sailing.domain.base.Leg; @@ -1051,6 +1052,38 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { return result; } + @Override + public boolean hasWindData() { + boolean result = false; + Course course = getRace().getCourse(); + Waypoint firstWaypoint = course.getFirstWaypoint(); + TimePoint timepoint = startTime != null ? startTime : startOfTrackingReceived; + if(firstWaypoint != null && timepoint != null) { + Position position = getApproximatePosition(firstWaypoint, timepoint); + if(position != null) { + Wind wind = getWind(position, timepoint); + if(wind != null) { + result = true; + } + } + } + return result; + } + + @Override + public boolean hasGPSData() { + boolean result = false; + if(!tracks.values().isEmpty()) { + for(GPSFixTrack gpsTrack: tracks.values()) { + if(gpsTrack.getFirstRawFix() != null) { + result = true; + break; + } + } + } + return result; + } + @Override public Wind getWind(Position p, TimePoint at) { return getWind(p, at, getWindSourcesToExclude()); diff --git a/java/com.sap.sailing.gwt.ui/Spectator.css b/java/com.sap.sailing.gwt.ui/Spectator.css index 46c007f4ebb..45df3bafdc6 100644 --- a/java/com.sap.sailing.gwt.ui/Spectator.css +++ b/java/com.sap.sailing.gwt.ui/Spectator.css @@ -228,6 +228,21 @@ input.magnifier { font-family: 'UbuntuBold', Arial, Verdana, sans-serif; } +.leaderboardGroupPanel-LiveRace { + padding: 5px 8px; + display: block; + float: left; + margin: 5px 5px 5px 0; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + background: url("images/btn-cta-blue.png") repeat-x -10px 0 #e7e7e7; + text-decoration: none; + color: #fff; + /*border: 1px solid #a6a6a6;*/ + font-family: 'UbuntuBold', Arial, Verdana, sans-serif; +} + .leaderboardGroupPanel-ActiveLeaderboard { padding: 5px 8px; display: block; @@ -255,17 +270,24 @@ input.magnifier { display: inline-block; } -.leaderboardGroupPanel-ActiveRace:visited, .leaderboardGroupPanel-ActiveLeaderboard:visited, .leaderboardGroupPanel-ActiveButton:visited { +.leaderboardGroupPanel-ActiveRace:visited, .leaderboardGroupPanel-LiveRace:visited, .leaderboardGroupPanel-ActiveLeaderboard:visited, .leaderboardGroupPanel-ActiveButton:visited { color: #fff; } .leaderboardGroupPanel-ActiveRace:hover, .leaderboardGroupPanel-ActiveLeaderboard:hover, .leaderboardGroupPanel-ActiveButton:hover { text-decoration: none; color: #fff; - background: url("images/btn-cta-orangeleft.png") repeat-x -10px -30px #e7e7e7; + background: url("images/btn-cta-orangeleft.png") repeat-x -10px -30px #e7e7e7; /*border: 1px solid #f1af10;*/ } +.leaderboardGroupPanel-LiveRace:hover { + text-decoration: none; + color: #fff; + background: url("images/btn-cta-blue.png") repeat-x -10px -30px #e7e7e7; + /*border: 1px solid #f1af10;*/ +} + .welcomeWidget-WelcomePanel{ float: left; max-width: 1000px; diff --git a/java/com.sap.sailing.gwt.ui/images/btn-cta-blue.png b/java/com.sap.sailing.gwt.ui/images/btn-cta-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6a89b2b3e62178a6de2b9361ae2cb9407d985879 GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0y~yV15B)+iH=O_B))y0?hhVeu{EH zAHyjWgw4Xtp>=a0)CF{K;e1woS5Ah`(+(J`Ar0r60#5Ul9diWe6pf&7H3wO8ckG6Gr4o+}rER5p}f0CE)= zA^IA!uK@)W7~SuH1)&tHEKpD=0HP4WiLe*?Zg4HPL;xr=BT{?o{i&CWV$ELHW+$7y ziv_y2VRPiKA1{~g`}OsCY^-0r*ZbW;^S!NriVM{CemTDUf9{{B=i6&*|5V@hUw-=I zcO@$+pq$UMeQWpU*VRW)zx)}ZM;_958-FKf&;7Ib@-jd#y|xJzU*n{1Jayp zuCD=_#&GZrB#7@p!Zd0tSoR@QbnR`3ZaX1hU@~x8JOXRoaw)b2#JC6zV^kxcf>Gs1 zK!JCtk{uj|5&b*tdrGBcS%6|`W?WS}rC*mq!*F%&PlIdUlgln90_76IO8-{={&~4h nXM3{V@feqOphp`{-ucg*u_$|^cBK9-pc)2GS3j3^P6>> { private final SailingServiceAsync sailingService; - private final RaceIdentifier raceIdentifier; + private final RegattaAndRaceIdentifier raceIdentifier; private final Map from; private final Map to; private final boolean extrapolate; - public GetBoatPositionsAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, + public GetBoatPositionsAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, boolean extrapolate, AsyncCallback>> callback) { super(callback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCompetitorsRaceDataAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCompetitorsRaceDataAction.java index b3fd06701df..edab80d943a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCompetitorsRaceDataAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCompetitorsRaceDataAction.java @@ -5,7 +5,7 @@ import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.domain.common.DetailType; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.shared.CompetitorDTO; @@ -14,13 +14,13 @@ import com.sap.sailing.gwt.ui.shared.MultiCompetitorRaceDataDTO; public class GetCompetitorsRaceDataAction extends DefaultAsyncAction { private final SailingServiceAsync sailingService; - private final RaceIdentifier race; + private final RegattaAndRaceIdentifier race; private final List> competitorsQuery; private final Date toDate; private final long stepSize; private final DetailType detailType; - public GetCompetitorsRaceDataAction(SailingServiceAsync sailingService, RaceIdentifier race, List> competitorsQuery, + public GetCompetitorsRaceDataAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier race, List> competitorsQuery, Date toDate, long stepSize, DetailType detailType, AsyncCallback callback) { super(callback); this.sailingService = sailingService; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java index 8bb1a9190fe..aafae4e1ba5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java @@ -3,16 +3,16 @@ package com.sap.sailing.gwt.ui.actions; import java.util.Date; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.shared.CourseDTO; public class GetCoursePositionsAction extends DefaultAsyncAction { private final SailingServiceAsync sailingService; - private final RaceIdentifier raceIdentifier; + private final RegattaAndRaceIdentifier raceIdentifier; private final Date date; - public GetCoursePositionsAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date date, + public GetCoursePositionsAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback callback) { super(callback); this.sailingService = sailingService; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetQuickRankAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetQuickRankAction.java index 7acc5f4ea27..59d2faa88ff 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetQuickRankAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetQuickRankAction.java @@ -4,16 +4,16 @@ import java.util.Date; import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; public class GetQuickRankAction extends DefaultAsyncAction> { private final SailingServiceAsync sailingService; - private final RaceIdentifier raceIdentifier; + private final RegattaAndRaceIdentifier raceIdentifier; private final Date date; - public GetQuickRankAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date date, + public GetQuickRankAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback> callback) { super(callback); this.sailingService = sailingService; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetRaceMapDataAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetRaceMapDataAction.java index cb03ca21a1e..2c4f6c477f3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetRaceMapDataAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetRaceMapDataAction.java @@ -4,20 +4,20 @@ import java.util.Date; import java.util.Map; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.shared.CompetitorDTO; import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO; public class GetRaceMapDataAction extends DefaultAsyncAction { private final SailingServiceAsync sailingService; - private final RaceIdentifier raceIdentifier; + private final RegattaAndRaceIdentifier raceIdentifier; private final Map from; private final Map to; private final boolean extrapolate; private final Date date; - public GetRaceMapDataAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date date, + public GetRaceMapDataAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date date, Map from, Map to, boolean extrapolate, AsyncCallback callback) { super(callback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetWindInfoAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetWindInfoAction.java index c1c3ab241d9..9c896928915 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetWindInfoAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetWindInfoAction.java @@ -4,13 +4,13 @@ import java.util.Collection; import java.util.Date; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO; public class GetWindInfoAction extends DefaultAsyncAction { private final SailingServiceAsync sailingService; - private final RaceIdentifier raceIdentifier; + private final RegattaAndRaceIdentifier raceIdentifier; private Date from; private long millisecondsStepWidth; private int numberOfFixes; @@ -23,7 +23,7 @@ public class GetWindInfoAction extends DefaultAsyncAction { private enum CallVariants { Variant1, Variant2 }; private final CallVariants callVariant; - public GetWindInfoAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, + public GetWindInfoAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, Collection windSourceTypeNames, AsyncCallback callback) { super(callback); this.sailingService = sailingService; @@ -35,7 +35,7 @@ public class GetWindInfoAction extends DefaultAsyncAction { callVariant = CallVariants.Variant1; } - public GetWindInfoAction(SailingServiceAsync sailingService, RaceIdentifier raceIdentifier, Date fromDate, + public GetWindInfoAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date fromDate, Date toDate, long resolutionInMilliseconds, Collection windSourceTypeNames, AsyncCallback callback) { super(callback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 686a6665698..b28def90829 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -827,10 +827,10 @@ public class LeaderboardConfigPanel extends FormPanel implements RegattaDisplaye } @Override - public void changeTrackingRace(RegattaNameAndRaceName regattaNameAndRaceName, boolean isTracked) { + public void changeTrackingRace(RegattaAndRaceIdentifier regattaAndRaceIdentifier, boolean isTracked) { for (Pair raceColumnAndFleetName : raceColumnAndFleetList.getList()) { - if (raceColumnAndFleetName.getA().getRaceColumnName().equals(regattaNameAndRaceName.getRaceName())) { - raceColumnAndFleetName.getA().setRaceIdentifier(raceColumnAndFleetName.getB(), regattaNameAndRaceName); + if (raceColumnAndFleetName.getA().getRaceColumnName().equals(regattaAndRaceIdentifier.getRaceName())) { + raceColumnAndFleetName.getA().setRaceIdentifier(raceColumnAndFleetName.getB(), regattaAndRaceIdentifier); } } raceColumnAndFleetList.refresh(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RacesListBoxPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RacesListBoxPanel.java index aff8d31ab18..dc27eeddea1 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RacesListBoxPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RacesListBoxPanel.java @@ -112,7 +112,7 @@ public class RacesListBoxPanel extends FormPanel implements RegattaDisplayer, Ra } private String toString(RaceDTO race) { - return race.getRegatta().name+" - "+race.name+(race.currentlyTracked ? " ("+stringConstants.tracked()+")" : ""); + return race.getRegattaName()+" - "+race.name+(race.isTracked ? " ("+stringConstants.tracked()+")" : ""); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRaceChangedListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRaceChangedListener.java index 2c922f7df85..0e60e041455 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRaceChangedListener.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRaceChangedListener.java @@ -1,7 +1,7 @@ package com.sap.sailing.gwt.ui.adminconsole; -import com.sap.sailing.domain.common.RegattaNameAndRaceName; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; public interface TrackedRaceChangedListener { - void changeTrackingRace(RegattaNameAndRaceName regattaNameAndRaceName, boolean isTracked); + void changeTrackingRace(RegattaAndRaceIdentifier regattaAndRaceIdentifier, boolean isTracked); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index 0c7a6a4b7c5..a79200bd40b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -54,7 +54,6 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.URLFactory; -import com.sap.sailing.gwt.ui.shared.BoatClassDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.components.Component; @@ -123,7 +122,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< public TrackedRacesListComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter, final RegattaRefresher regattaRefresher, RaceSelectionProvider raceSelectionProvider, - StringMessages stringMessages, boolean hasMultiSelection) { + final StringMessages stringMessages, boolean hasMultiSelection) { this.sailingService = sailingService; this.errorReporter = errorReporter; this.regattaRefresher = regattaRefresher; @@ -166,7 +165,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< TextColumn regattaNameColumn = new TextColumn() { @Override public String getValue(RaceDTO raceDTO) { - return raceDTO.getRegatta().name; + return raceDTO.getRegattaName(); } }; regattaNameColumn.setSortable(true); @@ -174,15 +173,13 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< columnSortHandler.setComparator(regattaNameColumn, new Comparator() { @Override public int compare(RaceDTO t1, RaceDTO t2) { - RegattaDTO eventOne = t1.getRegatta(); - RegattaDTO eventTwo = t2.getRegatta(); + String regatta1Name = t1.getRegattaName(); + String regatta2Name = t2.getRegattaName(); boolean ascending = isSortedAscending(); - if (eventOne.name.equals(eventTwo.name)) { + if (regatta1Name.equals(regatta2Name)) { return 0; } - int val = -1; - val = (eventOne != null && eventTwo != null && ascending) ? (eventOne.name.compareTo(eventTwo.name)) - : -(eventTwo.name.compareTo(eventOne.name)); + int val = ascending ? regatta1Name.compareTo(regatta2Name) : -(regatta2Name.compareTo(regatta1Name)); return val; } @@ -195,8 +192,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< TextColumn boatClassNameColumn = new TextColumn() { @Override public String getValue(RaceDTO raceDTO) { - final BoatClassDTO boatClass = raceDTO.getRegatta().boatClass; - return boatClass == null ? "" : boatClass.name; + return raceDTO.boatClass == null ? "" : raceDTO.boatClass; } }; boatClassNameColumn.setSortable(true); @@ -204,16 +200,13 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< columnSortHandler.setComparator(boatClassNameColumn, new Comparator() { @Override public int compare(RaceDTO t1, RaceDTO t2) { - RegattaDTO regattaOne = t1.getRegatta(); - RegattaDTO regattaTwo = t2.getRegatta(); + String boatClass1 = t1.boatClass; + String boatClass2 = t2.boatClass; boolean ascending = isSortedAscending(); - if (regattaOne.boatClass.name.equals(regattaTwo.boatClass.name)) { + if (boatClass1.equals(boatClass2)) { return 0; } - int val = -1; - val = (regattaOne != null && regattaTwo != null && ascending) ? (regattaOne.boatClass.name - .compareTo(regattaTwo.boatClass.name)) : -(regattaTwo.boatClass.name - .compareTo(regattaOne.boatClass.name)); + int val = ascending ? boatClass1.compareTo(boatClass2) : -(boatClass2.compareTo(boatClass1)); return val; } @@ -227,7 +220,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< Column raceNameColumn = new Column(anchorCell) { @Override public SafeHtml getValue(RaceDTO raceDTO) { - if (raceDTO.currentlyTracked == true) { + if (raceDTO.isTracked == true) { RegattaNameAndRaceName raceIdentifier = (RegattaNameAndRaceName) raceDTO.getRaceIdentifier(); String debugParam = Window.Location.getParameter("gwt.codesvr"); String link = URLFactory.INSTANCE.encode("/gwt/RaceBoard.html?raceName=" @@ -294,18 +287,38 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< TextColumn raceTrackedColumn = new TextColumn() { @Override public String getValue(RaceDTO raceDTO) { - if (raceDTO.currentlyTracked == true) + if (raceDTO.isTracked == true) return "tracked"; return ""; } }; + TextColumn hasWindDataColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.isTracked && raceDTO.trackedRace.hasWindData == true) + return stringMessages.yes(); + else + return stringMessages.no(); + } + }; + + TextColumn hasGPSDataColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.isTracked && raceDTO.trackedRace.hasGPSData == true) + return stringMessages.yes(); + else + return stringMessages.no(); + } + }; + TextColumn raceLiveDelayColumn = new TextColumn() { @Override public String getValue(RaceDTO raceDTO) { - if (raceDTO.delayToLiveInMs > 0) - return "" + raceDTO.delayToLiveInMs / 1000; + if (raceDTO.trackedRace.delayToLiveInMs > 0) + return "" + raceDTO.trackedRace.delayToLiveInMs / 1000; return ""; } @@ -316,6 +329,9 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< raceTable.addColumn(raceNameColumn, stringMessages.race()); raceTable.addColumn(raceStartColumn, stringMessages.startTime()); raceTable.addColumn(raceTrackedColumn, stringMessages.tracked()); + raceTable.addColumn(hasWindDataColumn, "Wind data"); + raceTable.addColumn(hasGPSDataColumn, "GPS data"); + raceTable.addColumn(raceLiveDelayColumn, stringMessages.delayInSeconds()); raceTable.setWidth("300px"); raceTable.setSelectionModel(selectionModel); @@ -364,7 +380,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< @Override public void onClick(ClickEvent click) { for (RaceDTO selectedRace : getSelectedRaces()) { - if (selectedRace.currentlyTracked) { + if (selectedRace.isTracked) { stopTrackingRace(selectedRace); } } @@ -381,7 +397,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< } }); trackedRacesButtonPanel.add(btnRefresh); - + btnSetDelayToLive = new Button(stringMessages.setDelayToLive() + "..."); btnSetDelayToLive.addClickHandler(new ClickHandler() { @Override @@ -425,11 +441,11 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< return result; } - public void selectRaceByIdentifier(RaceIdentifier raceIdentifier) { + public void selectRaceByIdentifier(RegattaAndRaceIdentifier raceIdentifier) { if (raceList != null) { for (RaceDTO race : raceList.getList()) { - RegattaDTO event = race.getRegatta(); - if (event.name.equals(raceIdentifier.getRegattaName()) && race.name.equals(raceIdentifier.getRaceName())) { + String regattaName = race.getRegattaName(); + if (regattaName.equals(raceIdentifier.getRegattaName()) && race.name.equals(raceIdentifier.getRaceName())) { dontFireNextSelectionChangeEvent = true; selectionModel.setSelected(race, true); break; @@ -491,19 +507,19 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< } private void stopTrackingRace(final RaceDTO race) { - final RegattaNameAndRaceName regattaNameAndRaceName = (RegattaNameAndRaceName) race.getRaceIdentifier(); - sailingService.stopTrackingRace(regattaNameAndRaceName, new AsyncCallback() { + final RegattaAndRaceIdentifier regattaAndRaceIdentifier = race.getRaceIdentifier(); + sailingService.stopTrackingRace(regattaAndRaceIdentifier, new AsyncCallback() { @Override public void onFailure(Throwable caught) { errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in event " - + race.getRegatta().name + ": " + caught.getMessage()); + + race.getRegattaName() + ": " + caught.getMessage()); } @Override public void onSuccess(Void result) { regattaRefresher.fillRegattas(); for (TrackedRaceChangedListener listener : raceIsTrackedRaceChangeListener) { - listener.changeTrackingRace(regattaNameAndRaceName, false); + listener.changeTrackingRace(regattaAndRaceIdentifier, false); } } }); @@ -515,8 +531,8 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< new AsyncCallback() { @Override public void onFailure(Throwable caught) { - errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in event " - + race.getRegatta().name + ": " + caught.getMessage()); + errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in regatta " + + race.getRegattaName() + ": " + caught.getMessage()); } @Override @@ -538,8 +554,8 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< boolean failed = false; for (String word : wordsToFilter) { String textAsUppercase = word.toUpperCase().trim(); - if (!raceDTO.getRegatta().name.toUpperCase().contains(textAsUppercase) - && !raceDTO.getRegatta().boatClass.name.toUpperCase().contains(textAsUppercase) + if (!raceDTO.getRegattaName().toUpperCase().contains(textAsUppercase) + && !raceDTO.boatClass.toUpperCase().contains(textAsUppercase) && !raceDTO.name.toUpperCase().contains(textAsUppercase)) { failed = true; break; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesManagementPanel.java index 2817d1d80db..3dc4c6e829f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesManagementPanel.java @@ -58,19 +58,19 @@ public class TrackedRacesManagementPanel extends AbstractRaceManagementPanel { } else { raceDataGrid.setText(2, 1, ""); } - if(selectedRaceDTO.startOfTracking != null) { - raceDataGrid.setText(3, 1, dateFormatter.render(selectedRaceDTO.startOfTracking) + " " - + timeFormatter.render(selectedRaceDTO.startOfTracking)); + if(selectedRaceDTO.trackedRace.startOfTracking != null) { + raceDataGrid.setText(3, 1, dateFormatter.render(selectedRaceDTO.trackedRace.startOfTracking) + " " + + timeFormatter.render(selectedRaceDTO.trackedRace.startOfTracking)); } else { raceDataGrid.setText(3, 1, ""); } - if(selectedRaceDTO.endOfTracking != null) { - raceDataGrid.setText(4, 1, dateFormatter.render(selectedRaceDTO.endOfTracking) + " " - + timeFormatter.render(selectedRaceDTO.endOfTracking)); + if(selectedRaceDTO.trackedRace.endOfTracking != null) { + raceDataGrid.setText(4, 1, dateFormatter.render(selectedRaceDTO.trackedRace.endOfTracking) + " " + + timeFormatter.render(selectedRaceDTO.trackedRace.endOfTracking)); } else { raceDataGrid.setText(4, 1, ""); } - raceDataGrid.setText(5, 1, "" + selectedRaceDTO.delayToLiveInMs); + raceDataGrid.setText(5, 1, "" + selectedRaceDTO.trackedRace.delayToLiveInMs); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java index 6329d663cf6..9d73799b1f6 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java @@ -40,6 +40,7 @@ import com.sap.sailing.gwt.ui.client.RegattaDisplayer; import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.CourseDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.WindDTO; @@ -106,19 +107,18 @@ public class WindPanel extends FormPanel implements RegattaDisplayer, WindShower public void onClick(ClickEvent event) { RegattaAndRaceIdentifier selectedRace = getSelectedRace(); if(selectedRace != null) { - RaceDTO race = trackedRacesListComposite.getRaceByIdentifier(selectedRace); - WindSettingDialog windSettingDialog = new WindSettingDialog(race, stringMessages, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - } + final RaceDTO race = trackedRacesListComposite.getRaceByIdentifier(selectedRace); + sailingService.getCoursePositions(selectedRace, race.startOfRace, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + showWindSettingDialog(race, null); + } - @Override - public void onSuccess(final WindDTO result) { - addWindFix(result); - } - }); - windSettingDialog.show(); + @Override + public void onSuccess(final CourseDTO result) { + showWindSettingDialog(race, result); + } + }); } } }); @@ -213,6 +213,21 @@ public class WindPanel extends FormPanel implements RegattaDisplayer, WindShower windFixesDisplayPanel.add(rawWindFixesTable); } + private void showWindSettingDialog(RaceDTO race, CourseDTO course) { + WindSettingDialog windSettingDialog = new WindSettingDialog(race, course, stringMessages, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + } + + @Override + public void onSuccess(final WindDTO result) { + addWindFix(result); + } + }); + windSettingDialog.show(); + } + private void addWindFix(final WindDTO wind) { final RegattaAndRaceIdentifier raceIdentifier = getSelectedRace(); sailingService.setWind(raceIdentifier, wind, new AsyncCallback() { @@ -356,7 +371,7 @@ public class WindPanel extends FormPanel implements RegattaDisplayer, WindShower RegattaAndRaceIdentifier selectedRace = getSelectedRace(); RaceDTO raceDTO = selectedRace != null ? trackedRacesListComposite.getRaceByIdentifier(selectedRace) : null; - if (selectedRace != null && raceDTO != null && raceDTO.currentlyTracked) { + if (selectedRace != null && raceDTO != null && raceDTO.isTracked) { windCaptionPanel.setVisible(true); windCaptionPanel.setCaptionText(stringMessages.wind() + ": " + selectedRace.getRaceName()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindSettingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindSettingDialog.java index 83f90a7b97a..1801b645ae2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindSettingDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindSettingDialog.java @@ -9,6 +9,7 @@ import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.datepicker.client.DateBox; import com.sap.sailing.gwt.ui.client.DataEntryDialog; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.CourseDTO; import com.sap.sailing.gwt.ui.shared.PositionDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.WindDTO; @@ -54,13 +55,19 @@ public class WindSettingDialog extends DataEntryDialog { } } - public WindSettingDialog(RaceDTO race, StringMessages stringMessages, AsyncCallback callback) { + public WindSettingDialog(RaceDTO race, CourseDTO courseDTO, StringMessages stringMessages, AsyncCallback callback) { super(stringMessages.actionAddWindData(), null, stringMessages.ok(), stringMessages.cancel(), new WindDataValidator(stringMessages), callback); this.stringMessages = stringMessages; speedInKnotsBox = createDoubleBox(5); fromInDegBox = createDoubleBox(5); - latDegBox = createDoubleBox(10); - lngDegBox = createDoubleBox(10); + if(courseDTO != null && courseDTO.waypointPositions.get(0) != null) { + PositionDTO positionDTO = courseDTO.waypointPositions.get(0); + latDegBox = createDoubleBox(positionDTO.latDeg, 10); + lngDegBox = createDoubleBox(positionDTO.lngDeg, 10); + } else { + latDegBox = createDoubleBox(10); + lngDegBox = createDoubleBox(10); + } if(race.startOfRace != null) { timeBox = createDateBox(race.startOfRace.getTime(), 20); } else { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java index 6d54c3db53f..35c29d38f4d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Map; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.client.Timer.PlayModes; import com.sap.sailing.gwt.ui.client.Timer.PlayStates; @@ -15,7 +14,7 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; public class RaceTimePanel extends TimePanel implements RaceSelectionChangeListener, RaceTimesInfoProviderListener { private RaceTimesInfoProvider raceTimesInfoProvider; - private RaceIdentifier selectedRace; + private RegattaAndRaceIdentifier selectedRace; private boolean autoAdjustPlayMode; private RaceTimesInfoDTO lastRaceTimesInfo; @@ -233,7 +232,7 @@ public class RaceTimePanel extends TimePanel implements R } @Override - public void raceTimesInfosReceived(Map raceTimesInfos) { + public void raceTimesInfosReceived(Map raceTimesInfos) { updateTimeInfo(raceTimesInfos.get(selectedRace)); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProvider.java index ed2c5c92521..3daa6556c0b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProvider.java @@ -20,10 +20,10 @@ public class RaceTimesInfoProvider { private SailingServiceAsync sailingService; private ErrorReporter errorReporter; - private Set raceIdentifiers; + private Set raceIdentifiers; private long requestInterval; - private HashMap raceTimesInfos; + private HashMap raceTimesInfos; private Set listeners; @@ -33,9 +33,9 @@ public class RaceTimesInfoProvider { public RaceTimesInfoProvider(SailingServiceAsync sailingService, ErrorReporter errorReporter, Collection raceIdentifiers, long requestInterval) { this.sailingService = sailingService; this.errorReporter = errorReporter; - this.raceIdentifiers = new HashSet(raceIdentifiers); + this.raceIdentifiers = new HashSet(raceIdentifiers); this.requestInterval = requestInterval; - raceTimesInfos = new HashMap(); + raceTimesInfos = new HashMap(); listeners = new HashSet(); RepeatingCommand command = new RepeatingCommand() { @@ -52,9 +52,9 @@ public class RaceTimesInfoProvider { } /** - * @return An unmodifiable list of the RaceIdentifiers contained + * @return An unmodifiable list of the RegattaAndRaceIdentifiers contained */ - public Set getRaceIdentifiers() { + public Set getRaceIdentifiers() { return Collections.unmodifiableSet(raceIdentifiers); } @@ -68,7 +68,7 @@ public class RaceTimesInfoProvider { * @param forceTimesInfoRequest * If true the race time info for the given race is fetched from the server */ - public void addRaceIdentifier(final RaceIdentifier raceIdentifier, boolean forceTimesInfoRequest) { + public void addRaceIdentifier(final RegattaAndRaceIdentifier raceIdentifier, boolean forceTimesInfoRequest) { raceIdentifiers.add(raceIdentifier); if (forceTimesInfoRequest) { sailingService.getRaceTimesInfo(raceIdentifier, new AsyncCallback() { @@ -128,11 +128,11 @@ public class RaceTimesInfoProvider { * @return An unmodifiable map of the {@link RaceTimesInfoDTO times infos} for the current {@link #raceIdentifiers}, * or an empty map if no time infos are available */ - public Map getRaceTimesInfos(){ + public Map getRaceTimesInfos(){ return Collections.unmodifiableMap(raceTimesInfos); } - public RaceTimesInfoDTO getRaceTimesInfo(RaceIdentifier raceIdentifier) { + public RaceTimesInfoDTO getRaceTimesInfo(RegattaAndRaceIdentifier raceIdentifier) { return raceTimesInfos.get(raceIdentifier); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProviderListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProviderListener.java index 29327a9908a..05e61b988c5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProviderListener.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimesInfoProviderListener.java @@ -2,11 +2,11 @@ package com.sap.sailing.gwt.ui.client; import java.util.Map; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; public interface RaceTimesInfoProviderListener { - public void raceTimesInfosReceived(Map raceTimesInfo); + public void raceTimesInfosReceived(Map raceTimesInfo); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 60cd8655798..4fd7cdc674e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -13,7 +13,6 @@ import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NoWindException; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.ScoringSchemeType; @@ -75,36 +74,36 @@ public interface SailingService extends RemoteService { void removeAndUntrackRace(RegattaAndRaceIdentifier regattaAndRaceidentifier) throws Exception; - WindInfoForRaceDTO getRawWindFixes(RaceIdentifier raceIdentifier, Collection windSources); + WindInfoForRaceDTO getRawWindFixes(RegattaAndRaceIdentifier raceIdentifier, Collection windSources); - void setWind(RaceIdentifier raceIdentifier, WindDTO wind); + void setWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO wind); - WindInfoForRaceDTO getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, + WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, Collection windSourceTypeNames) throws NoWindException; - WindInfoForRaceDTO getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, Date to, long resolutionInMilliseconds, + WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, Date to, long resolutionInMilliseconds, Collection windSourceTypeNames); - WindInfoForRaceDTO getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, + WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, double latDeg, double lngDeg, Collection windSources) throws NoWindException; - RaceMapDataDTO getRaceMapData(RaceIdentifier raceIdentifier, Date date, Map from, Map to, + RaceMapDataDTO getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map from, Map to, boolean extrapolate) throws NoWindException; - Map> getBoatPositions(RaceIdentifier raceIdentifier, Map from, + Map> getBoatPositions(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, boolean extrapolate) throws NoWindException; - RaceTimesInfoDTO getRaceTimesInfo(RaceIdentifier raceIdentifier); + RaceTimesInfoDTO getRaceTimesInfo(RegattaAndRaceIdentifier raceIdentifier); - List getRaceTimesInfos(Collection raceIdentifiers); + List getRaceTimesInfos(Collection raceIdentifiers); - CourseDTO getCoursePositions(RaceIdentifier raceIdentifier, Date date); + CourseDTO getCoursePositions(RegattaAndRaceIdentifier raceIdentifier, Date date); - List getRaceCourse(RaceIdentifier raceIdentifier, Date date); + List getRaceCourse(RegattaAndRaceIdentifier raceIdentifier, Date date); - List getQuickRanks(RaceIdentifier raceIdentifier, Date date) throws NoWindException; + List getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException; - void removeWind(RaceIdentifier raceIdentifier, WindDTO windDTO); + void removeWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO windDTO); public List getLeaderboardNames() throws Exception; @@ -156,7 +155,7 @@ public interface SailingService extends RemoteService { void moveColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName); boolean connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName, - String fleetName, RaceIdentifier raceIdentifier); + String fleetName, RegattaAndRaceIdentifier raceIdentifier); void disconnectLeaderboardColumnFromTrackedRace(String leaderboardName, String raceColumnName, String fleetName); @@ -188,10 +187,10 @@ public interface SailingService extends RemoteService { String[] getCountryCodes(); - Map> getDouglasPoints(RaceIdentifier raceIdentifier, + Map> getDouglasPoints(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, double meters) throws NoWindException; - Map> getManeuvers(RaceIdentifier raceIdentifier, + Map> getManeuvers(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to) throws NoWindException; List getLeaderboardsByRace(RaceDTO race); @@ -210,7 +209,7 @@ public interface SailingService extends RemoteService { void updateLeaderboardGroup(String oldName, String newName, String description, List leaderboardNames, int[] overallLeaderboardDiscardThresholds, ScoringSchemeType overallLeaderboardScoringSchemeType); - MultiCompetitorRaceDataDTO getCompetitorsRaceData(RaceIdentifier race, List> competitors, + MultiCompetitorRaceDataDTO getCompetitorsRaceData(RegattaAndRaceIdentifier race, List> competitors, Date toDate, long stepSize, DetailType detailType) throws NoWindException; @@ -254,9 +253,9 @@ public interface SailingService extends RemoteService { Void updateLeaderboardScoreCorrectionMetadata(String leaderboardName, Date timePointOfLastCorrectionValidity, String comment); - RaceBuoysDTO getRaceBuoys(RaceIdentifier raceIdentifier, Date date); + RaceBuoysDTO getRaceBuoys(RegattaAndRaceIdentifier raceIdentifier, Date date); - void updateRaceCourse(RaceIdentifier raceIdentifier, List controlPoints); + void updateRaceCourse(RegattaAndRaceIdentifier raceIdentifier, List controlPoints); void addColumnsToLeaderboard(String leaderboardName, List> columnsToAdd); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index b9454d1aa48..891487d1057 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -96,13 +96,13 @@ public interface SailingServiceAsync { */ void removeAndUntrackRace(RegattaAndRaceIdentifier regattaAndRaceidentifier, AsyncCallback callback); - void getRawWindFixes(RaceIdentifier raceIdentifier, Collection windSources, AsyncCallback callback); + void getRawWindFixes(RegattaAndRaceIdentifier raceIdentifier, Collection windSources, AsyncCallback callback); /** * @param from if null, the tracked race's start of tracking is used * @param to if null, the tracked race's time point of newest event is used */ - void getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, Date to, long resolutionInMilliseconds, + void getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, Date to, long resolutionInMilliseconds, Collection windSourceTypeNames, AsyncCallback callback); /** @@ -110,12 +110,12 @@ public interface SailingServiceAsync { * if null, data from all available wind sources will be returned, otherwise only from those * whose {@link WindSource} name is contained in the windSources collection. */ - void getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, + void getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, double latDeg, double lngDeg, Collection windSourceTypeNames, AsyncCallback callback); /** - * Same as {@link #getWindInfo(RaceIdentifier, Date, long, int, double, double, Collection, AsyncCallback)}, only + * Same as {@link #getWindInfo(RegattaAndRaceIdentifier, Date, long, int, double, double, Collection, AsyncCallback)}, only * that the wind is not requested for a specific position, but instead the wind sources associated with the tracked * race identified by raceIdentifier are requested to deliver their original position. This will in * particular preserve the positions of actual measurements and will deliver the averaged positions for averaged / @@ -127,12 +127,12 @@ public interface SailingServiceAsync { * no matter how great this value is chosen, never returns data beyond the newest event recorded in the * race */ - void getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, + void getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, Collection windSourceTypeNames, AsyncCallback callback); - void setWind(RaceIdentifier raceIdentifier, WindDTO wind, AsyncCallback callback); + void setWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO wind, AsyncCallback callback); - void removeWind(RaceIdentifier raceIdentifier, WindDTO windDTO, AsyncCallback callback); + void removeWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO windDTO, AsyncCallback callback); /** * @param from @@ -149,17 +149,17 @@ public interface SailingServiceAsync { * @return a map where for each competitor participating in the race the list of GPS fixes in increasing * chronological order is provided. The last one is the last position at or before date. */ - void getBoatPositions(RaceIdentifier raceIdentifier, + void getBoatPositions(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, boolean extrapolate, AsyncCallback>> callback); - void getRaceTimesInfo(RaceIdentifier raceIdentifier, AsyncCallback callback); + void getRaceTimesInfo(RegattaAndRaceIdentifier raceIdentifier, AsyncCallback callback); - void getRaceTimesInfos(Collection raceIdentifiers, AsyncCallback> callback); + void getRaceTimesInfos(Collection raceIdentifiers, AsyncCallback> callback); - void getCoursePositions(RaceIdentifier raceIdentifier, Date date, AsyncCallback asyncCallback); + void getCoursePositions(RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback asyncCallback); - void getQuickRanks(RaceIdentifier raceIdentifier, Date date, AsyncCallback> callback); + void getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback> callback); /** * Returns a {@link LeaderboardDTO} will information about all races, their points and competitor display names @@ -211,7 +211,7 @@ public interface SailingServiceAsync { void removeLeaderboardColumn(String leaderboardName, String columnName, AsyncCallback callback); void connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName, String fleetName, - RaceIdentifier raceIdentifier, AsyncCallback asyncCallback); + RegattaAndRaceIdentifier raceIdentifier, AsyncCallback asyncCallback); /** * The key set of the map returned contains all fleets of the race column identified by the combination of @@ -275,10 +275,10 @@ public interface SailingServiceAsync { void getCountryCodes(AsyncCallback callback); - void getDouglasPoints(RaceIdentifier raceIdentifier, Map from, Map to, + void getDouglasPoints(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, double meters, AsyncCallback>> callback); - void getManeuvers(RaceIdentifier raceIdentifier, Map from, Map to, + void getManeuvers(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, AsyncCallback>> callback); void getLeaderboardGroups(boolean withGeoLocationData, AsyncCallback> callback); @@ -324,7 +324,7 @@ public interface SailingServiceAsync { * returned.
* Returns null, if race isn't tracked. */ - void getCompetitorsRaceData(RaceIdentifier race, List> competitorsToLoad, Date toDate, long stepSize, + void getCompetitorsRaceData(RegattaAndRaceIdentifier race, List> competitorsToLoad, Date toDate, long stepSize, DetailType detailType, AsyncCallback callback); void setRaceIsKnownToStartUpwind(RegattaAndRaceIdentifier raceIdentifier, boolean raceIsKnownToStartUpwind, @@ -333,7 +333,7 @@ public interface SailingServiceAsync { void setWindSourcesToExclude(RegattaAndRaceIdentifier raceIdentifier, Iterable windSourcesToExclude, AsyncCallback callback); - void getRaceMapData(RaceIdentifier raceIdentifier, Date date, Map from, + void getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map from, Map to, boolean extrapolate, AsyncCallback callback); void getReplicaInfo(AsyncCallback callback); @@ -412,9 +412,9 @@ public interface SailingServiceAsync { void getWindSourcesInfo(RegattaAndRaceIdentifier raceIdentifier, AsyncCallback callback); - void getRaceCourse(RaceIdentifier raceIdentifier, Date date, AsyncCallback> callback); + void getRaceCourse(RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback> callback); - void updateRaceCourse(RaceIdentifier raceIdentifier, List controlPoints, AsyncCallback callback); + void updateRaceCourse(RegattaAndRaceIdentifier raceIdentifier, List controlPoints, AsyncCallback callback); void getFregResultUrls(AsyncCallback> asyncCallback); @@ -422,7 +422,7 @@ public interface SailingServiceAsync { void addFragUrl(String result, AsyncCallback asyncCallback); - void getRaceBuoys(RaceIdentifier raceIdentifier, Date date, AsyncCallback callback); + void getRaceBuoys(RegattaAndRaceIdentifier raceIdentifier, Date date, AsyncCallback callback); void addColumnsToLeaderboard(String leaderboardName, List> columnsToAdd, AsyncCallback callback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SmallWindHistoryPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SmallWindHistoryPanel.java index cafa0afd965..a5e6df91c1d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SmallWindHistoryPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SmallWindHistoryPanel.java @@ -11,7 +11,6 @@ import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.gwt.ui.shared.PositionDTO; @@ -30,7 +29,7 @@ public class SmallWindHistoryPanel extends FormPanel implements TimeListener, Ra private final WindIndicator[] windIndicators; private final Label selectedWindSourceLabel; private Date date; - private RaceIdentifier race; + private RegattaAndRaceIdentifier race; private final SailingServiceAsync sailingService; private final long millisecondStepsPerLabel; private final ErrorReporter errorReporter; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TVViewPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TVViewPanel.java index a2bd0aabdf9..ef0f88d276e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TVViewPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TVViewPanel.java @@ -11,7 +11,6 @@ import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; @@ -105,7 +104,7 @@ public class TVViewPanel extends SimplePanel implements RaceTimesInfoProviderLis boolean providerChanged = false; for (RaceColumnDTO race : leaderboard.getRaceList()) { for (FleetDTO fleet : race.getFleets()) { - RaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet); + RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet); if (raceIdentifier != null && !raceTimesInfoProvider.containsRaceIdentifier(raceIdentifier)) { raceTimesInfoProvider.addRaceIdentifier(raceIdentifier, false); providerChanged = true; @@ -208,7 +207,7 @@ public class TVViewPanel extends SimplePanel implements RaceTimesInfoProviderLis } @Override - public void raceTimesInfosReceived(Map raceTimesInfo) { + public void raceTimesInfosReceived(Map raceTimesInfo) { if (currentRace == null) { currentRace = getFirstStartedAndUnfinishedRace(); if (currentRace != null) { @@ -229,7 +228,7 @@ public class TVViewPanel extends SimplePanel implements RaceTimesInfoProviderLis private RegattaAndRaceIdentifier getFirstStartedAndUnfinishedRace() { RegattaAndRaceIdentifier firstStartedAndUnfinishedRace = null; - Map raceTimesInfos = raceTimesInfoProvider.getRaceTimesInfos(); + Map raceTimesInfos = raceTimesInfoProvider.getRaceTimesInfos(); for (RaceColumnDTO race : leaderboard.getRaceList()) { for (FleetDTO fleet : race.getFleets()) { RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet); 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 b652331a5b7..0a94438b24e 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 @@ -68,7 +68,6 @@ import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Placemark; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RaceFetcher; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; import com.sap.sailing.domain.common.RegattaIdentifier; @@ -156,6 +155,7 @@ import com.sap.sailing.gwt.ui.shared.RaceColumnDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; +import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO; import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO.ScoreCorrectionEntryDTO; @@ -166,11 +166,11 @@ import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; -import com.sap.sailing.gwt.ui.shared.StrippedRaceDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingConfigurationDTO; import com.sap.sailing.gwt.ui.shared.SwissTimingRaceRecordDTO; import com.sap.sailing.gwt.ui.shared.TracTracConfigurationDTO; import com.sap.sailing.gwt.ui.shared.TracTracRaceRecordDTO; +import com.sap.sailing.gwt.ui.shared.TrackedRaceDTO; import com.sap.sailing.gwt.ui.shared.VenueDTO; import com.sap.sailing.gwt.ui.shared.WindDTO; import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO; @@ -846,22 +846,16 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } private RegattaDTO convertToRegattaDTO(Regatta regatta) { - List competitorList = convertToCompetitorDTOs(regatta.getCompetitors()); - RegattaDTO regattaDTO = new RegattaDTO(regatta.getName(), regatta.getScoringScheme().getType(), competitorList); + RegattaDTO regattaDTO = new RegattaDTO(regatta.getName(), regatta.getScoringScheme().getType()); regattaDTO.races = convertToRaceDTOs(regatta); regattaDTO.series = convertToSeriesDTOs(regatta); BoatClass boatClass = regatta.getBoatClass(); if (boatClass != null) { regattaDTO.boatClass = new BoatClassDTO(boatClass.getName(), boatClass.getHullLength().getMeters()); } - if (!regattaDTO.races.isEmpty()) { - for (RaceDTO race : regattaDTO.races) { - race.setRegatta(regattaDTO); - } - } return regattaDTO; } - + private List convertToSeriesDTOs(Regatta regatta) { List result = new ArrayList(); for (Series series : regatta.getSeries()) { @@ -891,19 +885,25 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS return new FleetDTO(fleet.getName(), fleet.getOrdering(), fleet.getColor()); } - private List convertToRaceDTOs(Regatta regatta) { - List result = new ArrayList(); + private List convertToRaceDTOs(Regatta regatta) { + List result = new ArrayList(); for (RaceDefinition r : regatta.getAllRaces()) { - RaceDTO raceDTO = new RaceDTO(r.getName(), convertToCompetitorDTOs(r.getCompetitors()), getService().isRaceBeingTracked(r)); - TrackedRace trackedRace = getService().getExistingTrackedRace(new RegattaNameAndRaceName(regatta.getName(), r.getName())); + RegattaAndRaceIdentifier raceIdentifier = new RegattaNameAndRaceName(regatta.getName(), r.getName()); + TrackedRace trackedRace = getService().getExistingTrackedRace(raceIdentifier); + TrackedRaceDTO trackedRaceDTO = null; if (trackedRace != null) { - raceDTO.startOfRace = trackedRace.getStartOfRace() == null ? null : trackedRace.getStartOfRace().asDate(); - raceDTO.startOfTracking = trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asDate(); - raceDTO.endOfTracking = trackedRace.getEndOfTracking() == null ? null : trackedRace.getEndOfTracking().asDate(); - raceDTO.timePointOfNewestEvent = trackedRace.getTimePointOfNewestEvent() == null ? null : trackedRace.getTimePointOfNewestEvent().asDate(); - raceDTO.endOfRace = trackedRace.getEndOfRace() == null ? null : trackedRace.getEndOfRace().asDate(); - raceDTO.delayToLiveInMs = trackedRace.getDelayToLiveInMillis(); + trackedRaceDTO = new TrackedRaceDTO(); + trackedRaceDTO.hasWindData = trackedRace.hasWindData(); + trackedRaceDTO.hasGPSData = trackedRace.hasGPSData(); + trackedRaceDTO.startOfTracking = trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asDate(); + trackedRaceDTO.endOfTracking = trackedRace.getEndOfTracking() == null ? null : trackedRace.getEndOfTracking().asDate(); + trackedRaceDTO.timePointOfNewestEvent = trackedRace.getTimePointOfNewestEvent() == null ? null : trackedRace.getTimePointOfNewestEvent().asDate(); + trackedRaceDTO.delayToLiveInMs = trackedRace.getDelayToLiveInMillis(); } + RaceWithCompetitorsDTO raceDTO = new RaceWithCompetitorsDTO(raceIdentifier, convertToCompetitorDTOs(r.getCompetitors()), trackedRaceDTO); + raceDTO.startOfRace = trackedRace.getStartOfRace() == null ? null : trackedRace.getStartOfRace().asDate(); + raceDTO.endOfRace = trackedRace.getEndOfRace() == null ? null : trackedRace.getEndOfRace().asDate(); + raceDTO.boatClass = regatta.getBoatClass() == null ? null : regatta.getBoatClass().getName(); result.add(raceDTO); } return result; @@ -1034,7 +1034,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public WindInfoForRaceDTO getRawWindFixes(RaceIdentifier raceIdentifier, Collection windSources) { + public WindInfoForRaceDTO getRawWindFixes(RegattaAndRaceIdentifier raceIdentifier, Collection windSources) { WindInfoForRaceDTO result = null; TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); if (trackedRace != null) { @@ -1130,7 +1130,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS * by windSourceTypeNames */ //@Override - public WindInfoForRaceDTO getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, + public WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, double latDeg, double lngDeg, Collection windSourceTypeNames) throws NoWindException { Position position = new DegreePosition(latDeg, lngDeg); @@ -1188,7 +1188,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public WindInfoForRaceDTO getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, + public WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, long millisecondsStepWidth, int numberOfFixes, Collection windSourceTypeNames) throws NoWindException { assert from != null; @@ -1253,7 +1253,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public WindInfoForRaceDTO getAveragedWindInfo(RaceIdentifier raceIdentifier, Date from, Date to, + public WindInfoForRaceDTO getAveragedWindInfo(RegattaAndRaceIdentifier raceIdentifier, Date from, Date to, long resolutionInMilliseconds, Collection windSourceTypeNames) { TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); WindInfoForRaceDTO result = null; @@ -1279,7 +1279,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public void setWind(RaceIdentifier raceIdentifier, WindDTO windDTO) { + public void setWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO windDTO) { DynamicTrackedRace trackedRace = (DynamicTrackedRace) getExistingTrackedRace(raceIdentifier); if (trackedRace != null) { Position p = null; @@ -1322,7 +1322,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public RaceMapDataDTO getRaceMapData(RaceIdentifier raceIdentifier, Date date, + public RaceMapDataDTO getRaceMapData(RegattaAndRaceIdentifier raceIdentifier, Date date, Map from, Map to, boolean extrapolate) throws NoWindException { RaceMapDataDTO raceMapDataDTO = new RaceMapDataDTO(); @@ -1335,7 +1335,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public Map> getBoatPositions(RaceIdentifier raceIdentifier, + public Map> getBoatPositions(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, boolean extrapolate) throws NoWindException { Map> result = new HashMap>(); @@ -1433,7 +1433,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public RaceTimesInfoDTO getRaceTimesInfo(RaceIdentifier raceIdentifier) { + public RaceTimesInfoDTO getRaceTimesInfo(RegattaAndRaceIdentifier raceIdentifier) { RaceTimesInfoDTO raceTimesInfo = null; TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); @@ -1500,9 +1500,9 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public List getRaceTimesInfos(Collection raceIdentifiers) { + public List getRaceTimesInfos(Collection raceIdentifiers) { List raceTimesInfos = new ArrayList(); - for (RaceIdentifier raceIdentifier : raceIdentifiers) { + for (RegattaAndRaceIdentifier raceIdentifier : raceIdentifiers) { RaceTimesInfoDTO raceTimesInfo = getRaceTimesInfo(raceIdentifier); if (raceTimesInfo != null) { raceTimesInfos.add(raceTimesInfo); @@ -1512,7 +1512,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public CourseDTO getCoursePositions(RaceIdentifier raceIdentifier, Date date) { + public CourseDTO getCoursePositions(RegattaAndRaceIdentifier raceIdentifier, Date date) { CourseDTO result = new CourseDTO(); if (date != null) { TimePoint dateAsTimePoint = new MillisecondsTimePoint(date); @@ -1556,7 +1556,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public RaceBuoysDTO getRaceBuoys(RaceIdentifier raceIdentifier, Date date) { + public RaceBuoysDTO getRaceBuoys(RegattaAndRaceIdentifier raceIdentifier, Date date) { RaceBuoysDTO raceBuoysDTO = new RaceBuoysDTO(); TimePoint dateAsTimePoint = new MillisecondsTimePoint(date); TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); @@ -1576,7 +1576,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public List getRaceCourse(RaceIdentifier raceIdentifier, Date date) { + public List getRaceCourse(RegattaAndRaceIdentifier raceIdentifier, Date date) { List result = new ArrayList(); if (date != null) { TimePoint dateAsTimePoint = new MillisecondsTimePoint(date); @@ -1618,7 +1618,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS * the course of the race identified by raceIdentifier. */ @Override - public void updateRaceCourse(RaceIdentifier raceIdentifier, List controlPoints) { + public void updateRaceCourse(RegattaAndRaceIdentifier raceIdentifier, List controlPoints) { TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); if (trackedRace != null) { Course course = trackedRace.getRace().getCourse(); @@ -1684,7 +1684,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public List getQuickRanks(RaceIdentifier raceIdentifier, Date date) throws NoWindException { + public List getQuickRanks(RegattaAndRaceIdentifier raceIdentifier, Date date) throws NoWindException { List result = new ArrayList(); if (date != null) { TimePoint dateAsTimePoint = new MillisecondsTimePoint(date); @@ -1745,7 +1745,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public void removeWind(RaceIdentifier raceIdentifier, WindDTO windDTO) { + public void removeWind(RegattaAndRaceIdentifier raceIdentifier, WindDTO windDTO) { DynamicTrackedRace trackedRace = (DynamicTrackedRace) getExistingTrackedRace(raceIdentifier); if (trackedRace != null) { Position p = null; @@ -1894,25 +1894,29 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS leaderboardDTO.hasCarriedPoints = leaderboard.hasCarriedPoints(); leaderboardDTO.discardThresholds = leaderboard.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces(); for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - StrippedRaceDTO race = null; + RaceDTO raceDTO = null; for (Fleet fleet : raceColumn.getFleets()) { RegattaAndRaceIdentifier raceIdentifier = null; - if (raceColumn.getTrackedRace(fleet) != null) { - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); + TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); + if (trackedRace != null) { if (startOfLatestRace == null || (trackedRace.getStartOfRace() != null && trackedRace.getStartOfRace().compareTo(startOfLatestRace) > 0)) { delayToLiveInMillisForLatestRace = 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; - // Creating raceDTO and getting the dates - race = new StrippedRaceDTO(trackedRace.getRace().getName(), raceIdentifier, racePlaces); - race.startOfRace = trackedRace.getStartOfRace() == null ? null : trackedRace.getStartOfRace().asDate(); - race.startOfTracking = trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asDate(); - race.endOfRace = trackedRace.getEndOfRace() == null ? null : trackedRace.getEndOfRace().asDate(); + + TrackedRaceDTO trackedRaceDTO = new TrackedRaceDTO(); + trackedRaceDTO.startOfTracking = trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asDate(); + trackedRaceDTO.hasWindData = trackedRace.hasWindData(); + trackedRaceDTO.hasGPSData = trackedRace.hasGPSData(); + raceDTO = new RaceDTO(raceIdentifier, trackedRaceDTO); + raceDTO.places = racePlaces; + raceDTO.startOfRace = trackedRace.getStartOfRace() == null ? null : trackedRace.getStartOfRace().asDate(); + raceDTO.endOfRace = trackedRace.getEndOfRace() == null ? null : trackedRace.getEndOfRace().asDate(); } final FleetDTO fleetDTO = convertToFleetDTO(fleet); - leaderboardDTO.addRace(raceColumn.getName(), fleetDTO, raceColumn.isMedalRace(), raceIdentifier, race); + leaderboardDTO.addRace(raceColumn.getName(), fleetDTO, raceColumn.isMedalRace(), raceIdentifier, raceDTO); } } return leaderboardDTO; @@ -2034,7 +2038,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public boolean connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName, String fleetName, RaceIdentifier raceIdentifier) { + public boolean connectTrackedRaceToLeaderboardColumn(String leaderboardName, String raceColumnName, String fleetName, RegattaAndRaceIdentifier raceIdentifier) { return getService().apply(new ConnectTrackedRaceToLeaderboardColumn(leaderboardName, raceColumnName, fleetName, raceIdentifier)); } @@ -2253,7 +2257,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public MultiCompetitorRaceDataDTO getCompetitorsRaceData(RaceIdentifier race, List> competitorsQuery, + public MultiCompetitorRaceDataDTO getCompetitorsRaceData(RegattaAndRaceIdentifier race, List> competitorsQuery, Date toDate, long stepSize, DetailType detailType) throws NoWindException { MultiCompetitorRaceDataDTO data = null; TrackedRace trackedRace = getExistingTrackedRace(race); @@ -2299,7 +2303,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS return data; } @Override - public Map> getDouglasPoints(RaceIdentifier raceIdentifier, + public Map> getDouglasPoints(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to, double meters) throws NoWindException { Map> result = new HashMap>(); @@ -2347,7 +2351,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public Map> getManeuvers(RaceIdentifier raceIdentifier, + public Map> getManeuvers(RegattaAndRaceIdentifier raceIdentifier, Map from, Map to) throws NoWindException { Map> result = new HashMap>(); final TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); @@ -2420,7 +2424,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } @Override - public TrackedRace getExistingTrackedRace(RaceIdentifier regattaNameAndRaceName) { + public TrackedRace getExistingTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName) { return getService().getExistingTrackedRace(regattaNameAndRaceName); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/AbstractLeaderboardDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/AbstractLeaderboardDTO.java index b25fdf4720d..b0165002817 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/AbstractLeaderboardDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/AbstractLeaderboardDTO.java @@ -141,7 +141,7 @@ public abstract class AbstractLeaderboardDTO implements IsSerializable { * must not be null */ public RaceColumnDTO addRace(String raceColumnName, FleetDTO fleetDTO, boolean medalRace, - RegattaAndRaceIdentifier trackedRaceIdentifier, StrippedRaceDTO race) { + RegattaAndRaceIdentifier trackedRaceIdentifier, RaceDTO race) { assert fleetDTO != null; RaceColumnDTO raceColumnDTO = getOrCreateRaceColumn(raceColumnName); boolean contains = false; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceColumnDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceColumnDTO.java index 3e7676d007a..caa4245d7c6 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceColumnDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceColumnDTO.java @@ -16,11 +16,11 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable { private boolean medalRace; private List fleets; private Map trackedRaceIdentifiersPerFleet; - private Map racesPerFleet; + private Map racesPerFleet; public RaceColumnDTO() { trackedRaceIdentifiersPerFleet = new HashMap(); - racesPerFleet = new HashMap(); + racesPerFleet = new HashMap(); fleets = new ArrayList(); } @@ -63,11 +63,11 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable { * * @return An Object with additional data, or null if the race isn't tracked */ - public StrippedRaceDTO getRace(FleetDTO fleet) { + public RaceDTO getRace(FleetDTO fleet) { return racesPerFleet.get(fleet); } - public void setRace(FleetDTO fleet, StrippedRaceDTO race) { + public void setRace(FleetDTO fleet, RaceDTO race) { this.racesPerFleet.put(fleet, race); } @@ -81,8 +81,12 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable { */ public Date getStartDate(FleetDTO fleet) { Date start = null; - if (racesPerFleet.get(fleet) != null) { - start = racesPerFleet.get(fleet).getStartDate(); + RaceDTO RaceDTO = racesPerFleet.get(fleet); + if (RaceDTO != null) { + start = RaceDTO.startOfRace; + if(start == null && RaceDTO.isTracked) { + start = RaceDTO.trackedRace.startOfTracking; + } } return start; } @@ -92,7 +96,7 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable { */ public PlacemarkOrderDTO getPlaces() { PlacemarkOrderDTO places = null; - for (StrippedRaceDTO race : racesPerFleet.values()) { + for (RaceDTO race : racesPerFleet.values()) { if (race != null) { if (places == null) { places = race.places; @@ -109,11 +113,11 @@ public class RaceColumnDTO extends NamedDTO implements IsSerializable { */ public boolean isLive() { for (FleetDTO fleet : getFleets()) { - final StrippedRaceDTO strippedRaceDTO = racesPerFleet.get(fleet); + final RaceDTO raceDTO = racesPerFleet.get(fleet); if (trackedRaceIdentifiersPerFleet.get(fleet) != null - && strippedRaceDTO != null - && strippedRaceDTO.endOfRace == null - && (strippedRaceDTO.startOfTracking != null ? new Date().after(strippedRaceDTO.startOfTracking) : false)) { + && raceDTO != null && raceDTO.trackedRace != null + && raceDTO.endOfRace == null + && (raceDTO.trackedRace.startOfTracking != null ? new Date().after(raceDTO.trackedRace.startOfTracking) : false)) { return true; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java index e2ac8dd93c3..6a214df3c4e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java @@ -5,43 +5,45 @@ import java.util.Date; import com.google.gwt.user.client.rpc.IsSerializable; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaNameAndRaceName; +import com.sap.sailing.domain.tracking.RaceTracker; +import com.sap.sailing.domain.tracking.TrackedRace; public class RaceDTO extends NamedDTO implements IsSerializable { - public Iterable competitors; - /** - * Tells if this race is currently being tracked live, meaning that a {@link TracTracRaceTracker} is + * Tells if this race is currently being tracked, meaning that a {@link RaceTracker} is * listening for incoming GPS fixes, mark passings etc., to update a {@link TrackedRace} object * accordingly. */ - public boolean currentlyTracked; + public boolean isTracked; public Date startOfRace; - public Date startOfTracking; - public Date endOfTracking; - public Date timePointOfNewestEvent; public Date endOfRace; - public long delayToLiveInMs; - - private RegattaDTO regatta; + + public PlacemarkOrderDTO places; + + public TrackedRaceDTO trackedRace; + + private String regattaName; + public String boatClass; public RaceDTO() {} - public RaceDTO(String name, Iterable competitors, boolean currentlyTracked) { - super(name); - this.competitors = competitors; - this.currentlyTracked = currentlyTracked; + public RaceDTO(RegattaAndRaceIdentifier raceIdentifier) { + this(raceIdentifier, null); } - public void setRegatta(RegattaDTO regatta) { - this.regatta = regatta; + public RaceDTO(RegattaAndRaceIdentifier raceIdentifier, TrackedRaceDTO trackedRace) { + super(raceIdentifier.getRaceName()); + this.regattaName = raceIdentifier.getRegattaName(); + this.trackedRace = trackedRace; + this.isTracked = trackedRace != null; } - + public RegattaAndRaceIdentifier getRaceIdentifier() { - return new RegattaNameAndRaceName(regatta.name, name); + return new RegattaNameAndRaceName(regattaName, name); } - - public RegattaDTO getRegatta() { - return regatta; + + public String getRegattaName() { + return regattaName; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java index 598665599ff..5c81faa8663 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java @@ -5,10 +5,10 @@ import java.util.Iterator; import java.util.List; import com.google.gwt.user.client.rpc.IsSerializable; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; public class RaceTimesInfoDTO implements IsSerializable { - private RaceIdentifier raceIdentifier; + private RegattaAndRaceIdentifier raceIdentifier; public List legInfos; @@ -21,17 +21,17 @@ public class RaceTimesInfoDTO implements IsSerializable { public Date newestTrackingEvent; public long delayToLiveInMs; - public RaceTimesInfoDTO(RaceIdentifier raceIdentifier) { + public RaceTimesInfoDTO(RegattaAndRaceIdentifier raceIdentifier) { this.raceIdentifier = raceIdentifier; } public RaceTimesInfoDTO() {} - public RaceIdentifier getRaceIdentifier() { + public RegattaAndRaceIdentifier getRaceIdentifier() { return raceIdentifier; } - public void setRaceIdentifier(RaceIdentifier raceIdentifier) { + public void setRaceIdentifier(RegattaAndRaceIdentifier raceIdentifier) { this.raceIdentifier = raceIdentifier; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceWithCompetitorsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceWithCompetitorsDTO.java new file mode 100644 index 00000000000..86fa80b2ff4 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceWithCompetitorsDTO.java @@ -0,0 +1,22 @@ +package com.sap.sailing.gwt.ui.shared; + +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; + +public class RaceWithCompetitorsDTO extends RaceDTO { + public Iterable competitors; + + /** + * Constructor for GWT serialization. + */ + RaceWithCompetitorsDTO() {} + + public RaceWithCompetitorsDTO(RegattaAndRaceIdentifier raceIdentifier, Iterable competitors, TrackedRaceDTO trackedRace) { + super(raceIdentifier, trackedRace); + this.competitors = competitors; + } + + public RaceWithCompetitorsDTO(RegattaAndRaceIdentifier raceIdentifier, Iterable competitors) { + super(raceIdentifier); + this.competitors = competitors; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java index 1c14f2e6f7a..dbdb9267e1c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaDTO.java @@ -11,19 +11,16 @@ public class RegattaDTO extends NamedDTO implements IsSerializable { * May be null in case the boat class is not known */ public BoatClassDTO boatClass; - public List races; - public List competitors; + public List races; public List series; public ScoringSchemeType scoringScheme; - public RegattaDTO() { - } + public RegattaDTO() {} - public RegattaDTO(String name, ScoringSchemeType scoringScheme, List competitors) { + public RegattaDTO(String name, ScoringSchemeType scoringScheme /*, List competitors*/) { super(name); this.name = name; this.scoringScheme = scoringScheme; - this.competitors = competitors; } /** @@ -39,7 +36,7 @@ public class RegattaDTO extends NamedDTO implements IsSerializable { public boolean currentlyTracked() { boolean tracked = false; for (RaceDTO race : races) { - tracked = race.currentlyTracked; + tracked = race.isTracked; if (tracked) { break; } @@ -51,7 +48,8 @@ public class RegattaDTO extends NamedDTO implements IsSerializable { public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + ((competitors == null) ? 0 : competitors.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((scoringScheme == null) ? 0 : scoringScheme.hashCode()); return result; } @@ -64,12 +62,13 @@ public class RegattaDTO extends NamedDTO implements IsSerializable { if (getClass() != obj.getClass()) return false; RegattaDTO other = (RegattaDTO) obj; - if (competitors == null) { - if (other.competitors != null) + if (name == null) { + if (other.name != null) return false; - } else if (!competitors.equals(other.competitors)) + } else if (!name.equals(other.name)) + return false; + if (scoringScheme != other.scoringScheme) return false; return true; } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/StrippedRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/StrippedRaceDTO.java deleted file mode 100644 index 58df370aed9..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/StrippedRaceDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sap.sailing.gwt.ui.shared; - -import java.util.Date; - -import com.google.gwt.user.client.rpc.IsSerializable; -import com.sap.sailing.domain.common.RaceIdentifier; - -public class StrippedRaceDTO extends NamedDTO implements IsSerializable { - - public RaceIdentifier identifier; - public PlacemarkOrderDTO places; - - public Date startOfRace; - public Date startOfTracking; - public Date endOfRace; - - /** - * Empty default constructor for GWT-Serialization - */ - StrippedRaceDTO() {} - - public StrippedRaceDTO(String name, RaceIdentifier identifier, PlacemarkOrderDTO places) { - super(name); - this.identifier = identifier; - this.places = places; - } - - public Date getStartDate() { - return startOfRace == null ? startOfTracking : startOfRace; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackedRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackedRaceDTO.java new file mode 100644 index 00000000000..771c3d003c5 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackedRaceDTO.java @@ -0,0 +1,29 @@ +package com.sap.sailing.gwt.ui.shared; + +import java.util.Date; + +import com.google.gwt.user.client.rpc.IsSerializable; + +public class TrackedRaceDTO implements IsSerializable { + /** + * Default constructor for GWT-Serialization + */ + public TrackedRaceDTO() {} + + public boolean hasWindData; + public boolean hasGPSData; + + public Date startOfTracking; + public Date endOfTracking; + public Date timePointOfNewestEvent; + public long delayToLiveInMs; + + public boolean isLive() { + long eventTimeoutTolerance = 60 * 1000; // 60s + long liveTimePointInMillis = System.currentTimeMillis() - delayToLiveInMs; + boolean live = timePointOfNewestEvent != null + && liveTimePointInMillis < timePointOfNewestEvent.getTime() + eventTimeoutTolerance + && startOfTracking != null && liveTimePointInMillis > startOfTracking.getTime(); + return live; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java index 4fb8c8a1f70..f60a80b6050 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java @@ -17,7 +17,7 @@ import org.moxieapps.gwt.highcharts.client.plotOptions.SeriesPlotOptions; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.ui.SimplePanel; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor; import com.sap.sailing.gwt.ui.client.ErrorReporter; @@ -43,7 +43,7 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv protected Date minTimepoint; protected Date maxTimepoint; - protected RaceIdentifier selectedRaceIdentifier; + protected RegattaAndRaceIdentifier selectedRaceIdentifier; protected RaceTimesInfoDTO lastRaceTimesInfo; protected final DateTimeFormat dateFormat = DateTimeFormat.getFormat("HH:mm:ss"); @@ -73,7 +73,7 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv } @Override - public void raceTimesInfosReceived(Map raceTimesInfos) { + public void raceTimesInfosReceived(Map raceTimesInfos) { this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaceIdentifier); Pair raceMinMax = RaceTimesCalculationUtil.caluclateRaceMinMax(timer, this.lastRaceTimesInfo); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java index 15c80bc734e..cfddaac31bc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java @@ -339,7 +339,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } @Override - public void raceTimesInfosReceived(Map raceTimesInfos) { + public void raceTimesInfosReceived(Map raceTimesInfos) { this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaces.get(0)); } @@ -347,7 +347,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe public void timeChanged(final Date date) { if (date != null) { if (selectedRaces != null && !selectedRaces.isEmpty()) { - RaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1); + RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1); final Iterable competitorsToShow = getCompetitorsToShow(); if (race != null) { @@ -1089,7 +1089,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe new DegreeBearingImpl(lastFix.wind.dampenedTrueWindFromDeg)).getDegrees()) + " "+stringMessages.degreesShort())); } if (!selectedRaces.isEmpty()) { - RaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1); + RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1); if (race != null) { Map from = new HashMap(); from.put(competitorDTO, fixes.get(competitorDTO).get(firstShownFix.get(competitorDTO)).timepoint); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java index 32a5de476db..de2fe985ebc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java @@ -22,7 +22,7 @@ import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.NoSelectionModel; import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.LeaderboardNameConstants; -import com.sap.sailing.domain.common.RegattaNameAndRaceName; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell; @@ -34,6 +34,7 @@ import com.sap.sailing.gwt.ui.client.URLFactory; import com.sap.sailing.gwt.ui.shared.FleetDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceColumnDTO; +import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.panels.BreadcrumbPanel; import com.sap.sailing.gwt.ui.shared.panels.WelcomeWidget; @@ -143,7 +144,7 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget groupDescriptionLabel.setStyleName(STYLE_NAME_PREFIX + "GroupDescription"); mainPanel.add(groupDescriptionLabel); - // Create group leaderboards GUI + // leaderboard group UI Label leaderboardsTableLabel = new Label(stringMessages.leaderboards()); leaderboardsTableLabel.setStyleName(STYLE_NAME_PREFIX + "LeaderboardsTableLabel"); mainPanel.add(leaderboardsTableLabel); @@ -273,20 +274,26 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget } b.append(TEXTTEMPLATE.textWithClass(displayName, 50, STYLE_NAME_PREFIX + "Fleet")); } - for (RaceColumnDTO race : raceColumns) { - String linkText = race.getRaceColumnName(); - if (race.getRaceIdentifier(fleet) != null) { - RegattaNameAndRaceName raceId = (RegattaNameAndRaceName) race.getRaceIdentifier(fleet); + for (RaceColumnDTO raceColumn : raceColumns) { + String linkText = raceColumn.getRaceColumnName(); + RaceDTO race = raceColumn.getRace(fleet); + if (race != null && race.isTracked) { + RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(); String link = URLFactory.INSTANCE.encode("/gwt/RaceBoard.html?leaderboardName=" + leaderboard.name - + "&raceName=" + raceId.getRaceName() + "&root=" + root + raceId.getRaceName() - + "®attaName=" + raceId.getRegattaName() + "&leaderboardGroupName=" + group.name); + + "&raceName=" + raceIdentifier.getRaceName() + "&root=" + root + raceIdentifier.getRaceName() + + "®attaName=" + raceIdentifier.getRegattaName() + "&leaderboardGroupName=" + group.name); if (debugParam != null && !debugParam.isEmpty()) { link += "&gwt.codesvr=" + debugParam; } if (viewMode != null && !viewMode.isEmpty()) { link += "&viewMode=" + viewMode; } - b.append(getAnchor(link, linkText, /* style */ "ActiveRace")); + if(race.trackedRace.hasGPSData && race.trackedRace.hasWindData) { + b.append(getAnchor(link, linkText, /* style */ "ActiveRace")); + } else { + b.append(TEXTTEMPLATE.textWithClass(linkText, STYLE_NAME_PREFIX + "InactiveRace")); + } + } else { b.append(TEXTTEMPLATE.textWithClass(linkText, STYLE_NAME_PREFIX + "InactiveRace")); } diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java index 7ad818c857e..6ef9c8f46a2 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java @@ -214,7 +214,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest private RacingEventServiceImpl createRacingEventServiceWithOneMockedTrackedRace(final TrackedRace q2YellowTrackedRace) { return new RacingEventServiceImpl(getMongoService()) { @Override - public TrackedRace getExistingTrackedRace(RaceIdentifier raceIdentifier) { + public TrackedRace getExistingTrackedRace(RegattaAndRaceIdentifier raceIdentifier) { return q2YellowTrackedRace; } }; diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DelayedLeaderboardCorrectionsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DelayedLeaderboardCorrectionsReplicationTest.java index 0b55114c6fe..e036b019c5e 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DelayedLeaderboardCorrectionsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/DelayedLeaderboardCorrectionsReplicationTest.java @@ -17,7 +17,6 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.common.MaxPointsReason; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.impl.Util.Pair; @@ -126,7 +125,7 @@ public class DelayedLeaderboardCorrectionsReplicationTest extends AbstractServer private RacingEventServiceImpl createRacingEventServiceWithOneMockedTrackedRace(final TrackedRace q2YellowTrackedRace) { return new RacingEventServiceImpl(MongoDBService.INSTANCE) { @Override - public TrackedRace getExistingTrackedRace(RaceIdentifier raceIdentifier) { + public TrackedRace getExistingTrackedRace(RegattaAndRaceIdentifier raceIdentifier) { return q2YellowTrackedRace; } }; diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index fb65f374b48..c4a4f7b45cd 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -23,7 +23,6 @@ import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.RegattaRegistry; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.common.RaceFetcher; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaFetcher; import com.sap.sailing.domain.common.RegattaIdentifier; @@ -295,7 +294,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch void removeRegatta(Regatta regatta) throws MalformedURLException, IOException, InterruptedException; - TrackedRace getExistingTrackedRace(RaceIdentifier raceIdentifier); + TrackedRace getExistingTrackedRace(RegattaAndRaceIdentifier raceIdentifier); /** * Obtains an unmodifiable map of the leaderboard groups configured in this service keyed by their names. diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 67047aedba2..934c6bee227 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -43,7 +43,6 @@ import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.LeaderboardNameConstants; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.RegattaName; @@ -900,7 +899,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen */ private void linkRaceToConfiguredLeaderboardColumns(TrackedRace trackedRace) { boolean leaderboardHasChanged = false; - RaceIdentifier trackedRaceIdentifier = trackedRace.getRaceIdentifier(); + RegattaAndRaceIdentifier trackedRaceIdentifier = trackedRace.getRaceIdentifier(); for (Leaderboard leaderboard : getLeaderboards().values()) { for (RaceColumn column : leaderboard.getRaceColumns()) { for (Fleet fleet : column.getFleets()) { @@ -1236,7 +1235,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen } @Override - public TrackedRace getExistingTrackedRace(RaceIdentifier raceIdentifier) { + public TrackedRace getExistingTrackedRace(RegattaAndRaceIdentifier raceIdentifier) { Regatta regatta = getRegattaByName(raceIdentifier.getRegattaName()); TrackedRace trackedRace = null; if (regatta != null) { diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ConnectTrackedRaceToLeaderboardColumn.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ConnectTrackedRaceToLeaderboardColumn.java index a98398c50a0..4c095c04d1d 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ConnectTrackedRaceToLeaderboardColumn.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ConnectTrackedRaceToLeaderboardColumn.java @@ -3,7 +3,7 @@ package com.sap.sailing.server.operationaltransformation; import java.util.logging.Logger; import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.tracking.TrackedRace; @@ -13,10 +13,10 @@ import com.sap.sailing.server.RacingEventServiceOperation; public class ConnectTrackedRaceToLeaderboardColumn extends AbstractLeaderboardColumnOperation { private static final Logger logger = Logger.getLogger(ConnectTrackedRaceToLeaderboardColumn.class.getName()); private static final long serialVersionUID = -1336511401516212508L; - private final RaceIdentifier raceToConnect; + private final RegattaAndRaceIdentifier raceToConnect; private final String fleetName; - public ConnectTrackedRaceToLeaderboardColumn(String leaderboardName, String columnName, String fleetName, RaceIdentifier raceToConnect) { + public ConnectTrackedRaceToLeaderboardColumn(String leaderboardName, String columnName, String fleetName, RegattaAndRaceIdentifier raceToConnect) { super(leaderboardName, columnName); this.raceToConnect = raceToConnect; this.fleetName = fleetName;