From 82077866ce326d866cb24388ccd73ab865da7264 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 20 Dec 2011 16:10:56 +0100 Subject: [PATCH] started to introduce a flag on TrackedRace identifying whether the first leg is known to be upwind --- .../impl/DomainFactoryImpl.java | 18 +++++++++--------- .../domain/test/LeaderboardOfflineTest.java | 2 +- .../domain/test/StoredTrackBasedTest.java | 2 +- .../com/sap/sailing/domain/test/TackTest.java | 8 +++++--- .../sailing/domain/test/TrackBasedTest.java | 2 +- .../com/sap/sailing/domain/test/TrackTest.java | 4 ++-- .../WindEstimationOnConstructedTracksTest.java | 2 +- .../domain/test/mock/MockedTrackedRace.java | 11 +++++++++++ .../impl/DomainFactoryImpl.java | 10 +++++++++- .../com/sap/sailing/domain/base/BoatClass.java | 13 +++++++++++++ .../sap/sailing/domain/base/DomainFactory.java | 2 +- .../domain/base/impl/BoatClassImpl.java | 10 +++++++++- .../domain/base/impl/DomainFactoryImpl.java | 4 ++-- .../domain/tracking/DynamicTrackedRace.java | 6 ++++++ .../sailing/domain/tracking/TrackedRace.java | 9 +++++++++ .../tracking/impl/DynamicTrackedRaceImpl.java | 13 +++++++++++++ .../domain/tracking/impl/TrackedRaceImpl.java | 11 ++++++----- .../TestStoringAndRetrievingLeaderboards.java | 2 +- .../server/test/RaceTrackerStartStopTest.java | 2 +- 19 files changed, 101 insertions(+), 30 deletions(-) diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index f9ce8195384..d176eaebd2b 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -76,15 +76,15 @@ public class DomainFactoryImpl implements DomainFactory { SAM007000 Men's Keelboat = Starboot Männer SAW010000 Women's Match Racing = Matchrace Damen Elliott 6M (modified) */ - olympicClassesByID.put("102", baseDomainFactory.getOrCreateBoatClass("RS:X")); - olympicClassesByID.put("004", baseDomainFactory.getOrCreateBoatClass("Laser")); - olympicClassesByID.put("103", baseDomainFactory.getOrCreateBoatClass("Laser Radial")); - olympicClassesByID.put("002", baseDomainFactory.getOrCreateBoatClass("Finn")); - olympicClassesByID.put("005", baseDomainFactory.getOrCreateBoatClass("470")); - olympicClassesByID.put("009", baseDomainFactory.getOrCreateBoatClass("49er")); - olympicClassesByID.put("007", baseDomainFactory.getOrCreateBoatClass("Star")); - olympicClassesByID.put("010", baseDomainFactory.getOrCreateBoatClass("Elliott 6M")); - unknownBoatClass = new BoatClassImpl("Unknown"); + olympicClassesByID.put("102", baseDomainFactory.getOrCreateBoatClass("RS:X", /* typicallyStartsUpwind */ true)); + olympicClassesByID.put("004", baseDomainFactory.getOrCreateBoatClass("Laser", /* typicallyStartsUpwind */ true)); + olympicClassesByID.put("103", baseDomainFactory.getOrCreateBoatClass("Laser Radial", /* typicallyStartsUpwind */ true)); + olympicClassesByID.put("002", baseDomainFactory.getOrCreateBoatClass("Finn", /* typicallyStartsUpwind */ true)); + olympicClassesByID.put("005", baseDomainFactory.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true)); + olympicClassesByID.put("009", baseDomainFactory.getOrCreateBoatClass("49er", /* alwaysStartsUpwind */ true)); + olympicClassesByID.put("007", baseDomainFactory.getOrCreateBoatClass("Star", /* typicallyStartsUpwind */ true)); + olympicClassesByID.put("010", baseDomainFactory.getOrCreateBoatClass("Elliott 6M", /* typicallyStartsUpwind */ true)); + unknownBoatClass = new BoatClassImpl("Unknown", /* typicallyStartsUpwind */ false); } @Override diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java index 4c0ed3b27bf..141fadaeac6 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java @@ -50,7 +50,7 @@ public class LeaderboardOfflineTest { /* dateOfBirth */ null, "This is famous "+competitorName)), new PersonImpl("Rigo van Maas", new NationalityImpl("The Netherlands", "NED"), /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat", - new BoatClassImpl("505"), null)); + new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); } public void setupRaces(int numberOfStartedRaces, int numberOfNotStartedRaces) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java index e5e6df9c9cc..2b74a617ae6 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java @@ -113,7 +113,7 @@ public abstract class StoredTrackBasedTest extends TrackBasedTest { Person p = new PersonImpl(competitorName, /* nationality */ null, /* dateOfBirth */ null, /* description */ null); Team t = new TeamImpl(competitorName, Collections.singleton(p), /* coach */ null); Competitor c = new CompetitorImpl(competitorName, competitorName, t, new BoatImpl(competitorName, - new BoatClassImpl("505"), null)); + new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); DynamicGPSFixTrack track = readTrack(c, KIELER_WOCHE); if (track != null) { tracks.put(c, track); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java index b1144b13217..8b1ef1ff1d3 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java @@ -33,9 +33,11 @@ public class TackTest extends StoredTrackBasedTestWithTrackedRace { @Before public void setUp() { competitor = new CompetitorImpl(123, "Wolfgang Hunger", new TeamImpl("STG", Collections.singleton( - new PersonImpl("Wolfgang Hunger", new NationalityImpl("Germany", "GER"), - /* dateOfBirth */ null, "This is famous Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("The Netherlands", "NED"), - /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Wolfgang Hunger's boat", new BoatClassImpl("505"), null)); +new PersonImpl("Wolfgang Hunger", new NationalityImpl("Germany", "GER"), + /* dateOfBirth */null, "This is famous Wolfgang Hunger")), new PersonImpl("Rigo van Maas", + new NationalityImpl("The Netherlands", "NED"), + /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Wolfgang Hunger's boat", + new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); setTrackedRace(createTestTrackedRace("Kieler Woche", "505 Race 2", "505", Collections.singleton(competitor))); } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java index d157ccce4c6..28c32a6e046 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java @@ -46,7 +46,7 @@ public abstract class TrackBasedTest { * competitors specified. The marks are laid out such that the upwind/downwind leg detection should be alright. */ protected DynamicTrackedRace createTestTrackedRace(String eventName, String raceName, String boatClassName, Iterable competitors) { - BoatClassImpl boatClass = new BoatClassImpl(boatClassName); + BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true); Event event = new EventImpl(eventName, boatClass); TrackedEvent trackedEvent = new TrackedEventImpl(event); List waypoints = new ArrayList(); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java index efa3c8466b5..31ee9dd1e9d 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackTest.java @@ -44,8 +44,8 @@ public class TrackTest { @Before public void setUp() throws InterruptedException { - track = new DynamicGPSFixMovingTrackImpl(new BoatImpl("MyFirstBoat", - new BoatClassImpl("505"), null), /* millisecondsOverWhichToAverage */ 5000, /* no smoothening */ null); + track = new DynamicGPSFixMovingTrackImpl(new BoatImpl("MyFirstBoat", new BoatClassImpl("505", /* typicallyStartsUpwind */ + true), null), /* millisecondsOverWhichToAverage */5000, /* no smoothening */null); TimePoint now1 = MillisecondsTimePoint.now(); waitThreeMillis(); TimePoint now2 = MillisecondsTimePoint.now(); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnConstructedTracksTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnConstructedTracksTest.java index 6d1345f0f68..80052e9e820 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnConstructedTracksTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindEstimationOnConstructedTracksTest.java @@ -74,7 +74,7 @@ public class WindEstimationOnConstructedTracksTest extends StoredTrackBasedTest new PersonImpl(competitorName, new NationalityImpl("Germany", "GER"), /* dateOfBirth */ null, "This is famous "+competitorName)), new PersonImpl("Rigo van Maas", new NationalityImpl("The Netherlands", "NED"), - /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl(competitorName+"'s boat", new BoatClassImpl("505"), null)); + /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl(competitorName+"'s boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); } private void setBearingForCompetitor(Competitor competitor, MillisecondsTimePoint timePoint, double bearingDeg) { 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 6f8e2e924f8..e0174efaa33 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 @@ -423,4 +423,15 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } + @Override + public boolean raceIsKnownToStartUpwind() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setRaceIsKnownToStartUpwind(boolean raceIsKnownToStartUpwind) { + // TODO Auto-generated method stub + } + } 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 0c3ad83ab14..5a86e2bb7dd 100644 --- 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 @@ -8,11 +8,14 @@ import java.net.URISyntaxException; import java.net.URL; import java.text.ParseException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Logger; import com.sap.sailing.domain.base.Boat; @@ -89,9 +92,13 @@ public class DomainFactoryImpl implements DomainFactory { new HashMap, com.sap.sailing.domain.base.Event>(); private final Map raceCache = new HashMap(); + + private final Set typicallyUpwindStartingBoatClassNames; public DomainFactoryImpl(com.sap.sailing.domain.base.DomainFactory baseDomainFactory) { this.baseDomainFactory = baseDomainFactory; + typicallyUpwindStartingBoatClassNames = new HashSet(Arrays.asList(new String[] { "24mr", "Finn", "Radial", + "470", "Star", "49er" })); } @Override @@ -196,7 +203,8 @@ public class DomainFactoryImpl implements DomainFactory { @Override public BoatClass getOrCreateBoatClass(CompetitorClass competitorClass) { - return baseDomainFactory.getOrCreateBoatClass(competitorClass == null ? "" : competitorClass.getName()); + return baseDomainFactory.getOrCreateBoatClass(competitorClass == null ? "" : competitorClass.getName(), + /* typicallyStartsUpwind */ typicallyUpwindStartingBoatClassNames.contains(competitorClass.getName())); } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/BoatClass.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/BoatClass.java index 0a7c6a368ce..db61c3d5695 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/BoatClass.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/BoatClass.java @@ -22,4 +22,17 @@ public interface BoatClass extends Named { double getMinimumAngleBetweenDifferentTacksDownwind(); double getMinimumAngleBetweenDifferentTacksUpwind(); + + /** + * Most olympic boat classes start their race with an upwind leg. Some other classes such + * as the Extreme Sailing Series / Extreme40 do not necessarily start with an upwind leg. + * Knowing this is relevant for the wind estimation fallback strategy. If the first leg of + * a boat class doesn't have to be an upwind leg it's not permissible to estimate the wind + * based on the course layout.

+ * + * The result of calling this method suggests a good default for this boat class. It is + * not an authoritative, prescriptive value. Races with this boat class may still + * start with a non-upwind leg even though this method returns true. + */ + boolean typicallyStartsUpwind(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java index 367fed0512c..53e269e93a9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/DomainFactory.java @@ -20,5 +20,5 @@ public interface DomainFactory { MarkPassing createMarkPassing(TimePoint timePoint, Waypoint waypoint, Competitor competitor); - BoatClass getOrCreateBoatClass(String name); + BoatClass getOrCreateBoatClass(String name, boolean typicallyStartsUpwind); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/BoatClassImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/BoatClassImpl.java index 4a616df523f..ca6092be2ad 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/BoatClassImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/BoatClassImpl.java @@ -19,8 +19,11 @@ public class BoatClassImpl extends NamedImpl implements BoatClass { private final long approximateManeuverDurationInMilliseconds; - public BoatClassImpl(String name) { + private final boolean alwaysStartsUpwind; + + public BoatClassImpl(String name, boolean alwaysStartsUpwind) { super(name); + this.alwaysStartsUpwind = alwaysStartsUpwind; approximateManeuverDurationInMilliseconds = 8000; // as discussed with Dennis Gehrlein } @@ -49,4 +52,9 @@ public class BoatClassImpl extends NamedImpl implements BoatClass { return MAXIMUM_DISTANCE_FOR_COURSE_APPROXIMATION; } + @Override + public boolean typicallyStartsUpwind() { + return alwaysStartsUpwind; + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java index 82822a63b27..0c680ac6a57 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DomainFactoryImpl.java @@ -76,11 +76,11 @@ public class DomainFactoryImpl implements DomainFactory { } @Override - public BoatClass getOrCreateBoatClass(String name) { + public BoatClass getOrCreateBoatClass(String name, boolean typicallyStartsUpwind) { synchronized (boatClassCache) { BoatClass result = boatClassCache.get(name); if (result == null) { - result = new BoatClassImpl(name); + result = new BoatClassImpl(name, typicallyStartsUpwind); boatClassCache.put(name, result); } return result; 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 abf11733b57..33f11d5998b 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 @@ -45,4 +45,10 @@ public interface DynamicTrackedRace extends TrackedRace { void setMillisecondsOverWhichToAverageWind(long millisecondsOverWhichToAverageWind); DynamicTrackedEvent getTrackedEvent(); + + /** + * If and only if raceIsKnownToStartUpwind is true, this tracked race is allowed to use + * the start leg's direction as a fallback for estimating the wind direction. + */ + void setRaceIsKnownToStartUpwind(boolean raceIsKnownToStartUpwind); } 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 2212ac832f0..cea13ca8937 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 @@ -14,6 +14,7 @@ import com.sap.sailing.domain.base.Tack; import com.sap.sailing.domain.base.TimePoint; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.DouglasPeucker; +import com.sap.sailing.domain.tracking.TrackedLeg.LegType; /** * Live tracking data of a single race. The race follows a defined {@link Course} with a sequence of {@link Leg}s. The @@ -221,4 +222,12 @@ public interface TrackedRace { * this race between from and to. */ List getManeuvers(Competitor competitor, TimePoint from, TimePoint to) throws NoWindException; + + /** + * @return true if this race is known to start with an {@link LegType#UPWIND upwind} leg. + * If this is the case, the wind estimation may default to using the first leg's direction at race start + * time as the direction the wind comes from. + */ + boolean raceIsKnownToStartUpwind(); + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index e75014c21ee..a6415379bf8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -35,9 +35,12 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements private Set> listeners; + private boolean raceIsKnownToStartUpwind; + public DynamicTrackedRaceImpl(TrackedEvent trackedEvent, RaceDefinition race, WindStore windStore, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed) { super(trackedEvent, race, windStore, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed); + this.raceIsKnownToStartUpwind = race.getBoatClass().typicallyStartsUpwind(); for (Competitor competitor : getRace().getCompetitors()) { DynamicGPSFixTrack track = getTrack(competitor); track.addListener(this); @@ -281,4 +284,14 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements return (DynamicTrackedEvent) super.getTrackedEvent(); } + @Override + public void setRaceIsKnownToStartUpwind(boolean raceIsKnownToStartUpwind) { + this.raceIsKnownToStartUpwind = raceIsKnownToStartUpwind; + } + + @Override + public boolean raceIsKnownToStartUpwind() { + return raceIsKnownToStartUpwind; + } + } 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 7b7ae38cfa0..c123bee5c5d 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 @@ -112,7 +112,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { private boolean warnedOfNoWindFromSelectedSource; private boolean warnedOfUsingLegDirectionAsWindEstimation; - + public TrackedRaceImpl(TrackedEvent trackedEvent, RaceDefinition race, WindStore windStore, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed) { super(); @@ -419,13 +419,14 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { } } } - if (result == null) { + if (result == null && raceIsKnownToStartUpwind()) { if (!warnedOfUsingLegDirectionAsWindEstimation) { - logger.warning("Found no other wind settings either; using starting leg direction as guess for wind direction. Force assumed as 1 knot."+ - " Future warnings of this type will be suppressed for this race."); + logger.warning("Found no other wind settings either; using starting leg direction at start time as guess for wind direction. " + + "Force assumed as 1 knot. Future warnings of this type will be suppressed for this race."); warnedOfUsingLegDirectionAsWindEstimation = true; } - result = getDirectionFromStartToNextMark(at); + TimePoint starttime = getStart(); + result = getDirectionFromStartToNextMark(starttime == null ? at : starttime); } } return result; diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java index 1a5877b45ce..454c80b7ea5 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java @@ -151,7 +151,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { Competitor competitor = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", new TeamImpl("STG", Collections.singleton( new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("Germany", "GER"), /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("The Netherlands", "NED"), - /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505"), null)); + /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); return competitor; } diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java index 67b2a6ffb6c..e62440e05f3 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerStartStopTest.java @@ -56,7 +56,7 @@ public class RaceTrackerStartStopTest { @Before public void setUp() { racingEventService = new RacingEventServiceImplMock(); - boatClass = new BoatClassImpl(BOATCLASSNAME); + boatClass = new BoatClassImpl(BOATCLASSNAME, /* typicallyStartsUpwind */ true); event = new EventImpl(EVENTNAME, boatClass); racingEventService.getEventsByName().put(EVENTNAME, event); TrackedEvent trackedEvent1 = racingEventService.getOrCreateTrackedEvent(event);