mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-03 17:49:40 +00:00
Merge branch 'master' into bug1994
This commit is contained in:
commit
a05c16b9f5
16 files changed
+186
-27
No files matched your search
+14
@@ -32,6 +32,7 @@ import com.sap.sailing.domain.common.Tack;
|
|||||||
import com.sap.sailing.domain.common.TimePoint;
|
import com.sap.sailing.domain.common.TimePoint;
|
||||||
import com.sap.sailing.domain.common.WindSource;
|
import com.sap.sailing.domain.common.WindSource;
|
||||||
import com.sap.sailing.domain.common.WindSourceType;
|
import com.sap.sailing.domain.common.WindSourceType;
|
||||||
|
import com.sap.sailing.domain.common.racelog.Flags;
|
||||||
import com.sap.sailing.domain.leaderboard.ScoringScheme;
|
import com.sap.sailing.domain.leaderboard.ScoringScheme;
|
||||||
import com.sap.sailing.domain.racelog.RaceLog;
|
import com.sap.sailing.domain.racelog.RaceLog;
|
||||||
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
||||||
@@ -45,6 +46,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving;
|
|||||||
import com.sap.sailing.domain.tracking.LineDetails;
|
import com.sap.sailing.domain.tracking.LineDetails;
|
||||||
import com.sap.sailing.domain.tracking.Maneuver;
|
import com.sap.sailing.domain.tracking.Maneuver;
|
||||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||||
|
import com.sap.sailing.domain.tracking.RaceAbortedListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceListener;
|
import com.sap.sailing.domain.tracking.RaceListener;
|
||||||
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
||||||
@@ -998,4 +1000,16 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRaceAbortedListener(RaceAbortedListener listener) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAbortedByRaceCommittee(Flags flag) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+7
@@ -34,6 +34,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
|
|||||||
import com.sap.sailing.domain.tracking.LineDetails;
|
import com.sap.sailing.domain.tracking.LineDetails;
|
||||||
import com.sap.sailing.domain.tracking.Maneuver;
|
import com.sap.sailing.domain.tracking.Maneuver;
|
||||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||||
|
import com.sap.sailing.domain.tracking.RaceAbortedListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
||||||
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
||||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||||
@@ -646,4 +647,10 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRaceAbortedListener(RaceAbortedListener listener) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+8
@@ -270,4 +270,12 @@ public interface DomainFactory {
|
|||||||
|
|
||||||
List<Sideline> createSidelines(String raceMetadataString, Iterable<? extends TracTracControlPoint> allEventControlPoints);
|
List<Sideline> createSidelines(String raceMetadataString, Iterable<? extends TracTracControlPoint> allEventControlPoints);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When a tracked race has been created for tracking with the TracTrac adapter, change listeners have to be subscribed to
|
||||||
|
* the {@link TrackedRace} which will notify certain changes to the race's state to TracTrac. This includes the course layout,
|
||||||
|
* the start time and whether a race was aborted.
|
||||||
|
*/
|
||||||
|
void addTracTracUpdateHandlers(URI tracTracUpdateURI, UUID tracTracEventUuid, String tracTracUsername,
|
||||||
|
String tracTracPassword, RaceDefinition raceDefinition, DynamicTrackedRace trackedRace);
|
||||||
|
|
||||||
}
|
}
|
||||||
+19
-10
@@ -519,16 +519,8 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
trackedRace = createTrackedRace(trackedRegatta, raceDefinition, sidelines, windStore, EmptyGPSFixStore.INSTANCE,
|
trackedRace = createTrackedRace(trackedRegatta, raceDefinition, sidelines, windStore, EmptyGPSFixStore.INSTANCE,
|
||||||
delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
|
delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
|
||||||
logger.info("Added race " + raceDefinition + " to regatta " + trackedRegatta.getRegatta());
|
logger.info("Added race " + raceDefinition + " to regatta " + trackedRegatta.getRegatta());
|
||||||
|
addTracTracUpdateHandlers(tracTracUpdateURI, tracTracEventUuid, tracTracUsername, tracTracPassword,
|
||||||
TracTracCourseDesignUpdateHandler courseDesignHandler = new TracTracCourseDesignUpdateHandler(
|
raceDefinition, trackedRace);
|
||||||
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
|
|
||||||
raceDefinition.getId());
|
|
||||||
trackedRace.addCourseDesignChangedListener(courseDesignHandler);
|
|
||||||
|
|
||||||
TracTracStartTimeUpdateHandler startTimeHandler = new TracTracStartTimeUpdateHandler(
|
|
||||||
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
|
|
||||||
raceDefinition.getId());
|
|
||||||
trackedRace.addStartTimeChangedListener(startTimeHandler);
|
|
||||||
raceCache.put(raceId, raceDefinition);
|
raceCache.put(raceId, raceDefinition);
|
||||||
raceCache.notifyAll();
|
raceCache.notifyAll();
|
||||||
} else {
|
} else {
|
||||||
@@ -546,6 +538,23 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addTracTracUpdateHandlers(URI tracTracUpdateURI, UUID tracTracEventUuid, String tracTracUsername,
|
||||||
|
String tracTracPassword, RaceDefinition raceDefinition, DynamicTrackedRace trackedRace) {
|
||||||
|
TracTracCourseDesignUpdateHandler courseDesignHandler = new TracTracCourseDesignUpdateHandler(
|
||||||
|
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
|
||||||
|
raceDefinition.getId());
|
||||||
|
trackedRace.addCourseDesignChangedListener(courseDesignHandler);
|
||||||
|
TracTracStartTimeUpdateHandler startTimeHandler = new TracTracStartTimeUpdateHandler(
|
||||||
|
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
|
||||||
|
raceDefinition.getId());
|
||||||
|
trackedRace.addStartTimeChangedListener(startTimeHandler);
|
||||||
|
TracTracRaceAbortedHandler raceAbortedHandler = new TracTracRaceAbortedHandler(
|
||||||
|
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
|
||||||
|
raceDefinition.getId());
|
||||||
|
trackedRace.addRaceAbortedListener(raceAbortedHandler);
|
||||||
|
}
|
||||||
|
|
||||||
private DynamicTrackedRace createTrackedRace(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable<Sideline> sidelines, WindStore windStore, GPSFixStore gpsFixStore,
|
private DynamicTrackedRace createTrackedRace(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable<Sideline> sidelines, WindStore windStore, GPSFixStore gpsFixStore,
|
||||||
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
|
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
|
||||||
return trackedRegatta.createTrackedRace(race, sidelines,
|
return trackedRegatta.createTrackedRace(race, sidelines,
|
||||||
|
|||||||
+1
-7
@@ -220,13 +220,7 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<IControlRoute,
|
|||||||
windStore, EmptyGPSFixStore.INSTANCE, delayToLiveInMillis, millisecondsOverWhichToAverageWind,
|
windStore, EmptyGPSFixStore.INSTANCE, delayToLiveInMillis, millisecondsOverWhichToAverageWind,
|
||||||
/* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(),
|
/* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(),
|
||||||
raceDefinitionSetToUpdate);
|
raceDefinitionSetToUpdate);
|
||||||
TracTracCourseDesignUpdateHandler courseDesignHandler = new TracTracCourseDesignUpdateHandler(tracTracUpdateURI,
|
getDomainFactory().addTracTracUpdateHandlers(tracTracUpdateURI, getTracTracEvent().getId(), tracTracUsername, tracTracPassword, race, trackedRace);
|
||||||
tracTracUsername, tracTracPassword,
|
|
||||||
getTracTracEvent().getId(), race.getId());
|
|
||||||
trackedRace.addCourseDesignChangedListener(courseDesignHandler);
|
|
||||||
TracTracStartTimeUpdateHandler startTimeHandler = new TracTracStartTimeUpdateHandler(tracTracUpdateURI,
|
|
||||||
tracTracUsername, tracTracPassword, getTracTracEvent().getId(), race.getId());
|
|
||||||
trackedRace.addStartTimeChangedListener(startTimeHandler);
|
|
||||||
if (!Activator.getInstance().isUseTracTracMarkPassings()) {
|
if (!Activator.getInstance().isUseTracTracMarkPassings()) {
|
||||||
new MarkPassingCalculator(trackedRace, true);
|
new MarkPassingCalculator(trackedRace, true);
|
||||||
}
|
}
|
||||||
|
|||||||
+60
@@ -0,0 +1,60 @@
|
|||||||
|
package com.sap.sailing.domain.tractracadapter.impl;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.json.simple.parser.ParseException;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.common.racelog.Flags;
|
||||||
|
import com.sap.sailing.domain.tracking.RaceAbortedListener;
|
||||||
|
|
||||||
|
public class TracTracRaceAbortedHandler extends UpdateHandler implements RaceAbortedListener {
|
||||||
|
|
||||||
|
private final static String ACTION = "update_race_status";
|
||||||
|
|
||||||
|
private final static Logger logger = Logger.getLogger(TracTracRaceAbortedHandler.class.getName());
|
||||||
|
|
||||||
|
public TracTracRaceAbortedHandler(URI updateURI, String tracTracUsername, String tracTracPassword, Serializable tracTracEventId, Serializable raceId) {
|
||||||
|
super(updateURI, ACTION, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void raceAborted(Flags flag) throws MalformedURLException, IOException {
|
||||||
|
if (!isActive()) {
|
||||||
|
logger.info("Not sending race abort notification to TracTrac because no URL has been provided.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final String raceStatus;
|
||||||
|
if (flag == Flags.AP) {
|
||||||
|
raceStatus = "POSTPONED";
|
||||||
|
} else {
|
||||||
|
raceStatus = "ABORTED";
|
||||||
|
}
|
||||||
|
Map<String, String> additionalArgs = new HashMap<>();
|
||||||
|
additionalArgs.put("race_status", raceStatus);
|
||||||
|
URL raceAbortedURL = buildUpdateURL(additionalArgs);
|
||||||
|
logger.info("Using " + raceAbortedURL.toString() + " for the race aborted notification!");
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) raceAbortedURL.openConnection();
|
||||||
|
try {
|
||||||
|
setConnectionProperties(connection);
|
||||||
|
try {
|
||||||
|
checkAndLogUpdateResponse(connection);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (connection != null) {
|
||||||
|
connection.disconnect();
|
||||||
|
} else {
|
||||||
|
logger.severe("Connection to TracTrac race aborted URL " + raceAbortedURL.toString() + " could not be established");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -14,6 +14,7 @@ import java.net.URI;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ public class UpdateHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected URL buildUpdateURL(HashMap<String, String> additionalParameters) throws MalformedURLException, UnsupportedEncodingException {
|
protected URL buildUpdateURL(Map<String, String> additionalParameters) throws MalformedURLException, UnsupportedEncodingException {
|
||||||
String serverUpdateURI = this.updateURI.toString();
|
String serverUpdateURI = this.updateURI.toString();
|
||||||
// make sure that the update URI always ends with a slash
|
// make sure that the update URI always ends with a slash
|
||||||
if (!serverUpdateURI.endsWith("/")) {
|
if (!serverUpdateURI.endsWith("/")) {
|
||||||
|
|||||||
+3
@@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Waypoint;
|
|||||||
import com.sap.sailing.domain.common.Bearing;
|
import com.sap.sailing.domain.common.Bearing;
|
||||||
import com.sap.sailing.domain.common.TimePoint;
|
import com.sap.sailing.domain.common.TimePoint;
|
||||||
import com.sap.sailing.domain.common.WindSource;
|
import com.sap.sailing.domain.common.WindSource;
|
||||||
|
import com.sap.sailing.domain.common.racelog.Flags;
|
||||||
import com.sap.sse.common.Util;
|
import com.sap.sse.common.Util;
|
||||||
|
|
||||||
public interface DynamicTrackedRace extends TrackedRace {
|
public interface DynamicTrackedRace extends TrackedRace {
|
||||||
@@ -96,6 +97,8 @@ public interface DynamicTrackedRace extends TrackedRace {
|
|||||||
void onCourseDesignChangedByRaceCommittee(CourseBase courseDesign);
|
void onCourseDesignChangedByRaceCommittee(CourseBase courseDesign);
|
||||||
|
|
||||||
void onStartTimeChangedByRaceCommittee(TimePoint newStartTime);
|
void onStartTimeChangedByRaceCommittee(TimePoint newStartTime);
|
||||||
|
|
||||||
|
void onAbortedByRaceCommittee(Flags flag);
|
||||||
|
|
||||||
void invalidateStartTime();
|
void invalidateStartTime();
|
||||||
|
|
||||||
|
|||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package com.sap.sailing.domain.tracking;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.common.racelog.Flags;
|
||||||
|
|
||||||
|
public interface RaceAbortedListener {
|
||||||
|
void raceAborted(Flags flag) throws MalformedURLException, IOException;
|
||||||
|
}
|
||||||
+1
-1
@@ -9,5 +9,5 @@ import com.sap.sailing.domain.common.TimePoint;
|
|||||||
public interface StartTimeChangedListener {
|
public interface StartTimeChangedListener {
|
||||||
|
|
||||||
void startTimeChanged(TimePoint newTimePoint) throws MalformedURLException, IOException;
|
void startTimeChanged(TimePoint newTimePoint) throws MalformedURLException, IOException;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -615,6 +615,8 @@ public interface TrackedRace extends Serializable {
|
|||||||
|
|
||||||
void addStartTimeChangedListener(StartTimeChangedListener listener);
|
void addStartTimeChangedListener(StartTimeChangedListener listener);
|
||||||
|
|
||||||
|
void addRaceAbortedListener(RaceAbortedListener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tells how far the given <code>competitor</code> was from the start line at the time point of the given seconds before the start.
|
* Tells how far the given <code>competitor</code> was from the start line at the time point of the given seconds before the start.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
+27
-5
@@ -34,6 +34,7 @@ import com.sap.sailing.domain.common.WindSource;
|
|||||||
import com.sap.sailing.domain.common.WindSourceType;
|
import com.sap.sailing.domain.common.WindSourceType;
|
||||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||||
import com.sap.sailing.domain.common.impl.WindSourceImpl;
|
import com.sap.sailing.domain.common.impl.WindSourceImpl;
|
||||||
|
import com.sap.sailing.domain.common.racelog.Flags;
|
||||||
import com.sap.sailing.domain.racelog.RaceLog;
|
import com.sap.sailing.domain.racelog.RaceLog;
|
||||||
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
||||||
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
|
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
|
||||||
@@ -45,6 +46,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving;
|
|||||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||||
import com.sap.sailing.domain.tracking.GPSTrackListener;
|
import com.sap.sailing.domain.tracking.GPSTrackListener;
|
||||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||||
|
import com.sap.sailing.domain.tracking.RaceAbortedListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
||||||
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
||||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||||
@@ -73,6 +75,7 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
|
|||||||
|
|
||||||
private transient Set<CourseDesignChangedListener> courseDesignChangedListeners;
|
private transient Set<CourseDesignChangedListener> courseDesignChangedListeners;
|
||||||
private transient Set<StartTimeChangedListener> startTimeChangedListeners;
|
private transient Set<StartTimeChangedListener> startTimeChangedListeners;
|
||||||
|
private transient Set<RaceAbortedListener> raceAbortedListeners;
|
||||||
|
|
||||||
public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable<Sideline> sidelines,
|
public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable<Sideline> sidelines,
|
||||||
WindStore windStore, GPSFixStore gpsFixStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
|
WindStore windStore, GPSFixStore gpsFixStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
|
||||||
@@ -80,8 +83,9 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
|
|||||||
super(trackedRegatta, race, sidelines, windStore, gpsFixStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed,
|
super(trackedRegatta, race, sidelines, windStore, gpsFixStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed,
|
||||||
delayForCacheInvalidationOfWindEstimation);
|
delayForCacheInvalidationOfWindEstimation);
|
||||||
this.logListener = new DynamicTrackedRaceLogListener(this);
|
this.logListener = new DynamicTrackedRaceLogListener(this);
|
||||||
this.courseDesignChangedListeners = new HashSet<CourseDesignChangedListener>();
|
this.courseDesignChangedListeners = new HashSet<>();
|
||||||
this.startTimeChangedListeners = new HashSet<StartTimeChangedListener>();
|
this.startTimeChangedListeners = new HashSet<>();
|
||||||
|
this.raceAbortedListeners = new HashSet<>();
|
||||||
this.raceIsKnownToStartUpwind = race.getBoatClass().typicallyStartsUpwind();
|
this.raceIsKnownToStartUpwind = race.getBoatClass().typicallyStartsUpwind();
|
||||||
if (!raceIsKnownToStartUpwind) {
|
if (!raceIsKnownToStartUpwind) {
|
||||||
Set<WindSource> windSourcesToExclude = new HashSet<WindSource>();
|
Set<WindSource> windSourcesToExclude = new HashSet<WindSource>();
|
||||||
@@ -107,8 +111,9 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
|
|||||||
ois.defaultReadObject();
|
ois.defaultReadObject();
|
||||||
listeners = new HashSet<RaceChangeListener>();
|
listeners = new HashSet<RaceChangeListener>();
|
||||||
logListener = new DynamicTrackedRaceLogListener(this);
|
logListener = new DynamicTrackedRaceLogListener(this);
|
||||||
courseDesignChangedListeners = new HashSet<CourseDesignChangedListener>();
|
courseDesignChangedListeners = new HashSet<>();
|
||||||
startTimeChangedListeners = new HashSet<StartTimeChangedListener>();
|
startTimeChangedListeners = new HashSet<>();
|
||||||
|
raceAbortedListeners = new HashSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -854,7 +859,18 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
|
|||||||
startTimeChangedListener.startTimeChanged(newStartTime);
|
startTimeChangedListener.startTimeChanged(newStartTime);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
logger.log(Level.INFO, "Exception trying to notify race status change listeners about start time change", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAbortedByRaceCommittee(Flags flag) {
|
||||||
|
try {
|
||||||
|
for (RaceAbortedListener raceAbortedListener : raceAbortedListeners) {
|
||||||
|
raceAbortedListener.raceAborted(flag);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.log(Level.INFO, "Exception trying to notify race status change listeners about start time change", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -862,6 +878,12 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
|
|||||||
public void addStartTimeChangedListener(StartTimeChangedListener listener) {
|
public void addStartTimeChangedListener(StartTimeChangedListener listener) {
|
||||||
this.startTimeChangedListeners.add(listener);
|
this.startTimeChangedListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRaceAbortedListener(RaceAbortedListener listener) {
|
||||||
|
this.raceAbortedListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The Bearing of a line starting at <code>w</code> that needs to be crossed to pass a mark.
|
* @return The Bearing of a line starting at <code>w</code> that needs to be crossed to pass a mark.
|
||||||
*/
|
*/
|
||||||
|
|||||||
+9
-1
@@ -10,9 +10,11 @@ import com.sap.sailing.domain.common.impl.WindSourceImpl;
|
|||||||
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
|
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
|
||||||
import com.sap.sailing.domain.racelog.RaceLog;
|
import com.sap.sailing.domain.racelog.RaceLog;
|
||||||
import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent;
|
import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent;
|
||||||
|
import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
|
||||||
import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent;
|
import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent;
|
||||||
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
|
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
|
||||||
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
|
import com.sap.sailing.domain.racelog.RaceLogWindFixEvent;
|
||||||
|
import com.sap.sailing.domain.racelog.analyzing.impl.AbortingFlagFinder;
|
||||||
import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder;
|
import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder;
|
||||||
import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
|
import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
|
||||||
import com.sap.sailing.domain.racelog.analyzing.impl.WindFixesFinder;
|
import com.sap.sailing.domain.racelog.analyzing.impl.WindFixesFinder;
|
||||||
@@ -34,6 +36,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
|
|||||||
|
|
||||||
private LastPublishedCourseDesignFinder courseDesignFinder;
|
private LastPublishedCourseDesignFinder courseDesignFinder;
|
||||||
private StartTimeFinder startTimeFinder;
|
private StartTimeFinder startTimeFinder;
|
||||||
|
private AbortingFlagFinder abortingFlagFinder;
|
||||||
|
|
||||||
public DynamicTrackedRaceLogListener(DynamicTrackedRace trackedRace) {
|
public DynamicTrackedRaceLogListener(DynamicTrackedRace trackedRace) {
|
||||||
this.trackedRace = trackedRace;
|
this.trackedRace = trackedRace;
|
||||||
@@ -49,6 +52,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
|
|||||||
trackedRace.invalidateEndTime();
|
trackedRace.invalidateEndTime();
|
||||||
courseDesignFinder = new LastPublishedCourseDesignFinder(raceLog);
|
courseDesignFinder = new LastPublishedCourseDesignFinder(raceLog);
|
||||||
startTimeFinder = new StartTimeFinder(raceLog);
|
startTimeFinder = new StartTimeFinder(raceLog);
|
||||||
|
abortingFlagFinder = new AbortingFlagFinder(raceLog);
|
||||||
initializeWindTrack(raceLog);
|
initializeWindTrack(raceLog);
|
||||||
analyze();
|
analyze();
|
||||||
}
|
}
|
||||||
@@ -132,6 +136,11 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
|
|||||||
trackedRace.invalidateStartTime();
|
trackedRace.invalidateStartTime();
|
||||||
/* reset start time */
|
/* reset start time */
|
||||||
trackedRace.onStartTimeChangedByRaceCommittee(null);
|
trackedRace.onStartTimeChangedByRaceCommittee(null);
|
||||||
|
RaceLogFlagEvent abortingFlag = abortingFlagFinder.analyze();
|
||||||
|
if (abortingFlag != null) {
|
||||||
|
// previous pass was aborted; notify TracTrac
|
||||||
|
trackedRace.onAbortedByRaceCommittee(abortingFlag.getUpperFlag());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -149,5 +158,4 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor {
|
|||||||
// add the wind fix to the race committee WindTrack
|
// add the wind fix to the race committee WindTrack
|
||||||
trackedRace.recordWind(event.getWindFix(), raceCommitteeWindSource);
|
trackedRace.recordWind(event.getWindFix(), raceCommitteeWindSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+14
@@ -31,6 +31,7 @@ import com.sap.sailing.domain.common.Tack;
|
|||||||
import com.sap.sailing.domain.common.TimePoint;
|
import com.sap.sailing.domain.common.TimePoint;
|
||||||
import com.sap.sailing.domain.common.WindSource;
|
import com.sap.sailing.domain.common.WindSource;
|
||||||
import com.sap.sailing.domain.common.WindSourceType;
|
import com.sap.sailing.domain.common.WindSourceType;
|
||||||
|
import com.sap.sailing.domain.common.racelog.Flags;
|
||||||
import com.sap.sailing.domain.leaderboard.ScoringScheme;
|
import com.sap.sailing.domain.leaderboard.ScoringScheme;
|
||||||
import com.sap.sailing.domain.racelog.RaceLog;
|
import com.sap.sailing.domain.racelog.RaceLog;
|
||||||
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
||||||
@@ -44,6 +45,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving;
|
|||||||
import com.sap.sailing.domain.tracking.LineDetails;
|
import com.sap.sailing.domain.tracking.LineDetails;
|
||||||
import com.sap.sailing.domain.tracking.Maneuver;
|
import com.sap.sailing.domain.tracking.Maneuver;
|
||||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||||
|
import com.sap.sailing.domain.tracking.RaceAbortedListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceListener;
|
import com.sap.sailing.domain.tracking.RaceListener;
|
||||||
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
||||||
@@ -999,4 +1001,16 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRaceAbortedListener(RaceAbortedListener listener) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAbortedByRaceCommittee(Flags flag) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+7
@@ -32,6 +32,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
|
|||||||
import com.sap.sailing.domain.tracking.LineDetails;
|
import com.sap.sailing.domain.tracking.LineDetails;
|
||||||
import com.sap.sailing.domain.tracking.Maneuver;
|
import com.sap.sailing.domain.tracking.Maneuver;
|
||||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||||
|
import com.sap.sailing.domain.tracking.RaceAbortedListener;
|
||||||
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
import com.sap.sailing.domain.tracking.RaceChangeListener;
|
||||||
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
|
||||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||||
@@ -595,4 +596,10 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addRaceAbortedListener(RaceAbortedListener listener) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+2
-2
@@ -97,10 +97,10 @@ public class AbortModeSelectionDialog extends RaceDialogFragment {
|
|||||||
TimePoint now = MillisecondsTimePoint.now();
|
TimePoint now = MillisecondsTimePoint.now();
|
||||||
RaceState state = getRaceState();
|
RaceState state = getRaceState();
|
||||||
if (this.abortFlag.equals(Flags.AP)) {
|
if (this.abortFlag.equals(Flags.AP)) {
|
||||||
state.setAborted(now, true, additionalFlag);
|
state.setAborted(now, /* postponed */ true, additionalFlag);
|
||||||
|
|
||||||
} else if (this.abortFlag.equals(Flags.NOVEMBER)) {
|
} else if (this.abortFlag.equals(Flags.NOVEMBER)) {
|
||||||
state.setAborted(now, false, additionalFlag);
|
state.setAborted(now, /* postponed */ false, additionalFlag);
|
||||||
}
|
}
|
||||||
state.setAdvancePass(now);
|
state.setAdvancePass(now);
|
||||||
this.dismiss();
|
this.dismiss();
|
||||||
|
|||||||
Reference in new issue
Block a user