From 931e56385db4185f0872fd218cb15d8bb2c75aba Mon Sep 17 00:00:00 2001 From: fmittag Date: Sat, 12 Sep 2015 15:07:08 +0200 Subject: [PATCH] Implemented the competitor/Boat combination stored in TrackedRace domain object as temporary solution The data is transfered to the UI as part of the RaceMapDataDTO and used in the new CompetitorColorProvider class. --- .../startanalysis/StartlineAnalysisCard.java | 10 +++-- .../sailing/domain/common/dto/BoatDTO.java | 32 +++++++++++++++ .../domain/test/mock/MockedTrackedRace.java | 10 +++++ ...ockedTrackedRaceWithStartTimeAndRanks.java | 6 +++ .../domain/tractracadapter/DomainFactory.java | 2 +- .../impl/DomainFactoryImpl.java | 2 +- .../impl/RaceCourseReceiver.java | 7 +++- .../domain/tracking/DynamicTrackedRace.java | 8 ++++ .../sailing/domain/tracking/TrackedRace.java | 7 ++++ .../tracking/impl/DynamicTrackedRaceImpl.java | 5 +++ .../domain/tracking/impl/TrackedRaceImpl.java | 13 +++++++ .../gwt/ui/test/MockedTrackedRace.java | 10 +++++ .../ui/client/CompetitorColorProvider.java | 6 +-- .../client/CompetitorColorProviderImpl.java | 39 +++++++++++++++---- .../ui/client/CompetitorSelectionModel.java | 8 +++- .../client/CompetitorSelectionProvider.java | 3 ++ .../gwt/ui/client/shared/racemap/RaceMap.java | 22 ++++++++--- .../gwt/ui/leaderboard/LeaderboardPanel.java | 11 +++++- .../EmbeddedMapAndWindChartEntryPoint.java | 11 ++++-- .../gwt/ui/raceboard/RaceBoardPanel.java | 7 +++- .../gwt/ui/server/SailingServiceImpl.java | 21 +++++++++- .../gwt/ui/shared/CompactRaceMapDataDTO.java | 17 +++++++- .../sailing/gwt/ui/shared/RaceMapDataDTO.java | 2 + .../server/masterdata/DummyTrackedRace.java | 6 +++ 24 files changed, 231 insertions(+), 34 deletions(-) create mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java index 80de0b51633..dd5fd88fe41 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java @@ -21,6 +21,8 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.dashboards.gwt.client.startanalysis.rankingtable.StartAnalysisStartRankTable; import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO; import com.sap.sailing.domain.common.racelog.RacingProcedureType; +import com.sap.sailing.gwt.ui.client.CompetitorColorProvider; +import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; @@ -65,7 +67,8 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star private SailingServiceAsync sailingServiceAsync; private StringMessages stringMessages; private final CompetitorSelectionModel competitorSelectionModel; - + private final CompetitorColorProvider colorProvider; + private final double WIND_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 185; private final double GEOMETRIC_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 210; private final int TABLE_MARGIN_IN_PT = 10; @@ -78,7 +81,8 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star stringMessages = StringMessages.INSTANCE; resources.combinedWindPanelStyle().ensureInjected(); this.sailingServiceAsync = sailingServiceAsync; - competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */true); + colorProvider = new CompetitorColorProviderImpl(); + competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */true, colorProvider); competitorSelectionModel.setCompetitors(startAnalysisDTO.getCompetitorDTOsFromStartAnaylsisCompetitorDTOs(), raceMap); initWidget(uiBinder.createAndBindUi(this)); @@ -146,7 +150,7 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingServiceAsync, asyncActionsExecutor, null, Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier), 5000l /* requestInterval */); - raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel, + raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel, colorProvider, StringMessages.INSTANCE, false, false, false, startAnalysisDTO.regattaAndRaceIdentifier, resources.combinedWindPanelStyle(), /* showHeaderPanel */ true); raceMap.onRaceSelectionChange(Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier)); diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java new file mode 100644 index 00000000000..1bf5ddd1202 --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java @@ -0,0 +1,32 @@ +package com.sap.sailing.domain.common.dto; + +import java.io.Serializable; + +import com.sap.sse.common.Color; + +public class BoatDTO extends NamedDTO implements Serializable { + private static final long serialVersionUID = -4076992788294272162L; + + private String sailId; + private Color color; + + // for GWT + BoatDTO() {} + + public BoatDTO(String name, String sailId) { + this(name, sailId, null); + } + + public BoatDTO(String name, String sailId, Color color) { + super(name); + this.color = color; + } + + public Color getColor() { + return color; + } + + public String getSailId() { + return sailId; + } +} 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 4c3d0485d2f..7eac79db332 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 @@ -10,6 +10,7 @@ import java.util.TreeSet; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; @@ -992,4 +993,13 @@ public class MockedTrackedRace implements DynamicTrackedRace { public IsManagedByCache resolve(SharedDomainFactory domainFactory) { return this; } + + @Override + public Boat resolveBoatOfCompetitor(Competitor competitor) { + return null; + } + + @Override + public void setBoatForCompetitor(Competitor competitor, Boat boat) { + } } 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 2267dc3d786..d2c4e74b445 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 @@ -9,6 +9,7 @@ import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Mark; @@ -653,4 +654,9 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { public IsManagedByCache resolve(SharedDomainFactory domainFactory) { return this; } + + @Override + public Boat resolveBoatOfCompetitor(Competitor competitor) { + return null; + } } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java index e51160a5e17..fce91efee89 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java @@ -257,7 +257,7 @@ public interface DomainFactory { */ RaceDefinition getAndWaitForRaceDefinition(UUID raceId, long timeoutInMilliseconds); - Iterable> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass); + List> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass); Util.Pair, BoatClass> getCompetitorsAndDominantBoatClass(IRace race); diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index 2a7f1e6eb33..016526588f6 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -585,7 +585,7 @@ public class DomainFactoryImpl implements DomainFactory { } @Override - public Iterable> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass) { + public List> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass) { final List> competitorBoatInfos = new ArrayList<>(); for (IRaceCompetitor rc : race.getRaceCompetitors()) { Util.Triple competitorBoatInfo = getMetadataParser().parseCompetitorBoat(rc); diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java index 2a2f7679c9c..5f08e2131d8 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java @@ -157,12 +157,17 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue, BoatClass> competitorsAndDominantBoatClass = getDomainFactory().getCompetitorsAndDominantBoatClass(tractracRace); - Iterable> boatsInfoForCompetitors = getDomainFactory().getBoatsInfoForCompetitors(tractracRace, competitorsAndDominantBoatClass.getB()); trackedRace = getDomainFactory().getOrCreateRaceDefinitionAndTrackedRace( getTrackedRegatta(), tractracRace.getId(), tractracRace.getName(), competitorsAndDominantBoatClass.getA(), competitorsAndDominantBoatClass.getB(), course, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate, tracTracUpdateURI, getTracTracEvent().getId(), tracTracUsername, tracTracPassword, useInternalMarkPassingAlgorithm, raceLogResolver); + List> boatsInfoForCompetitors = getDomainFactory().getBoatsInfoForCompetitors(tractracRace, competitorsAndDominantBoatClass.getB()); + if(boatsInfoForCompetitors != null) { + for(Pair competitorAndBoat: boatsInfoForCompetitors) { + trackedRace.setBoatForCompetitor(competitorAndBoat.getA(), competitorAndBoat.getB()); + } + } needToUpdateRaceTimes = true; if (getSimulator() != null) { getSimulator().setTrackedRace(trackedRace); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java index 85e2055ac8d..6aea864c921 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DynamicTrackedRace.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.tracking; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Mark; @@ -103,4 +104,11 @@ public interface DynamicTrackedRace extends TrackedRace { void invalidateStartTime(); void invalidateEndTime(); + + /** + * Sets the boat for the competitor only for this race. + * @param competitor + * @param boat + */ + void setBoatForCompetitor(Competitor competitor, Boat boat); } 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 8c5bfaca6df..978ec89986b 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 @@ -11,6 +11,7 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.shared.events.DeviceMappingEvent; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Leg; @@ -878,4 +879,10 @@ public interface TrackedRace extends Serializable, IsManagedByCache { return (DynamicGPSFixTrack) super.getTrack(mark); } + @Override + public void setBoatForCompetitor(Competitor competitor, Boat boat) { + boatsForCompetitor.put(competitor, boat); + } } 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 1d80df18234..9110531c62f 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 @@ -57,6 +57,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRac import com.sap.sailing.domain.abstractlog.race.tracking.analyzing.impl.DefinedMarkFinder; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -257,6 +258,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl private final Map> markPassingsForCompetitor; + protected final Map boatsForCompetitor; + /** * The mark passing sets used as values are ordered by time stamp. */ @@ -464,6 +467,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl race.getCourse().unlockAfterRead(); } markPassingsForCompetitor = new HashMap>(); + boatsForCompetitor = new HashMap(); tracks = new HashMap>(); for (Competitor competitor : race.getCompetitors()) { markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet( @@ -3879,4 +3883,13 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl result.addAll(marksDefinedInRaceLog); return result; } + + @Override + public Boat resolveBoatOfCompetitor(Competitor competitor) { + Boat result = boatsForCompetitor.get(competitor); + if(result == null) { + result = competitor.getBoat(); + } + return result; + } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 5d721c9a944..8138ea472cb 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -11,6 +11,7 @@ import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Leg; @@ -790,4 +791,13 @@ public class MockedTrackedRace implements DynamicTrackedRace { public IsManagedByCache resolve(SharedDomainFactory domainFactory) { return this; } + + @Override + public Boat resolveBoatOfCompetitor(Competitor competitor) { + return null; + } + + @Override + public void setBoatForCompetitor(Competitor competitor, Boat boat) { + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProvider.java index 15aecc63ea3..2fd22601bba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProvider.java @@ -1,13 +1,13 @@ package com.sap.sailing.gwt.ui.client; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; -import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sse.common.Color; public interface CompetitorColorProvider { Color getColor(CompetitorDTO competitor); - - Color getColor(CompetitorDTO competitor, RaceColumnDTO raceColumn); + Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier); + void setColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier, Color color); void addBlockedColor(Color color); void removeBlockedColor(Color color); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProviderImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProviderImpl.java index 80963da8178..15b22295b58 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProviderImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorColorProviderImpl.java @@ -1,32 +1,56 @@ package com.sap.sailing.gwt.ui.client; +import java.util.HashMap; +import java.util.Map; + import com.sap.sailing.domain.common.ColorMap; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; -import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.impl.ColorMapImpl; import com.sap.sse.common.Color; public class CompetitorColorProviderImpl implements CompetitorColorProvider { private final ColorMap competitorsColorMap; + private final Map> competitorsBoatColorsPerRace; public CompetitorColorProviderImpl() { this.competitorsColorMap = new ColorMapImpl(); + this.competitorsBoatColorsPerRace = new HashMap>(); } @Override public Color getColor(CompetitorDTO competitor) { - final Color result; - if (competitor.getColor() != null) { + return getColor(competitor, null); + } + + @Override + public Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier) { + Color result = null; + if(raceIdentfier != null) { + Map raceColors = competitorsBoatColorsPerRace.get(raceIdentfier); + if(raceColors != null) { + result = raceColors.get(competitor); + } + } + if(result == null && competitor.getColor() != null) { result = competitor.getColor(); - } else { - result = competitorsColorMap.getColorByID(competitor); } + // fallback + if(result == null) { + competitorsColorMap.getColorByID(competitor); + } + return result; } @Override - public Color getColor(CompetitorDTO competitor, RaceColumnDTO raceColumn) { - return null; + public void setColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier, Color color) { + Map raceColors = competitorsBoatColorsPerRace.get(raceIdentfier); + if(raceColors == null) { + raceColors = new HashMap(); + competitorsBoatColorsPerRace.put(raceIdentfier, raceColors); + } + raceColors.put(competitor, color); } @Override @@ -38,5 +62,4 @@ public class CompetitorColorProviderImpl implements CompetitorColorProvider { public void removeBlockedColor(Color color) { competitorsColorMap.removeBlockedColor(color); } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java index 4b463a22234..a3234dc42e4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionModel.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sse.common.Color; import com.sap.sse.common.Util; @@ -232,12 +233,17 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider { fireListChanged(getAllCompetitors(), listenersNotToNotify); } } - + @Override public Color getColor(CompetitorDTO competitor) { return allCompetitors.contains(competitor) ? competitorColorProvider.getColor(competitor) : null; } + @Override + public Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier) { + return allCompetitors.contains(competitor) ? competitorColorProvider.getColor(competitor, raceIdentfier) : null; + } + @Override public FilterSet> getCompetitorsFilterSet() { return competitorsFilterSet; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java index 77a2e991641..09b05b99fa6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/CompetitorSelectionProvider.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.ui.client; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sse.common.Color; import com.sap.sse.common.filter.Filter; @@ -61,6 +62,8 @@ public interface CompetitorSelectionProvider { boolean hasMultiSelection(); Color getColor(CompetitorDTO competitor); + + Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier); void addCompetitorSelectionChangeListener(CompetitorSelectionChangeListener listener); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 220d7159f69..2e4b5141686 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -78,6 +78,7 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; @@ -87,6 +88,7 @@ import com.sap.sailing.gwt.ui.actions.GetPolarAction; import com.sap.sailing.gwt.ui.actions.GetRaceMapDataAction; import com.sap.sailing.gwt.ui.actions.GetWindInfoAction; import com.sap.sailing.gwt.ui.client.ClientResources; +import com.sap.sailing.gwt.ui.client.CompetitorColorProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.NumberFormatterFactory; @@ -284,8 +286,9 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private Map> lastDouglasPeuckerResult; - private CompetitorSelectionProvider competitorSelection; - + private final CompetitorSelectionProvider competitorSelection; + private final CompetitorColorProvider competitorColorProvider; + private List selectedRaces; /** @@ -397,7 +400,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private final NumberFormat numberFormatOneDecimal = NumberFormat.getFormat("0.0"); public RaceMap(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, - ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, + ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, CompetitorColorProvider competitorColorProvider, StringMessages stringMessages, boolean showMapControls, boolean showViewStreamlets, boolean showViewSimulation, RegattaAndRaceIdentifier raceIdentifier, CombinedWindPanelStyle combinedWindPanelStyle, boolean showHeaderPanel) { this.setSize("100%", "100%"); @@ -419,6 +422,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe windSensorOverlays = new HashMap(); courseMarkOverlays = new HashMap(); this.competitorSelection = competitorSelection; + this.competitorColorProvider = competitorColorProvider; competitorSelection.addCompetitorSelectionChangeListener(this); settings = new RaceMapSettings(); coordinateSystem = new DelegateCoordinateSystem(new IdentityCoordinateSystem()); @@ -880,6 +884,12 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe public void onSuccess(RaceMapDataDTO raceMapDataDTO) { if (map != null && raceMapDataDTO != null) { quickRanks = raceMapDataDTO.quickRanks; + // set competitor boats for the color provider + if(!raceMapDataDTO.competitorBoats.isEmpty()) { + for(Entry competitorAndBoat: raceMapDataDTO.competitorBoats.entrySet()) { + competitorColorProvider.setColor(competitorAndBoat.getKey(), raceIdentifier, competitorAndBoat.getValue().getColor()); + } + } competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber = raceMapDataDTO.competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber; if (showViewSimulation && settings.isShowSimulationOverlay()) { @@ -1774,11 +1784,11 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private CompetitorInfoOverlay createCompetitorInfoOverlay(int zIndex, final CompetitorDTO competitorDTO) { String infoText = competitorDTO.getSailID() == null || competitorDTO.getSailID().isEmpty() ? competitorDTO.getName() : competitorDTO.getSailID(); - return new CompetitorInfoOverlay(map, zIndex, competitorSelection.getColor(competitorDTO), infoText, coordinateSystem); + return new CompetitorInfoOverlay(map, zIndex, competitorSelection.getColor(competitorDTO, raceIdentifier), infoText, coordinateSystem); } private BoatOverlay createBoatOverlay(int zIndex, final CompetitorDTO competitorDTO, boolean highlighted) { - final BoatOverlay boatCanvas = new BoatOverlay(map, zIndex, competitorDTO, competitorSelection.getColor(competitorDTO), coordinateSystem); + final BoatOverlay boatCanvas = new BoatOverlay(map, zIndex, competitorDTO, competitorSelection.getColor(competitorDTO, raceIdentifier), coordinateSystem); boatCanvas.setSelected(highlighted); boatCanvas.addClickHandler(new ClickMapHandler() { @Override @@ -2469,7 +2479,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe options.setStrokeOpacity(1.0); boolean noCompetitorSelected = Util.isEmpty(competitorSelection.getSelectedCompetitors()); if (isHighlighted || noCompetitorSelected) { - options.setStrokeColor(competitorSelection.getColor(competitor).getAsHtml()); + options.setStrokeColor(competitorSelection.getColor(competitor, raceIdentifier).getAsHtml()); } else { options.setStrokeColor(CssColor.make(200, 200, 200).toString()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java index 3f4e6aa9e19..08cd60fd72c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java @@ -277,7 +277,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS * {@link RaceColumnDTO#getRaceIdentifier(String) race identifier} matches the value of this attribute will be * added. */ - private final RaceIdentifier preSelectedRace; + private final RegattaAndRaceIdentifier preSelectedRace; private final VerticalPanel contentPanel; @@ -619,7 +619,8 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS @Override public void render(Context context, LeaderboardRowDTO object, SafeHtmlBuilder sb) { - String competitorColor = LeaderboardPanel.this.competitorSelectionProvider.getColor(object.competitor).getAsHtml(); + String competitorColor = LeaderboardPanel.this.competitorSelectionProvider.getColor(object.competitor, + LeaderboardPanel.this.preSelectedRace).getAsHtml(); String competitorColorBarStyle; if (LeaderboardPanel.this.isEmbedded && preSelectedRace != null) { competitorColorBarStyle = "style=\"border-bottom: 2px solid " + competitorColor + ";\""; @@ -2317,6 +2318,12 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS for (RaceColumn columnToCollapseAndExpandAgain : columnsToCollapseAndExpandAgain) { columnToCollapseAndExpandAgain.toggleExpansion(); } + + // here we need to add the competitor colors for the preselected race column or so + if(preSelectedRace != null) { + // leaderboard. + } + competitorSelectionProvider.setCompetitors(leaderboard.competitors, /* listenersNotToNotify */this); if (!initialCompetitorFilterHasBeenApplied) { applyTop30FilterIfCompetitorSizeGreaterEqual40(leaderboard); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index a6f0ff21417..d9eedbe415d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -23,6 +23,8 @@ import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; +import com.sap.sailing.gwt.ui.client.CompetitorColorProvider; +import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; @@ -158,9 +160,10 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint timePanelSettings.setRefreshInterval(refreshInterval); timePanel.updateSettings(timePanelSettings); raceMapResources.combinedWindPanelStyle().ensureInjected(); - final CompetitorSelectionProvider competitorSelection = createEmptyFilterCompetitorModel(); // show no competitors + final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(); + final CompetitorSelectionProvider competitorSelection = createEmptyFilterCompetitorModel(colorProvider); // show no competitors final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, - competitorSelection, getStringMessages(), showMapControls, showViewStreamlets, + competitorSelection, colorProvider, getStringMessages(), showMapControls, showViewStreamlets, showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ false) { @Override protected void showAdditionalControls(MapWidget map) { @@ -194,8 +197,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint }); } - private CompetitorSelectionProvider createEmptyFilterCompetitorModel() { - final CompetitorSelectionModel result = new CompetitorSelectionModel(/* hasMultiSelection */ true); + private CompetitorSelectionProvider createEmptyFilterCompetitorModel(CompetitorColorProvider colorProvider) { + final CompetitorSelectionModel result = new CompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider); final FilterSet> filterSet = result.getOrCreateCompetitorsFilterSet("Empty"); filterSet.addFilter(new Filter() { @Override public boolean matches(CompetitorDTO object) { return false; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 6d89dae29d3..9ae23f1bc75 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -26,6 +26,8 @@ import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.dto.RaceDTO; +import com.sap.sailing.gwt.ui.client.CompetitorColorProvider; +import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory; import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel; @@ -151,11 +153,12 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi regattaAndRaceTimeInformationHeader.setStyleName("RegattaAndRaceTime-Header"); timeRangeWithZoomModel = new TimeRangeWithZoomModel(); componentViewers = new ArrayList(); - competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true); + final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(); + competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider); raceMapResources.combinedWindPanelStyle().ensureInjected(); raceMap = new RaceMap(sailingService, asyncActionsExecutor, errorReporter, timer, - competitorSelectionModel, stringMessages, showMapControls, getConfiguration().isShowViewStreamlets(), getConfiguration().isShowViewSimulation(), + competitorSelectionModel, colorProvider, stringMessages, showMapControls, getConfiguration().isShowViewStreamlets(), getConfiguration().isShowViewSimulation(), selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ true); CompetitorFilterPanel competitorSearchTextBox = new CompetitorFilterPanel(competitorSelectionModel, stringMessages, raceMap, new LeaderboardFetcher() { 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 ff3f491a315..0e3cab39668 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 @@ -90,6 +90,7 @@ import com.sap.sailing.domain.abstractlog.regatta.tracking.analyzing.impl.Regatt import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceCompetitorMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.DeviceMarkMappingFinder; import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -179,6 +180,7 @@ import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.configuration.DeviceConfigurationMatcherType; import com.sap.sailing.domain.common.dto.BoatClassDTO; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.FullLeaderboardDTO; @@ -1572,6 +1574,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S boolean extrapolate, LegIdentifier simulationLegIdentifier) throws NoWindException { final Map> boatPositions = getBoatPositions(raceIdentifier, fromPerCompetitorIdAsString, toPerCompetitorIdAsString, extrapolate); + final Map competitorBoats = getBoatsOfCompetitors(raceIdentifier); final CoursePositionsDTO coursePositions = getCoursePositions(raceIdentifier, date); final List courseSidelines = getCourseSidelines(raceIdentifier, date); final QuickRanksDTO quickRanks = getQuickRanks(raceIdentifier, date); @@ -1580,7 +1583,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S SimulationService simulationService = getService().getSimulationService(); simulationResultVersion = simulationService.getSimulationResultsVersion(simulationLegIdentifier); } - return new CompactRaceMapDataDTO(boatPositions, coursePositions, courseSidelines, quickRanks, simulationResultVersion); + return new CompactRaceMapDataDTO(boatPositions, competitorBoats, coursePositions, courseSidelines, quickRanks, simulationResultVersion); } /** @@ -1728,6 +1731,22 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return result; } + private Map getBoatsOfCompetitors(RegattaAndRaceIdentifier raceIdentifier) { + Map result = new HashMap(); + TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); + if (trackedRace != null) { + for (Competitor competitor : trackedRace.getRace().getCompetitors()) { + Boat boatOfCompetitor = trackedRace.resolveBoatOfCompetitor(competitor); + if(boatOfCompetitor != null) { + CompetitorDTO competitorDTO = baseDomainFactory.convertToCompetitorDTO(competitor); + BoatDTO boatDTO = new BoatDTO(boatOfCompetitor.getName(), boatOfCompetitor.getSailID(), boatOfCompetitor.getColor()); + result.put(competitorDTO, boatDTO); + } + } + } + return result; + } + private TimePoint quantifyTimePointWithResolution(TimePoint timePoint, long resolutionInMilliseconds) { return new MillisecondsTimePoint(timePoint.asMillis() / resolutionInMilliseconds * resolutionInMilliseconds); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CompactRaceMapDataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CompactRaceMapDataDTO.java index 386a21f86ee..65b2656b674 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CompactRaceMapDataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CompactRaceMapDataDTO.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Map.Entry; import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sse.common.Util; @@ -24,6 +25,8 @@ import com.sap.sse.common.Util; */ public class CompactRaceMapDataDTO implements IsSerializable { private Map> boatPositionsByCompetitorIdAsString; + private Map competitorBoatsByCompetitorIdAsString; + private CoursePositionsDTO coursePositions; private List courseSidelines; private List quickRanks; @@ -32,12 +35,16 @@ public class CompactRaceMapDataDTO implements IsSerializable { CompactRaceMapDataDTO() {} - public CompactRaceMapDataDTO(Map> boatPositions, CoursePositionsDTO coursePositions, + public CompactRaceMapDataDTO(Map> boatPositions, Map competitorBoats, CoursePositionsDTO coursePositions, List courseSidelines, QuickRanksDTO quickRanks, long simulationResultVersion) { this.boatPositionsByCompetitorIdAsString = new HashMap>(); for (Map.Entry> e : boatPositions.entrySet()) { this.boatPositionsByCompetitorIdAsString.put(e.getKey().getIdAsString(), e.getValue()); } + this.competitorBoatsByCompetitorIdAsString = new HashMap(); + for (Map.Entry e : competitorBoats.entrySet()) { + this.competitorBoatsByCompetitorIdAsString.put(e.getKey().getIdAsString(), e.getValue()); + } this.quickRanks = new ArrayList(quickRanks == null ? 0 : Util.size(quickRanks.getQuickRanks())); this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber = new LinkedHashMap<>(); Map competitorIdAsStringToOneBasedLegNumber = new HashMap<>(); @@ -81,6 +88,14 @@ public class CompactRaceMapDataDTO implements IsSerializable { result.boatPositions.put(competitor, e.getValue()); } } + result.competitorBoats = new HashMap(); + for (Map.Entry e : competitorBoatsByCompetitorIdAsString.entrySet()) { + final CompetitorDTO competitor = competitorsByIdAsString.get(e.getKey()); + if (competitor != null) { + // maybe null in case the competitor was added, e.g., by unsuppressing, while this call was underway + result.competitorBoats.put(competitor, e.getValue()); + } + } result.competitorsInOrderOfWindwardDistanceTraveledWithOneBasedLegNumber = new LinkedHashMap<>(); for (Entry i : competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber.entrySet()) { CompetitorDTO c = competitorsByIdAsString.get(i.getKey()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceMapDataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceMapDataDTO.java index c0f5edb0614..622f91de796 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceMapDataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceMapDataDTO.java @@ -5,10 +5,12 @@ import java.util.List; import java.util.Map; import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; public class RaceMapDataDTO implements IsSerializable { public Map> boatPositions; + public Map competitorBoats; public CoursePositionsDTO coursePositions; public List courseSidelines; public LinkedHashMap quickRanks; diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index ae6e89de466..2cf3a7c972a 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -9,6 +9,7 @@ import java.util.Set; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; +import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Mark; @@ -628,4 +629,9 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { public IsManagedByCache resolve(SharedDomainFactory domainFactory) { return this; } + + @Override + public Boat resolveBoatOfCompetitor(Competitor competitor) { + return null; + } }