From 972062908705bb4bbcb74542cb49062687910797 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 13 Nov 2013 22:23:43 +0100 Subject: [PATCH] made robust against NPE after getEstimatedSpeed more aggressively returns null when fixes are strange --- .../impl/TrackedLegOfCompetitorImpl.java | 36 ++++++++++--------- .../domain/tracking/impl/TrackedRaceImpl.java | 22 +++++++----- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java index ad39f895df2..1c81b57c9ff 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedLegOfCompetitorImpl.java @@ -586,21 +586,25 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { if (speedWhenSpeedStartedToDrop != null) { TimePoint timePointWhenSpeedLevelledOffAfterManeuver = fixes.get(fixes.size()-1).getTimePoint(); SpeedWithBearing speedAfterManeuver = track.getEstimatedSpeed(timePointWhenSpeedLevelledOffAfterManeuver); - // For upwind/downwind legs, find the mean course between inbound and outbound course and project actual and - // extrapolated positions onto it: - Bearing middleManeuverAngle = speedWhenSpeedStartedToDrop.getBearing().middle(speedAfterManeuver.getBearing()); - // extrapolate maximum speed before maneuver to time point of maximum speed after maneuver and project resulting position - // onto the average maneuver course; compare to the projected position actually reached at the time point of maximum speed after - // maneuver: - Position positionWhenSpeedStartedToDrop = track.getEstimatedPosition(timePointWhenSpeedStartedToDrop, /* extrapolate */ false); - Position extrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver = - speedWhenSpeedStartedToDrop.travelTo(positionWhenSpeedStartedToDrop, timePointWhenSpeedStartedToDrop, timePointWhenSpeedLevelledOffAfterManeuver); - Position actualPositionAtTimePointOfMaxSpeedAfterManeuver = track.getEstimatedPosition(timePointWhenSpeedLevelledOffAfterManeuver, /* extrapolate */ false); - Position projectedExtrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver = - extrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver.projectToLineThrough(positionWhenSpeedStartedToDrop, middleManeuverAngle); - Position projectedActualPositionAtTimePointOfMaxSpeedAfterManeuver = - actualPositionAtTimePointOfMaxSpeedAfterManeuver.projectToLineThrough(positionWhenSpeedStartedToDrop, middleManeuverAngle); - result = projectedActualPositionAtTimePointOfMaxSpeedAfterManeuver.getDistance(projectedExtrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver); + if (speedAfterManeuver != null) { + // For upwind/downwind legs, find the mean course between inbound and outbound course and project actual and + // extrapolated positions onto it: + Bearing middleManeuverAngle = speedWhenSpeedStartedToDrop.getBearing().middle(speedAfterManeuver.getBearing()); + // extrapolate maximum speed before maneuver to time point of maximum speed after maneuver and project resulting position + // onto the average maneuver course; compare to the projected position actually reached at the time point of maximum speed after + // maneuver: + Position positionWhenSpeedStartedToDrop = track.getEstimatedPosition(timePointWhenSpeedStartedToDrop, /* extrapolate */ false); + Position extrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver = + speedWhenSpeedStartedToDrop.travelTo(positionWhenSpeedStartedToDrop, timePointWhenSpeedStartedToDrop, timePointWhenSpeedLevelledOffAfterManeuver); + Position actualPositionAtTimePointOfMaxSpeedAfterManeuver = track.getEstimatedPosition(timePointWhenSpeedLevelledOffAfterManeuver, /* extrapolate */ false); + Position projectedExtrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver = + extrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver.projectToLineThrough(positionWhenSpeedStartedToDrop, middleManeuverAngle); + Position projectedActualPositionAtTimePointOfMaxSpeedAfterManeuver = + actualPositionAtTimePointOfMaxSpeedAfterManeuver.projectToLineThrough(positionWhenSpeedStartedToDrop, middleManeuverAngle); + result = projectedActualPositionAtTimePointOfMaxSpeedAfterManeuver.getDistance(projectedExtrapolatedPositionAtTimePointOfMaxSpeedAfterManeuver); + } else { + result = null; + } } else { result = null; } @@ -641,7 +645,7 @@ public class TrackedLegOfCompetitorImpl implements TrackedLegOfCompetitor { while (fixIter.hasNext()) { fix = fixIter.next(); final SpeedWithBearing estimatedSpeedAtFix = track.getEstimatedSpeed(fix.getTimePoint()); - if (lastFix != null) { + if (lastFix != null && lastSpeed != null && lastLastSpeed != null && estimatedSpeedAtFix != null) { if (lastSpeed.compareTo(lastLastSpeed) > 0 && lastSpeed.compareTo(estimatedSpeedAtFix) > 0) { maxima.add(lastFix); } else if (lastSpeed.compareTo(lastLastSpeed) < 0 && lastSpeed.compareTo(estimatedSpeedAtFix) < 0) { 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 ad4943c338f..5b4dd9efb29 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 @@ -2259,14 +2259,20 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { break; } if (lastFix != null) { - Bearing courseAtLastFix = track.getEstimatedSpeed(lastFix.getTimePoint()).getBearing(); - Bearing courseAtFix = track.getEstimatedSpeed(fix.getTimePoint()).getBearing(); - double angleSpeedInDegreesPerSecond = Math.abs((courseAtFix.getDifferenceTo(courseAtLastFix) - .getDegrees()) - / (double) (fix.getTimePoint().asMillis() - lastFix.getTimePoint().asMillis())); - if (angleSpeedInDegreesPerSecond > maxAngleSpeedInDegreesPerSecond) { - maxAngleSpeedInDegreesPerSecond = angleSpeedInDegreesPerSecond; - result = lastFix.getTimePoint(); + final SpeedWithBearing lastEstimatedSpeed = track.getEstimatedSpeed(lastFix.getTimePoint()); + if (lastEstimatedSpeed != null) { + Bearing courseAtLastFix = lastEstimatedSpeed.getBearing(); + final SpeedWithBearing estimatedSpeed = track.getEstimatedSpeed(fix.getTimePoint()); + if (estimatedSpeed != null) { + Bearing courseAtFix = estimatedSpeed.getBearing(); + double angleSpeedInDegreesPerSecond = Math.abs((courseAtFix + .getDifferenceTo(courseAtLastFix).getDegrees()) + / (double) (fix.getTimePoint().asMillis() - lastFix.getTimePoint().asMillis())); + if (angleSpeedInDegreesPerSecond > maxAngleSpeedInDegreesPerSecond) { + maxAngleSpeedInDegreesPerSecond = angleSpeedInDegreesPerSecond; + result = lastFix.getTimePoint(); + } + } } } lastFix = fix;