removed all RaceLog methods from TrackedRace and TrackedRaceImpl and

DynamicTrackedRace
changed TrackedRaceImpl constructor again, all calling methods are
changed appropriately
This commit is contained in:
Armin Zamani committed 2013-02-09 01:10:39 +01:00
1 parent 43ff1dc7fe
commit 7d6d72785e
47 files changed
+195 -461

No files matched your search

@@ -22,13 +22,12 @@ import org.junit.Test;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import com.mongodb.DB; import com.mongodb.DB;
import com.mongodb.DBCollection; import com.mongodb.DBCollection;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.MessageType; import com.sap.sailing.domain.swisstimingadapter.MessageType;
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector; import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SailMasterTransceiver; import com.sap.sailing.domain.swisstimingadapter.SailMasterTransceiver;
@@ -65,7 +64,6 @@ public class EndToEndListeningStoreAndFowardTest {
private SwissTimingFactory swissTimingFactory; private SwissTimingFactory swissTimingFactory;
private EmptyWindStore emptyWindStore; private EmptyWindStore emptyWindStore;
private EmptyRaceLogStore emptyRaceLogStore;
private RacingEventService racingEventService; private RacingEventService racingEventService;
private List<RacesHandle> raceHandles; private List<RacesHandle> raceHandles;
@@ -85,7 +83,6 @@ public class EndToEndListeningStoreAndFowardTest {
sendingStream = sendingSocket.getOutputStream(); sendingStream = sendingSocket.getOutputStream();
swissTimingFactory = SwissTimingFactory.INSTANCE; swissTimingFactory = SwissTimingFactory.INSTANCE;
emptyWindStore = EmptyWindStore.INSTANCE; emptyWindStore = EmptyWindStore.INSTANCE;
emptyRaceLogStore = EmptyRaceLogStore.INSTANCE;
transceiver = swissTimingFactory.createSailMasterTransceiver(); transceiver = swissTimingFactory.createSailMasterTransceiver();
DBCollection lastMessageCountCollection = db.getCollection(CollectionNames.LAST_MESSAGE_COUNT.name()); DBCollection lastMessageCountCollection = db.getCollection(CollectionNames.LAST_MESSAGE_COUNT.name());
lastMessageCountCollection.update(new BasicDBObject(), lastMessageCountCollection.update(new BasicDBObject(),
@@ -339,7 +336,7 @@ public class EndToEndListeningStoreAndFowardTest {
for (String raceToTrack : racesToTrack) { for (String raceToTrack : racesToTrack) {
RacesHandle raceHandle = racingEventService.addSwissTimingRace(/* regattaToAddTo */ null /* use a default regatta */, RacesHandle raceHandle = racingEventService.addSwissTimingRace(/* regattaToAddTo */ null /* use a default regatta */,
raceToTrack, "localhost", /* canSendRequests */ raceToTrack, "localhost", /* canSendRequests */
CLIENT_PORT, false, emptyWindStore, -1, emptyRaceLogStore); CLIENT_PORT, false, emptyWindStore, -1);
raceHandles.add(raceHandle); raceHandles.add(raceHandle);
if (connector == null) { if (connector == null) {
connector = racingEventService.getSwissTimingFactory().getOrCreateSailMasterConnector("localhost", connector = racingEventService.getSwissTimingFactory().getOrCreateSailMasterConnector("localhost",
@@ -11,7 +11,6 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl; import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
@@ -50,7 +49,7 @@ public interface DomainFactory {
RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID, RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
boolean canSendRequests, long delayToLiveInMillis, boolean canSendRequests, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore, RaceLogStore raceLogStore, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader); RaceSpecificMessageLoader messageLoader);
BoatClass getOrCreateBoatClassFromRaceID(String raceID); BoatClass getOrCreateBoatClassFromRaceID(String raceID);
@@ -6,7 +6,6 @@ import java.text.ParseException;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingFactoryImpl; import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingFactoryImpl;
import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
@@ -52,11 +51,11 @@ public interface SwissTimingFactory {
SwissTimingConfiguration createSwissTimingConfiguration(String name, String hostname, int port, boolean canSendRequests); SwissTimingConfiguration createSwissTimingConfiguration(String name, String hostname, int port, boolean canSendRequests);
SwissTimingRaceTracker createRaceTracker(String raceID, String hostname, int port, boolean canSendRequests, long delayToLiveInMillis, WindStore windStore, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) throws InterruptedException, UnknownHostException, IOException, ParseException; SwissTimingRaceTracker createRaceTracker(String raceID, String hostname, int port, boolean canSendRequests, long delayToLiveInMillis, WindStore windStore, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException, UnknownHostException, IOException, ParseException;
RaceTracker createRaceTracker(Regatta regatta, String raceID, String hostname, int port, boolean canSendRequests, long delayToLiveInMillis, RaceTracker createRaceTracker(Regatta regatta, String raceID, String hostname, int port, boolean canSendRequests, long delayToLiveInMillis,
WindStore windStore, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory, WindStore windStore, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) throws UnknownHostException, InterruptedException, TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException, InterruptedException,
IOException, ParseException; IOException, ParseException;
Race createRace(String raceId, String description, TimePoint startTime); Race createRace(String raceId, String description, TimePoint startTime);
@@ -30,7 +30,6 @@ import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.Course; import com.sap.sailing.domain.swisstimingadapter.Course;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory; import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.Fix; import com.sap.sailing.domain.swisstimingadapter.Fix;
@@ -308,10 +307,10 @@ public class DomainFactoryImpl implements DomainFactory {
@Override @Override
public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID, public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
boolean canSendRequests, long delayToLiveInMillis, boolean canSendRequests, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore, RaceLogStore raceLogStore, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader) { RaceSpecificMessageLoader messageLoader) {
return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, delayToLiveInMillis, return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, delayToLiveInMillis,
swissTimingFactory, domainFactory, windStore, raceLogStore, messageLoader); swissTimingFactory, domainFactory, windStore, messageLoader);
} }
} }
@@ -9,7 +9,6 @@ import java.util.Map;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory; import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.Race;
import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader; import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader;
@@ -81,20 +80,19 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
@Override @Override
public SwissTimingRaceTracker createRaceTracker(String raceID, String hostname, int port, boolean canSendRequests, long delayToLiveInMillis, public SwissTimingRaceTracker createRaceTracker(String raceID, String hostname, int port, boolean canSendRequests, long delayToLiveInMillis,
WindStore windStore, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory, WindStore windStore, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) throws InterruptedException, UnknownHostException, IOException, TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException, UnknownHostException, IOException,
ParseException { ParseException {
return new SwissTimingRaceTrackerImpl(raceID, hostname, port, windStore, domainFactory, this, messageLoader, return new SwissTimingRaceTrackerImpl(raceID, hostname, port, windStore, domainFactory, this, messageLoader,
trackedRegattaRegistry, canSendRequests, delayToLiveInMillis, raceLogStore); trackedRegattaRegistry, canSendRequests, delayToLiveInMillis);
} }
@Override @Override
public RaceTracker createRaceTracker(Regatta regatta, String raceID, String hostname, int port, public RaceTracker createRaceTracker(Regatta regatta, String raceID, String hostname, int port,
boolean canSendRequests, long delayToLiveInMillis, WindStore windStore, RaceSpecificMessageLoader messageLoader, boolean canSendRequests, long delayToLiveInMillis, WindStore windStore, RaceSpecificMessageLoader messageLoader,
DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry, DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException,
RaceLogStore raceLogStore) throws UnknownHostException,
InterruptedException, IOException, ParseException { InterruptedException, IOException, ParseException {
return new SwissTimingRaceTrackerImpl(regatta, raceID, hostname, port, windStore, domainFactory, this, return new SwissTimingRaceTrackerImpl(regatta, raceID, hostname, port, windStore, domainFactory, this,
messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis, raceLogStore); messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis);
} }
@Override @Override
@@ -24,7 +24,6 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.TrackedRaceStatusEnum;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.Course; import com.sap.sailing.domain.swisstimingadapter.Course;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory; import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.Fix; import com.sap.sailing.domain.swisstimingadapter.Fix;
@@ -63,7 +62,6 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
private final Triple<String, String, Integer> id; private final Triple<String, String, Integer> id;
private final Regatta regatta; private final Regatta regatta;
private final WindStore windStore; private final WindStore windStore;
private final RaceLogStore raceLogStore;
private RaceDefinition race; private RaceDefinition race;
private Course course; private Course course;
@@ -76,17 +74,15 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
protected SwissTimingRaceTrackerImpl(String raceID, String hostname, int port, WindStore windStore, protected SwissTimingRaceTrackerImpl(String raceID, String hostname, int port, WindStore windStore,
DomainFactory domainFactory, SwissTimingFactory factory, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory, SwissTimingFactory factory, RaceSpecificMessageLoader messageLoader,
TrackedRegattaRegistry trackedRegattaRegistry, boolean canSendRequests, long delayToLiveInMillis, TrackedRegattaRegistry trackedRegattaRegistry, boolean canSendRequests, long delayToLiveInMillis) throws InterruptedException,
RaceLogStore raceLogStore) throws InterruptedException,
UnknownHostException, IOException, ParseException { UnknownHostException, IOException, ParseException {
this(domainFactory.getOrCreateDefaultRegatta(raceID, trackedRegattaRegistry), raceID, hostname, port, windStore, domainFactory, factory, this(domainFactory.getOrCreateDefaultRegatta(raceID, trackedRegattaRegistry), raceID, hostname, port, windStore, domainFactory, factory,
messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis, raceLogStore); messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis);
} }
protected SwissTimingRaceTrackerImpl(Regatta regatta, String raceID, String hostname, int port, WindStore windStore, protected SwissTimingRaceTrackerImpl(Regatta regatta, String raceID, String hostname, int port, WindStore windStore,
DomainFactory domainFactory, SwissTimingFactory factory, RaceSpecificMessageLoader messageLoader, DomainFactory domainFactory, SwissTimingFactory factory, RaceSpecificMessageLoader messageLoader,
TrackedRegattaRegistry trackedRegattaRegistry, boolean canSendRequests, long delayToLiveInMillis, TrackedRegattaRegistry trackedRegattaRegistry, boolean canSendRequests, long delayToLiveInMillis) throws InterruptedException,
RaceLogStore raceLogStore) throws InterruptedException,
UnknownHostException, IOException, ParseException { UnknownHostException, IOException, ParseException {
super(); super();
this.regatta = regatta; this.regatta = regatta;
@@ -95,7 +91,6 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
this.raceID = raceID; this.raceID = raceID;
this.messageLoader = messageLoader; this.messageLoader = messageLoader;
this.windStore = windStore; this.windStore = windStore;
this.raceLogStore = raceLogStore;
this.id = createID(raceID, hostname, port); this.id = createID(raceID, hostname, port);
connector.addSailMasterListener(raceID, this); connector.addSailMasterListener(raceID, this);
trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(regatta); trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(regatta);
@@ -305,7 +300,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
// we already know our single RaceDefinition // we already know our single RaceDefinition
assert SwissTimingRaceTrackerImpl.this.race == race; assert SwissTimingRaceTrackerImpl.this.race == race;
} }
}, raceLogStore); });
logger.info("Created SwissTiming RaceDefinition and TrackedRace for "+race.getName()); logger.info("Created SwissTiming RaceDefinition and TrackedRace for "+race.getName());
} }
@@ -1,7 +1,6 @@
package com.sap.sailing.domain.swisstimingadapter.impl; package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory; import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader; import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
@@ -18,12 +17,11 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
private final SwissTimingFactory swissTimingFactory; private final SwissTimingFactory swissTimingFactory;
private final DomainFactory domainFactory; private final DomainFactory domainFactory;
private final WindStore windStore; private final WindStore windStore;
private final RaceLogStore raceLogStore;
private final RaceSpecificMessageLoader messageLoader; private final RaceSpecificMessageLoader messageLoader;
private final long delayToLiveInMillis; private final long delayToLiveInMillis;
public SwissTimingTrackingConnectivityParameters(String hostname, int port, String raceID, boolean canSendRequests, long delayToLiveInMillis, public SwissTimingTrackingConnectivityParameters(String hostname, int port, String raceID, boolean canSendRequests, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore, RaceLogStore raceLogStore, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader) { RaceSpecificMessageLoader messageLoader) {
super(); super();
this.hostname = hostname; this.hostname = hostname;
@@ -34,21 +32,20 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
this.swissTimingFactory = swissTimingFactory; this.swissTimingFactory = swissTimingFactory;
this.domainFactory = domainFactory; this.domainFactory = domainFactory;
this.windStore = windStore; this.windStore = windStore;
this.raceLogStore = raceLogStore;
this.messageLoader = messageLoader; this.messageLoader = messageLoader;
} }
@Override @Override
public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry) throws Exception { public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry) throws Exception {
return swissTimingFactory.createRaceTracker(raceID, hostname, port, canSendRequests, delayToLiveInMillis, windStore, messageLoader, return swissTimingFactory.createRaceTracker(raceID, hostname, port, canSendRequests, delayToLiveInMillis, windStore, messageLoader,
domainFactory, trackedRegattaRegistry, raceLogStore); domainFactory, trackedRegattaRegistry);
} }
@Override @Override
public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry) public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry)
throws Exception { throws Exception {
return swissTimingFactory.createRaceTracker(regatta, raceID, hostname, port, canSendRequests, delayToLiveInMillis, windStore, messageLoader, return swissTimingFactory.createRaceTracker(regatta, raceID, hostname, port, canSendRequests, delayToLiveInMillis, windStore, messageLoader,
domainFactory, trackedRegattaRegistry, raceLogStore); domainFactory, trackedRegattaRegistry);
} }
@Override @Override
@@ -35,7 +35,6 @@ import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory; import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingreplayadapter.CompetitorStatus; import com.sap.sailing.domain.swisstimingreplayadapter.CompetitorStatus;
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayListener; import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayListener;
@@ -309,7 +308,7 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter {
createTrackedRace(race, EmptyWindStore.INSTANCE, TrackedRace.DEFAULT_LIVE_DELAY_IN_MILLISECONDS, createTrackedRace(race, EmptyWindStore.INSTANCE, TrackedRace.DEFAULT_LIVE_DELAY_IN_MILLISECONDS,
WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND,
/* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(), /* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(),
/* raceDefinitionSetToUpdate */ null, EmptyRaceLogStore.INSTANCE); /* raceDefinitionSetToUpdate */ null);
trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0)); trackedRace.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0));
TimePoint bestStartTimeKnownSoFar = bestStartTimePerRaceID.get(currentRaceID); TimePoint bestStartTimeKnownSoFar = bestStartTimePerRaceID.get(currentRaceID);
if (bestStartTimeKnownSoFar != null) { if (bestStartTimeKnownSoFar != null) {
@@ -25,7 +25,6 @@ import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.base.impl.WaypointImpl;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
@@ -244,8 +243,7 @@ public class CourseTest {
hasso), hasso),
EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 3000, EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 3000,
/* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageWind */ 30000,
/* millisecondsOverWhichToAverageSpeed */ 8000, /* millisecondsOverWhichToAverageSpeed */ 8000);
EmptyRaceLogStore.INSTANCE);
assertLegStructure(course, trackedRace); assertLegStructure(course, trackedRace);
course.removeWaypoint(0); course.removeWaypoint(0);
assertLegStructure(course, trackedRace); assertLegStructure(course, trackedRace);
@@ -275,8 +273,7 @@ public class CourseTest {
hasso), hasso),
EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 3000, EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 3000,
/* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageWind */ 30000,
/* millisecondsOverWhichToAverageSpeed */ 8000, /* millisecondsOverWhichToAverageSpeed */ 8000);
EmptyRaceLogStore.INSTANCE);
assertLegStructure(course, trackedRace); assertLegStructure(course, trackedRace);
final WaypointImpl wp1_5 = new WaypointImpl(new MarkImpl("Test Mark 1.5")); final WaypointImpl wp1_5 = new WaypointImpl(new MarkImpl("Test Mark 1.5"));
assertWaypointIndexes(course); assertWaypointIndexes(course);
@@ -31,7 +31,6 @@ import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.WaypointImpl; import com.sap.sailing.domain.base.impl.WaypointImpl;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLeg;
@@ -78,8 +77,7 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
@Override @Override
public void addRaceDefinition(RaceDefinition race) {} public void addRaceDefinition(RaceDefinition race) {}
}, /* delayToLiveInMillis */ 0l, }, /* delayToLiveInMillis */ 0l,
/* millisecondsOverWhichToAverageWind */ 30000, /* simulator */ null, /* millisecondsOverWhichToAverageWind */ 30000, /* simulator */ null) {
EmptyRaceLogStore.INSTANCE) {
@Override @Override
protected void handleEvent(Triple<Route, RouteData, Race> event) { protected void handleEvent(Triple<Route, RouteData, Race> event) {
super.handleEvent(event); super.handleEvent(event);
@@ -15,7 +15,6 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tractracadapter.DomainFactory; import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants; import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants;
@@ -51,28 +50,25 @@ public class MultipleClassesInRegattaTest {
httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=cce678c8-97e6-11e0-9aed-406186cbf87c"), httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=cce678c8-97e6-11e0-9aed-406186cbf87c"),
new URI(liveURI), new URI(storedURI), new URI(liveURI), new URI(storedURI),
/* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, /* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false,
EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry(), EmptyRaceLogStore.INSTANCE); EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry());
kiwotest2 = domainFactory kiwotest2 = domainFactory
.createRaceTracker( .createRaceTracker(
new URL( new URL(
httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=11290bd6-97e7-11e0-9aed-406186cbf87c"), httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=11290bd6-97e7-11e0-9aed-406186cbf87c"),
new URI(liveURI), new URI(storedURI), new URI(liveURI), new URI(storedURI),
/* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry(), /* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry());
EmptyRaceLogStore.INSTANCE);
kiwotest3 = domainFactory kiwotest3 = domainFactory
.createRaceTracker( .createRaceTracker(
new URL( new URL(
httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=39635b24-97e7-11e0-9aed-406186cbf87c"), httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=39635b24-97e7-11e0-9aed-406186cbf87c"),
new URI(liveURI), new URI(storedURI), new URI(liveURI), new URI(storedURI),
/* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry(), /* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry());
EmptyRaceLogStore.INSTANCE);
weym470may112014_2 = domainFactory weym470may112014_2 = domainFactory
.createRaceTracker( .createRaceTracker(
new URL( new URL(
httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=04498426-7dfd-11e0-8236-406186cbf87c"), httpAndHost+"/events/event_20110505_SailingTea/clientparams.php?event=event_20110505_SailingTea&race=04498426-7dfd-11e0-8236-406186cbf87c"),
new URI(liveURI), new URI(storedURI), new URI(liveURI), new URI(storedURI),
/* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry(), /* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, new DummyTrackedRegattaRegistry());
EmptyRaceLogStore.INSTANCE);
assertEquals("STG", kiwotest1.getRegatta().getBoatClass().getName()); assertEquals("STG", kiwotest1.getRegatta().getBoatClass().getName());
assertEquals("505", kiwotest2.getRegatta().getBoatClass().getName()); assertEquals("505", kiwotest2.getRegatta().getBoatClass().getName());
@@ -17,19 +17,18 @@ import java.util.regex.Pattern;
import org.junit.Before; import org.junit.Before;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tracking.impl.GPSFixImpl; import com.sap.sailing.domain.tracking.impl.GPSFixImpl;
@@ -90,7 +89,7 @@ public abstract class OnlineTracTracBasedTest extends AbstractTracTracLiveTest {
throws InterruptedException { throws InterruptedException {
setStoredDataLoaded(false); setStoredDataLoaded(false);
ArrayList<Receiver> receivers = new ArrayList<Receiver>(); ArrayList<Receiver> receivers = new ArrayList<Receiver>();
for (Receiver r : domainFactory.getUpdateReceivers(trackedRegatta, getTracTracEvent(), EmptyWindStore.INSTANCE, EmptyRaceLogStore.INSTANCE, for (Receiver r : domainFactory.getUpdateReceivers(trackedRegatta, getTracTracEvent(), EmptyWindStore.INSTANCE,
/* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */0l, /* simulator */ null, /* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */0l, /* simulator */ null,
new DynamicRaceDefinitionSet() { new DynamicRaceDefinitionSet() {
@Override @Override
@@ -1,25 +1,15 @@
package com.sap.sailing.domain.test; package com.sap.sailing.domain.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.List; import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Ignore;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.Flags;
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
public class RaceLogEventsOnConstructedTrackedRaceTest extends TrackBasedTest { public class RaceLogEventsOnConstructedTrackedRaceTest extends TrackBasedTest {
@@ -43,51 +33,51 @@ public class RaceLogEventsOnConstructedTrackedRaceTest extends TrackBasedTest {
setTrackedRace(createTestTrackedRace("Kieler Woche", "505 Race 2", "505", competitors, start)); setTrackedRace(createTestTrackedRace("Kieler Woche", "505 Race 2", "505", competitors, start));
} }
@Test @Ignore
public void testRaceLogExists() { public void testRaceLogExists() {
RaceLog track = getTrackedRace().getRaceLog(); // RaceLog track = getTrackedRace().getRaceLog();
assertNotNull(track); // assertNotNull(track);
//
track.lockForRead(); // track.lockForRead();
try { // try {
assertEquals(Util.size(track.getRawFixes()), 0); // assertEquals(Util.size(track.getRawFixes()), 0);
assertEquals(Util.size(track.getFixes()), 0); // assertEquals(Util.size(track.getFixes()), 0);
} finally { // } finally {
track.unlockAfterRead(); // track.unlockAfterRead();
} // }
} }
@Test @Ignore
public void testRaceLogInsertSomeEvents() { public void testRaceLogInsertSomeEvents() {
RaceLog track = getTrackedRace().getRaceLog(); // RaceLog track = getTrackedRace().getRaceLog();
assertNotNull(track); // assertNotNull(track);
//
TimePoint t1 = MillisecondsTimePoint.now(); // TimePoint t1 = MillisecondsTimePoint.now();
TimePoint t2 = new MillisecondsTimePoint(t1.asMillis() - 1000); // TimePoint t2 = new MillisecondsTimePoint(t1.asMillis() - 1000);
TimePoint t3 = new MillisecondsTimePoint(t1.asMillis() - 4000); // TimePoint t3 = new MillisecondsTimePoint(t1.asMillis() - 4000);
TimePoint t4 = new MillisecondsTimePoint(t1.asMillis() - 5000); // TimePoint t4 = new MillisecondsTimePoint(t1.asMillis() - 5000);
TimePoint t5 = new MillisecondsTimePoint(t1.asMillis() - 10000); // TimePoint t5 = new MillisecondsTimePoint(t1.asMillis() - 10000);
//
int passId = 0; // int passId = 0;
RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, passId, Flags.CLASS, Flags.NONE, false); // RaceLogFlagEvent rcEvent1 = RaceLogEventFactory.INSTANCE.createFlagEvent(t1, passId, Flags.CLASS, Flags.NONE, false);
RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t2, passId, Flags.PAPA, Flags.NONE, false); // RaceLogFlagEvent rcEvent2 = RaceLogEventFactory.INSTANCE.createFlagEvent(t2, passId, Flags.PAPA, Flags.NONE, false);
RaceLogFlagEvent rcEvent3 = RaceLogEventFactory.INSTANCE.createFlagEvent(t3, passId, Flags.PAPA, Flags.NONE, true); // RaceLogFlagEvent rcEvent3 = RaceLogEventFactory.INSTANCE.createFlagEvent(t3, passId, Flags.PAPA, Flags.NONE, true);
RaceLogFlagEvent rcEvent4 = RaceLogEventFactory.INSTANCE.createFlagEvent(t4, passId, Flags.CLASS, Flags.NONE, true); // RaceLogFlagEvent rcEvent4 = RaceLogEventFactory.INSTANCE.createFlagEvent(t4, passId, Flags.CLASS, Flags.NONE, true);
RaceLogStartTimeEvent rcEvent5 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(t5, passId, t1); // RaceLogStartTimeEvent rcEvent5 = RaceLogEventFactory.INSTANCE.createStartTimeEvent(t5, passId, t1);
//
getTrackedRace().recordRaceLogEvent(rcEvent1); // getTrackedRace().recordRaceLogEvent(rcEvent1);
getTrackedRace().recordRaceLogEvent(rcEvent2); // getTrackedRace().recordRaceLogEvent(rcEvent2);
getTrackedRace().recordRaceLogEvent(rcEvent3); // getTrackedRace().recordRaceLogEvent(rcEvent3);
getTrackedRace().recordRaceLogEvent(rcEvent4); // getTrackedRace().recordRaceLogEvent(rcEvent4);
getTrackedRace().recordRaceLogEvent(rcEvent5); // getTrackedRace().recordRaceLogEvent(rcEvent5);
//
track.lockForRead(); // track.lockForRead();
try { // try {
assertEquals(Util.size(track.getRawFixes()), 5); // assertEquals(Util.size(track.getRawFixes()), 5);
assertEquals(Util.size(track.getFixes()), 5); // assertEquals(Util.size(track.getFixes()), 5);
} finally { // } finally {
track.unlockAfterRead(); // track.unlockAfterRead();
} // }
} }
} }
@@ -40,7 +40,6 @@ import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLeg;
@@ -102,8 +101,7 @@ public class ReachingLegTest extends TrackBasedTest {
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(trackedRegatta, race, EmptyWindStore.INSTANCE, DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(trackedRegatta, race, EmptyWindStore.INSTANCE,
/* delayToLiveInMillis */ 0, /* delayToLiveInMillis */ 0,
/* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000, /* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000,
/* delay for wind estimation cache invalidation */ 0, /* delay for wind estimation cache invalidation */ 0);
EmptyRaceLogStore.INSTANCE);
// in this simplified artificial course, the top mark is exactly north of the right leeward gate, the offset // in this simplified artificial course, the top mark is exactly north of the right leeward gate, the offset
// mark is slightly west of the top mark; wind from the north makes the leg from top to offset a reaching leg // mark is slightly west of the top mark; wind from the north makes the leg from top to offset a reaching leg
Position leftPosition = new DegreePosition(0, -0.00001); Position leftPosition = new DegreePosition(0, -0.00001);
@@ -15,7 +15,6 @@ import org.junit.Test;
import com.maptrack.client.io.TypeController; import com.maptrack.client.io.TypeController;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl;
@@ -96,7 +95,7 @@ public class ReceiveMarkPassingDataTest extends AbstractTracTracLiveTest {
receivers.add(receiver); receivers.add(receiver);
for (Receiver r : DomainFactory.INSTANCE.getUpdateReceivers( for (Receiver r : DomainFactory.INSTANCE.getUpdateReceivers(
new DynamicTrackedRegattaImpl(DomainFactory.INSTANCE.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null)), new DynamicTrackedRegattaImpl(DomainFactory.INSTANCE.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null)),
getTracTracEvent(), EmptyWindStore.INSTANCE, EmptyRaceLogStore.INSTANCE, /* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l, getTracTracEvent(), EmptyWindStore.INSTANCE, /* startOfTracking */ null, /* endOfTracking */ null, /* delayToLiveInMillis */ 0l,
/* simulator */ null, new DynamicRaceDefinitionSet() { /* simulator */ null, new DynamicRaceDefinitionSet() {
@Override @Override
public void addRaceDefinition(RaceDefinition race) {} public void addRaceDefinition(RaceDefinition race) {}
@@ -12,12 +12,11 @@ import org.junit.Test;
import com.maptrack.client.io.TypeController; import com.maptrack.client.io.TypeController;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceChangeListener;
@@ -84,7 +83,7 @@ public class ReceiveTrackingDataTest extends AbstractTracTracLiveTest {
@Override @Override
public void addRaceDefinition(RaceDefinition race) { public void addRaceDefinition(RaceDefinition race) {
} }
}, /* trackedRegattaRegistry */ null, EmptyRaceLogStore.INSTANCE)) { }, /* trackedRegattaRegistry */ null)) {
for (TypeController raceListener : receiver.getTypeControllersAndStart()) { for (TypeController raceListener : receiver.getTypeControllersAndStart()) {
listeners.add(raceListener); listeners.add(raceListener);
} }
@@ -95,7 +94,7 @@ public class ReceiveTrackingDataTest extends AbstractTracTracLiveTest {
@Override @Override
public void addRaceDefinition(RaceDefinition race) { public void addRaceDefinition(RaceDefinition race) {
} }
}, /* trackedRegattaRegistry */ null, EmptyRaceLogStore.INSTANCE)); }, /* trackedRegattaRegistry */ null));
} }
@Test @Test
@@ -33,7 +33,6 @@ import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegatta;
@@ -112,8 +111,7 @@ public abstract class TrackBasedTest {
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(trackedRegatta, race, EmptyWindStore.INSTANCE, DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(trackedRegatta, race, EmptyWindStore.INSTANCE,
/* delayToLiveInMillis */ 0, /* delayToLiveInMillis */ 0,
/* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000, /* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000,
/* delay for wind estimation cache invalidation */ 0, /* delay for wind estimation cache invalidation */ 0);
EmptyRaceLogStore.INSTANCE);
// in this simplified artificial course, the top mark is exactly north of the right leeward gate // in this simplified artificial course, the top mark is exactly north of the right leeward gate
DegreePosition topPosition = new DegreePosition(54.48, 10.24); DegreePosition topPosition = new DegreePosition(54.48, 10.24);
TimePoint afterTheRace = new MillisecondsTimePoint(timePointForFixes.asMillis() + 36000000); // 10h after the fix time TimePoint afterTheRace = new MillisecondsTimePoint(timePointForFixes.asMillis() + 36000000); // 10h after the fix time
@@ -14,7 +14,6 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tractracadapter.DomainFactory; import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants; import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants;
@@ -55,7 +54,7 @@ public class UnicodeCharactersInCompetitorNamesTest {
+ TracTracConnectionConstants.PORT_STORED), + TracTracConnectionConstants.PORT_STORED),
/* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */0l, /* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */0l,
/* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE, /* simulateWithStartTimeNow */ false, EmptyWindStore.INSTANCE,
new DummyTrackedRegattaRegistry(), EmptyRaceLogStore.INSTANCE); new DummyTrackedRegattaRegistry());
Iterable<Competitor> competitors = fourtyninerYellow_2.getRacesHandle().getRaces().iterator().next() Iterable<Competitor> competitors = fourtyninerYellow_2.getRacesHandle().getRaces().iterator().next()
.getCompetitors(); .getCompetitors();
@@ -36,7 +36,6 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.Wind;
@@ -269,8 +268,7 @@ public class WindTest {
boatClass, Collections.singleton(competitor)), boatClass, Collections.singleton(competitor)),
EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 1000, EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 1000,
/* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageWind */ 30000,
/* millisecondsOverWhichToAverageSpeed */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000);
EmptyRaceLogStore.INSTANCE);
TimePoint start = MillisecondsTimePoint.now(); TimePoint start = MillisecondsTimePoint.now();
TimePoint topMarkRounding = start.plus(30000); TimePoint topMarkRounding = start.plus(30000);
TimePoint finish = topMarkRounding.plus(30000); TimePoint finish = topMarkRounding.plus(30000);
@@ -5,33 +5,31 @@ import java.util.List;
import java.util.NavigableSet; import java.util.NavigableSet;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaListener; import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.Tack; 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.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.Maneuver;
@@ -453,7 +451,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
@Override @Override
public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore, public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore) { DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
@@ -706,12 +704,6 @@ public class MockedTrackedRace implements DynamicTrackedRace {
return null; return null;
} }
@Override
public void recordRaceLogEvent(RaceLogEvent event) {
// TODO Auto-generated method stub
}
@Override @Override
public void lockForRead(Iterable<MarkPassing> markPassings) { public void lockForRead(Iterable<MarkPassing> markPassings) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@@ -723,20 +715,8 @@ public class MockedTrackedRace implements DynamicTrackedRace {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override
public void waitUntilRaceLogLoadingComplete()
throws InterruptedException {
// TODO Auto-generated method stub
}
@Override @Override
public RaceLogStore getRaceLogStore() {
// TODO Auto-generated method stub
return null;
}
@Override
public TrackedRaceStatus getStatus() { public TrackedRaceStatus getStatus() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
@@ -5,9 +5,9 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.NavigableSet; import java.util.NavigableSet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.CourseImpl;
@@ -22,7 +22,6 @@ 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.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.GPSFixTrack;
@@ -471,19 +470,6 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override
public void waitUntilRaceLogLoadingComplete()
throws InterruptedException {
// TODO Auto-generated method stub
}
@Override
public RaceLogStore getRaceLogStore() {
// TODO Auto-generated method stub
return null;
}
@Override @Override
public TrackedRaceStatus getStatus() { public TrackedRaceStatus getStatus() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@@ -12,8 +12,8 @@ import java.util.List;
import com.maptrack.client.io.TypeController; import com.maptrack.client.io.TypeController;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
@@ -22,7 +22,6 @@ import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -123,23 +122,19 @@ public interface DomainFactory {
* Provides the capability to obtain the {@link WindTrack}s for the different wind sources. A trivial * Provides the capability to obtain the {@link WindTrack}s for the different wind sources. A trivial
* implementation is {@link EmptyWindStore} which simply provides new, empty tracks. This is always * implementation is {@link EmptyWindStore} which simply provides new, empty tracks. This is always
* available but loses track of the wind, e.g., during server restarts. * available but loses track of the wind, e.g., during server restarts.
* @param raceLogStore
* Provides the capability to obtain the {@link RaceLog} for the race. A trivial
* implementation is {@link EmptyRaceLogStore} which simply provides new, empty tracks. This is always
* available but loses track of race log events, e.g., during server restarts.
*/ */
TracTracRaceTracker createRaceTracker(URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, TracTracRaceTracker createRaceTracker(URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking,
TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) throws MalformedURLException, FileNotFoundException, TrackedRegattaRegistry trackedRegattaRegistry) throws MalformedURLException, FileNotFoundException,
URISyntaxException; URISyntaxException;
/** /**
* Same as {@link #createRaceTracker(URL, URI, URI, TimePoint, TimePoint, WindStore, TrackedRegattaRegistry, RaceLogStore)}, only that * Same as {@link #createRaceTracker(URL, URI, URI, TimePoint, TimePoint, WindStore, TrackedRegattaRegistry)}, only that
* a predefined {@link Regatta} is used to hold the resulting races. * a predefined {@link Regatta} is used to hold the resulting races.
*/ */
RaceTracker createRaceTracker(Regatta regatta, URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, RaceTracker createRaceTracker(Regatta regatta, URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking,
TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) throws MalformedURLException, FileNotFoundException, TrackedRegattaRegistry trackedRegattaRegistry) throws MalformedURLException, FileNotFoundException,
URISyntaxException; URISyntaxException;
BoatClass getOrCreateBoatClass(CompetitorClass competitorClass); BoatClass getOrCreateBoatClass(CompetitorClass competitorClass);
@@ -170,7 +165,7 @@ public interface DomainFactory {
Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, Event tractracEvent, Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, Event tractracEvent,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, Simulator simulator, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, Simulator simulator,
WindStore windStore, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, WindStore windStore, DynamicRaceDefinitionSet raceDefinitionSetToUpdate,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore); TrackedRegattaRegistry trackedRegattaRegistry);
/** /**
* Creates a {@link RaceDefinition} from a TracTrac {@link Race} and a domain {@link Course} definition. The * Creates a {@link RaceDefinition} from a TracTrac {@link Race} and a domain {@link Course} definition. The
@@ -191,7 +186,7 @@ public interface DomainFactory {
*/ */
DynamicTrackedRace getOrCreateRaceDefinitionAndTrackedRace(TrackedRegatta trackedRegatta, Race race, DynamicTrackedRace getOrCreateRaceDefinitionAndTrackedRace(TrackedRegatta trackedRegatta, Race race,
Course course, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, Course course, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore); DynamicRaceDefinitionSet raceDefinitionSetToUpdate);
/** /**
* The record may be for a single mark or a gate. If for a gate, the * The record may be for a single mark or a gate. If for a gate, the
@@ -204,7 +199,7 @@ public interface DomainFactory {
MarkPassing createMarkPassing(TimePoint timePoint, Waypoint passed, com.sap.sailing.domain.base.Competitor competitor); MarkPassing createMarkPassing(TimePoint timePoint, Waypoint passed, com.sap.sailing.domain.base.Competitor competitor);
Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, Event tractracEvent, WindStore windStore, RaceLogStore raceLogStore, Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, Event tractracEvent, WindStore windStore,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, Simulator simulator, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry, ReceiverType... types); TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, Simulator simulator, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry, ReceiverType... types);
JSONService parseJSONURL(URL jsonURL) throws IOException, ParseException, org.json.simple.parser.ParseException, URISyntaxException; JSONService parseJSONURL(URL jsonURL) throws IOException, ParseException, org.json.simple.parser.ParseException, URISyntaxException;
@@ -240,8 +235,7 @@ public interface DomainFactory {
Pair<List<com.sap.sailing.domain.base.Competitor>, BoatClass> getCompetitorsAndDominantBoatClass(Race race); Pair<List<com.sap.sailing.domain.base.Competitor>, BoatClass> getCompetitorsAndDominantBoatClass(Race race);
RaceTrackingConnectivityParameters createTrackingConnectivityParameters(URL paramURL, URI liveURI, URI storedURI, RaceTrackingConnectivityParameters createTrackingConnectivityParameters(URL paramURL, URI liveURI, URI storedURI,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore);
RaceLogStore raceLogStore);
/** /**
* Removes all knowledge about <code>tractracRace</code> which includes removing it from the race cache, from the * Removes all knowledge about <code>tractracRace</code> which includes removing it from the race cache, from the
* {@link com.sap.sailing.domain.base.Regatta} and, if a {@link TrackedRace} for the corresponding * {@link com.sap.sailing.domain.base.Regatta} and, if a {@link TrackedRace} for the corresponding
@@ -46,7 +46,6 @@ import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -349,7 +348,7 @@ public class DomainFactoryImpl implements DomainFactory {
@Override @Override
public Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, public Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta,
com.tractrac.clientmodule.Event tractracEvent, WindStore windStore, RaceLogStore raceLogStore, TimePoint startOfTracking, com.tractrac.clientmodule.Event tractracEvent, WindStore windStore, TimePoint startOfTracking,
TimePoint endOfTracking, long delayToLiveInMillis, Simulator simulator, TimePoint endOfTracking, long delayToLiveInMillis, Simulator simulator,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry,
ReceiverType... types) { ReceiverType... types) {
@@ -360,7 +359,7 @@ public class DomainFactoryImpl implements DomainFactory {
result.add(new RaceCourseReceiver( result.add(new RaceCourseReceiver(
this, trackedRegatta, tractracEvent, windStore, this, trackedRegatta, tractracEvent, windStore,
raceDefinitionSetToUpdate, delayToLiveInMillis, raceDefinitionSetToUpdate, delayToLiveInMillis,
WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, simulator, raceLogStore)); WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, simulator));
break; break;
case MARKPOSITIONS: case MARKPOSITIONS:
result.add(new MarkPositionReceiver( result.add(new MarkPositionReceiver(
@@ -387,8 +386,8 @@ public class DomainFactoryImpl implements DomainFactory {
public Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, public Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta,
com.tractrac.clientmodule.Event tractracEvent, TimePoint startOfTracking, TimePoint endOfTracking, com.tractrac.clientmodule.Event tractracEvent, TimePoint startOfTracking, TimePoint endOfTracking,
long delayToLiveInMillis, Simulator simulator, WindStore windStore, long delayToLiveInMillis, Simulator simulator, WindStore windStore,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) { DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry) {
return getUpdateReceivers(trackedRegatta, tractracEvent, windStore, raceLogStore, startOfTracking, endOfTracking, return getUpdateReceivers(trackedRegatta, tractracEvent, windStore, startOfTracking, endOfTracking,
delayToLiveInMillis, simulator, raceDefinitionSetToUpdate, trackedRegattaRegistry, delayToLiveInMillis, simulator, raceDefinitionSetToUpdate, trackedRegattaRegistry,
ReceiverType.RACECOURSE, ReceiverType.MARKPASSINGS, ReceiverType.MARKPOSITIONS, ReceiverType.RACECOURSE, ReceiverType.MARKPASSINGS, ReceiverType.MARKPOSITIONS,
ReceiverType.RACESTARTFINISH, ReceiverType.RAWPOSITIONS); ReceiverType.RACESTARTFINISH, ReceiverType.RAWPOSITIONS);
@@ -448,7 +447,7 @@ public class DomainFactoryImpl implements DomainFactory {
@Override @Override
public DynamicTrackedRace getOrCreateRaceDefinitionAndTrackedRace(TrackedRegatta trackedRegatta, public DynamicTrackedRace getOrCreateRaceDefinitionAndTrackedRace(TrackedRegatta trackedRegatta,
Race race, Course course, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, Race race, Course course, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore) { DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
synchronized (raceCache) { synchronized (raceCache) {
RaceDefinition raceDefinition = raceCache.get(race); RaceDefinition raceDefinition = raceCache.get(race);
if (raceDefinition == null) { if (raceDefinition == null) {
@@ -460,7 +459,7 @@ public class DomainFactoryImpl implements DomainFactory {
if (raceDefinition.getBoatClass() == trackedRegatta.getRegatta().getBoatClass()) { if (raceDefinition.getBoatClass() == trackedRegatta.getRegatta().getBoatClass()) {
trackedRegatta.getRegatta().addRace(raceDefinition); trackedRegatta.getRegatta().addRace(raceDefinition);
DynamicTrackedRace trackedRace = createTrackedRace(trackedRegatta, raceDefinition, windStore, DynamicTrackedRace trackedRace = createTrackedRace(trackedRegatta, raceDefinition, windStore,
delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate, raceLogStore); delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
logger.info("Added race "+raceDefinition+" to regatta "+trackedRegatta.getRegatta()); logger.info("Added race "+raceDefinition+" to regatta "+trackedRegatta.getRegatta());
synchronized (raceCache) { synchronized (raceCache) {
raceCache.put(race, raceDefinition); raceCache.put(race, raceDefinition);
@@ -480,12 +479,11 @@ public class DomainFactoryImpl implements DomainFactory {
} }
private DynamicTrackedRace createTrackedRace(TrackedRegatta trackedRegatta, RaceDefinition race, WindStore windStore, private DynamicTrackedRace createTrackedRace(TrackedRegatta trackedRegatta, RaceDefinition race, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
RaceLogStore raceLogStore) {
return trackedRegatta.createTrackedRace(race, return trackedRegatta.createTrackedRace(race,
windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind,
/* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(), /* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(),
raceDefinitionSetToUpdate, raceLogStore); raceDefinitionSetToUpdate);
} }
@Override @Override
@@ -550,20 +548,19 @@ public class DomainFactoryImpl implements DomainFactory {
@Override @Override
public TracTracRaceTracker createRaceTracker(URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, public TracTracRaceTracker createRaceTracker(URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking,
TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) throws MalformedURLException, FileNotFoundException, TrackedRegattaRegistry trackedRegattaRegistry) throws MalformedURLException, FileNotFoundException,
URISyntaxException { URISyntaxException {
return new TracTracRaceTrackerImpl(this, paramURL, liveURI, storedURI, startOfTracking, endOfTracking, delayToLiveInMillis, return new TracTracRaceTrackerImpl(this, paramURL, liveURI, storedURI, startOfTracking, endOfTracking, delayToLiveInMillis,
simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
} }
@Override @Override
public RaceTracker createRaceTracker(Regatta regatta, URL paramURL, URI liveURI, URI storedURI, public RaceTracker createRaceTracker(Regatta regatta, URL paramURL, URI liveURI, URI storedURI,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis,
boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
RaceLogStore raceLogStore)
throws MalformedURLException, FileNotFoundException, URISyntaxException { throws MalformedURLException, FileNotFoundException, URISyntaxException {
return new TracTracRaceTrackerImpl(regatta, this, paramURL, liveURI, storedURI, startOfTracking, endOfTracking, delayToLiveInMillis, return new TracTracRaceTrackerImpl(regatta, this, paramURL, liveURI, storedURI, startOfTracking, endOfTracking, delayToLiveInMillis,
simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
} }
@Override @Override
@@ -579,9 +576,9 @@ public class DomainFactoryImpl implements DomainFactory {
@Override @Override
public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(URL paramURL, URI liveURI, public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(URL paramURL, URI liveURI,
URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis,
boolean simulateWithStartTimeNow, WindStore windStore, RaceLogStore raceLogStore) { boolean simulateWithStartTimeNow, WindStore windStore) {
return new RaceTrackingConnectivityParametersImpl(paramURL, liveURI, storedURI, startOfTracking, endOfTracking, return new RaceTrackingConnectivityParametersImpl(paramURL, liveURI, storedURI, startOfTracking, endOfTracking,
delayToLiveInMillis, simulateWithStartTimeNow, windStore, this, raceLogStore); delayToLiveInMillis, simulateWithStartTimeNow, windStore, this);
} }
} }
@@ -11,7 +11,6 @@ import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -41,13 +40,12 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
private final long millisecondsOverWhichToAverageWind; private final long millisecondsOverWhichToAverageWind;
private final long delayToLiveInMillis; private final long delayToLiveInMillis;
private final WindStore windStore; private final WindStore windStore;
private final RaceLogStore raceLogStore;
private final DynamicRaceDefinitionSet raceDefinitionSetToUpdate; private final DynamicRaceDefinitionSet raceDefinitionSetToUpdate;
public RaceCourseReceiver(DomainFactory domainFactory, DynamicTrackedRegatta trackedRegatta, public RaceCourseReceiver(DomainFactory domainFactory, DynamicTrackedRegatta trackedRegatta,
com.tractrac.clientmodule.Event tractracEvent, WindStore windStore, com.tractrac.clientmodule.Event tractracEvent, WindStore windStore,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, long delayToLiveInMillis, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, long delayToLiveInMillis,
long millisecondsOverWhichToAverageWind, Simulator simulator, RaceLogStore raceLogStore) { long millisecondsOverWhichToAverageWind, Simulator simulator) {
super(domainFactory, tractracEvent, trackedRegatta, simulator); super(domainFactory, tractracEvent, trackedRegatta, simulator);
this.millisecondsOverWhichToAverageWind = millisecondsOverWhichToAverageWind; this.millisecondsOverWhichToAverageWind = millisecondsOverWhichToAverageWind;
this.delayToLiveInMillis = delayToLiveInMillis; this.delayToLiveInMillis = delayToLiveInMillis;
@@ -57,7 +55,6 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
this.windStore = simulator.simulatingWindStore(windStore); this.windStore = simulator.simulatingWindStore(windStore);
} }
this.raceDefinitionSetToUpdate = raceDefinitionSetToUpdate; this.raceDefinitionSetToUpdate = raceDefinitionSetToUpdate;
this.raceLogStore = raceLogStore;
} }
/** /**
@@ -109,7 +106,7 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
// create race definition and add to event // create race definition and add to event
DynamicTrackedRace trackedRace = getDomainFactory().getOrCreateRaceDefinitionAndTrackedRace( DynamicTrackedRace trackedRace = getDomainFactory().getOrCreateRaceDefinitionAndTrackedRace(
getTrackedRegatta(), event.getC(), course, windStore, delayToLiveInMillis, getTrackedRegatta(), event.getC(), course, windStore, delayToLiveInMillis,
millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate, raceLogStore); millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
if (getSimulator() != null) { if (getSimulator() != null) {
getSimulator().setTrackedRace(trackedRace); getSimulator().setTrackedRace(trackedRace);
} }
@@ -120,7 +117,7 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
getTrackedRegatta().createTrackedRace(race, getTrackedRegatta().createTrackedRace(race,
windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind,
/* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(), /* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(),
raceDefinitionSetToUpdate, raceLogStore); raceDefinitionSetToUpdate);
} }
} }
@@ -9,7 +9,6 @@ import java.net.URL;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
@@ -23,14 +22,13 @@ public class RaceTrackingConnectivityParametersImpl implements RaceTrackingConne
private final TimePoint startOfTracking; private final TimePoint startOfTracking;
private final TimePoint endOfTracking; private final TimePoint endOfTracking;
private final WindStore windStore; private final WindStore windStore;
private final RaceLogStore raceLogStore;
private final DomainFactory domainFactory; private final DomainFactory domainFactory;
private final long delayToLiveInMillis; private final long delayToLiveInMillis;
private final boolean simulateWithStartTimeNow; private final boolean simulateWithStartTimeNow;
public RaceTrackingConnectivityParametersImpl(URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, public RaceTrackingConnectivityParametersImpl(URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking,
TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore,
DomainFactory domainFactory, RaceLogStore raceLogStore) { DomainFactory domainFactory) {
super(); super();
this.paramURL = paramURL; this.paramURL = paramURL;
this.liveURI = liveURI; this.liveURI = liveURI;
@@ -39,7 +37,6 @@ public class RaceTrackingConnectivityParametersImpl implements RaceTrackingConne
this.endOfTracking = endOfTracking; this.endOfTracking = endOfTracking;
this.delayToLiveInMillis = delayToLiveInMillis; this.delayToLiveInMillis = delayToLiveInMillis;
this.windStore = windStore; this.windStore = windStore;
this.raceLogStore = raceLogStore;
this.domainFactory = domainFactory; this.domainFactory = domainFactory;
this.simulateWithStartTimeNow = simulateWithStartTimeNow; this.simulateWithStartTimeNow = simulateWithStartTimeNow;
} }
@@ -48,7 +45,7 @@ public class RaceTrackingConnectivityParametersImpl implements RaceTrackingConne
public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry) throws MalformedURLException, public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry) throws MalformedURLException,
FileNotFoundException, URISyntaxException { FileNotFoundException, URISyntaxException {
RaceTracker tracker = domainFactory.createRaceTracker(paramURL, liveURI, storedURI, startOfTracking, RaceTracker tracker = domainFactory.createRaceTracker(paramURL, liveURI, storedURI, startOfTracking,
endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
return tracker; return tracker;
} }
@@ -56,7 +53,7 @@ public class RaceTrackingConnectivityParametersImpl implements RaceTrackingConne
public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry) public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry)
throws Exception { throws Exception {
RaceTracker tracker = domainFactory.createRaceTracker(regatta, paramURL, liveURI, storedURI, startOfTracking, RaceTracker tracker = domainFactory.createRaceTracker(regatta, paramURL, liveURI, storedURI, startOfTracking,
endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
return tracker; return tracker;
} }
@@ -32,7 +32,6 @@ import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.TrackedRaceStatusEnum; import com.sap.sailing.domain.common.TrackedRaceStatusEnum;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.AbstractRaceTrackerImpl; import com.sap.sailing.domain.tracking.AbstractRaceTrackerImpl;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
@@ -122,19 +121,18 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
*/ */
protected TracTracRaceTrackerImpl(DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI, protected TracTracRaceTrackerImpl(DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis,
boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
RaceLogStore raceLogStore)
throws URISyntaxException, MalformedURLException, FileNotFoundException { throws URISyntaxException, MalformedURLException, FileNotFoundException {
this(KeyValue.setup(paramURL), domainFactory, paramURL, liveURI, storedURI, startOfTracking, endOfTracking, this(KeyValue.setup(paramURL), domainFactory, paramURL, liveURI, storedURI, startOfTracking, endOfTracking,
delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
} }
private TracTracRaceTrackerImpl(Event tractracEvent, DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI, private TracTracRaceTrackerImpl(Event tractracEvent, DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow,
WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
throws URISyntaxException, MalformedURLException, FileNotFoundException { throws URISyntaxException, MalformedURLException, FileNotFoundException {
this(tractracEvent, null, domainFactory, paramURL, liveURI, storedURI, this(tractracEvent, null, domainFactory, paramURL, liveURI, storedURI,
startOfTracking, endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); startOfTracking, endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
} }
/** /**
@@ -145,10 +143,10 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
*/ */
protected TracTracRaceTrackerImpl(Regatta regatta, DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI, protected TracTracRaceTrackerImpl(Regatta regatta, DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI,
TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow, TimePoint startOfTracking, TimePoint endOfTracking, long delayToLiveInMillis, boolean simulateWithStartTimeNow,
WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
throws URISyntaxException, MalformedURLException, FileNotFoundException { throws URISyntaxException, MalformedURLException, FileNotFoundException {
this(KeyValue.setup(paramURL), regatta, domainFactory, paramURL, liveURI, storedURI, startOfTracking, this(KeyValue.setup(paramURL), regatta, domainFactory, paramURL, liveURI, storedURI, startOfTracking,
endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry, raceLogStore); endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
} }
/** /**
@@ -164,8 +162,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
*/ */
private TracTracRaceTrackerImpl(Event tractracEvent, final Regatta regatta, DomainFactory domainFactory, private TracTracRaceTrackerImpl(Event tractracEvent, final Regatta regatta, DomainFactory domainFactory,
URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking, URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking,
long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis, boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
RaceLogStore raceLogStore)
throws URISyntaxException, MalformedURLException, FileNotFoundException { throws URISyntaxException, MalformedURLException, FileNotFoundException {
super(); super();
this.tractracEvent = tractracEvent; this.tractracEvent = tractracEvent;
@@ -210,7 +207,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
receivers = new HashSet<Receiver>(); receivers = new HashSet<Receiver>();
Set<TypeController> typeControllers = new HashSet<TypeController>(); Set<TypeController> typeControllers = new HashSet<TypeController>();
for (Receiver receiver : domainFactory.getUpdateReceivers(getTrackedRegatta(), tractracEvent, startOfTracking, for (Receiver receiver : domainFactory.getUpdateReceivers(getTrackedRegatta(), tractracEvent, startOfTracking,
endOfTracking, delayToLiveInMillis, simulator, windStore, this, trackedRegattaRegistry, raceLogStore)) { endOfTracking, delayToLiveInMillis, simulator, windStore, this, trackedRegattaRegistry)) {
receivers.add(receiver); receivers.add(receiver);
for (TypeController typeController : receiver.getTypeControllersAndStart()) { for (TypeController typeController : receiver.getTypeControllersAndStart()) {
typeControllers.add(typeController); typeControllers.add(typeController);
@@ -1,10 +1,9 @@
package com.sap.sailing.domain.tracking; package com.sap.sailing.domain.tracking;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Mark;
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.racelog.RaceLogEvent;
public interface DynamicTrackedRace extends TrackedRace { public interface DynamicTrackedRace extends TrackedRace {
void recordFix(Competitor competitor, GPSFixMoving fix); void recordFix(Competitor competitor, GPSFixMoving fix);
@@ -14,8 +13,6 @@ public interface DynamicTrackedRace extends TrackedRace {
void recordWind(Wind wind, WindSource windSource); void recordWind(Wind wind, WindSource windSource);
void removeWind(Wind wind, WindSource windSource); void removeWind(Wind wind, WindSource windSource);
void recordRaceLogEvent(RaceLogEvent event);
/** /**
* The raw, updating feed of a single competitor participating in this race * The raw, updating feed of a single competitor participating in this race
@@ -1,7 +1,6 @@
package com.sap.sailing.domain.tracking; package com.sap.sailing.domain.tracking;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.racelog.RaceLogStore;
public interface DynamicTrackedRegatta extends TrackedRegatta { public interface DynamicTrackedRegatta extends TrackedRegatta {
@@ -20,6 +19,6 @@ public interface DynamicTrackedRegatta extends TrackedRegatta {
*/ */
DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore, DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore); DynamicRaceDefinitionSet raceDefinitionSetToUpdate);
} }
@@ -5,10 +5,10 @@ import java.util.List;
import java.util.NavigableSet; import java.util.NavigableSet;
import java.util.SortedSet; import java.util.SortedSet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.DouglasPeucker; import com.sap.sailing.domain.base.impl.DouglasPeucker;
@@ -24,7 +24,6 @@ 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.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogStore;
/** /**
* Live tracking data of a single race. The race follows a defined {@link Course} with a sequence of {@link Leg}s. The * Live tracking data of a single race. The race follows a defined {@link Course} with a sequence of {@link Leg}s. The
@@ -455,20 +454,9 @@ public interface TrackedRace extends Serializable {
void waitUntilWindLoadingComplete() throws InterruptedException; void waitUntilWindLoadingComplete() throws InterruptedException;
/** /**
* Returns the race log event track for this race or creates it if it did not exist yet * Returns the race log event track for this race
*/ */
RaceLog getRaceLog(); RaceLog getRaceLog();
/**
* When provided with a {@link RaceLogStore} during construction, the tracked race will asynchronously load the race log event
* data for this tracked race from the race log store in a background thread and update this tracked race with the results.
* Clients that want to wait for the race log event loading process to complete can do so by calling this method which will block
* until the race log event loading has completed.
*/
void waitUntilRaceLogLoadingComplete() throws InterruptedException;
RaceLogStore getRaceLogStore();
TrackedRaceStatus getStatus(); TrackedRaceStatus getStatus();
@@ -4,11 +4,10 @@ import java.io.Serializable;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLogStore;
/** /**
* Manages a set of {@link TrackedRace} objects that belong to the same {@link Regatta} (regatta, sailing regatta for a * Manages a set of {@link TrackedRace} objects that belong to the same {@link Regatta} (regatta, sailing regatta for a
@@ -42,7 +41,7 @@ public interface TrackedRegatta extends Serializable {
*/ */
DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore, DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore); DynamicRaceDefinitionSet raceDefinitionSetToUpdate);
/** /**
* Obtains the tracked race for <code>race</code>. Blocks until the tracked race has been created * Obtains the tracked race for <code>race</code>. Blocks until the tracked race has been created
@@ -25,8 +25,6 @@ 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.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -58,9 +56,9 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race,
WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
long delayForCacheInvalidationOfWindEstimation, RaceLogStore raceLogStore) { long delayForCacheInvalidationOfWindEstimation) {
super(trackedRegatta, race, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, super(trackedRegatta, race, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed,
delayForCacheInvalidationOfWindEstimation, raceLogStore); delayForCacheInvalidationOfWindEstimation);
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>();
@@ -96,9 +94,9 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
*/ */
public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race,
WindStore windStore, long delayToLiveInMillis, WindStore windStore, long delayToLiveInMillis,
long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, RaceLogStore raceLogStore) { long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed) {
this(trackedRegatta, race, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, this(trackedRegatta, race, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed,
millisecondsOverWhichToAverageWind/2, raceLogStore); millisecondsOverWhichToAverageWind/2);
} }
@Override @Override
@@ -638,27 +636,4 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
return raceIsKnownToStartUpwind; return raceIsKnownToStartUpwind;
} }
@Override
public void recordRaceLogEvent(RaceLogEvent event) {
getRaceLog().add(event);
updated(/* time point */null); // TODO: updated has to be understood better, for now it shall have the same behaviour as in recordWind
//TODO triggerRaceStateCalculation();
notifyListeners(event);
}
private void notifyListeners(RaceLogEvent event) {
RaceChangeListener[] listeners;
synchronized (getListeners()) {
listeners = getListeners().toArray(new RaceChangeListener[getListeners().size()]);
}
for (RaceChangeListener listener : listeners) {
try {
listener.raceLogEventReceived(event);
} catch (Throwable t) {
logger.log(Level.SEVERE, "RaceChangeListener " + listener + " threw exception " + t.getMessage());
logger.throwing(DynamicTrackedRaceImpl.class.getName(), "notifyListeners(RaceLogEvent)", t);
}
}
}
} }
@@ -1,11 +1,10 @@
package com.sap.sailing.domain.tracking.impl; package com.sap.sailing.domain.tracking.impl;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindStore;
public class DynamicTrackedRegattaImpl extends TrackedRegattaImpl implements DynamicTrackedRegatta { public class DynamicTrackedRegattaImpl extends TrackedRegattaImpl implements DynamicTrackedRegatta {
@@ -28,8 +27,8 @@ public class DynamicTrackedRegattaImpl extends TrackedRegattaImpl implements Dyn
@Override @Override
public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore, public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore) { DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
return (DynamicTrackedRace) super.createTrackedRace(raceDefinition, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, return (DynamicTrackedRace) super.createTrackedRace(raceDefinition, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind,
millisecondsOverWhichToAverageSpeed, raceDefinitionSetToUpdate, raceLogStore); millisecondsOverWhichToAverageSpeed, raceDefinitionSetToUpdate);
} }
} }
@@ -30,12 +30,12 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.base.BearingWithConfidence; import com.sap.sailing.domain.base.BearingWithConfidence;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.CourseChange; import com.sap.sailing.domain.base.CourseChange;
import com.sap.sailing.domain.base.CourseListener; import com.sap.sailing.domain.base.CourseListener;
import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.SpeedWithBearing; import com.sap.sailing.domain.base.SpeedWithBearing;
import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence; import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence;
@@ -70,8 +70,6 @@ import com.sap.sailing.domain.confidence.Weigher;
import com.sap.sailing.domain.confidence.impl.HyperbolicTimeDifferenceWeigher; import com.sap.sailing.domain.confidence.impl.HyperbolicTimeDifferenceWeigher;
import com.sap.sailing.domain.confidence.impl.PositionAndTimePointWeigher; import com.sap.sailing.domain.confidence.impl.PositionAndTimePointWeigher;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.GPSFixTrack;
@@ -247,22 +245,12 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
* synchronization or locking. * synchronization or locking.
*/ */
private final NamedReentrantReadWriteLock serializationLock; private final NamedReentrantReadWriteLock serializationLock;
private transient RaceLog raceLog;
private transient RaceLogStore raceLogStore;
/**
* The constructor loads race log events from the {@link #raceLogStore} asynchronously. When completed, this flag is set to
* <code>true</code>, and all threads currently waiting on this object are notified.
*/
private boolean raceLogLoadingCompleted;
private final Map<Iterable<MarkPassing>, NamedReentrantReadWriteLock> locksForMarkPassings; private final Map<Iterable<MarkPassing>, NamedReentrantReadWriteLock> locksForMarkPassings;
public TrackedRaceImpl(final TrackedRegatta trackedRegatta, RaceDefinition race, final WindStore windStore, public TrackedRaceImpl(final TrackedRegatta trackedRegatta, RaceDefinition race, final WindStore windStore,
long delayToLiveInMillis, final long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, final long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
long delayForWindEstimationCacheInvalidation, final RaceLogStore raceLogStore) { long delayForWindEstimationCacheInvalidation) {
super(); super();
locksForMarkPassings = new IdentityHashMap<Iterable<MarkPassing>, NamedReentrantReadWriteLock>(); locksForMarkPassings = new IdentityHashMap<Iterable<MarkPassing>, NamedReentrantReadWriteLock>();
this.status = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.PREPARED, 0.0); this.status = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.PREPARED, 0.0);
@@ -272,7 +260,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
this.updateCount = 0; this.updateCount = 0;
this.race = race; this.race = race;
this.windStore = windStore; this.windStore = windStore;
this.raceLogStore = raceLogStore;
this.windSourcesToExclude = new HashSet<WindSource>(); this.windSourcesToExclude = new HashSet<WindSource>();
this.directionFromStartToNextMarkCache = new HashMap<TimePoint, Future<Wind>>(); this.directionFromStartToNextMarkCache = new HashMap<TimePoint, Future<Wind>>();
this.millisecondsOverWhichToAverageSpeed = millisecondsOverWhichToAverageSpeed; this.millisecondsOverWhichToAverageSpeed = millisecondsOverWhichToAverageSpeed;
@@ -340,25 +327,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
} }
}.start(); }.start();
new Thread("Race log event loader for tracked race " + getRace().getName()) {
@Override
public void run() {
// When this tracked race is to be serialized, wait for the loading of the according race log to complete.
// It seems sufficiently unlikely that serialization is requested after the constructor succeeds and
// before this thread obtains the lock.
LockUtil.lockForRead(serializationLock);
try {
raceLog = raceLogStore.getRaceLog(trackedRegatta, TrackedRaceImpl.this);
} finally {
LockUtil.unlockAfterRead(serializationLock);
}
synchronized (TrackedRaceImpl.this) {
raceLogLoadingCompleted = true;
TrackedRaceImpl.this.notifyAll();
}
}
}.start();
// by default, a tracked race offers one course-based wind estimation, one track-based wind estimation track and // by default, a tracked race offers one course-based wind estimation, one track-based wind estimation track and
// one "WEB" track for manual or REST-based wind reception; other wind tracks may be added as fixes are received // one "WEB" track for manual or REST-based wind reception; other wind tracks may be added as fixes are received
// for them. // for them.
@@ -386,15 +354,13 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
/** /**
* Deserialization has to be maintained in lock-step with {@link #writeObject(ObjectOutputStream) serialization}. * Deserialization has to be maintained in lock-step with {@link #writeObject(ObjectOutputStream) serialization}.
* When de-serializing, a possibly remote {@link #windStore} is ignored because it is transient. Instead, an * When de-serializing, a possibly remote {@link #windStore} is ignored because it is transient. Instead, an
* {@link EmptyWindStore} is used for the de-serialized instance. Same counts for the {@link #raceLogStore}, which is then initialized * {@link EmptyWindStore} is used for the de-serialized instance.
* with a {@link EmptyRaceLogStore}.
*/ */
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject(); ois.defaultReadObject();
markPassingsTimes = new ArrayList<Pair<Waypoint, Pair<TimePoint, TimePoint>>>(); markPassingsTimes = new ArrayList<Pair<Waypoint, Pair<TimePoint, TimePoint>>>();
cacheInvalidationTimerLock = new Object(); cacheInvalidationTimerLock = new Object();
windStore = EmptyWindStore.INSTANCE; windStore = EmptyWindStore.INSTANCE;
raceLogStore = EmptyRaceLogStore.INSTANCE;
competitorRankings = new HashMap<TimePoint, List<Competitor>>(); competitorRankings = new HashMap<TimePoint, List<Competitor>>();
competitorRankingsLocks = new HashMap<TimePoint, NamedReentrantReadWriteLock>(); competitorRankingsLocks = new HashMap<TimePoint, NamedReentrantReadWriteLock>();
directionFromStartToNextMarkCache = new HashMap<TimePoint, Future<Wind>>(); directionFromStartToNextMarkCache = new HashMap<TimePoint, Future<Wind>>();
@@ -408,13 +374,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
wait(); wait();
} }
} }
@Override
public synchronized void waitUntilRaceLogLoadingComplete() throws InterruptedException {
while (!raceLogLoadingCompleted) {
wait();
}
}
private SmartFutureCache<Competitor, Triple<TimePoint, TimePoint, List<Maneuver>>, EmptyUpdateInterval> createManeuverCache() { private SmartFutureCache<Competitor, Triple<TimePoint, TimePoint, List<Maneuver>>, EmptyUpdateInterval> createManeuverCache() {
return new SmartFutureCache<Competitor, Triple<TimePoint, TimePoint, List<Maneuver>>, EmptyUpdateInterval>( return new SmartFutureCache<Competitor, Triple<TimePoint, TimePoint, List<Maneuver>>, EmptyUpdateInterval>(
@@ -449,11 +408,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
public WindStore getWindStore() { public WindStore getWindStore() {
return windStore; return windStore;
} }
@Override
public RaceLogStore getRaceLogStore() {
return raceLogStore;
}
@Override @Override
public Iterable<MarkPassing> getMarkPassingsInOrder(Waypoint waypoint) { public Iterable<MarkPassing> getMarkPassingsInOrder(Waypoint waypoint) {
@@ -2254,19 +2208,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
this.delayToLiveInMillis = delayToLiveInMillis; this.delayToLiveInMillis = delayToLiveInMillis;
} }
@Override
public RaceLog getRaceLog() {
if (raceLog == null) {
try {
waitUntilRaceLogLoadingComplete();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return raceLog;
}
@Override @Override
public TrackedRaceStatus getStatus() { public TrackedRaceStatus getStatus() {
return status; return status;
@@ -2321,4 +2262,9 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
} }
} }
} }
@Override
public RaceLog getRaceLog() {
return null;
}
} }
@@ -18,7 +18,6 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.RaceListener;
@@ -170,10 +169,10 @@ public class TrackedRegattaImpl implements TrackedRegatta {
@Override @Override
public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore, long delayToLiveInMillis, public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, WindStore windStore, long delayToLiveInMillis,
long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, RaceLogStore raceLogStore) { DynamicRaceDefinitionSet raceDefinitionSetToUpdate) {
logger.log(Level.INFO, "Creating DynamicTrackedRaceImpl for RaceDefinition " + raceDefinition.getName()); logger.log(Level.INFO, "Creating DynamicTrackedRaceImpl for RaceDefinition " + raceDefinition.getName());
DynamicTrackedRaceImpl result = new DynamicTrackedRaceImpl(this, raceDefinition, DynamicTrackedRaceImpl result = new DynamicTrackedRaceImpl(this, raceDefinition,
windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, raceLogStore); windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed);
addTrackedRace(result); addTrackedRace(result);
if (raceDefinitionSetToUpdate != null) { if (raceDefinitionSetToUpdate != null) {
raceDefinitionSetToUpdate.addRaceDefinition(raceDefinition); raceDefinitionSetToUpdate.addRaceDefinition(raceDefinition);
@@ -109,7 +109,6 @@ import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory;
import com.sap.sailing.domain.persistence.MongoWindStoreFactory; import com.sap.sailing.domain.persistence.MongoWindStoreFactory;
import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration;
@@ -1148,8 +1147,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
new URI(liveURI), new URI(storedURI), new MillisecondsTimePoint(rr.trackingStartTime), new URI(liveURI), new URI(storedURI), new MillisecondsTimePoint(rr.trackingStartTime),
new MillisecondsTimePoint(rr.trackingEndTime), new MillisecondsTimePoint(rr.trackingEndTime),
MongoWindStoreFactory.INSTANCE.getMongoWindStore(mongoObjectFactory, domainObjectFactory), MongoWindStoreFactory.INSTANCE.getMongoWindStore(mongoObjectFactory, domainObjectFactory),
RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, simulateWithStartTimeNow, RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, simulateWithStartTimeNow);
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory));
if (trackWind) { if (trackWind) {
new Thread("Wind tracking starter for race " + rr.regattaName + "/" + rr.name) { new Thread("Wind tracking starter for race " + rr.regattaName + "/" + rr.name) {
public void run() { public void run() {
@@ -2391,8 +2389,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
final RacesHandle raceHandle = getService().addSwissTimingRace(regattaToAddTo, rr.ID, hostname, port, final RacesHandle raceHandle = getService().addSwissTimingRace(regattaToAddTo, rr.ID, hostname, port,
canSendRequests, canSendRequests,
MongoWindStoreFactory.INSTANCE.getMongoWindStore(mongoObjectFactory, domainObjectFactory), MongoWindStoreFactory.INSTANCE.getMongoWindStore(mongoObjectFactory, domainObjectFactory),
RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS, RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory));
if (trackWind) { if (trackWind) {
new Thread("Wind tracking starter for race " + rr.ID + "/" + rr.description) { new Thread("Wind tracking starter for race " + rr.ID + "/" + rr.description) {
public void run() { public void run() {
@@ -23,7 +23,6 @@ import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.AbstractTracTracLiveTest; import com.sap.sailing.domain.test.AbstractTracTracLiveTest;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
@@ -67,7 +66,7 @@ public class TestStoringAndRetrievingRaceLogsTest extends AbstractTracTracLiveTe
Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null); Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
DynamicTrackedRegatta trackedRegatta = new RacingEventServiceImpl().getOrCreateTrackedRegatta(domainEvent); DynamicTrackedRegatta trackedRegatta = new RacingEventServiceImpl().getOrCreateTrackedRegatta(domainEvent);
Iterable<Receiver> typeControllers = domainFactory.getUpdateReceivers(trackedRegatta, getTracTracEvent(), Iterable<Receiver> typeControllers = domainFactory.getUpdateReceivers(trackedRegatta, getTracTracEvent(),
EmptyWindStore.INSTANCE, EmptyRaceLogStore.INSTANCE, EmptyWindStore.INSTANCE,
/* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */ /* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */
0l, /* simulator */ null, new DynamicRaceDefinitionSet() { 0l, /* simulator */ null, new DynamicRaceDefinitionSet() {
@Override @Override
@@ -81,7 +80,7 @@ public class TestStoringAndRetrievingRaceLogsTest extends AbstractTracTracLiveTe
@Override @Override
public void addRaceDefinition(RaceDefinition race) { public void addRaceDefinition(RaceDefinition race) {
} }
}, EmptyRaceLogStore.INSTANCE); });
Mongo myFirstMongo = newMongo(); Mongo myFirstMongo = newMongo();
DB firstDatabase = myFirstMongo.getDB(dbConfiguration.getDatabaseName()); DB firstDatabase = myFirstMongo.getDB(dbConfiguration.getDatabaseName());
@@ -14,8 +14,8 @@ import org.junit.Test;
import com.mongodb.DB; import com.mongodb.DB;
import com.mongodb.Mongo; import com.mongodb.Mongo;
import com.mongodb.MongoException; import com.mongodb.MongoException;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Position;
@@ -27,11 +27,10 @@ import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl;
import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.AbstractTracTracLiveTest; import com.sap.sailing.domain.test.AbstractTracTracLiveTest;
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
@@ -74,7 +73,7 @@ public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLive
Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null); Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
DynamicTrackedRegatta trackedRegatta = new RacingEventServiceImpl().getOrCreateTrackedRegatta(domainEvent); DynamicTrackedRegatta trackedRegatta = new RacingEventServiceImpl().getOrCreateTrackedRegatta(domainEvent);
Iterable<Receiver> typeControllers = domainFactory.getUpdateReceivers(trackedRegatta, getTracTracEvent(), Iterable<Receiver> typeControllers = domainFactory.getUpdateReceivers(trackedRegatta, getTracTracEvent(),
EmptyWindStore.INSTANCE, EmptyRaceLogStore.INSTANCE, EmptyWindStore.INSTANCE,
/* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */ /* startOfTracking */null, /* endOfTracking */null, /* delayToLiveInMillis */
0l, /* simulator */ null, new DynamicRaceDefinitionSet() { 0l, /* simulator */ null, new DynamicRaceDefinitionSet() {
@Override @Override
@@ -88,7 +87,7 @@ public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLive
@Override @Override
public void addRaceDefinition(RaceDefinition race) { public void addRaceDefinition(RaceDefinition race) {
} }
}, EmptyRaceLogStore.INSTANCE); });
WindSource windSource = new WindSourceImpl(WindSourceType.WEB); WindSource windSource = new WindSourceImpl(WindSourceType.WEB);
Mongo myFirstMongo = newMongo(); Mongo myFirstMongo = newMongo();
DB firstDatabase = myFirstMongo.getDB(dbConfiguration.getDatabaseName()); DB firstDatabase = myFirstMongo.getDB(dbConfiguration.getDatabaseName());
@@ -38,10 +38,7 @@ import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoFactory;
import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory;
import com.sap.sailing.domain.persistence.MongoWindStoreFactory; import com.sap.sailing.domain.persistence.MongoWindStoreFactory;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.Wind;
@@ -122,8 +119,6 @@ public class AdminApp extends SailingServerHttpServlet {
private static final String STORE_MONGO = "mongo"; private static final String STORE_MONGO = "mongo";
private static final String PARAM_NAME_RACELOGSTORE = "racelogstore";
public AdminApp() { public AdminApp() {
} }
@@ -471,7 +466,7 @@ public class AdminApp extends SailingServerHttpServlet {
URL jsonURL = new URL(req.getParameter(PARAM_NAME_EVENT_JSON_URL)); URL jsonURL = new URL(req.getParameter(PARAM_NAME_EVENT_JSON_URL));
URI liveURI = new URI(req.getParameter(PARAM_NAME_LIVE_URI)); URI liveURI = new URI(req.getParameter(PARAM_NAME_LIVE_URI));
URI storedURI = new URI(req.getParameter(PARAM_NAME_STORED_URI)); URI storedURI = new URI(req.getParameter(PARAM_NAME_STORED_URI));
getService().addRegatta(jsonURL, liveURI, storedURI, getWindStore(req), /* timeoutInMilliseconds */ 60000, getRaceLogStore(req)); getService().addRegatta(jsonURL, liveURI, storedURI, getWindStore(req), /* timeoutInMilliseconds */ 60000);
} }
private WindStore getWindStore(HttpServletRequest req) throws UnknownHostException, MongoException { private WindStore getWindStore(HttpServletRequest req) throws UnknownHostException, MongoException {
@@ -495,8 +490,7 @@ public class AdminApp extends SailingServerHttpServlet {
URL paramURL = new URL(req.getParameter(PARAM_NAME_PARAM_URL)); URL paramURL = new URL(req.getParameter(PARAM_NAME_PARAM_URL));
URI liveURI = new URI(req.getParameter(PARAM_NAME_LIVE_URI)); URI liveURI = new URI(req.getParameter(PARAM_NAME_LIVE_URI));
URI storedURI = new URI(req.getParameter(PARAM_NAME_STORED_URI)); URI storedURI = new URI(req.getParameter(PARAM_NAME_STORED_URI));
getService().addTracTracRace(paramURL, liveURI, storedURI, getWindStore(req), /* timeoutInMilliseconds */ 60000, getService().addTracTracRace(paramURL, liveURI, storedURI, getWindStore(req), /* timeoutInMilliseconds */ 60000);
getRaceLogStore(req));
} }
private void stopRace(HttpServletRequest req, HttpServletResponse resp) throws MalformedURLException, IOException, InterruptedException { private void stopRace(HttpServletRequest req, HttpServletResponse resp) throws MalformedURLException, IOException, InterruptedException {
@@ -512,22 +506,4 @@ public class AdminApp extends SailingServerHttpServlet {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Regatta not found"); resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Regatta not found");
} }
} }
private RaceLogStore getRaceLogStore(HttpServletRequest req) throws UnknownHostException, MongoException {
String raceCommitteStore = req.getParameter(PARAM_NAME_RACELOGSTORE);
if (raceCommitteStore != null) {
if (raceCommitteStore.equals(STORE_EMPTY)) {
return EmptyRaceLogStore.INSTANCE;
} else if (raceCommitteStore.equals(STORE_MONGO)) {
return MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(
MongoFactory.INSTANCE.getDefaultMongoObjectFactory(),
MongoFactory.INSTANCE.getDefaultDomainObjectFactory());
} else {
log("Couldn't find race log store " + raceCommitteStore + ". Using EmptyRaceLogStore instead.");
return EmptyRaceLogStore.INSTANCE;
}
}
return EmptyRaceLogStore.INSTANCE;
}
} }
@@ -76,7 +76,7 @@ public class ModifyRaceLogJsonExportServlet extends JsonExportServlet {
return; return;
} }
dynamicTrackedRace.recordRaceLogEvent(raceLogEvent); //TODO dynamicTrackedRace.recordRaceLogEvent(raceLogEvent);
} catch (ParseException e) { } catch (ParseException e) {
throw new JsonDeserializationException("Invalid JSON in request body.", e); throw new JsonDeserializationException("Invalid JSON in request body.", e);
} }
@@ -28,7 +28,6 @@ import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.AbstractTracTracLiveTest; import com.sap.sailing.domain.test.AbstractTracTracLiveTest;
import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
@@ -81,7 +80,7 @@ public class TrackRaceReplicationTest extends AbstractServerReplicationTest {
}); });
trackingParams = com.sap.sailing.domain.tractracadapter.DomainFactory.INSTANCE.createTrackingConnectivityParameters(paramURL, trackingParams = com.sap.sailing.domain.tractracadapter.DomainFactory.INSTANCE.createTrackingConnectivityParameters(paramURL,
liveURI, storedURI, startOfTracking, endOfTracking, /* delayToLiveInMillis */ liveURI, storedURI, startOfTracking, endOfTracking, /* delayToLiveInMillis */
0l, /* simulateWithStartTimeNow */false, EmptyWindStore.INSTANCE, EmptyRaceLogStore.INSTANCE); 0l, /* simulateWithStartTimeNow */false, EmptyWindStore.INSTANCE);
} }
private void startTracking() throws Exception, InterruptedException { private void startTracking() throws Exception, InterruptedException {
@@ -92,8 +91,7 @@ public class TrackRaceReplicationTest extends AbstractServerReplicationTest {
} }
private void startTrackingOnMaster() throws Exception { private void startTrackingOnMaster() throws Exception {
racesHandle = master.addRace(/* regattaToAddTo */ null, trackingParams, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000, racesHandle = master.addRace(/* regattaToAddTo */ null, trackingParams, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
EmptyRaceLogStore.INSTANCE);
} }
private void waitForTrackRaceReplicationTrigger() throws InterruptedException { private void waitForTrackRaceReplicationTrigger() throws InterruptedException {
@@ -39,7 +39,6 @@ import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoFactory;
import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory;
import com.sap.sailing.domain.persistence.MongoWindStore; import com.sap.sailing.domain.persistence.MongoWindStore;
import com.sap.sailing.domain.persistence.MongoWindStoreFactory; import com.sap.sailing.domain.persistence.MongoWindStoreFactory;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
@@ -96,11 +95,8 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio
trackedRace = (DynamicTrackedRace) master.apply(new CreateTrackedRace(raceIdentifier, trackedRace = (DynamicTrackedRace) master.apply(new CreateTrackedRace(raceIdentifier,
MongoWindStoreFactory.INSTANCE.getMongoWindStore(MongoFactory.INSTANCE.getDefaultMongoObjectFactory(), MongoWindStoreFactory.INSTANCE.getMongoWindStore(MongoFactory.INSTANCE.getDefaultMongoObjectFactory(),
MongoFactory.INSTANCE.getDefaultDomainObjectFactory()), /* delayToLiveInMillis */ 5000, MongoFactory.INSTANCE.getDefaultDomainObjectFactory()), /* delayToLiveInMillis */ 5000,
/* millisecondsOverWhichToAverageWind */ 10000, /* millisecondsOverWhichToAverageSpeed */10000, /* millisecondsOverWhichToAverageWind */ 10000, /* millisecondsOverWhichToAverageSpeed */10000));
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(MongoFactory.INSTANCE.getDefaultMongoObjectFactory(),
MongoFactory.INSTANCE.getDefaultDomainObjectFactory())));
trackedRace.waitUntilWindLoadingComplete(); trackedRace.waitUntilWindLoadingComplete();
trackedRace.waitUntilRaceLogLoadingComplete();
} }
@Test @Test
@@ -230,7 +226,7 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio
TimePoint time = MillisecondsTimePoint.now(); TimePoint time = MillisecondsTimePoint.now();
final RaceLogStartTimeEvent startTimeEvent = final RaceLogStartTimeEvent startTimeEvent =
RaceLogEventFactory.INSTANCE.createStartTimeEvent(time, 0, new MillisecondsTimePoint(time.asMillis() + 500000)); RaceLogEventFactory.INSTANCE.createStartTimeEvent(time, 0, new MillisecondsTimePoint(time.asMillis() + 500000));
trackedRace.recordRaceLogEvent(startTimeEvent); //trackedRace.recordRaceLogEvent(startTimeEvent);
Thread.sleep(1000); Thread.sleep(1000);
TrackedRace replicaTrackedRace = replica.getTrackedRace(raceIdentifier); TrackedRace replicaTrackedRace = replica.getTrackedRace(raceIdentifier);
RaceLog replicaRaceLog = replicaTrackedRace.getRaceLog(); RaceLog replicaRaceLog = replicaTrackedRace.getRaceLog();
@@ -250,7 +246,7 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio
TimePoint time = MillisecondsTimePoint.now(); TimePoint time = MillisecondsTimePoint.now();
final RaceLogStartTimeEvent startTimeEvent = final RaceLogStartTimeEvent startTimeEvent =
RaceLogEventFactory.INSTANCE.createStartTimeEvent(time, 0, new MillisecondsTimePoint(time.asMillis() + 500000)); RaceLogEventFactory.INSTANCE.createStartTimeEvent(time, 0, new MillisecondsTimePoint(time.asMillis() + 500000));
trackedRace.recordRaceLogEvent(startTimeEvent); //trackedRace.recordRaceLogEvent(startTimeEvent);
RaceLog trackedRaceRaceLog= trackedRace.getRaceLog(); RaceLog trackedRaceRaceLog= trackedRace.getRaceLog();
trackedRaceRaceLog.lockForRead(); trackedRaceRaceLog.lockForRead();
try { try {
@@ -29,7 +29,6 @@ import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegatta;
@@ -72,13 +71,13 @@ public class RaceTrackerStartStopTest {
raceDef3 = new RaceDefinitionImpl(RACENAME3, new CourseImpl("Course3", new ArrayList<Waypoint>()), boatClass, new ArrayList<Competitor>()); raceDef3 = new RaceDefinitionImpl(RACENAME3, new CourseImpl("Course3", new ArrayList<Waypoint>()), boatClass, new ArrayList<Competitor>());
regatta.addRace(raceDef1); regatta.addRace(raceDef1);
trackedRegatta1.createTrackedRace(raceDef1, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l, trackedRegatta1.createTrackedRace(raceDef1, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l,
/* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null, EmptyRaceLogStore.INSTANCE); /* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null);
regatta.addRace(raceDef2); regatta.addRace(raceDef2);
trackedRegatta1.createTrackedRace(raceDef2, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l, trackedRegatta1.createTrackedRace(raceDef2, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l,
/* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null, EmptyRaceLogStore.INSTANCE); /* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null);
regatta.addRace(raceDef3); regatta.addRace(raceDef3);
trackedRegatta1.createTrackedRace(raceDef3, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l, trackedRegatta1.createTrackedRace(raceDef3, /* windStore */ EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 0l, /* millisecondsOverWhichToAverageWind */ 0l,
/* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null, EmptyRaceLogStore.INSTANCE); /* millisecondsOverWhichToAverageSpeed */ 0l, /* raceDefinitionSetToUpdate */ null);
Set<RaceDefinition> raceDefinitionSetRace1 = new HashSet<RaceDefinition>(); Set<RaceDefinition> raceDefinitionSetRace1 = new HashSet<RaceDefinition>();
raceDefinitionSetRace1.add(raceDef1); raceDefinitionSetRace1.add(raceDef1);
Set<RaceDefinition> raceDefinitionSetRace2 = new HashSet<RaceDefinition>(); Set<RaceDefinition> raceDefinitionSetRace2 = new HashSet<RaceDefinition>();
@@ -20,7 +20,6 @@ import org.junit.Test;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.RaceListener;
import com.sap.sailing.domain.tracking.RacesHandle; import com.sap.sailing.domain.tracking.RacesHandle;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -61,8 +60,7 @@ public class RaceTrackerTest {
public void setUp() throws Exception { public void setUp() throws Exception {
service = new RacingEventServiceImpl(); service = new RacingEventServiceImpl();
logger.info("Calling service.addTracTracRace"); logger.info("Calling service.addTracTracRace");
raceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000, raceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
EmptyRaceLogStore.INSTANCE);
logger.info("Calling raceHandle.getRaces()"); logger.info("Calling raceHandle.getRaces()");
Set<RaceDefinition> races = raceHandle.getRaces(); // wait for RaceDefinition to be completely wired in Regatta Set<RaceDefinition> races = raceHandle.getRaces(); // wait for RaceDefinition to be completely wired in Regatta
logger.info("Obtained races: "+races); logger.info("Obtained races: "+races);
@@ -118,8 +116,7 @@ public class RaceTrackerTest {
RaceDefinition oldRaceDefinition = oldTrackedRace.getRace(); RaceDefinition oldRaceDefinition = oldTrackedRace.getRace();
assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces())); assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces()));
service.removeRegatta(raceHandle.getRegatta()); service.removeRegatta(raceHandle.getRegatta());
RacesHandle myRaceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000, RacesHandle myRaceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
EmptyRaceLogStore.INSTANCE);
TrackedRegatta newTrackedRegatta = myRaceHandle.getTrackedRegatta(); TrackedRegatta newTrackedRegatta = myRaceHandle.getTrackedRegatta();
assertNotSame(oldTrackedRegatta, newTrackedRegatta); assertNotSame(oldTrackedRegatta, newTrackedRegatta);
TrackedRace newTrackedRace = getTrackedRace(newTrackedRegatta); TrackedRace newTrackedRace = getTrackedRace(newTrackedRegatta);
@@ -143,8 +140,7 @@ public class RaceTrackerTest {
logger.entering(getClass().getName(), "testTrackingSameRaceWithoutStopping"); logger.entering(getClass().getName(), "testTrackingSameRaceWithoutStopping");
TrackedRegatta oldTrackedRegatta = raceHandle.getTrackedRegatta(); TrackedRegatta oldTrackedRegatta = raceHandle.getTrackedRegatta();
TrackedRace oldTrackedRace = getTrackedRace(oldTrackedRegatta); TrackedRace oldTrackedRace = getTrackedRace(oldTrackedRegatta);
RacesHandle myRaceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000, RacesHandle myRaceHandle = service.addTracTracRace(paramUrl, liveUri, storedUri, EmptyWindStore.INSTANCE, /* timeoutInMilliseconds */ 60000);
EmptyRaceLogStore.INSTANCE);
TrackedRegatta newTrackedEvent = myRaceHandle.getTrackedRegatta(); TrackedRegatta newTrackedEvent = myRaceHandle.getTrackedRegatta();
TrackedRace newTrackedRace = getTrackedRace(newTrackedEvent); TrackedRace newTrackedRace = getTrackedRace(newTrackedEvent);
// expecting a new tracked race to be created when starting over with tracking // expecting a new tracked race to be created when starting over with tracking
@@ -39,7 +39,6 @@ import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.LeaderboardRegistry; import com.sap.sailing.domain.leaderboard.LeaderboardRegistry;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.RaceListener;
import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTracker;
@@ -110,8 +109,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* if a race definition is not received for a race of this event within this time, the race tracker for * if a race definition is not received for a race of this event within this time, the race tracker for
* that race is stopped; use -1 to wait forever * that race is stopped; use -1 to wait forever
*/ */
Regatta addRegatta(URL jsonURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds, Regatta addRegatta(URL jsonURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds)
RaceLogStore raceLogStore)
throws MalformedURLException, FileNotFoundException, URISyntaxException, IOException, ParseException, throws MalformedURLException, FileNotFoundException, URISyntaxException, IOException, ParseException,
org.json.simple.parser.ParseException, Exception; org.json.simple.parser.ParseException, Exception;
@@ -137,8 +135,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* if the race definition is not received for the race within this time, the race tracker for * if the race definition is not received for the race within this time, the race tracker for
* that race is stopped; use -1 to wait forever * that race is stopped; use -1 to wait forever
*/ */
RacesHandle addTracTracRace(URL paramURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds, RacesHandle addTracTracRace(URL paramURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds)
RaceLogStore raceLogStore)
throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception; throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception;
/** /**
@@ -155,7 +152,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
*/ */
RacesHandle addTracTracRace(RegattaIdentifier regattaToAddTo, URL paramURL, URI liveURI, URI storedURI, RacesHandle addTracTracRace(RegattaIdentifier regattaToAddTo, URL paramURL, URI liveURI, URI storedURI,
TimePoint trackingStartTime, TimePoint trackingEndTime, WindStore windStore, TimePoint trackingStartTime, TimePoint trackingEndTime, WindStore windStore,
long timeoutForReceivingRaceDefinitionInMilliseconds, boolean simulateWithStartTimeNow, RaceLogStore raceLogStore) long timeoutForReceivingRaceDefinitionInMilliseconds, boolean simulateWithStartTimeNow)
throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception; throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception;
/** /**
@@ -290,8 +287,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* to add the races to. Otherwise, a default regatta as described above will be created and used. * to add the races to. Otherwise, a default regatta as described above will be created and used.
*/ */
RacesHandle addSwissTimingRace(RegattaIdentifier regattaToAddTo, String raceID, String hostname, int port, RacesHandle addSwissTimingRace(RegattaIdentifier regattaToAddTo, String raceID, String hostname, int port,
boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds, boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds) throws InterruptedException, UnknownHostException,
RaceLogStore raceLogStore) throws InterruptedException, UnknownHostException,
IOException, ParseException, Exception; IOException, ParseException, Exception;
SwissTimingFactory getSwissTimingFactory(); SwissTimingFactory getSwissTimingFactory();
@@ -369,13 +365,11 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* @param windStore * @param windStore
* must not be <code>null</code>, but can, e.g., be an {@link EmptyWindStore} * must not be <code>null</code>, but can, e.g., be an {@link EmptyWindStore}
*/ */
RacesHandle addRace(RegattaIdentifier regattaToAddTo, RaceTrackingConnectivityParameters params, WindStore windStore, long timeoutInMilliseconds, RacesHandle addRace(RegattaIdentifier regattaToAddTo, RaceTrackingConnectivityParameters params, WindStore windStore, long timeoutInMilliseconds)
RaceLogStore raceLogStore)
throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception; throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception;
TrackedRace createTrackedRace(RegattaAndRaceIdentifier raceIdentifier, WindStore windStore, TrackedRace createTrackedRace(RegattaAndRaceIdentifier raceIdentifier, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed);
RaceLogStore raceLogStore);
Regatta getOrCreateRegatta(String regattaName, String boatClassName, Serializable id); Regatta getOrCreateRegatta(String regattaName, String boatClassName, Serializable id);
@@ -72,7 +72,6 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.Race;
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector; import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage; import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
@@ -600,13 +599,12 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
} }
@Override @Override
public Regatta addRegatta(URL jsonURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds, public Regatta addRegatta(URL jsonURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds) throws Exception {
RaceLogStore raceLogStore) throws Exception {
JSONService jsonService = getTracTracDomainFactory().parseJSONURL(jsonURL); JSONService jsonService = getTracTracDomainFactory().parseJSONURL(jsonURL);
Regatta regatta = null; Regatta regatta = null;
for (RaceRecord rr : jsonService.getRaceRecords()) { for (RaceRecord rr : jsonService.getRaceRecords()) {
URL paramURL = rr.getParamURL(); URL paramURL = rr.getParamURL();
regatta = addTracTracRace(paramURL, liveURI, storedURI, windStore, timeoutInMilliseconds, raceLogStore).getRegatta(); regatta = addTracTracRace(paramURL, liveURI, storedURI, windStore, timeoutInMilliseconds).getRegatta();
} }
return regatta; return regatta;
} }
@@ -661,23 +659,21 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@Override @Override
public RacesHandle addSwissTimingRace(RegattaIdentifier regattaToAddTo, String raceID, String hostname, public RacesHandle addSwissTimingRace(RegattaIdentifier regattaToAddTo, String raceID, String hostname,
int port, boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds, int port, boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds) throws Exception {
RaceLogStore raceLogStore) throws Exception {
return addRace( return addRace(
regattaToAddTo, regattaToAddTo,
swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, delayToLiveInMillis, swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, delayToLiveInMillis,
swissTimingFactory, swissTimingDomainFactory, windStore, raceLogStore, swissTimingAdapterPersistence), windStore, timeoutInMilliseconds, swissTimingFactory, swissTimingDomainFactory, windStore, swissTimingAdapterPersistence), windStore, timeoutInMilliseconds);
raceLogStore);
} }
@Override @Override
public RacesHandle addTracTracRace(URL paramURL, URI liveURI, URI storedURI, WindStore windStore, public RacesHandle addTracTracRace(URL paramURL, URI liveURI, URI storedURI, WindStore windStore,
long timeoutInMilliseconds, RaceLogStore raceLogStore) throws Exception { long timeoutInMilliseconds) throws Exception {
return addRace( return addRace(
/* regattaToAddTo */null, getTracTracDomainFactory().createTrackingConnectivityParameters(paramURL, liveURI, storedURI, /* regattaToAddTo */null, getTracTracDomainFactory().createTrackingConnectivityParameters(paramURL, liveURI, storedURI,
/* startOfTracking */null, /* startOfTracking */null,
/* endOfTracking */null, delayToLiveInMillis, /* simulateWithStartTimeNow */false, windStore, raceLogStore), windStore, /* endOfTracking */null, delayToLiveInMillis, /* simulateWithStartTimeNow */false, windStore), windStore,
timeoutInMilliseconds, raceLogStore); timeoutInMilliseconds);
} }
@Override @Override
@@ -708,7 +704,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@Override @Override
public RacesHandle addRace(RegattaIdentifier regattaToAddTo, RaceTrackingConnectivityParameters params, public RacesHandle addRace(RegattaIdentifier regattaToAddTo, RaceTrackingConnectivityParameters params,
WindStore windStore, long timeoutInMilliseconds, RaceLogStore raceLogStore) throws Exception { WindStore windStore, long timeoutInMilliseconds) throws Exception {
RaceTracker tracker = raceTrackersByID.get(params.getTrackerID()); RaceTracker tracker = raceTrackersByID.get(params.getTrackerID());
if (tracker == null) { if (tracker == null) {
Regatta regatta = regattaToAddTo == null ? null : getRegatta(regattaToAddTo); Regatta regatta = regattaToAddTo == null ? null : getRegatta(regattaToAddTo);
@@ -816,23 +812,20 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@Override @Override
public TrackedRace createTrackedRace(RegattaAndRaceIdentifier raceIdentifier, WindStore windStore, public TrackedRace createTrackedRace(RegattaAndRaceIdentifier raceIdentifier, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed) {
RaceLogStore raceLogStore) {
DynamicTrackedRegatta trackedRegatta = getOrCreateTrackedRegatta(getRegatta(raceIdentifier)); DynamicTrackedRegatta trackedRegatta = getOrCreateTrackedRegatta(getRegatta(raceIdentifier));
RaceDefinition race = getRace(raceIdentifier); RaceDefinition race = getRace(raceIdentifier);
return trackedRegatta.createTrackedRace(race, windStore, delayToLiveInMillis, return trackedRegatta.createTrackedRace(race, windStore, delayToLiveInMillis,
millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed,
/* raceDefinitionSetToUpdate */null, raceLogStore); /* raceDefinitionSetToUpdate */null);
} }
@Override @Override
public RacesHandle addTracTracRace(RegattaIdentifier regattaToAddTo, URL paramURL, URI liveURI, public RacesHandle addTracTracRace(RegattaIdentifier regattaToAddTo, URL paramURL, URI liveURI,
URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking, URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking,
WindStore windStore, long timeoutInMilliseconds, boolean simulateWithStartTimeNow, WindStore windStore, long timeoutInMilliseconds, boolean simulateWithStartTimeNow) throws Exception {
RaceLogStore raceLogStore) throws Exception {
return addRace(regattaToAddTo, getTracTracDomainFactory().createTrackingConnectivityParameters(paramURL, liveURI, storedURI, startOfTracking, return addRace(regattaToAddTo, getTracTracDomainFactory().createTrackingConnectivityParameters(paramURL, liveURI, storedURI, startOfTracking,
endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, raceLogStore), windStore, timeoutInMilliseconds, endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore), windStore, timeoutInMilliseconds);
raceLogStore);
} }
private void ensureRegattaIsObservedForDefaultLeaderboardAndAutoLeaderboardLinking(DynamicTrackedRegatta trackedRegatta) { private void ensureRegattaIsObservedForDefaultLeaderboardAndAutoLeaderboardLinking(DynamicTrackedRegatta trackedRegatta) {
@@ -882,8 +875,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
// replicate the addition of the tracked race: // replicate the addition of the tracked race:
CreateTrackedRace op = new CreateTrackedRace(trackedRace.getRaceIdentifier(), trackedRace.getWindStore(), CreateTrackedRace op = new CreateTrackedRace(trackedRace.getRaceIdentifier(), trackedRace.getWindStore(),
trackedRace.getDelayToLiveInMillis(), trackedRace.getDelayToLiveInMillis(),
trackedRace.getMillisecondsOverWhichToAverageWind(), trackedRace.getMillisecondsOverWhichToAverageSpeed(), trackedRace.getMillisecondsOverWhichToAverageWind(), trackedRace.getMillisecondsOverWhichToAverageSpeed());
trackedRace.getRaceLogStore());
replicate(op); replicate(op);
linkRaceToConfiguredLeaderboardColumns(trackedRace); linkRaceToConfiguredLeaderboardColumns(trackedRace);
final FlexibleLeaderboard defaultLeaderboard = (FlexibleLeaderboard) leaderboardsByName.get(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME); final FlexibleLeaderboard defaultLeaderboard = (FlexibleLeaderboard) leaderboardsByName.get(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME);
@@ -4,8 +4,6 @@ import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindStore;
@@ -34,28 +32,16 @@ public class CreateTrackedRace extends AbstractRaceOperation<TrackedRace> {
* {@link EmptyWindStore}. * {@link EmptyWindStore}.
*/ */
private transient final WindStore windStore; private transient final WindStore windStore;
/**
* If a {@link RaceLogStore} is provided to this command, it will be used for the construction of the tracked race.
* However, after de-serialization, the race log store will always be <code>null</code>, causing the use of an
* {@link EmptyRaceLogStore}.
*/
private transient final RaceLogStore raceLogStore;
/** /**
* @param windStore * @param windStore
* if <code>null</code>, an {@link EmptyWindStore} will be used. Note that the {@link #windStore} field * if <code>null</code>, an {@link EmptyWindStore} will be used. Note that the {@link #windStore} field
* won't be serialized. A receiver of this operation will therefore always use an {@link EmptyWindStore}. * won't be serialized. A receiver of this operation will therefore always use an {@link EmptyWindStore}.
* @param raceLogStore
* if <code>null</code>, an {@link EmptyRaceLogStore} will be used. Note that the {@link #raceLogStore} field
* won't be serialized. A receiver of this operation will therefore always use an {@link EmptyRaceLogStore}.
*/ */
public CreateTrackedRace(RegattaAndRaceIdentifier raceIdentifier, WindStore windStore, public CreateTrackedRace(RegattaAndRaceIdentifier raceIdentifier, WindStore windStore,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed) {
RaceLogStore raceLogStore) {
super(raceIdentifier); super(raceIdentifier);
this.windStore = windStore; this.windStore = windStore;
this.raceLogStore = raceLogStore;
this.delayToLiveInMillis = delayToLiveInMillis; this.delayToLiveInMillis = delayToLiveInMillis;
this.millisecondsOverWhichToAverageWind = millisecondsOverWhichToAverageWind; this.millisecondsOverWhichToAverageWind = millisecondsOverWhichToAverageWind;
this.millisecondsOverWhichToAverageSpeed = millisecondsOverWhichToAverageSpeed; this.millisecondsOverWhichToAverageSpeed = millisecondsOverWhichToAverageSpeed;
@@ -76,8 +62,7 @@ public class CreateTrackedRace extends AbstractRaceOperation<TrackedRace> {
@Override @Override
public TrackedRace internalApplyTo(RacingEventService toState) { public TrackedRace internalApplyTo(RacingEventService toState) {
return toState.createTrackedRace(getRaceIdentifier(), windStore == null ? EmptyWindStore.INSTANCE : windStore, return toState.createTrackedRace(getRaceIdentifier(), windStore == null ? EmptyWindStore.INSTANCE : windStore,
delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed);
raceLogStore == null ? EmptyRaceLogStore.INSTANCE : raceLogStore);
} }
} }
@@ -2,7 +2,6 @@ package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation; import com.sap.sailing.server.RacingEventServiceOperation;
@@ -18,8 +17,8 @@ public class RecordRaceLogEvent extends AbstractRaceOperation<Void> {
@Override @Override
public Void internalApplyTo(RacingEventService toState) throws Exception { public Void internalApplyTo(RacingEventService toState) throws Exception {
DynamicTrackedRace trackedRace = (DynamicTrackedRace) toState.getTrackedRace(getRaceIdentifier()); // DynamicTrackedRace trackedRace = (DynamicTrackedRace) toState.getTrackedRace(getRaceIdentifier());
trackedRace.recordRaceLogEvent(event); // trackedRace.recordRaceLogEvent(event);
return null; return null;
} }