diff --git a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch
index c6adf7bec2d..f29b76fe2ce 100644
--- a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch
+++ b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch
@@ -41,5 +41,5 @@
-
+
diff --git a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch
index 1107e49c502..b0f7c71b37e 100644
--- a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch
+++ b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch
@@ -38,7 +38,7 @@
-
+
-
+
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 baa80fa589a..70c5e21cd04 100644
--- 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
@@ -1150,4 +1150,9 @@ public class MockedTrackedRace implements DynamicTrackedRace {
String trackName) {
return Collections.emptySet();
}
+
+ @Override
+ public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
+ return null;
+ }
}
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 2a0d856e3d1..05132e8622e 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
@@ -702,4 +702,9 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
String trackName) {
return Collections.emptySet();
}
+
+ @Override
+ public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
+ return null;
+ }
}
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java
index 1ff7b0f376b..b9141f4552d 100644
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractSimpleLeaderboardImpl.java
@@ -25,9 +25,11 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.MaxPointsReason;
+import com.sap.sailing.domain.common.Mile;
import com.sap.sailing.domain.common.NoWindError;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Speed;
+import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher;
@@ -40,6 +42,7 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.util.impl.RaceColumnListeners;
+import com.sap.sse.common.Duration;
import com.sap.sse.common.ObscuringIterable;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
@@ -789,31 +792,12 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW
@Override
public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
- Speed result = null;
- for (TrackedRace trackedRace : getTrackedRaces()) {
- if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) {
- NavigableSet markPassings = trackedRace.getMarkPassings(competitor);
- if (!markPassings.isEmpty()) {
- TimePoint from = markPassings.first().getTimePoint();
- TimePoint to;
- if (timePoint.after(markPassings.last().getTimePoint()) &&
- markPassings.last().getWaypoint() == trackedRace.getRace().getCourse().getLastWaypoint()) {
- // stop counting when competitor finished the race
- to = markPassings.last().getTimePoint();
- } else {
- if (markPassings.last().getWaypoint() != trackedRace.getRace().getCourse().getLastWaypoint() &&
- timePoint.after(markPassings.last().getTimePoint())) {
- result = null;
- break;
- }
- to = timePoint;
- }
- Distance distanceTraveled = trackedRace.getDistanceTraveled(competitor, timePoint);
- if (distanceTraveled != null) {
- result = distanceTraveled.inTime(to.asMillis()-from.asMillis());
- }
- }
- }
+ Speed result = null;
+ final Duration totalTimeSailed = this.getTotalTimeSailed(competitor, timePoint);
+ final Distance totalDistanceSailed = this.getTotalDistanceTraveled(competitor, timePoint);
+ if (totalDistanceSailed != null && totalTimeSailed != null) {
+ result = new KnotSpeedImpl(totalDistanceSailed.getMeters() /
+ totalTimeSailed.asSeconds() / Mile.METERS_PER_NAUTICAL_MILE * 3600.0);
}
return result;
}
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 19cf1f6dc63..d6d114e47ba 100644
--- 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
@@ -1012,4 +1012,12 @@ public interface TrackedRace extends Serializable, IsManagedByCache getAttachedRaceLogs();
+ /**
+ * Computes the average speed over ground for a {@link Competitor} based on times and distances
+ * for all finished {@link TrackedLegOfCompetitor}s.
+ *
+ * @param timePoint time point up and until to compute the speed
+ */
+ Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint);
+
}
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 dcf53b30598..a93c22b0f4c 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
@@ -74,6 +74,7 @@ import com.sap.sailing.domain.common.CourseChange;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.common.ManeuverType;
+import com.sap.sailing.domain.common.Mile;
import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position;
@@ -4189,4 +4190,23 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
public Iterable getAttachedRaceLogs() {
return new HashSet<>(attachedRaceLogs.values());
}
+
+ @Override
+ public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
+ Speed result = null;
+ Duration totalTimeSailedInRace = Duration.NULL;
+ Distance totalDistanceSailedInRace = Distance.NULL;
+ for (TrackedLeg legGeneral : getTrackedLegs()) {
+ TrackedLegOfCompetitor leg = legGeneral.getTrackedLeg(competitor);
+ if (leg != null && leg.getTime(timePoint) != null) {
+ totalDistanceSailedInRace.add(leg.getDistanceTraveled(timePoint));
+ totalTimeSailedInRace.plus(leg.getTime(timePoint));
+ }
+ }
+ if (!totalTimeSailedInRace.equals(Duration.NULL) && !totalDistanceSailedInRace.equals(Distance.NULL)) {
+ result = new KnotSpeedImpl(totalDistanceSailedInRace.getMeters() /
+ totalTimeSailedInRace.asSeconds() / Mile.METERS_PER_NAUTICAL_MILE * 3600.0);
+ }
+ 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 58af534d869..7337703c9d7 100644
--- 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
@@ -720,7 +720,6 @@ public class MockedTrackedRace implements DynamicTrackedRace {
@Override
public boolean isUsingMarkPassingCalculator() {
- // TODO Auto-generated method stub
return false;
}
@@ -881,4 +880,9 @@ public class MockedTrackedRace implements DynamicTrackedRace {
String trackName) {
return Collections.emptySet();
}
+
+ @Override
+ public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
+ return null;
+ }
}
diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch
index 54e1704423a..0e9d9decea6 100755
--- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch
+++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch
@@ -62,5 +62,5 @@
-
+
diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch
index 3ec300f1256..3dd4667c212 100644
--- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch
+++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch
@@ -58,7 +58,7 @@
-
+
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch
index cb56815492e..cb7244afad0 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch
@@ -27,6 +27,6 @@
-
+
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 e98021cbaf9..7a632430fa0 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
@@ -683,4 +683,9 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
String trackName) {
return Collections.emptySet();
}
+
+ @Override
+ public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
+ return null;
+ }
}
diff --git a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java
index 9fc2bcefcd1..b8b8b8e72a8 100644
--- a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java
+++ b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java
@@ -591,7 +591,7 @@ public class LeaderboardData extends ExportAction {
}
addNamedElementWithValue(competitorRaceDataElement, "distance_traveled_in_meters", distanceTraveledInThisRace == null ? 0.0 : distanceTraveledInThisRace.getMeters());
addNamedElementWithValue(competitorRaceDataElement, "distance_traveled_including_non_finished_legs_in_meters", getDistanceTraveled(race, competitor, race.getEndOfRace(), /*alsoReturnDistanceIfCompetitorHasNotFinishedRace*/ true).getMeters());
- Speed averageSpeedOverGround = leaderboard.getAverageSpeedOverGround(competitor, race.getEndOfRace());
+ Speed averageSpeedOverGround = race.getAverageSpeedOverGround(competitor, race.getEndOfRace());
addNamedElementWithValue(competitorRaceDataElement, "average_speed_over_ground_in_knots", averageSpeedOverGround == null ? 0.0 : averageSpeedOverGround.getKnots());
addNamedElementWithValue(competitorRaceDataElement, "final_race_rank", ++raceRank);
TrackedLegOfCompetitor trackedLegOfCompetitor = race.getTrackedLeg(competitor, race.getRace().getCourse().getFirstLeg());
diff --git a/java/com.sap.sse.security.ui/Security UI sdm.launch b/java/com.sap.sse.security.ui/Security UI sdm.launch
index 633ad54780f..a4943911e8a 100644
--- a/java/com.sap.sse.security.ui/Security UI sdm.launch
+++ b/java/com.sap.sse.security.ui/Security UI sdm.launch
@@ -50,5 +50,5 @@
-
+
diff --git a/java/com.sap.sse.security.ui/Security UI.launch b/java/com.sap.sse.security.ui/Security UI.launch
index 607b86530a3..aeb2f6027c7 100644
--- a/java/com.sap.sse.security.ui/Security UI.launch
+++ b/java/com.sap.sse.security.ui/Security UI.launch
@@ -47,7 +47,7 @@
-
+
-
+