mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-25 21:43:49 +00:00
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.
This commit is contained in:
1 parent
e5d94608c0
commit
931e56385d
24 files changed
+229
-32
No files matched your search
+6
-2
@@ -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,6 +67,7 @@ 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;
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+10
@@ -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<SharedDomainFactory> resolve(SharedDomainFactory domainFactory) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boat resolveBoatOfCompetitor(Competitor competitor) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoatForCompetitor(Competitor competitor, Boat boat) {
|
||||
}
|
||||
}
|
||||
+6
@@ -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<SharedDomainFactory> resolve(SharedDomainFactory domainFactory) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boat resolveBoatOfCompetitor(Competitor competitor) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -257,7 +257,7 @@ public interface DomainFactory {
|
||||
*/
|
||||
RaceDefinition getAndWaitForRaceDefinition(UUID raceId, long timeoutInMilliseconds);
|
||||
|
||||
Iterable<Util.Pair<Competitor, Boat>> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass);
|
||||
List<Util.Pair<Competitor, Boat>> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass);
|
||||
|
||||
Util.Pair<Iterable<com.sap.sailing.domain.base.Competitor>, BoatClass> getCompetitorsAndDominantBoatClass(IRace race);
|
||||
|
||||
|
||||
+1
-1
@@ -585,7 +585,7 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Util.Pair<Competitor, Boat>> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass) {
|
||||
public List<Util.Pair<Competitor, Boat>> getBoatsInfoForCompetitors(IRace race, BoatClass defaultBoatClass) {
|
||||
final List<Util.Pair<Competitor, Boat>> competitorBoatInfos = new ArrayList<>();
|
||||
for (IRaceCompetitor rc : race.getRaceCompetitors()) {
|
||||
Util.Triple<String, String, String> competitorBoatInfo = getMetadataParser().parseCompetitorBoat(rc);
|
||||
|
||||
+6
-1
@@ -157,12 +157,17 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<IControlRoute,
|
||||
logger.log(Level.INFO, "Received course for non-existing race "+tractracRace.getName()+". Creating RaceDefinition.");
|
||||
// create race definition and add to event
|
||||
com.sap.sse.common.Util.Pair<Iterable<Competitor>, BoatClass> competitorsAndDominantBoatClass = getDomainFactory().getCompetitorsAndDominantBoatClass(tractracRace);
|
||||
Iterable<Pair<Competitor, Boat>> 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<Pair<Competitor, Boat>> boatsInfoForCompetitors = getDomainFactory().getBoatsInfoForCompetitors(tractracRace, competitorsAndDominantBoatClass.getB());
|
||||
if(boatsInfoForCompetitors != null) {
|
||||
for(Pair<Competitor, Boat> competitorAndBoat: boatsInfoForCompetitors) {
|
||||
trackedRace.setBoatForCompetitor(competitorAndBoat.getA(), competitorAndBoat.getB());
|
||||
}
|
||||
}
|
||||
needToUpdateRaceTimes = true;
|
||||
if (getSimulator() != null) {
|
||||
getSimulator().setTrackedRace(trackedRace);
|
||||
|
||||
+8
@@ -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);
|
||||
}
|
||||
@@ -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<SharedDomain
|
||||
return getMarks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the boat used by the competitor for this race
|
||||
* @param competitor the competitor
|
||||
* @return the boat
|
||||
*/
|
||||
public Boat resolveBoatOfCompetitor(Competitor competitor);
|
||||
}
|
||||
+5
@@ -17,6 +17,7 @@ import java.util.logging.Logger;
|
||||
|
||||
import com.sap.sailing.domain.abstractlog.race.RaceLog;
|
||||
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
|
||||
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.CourseBase;
|
||||
@@ -827,4 +828,8 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
|
||||
return (DynamicGPSFixTrack<Mark, GPSFix>) super.getTrack(mark);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoatForCompetitor(Competitor competitor, Boat boat) {
|
||||
boatsForCompetitor.put(competitor, boat);
|
||||
}
|
||||
}
|
||||
+13
@@ -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<Competitor, NavigableSet<MarkPassing>> markPassingsForCompetitor;
|
||||
|
||||
protected final Map<Competitor, Boat> 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<Competitor, NavigableSet<MarkPassing>>();
|
||||
boatsForCompetitor = new HashMap<Competitor, Boat>();
|
||||
tracks = new HashMap<Competitor, GPSFixTrack<Competitor, GPSFixMoving>>();
|
||||
for (Competitor competitor : race.getCompetitors()) {
|
||||
markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet<MarkPassing>(
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+10
@@ -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<SharedDomainFactory> resolve(SharedDomainFactory domainFactory) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boat resolveBoatOfCompetitor(Competitor competitor) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBoatForCompetitor(Competitor competitor, Boat boat) {
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -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);
|
||||
|
||||
+32
-9
@@ -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<CompetitorDTO> competitorsColorMap;
|
||||
private final Map<RegattaAndRaceIdentifier, Map<CompetitorDTO, Color>> competitorsBoatColorsPerRace;
|
||||
|
||||
public CompetitorColorProviderImpl() {
|
||||
this.competitorsColorMap = new ColorMapImpl<CompetitorDTO>();
|
||||
this.competitorsBoatColorsPerRace = new HashMap<RegattaAndRaceIdentifier, Map<CompetitorDTO,Color>>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Color getColor(CompetitorDTO competitor) {
|
||||
final Color result;
|
||||
if (competitor.getColor() != null) {
|
||||
result = competitor.getColor();
|
||||
} else {
|
||||
result = competitorsColorMap.getColorByID(competitor);
|
||||
return getColor(competitor, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier) {
|
||||
Color result = null;
|
||||
if(raceIdentfier != null) {
|
||||
Map<CompetitorDTO, Color> raceColors = competitorsBoatColorsPerRace.get(raceIdentfier);
|
||||
if(raceColors != null) {
|
||||
result = raceColors.get(competitor);
|
||||
}
|
||||
}
|
||||
if(result == null && competitor.getColor() != null) {
|
||||
result = competitor.getColor();
|
||||
}
|
||||
// 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<CompetitorDTO, Color> raceColors = competitorsBoatColorsPerRace.get(raceIdentfier);
|
||||
if(raceColors == null) {
|
||||
raceColors = new HashMap<CompetitorDTO, Color>();
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
+6
@@ -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;
|
||||
@@ -238,6 +239,11 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
|
||||
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<CompetitorDTO, Filter<CompetitorDTO>> getCompetitorsFilterSet() {
|
||||
return competitorsFilterSet;
|
||||
|
||||
+3
@@ -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;
|
||||
@@ -62,6 +63,8 @@ public interface CompetitorSelectionProvider {
|
||||
|
||||
Color getColor(CompetitorDTO competitor);
|
||||
|
||||
Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier);
|
||||
|
||||
void addCompetitorSelectionChangeListener(CompetitorSelectionChangeListener listener);
|
||||
|
||||
void removeCompetitorSelectionChangeListener(CompetitorSelectionChangeListener listener);
|
||||
|
||||
+15
-5
@@ -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,7 +286,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
|
||||
|
||||
private Map<CompetitorDTO, List<GPSFixDTO>> lastDouglasPeuckerResult;
|
||||
|
||||
private CompetitorSelectionProvider competitorSelection;
|
||||
private final CompetitorSelectionProvider competitorSelection;
|
||||
private final CompetitorColorProvider competitorColorProvider;
|
||||
|
||||
private List<RegattaAndRaceIdentifier> 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<WindSource, WindSensorOverlay>();
|
||||
courseMarkOverlays = new HashMap<String, CourseMarkOverlay>();
|
||||
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<CompetitorDTO, BoatDTO> 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());
|
||||
}
|
||||
|
||||
+9
-2
@@ -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);
|
||||
|
||||
+7
-4
@@ -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<CompetitorDTO, Filter<CompetitorDTO>> filterSet = result.getOrCreateCompetitorsFilterSet("Empty");
|
||||
filterSet.addFilter(new Filter<CompetitorDTO>() {
|
||||
@Override public boolean matches(CompetitorDTO object) { return false; }
|
||||
|
||||
+5
-2
@@ -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<ComponentViewer>();
|
||||
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() {
|
||||
|
||||
+20
-1
@@ -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<CompetitorDTO, List<GPSFixDTO>> boatPositions = getBoatPositions(raceIdentifier,
|
||||
fromPerCompetitorIdAsString, toPerCompetitorIdAsString, extrapolate);
|
||||
final Map<CompetitorDTO, BoatDTO> competitorBoats = getBoatsOfCompetitors(raceIdentifier);
|
||||
final CoursePositionsDTO coursePositions = getCoursePositions(raceIdentifier, date);
|
||||
final List<SidelineDTO> 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<CompetitorDTO, BoatDTO> getBoatsOfCompetitors(RegattaAndRaceIdentifier raceIdentifier) {
|
||||
Map<CompetitorDTO, BoatDTO> result = new HashMap<CompetitorDTO, BoatDTO>();
|
||||
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);
|
||||
}
|
||||
|
||||
+16
-1
@@ -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<String, List<GPSFixDTO>> boatPositionsByCompetitorIdAsString;
|
||||
private Map<String, BoatDTO> competitorBoatsByCompetitorIdAsString;
|
||||
|
||||
private CoursePositionsDTO coursePositions;
|
||||
private List<SidelineDTO> courseSidelines;
|
||||
private List<CompactQuickRankDTO> quickRanks;
|
||||
@@ -32,12 +35,16 @@ public class CompactRaceMapDataDTO implements IsSerializable {
|
||||
|
||||
CompactRaceMapDataDTO() {}
|
||||
|
||||
public CompactRaceMapDataDTO(Map<CompetitorDTO, List<GPSFixDTO>> boatPositions, CoursePositionsDTO coursePositions,
|
||||
public CompactRaceMapDataDTO(Map<CompetitorDTO, List<GPSFixDTO>> boatPositions, Map<CompetitorDTO, BoatDTO> competitorBoats, CoursePositionsDTO coursePositions,
|
||||
List<SidelineDTO> courseSidelines, QuickRanksDTO quickRanks, long simulationResultVersion) {
|
||||
this.boatPositionsByCompetitorIdAsString = new HashMap<String, List<GPSFixDTO>>();
|
||||
for (Map.Entry<CompetitorDTO, List<GPSFixDTO>> e : boatPositions.entrySet()) {
|
||||
this.boatPositionsByCompetitorIdAsString.put(e.getKey().getIdAsString(), e.getValue());
|
||||
}
|
||||
this.competitorBoatsByCompetitorIdAsString = new HashMap<String, BoatDTO>();
|
||||
for (Map.Entry<CompetitorDTO, BoatDTO> e : competitorBoats.entrySet()) {
|
||||
this.competitorBoatsByCompetitorIdAsString.put(e.getKey().getIdAsString(), e.getValue());
|
||||
}
|
||||
this.quickRanks = new ArrayList<CompactQuickRankDTO>(quickRanks == null ? 0 : Util.size(quickRanks.getQuickRanks()));
|
||||
this.competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber = new LinkedHashMap<>();
|
||||
Map<String, Integer> competitorIdAsStringToOneBasedLegNumber = new HashMap<>();
|
||||
@@ -81,6 +88,14 @@ public class CompactRaceMapDataDTO implements IsSerializable {
|
||||
result.boatPositions.put(competitor, e.getValue());
|
||||
}
|
||||
}
|
||||
result.competitorBoats = new HashMap<CompetitorDTO, BoatDTO>();
|
||||
for (Map.Entry<String, BoatDTO> 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<String, Integer> i : competitorsInOrderOfWindwardDistanceTraveledFarthestFirstIdAsStringAndOneBasedLegNumber.entrySet()) {
|
||||
CompetitorDTO c = competitorsByIdAsString.get(i.getKey());
|
||||
|
||||
+2
@@ -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<CompetitorDTO, List<GPSFixDTO>> boatPositions;
|
||||
public Map<CompetitorDTO, BoatDTO> competitorBoats;
|
||||
public CoursePositionsDTO coursePositions;
|
||||
public List<SidelineDTO> courseSidelines;
|
||||
public LinkedHashMap<CompetitorDTO, QuickRankDTO> quickRanks;
|
||||
|
||||
+6
@@ -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<SharedDomainFactory> resolve(SharedDomainFactory domainFactory) {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boat resolveBoatOfCompetitor(Competitor competitor) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user