From bf9a07a2b934775bf01cc9e8260ee0a62576c85e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 7 Jul 2014 16:58:35 +0200 Subject: [PATCH 1/3] introduced change listener pattern for aborting a race and use this to send an update to TracTrac --- .../domain/test/mock/MockedTrackedRace.java | 14 +++++ ...ockedTrackedRaceWithStartTimeAndRanks.java | 7 +++ .../impl/TracTracRaceAbortedHandler.java | 60 +++++++++++++++++++ .../tractracadapter/impl/UpdateHandler.java | 3 +- .../domain/tracking/DynamicTrackedRace.java | 3 + .../domain/tracking/RaceAbortedListener.java | 10 ++++ .../tracking/StartTimeChangedListener.java | 2 +- .../sailing/domain/tracking/TrackedRace.java | 2 + .../tracking/impl/DynamicTrackedRaceImpl.java | 32 ++++++++-- .../impl/DynamicTrackedRaceLogListener.java | 10 ++++ .../gwt/ui/test/MockedTrackedRace.java | 14 +++++ .../server/masterdata/DummyTrackedRace.java | 7 +++ .../dialogs/AbortModeSelectionDialog.java | 4 +- 13 files changed, 159 insertions(+), 9 deletions(-) create mode 100755 java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java create mode 100755 java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceAbortedListener.java 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 c5a41d063cc..b969b9abf62 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 @@ -33,6 +33,7 @@ import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.WindSource; 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.racelog.RaceLog; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; @@ -46,6 +47,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; 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.RaceListener; import com.sap.sailing.domain.tracking.StartTimeChangedListener; @@ -993,4 +995,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 + + } + } 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 114b9938890..d1c70ee4f26 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 @@ -34,6 +34,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; 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.StartTimeChangedListener; 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 + + } + } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java new file mode 100755 index 00000000000..3341f4ab824 --- /dev/null +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java @@ -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 course update to TracTrac because no URL has been provided."); + return; + } + final String raceStatus; + if (flag == Flags.AP) { + raceStatus = "POSTPONED"; + } else { + raceStatus = "ABORTED"; + } + Map 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"); + } + } + } +} diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/UpdateHandler.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/UpdateHandler.java index 75160c64634..293b58b2ed0 100644 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/UpdateHandler.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/UpdateHandler.java @@ -14,6 +14,7 @@ import java.net.URI; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; import java.util.logging.Logger; @@ -62,7 +63,7 @@ public class UpdateHandler { } } - protected URL buildUpdateURL(HashMap additionalParameters) throws MalformedURLException, UnsupportedEncodingException { + protected URL buildUpdateURL(Map additionalParameters) throws MalformedURLException, UnsupportedEncodingException { String serverUpdateURI = this.updateURI.toString(); // make sure that the update URI always ends with a slash if (!serverUpdateURI.endsWith("/")) { 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 ac65dcfec50..34e528415b5 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 @@ -7,6 +7,7 @@ import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sse.common.Util; public interface DynamicTrackedRace extends TrackedRace { @@ -96,6 +97,8 @@ public interface DynamicTrackedRace extends TrackedRace { void onCourseDesignChangedByRaceCommittee(CourseBase courseDesign); void onStartTimeChangedByRaceCommittee(TimePoint newStartTime); + + void onAbortedByRaceCommittee(Flags flag); void invalidateStartTime(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceAbortedListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceAbortedListener.java new file mode 100755 index 00000000000..1f9c2dcc089 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceAbortedListener.java @@ -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; +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/StartTimeChangedListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/StartTimeChangedListener.java index 3624be9ceae..8f6d1542470 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/StartTimeChangedListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/StartTimeChangedListener.java @@ -9,5 +9,5 @@ import com.sap.sailing.domain.common.TimePoint; public interface StartTimeChangedListener { void startTimeChanged(TimePoint newTimePoint) throws MalformedURLException, IOException; - + } 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 fddb107f363..0c04c02c7ce 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 @@ -615,6 +615,8 @@ public interface TrackedRace extends Serializable { void addStartTimeChangedListener(StartTimeChangedListener listener); + void addRaceAbortedListener(RaceAbortedListener listener); + /** * Tells how far the given competitor was from the start line at the time point of the given seconds before the start. *

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 caf5d0e4b63..2c1e055afbc 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 @@ -34,6 +34,7 @@ import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; 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.tracking.GPSFixStore; 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.GPSTrackListener; 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.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; @@ -73,6 +75,7 @@ DynamicTrackedRace, GPSTrackListener { private transient Set courseDesignChangedListeners; private transient Set startTimeChangedListeners; + private transient Set raceAbortedListeners; public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable sidelines, WindStore windStore, GPSFixStore gpsFixStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, @@ -80,8 +83,9 @@ DynamicTrackedRace, GPSTrackListener { super(trackedRegatta, race, sidelines, windStore, gpsFixStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, delayForCacheInvalidationOfWindEstimation); this.logListener = new DynamicTrackedRaceLogListener(this); - this.courseDesignChangedListeners = new HashSet(); - this.startTimeChangedListeners = new HashSet(); + this.courseDesignChangedListeners = new HashSet<>(); + this.startTimeChangedListeners = new HashSet<>(); + this.raceAbortedListeners = new HashSet<>(); this.raceIsKnownToStartUpwind = race.getBoatClass().typicallyStartsUpwind(); if (!raceIsKnownToStartUpwind) { Set windSourcesToExclude = new HashSet(); @@ -107,8 +111,9 @@ DynamicTrackedRace, GPSTrackListener { ois.defaultReadObject(); listeners = new HashSet(); logListener = new DynamicTrackedRaceLogListener(this); - courseDesignChangedListeners = new HashSet(); - startTimeChangedListeners = new HashSet(); + courseDesignChangedListeners = new HashSet<>(); + startTimeChangedListeners = new HashSet<>(); + raceAbortedListeners = new HashSet<>(); } /** @@ -854,7 +859,18 @@ DynamicTrackedRace, GPSTrackListener { startTimeChangedListener.startTimeChanged(newStartTime); } } 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 { public void addStartTimeChangedListener(StartTimeChangedListener listener) { this.startTimeChangedListeners.add(listener); } + + @Override + public void addRaceAbortedListener(RaceAbortedListener listener) { + this.raceAbortedListeners.add(listener); + } + /** * @return The Bearing of a line starting at w that needs to be crossed to pass a mark. */ diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index 2a1680f136b..0c3bf779be0 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -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.racelog.RaceLog; 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.RaceLogStartTimeEvent; 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.StartTimeFinder; import com.sap.sailing.domain.racelog.analyzing.impl.WindFixesFinder; @@ -34,6 +36,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { private LastPublishedCourseDesignFinder courseDesignFinder; private StartTimeFinder startTimeFinder; + private AbortingFlagFinder abortingFlagFinder; public DynamicTrackedRaceLogListener(DynamicTrackedRace trackedRace) { this.trackedRace = trackedRace; @@ -49,6 +52,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { trackedRace.invalidateEndTime(); courseDesignFinder = new LastPublishedCourseDesignFinder(raceLog); startTimeFinder = new StartTimeFinder(raceLog); + abortingFlagFinder = new AbortingFlagFinder(raceLog); initializeWindTrack(raceLog); analyze(); } @@ -150,4 +154,10 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { trackedRace.recordWind(event.getWindFix(), raceCommitteeWindSource); } + @Override + public void visit(RaceLogFlagEvent event) { + RaceLogFlagEvent abortingFlag = abortingFlagFinder.analyze(); + trackedRace.onAbortedByRaceCommittee(abortingFlag.getUpperFlag()); + } + } 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 d42ce45aca1..03705d0afee 100755 --- 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 @@ -32,6 +32,7 @@ import com.sap.sailing.domain.common.Tack; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.WindSource; 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.racelog.RaceLog; 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.Maneuver; 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.RaceListener; import com.sap.sailing.domain.tracking.StartTimeChangedListener; @@ -994,4 +996,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 + + } + } 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 afbb3571054..8c86b29d550 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 @@ -32,6 +32,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; 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.StartTimeChangedListener; 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 + + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java index b8ae9b02518..0e7785ccddd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/AbortModeSelectionDialog.java @@ -97,10 +97,10 @@ public class AbortModeSelectionDialog extends RaceDialogFragment { TimePoint now = MillisecondsTimePoint.now(); RaceState state = getRaceState(); if (this.abortFlag.equals(Flags.AP)) { - state.setAborted(now, true, additionalFlag); + state.setAborted(now, /* postponed */ true, additionalFlag); } else if (this.abortFlag.equals(Flags.NOVEMBER)) { - state.setAborted(now, false, additionalFlag); + state.setAborted(now, /* postponed */ false, additionalFlag); } state.setAdvancePass(now); this.dismiss(); From 69060262144666adab0eeca85fd8318229ccbc5b Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 7 Jul 2014 17:06:23 +0200 Subject: [PATCH 2/3] register the new race abort handler and factored out the common handler registrations from RaceCourseReceiver and DomainFactory --- .../domain/tractracadapter/DomainFactory.java | 8 +++++ .../impl/DomainFactoryImpl.java | 29 ++++++++++++------- .../impl/RaceCourseReceiver.java | 8 +---- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java index 29665c00cf5..39015afa157 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java @@ -270,4 +270,12 @@ public interface DomainFactory { List createSidelines(String raceMetadataString, Iterable 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); + } 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 b9d55ec30d9..a0043ff0879 100755 --- 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 @@ -519,16 +519,8 @@ public class DomainFactoryImpl implements DomainFactory { trackedRace = createTrackedRace(trackedRegatta, raceDefinition, sidelines, windStore, EmptyGPSFixStore.INSTANCE, delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate); logger.info("Added race " + raceDefinition + " to regatta " + trackedRegatta.getRegatta()); - - 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); + addTracTracUpdateHandlers(tracTracUpdateURI, tracTracEventUuid, tracTracUsername, tracTracPassword, + raceDefinition, trackedRace); raceCache.put(raceId, raceDefinition); raceCache.notifyAll(); } 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 sidelines, WindStore windStore, GPSFixStore gpsFixStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate) { return trackedRegatta.createTrackedRace(race, sidelines, diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java index f1312486df9..2ae5e70a74b 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java @@ -220,13 +220,7 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue Date: Mon, 7 Jul 2014 17:34:08 +0200 Subject: [PATCH 3/3] listen for PassChangeEvent instead of FlagEvent because the abort is best identified by the existing analyzer when the new pass has begun --- .../impl/TracTracRaceAbortedHandler.java | 2 +- .../tracking/impl/DynamicTrackedRaceLogListener.java | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java index 3341f4ab824..3f6dfb66587 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceAbortedHandler.java @@ -28,7 +28,7 @@ public class TracTracRaceAbortedHandler extends UpdateHandler implements RaceAbo @Override public void raceAborted(Flags flag) throws MalformedURLException, IOException { if (!isActive()) { - logger.info("Not sending course update to TracTrac because no URL has been provided."); + logger.info("Not sending race abort notification to TracTrac because no URL has been provided."); return; } final String raceStatus; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index 0c3bf779be0..96c0dfa4298 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -136,6 +136,11 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { trackedRace.invalidateStartTime(); /* reset start time */ trackedRace.onStartTimeChangedByRaceCommittee(null); + RaceLogFlagEvent abortingFlag = abortingFlagFinder.analyze(); + if (abortingFlag != null) { + // previous pass was aborted; notify TracTrac + trackedRace.onAbortedByRaceCommittee(abortingFlag.getUpperFlag()); + } } @Override @@ -153,11 +158,4 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { // add the wind fix to the race committee WindTrack trackedRace.recordWind(event.getWindFix(), raceCommitteeWindSource); } - - @Override - public void visit(RaceLogFlagEvent event) { - RaceLogFlagEvent abortingFlag = abortingFlagFinder.analyze(); - trackedRace.onAbortedByRaceCommittee(abortingFlag.getUpperFlag()); - } - }