Removed RaceLogStore from RaceColumn implementations and all subsequent

classes
This commit is contained in:
Armin Zamani committed 2013-02-18 01:34:14 +01:00
1 parent e03d4cfe0c
commit ddea60f570
68 files changed
+331 -594

No files matched your search

@@ -4,7 +4,6 @@ import java.util.Map;
import com.mongodb.DBObject; import com.mongodb.DBObject;
import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
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.RegattaRegistry; import com.sap.sailing.domain.base.RegattaRegistry;
@@ -13,8 +12,8 @@ import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup; 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.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindTrack;
@@ -86,5 +85,5 @@ public interface DomainObjectFactory {
Map<String, Regatta> loadRaceIDToRegattaAssociations(RegattaRegistry regattaRegistry); Map<String, Regatta> loadRaceIDToRegattaAssociations(RegattaRegistry regattaRegistry);
RaceLog loadRaceLog(RaceColumnIdentifier identifier, Fleet fleet); RaceLog loadRaceLog(RaceLogIdentifier identifier);
} }
@@ -1,7 +1,6 @@
package com.sap.sailing.domain.persistence; package com.sap.sailing.domain.persistence;
import com.sap.sailing.domain.persistence.impl.MongoRaceLogStoreFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoRaceLogStoreFactoryImpl;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.mongodb.MongoDBService; import com.sap.sailing.mongodb.MongoDBService;
public interface MongoRaceLogStoreFactory { public interface MongoRaceLogStoreFactory {
@@ -11,8 +10,5 @@ public interface MongoRaceLogStoreFactory {
* Gets the default Mongo store based on the properties mongo.hostname[=localhost], mongo.port[=27017] * Gets the default Mongo store based on the properties mongo.hostname[=localhost], mongo.port[=27017]
* and mongo.dbName[=&lt;contents of constant {@link #DEFAULT_DB_NAME}&gt;] specified in the bundle context * and mongo.dbName[=&lt;contents of constant {@link #DEFAULT_DB_NAME}&gt;] specified in the bundle context
*/ */
MongoRaceLogStore getMongoRaceLogStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory,
RaceColumnIdentifier raceColumnIdentifier);
MongoRaceLogStore getMongoRaceLogStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory); MongoRaceLogStore getMongoRaceLogStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory);
} }
@@ -73,18 +73,15 @@ import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
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.MongoRaceLogStoreFactory;
import com.sap.sailing.domain.racelog.Flags; import com.sap.sailing.domain.racelog.Flags;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLog; 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.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.racelog.impl.RaceColumnIdentifierImpl;
import com.sap.sailing.domain.racelog.impl.RaceLogImpl; import com.sap.sailing.domain.racelog.impl.RaceLogImpl;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.Wind;
@@ -364,12 +361,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
fleets.add(result.getFleet(null)); fleets.add(result.getFleet(null));
} }
String columnName = (String) dbRaceColumn.get(FieldNames.LEADERBOARD_COLUMN_NAME.name()); String columnName = (String) dbRaceColumn.get(FieldNames.LEADERBOARD_COLUMN_NAME.name());
RaceColumnIdentifier columnIdentifier = new RaceColumnIdentifierImpl(result.getName(), columnName);
RaceColumn raceColumn = result.addRaceColumn(columnName, RaceColumn raceColumn = result.addRaceColumn(columnName,
(Boolean) dbRaceColumn.get(FieldNames.LEADERBOARD_IS_MEDAL_RACE_COLUMN.name()), (Boolean) dbRaceColumn.get(FieldNames.LEADERBOARD_IS_MEDAL_RACE_COLUMN.name()),
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(MongoFactory.INSTANCE.getDefaultMongoObjectFactory(),
MongoFactory.INSTANCE.getDefaultDomainObjectFactory(), columnIdentifier),
fleets.toArray(new Fleet[0])); fleets.toArray(new Fleet[0]));
for (Map.Entry<String, RaceIdentifier> e : raceIdentifiers.entrySet()) { for (Map.Entry<String, RaceIdentifier> e : raceIdentifiers.entrySet()) {
raceColumn.setRaceIdentifier(fleetsByName.get(e.getKey()), e.getValue()); raceColumn.setRaceIdentifier(fleetsByName.get(e.getKey()), e.getValue());
@@ -828,9 +822,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
Map<String, Fleet> fleetsByName = loadFleets(dbFleets); Map<String, Fleet> fleetsByName = loadFleets(dbFleets);
BasicDBList dbRaceColumns = (BasicDBList) dbSeries.get(FieldNames.SERIES_RACE_COLUMNS.name()); BasicDBList dbRaceColumns = (BasicDBList) dbSeries.get(FieldNames.SERIES_RACE_COLUMNS.name());
Iterable<String> raceColumnNames = loadRaceColumnNames(dbRaceColumns, fleetsByName); Iterable<String> raceColumnNames = loadRaceColumnNames(dbRaceColumns, fleetsByName);
Series series = new SeriesImpl(name, isMedal, fleetsByName.values(), raceColumnNames, trackedRegattaRegistry, Series series = new SeriesImpl(name, isMedal, fleetsByName.values(), raceColumnNames, trackedRegattaRegistry);
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(
MongoFactory.INSTANCE.getDefaultMongoObjectFactory(), this));
loadRaceColumnRaceLinks(dbRaceColumns, series); loadRaceColumnRaceLinks(dbRaceColumns, series);
return series; return series;
} }
@@ -910,12 +902,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
} }
@Override @Override
public RaceLog loadRaceLog(RaceColumnIdentifier identifier, Fleet fleet) { public RaceLog loadRaceLog(RaceLogIdentifier identifier) {
RaceLog result = new RaceLogImpl(RaceLogImpl.class.getSimpleName()); RaceLog result = new RaceLogImpl(RaceLogImpl.class.getSimpleName());
try { try {
BasicDBObject query = new BasicDBObject(); BasicDBObject query = new BasicDBObject();
query.put(FieldNames.RACE_COLUMN_IDENTIFIER.name(), identifier.getIdentifier()); query.put(FieldNames.RACE_LOG_IDENTIFIER.name(), identifier.getIdentifier());
query.put(FieldNames.FLEET_NAME.name(), fleet.getName());
DBCollection raceLog = database.getCollection(CollectionNames.RACE_LOGS.name()); DBCollection raceLog = database.getCollection(CollectionNames.RACE_LOGS.name());
for (DBObject o : raceLog.find(query)) { for (DBObject o : raceLog.find(query)) {
RaceLogEvent raceLogEvent = loadRaceLogEvent((DBObject) o.get(FieldNames.RACE_LOG_EVENT.name())); RaceLogEvent raceLogEvent = loadRaceLogEvent((DBObject) o.get(FieldNames.RACE_LOG_EVENT.name()));
@@ -65,7 +65,7 @@ public enum FieldNames {
RACE_ID_AS_STRING, RACE_ID_AS_STRING,
// race log // race log
RACE_COLUMN_IDENTIFIER, RACE_LOG_IDENTIFIER,
RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_INVOLVED_BOATS, RACE_LOG_EVENT_FLAG_UPPER, RACE_LOG_EVENT_FLAG_LOWER, RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_INVOLVED_BOATS, RACE_LOG_EVENT_FLAG_UPPER, RACE_LOG_EVENT_FLAG_LOWER,
RACE_LOG_EVENT_FLAG_DISPLAYED, RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS; RACE_LOG_EVENT_FLAG_DISPLAYED, RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS;
} }
@@ -37,9 +37,9 @@ import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
import com.sap.sailing.domain.tracking.Positioned; import com.sap.sailing.domain.tracking.Positioned;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -478,31 +478,26 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
public DBCollection getRaceLogCollection() { public DBCollection getRaceLogCollection() {
DBCollection result = database.getCollection(CollectionNames.RACE_LOGS.name()); DBCollection result = database.getCollection(CollectionNames.RACE_LOGS.name());
result.ensureIndex(new BasicDBObject(FieldNames.RACE_COLUMN_IDENTIFIER.name(), null)); result.ensureIndex(new BasicDBObject(FieldNames.RACE_LOG_IDENTIFIER.name(), null));
return result; return result;
} }
public DBObject storeRaceLogEntry(RaceColumnIdentifier raceColumnIdentifier, Fleet fleet, RaceLogFlagEvent flagEvent) { public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogFlagEvent flagEvent) {
BasicDBObject result = new BasicDBObject(); BasicDBObject result = new BasicDBObject();
storeRaceColumnIdentifierAndFleetName(raceColumnIdentifier, fleet, result); result.put(FieldNames.RACE_LOG_IDENTIFIER.name(), raceLogIdentifier.getIdentifier());
result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogFlagEvent(flagEvent)); result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogFlagEvent(flagEvent));
return result; return result;
} }
public DBObject storeRaceLogEntry(RaceColumnIdentifier raceColumnIdentifier, Fleet fleet, RaceLogStartTimeEvent startTimeEvent) { public DBObject storeRaceLogEntry(RaceLogIdentifier raceLogIdentifier, RaceLogStartTimeEvent startTimeEvent) {
BasicDBObject result = new BasicDBObject(); BasicDBObject result = new BasicDBObject();
storeRaceColumnIdentifierAndFleetName(raceColumnIdentifier, fleet, result); result.put(FieldNames.RACE_LOG_IDENTIFIER.name(), raceLogIdentifier.getIdentifier());
result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogStartTimeEvent(startTimeEvent)); result.put(FieldNames.RACE_LOG_EVENT.name(), storeRaceLogStartTimeEvent(startTimeEvent));
return result; return result;
} }
private void storeRaceColumnIdentifierAndFleetName(RaceColumnIdentifier raceColumnIdentifier, Fleet fleet, BasicDBObject result) {
result.put(FieldNames.RACE_COLUMN_IDENTIFIER.name(), raceColumnIdentifier.getIdentifier());
result.put(FieldNames.FLEET_NAME.name(), fleet.getName());
}
private Object storeRaceLogStartTimeEvent(RaceLogStartTimeEvent startTimeEvent) { private Object storeRaceLogStartTimeEvent(RaceLogStartTimeEvent startTimeEvent) {
DBObject result = new BasicDBObject(); DBObject result = new BasicDBObject();
storeTimed(startTimeEvent, result); storeTimed(startTimeEvent, result);
@@ -3,35 +3,31 @@ package com.sap.sailing.domain.persistence.impl;
import com.mongodb.DB; import com.mongodb.DB;
import com.mongodb.DBCollection; import com.mongodb.DBCollection;
import com.mongodb.DBObject; import com.mongodb.DBObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent; import com.sap.sailing.domain.racelog.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogEventVisitor; import com.sap.sailing.domain.racelog.RaceLogEventVisitor;
import com.sap.sailing.domain.racelog.RaceLogFlagEvent; import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent; import com.sap.sailing.domain.racelog.RaceLogPassChangeEvent;
import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent; import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent;
public class MongoRaceLogListener implements RaceLogEventVisitor { public class MongoRaceLogListener implements RaceLogEventVisitor {
private final RaceColumnIdentifier raceColumnIdentifier; private final RaceLogIdentifier raceLogIdentifier;
private final Fleet fleet;
private final MongoObjectFactoryImpl mongoObjectFactory; private final MongoObjectFactoryImpl mongoObjectFactory;
private final DBCollection raceLogsCollection; private final DBCollection raceLogsCollection;
public MongoRaceLogListener(RaceColumnIdentifier identifier, Fleet fleet, public MongoRaceLogListener(RaceLogIdentifier identifier, MongoObjectFactory mongoObjectFactory, DB database) {
MongoObjectFactory mongoObjectFactory, DB database) {
super(); super();
this.raceColumnIdentifier = identifier; this.raceLogIdentifier = identifier;
this.mongoObjectFactory = (MongoObjectFactoryImpl) mongoObjectFactory; this.mongoObjectFactory = (MongoObjectFactoryImpl) mongoObjectFactory;
this.raceLogsCollection = this.mongoObjectFactory.getRaceLogCollection(); this.raceLogsCollection = this.mongoObjectFactory.getRaceLogCollection();
this.fleet = fleet;
} }
@Override @Override
public void visit(RaceLogFlagEvent event) { public void visit(RaceLogFlagEvent event) {
DBObject flagEventTrackEntry = mongoObjectFactory.storeRaceLogEntry(raceColumnIdentifier, fleet, event); DBObject flagEventTrackEntry = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event);
raceLogsCollection.insert(flagEventTrackEntry); raceLogsCollection.insert(flagEventTrackEntry);
} }
@@ -47,7 +43,7 @@ public class MongoRaceLogListener implements RaceLogEventVisitor {
@Override @Override
public void visit(RaceLogStartTimeEvent event) { public void visit(RaceLogStartTimeEvent event) {
DBObject startTimeEventTrackEntry = mongoObjectFactory.storeRaceLogEntry(raceColumnIdentifier, fleet, event); DBObject startTimeEventTrackEntry = mongoObjectFactory.storeRaceLogEntry(raceLogIdentifier, event);
raceLogsCollection.insert(startTimeEventTrackEntry); raceLogsCollection.insert(startTimeEventTrackEntry);
} }
@@ -5,7 +5,6 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.MongoRaceLogStore; import com.sap.sailing.domain.persistence.MongoRaceLogStore;
import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory; import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
public class MongoRaceLogStoreFactoryImpl implements MongoRaceLogStoreFactory { public class MongoRaceLogStoreFactoryImpl implements MongoRaceLogStoreFactory {
private final DB db; private final DB db;
@@ -14,15 +13,9 @@ public class MongoRaceLogStoreFactoryImpl implements MongoRaceLogStoreFactory {
this.db = db; this.db = db;
} }
@Override
public MongoRaceLogStore getMongoRaceLogStore(MongoObjectFactory mongoObjectFactory,DomainObjectFactory domainObjectFactory,
RaceColumnIdentifier raceColumnIdentifier) {
return new MongoRaceLogStoreImpl(db, mongoObjectFactory, domainObjectFactory, raceColumnIdentifier);
}
@Override @Override
public MongoRaceLogStore getMongoRaceLogStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory) { public MongoRaceLogStore getMongoRaceLogStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory) {
return new MongoRaceLogStoreImpl(db, mongoObjectFactory, domainObjectFactory, null); return new MongoRaceLogStoreImpl(db, mongoObjectFactory, domainObjectFactory);
} }
} }
@@ -4,47 +4,31 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.mongodb.DB; import com.mongodb.DB;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.MongoRaceLogStore; import com.sap.sailing.domain.persistence.MongoRaceLogStore;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
public class MongoRaceLogStoreImpl extends EmptyRaceLogStore implements MongoRaceLogStore { public class MongoRaceLogStoreImpl extends EmptyRaceLogStore implements MongoRaceLogStore {
private transient final DB db; private transient final DB db;
private final MongoObjectFactory mongoObjectFactory; private final MongoObjectFactory mongoObjectFactory;
private final DomainObjectFactory domainObjectFactory; private final DomainObjectFactory domainObjectFactory;
private final RaceColumnIdentifier identifier; private final Map<RaceLogIdentifier, RaceLog> raceLogCache;
private final Map<Fleet, RaceLog> raceLogCache;
public MongoRaceLogStoreImpl(DB db, MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory, public MongoRaceLogStoreImpl(DB db, MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory) {
RaceColumnIdentifier identifier) {
this.db = db; this.db = db;
this.mongoObjectFactory = mongoObjectFactory; this.mongoObjectFactory = mongoObjectFactory;
this.domainObjectFactory = domainObjectFactory; this.domainObjectFactory = domainObjectFactory;
this.identifier = identifier; this.raceLogCache = new HashMap<RaceLogIdentifier, RaceLog>();
this.raceLogCache = new HashMap<Fleet, RaceLog>();
}
@Override
public RaceLog getRaceLog(Fleet fleet) {
return getRaceLog(identifier, fleet);
} }
@Override @Override
public RaceLog getRaceLog(RaceColumnIdentifier identifier, Fleet fleet) { public RaceLog getRaceLog(RaceLogIdentifier identifier) {
if (identifier == null)
return null;
RaceLog log; RaceLog log;
if (!raceLogCache.containsKey(fleet)) { log = domainObjectFactory.loadRaceLog(identifier);
log = domainObjectFactory.loadRaceLog(identifier, fleet); log.addListener(new MongoRaceLogListener(identifier, mongoObjectFactory, db));
log.addListener(new MongoRaceLogListener(identifier, fleet, mongoObjectFactory, db));
raceLogCache.put(fleet, log);
} else {
log = raceLogCache.get(fleet);
}
return log; return log;
} }
@@ -28,7 +28,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.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;
@@ -337,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.INSTANCE); 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",
@@ -17,7 +17,6 @@ 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.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.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.Competitor; import com.sap.sailing.domain.swisstimingadapter.Competitor;
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;
@@ -42,7 +41,7 @@ public class SimpleDomainFactoryTest {
DomainFactory domainFactory = DomainFactory.INSTANCE; DomainFactory domainFactory = DomainFactory.INSTANCE;
final String raceID = "SAX920103"; final String raceID = "SAX920103";
RaceDefinition raceDefinition = domainFactory.createRaceDefinition(domainFactory.getOrCreateDefaultRegatta(raceID, RaceDefinition raceDefinition = domainFactory.createRaceDefinition(domainFactory.getOrCreateDefaultRegatta(raceID,
new RacingEventServiceImpl(), EmptyRaceLogStore.INSTANCE), new RacingEventServiceImpl()),
new Race() { new Race() {
@Override @Override
public String getDescription() { public String getDescription() {
@@ -93,8 +92,7 @@ public class SimpleDomainFactoryTest {
public void testCourseConfigForMark() throws PatchFailedException { public void testCourseConfigForMark() throws PatchFailedException {
DomainFactory domainFactory = DomainFactory.INSTANCE; DomainFactory domainFactory = DomainFactory.INSTANCE;
Regatta regatta = new RegattaImpl("TestEvent", /* boatClass */ null, new RacingEventServiceImpl(), Regatta regatta = new RegattaImpl("TestEvent", /* boatClass */ null, new RacingEventServiceImpl(),
com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123");
EmptyRaceLogStore.INSTANCE);
Race race = new RaceImpl("1234", "Race 1234"); Race race = new RaceImpl("1234", "Race 1234");
Iterable<Competitor> competitors = Collections.emptyList(); Iterable<Competitor> competitors = Collections.emptyList();
StartList startList = new StartListImpl("1234", competitors); StartList startList = new StartListImpl("1234", competitors);
@@ -119,8 +117,7 @@ public class SimpleDomainFactoryTest {
public void testCourseConfigForGate() throws PatchFailedException { public void testCourseConfigForGate() throws PatchFailedException {
DomainFactory domainFactory = DomainFactory.INSTANCE; DomainFactory domainFactory = DomainFactory.INSTANCE;
Regatta regatta = new RegattaImpl("TestEvent", /* boatClass */ null, new RacingEventServiceImpl(), Regatta regatta = new RegattaImpl("TestEvent", /* boatClass */ null, new RacingEventServiceImpl(),
com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123");
EmptyRaceLogStore.INSTANCE);
Race race = new RaceImpl("1234", "Race 1234"); Race race = new RaceImpl("1234", "Race 1234");
Iterable<Competitor> competitors = Collections.emptyList(); Iterable<Competitor> competitors = Collections.emptyList();
StartList startList = new StartListImpl("1234", competitors); StartList startList = new StartListImpl("1234", competitors);
@@ -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;
@@ -26,7 +25,7 @@ public interface DomainFactory {
com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory(); com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory();
Regatta getOrCreateDefaultRegatta(String raceID, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore); Regatta getOrCreateDefaultRegatta(String raceID, TrackedRegattaRegistry trackedRegattaRegistry);
Nationality getOrCreateNationality(String threeLetterIOCCode); Nationality getOrCreateNationality(String threeLetterIOCCode);
@@ -51,7 +50,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, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader, RaceLogStore raceLogStore); 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,8 +51,7 @@ 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, 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;
RaceLogStore raceLogStore) 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,
@@ -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;
@@ -99,14 +98,14 @@ public class DomainFactoryImpl implements DomainFactory {
} }
@Override @Override
public Regatta getOrCreateDefaultRegatta(String raceID, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) { public Regatta getOrCreateDefaultRegatta(String raceID, TrackedRegattaRegistry trackedRegattaRegistry) {
Regatta result = trackedRegattaRegistry.getRememberedRegattaForRace(raceID); Regatta result = trackedRegattaRegistry.getRememberedRegattaForRace(raceID);
if (result == null) { if (result == null) {
result = raceIDToRegattaCache.get(raceID); result = raceIDToRegattaCache.get(raceID);
} }
if (result == null) { if (result == null) {
result = new RegattaImpl(raceID, getOrCreateBoatClassFromRaceID(raceID), trackedRegattaRegistry, result = new RegattaImpl(raceID, getOrCreateBoatClassFromRaceID(raceID), trackedRegattaRegistry,
getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), raceID, raceLogStore); getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), raceID);
logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")"); logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")");
raceIDToRegattaCache.put(raceID, result); raceIDToRegattaCache.put(raceID, result);
} }
@@ -309,9 +308,9 @@ public class DomainFactoryImpl implements DomainFactory {
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, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader, RaceLogStore raceLogStore) { RaceSpecificMessageLoader messageLoader) {
return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, delayToLiveInMillis, return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, delayToLiveInMillis,
swissTimingFactory, domainFactory, windStore, messageLoader, raceLogStore); 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,10 +80,10 @@ 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
@@ -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;
@@ -75,9 +74,9 @@ 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, RaceLogStore raceLogStore) throws InterruptedException, TrackedRegattaRegistry trackedRegattaRegistry, boolean canSendRequests, long delayToLiveInMillis) throws InterruptedException,
UnknownHostException, IOException, ParseException { UnknownHostException, IOException, ParseException {
this(domainFactory.getOrCreateDefaultRegatta(raceID, trackedRegattaRegistry, raceLogStore), raceID, hostname, port, windStore, domainFactory, factory, this(domainFactory.getOrCreateDefaultRegatta(raceID, trackedRegattaRegistry), raceID, hostname, port, windStore, domainFactory, factory,
messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis); messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis);
} }
@@ -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,13 +17,12 @@ 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, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader, RaceLogStore raceLogStore) { RaceSpecificMessageLoader messageLoader) {
super(); super();
this.hostname = hostname; this.hostname = hostname;
this.port = port; this.port = port;
@@ -34,14 +32,13 @@ 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
@@ -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;
@@ -301,7 +300,7 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter {
} }
private void createRace() { private void createRace() {
final Regatta myRegatta = regatta != null ? regatta : domainFactory.getOrCreateDefaultRegatta(currentRaceID, trackedRegattaRegistry, EmptyRaceLogStore.INSTANCE); final Regatta myRegatta = regatta != null ? regatta : domainFactory.getOrCreateDefaultRegatta(currentRaceID, trackedRegattaRegistry);
RaceDefinition race = domainFactory.createRaceDefinition(myRegatta, RaceDefinition race = domainFactory.createRaceDefinition(myRegatta,
currentRaceID, competitorsPerRaceID.get(currentRaceID), currentCourseDefinition); currentRaceID, competitorsPerRaceID.get(currentRaceID), currentCourseDefinition);
racePerRaceID.put(currentRaceID, race); racePerRaceID.put(currentRaceID, race);
@@ -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;
@@ -70,7 +69,7 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
public void setUp() throws MalformedURLException, IOException, InterruptedException, URISyntaxException { public void setUp() throws MalformedURLException, IOException, InterruptedException, URISyntaxException {
super.setUp(); super.setUp();
domainFactory = new DomainFactoryImpl(new com.sap.sailing.domain.base.impl.DomainFactoryImpl()); domainFactory = new DomainFactoryImpl(new com.sap.sailing.domain.base.impl.DomainFactoryImpl());
domainRegatta = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null, EmptyRaceLogStore.INSTANCE); domainRegatta = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
trackedRegatta = new DynamicTrackedRegattaImpl(domainRegatta); trackedRegatta = new DynamicTrackedRegattaImpl(domainRegatta);
ArrayList<Receiver> receivers = new ArrayList<Receiver>(); ArrayList<Receiver> receivers = new ArrayList<Receiver>();
receivers.add(new RaceCourseReceiver(domainFactory, trackedRegatta, getTracTracEvent(), receivers.add(new RaceCourseReceiver(domainFactory, trackedRegatta, getTracTracEvent(),
@@ -23,7 +23,6 @@ import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl;
import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.domain.tractracadapter.ReceiverType; import com.sap.sailing.domain.tractracadapter.ReceiverType;
@@ -43,20 +42,20 @@ public class LeaderboardForKielWeekTest extends OnlineTracTracBasedTest {
MillisecondsTimePoint now = MillisecondsTimePoint.now(); MillisecondsTimePoint now = MillisecondsTimePoint.now();
loadRace("357c700a-9d9a-11e0-85be-406186cbf87c"); // 505 Race 2 loadRace("357c700a-9d9a-11e0-85be-406186cbf87c"); // 505 Race 2
Competitor hasso = getCompetitorByName("Dr.Plattner"); Competitor hasso = getCompetitorByName("Dr.Plattner");
RaceColumn column = leaderboard.addRace(getTrackedRace(), "Test Race 1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); RaceColumn column = leaderboard.addRace(getTrackedRace(), "Test Race 1", /* medalRace */ false, defaultFleet);
assertEquals(21, leaderboard.getTotalPoints(hasso, now), 0.000000001); assertEquals(21, leaderboard.getTotalPoints(hasso, now), 0.000000001);
Pair<Competitor, RaceColumn> key = new Pair<Competitor, RaceColumn>(hasso, column); Pair<Competitor, RaceColumn> key = new Pair<Competitor, RaceColumn>(hasso, column);
assertEquals(21, leaderboard.getContent(now).get(key).getTotalPoints(), 0.000000001); assertEquals(21, leaderboard.getContent(now).get(key).getTotalPoints(), 0.000000001);
assertEquals(21, leaderboard.getEntry(hasso, column, now).getTotalPoints(), 0.000000001); assertEquals(21, leaderboard.getEntry(hasso, column, now).getTotalPoints(), 0.000000001);
loadRace("e876c3a0-9da8-11e0-85be-406186cbf87c"); // 505 Race 3 loadRace("e876c3a0-9da8-11e0-85be-406186cbf87c"); // 505 Race 3
column = leaderboard.addRace(getTrackedRace(), "Test Race 2", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); column = leaderboard.addRace(getTrackedRace(), "Test Race 2", /* medalRace */ false, defaultFleet);
key = new Pair<Competitor, RaceColumn>(hasso, column); key = new Pair<Competitor, RaceColumn>(hasso, column);
// In Race 3, Hasso ranked 31st // In Race 3, Hasso ranked 31st
assertEquals(52, leaderboard.getTotalPoints(hasso, now), 0.000000001); assertEquals(52, leaderboard.getTotalPoints(hasso, now), 0.000000001);
assertEquals(31, leaderboard.getContent(now).get(key).getTotalPoints(), 0.000000001); assertEquals(31, leaderboard.getContent(now).get(key).getTotalPoints(), 0.000000001);
assertEquals(31, leaderboard.getEntry(hasso, column, now).getTotalPoints(), 0.000000001); assertEquals(31, leaderboard.getEntry(hasso, column, now).getTotalPoints(), 0.000000001);
loadRace("7c666e50-9dde-11e0-85be-406186cbf87c"); // 505 Race 4 loadRace("7c666e50-9dde-11e0-85be-406186cbf87c"); // 505 Race 4
column = leaderboard.addRace(getTrackedRace(), "Test Race 3", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); column = leaderboard.addRace(getTrackedRace(), "Test Race 3", /* medalRace */ false, defaultFleet);
key = new Pair<Competitor, RaceColumn>(hasso, column); key = new Pair<Competitor, RaceColumn>(hasso, column);
// now the second race is discarded because Hasso ranked worst compared to the other two; in race 4 he ranked 11th // now the second race is discarded because Hasso ranked worst compared to the other two; in race 4 he ranked 11th
assertEquals(32, leaderboard.getTotalPoints(hasso, now), 0.000000001); assertEquals(32, leaderboard.getTotalPoints(hasso, now), 0.000000001);
@@ -31,7 +31,6 @@ import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl;
import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank;
import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -97,8 +96,8 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest {
final String columnName = "abc"; final String columnName = "abc";
setupRaces(1, 0); setupRaces(1, 0);
leaderboard.addRaceColumn(columnName, /* medalRace */ true, EmptyRaceLogStore.INSTANCE); leaderboard.addRaceColumn(columnName, /* medalRace */ true);
leaderboard.addRace(testRaces.iterator().next(), columnName, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); leaderboard.addRace(testRaces.iterator().next(), columnName, /* medalRace */ false, defaultFleet);
assertTrue(leaderboard.getRaceColumnByName(columnName).isMedalRace()); assertTrue(leaderboard.getRaceColumnByName(columnName).isMedalRace());
} }
@@ -123,7 +122,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest {
RaceColumn bestScoringRaceColumn = null; RaceColumn bestScoringRaceColumn = null;
for (TrackedRace race : testRaces) { for (TrackedRace race : testRaces) {
i++; i++;
RaceColumn raceColumn = leaderboard.addRace(race, "Test Race " + i, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); RaceColumn raceColumn = leaderboard.addRace(race, "Test Race " + i, /* medalRace */ false, defaultFleet);
raceColumnsInLeaderboard.put(race, raceColumn); raceColumnsInLeaderboard.put(race, raceColumn);
if (race.getRank(competitor) < bestScore) { if (race.getRank(competitor) < bestScore) {
bestScore = race.getRank(competitor); bestScore = race.getRank(competitor);
@@ -152,7 +151,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest {
FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl( FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl(
new int[] { 2 }), new LowPoint(), null); new int[] { 2 }), new LowPoint(), null);
Fleet defaultFleet = leaderboard.getFleet(null); Fleet defaultFleet = leaderboard.getFleet(null);
leaderboard.addRace(testRace, "R1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); leaderboard.addRace(testRace, "R1", /* medalRace */ false, defaultFleet);
assertEquals(1., leaderboard.getTotalPoints(competitor, now), 0.00000001); assertEquals(1., leaderboard.getTotalPoints(competitor, now), 0.00000001);
assertEquals(1., leaderboard.getTotalPoints(c2, now), 0.00000001); assertEquals(1., leaderboard.getTotalPoints(c2, now), 0.00000001);
assertEquals(1., leaderboard.getTotalPoints(c3, now), 0.00000001); assertEquals(1., leaderboard.getTotalPoints(c3, now), 0.00000001);
@@ -181,9 +180,9 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest {
FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl( FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl(
new int[] { 2 }), new LowPoint(), null); new int[] { 2 }), new LowPoint(), null);
Fleet defaultFleet = leaderboard.getFleet(null); Fleet defaultFleet = leaderboard.getFleet(null);
RaceColumn r1 = leaderboard.addRace(testRace, "R1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); RaceColumn r1 = leaderboard.addRace(testRace, "R1", /* medalRace */ false, defaultFleet);
raceColumnsInLeaderboard.put(testRace, r1); raceColumnsInLeaderboard.put(testRace, r1);
RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false, defaultFleet);
scoreCorrection.setMaxPointsReason(competitor, r2, MaxPointsReason.DND); // non-discardable disqualification scoreCorrection.setMaxPointsReason(competitor, r2, MaxPointsReason.DND); // non-discardable disqualification
// assert that max points were given before discarding... // assert that max points were given before discarding...
assertEquals(4.0, leaderboard.getEntry(competitor, r2, MillisecondsTimePoint.now()).getNetPoints(), 0.000000001); assertEquals(4.0, leaderboard.getEntry(competitor, r2, MillisecondsTimePoint.now()).getNetPoints(), 0.000000001);
@@ -214,7 +213,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest {
RaceColumn bestScoringRaceColumn = null; RaceColumn bestScoringRaceColumn = null;
for (TrackedRace race : testRaces) { for (TrackedRace race : testRaces) {
i++; i++;
RaceColumn raceColumn = leaderboard.addRace(race, "Test Race " + i, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, defaultFleet); RaceColumn raceColumn = leaderboard.addRace(race, "Test Race " + i, /* medalRace */ false, defaultFleet);
raceColumnsInLeaderboard.put(race, raceColumn); raceColumnsInLeaderboard.put(race, raceColumn);
if (race.getRank(competitor) < bestScore) { if (race.getRank(competitor) < bestScore) {
bestScore = race.getRank(competitor); bestScore = race.getRank(competitor);
@@ -241,12 +240,12 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest {
i++; i++;
raceColumnsInLeaderboard.put(race, leaderboard.addRace(race, "Test Race "+i, raceColumnsInLeaderboard.put(race, leaderboard.addRace(race, "Test Race "+i,
/* medalRace */ numberOfUntrackedRaces == 0 && addOneMedalRace && i == testRaces.size(), /* medalRace */ numberOfUntrackedRaces == 0 && addOneMedalRace && i == testRaces.size(),
EmptyRaceLogStore.INSTANCE, defaultFleet)); defaultFleet));
} }
// add a few race columns not yet connected to a tracked race // add a few race columns not yet connected to a tracked race
for (int j=0; j<numberOfUntrackedRaces; j++) { for (int j=0; j<numberOfUntrackedRaces; j++) {
i++; i++;
leaderboard.addRaceColumn("Test Race "+i, /* medalRace */ addOneMedalRace && j == numberOfUntrackedRaces-1, EmptyRaceLogStore.INSTANCE); leaderboard.addRaceColumn("Test Race "+i, /* medalRace */ addOneMedalRace && j == numberOfUntrackedRaces-1);
} }
if (carry != null) { if (carry != null) {
leaderboard.setCarriedPoints(competitor, carry); leaderboard.setCarriedPoints(competitor, carry);
@@ -48,7 +48,6 @@ import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithStartTimeAndRanks; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithStartTimeAndRanks;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -760,25 +759,25 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ScoreCorrectionImpl(), FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null);
leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f1)), "R1", /* medalRace */ false, leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f1)), "R1", /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard1.getFleet(null)); leaderboard1.getFleet(null));
leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f2)), "R2", /* medalRace */ false, leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f2)), "R2", /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard1.getFleet(null)); leaderboard1.getFleet(null));
assertTrue(leaderboard1.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare( assertTrue(leaderboard1.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare(
leaderboard1.getTotalPoints(c[0], later), leaderboard1.getTotalPoints(c[3], later)) < 0); // c0 better than c3 leaderboard1.getTotalPoints(c[0], later), leaderboard1.getTotalPoints(c[3], later)) < 0); // c0 better than c3
FlexibleLeaderboard leaderboard2 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(), FlexibleLeaderboard leaderboard2 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null);
leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f3)), "R1", /* medalRace */ false, leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f3)), "R1", /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard1.getFleet(null)); leaderboard1.getFleet(null));
leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f4)), "R2", /* medalRace */ false, leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f4)), "R2", /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard1.getFleet(null)); leaderboard1.getFleet(null));
assertTrue(leaderboard2.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare( assertTrue(leaderboard2.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare(
leaderboard2.getTotalPoints(c[3], later), leaderboard2.getTotalPoints(c[0], later)) < 0); // c3 better than c0 leaderboard2.getTotalPoints(c[3], later), leaderboard2.getTotalPoints(c[0], later)) < 0); // c3 better than c0
FlexibleLeaderboard leaderboard3 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(), FlexibleLeaderboard leaderboard3 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null);
leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f5)), "R1", /* medalRace */ false, leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f5)), "R1", /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard1.getFleet(null)); leaderboard1.getFleet(null));
leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f6)), "R2", /* medalRace */ false, leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f6)), "R2", /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard1.getFleet(null)); leaderboard1.getFleet(null));
assertTrue(leaderboard3.getCompetitorsFromBestToWorst(later).indexOf(c[3]) < assertTrue(leaderboard3.getCompetitorsFromBestToWorst(later).indexOf(c[3]) <
leaderboard3.getCompetitorsFromBestToWorst(later).indexOf(c[0])); // c3 better than c0; won last race leaderboard3.getCompetitorsFromBestToWorst(later).indexOf(c[0])); // c3 better than c0; won last race
LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl("Leaderboard Group", "Leaderboard Group", false, Arrays.asList(leaderboard1, LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl("Leaderboard Group", "Leaderboard Group", false, Arrays.asList(leaderboard1,
@@ -856,7 +855,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
qualifyingRaceColumnNames.add("Q" + i); qualifyingRaceColumnNames.add("Q" + i);
} }
Series qualifyingSeries = new SeriesImpl("Qualifying", /* isMedal */false, qualifyingFleets, Series qualifyingSeries = new SeriesImpl("Qualifying", /* isMedal */false, qualifyingFleets,
qualifyingRaceColumnNames, /* trackedRegattaRegistry */null, EmptyRaceLogStore.INSTANCE); qualifyingRaceColumnNames, /* trackedRegattaRegistry */null);
series.add(qualifyingSeries); series.add(qualifyingSeries);
} }
@@ -871,8 +870,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
for (int i = 1; i <= numberOfFinalRaces; i++) { for (int i = 1; i <= numberOfFinalRaces; i++) {
finalRaceColumnNames.add("F" + i); finalRaceColumnNames.add("F" + i);
} }
Series finalSeries = new SeriesImpl("Final", /* isMedal */false, finalFleets, finalRaceColumnNames, /* trackedRegattaRegistry */ null, Series finalSeries = new SeriesImpl("Final", /* isMedal */false, finalFleets, finalRaceColumnNames, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
series.add(finalSeries); series.add(finalSeries);
} }
@@ -882,8 +880,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
medalFleets.add(new FleetImpl("Medal")); medalFleets.add(new FleetImpl("Medal"));
List<String> medalRaceColumnNames = new ArrayList<String>(); List<String> medalRaceColumnNames = new ArrayList<String>();
medalRaceColumnNames.add("M"); medalRaceColumnNames.add("M");
Series medalSeries = new SeriesImpl("Medal", /* isMedal */true, medalFleets, medalRaceColumnNames, /* trackedRegattaRegistry */ null, Series medalSeries = new SeriesImpl("Medal", /* isMedal */true, medalFleets, medalRaceColumnNames, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
series.add(medalSeries); series.add(medalSeries);
} }
@@ -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());
@@ -26,7 +26,6 @@ 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.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -133,7 +132,7 @@ public abstract class OnlineTracTracBasedTest extends AbstractTracTracLiveTest {
if (domainFactory == null) { if (domainFactory == null) {
domainFactory = new DomainFactoryImpl(new com.sap.sailing.domain.base.impl.DomainFactoryImpl()); domainFactory = new DomainFactoryImpl(new com.sap.sailing.domain.base.impl.DomainFactoryImpl());
} }
domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null, EmptyRaceLogStore.INSTANCE); domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
trackedRegatta = new DynamicTrackedRegattaImpl(domainEvent); trackedRegatta = new DynamicTrackedRegattaImpl(domainEvent);
} }
@@ -11,20 +11,20 @@ import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
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.ControlPoint; import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
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.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.GateImpl; import com.sap.sailing.domain.base.impl.GateImpl;
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
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;
@@ -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;
@@ -84,7 +83,7 @@ public class ReachingLegTest extends TrackBasedTest {
Iterable<Competitor> competitors, TimePoint timePointForFixes) { Iterable<Competitor> competitors, TimePoint timePointForFixes) {
BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true); BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(regattaName, boatClass, /* trackedRegattaRegistry */ null, Regatta regatta = new RegattaImpl(regattaName, boatClass, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", EmptyRaceLogStore.INSTANCE); DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123");
TrackedRegatta trackedRegatta = new TrackedRegattaImpl(regatta); TrackedRegatta trackedRegatta = new TrackedRegattaImpl(regatta);
List<Waypoint> waypoints = new ArrayList<Waypoint>(); List<Waypoint> waypoints = new ArrayList<Waypoint>();
// create a two-lap upwind/downwind course: // create a two-lap upwind/downwind course:
@@ -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;
@@ -95,8 +94,7 @@ public class ReceiveMarkPassingDataTest extends AbstractTracTracLiveTest {
List<Receiver> receivers = new ArrayList<Receiver>(); List<Receiver> receivers = new ArrayList<Receiver>();
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)),
EmptyRaceLogStore.INSTANCE)),
getTracTracEvent(), EmptyWindStore.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
@@ -14,7 +14,6 @@ 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.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.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.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -66,8 +65,7 @@ public class ReceiveTrackingDataTest extends AbstractTracTracLiveTest {
} }
}; };
List<TypeController> listeners = new ArrayList<TypeController>(); List<TypeController> listeners = new ArrayList<TypeController>();
Regatta regatta = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null, Regatta regatta = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
DynamicTrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta); DynamicTrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta);
trackedRegatta.addRaceListener(new RaceListener() { trackedRegatta.addRaceListener(new RaceListener() {
@Override @Override
@@ -5,21 +5,21 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
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.ControlPoint; import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
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.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.GateImpl; import com.sap.sailing.domain.base.impl.GateImpl;
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
@@ -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;
@@ -94,7 +93,7 @@ public abstract class TrackBasedTest {
Iterable<Competitor> competitors, TimePoint timePointForFixes) { Iterable<Competitor> competitors, TimePoint timePointForFixes) {
BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true); BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(regattaName, boatClass, /* trackedRegattaRegistry */ null, Regatta regatta = new RegattaImpl(regattaName, boatClass, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", EmptyRaceLogStore.INSTANCE); DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123");
TrackedRegatta trackedRegatta = new TrackedRegattaImpl(regatta); TrackedRegatta trackedRegatta = new TrackedRegattaImpl(regatta);
List<Waypoint> waypoints = new ArrayList<Waypoint>(); List<Waypoint> waypoints = new ArrayList<Waypoint>();
// create a two-lap upwind/downwind course: // create a two-lap upwind/downwind course:
@@ -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();
@@ -15,10 +15,10 @@ import java.util.Set;
import org.junit.Test; import org.junit.Test;
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.ControlPoint; import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
@@ -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;
@@ -263,8 +262,7 @@ public class WindTest {
final BoatClass boatClass = domainFactory.getOrCreateBoatClass("ESS40"); final BoatClass boatClass = domainFactory.getOrCreateBoatClass("ESS40");
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl( DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl(
new RegattaImpl("Test Regatta", boatClass, new RegattaImpl("Test Regatta", boatClass,
/* trackedRegattaRegistry */ null, domainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* trackedRegattaRegistry */ null, domainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), "123")),
EmptyRaceLogStore.INSTANCE)),
new RaceDefinitionImpl("Test Race", new RaceDefinitionImpl("Test Race",
new CourseImpl("Test Course", Arrays.asList(new Waypoint[] { w1, w2, w3 })), new CourseImpl("Test Course", Arrays.asList(new Waypoint[] { w1, w2, w3 })),
boatClass, Collections.singleton(competitor)), boatClass, Collections.singleton(competitor)),
@@ -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;
@@ -93,8 +92,7 @@ public interface DomainFactory {
* boat class exists yet. * boat class exists yet.
* @param trackedRegattaRegistry TODO * @param trackedRegattaRegistry TODO
*/ */
com.sap.sailing.domain.base.Regatta getOrCreateDefaultRegatta(Event event, TrackedRegattaRegistry trackedRegattaRegistry, com.sap.sailing.domain.base.Regatta getOrCreateDefaultRegatta(Event event, TrackedRegattaRegistry trackedRegattaRegistry);
RaceLogStore raceLogStore);
/** /**
* Creates a race tracked for the specified URL/URIs and starts receiving all available existing and future push * Creates a race tracked for the specified URL/URIs and starts receiving all available existing and future push
@@ -127,7 +125,7 @@ public interface DomainFactory {
*/ */
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;
/** /**
@@ -136,7 +134,7 @@ public interface DomainFactory {
*/ */
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);
@@ -237,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;
@@ -306,8 +305,7 @@ public class DomainFactoryImpl implements DomainFactory {
} }
@Override @Override
public Regatta getOrCreateDefaultRegatta(com.tractrac.clientmodule.Event event, TrackedRegattaRegistry trackedRegattaRegistry, public Regatta getOrCreateDefaultRegatta(com.tractrac.clientmodule.Event event, TrackedRegattaRegistry trackedRegattaRegistry) {
RaceLogStore raceLogStore) {
synchronized (regattaCache) { synchronized (regattaCache) {
// FIXME Dialog with Lasse by Skype on 2011-06-17: // FIXME Dialog with Lasse by Skype on 2011-06-17:
// [6:20:04 PM] Axel Uhl: Lasse, can Event.getCompetitorClassList() ever produce more than one result? // [6:20:04 PM] Axel Uhl: Lasse, can Event.getCompetitorClassList() ever produce more than one result?
@@ -338,7 +336,7 @@ public class DomainFactoryImpl implements DomainFactory {
if (result == null) { if (result == null) {
result = new RegattaImpl(event.getName(), boatClass, trackedRegattaRegistry, result = new RegattaImpl(event.getName(), boatClass, trackedRegattaRegistry,
// use the low-point system as the default scoring scheme // use the low-point system as the default scoring scheme
com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), event.getId(), raceLogStore); com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), event.getId());
regattaCache.put(key, result); regattaCache.put(key, result);
weakRegattaCache.put(event, result); weakRegattaCache.put(event, result);
logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+") because none found for key "+key); logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+") because none found for key "+key);
@@ -550,19 +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, RaceLogStore raceLogStore) boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
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
@@ -578,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);
} }
} }
@@ -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, RaceLogStore raceLogStore) boolean simulateWithStartTimeNow, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry)
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, startOfTracking, endOfTracking, delayToLiveInMillis, simulateWithStartTimeNow, windStore, trackedRegattaRegistry);
raceLogStore);
} }
/** /**
@@ -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;
@@ -205,7 +202,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
} }
// if regatta is still null, no previous assignment of any of the races in this TracTrac event to a Regatta was found; // if regatta is still null, no previous assignment of any of the races in this TracTrac event to a Regatta was found;
// in this case, create a default regatta based on the TracTrac event data // in this case, create a default regatta based on the TracTrac event data
this.regatta = effectiveRegatta == null ? domainFactory.getOrCreateDefaultRegatta(tractracEvent, trackedRegattaRegistry, raceLogStore) : effectiveRegatta; this.regatta = effectiveRegatta == null ? domainFactory.getOrCreateDefaultRegatta(tractracEvent, trackedRegattaRegistry) : effectiveRegatta;
trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(this.regatta); trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(this.regatta);
receivers = new HashSet<Receiver>(); receivers = new HashSet<Receiver>();
Set<TypeController> typeControllers = new HashSet<TypeController>(); Set<TypeController> typeControllers = new HashSet<TypeController>();
@@ -5,8 +5,6 @@ import com.sap.sailing.domain.common.RaceIdentifier;
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.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sailing.util.impl.RaceColumnListeners;
@@ -144,10 +142,5 @@ public interface RaceColumn extends Named {
* If <code>null</code>, the {@link #getFactor() factor} defaults to 1 for non-medal and {@link #DEFAULT_MEDAL_RACE_FACTOR} for * If <code>null</code>, the {@link #getFactor() factor} defaults to 1 for non-medal and {@link #DEFAULT_MEDAL_RACE_FACTOR} for
* medal races. Otherwise, the explicit factor is used. * medal races. Otherwise, the explicit factor is used.
*/ */
Double getExplicitFactor(); Double getExplicitFactor();
RaceLog getRaceLog(String leaderboardName, Fleet fleet);
void recordRaceLogEvent(String leaderboardName, Fleet fleet, RaceLogEvent event);
} }
@@ -1,14 +1,8 @@
package com.sap.sailing.domain.base; package com.sap.sailing.domain.base;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLogEvent;
public interface RaceColumnInSeries extends RaceColumn { public interface RaceColumnInSeries extends RaceColumn {
Series getSeries(); Series getSeries();
Regatta getRegatta(); Regatta getRegatta();
RaceColumnIdentifier getRaceColumnIdentifier(String leaderboardName);
void recordRaceLogEvent(String leaderboardName, Fleet fleet, RaceLogEvent event);
} }
@@ -1,6 +1,5 @@
package com.sap.sailing.domain.base; package com.sap.sailing.domain.base;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
@@ -27,7 +26,7 @@ public interface Series extends SeriesData {
Fleet getFleetByName(String fleetName); Fleet getFleetByName(String fleetName);
RaceColumnInSeries addRaceColumn(String raceColumnName, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore); RaceColumnInSeries addRaceColumn(String raceColumnName, TrackedRegattaRegistry trackedRegattaRegistry);
void moveRaceColumnUp(String raceColumnName); void moveRaceColumnUp(String raceColumnName);
@@ -8,7 +8,6 @@ import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
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.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn { public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implements RaceColumn {
@@ -16,13 +15,11 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem
private final Map<Fleet, TrackedRace> trackedRaces; private final Map<Fleet, TrackedRace> trackedRaces;
private final Map<Fleet, RaceIdentifier> raceIdentifiers; private final Map<Fleet, RaceIdentifier> raceIdentifiers;
protected RaceLogStore raceLogStore;
public AbstractRaceColumn(RaceLogStore raceLogStore) { public AbstractRaceColumn() {
this.trackedRaces = new HashMap<Fleet, TrackedRace>(); this.trackedRaces = new HashMap<Fleet, TrackedRace>();
this.raceIdentifiers = new HashMap<Fleet, RaceIdentifier>(); this.raceIdentifiers = new HashMap<Fleet, RaceIdentifier>();
this.raceLogStore = raceLogStore;
} }
@@ -5,11 +5,6 @@ import com.sap.sailing.domain.base.RaceColumnInSeries;
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.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.racelog.impl.RaceColumnIdentifierImpl;
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;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
@@ -39,8 +34,8 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo
* this column's series {@link Regatta}, respectively. If <code>null</code>, the re-association won't be * this column's series {@link Regatta}, respectively. If <code>null</code>, the re-association won't be
* carried out. * carried out.
*/ */
public RaceColumnInSeriesImpl(String name, Series series, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) { public RaceColumnInSeriesImpl(String name, Series series, TrackedRegattaRegistry trackedRegattaRegistry) {
super(raceLogStore); super();
this.name = name; this.name = name;
this.series = series; this.series = series;
this.trackedRegattaRegistry = trackedRegattaRegistry; this.trackedRegattaRegistry = trackedRegattaRegistry;
@@ -94,20 +89,4 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo
super.setTrackedRace(fleet, trackedRace); super.setTrackedRace(fleet, trackedRace);
} }
@Override
public RaceLog getRaceLog(String leaderboardName, Fleet fleet) {
return raceLogStore.getRaceLog(getRaceColumnIdentifier(leaderboardName), fleet);
}
@Override
public RaceColumnIdentifier getRaceColumnIdentifier(String leaderboardName) {
return new RaceColumnIdentifierImpl(leaderboardName, getName());
}
@Override
public void recordRaceLogEvent(String leaderboardName, Fleet fleet, RaceLogEvent event) {
raceLogStore.getRaceLog(getRaceColumnIdentifier(leaderboardName), fleet).add(event);
}
} }
@@ -23,7 +23,6 @@ import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.impl.NamedImpl; import com.sap.sailing.domain.common.impl.NamedImpl;
import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.racelog.RaceLogStore;
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;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
@@ -60,10 +59,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
* this column's series {@link Regatta}, respectively. If <code>null</code>, the re-association won't be * this column's series {@link Regatta}, respectively. If <code>null</code>, the re-association won't be
* carried out. * carried out.
*/ */
public RegattaImpl(String baseName, BoatClass boatClass, TrackedRegattaRegistry trackedRegattaRegistry, ScoringScheme scoringScheme, Serializable id, RaceLogStore raceLogStore) { public RegattaImpl(String baseName, BoatClass boatClass, TrackedRegattaRegistry trackedRegattaRegistry, ScoringScheme scoringScheme, Serializable id) {
this(baseName, boatClass, Collections.singletonList(new SeriesImpl("Default", /* isMedal */false, Collections this(baseName, boatClass, Collections.singletonList(new SeriesImpl("Default", /* isMedal */false, Collections
.singletonList(new FleetImpl("Default")), /* race column names */new ArrayList<String>(), .singletonList(new FleetImpl("Default")), /* race column names */new ArrayList<String>(),
trackedRegattaRegistry, raceLogStore)), /* persistent */false, scoringScheme, id); trackedRegattaRegistry)), /* persistent */false, scoringScheme, id);
} }
/** /**
@@ -17,7 +17,6 @@ import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.common.impl.NamedImpl; import com.sap.sailing.domain.common.impl.NamedImpl;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.racelog.RaceLogStore;
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;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
@@ -43,7 +42,7 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener
* carried out. * carried out.
*/ */
public SeriesImpl(String name, boolean isMedal, Iterable<? extends Fleet> fleets, Iterable<String> raceColumnNames, public SeriesImpl(String name, boolean isMedal, Iterable<? extends Fleet> fleets, Iterable<String> raceColumnNames,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogStore raceLogStore) { TrackedRegattaRegistry trackedRegattaRegistry) {
super(name); super(name);
if (fleets == null || Util.isEmpty(fleets)) { if (fleets == null || Util.isEmpty(fleets)) {
throw new IllegalArgumentException("Series must have at least one fleet"); throw new IllegalArgumentException("Series must have at least one fleet");
@@ -59,7 +58,7 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener
this.isMedal = isMedal; this.isMedal = isMedal;
this.raceColumnListeners = new RaceColumnListeners(); this.raceColumnListeners = new RaceColumnListeners();
for (String raceColumnName : raceColumnNames) { for (String raceColumnName : raceColumnNames) {
addRaceColumn(raceColumnName, trackedRegattaRegistry, raceLogStore); addRaceColumn(raceColumnName, trackedRegattaRegistry);
} }
} }
@@ -106,9 +105,8 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener
* carried out. * carried out.
*/ */
@Override @Override
public RaceColumnInSeries addRaceColumn(String raceColumnName, TrackedRegattaRegistry trackedRegattaRegistry, public RaceColumnInSeries addRaceColumn(String raceColumnName, TrackedRegattaRegistry trackedRegattaRegistry) {
RaceLogStore raceLogStore) { RaceColumnInSeriesImpl result = createRaceColumn(raceColumnName, trackedRegattaRegistry);
RaceColumnInSeriesImpl result = createRaceColumn(raceColumnName, trackedRegattaRegistry, raceLogStore);
if (raceColumnListeners.canAddRaceColumnToContainer(result)) { if (raceColumnListeners.canAddRaceColumnToContainer(result)) {
result.addRaceColumnListener(this); result.addRaceColumnListener(this);
raceColumns.add(result); raceColumns.add(result);
@@ -127,9 +125,8 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener
* this column's series {@link Regatta}, respectively. If <code>null</code>, the re-association won't be * this column's series {@link Regatta}, respectively. If <code>null</code>, the re-association won't be
* carried out. * carried out.
*/ */
private RaceColumnInSeriesImpl createRaceColumn(String raceColumnName, TrackedRegattaRegistry trackedRegattaRegistry, private RaceColumnInSeriesImpl createRaceColumn(String raceColumnName, TrackedRegattaRegistry trackedRegattaRegistry) {
RaceLogStore raceLogStore) { RaceColumnInSeriesImpl result = new RaceColumnInSeriesImpl(raceColumnName, this, trackedRegattaRegistry);
RaceColumnInSeriesImpl result = new RaceColumnInSeriesImpl(raceColumnName, this, trackedRegattaRegistry, raceLogStore);
return result; return result;
} }
@@ -5,7 +5,6 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.common.Renamable; import com.sap.sailing.domain.common.Renamable;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
/** /**
@@ -46,28 +45,25 @@ public interface FlexibleLeaderboard extends Leaderboard, Renamable {
* @param fleets * @param fleets
* the fleets to add to the {@link RaceColumn} created. If no fleets are specified, a single default * the fleets to add to the {@link RaceColumn} created. If no fleets are specified, a single default
* fleet will be assigned to the race column created. * fleet will be assigned to the race column created.
*
* @return the race column in the leaderboard used to represent the tracked <code>race</code> * @return the race column in the leaderboard used to represent the tracked <code>race</code>
*/ */
RaceColumn addRaceColumn(String name, boolean medalRace, RaceLogStore raceLogStore, Fleet... fleets); RaceColumn addRaceColumn(String name, boolean medalRace, Fleet... fleets);
/** /**
* Adds a tracked race to this leaderboard. If a {@link RaceColumn} with name <code>columnName</code> already exists * Adds a tracked race to this leaderboard. If a {@link RaceColumn} with name <code>columnName</code> already exists
* in this leaderboard, <code>race</code> is {@link RaceColumn#setTrackedRace(Fleet, TrackedRace) set as its tracked * in this leaderboard, <code>race</code> is {@link RaceColumn#setTrackedRace(Fleet, TrackedRace) set as its tracked
* race} and <code>medalRace</code> is ignored. Otherwise, a new {@link RaceColumn} column, with <code>race</code> * race} and <code>medalRace</code> is ignored. Otherwise, a new {@link RaceColumn} column, with <code>race</code>
* as its tracked race, is created and added to this leaderboard. * as its tracked race, is created and added to this leaderboard.
*
* @param medalRace * @param medalRace
* tells if the column to add represents a medal race which has double score and cannot be discarded; * tells if the column to add represents a medal race which has double score and cannot be discarded;
* ignored if the column named <code>columnName</code> already exists * ignored if the column named <code>columnName</code> already exists
*
* @param fleets * @param fleets
* the fleets to add to the {@link RaceColumn} created. If no fleets are specified, a single default * the fleets to add to the {@link RaceColumn} created. If no fleets are specified, a single default
* fleet will be assigned to the race column created. * fleet will be assigned to the race column created.
* *
* @return the race column in the leaderboard used to represent the tracked <code>race</code> * @return the race column in the leaderboard used to represent the tracked <code>race</code>
*/ */
RaceColumn addRace(TrackedRace race, String columnName, boolean medalRace, RaceLogStore raceLogStore, Fleet fleet); RaceColumn addRace(TrackedRace race, String columnName, boolean medalRace, Fleet fleet);
void removeRaceColumn(String columnName); void removeRaceColumn(String columnName);
@@ -1,12 +1,8 @@
package com.sap.sailing.domain.leaderboard; package com.sap.sailing.domain.leaderboard;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.racelog.RaceLogEvent;
public interface FlexibleRaceColumn extends RaceColumn { public interface FlexibleRaceColumn extends RaceColumn {
void setName(String newName); void setName(String newName);
void setIsMedalRace(boolean isMedalRace); void setIsMedalRace(boolean isMedalRace);
void recordRaceLogEvent(Fleet fleet, RaceLogEvent event);
} }
@@ -16,7 +16,6 @@ import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn;
import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
/** /**
@@ -65,13 +64,13 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
} }
@Override @Override
public RaceColumn addRaceColumn(String name, boolean medalRace, RaceLogStore raceLogStore, Fleet... fleets) { public RaceColumn addRaceColumn(String name, boolean medalRace, Fleet... fleets) {
FlexibleRaceColumn column = getRaceColumnByName(name); FlexibleRaceColumn column = getRaceColumnByName(name);
if (column != null) { if (column != null) {
final String msg = "Trying to create race column with duplicate name "+name+" in leaderboard +"+getName(); final String msg = "Trying to create race column with duplicate name "+name+" in leaderboard +"+getName();
logger.severe(msg); logger.severe(msg);
} else { } else {
column = createRaceColumn(name, medalRace, raceLogStore, fleets); column = createRaceColumn(name, medalRace, fleets);
column.addRaceColumnListener(this); column.addRaceColumnListener(this);
races.add(column); races.add(column);
getRaceColumnListeners().notifyListenersAboutRaceColumnAddedToContainer(column); getRaceColumnListeners().notifyListenersAboutRaceColumnAddedToContainer(column);
@@ -109,10 +108,10 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
} }
@Override @Override
public RaceColumn addRace(TrackedRace race, String columnName, boolean medalRace, RaceLogStore raceLogStore, Fleet fleet) { public RaceColumn addRace(TrackedRace race, String columnName, boolean medalRace, Fleet fleet) {
FlexibleRaceColumn column = getRaceColumnByName(columnName); FlexibleRaceColumn column = getRaceColumnByName(columnName);
if (column == null) { if (column == null) {
column = createRaceColumn(columnName, medalRace, raceLogStore, fleet); column = createRaceColumn(columnName, medalRace, fleet);
column.addRaceColumnListener(this); column.addRaceColumnListener(this);
races.add(column); races.add(column);
} }
@@ -120,8 +119,8 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
return column; return column;
} }
protected RaceColumnImpl createRaceColumn(String columnName, boolean medalRace, RaceLogStore raceLogStore, Fleet... fleets) { protected RaceColumnImpl createRaceColumn(String columnName, boolean medalRace, Fleet... fleets) {
return new RaceColumnImpl(columnName, medalRace, raceLogStore, turnNullOrEmptyFleetsIntoDefaultFleet(fleets)); return new RaceColumnImpl(columnName, medalRace, turnNullOrEmptyFleetsIntoDefaultFleet(fleets));
} }
protected Iterable<Fleet> turnNullOrEmptyFleetsIntoDefaultFleet(Fleet... fleets) { protected Iterable<Fleet> turnNullOrEmptyFleetsIntoDefaultFleet(Fleet... fleets) {
@@ -6,11 +6,7 @@ import java.util.List;
import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.impl.AbstractRaceColumn; import com.sap.sailing.domain.base.impl.AbstractRaceColumn;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogStore;
public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceColumn { public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceColumn {
private static final long serialVersionUID = -7801617988982540470L; private static final long serialVersionUID = -7801617988982540470L;
@@ -23,8 +19,8 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo
private final Iterable<Fleet> fleets; private final Iterable<Fleet> fleets;
private boolean medalRace; private boolean medalRace;
public RaceColumnImpl(String name, boolean medalRace, RaceLogStore raceLogStore, Iterable<Fleet> fleets) { public RaceColumnImpl(String name, boolean medalRace, Iterable<Fleet> fleets) {
super(raceLogStore); super();
this.name = name; this.name = name;
this.medalRace = medalRace; this.medalRace = medalRace;
List<Fleet> myFleets = new ArrayList<Fleet>(); List<Fleet> myFleets = new ArrayList<Fleet>();
@@ -60,25 +56,4 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo
public Iterable<Fleet> getFleets() { public Iterable<Fleet> getFleets() {
return fleets; return fleets;
} }
@Override
public RaceLog getRaceLog(String leaderboardName, Fleet fleet) {
return raceLogStore.getRaceLog(fleet);
}
public RaceLog getRaceLog(Fleet fleet) {
return getRaceLog("", fleet);
}
@Override
public void recordRaceLogEvent(Fleet fleet, RaceLogEvent event) {
if (!Util.contains(fleets, fleet))
return;
raceLogStore.getRaceLog(fleet).add(event);
}
@Override
public void recordRaceLogEvent(String leaderboardName, Fleet fleet, RaceLogEvent event) {
recordRaceLogEvent(fleet, event);
}
} }
@@ -10,8 +10,6 @@ import com.sap.sailing.domain.base.impl.SimpleAbstractRaceColumn;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
/** /**
@@ -149,15 +147,4 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R
public boolean isTransient() { public boolean isTransient() {
return false; return false;
} }
@Override
public RaceLog getRaceLog(String leaderboardName, Fleet fleet) {
return null;
}
@Override
public void recordRaceLogEvent(String leaderboardName, Fleet fleet,
RaceLogEvent event) {
}
} }
@@ -1,6 +1,6 @@
package com.sap.sailing.domain.racelog; package com.sap.sailing.domain.racelog;
public interface RaceColumnIdentifier { public interface RaceLogIdentifier {
String getIdentifier(); String getIdentifier();
@@ -1,13 +1,10 @@
package com.sap.sailing.domain.racelog; package com.sap.sailing.domain.racelog;
import com.sap.sailing.domain.base.Fleet;
/** /**
* Capsulating store interface providing a {@link RaceLog} for a given regatta / race combination. * Capsulating store interface providing a {@link RaceLog} for a given regatta / race combination.
* *
*/ */
public interface RaceLogStore { public interface RaceLogStore {
RaceLog getRaceLog(Fleet fleet); RaceLog getRaceLog(RaceLogIdentifier identifier);
RaceLog getRaceLog(RaceColumnIdentifier identifier, Fleet fleet);
} }
@@ -1,8 +1,7 @@
package com.sap.sailing.domain.racelog.impl; package com.sap.sailing.domain.racelog.impl;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.RaceLogStore;
/** /**
@@ -12,14 +11,9 @@ import com.sap.sailing.domain.racelog.RaceLogStore;
*/ */
public class EmptyRaceLogStore implements RaceLogStore { public class EmptyRaceLogStore implements RaceLogStore {
public static EmptyRaceLogStore INSTANCE = new EmptyRaceLogStore(); public static EmptyRaceLogStore INSTANCE = new EmptyRaceLogStore();
@Override
public RaceLog getRaceLog(Fleet fleet) {
return new RaceLogImpl("Lock for " + fleet.toString());
}
@Override @Override
public RaceLog getRaceLog(RaceColumnIdentifier identifier, Fleet fleet) { public RaceLog getRaceLog(RaceLogIdentifier identifier) {
return new RaceLogImpl("Lock for " + identifier.getIdentifier() + "-" + fleet.toString()); return new RaceLogImpl("Lock for " + identifier.getIdentifier());
} }
} }
@@ -1,20 +0,0 @@
package com.sap.sailing.domain.racelog.impl;
import com.sap.sailing.domain.racelog.RaceColumnIdentifier;
public class RaceColumnIdentifierImpl implements RaceColumnIdentifier {
private String leaderboardName;
private String columnName;
public RaceColumnIdentifierImpl(String leaderboardName, String columnName) {
this.leaderboardName = leaderboardName;
this.columnName = columnName;
}
@Override
public String getIdentifier() {
return String.format("%s-%s", leaderboardName, columnName);
}
}
@@ -0,0 +1,30 @@
package com.sap.sailing.domain.racelog.impl;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.racelog.RaceLogIdentifier;
public class RaceLogIdentifierImpl implements RaceLogIdentifier {
private final Leaderboard leaderboard;
private final RaceColumn raceColumn;
private final Fleet fleet;
public RaceLogIdentifierImpl(Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet) {
this.leaderboard = leaderboard;
this.raceColumn = raceColumn;
this.fleet = fleet;
}
@Override
public String getIdentifier() {
return String.format("%s-%s-%s", leaderboard.getName(), raceColumn.getName(), fleet.getName());
}
@Override
public String toString() {
return getIdentifier();
}
}
@@ -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.swisstimingadapter.SwissTimingArchiveConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration; import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration;
@@ -1142,8 +1141,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() {
@@ -2385,8 +2383,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() {
@@ -2439,10 +2436,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
RegattaImpl.getFullName(replayRaceDTO.rsc, replayRaceDTO.boat_class), RegattaImpl.getFullName(replayRaceDTO.rsc, replayRaceDTO.boat_class),
Collections.singletonList(new SeriesImpl("Default", /* isMedal */false, Collections Collections.singletonList(new SeriesImpl("Default", /* isMedal */false, Collections
.singletonList(new FleetImpl("Default")), /* race column names */ .singletonList(new FleetImpl("Default")), /* race column names */
new ArrayList<String>(), getService(), new ArrayList<String>(), getService())), false,
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory))), false, baseDomainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT));
baseDomainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT),
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory));
} else { } else {
regatta = getService().getRegatta(regattaIdentifier); regatta = getService().getRegatta(regattaIdentifier);
} }
@@ -2932,8 +2927,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
public List<RaceColumnInSeriesDTO> addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames) { public List<RaceColumnInSeriesDTO> addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List<String> columnNames) {
List<RaceColumnInSeriesDTO> result = new ArrayList<RaceColumnInSeriesDTO>(); List<RaceColumnInSeriesDTO> result = new ArrayList<RaceColumnInSeriesDTO>();
for(String columnName: columnNames) { for(String columnName: columnNames) {
RaceColumnInSeries raceColumnInSeries = getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName, RaceColumnInSeries raceColumnInSeries = getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName));
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory)));
if(raceColumnInSeries != null) { if(raceColumnInSeries != null) {
result.add(convertToRaceColumnInSeriesDTO(raceColumnInSeries)); result.add(convertToRaceColumnInSeriesDTO(raceColumnInSeries));
} }
@@ -2944,8 +2938,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override @Override
public RaceColumnInSeriesDTO addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) { public RaceColumnInSeriesDTO addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
RaceColumnInSeriesDTO result = null; RaceColumnInSeriesDTO result = null;
RaceColumnInSeries raceColumnInSeries = getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName, RaceColumnInSeries raceColumnInSeries = getService().apply(new AddColumnToSeries(regattaIdentifier, seriesName, columnName));
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory)));
if(raceColumnInSeries != null) { if(raceColumnInSeries != null) {
result = convertToRaceColumnInSeriesDTO(raceColumnInSeries); result = convertToRaceColumnInSeriesDTO(raceColumnInSeries);
} }
@@ -2981,8 +2974,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
Regatta regatta = getService().apply( Regatta regatta = getService().apply(
new AddSpecificRegatta(regattaName, boatClassName, UUID.randomUUID(), new AddSpecificRegatta(regattaName, boatClassName, UUID.randomUUID(),
seriesNamesWithFleetNamesAndFleetOrderingAndMedal, seriesNamesWithFleetNamesAndFleetOrderingAndMedal,
persistent, baseDomainFactory.createScoringScheme(scoringSchemeType), persistent, baseDomainFactory.createScoringScheme(scoringSchemeType)));
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory)));
return convertToRegattaDTO(regatta); return convertToRegattaDTO(regatta);
} }
@@ -53,7 +53,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.persistence.impl.CollectionNames; import com.sap.sailing.domain.persistence.impl.CollectionNames;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.AbstractLeaderboardTest; import com.sap.sailing.domain.test.AbstractLeaderboardTest;
import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
@@ -109,8 +108,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true); BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
Regatta regattaProxy = createRegatta(regattaBaseName, boatClass, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT)); Regatta regattaProxy = createRegatta(regattaBaseName, boatClass, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
Regatta regatta = res.createRegatta(regattaProxy.getBaseName(), regattaProxy.getBoatClass().getName(), Regatta regatta = res.createRegatta(regattaProxy.getBaseName(), regattaProxy.getBoatClass().getName(),
"123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
EmptyRaceLogStore.INSTANCE);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta); addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), new int[] { 3, 5 }, null); res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), new int[] { 3, 5 }, null);
DomainObjectFactory dof = MongoFactory.INSTANCE.getDomainObjectFactory(getMongoService()); DomainObjectFactory dof = MongoFactory.INSTANCE.getDomainObjectFactory(getMongoService());
@@ -151,8 +149,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
final String regattaBaseName = "Kieler Woche"; final String regattaBaseName = "Kieler Woche";
Regatta regattaProxy = createRegatta(regattaBaseName, boatClass, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT)); Regatta regattaProxy = createRegatta(regattaBaseName, boatClass, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
Regatta regatta = res.createRegatta(regattaProxy.getBaseName(), regattaProxy.getBoatClass().getName(), Regatta regatta = res.createRegatta(regattaProxy.getBaseName(), regattaProxy.getBoatClass().getName(),
"123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
EmptyRaceLogStore.INSTANCE);
trackedRegatta[0] = new DynamicTrackedRegattaImpl(regatta); trackedRegatta[0] = new DynamicTrackedRegattaImpl(regatta);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta); addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
logColumnsInRegatta(regatta); logColumnsInRegatta(regatta);
@@ -364,22 +361,20 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
qualifyingFleets.add(new FleetImpl("Yellow")); qualifyingFleets.add(new FleetImpl("Yellow"));
qualifyingFleets.add(new FleetImpl("Blue")); qualifyingFleets.add(new FleetImpl("Blue"));
Series qualifyingSeries = new SeriesImpl("Qualifying", /* isMedal */false, qualifyingFleets, Series qualifyingSeries = new SeriesImpl("Qualifying", /* isMedal */false, qualifyingFleets,
emptyRaceColumnNames, /* trackedRegattaRegistry */ null, EmptyRaceLogStore.INSTANCE); emptyRaceColumnNames, /* trackedRegattaRegistry */ null);
series.add(qualifyingSeries); series.add(qualifyingSeries);
// -------- final series ------------ // -------- final series ------------
List<Fleet> finalFleets = new ArrayList<Fleet>(); List<Fleet> finalFleets = new ArrayList<Fleet>();
finalFleets.add(new FleetImpl("Gold", 1)); finalFleets.add(new FleetImpl("Gold", 1));
finalFleets.add(new FleetImpl("Silver", 2)); finalFleets.add(new FleetImpl("Silver", 2));
Series finalSeries = new SeriesImpl("Final", /* isMedal */ false, finalFleets, emptyRaceColumnNames, /* trackedRegattaRegistry */ null, Series finalSeries = new SeriesImpl("Final", /* isMedal */ false, finalFleets, emptyRaceColumnNames, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
series.add(finalSeries); series.add(finalSeries);
// ------------ medal -------------- // ------------ medal --------------
List<Fleet> medalFleets = new ArrayList<Fleet>(); List<Fleet> medalFleets = new ArrayList<Fleet>();
medalFleets.add(new FleetImpl("Medal")); medalFleets.add(new FleetImpl("Medal"));
Series medalSeries = new SeriesImpl("Medal", /* isMedal */ true, medalFleets, emptyRaceColumnNames, /* trackedRegattaRegistry */ null, Series medalSeries = new SeriesImpl("Medal", /* isMedal */ true, medalFleets, emptyRaceColumnNames, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
series.add(medalSeries); series.add(medalSeries);
Regatta regatta = new RegattaImpl(regattaBaseName, boatClass, series, persistent, scoringScheme, "123"); Regatta regatta = new RegattaImpl(regattaBaseName, boatClass, series, persistent, scoringScheme, "123");
return regatta; return regatta;
@@ -387,7 +382,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
private void addRaceColumnsToSeries(List<String> finalRaceColumnNames, Series finalSeries) { private void addRaceColumnsToSeries(List<String> finalRaceColumnNames, Series finalSeries) {
for (String raceColumnName : finalRaceColumnNames) { for (String raceColumnName : finalRaceColumnNames) {
finalSeries.addRaceColumn(raceColumnName, /* trackedRegattaRegistry */ null, EmptyRaceLogStore.INSTANCE); finalSeries.addRaceColumn(raceColumnName, /* trackedRegattaRegistry */ null);
} }
} }
@@ -46,7 +46,6 @@ import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
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.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors;
import com.sap.sailing.mongodb.MongoDBService; import com.sap.sailing.mongodb.MongoDBService;
import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventService;
@@ -129,7 +128,7 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
racingEventService.addLeaderboard(leaderboard); racingEventService.addLeaderboard(leaderboard);
leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
racingEventService.addLeaderboard(leaderboard); racingEventService.addLeaderboard(leaderboard);
@@ -186,7 +185,7 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
leaderboards.add(leaderboard); leaderboards.add(leaderboard);
leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
leaderboards.add(leaderboard); leaderboards.add(leaderboard);
@@ -243,7 +242,7 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
leaderboards.add(leaderboard); leaderboards.add(leaderboard);
leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
leaderboards.add(leaderboard); leaderboards.add(leaderboard);
@@ -427,7 +426,7 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
final FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); final FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
final Fleet fleet = leaderboard.getFleet(null); final Fleet fleet = leaderboard.getFleet(null);
final RaceColumn race = leaderboard.addRaceColumn(columnName, false, EmptyRaceLogStore.INSTANCE, fleet); final RaceColumn race = leaderboard.addRaceColumn(columnName, false, fleet);
leaderboards.add(leaderboard); leaderboards.add(leaderboard);
final LeaderboardGroup group = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); final LeaderboardGroup group = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards);
@@ -34,7 +34,6 @@ import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
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.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank;
import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -50,10 +49,10 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 };
FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
leaderboard.addRaceColumn("R1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE); leaderboard.addRaceColumn("R1", /* medalRace */ false);
RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false, EmptyRaceLogStore.INSTANCE); RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false);
r2.setFactor(1.5); r2.setFactor(1.5);
RaceColumn r3 = leaderboard.addRaceColumn("R3", /* medalRace */ false, EmptyRaceLogStore.INSTANCE); RaceColumn r3 = leaderboard.addRaceColumn("R3", /* medalRace */ false);
r3.setFactor(2.5); r3.setFactor(2.5);
new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard);
Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null);
@@ -77,8 +76,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
final String raceColumnName1 = "My First Race 1"; final String raceColumnName1 = "My First Race 1";
MockedTrackedRaceWithFixedRankAndManyCompetitors raceWithTwoCompetitors = new MockedTrackedRaceWithFixedRankAndManyCompetitors(wolfgang, /* rank */ 1, /* started */ true); MockedTrackedRaceWithFixedRankAndManyCompetitors raceWithTwoCompetitors = new MockedTrackedRaceWithFixedRankAndManyCompetitors(wolfgang, /* rank */ 1, /* started */ true);
raceWithTwoCompetitors.addCompetitor(hasso); raceWithTwoCompetitors.addCompetitor(hasso);
leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null));
leaderboard.setSuppressed(wolfgang, true); leaderboard.setSuppressed(wolfgang, true);
assertTrue(Util.contains(leaderboard.getSuppressedCompetitors(), wolfgang)); assertTrue(Util.contains(leaderboard.getSuppressedCompetitors(), wolfgang));
assertFalse(Util.contains(leaderboard.getSuppressedCompetitors(), hasso)); assertFalse(Util.contains(leaderboard.getSuppressedCompetitors(), hasso));
@@ -117,16 +115,14 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
Competitor competitor = createCompetitor(); Competitor competitor = createCompetitor();
TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true);
final String raceColumnName1 = "My First Race 1"; final String raceColumnName1 = "My First Race 1";
leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null));
final String displayName = "$$$ ... The Renamed Competitor ... $$$"; final String displayName = "$$$ ... The Renamed Competitor ... $$$";
leaderboard.setDisplayName(competitor, displayName); leaderboard.setDisplayName(competitor, displayName);
new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard);
FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard( FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(
leaderboardName, /* regattaRegistry */null); leaderboardName, /* regattaRegistry */null);
// attach tracked race to leaderboard to ensure that competitor object is assigned properly // attach tracked race to leaderboard to ensure that competitor object is assigned properly
loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false, EmptyRaceLogStore.INSTANCE, loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null));
Competitor loadedCompetitor = loadedLeaderboard.getCompetitorByName(competitor.getName()); Competitor loadedCompetitor = loadedLeaderboard.getCompetitorByName(competitor.getName());
assertEquals(displayName, loadedLeaderboard.getDisplayName(loadedCompetitor)); assertEquals(displayName, loadedLeaderboard.getDisplayName(loadedCompetitor));
} }
@@ -166,14 +162,12 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null);
Competitor competitor = createCompetitor(); Competitor competitor = createCompetitor();
TrackedRace raceWithOneCompetitor = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true);
leaderboard.addRace(raceWithOneCompetitor, raceColumnName, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, leaderboard.addRace(raceWithOneCompetitor, raceColumnName, /* medalRace */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null));
leaderboard.setCarriedPoints(competitor, carriedPointsForWolfgangHunger); leaderboard.setCarriedPoints(competitor, carriedPointsForWolfgangHunger);
new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard);
FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null);
// attach tracked race to leaderboard to ensure that competitor object is assigned properly // attach tracked race to leaderboard to ensure that competitor object is assigned properly
loadedLeaderboard.addRace(raceWithOneCompetitor, raceColumnName, /* medalRace, ignored */ false, EmptyRaceLogStore.INSTANCE, loadedLeaderboard.addRace(raceWithOneCompetitor, raceColumnName, /* medalRace, ignored */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null));
assertEquals(leaderboardName, loadedLeaderboard.getName()); assertEquals(leaderboardName, loadedLeaderboard.getName());
assertTrue(Arrays.equals(discardIndexResultsStartingWithHowManyRaces, loadedLeaderboard.getResultDiscardingRule() assertTrue(Arrays.equals(discardIndexResultsStartingWithHowManyRaces, loadedLeaderboard.getResultDiscardingRule()
.getDiscardIndexResultsStartingWithHowManyRaces())); .getDiscardIndexResultsStartingWithHowManyRaces()));
@@ -194,18 +188,16 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
Competitor competitor = createCompetitor(); Competitor competitor = createCompetitor();
TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true);
TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true);
leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null)); leaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace */ true, leaderboard.getFleet(null));
leaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace */ true, EmptyRaceLogStore.INSTANCE,
leaderboard.getFleet(null));
leaderboard.getScoreCorrection().correctScore(competitor, leaderboard.getRaceColumnByName(raceColumnName1), correctedPoints); leaderboard.getScoreCorrection().correctScore(competitor, leaderboard.getRaceColumnByName(raceColumnName1), correctedPoints);
new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard);
FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null);
// attach tracked race to leaderboard to ensure that competitor object is assigned properly // attach tracked race to leaderboard to ensure that competitor object is assigned properly
RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false, RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
assertEquals(leaderboardName, loadedLeaderboard.getName()); assertEquals(leaderboardName, loadedLeaderboard.getName());
assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1));
assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.00000001); assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.00000001);
@@ -224,18 +216,16 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
Competitor competitor = createCompetitor(); Competitor competitor = createCompetitor();
TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true);
TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true);
leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, EmptyRaceLogStore.INSTANCE, leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null));
leaderboard.getFleet(null)); leaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace */ true, leaderboard.getFleet(null));
leaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace */ true, EmptyRaceLogStore.INSTANCE,
leaderboard.getFleet(null));
leaderboard.getScoreCorrection().setMaxPointsReason(competitor, leaderboard.getRaceColumnByName(raceColumnName2), maxPointsReason); leaderboard.getScoreCorrection().setMaxPointsReason(competitor, leaderboard.getRaceColumnByName(raceColumnName2), maxPointsReason);
new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard);
FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null);
// attach tracked race to leaderboard to ensure that competitor object is assigned properly // attach tracked race to leaderboard to ensure that competitor object is assigned properly
RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false, RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
assertEquals(leaderboardName, loadedLeaderboard.getName()); assertEquals(leaderboardName, loadedLeaderboard.getName());
assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); assertFalse(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1));
assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2)); assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn2));
@@ -256,18 +246,18 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true);
TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true);
leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false, leaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
leaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace */ true, leaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace */ true,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
leaderboard.getScoreCorrection().correctScore(competitor, leaderboard.getRaceColumnByName(raceColumnName1), correctedPoints); leaderboard.getScoreCorrection().correctScore(competitor, leaderboard.getRaceColumnByName(raceColumnName1), correctedPoints);
leaderboard.getScoreCorrection().setMaxPointsReason(competitor, leaderboard.getRaceColumnByName(raceColumnName2), maxPointsReason); leaderboard.getScoreCorrection().setMaxPointsReason(competitor, leaderboard.getRaceColumnByName(raceColumnName2), maxPointsReason);
new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard);
FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); FlexibleLeaderboard loadedLeaderboard = (FlexibleLeaderboard) new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null);
// attach tracked race to leaderboard to ensure that competitor object is assigned properly // attach tracked race to leaderboard to ensure that competitor object is assigned properly
RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false, RaceColumn loadedColumn1 = loadedLeaderboard.addRace(raceWithOneCompetitor1, raceColumnName1, /* medalRace, ignored */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false, RaceColumn loadedColumn2 = loadedLeaderboard.addRace(raceWithOneCompetitor2, raceColumnName2, /* medalRace, ignored */ false,
EmptyRaceLogStore.INSTANCE, leaderboard.getFleet(null)); leaderboard.getFleet(null));
assertEquals(leaderboardName, loadedLeaderboard.getName()); assertEquals(leaderboardName, loadedLeaderboard.getName());
assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1)); assertTrue(loadedLeaderboard.getScoreCorrection().isScoreCorrected(competitor, loadedColumn1));
assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.000000001); assertEquals(correctedPoints, (double) loadedLeaderboard.getScoreCorrection().getExplicitScoreCorrection(competitor, loadedColumn1), 0.000000001);
@@ -19,7 +19,6 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.racelog.RaceLog; import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEventFactory; import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.racelog.RaceLogRaceStatus;
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;
@@ -60,8 +59,7 @@ public class TestStoringAndRetrievingRaceLogsTest extends AbstractTracTracLiveTe
@Test @Test
public void testStoreAFewRaceLogEntries() throws UnknownHostException, MongoException, InterruptedException { public void testStoreAFewRaceLogEntries() throws UnknownHostException, MongoException, InterruptedException {
DomainFactory domainFactory = DomainFactory.INSTANCE; DomainFactory domainFactory = DomainFactory.INSTANCE;
Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null, Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
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, EmptyWindStore.INSTANCE,
@@ -27,7 +27,6 @@ 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.DynamicTrackedRace; import com.sap.sailing.domain.tracking.DynamicTrackedRace;
@@ -71,8 +70,7 @@ public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLive
@Test @Test
public void testStoreAFewWindEntries() throws UnknownHostException, MongoException, InterruptedException { public void testStoreAFewWindEntries() throws UnknownHostException, MongoException, InterruptedException {
DomainFactory domainFactory = DomainFactory.INSTANCE; DomainFactory domainFactory = DomainFactory.INSTANCE;
Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null, Regatta domainEvent = domainFactory.getOrCreateDefaultRegatta(getTracTracEvent(), /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
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, EmptyWindStore.INSTANCE,
@@ -1,73 +1,72 @@
package com.sap.sailing.server.gateway.serialization.impl.leaderboard; package com.sap.sailing.server.gateway.serialization.impl.leaderboard;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries; import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.SeriesData; import com.sap.sailing.domain.base.SeriesData;
import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore; import com.sap.sailing.server.gateway.serialization.ExtensionJsonSerializer;
import com.sap.sailing.server.gateway.serialization.ExtensionJsonSerializer; import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class SeriesDataOfLeaderboardExtensionSerializer extends ExtensionJsonSerializer<Leaderboard, SeriesData> {
public class SeriesDataOfLeaderboardExtensionSerializer extends ExtensionJsonSerializer<Leaderboard, SeriesData> { public static final String FIELD_SERIES = "series";
public static final String FIELD_SERIES = "series";
public SeriesDataOfLeaderboardExtensionSerializer(JsonSerializer<SeriesData> extensionSerializer) {
public SeriesDataOfLeaderboardExtensionSerializer(JsonSerializer<SeriesData> extensionSerializer) { super(extensionSerializer);
super(extensionSerializer); }
}
@Override
@Override public String getExtensionFieldName() {
public String getExtensionFieldName() { return FIELD_SERIES;
return FIELD_SERIES; }
}
@Override
@Override public Object serializeExtension(Leaderboard parent) {
public Object serializeExtension(Leaderboard parent) { Map<Series, List<RaceColumn>> seriesToRaceColumns = new HashMap<Series, List<RaceColumn>>();
Map<Series, List<RaceColumn>> seriesToRaceColumns = new HashMap<Series, List<RaceColumn>>();
Series defaultSeries = null;
Series defaultSeries = null; for (RaceColumn raceColumn : parent.getRaceColumns()) {
for (RaceColumn raceColumn : parent.getRaceColumns()) { if (raceColumn instanceof RaceColumnInSeries) {
if (raceColumn instanceof RaceColumnInSeries) { RaceColumnInSeries raceColumnInSeries = (RaceColumnInSeries) raceColumn;
RaceColumnInSeries raceColumnInSeries = (RaceColumnInSeries) raceColumn; insertSeriesIfNew(seriesToRaceColumns, raceColumnInSeries.getSeries()).add(raceColumnInSeries);
insertSeriesIfNew(seriesToRaceColumns, raceColumnInSeries.getSeries()).add(raceColumnInSeries); } else {
} else { if (defaultSeries == null) {
if (defaultSeries == null) { defaultSeries = new SeriesImpl(
defaultSeries = new SeriesImpl( "Default Series",
"Default Series", false,
false, Collections.<Fleet>singleton(new FleetImpl("Default Fleet")),
Collections.<Fleet>singleton(new FleetImpl("Default Fleet")), Collections.<String>emptyList(),
Collections.<String>emptyList(), null);
null, EmptyRaceLogStore.INSTANCE); insertSeriesIfNew(seriesToRaceColumns, defaultSeries);
insertSeriesIfNew(seriesToRaceColumns, defaultSeries); }
} seriesToRaceColumns.get(defaultSeries).add(raceColumn);
seriesToRaceColumns.get(defaultSeries).add(raceColumn); }
} }
}
JSONArray result = new JSONArray();
JSONArray result = new JSONArray(); for (Series series : seriesToRaceColumns.keySet()) {
for (Series series : seriesToRaceColumns.keySet()) { result.add(serialize(series));
result.add(serialize(series)); }
}
return result;
return result; }
}
private List<RaceColumn> insertSeriesIfNew(Map<Series, List<RaceColumn>> target, Series newSeries) {
private List<RaceColumn> insertSeriesIfNew(Map<Series, List<RaceColumn>> target, Series newSeries) { if (!target.containsKey(newSeries)) {
if (!target.containsKey(newSeries)) { target.put(newSeries, new ArrayList<RaceColumn>());
target.put(newSeries, new ArrayList<RaceColumn>()); }
} return target.get(newSeries);
return target.get(newSeries); }
} }
}
@@ -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;
@@ -118,8 +115,6 @@ public class AdminApp extends SailingServerHttpServlet {
private static final String PARAM_NAME_WINDSTORE = "windstore"; private static final String PARAM_NAME_WINDSTORE = "windstore";
private static final String PARAM_NAME_RACELOGSTORE = "racelogstore";
private static final String STORE_EMPTY = "empty"; private static final String STORE_EMPTY = "empty";
private static final String STORE_MONGO = "mongo"; private static final String STORE_MONGO = "mongo";
@@ -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 {
@@ -490,29 +485,12 @@ public class AdminApp extends SailingServerHttpServlet {
} }
return EmptyWindStore.INSTANCE; return EmptyWindStore.INSTANCE;
} }
private RaceLogStore getRaceLogStore(HttpServletRequest req) throws UnknownHostException, MongoException {
String raceLogStore = req.getParameter(PARAM_NAME_RACELOGSTORE);
if (raceLogStore != null) {
if (raceLogStore.equals(STORE_EMPTY)) {
return EmptyRaceLogStore.INSTANCE;
} else if (raceLogStore.equals(STORE_MONGO)) {
return MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(
MongoFactory.INSTANCE.getDefaultMongoObjectFactory(),
MongoFactory.INSTANCE.getDefaultDomainObjectFactory());
} else {
log("Couldn't find wind store "+raceLogStore+". Using EmptyWindStore instead.");
return EmptyRaceLogStore.INSTANCE;
}
}
return EmptyRaceLogStore.INSTANCE;
}
private void addRace(HttpServletRequest req, HttpServletResponse resp) throws MongoException, Exception { private void addRace(HttpServletRequest req, HttpServletResponse resp) throws MongoException, Exception {
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, getRaceLogStore(req)); getService().addTracTracRace(paramURL, liveURI, storedURI, getWindStore(req), /* timeoutInMilliseconds */ 60000);
} }
private void stopRace(HttpServletRequest req, HttpServletResponse resp) throws MalformedURLException, IOException, InterruptedException { private void stopRace(HttpServletRequest req, HttpServletResponse resp) throws MalformedURLException, IOException, InterruptedException {
@@ -22,7 +22,6 @@ import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
public class RegattaReplicationTest extends AbstractServerReplicationTest { public class RegattaReplicationTest extends AbstractServerReplicationTest {
@Test @Test
@@ -31,8 +30,7 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
final String boatClassName = "49er"; final String boatClassName = "49er";
final Iterable<Series> series = Collections.emptyList(); final Iterable<Series> series = Collections.emptyList();
Regatta masterRegatta = master.createRegatta(baseEventName, boatClassName, UUID.randomUUID(), series, Regatta masterRegatta = master.createRegatta(baseEventName, boatClassName, UUID.randomUUID(), series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
EmptyRaceLogStore.INSTANCE);
Thread.sleep(1000); Thread.sleep(1000);
Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta); assertNotNull(replicatedRegatta);
@@ -46,17 +44,13 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
final String boatClassName = "49er"; final String boatClassName = "49er";
final List<String> emptyRaceColumnNamesList = Collections.emptyList(); final List<String> emptyRaceColumnNamesList = Collections.emptyList();
Series qualification = new SeriesImpl("Qualification", /* isMedal */ false, Series qualification = new SeriesImpl("Qualification", /* isMedal */ false,
Arrays.asList(new Fleet[] { new FleetImpl("Yellow"), new FleetImpl("Blue") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null, Arrays.asList(new Fleet[] { new FleetImpl("Yellow"), new FleetImpl("Blue") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
Series finals = new SeriesImpl("Finals", /* isMedal */ false, Series finals = new SeriesImpl("Finals", /* isMedal */ false,
Arrays.asList(new Fleet[] { new FleetImpl("Gold", 1), new FleetImpl("Silver", 2) }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null, Arrays.asList(new Fleet[] { new FleetImpl("Gold", 1), new FleetImpl("Silver", 2) }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
Series medal = new SeriesImpl("Medal", /* isMedal */ true, Series medal = new SeriesImpl("Medal", /* isMedal */ true,
Arrays.asList(new Fleet[] { new FleetImpl("Medal") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null, Arrays.asList(new Fleet[] { new FleetImpl("Medal") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
EmptyRaceLogStore.INSTANCE);
Regatta masterRegatta = master.createRegatta(baseEventName, boatClassName, Regatta masterRegatta = master.createRegatta(baseEventName, boatClassName,
UUID.randomUUID(), Arrays.asList(new Series[] { qualification, finals, medal }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), UUID.randomUUID(), Arrays.asList(new Series[] { qualification, finals, medal }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT));
EmptyRaceLogStore.INSTANCE);
Thread.sleep(1000); Thread.sleep(1000);
Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName())); Regatta replicatedRegatta = replica.getRegatta(new RegattaName(masterRegatta.getName()));
assertNotNull(replicatedRegatta); assertNotNull(replicatedRegatta);
@@ -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 {
@@ -22,7 +22,6 @@ import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.HighPoint;
import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.racelog.impl.EmptyRaceLogStore;
import com.sap.sailing.domain.test.AbstractLeaderboardTest; import com.sap.sailing.domain.test.AbstractLeaderboardTest;
import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -71,15 +70,15 @@ public class LeaderboardDiscardingRulesTest {
Competitor hasso = AbstractLeaderboardTest.createCompetitor("Dr. Hasso Plattner"); Competitor hasso = AbstractLeaderboardTest.createCompetitor("Dr. Hasso Plattner");
final TrackedRace race1 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass); final TrackedRace race1 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass);
leaderboard.addRace(race1, "R1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race1, "R1", /* medalRace */ false, fleet);
final TrackedRace race2 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass); final TrackedRace race2 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass);
leaderboard.addRace(race2, "R2", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race2, "R2", /* medalRace */ false, fleet);
Competitor wolfgang = AbstractLeaderboardTest.createCompetitor("Wolfgang Hunger"); Competitor wolfgang = AbstractLeaderboardTest.createCompetitor("Wolfgang Hunger");
final TrackedRace race3 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 123, /* started */ true, boatClass); final TrackedRace race3 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 123, /* started */ true, boatClass);
leaderboard.addRace(race3, "R3", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race3, "R3", /* medalRace */ false, fleet);
final TrackedRace race4 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 124, /* started */ true, boatClass); final TrackedRace race4 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 124, /* started */ true, boatClass);
leaderboard.addRace(race4, "R4", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race4, "R4", /* medalRace */ false, fleet);
leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R3"), 123.); leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R3"), 123.);
leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R4"), 123.); leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R4"), 123.);
@@ -111,19 +110,19 @@ public class LeaderboardDiscardingRulesTest {
Competitor rasmus = AbstractLeaderboardTest.createCompetitor("Rasmus"); Competitor rasmus = AbstractLeaderboardTest.createCompetitor("Rasmus");
final TrackedRace race1 = new MockedTrackedRaceWithFixedRank(rasmus, /* rank */ 2, /* started */ true, boatClass); // score 2.0 final TrackedRace race1 = new MockedTrackedRaceWithFixedRank(rasmus, /* rank */ 2, /* started */ true, boatClass); // score 2.0
leaderboard.addRace(race1, "R1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race1, "R1", /* medalRace */ false, fleet);
final TrackedRace race2 = new MockedTrackedRaceWithFixedRank(rasmus, /* rank */ 2, /* started */ true, boatClass); // score 2.0 final TrackedRace race2 = new MockedTrackedRaceWithFixedRank(rasmus, /* rank */ 2, /* started */ true, boatClass); // score 2.0
leaderboard.addRace(race2, "R2", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race2, "R2", /* medalRace */ false, fleet);
Competitor jes = AbstractLeaderboardTest.createCompetitor("Jes"); Competitor jes = AbstractLeaderboardTest.createCompetitor("Jes");
final TrackedRace race3 = new MockedTrackedRaceWithFixedRank(jes, /* rank */ 2, /* started */ true, boatClass); // score 2.0 final TrackedRace race3 = new MockedTrackedRaceWithFixedRank(jes, /* rank */ 2, /* started */ true, boatClass); // score 2.0
leaderboard.addRace(race3, "R3", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race3, "R3", /* medalRace */ false, fleet);
final TrackedRace race4 = new MockedTrackedRaceWithFixedRank(jes, /* rank */ 3, /* started */ true, boatClass); // score 1.0 final TrackedRace race4 = new MockedTrackedRaceWithFixedRank(jes, /* rank */ 3, /* started */ true, boatClass); // score 1.0
leaderboard.addRace(race4, "R4", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race4, "R4", /* medalRace */ false, fleet);
Competitor nobody = AbstractLeaderboardTest.createCompetitor("Nobody"); Competitor nobody = AbstractLeaderboardTest.createCompetitor("Nobody");
final TrackedRace race5 = new MockedTrackedRaceWithFixedRank(nobody, /* rank */ 3, /* started */ true, boatClass); // score 1.0 final TrackedRace race5 = new MockedTrackedRaceWithFixedRank(nobody, /* rank */ 3, /* started */ true, boatClass); // score 1.0
leaderboard.addRace(race5, "R5", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race5, "R5", /* medalRace */ false, fleet);
leaderboard.getScoreCorrection().correctScore(rasmus, leaderboard.getRaceColumnByName("R3"), 2.0); leaderboard.getScoreCorrection().correctScore(rasmus, leaderboard.getRaceColumnByName("R3"), 2.0);
leaderboard.getScoreCorrection().correctScore(rasmus, leaderboard.getRaceColumnByName("R4"), 2.0); leaderboard.getScoreCorrection().correctScore(rasmus, leaderboard.getRaceColumnByName("R4"), 2.0);
@@ -156,15 +155,15 @@ public class LeaderboardDiscardingRulesTest {
Competitor hasso = AbstractLeaderboardTest.createCompetitor("Dr. Hasso Plattner"); Competitor hasso = AbstractLeaderboardTest.createCompetitor("Dr. Hasso Plattner");
final TrackedRace race1 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass); final TrackedRace race1 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass);
leaderboard.addRace(race1, "R1", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race1, "R1", /* medalRace */ false, fleet);
final TrackedRace race2 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass); final TrackedRace race2 = new MockedTrackedRaceWithFixedRank(hasso, /* rank */ 123, /* started */ true, boatClass);
leaderboard.addRace(race2, "R2", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race2, "R2", /* medalRace */ false, fleet);
Competitor wolfgang = AbstractLeaderboardTest.createCompetitor("Wolfgang Hunger"); Competitor wolfgang = AbstractLeaderboardTest.createCompetitor("Wolfgang Hunger");
final TrackedRace race3 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 123, /* started */ true, boatClass); final TrackedRace race3 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 123, /* started */ true, boatClass);
leaderboard.addRace(race3, "R3", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race3, "R3", /* medalRace */ false, fleet);
final TrackedRace race4 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 124, /* started */ true, boatClass); final TrackedRace race4 = new MockedTrackedRaceWithFixedRank(wolfgang, /* rank */ 124, /* started */ true, boatClass);
leaderboard.addRace(race4, "R4", /* medalRace */ false, EmptyRaceLogStore.INSTANCE, fleet); leaderboard.addRace(race4, "R4", /* medalRace */ false, fleet);
leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R3"), 123.); leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R3"), 123.);
leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R4"), 123.); leaderboard.getScoreCorrection().correctScore(hasso, leaderboard.getRaceColumnByName("R4"), 123.);
@@ -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;
@@ -62,8 +61,7 @@ public class RaceTrackerStartStopTest {
racingEventService = new RacingEventServiceImplMock(); racingEventService = new RacingEventServiceImplMock();
boatClass = new BoatClassImpl(BOATCLASSNAME, /* typicallyStartsUpwind */ true); boatClass = new BoatClassImpl(BOATCLASSNAME, /* typicallyStartsUpwind */ true);
regatta = new RegattaImpl(EVENTNAME, boatClass, /* trackedRegattaRegistry */ null, regatta = new RegattaImpl(EVENTNAME, boatClass, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), UUID.randomUUID(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), UUID.randomUUID());
EmptyRaceLogStore.INSTANCE);
racingEventService.getEventsByName().put(EVENTNAME, regatta); racingEventService.getEventsByName().put(EVENTNAME, regatta);
TrackedRegatta trackedRegatta1 = racingEventService.getOrCreateTrackedRegatta(regatta); TrackedRegatta trackedRegatta1 = racingEventService.getOrCreateTrackedRegatta(regatta);
racingEventService.getEventsByNameMap().put(EVENTNAME, regatta); racingEventService.getEventsByNameMap().put(EVENTNAME, regatta);
@@ -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
@@ -40,7 +40,7 @@ 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.RaceLogEvent; import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.RaceLogIdentifier;
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;
@@ -111,7 +111,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, RaceLogStore raceLogStore) Regatta addRegatta(URL jsonURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds)
throws MalformedURLException, FileNotFoundException, URISyntaxException, IOException, ParseException, throws MalformedURLException, FileNotFoundException, URISyntaxException, IOException, ParseException,
org.json.simple.parser.ParseException, Exception; org.json.simple.parser.ParseException, Exception;
@@ -132,12 +132,11 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* already being tracked, then regardless of the <code>windStore</code> selection the existing tracker will be used * already being tracked, then regardless of the <code>windStore</code> selection the existing tracker will be used
* and its race handle will be returned. A log message will indicate a potential wind store mismatch (based on * and its race handle will be returned. A log message will indicate a potential wind store mismatch (based on
* {@link WindStore#equals(Object)}). * {@link WindStore#equals(Object)}).
*
* @param timeoutInMilliseconds * @param timeoutInMilliseconds
* 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, RaceLogStore raceLogStore) RacesHandle addTracTracRace(URL paramURL, URI liveURI, URI storedURI, WindStore windStore, long timeoutInMilliseconds)
throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception; throws MalformedURLException, FileNotFoundException, URISyntaxException, Exception;
/** /**
@@ -154,7 +153,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;
/** /**
@@ -289,7 +288,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, RaceLogStore raceLogStore) boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds)
throws InterruptedException, UnknownHostException, throws InterruptedException, UnknownHostException,
IOException, ParseException, Exception; IOException, ParseException, Exception;
@@ -376,7 +375,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
Regatta getOrCreateRegatta(String regattaName, String boatClassName, Serializable id); Regatta getOrCreateRegatta(String regattaName, String boatClassName, Serializable id);
Regatta createRegatta(String baseName, String boatClassName, Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme, RaceLogStore raceLogStore); Regatta createRegatta(String baseName, String boatClassName, Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme);
/** /**
* Adds <code>raceDefinition</code> to the {@link Regatta} such that it will appear in {@link Regatta#getAllRaces()} * Adds <code>raceDefinition</code> to the {@link Regatta} such that it will appear in {@link Regatta#getAllRaces()}
@@ -497,6 +496,6 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
CourseArea getCourseArea(Serializable courseAreaId); CourseArea getCourseArea(Serializable courseAreaId);
void recordRaceLogEvent(String leaderboardName, String raceColumnName, String fleetName, RaceLogEvent event); void recordRaceLogEvent(RaceLogIdentifier identifier, RaceLogEvent event);
} }
@@ -71,11 +71,8 @@ import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
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.racelog.RaceColumnIdentifier;
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.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.racelog.impl.RaceColumnIdentifierImpl;
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;
@@ -118,7 +115,6 @@ import com.sap.sailing.server.operationaltransformation.CreateEvent;
import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace;
import com.sap.sailing.server.operationaltransformation.RecordCompetitorGPSFix; import com.sap.sailing.server.operationaltransformation.RecordCompetitorGPSFix;
import com.sap.sailing.server.operationaltransformation.RecordMarkGPSFix; import com.sap.sailing.server.operationaltransformation.RecordMarkGPSFix;
import com.sap.sailing.server.operationaltransformation.RecordRaceLogEvent;
import com.sap.sailing.server.operationaltransformation.RecordWindFix; import com.sap.sailing.server.operationaltransformation.RecordWindFix;
import com.sap.sailing.server.operationaltransformation.RemoveEvent; import com.sap.sailing.server.operationaltransformation.RemoveEvent;
import com.sap.sailing.server.operationaltransformation.RemoveWindFix; import com.sap.sailing.server.operationaltransformation.RemoveWindFix;
@@ -364,10 +360,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
if (leaderboard != null) { if (leaderboard != null) {
if (leaderboard instanceof FlexibleLeaderboard) { if (leaderboard instanceof FlexibleLeaderboard) {
// uses the default fleet as the single fleet for the new column // uses the default fleet as the single fleet for the new column
RaceColumnIdentifier columnIdentifier = new RaceColumnIdentifierImpl(leaderboardName, columnName);
RaceColumn result = ((FlexibleLeaderboard) leaderboard).addRaceColumn(columnName, medalRace, RaceColumn result = ((FlexibleLeaderboard) leaderboard).addRaceColumn(columnName, medalRace,
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory, columnIdentifier), leaderboard.getFleet(null));
leaderboard.getFleet(null));
updateStoredLeaderboard((FlexibleLeaderboard) leaderboard); updateStoredLeaderboard((FlexibleLeaderboard) leaderboard);
return result; return result;
} else { } else {
@@ -605,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;
} }
@@ -620,8 +613,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
public Regatta getOrCreateRegatta(String baseEventName, String boatClassName, Serializable id) { public Regatta getOrCreateRegatta(String baseEventName, String boatClassName, Serializable id) {
Regatta regatta = new RegattaImpl(baseEventName, getBaseDomainFactory().getOrCreateBoatClass( Regatta regatta = new RegattaImpl(baseEventName, getBaseDomainFactory().getOrCreateBoatClass(
boatClassName), this, com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), boatClassName), this, com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT),
RegattaImpl.getFullName(baseEventName, boatClassName), RegattaImpl.getFullName(baseEventName, boatClassName));
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory));
Regatta result = regattasByName.get(regatta.getName()); Regatta result = regattasByName.get(regatta.getName());
if (result == null) { if (result == null) {
result = regatta; result = regatta;
@@ -633,11 +625,11 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@Override @Override
public Regatta createRegatta(String baseEventName, String boatClassName, public Regatta createRegatta(String baseEventName, String boatClassName,
Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme, RaceLogStore raceLogStore) { Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme) {
Regatta regatta = new RegattaImpl(baseEventName, Regatta regatta = new RegattaImpl(baseEventName,
getBaseDomainFactory().getOrCreateBoatClass(boatClassName), series, persistent, scoringScheme, id); getBaseDomainFactory().getOrCreateBoatClass(boatClassName), series, persistent, scoringScheme, id);
logger.info("Created regatta " + regatta.getName() + " (" + hashCode() + ") on "+this); logger.info("Created regatta " + regatta.getName() + " (" + hashCode() + ") on "+this);
cacheAndReplicateSpecificRegattaWithoutRaceColumns(regatta, raceLogStore); cacheAndReplicateSpecificRegattaWithoutRaceColumns(regatta);
if (persistent) { if (persistent) {
updateStoredRegatta(regatta); updateStoredRegatta(regatta);
} }
@@ -667,20 +659,20 @@ 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, RaceLogStore raceLogStore) throws Exception { int port, boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds) 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, swissTimingAdapterPersistence, raceLogStore), windStore, timeoutInMilliseconds); swissTimingFactory, swissTimingDomainFactory, windStore, swissTimingAdapterPersistence), windStore, timeoutInMilliseconds);
} }
@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); timeoutInMilliseconds);
} }
@@ -771,14 +763,14 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
* the series of this regatta must not have any {@link Series#getRaceColumns() race columns associated * the series of this regatta must not have any {@link Series#getRaceColumns() race columns associated
* (yet)}. * (yet)}.
*/ */
private void cacheAndReplicateSpecificRegattaWithoutRaceColumns(Regatta regatta, RaceLogStore raceLogStore) { private void cacheAndReplicateSpecificRegattaWithoutRaceColumns(Regatta regatta) {
if (!regattasByName.containsKey(regatta.getName())) { if (!regattasByName.containsKey(regatta.getName())) {
logger.info("putting regatta "+regatta.getName()+" ("+regatta.hashCode()+") into regattasByName of "+this); logger.info("putting regatta "+regatta.getName()+" ("+regatta.hashCode()+") into regattasByName of "+this);
regattasByName.put(regatta.getName(), regatta); regattasByName.put(regatta.getName(), regatta);
regatta.addRegattaListener(this); regatta.addRegattaListener(this);
replicate(new AddSpecificRegatta(regatta.getBaseName(), regatta.getBoatClass() == null ? null : regatta replicate(new AddSpecificRegatta(regatta.getBaseName(), regatta.getBoatClass() == null ? null : regatta
.getBoatClass().getName(), regatta.getId(), getSeriesWithoutRaceColumnsConstructionParametersAsMap(regatta), .getBoatClass().getName(), regatta.getId(), getSeriesWithoutRaceColumnsConstructionParametersAsMap(regatta),
regatta.isPersistent(), regatta.getScoringScheme(), raceLogStore)); regatta.isPersistent(), regatta.getScoringScheme()));
RegattaIdentifier regattaIdentifier = regatta.getRegattaIdentifier(); RegattaIdentifier regattaIdentifier = regatta.getRegattaIdentifier();
for (RaceDefinition race : regatta.getAllRaces()) { for (RaceDefinition race : regatta.getAllRaces()) {
replicate(new AddRaceDefinition(regattaIdentifier, race)); replicate(new AddRaceDefinition(regattaIdentifier, race));
@@ -831,9 +823,9 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
@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, RaceLogStore raceLogStore) throws Exception { WindStore windStore, long timeoutInMilliseconds, boolean simulateWithStartTimeNow) 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);
} }
private void ensureRegattaIsObservedForDefaultLeaderboardAndAutoLeaderboardLinking(DynamicTrackedRegatta trackedRegatta) { private void ensureRegattaIsObservedForDefaultLeaderboardAndAutoLeaderboardLinking(DynamicTrackedRegatta trackedRegatta) {
@@ -889,10 +881,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
final FlexibleLeaderboard defaultLeaderboard = (FlexibleLeaderboard) leaderboardsByName.get(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME); final FlexibleLeaderboard defaultLeaderboard = (FlexibleLeaderboard) leaderboardsByName.get(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME);
if (defaultLeaderboard != null) { if (defaultLeaderboard != null) {
String columnName = trackedRace.getRace().getName(); String columnName = trackedRace.getRace().getName();
RaceColumnIdentifier columnIdentifier = new RaceColumnIdentifierImpl(defaultLeaderboard.getName(), columnName);
defaultLeaderboard.addRace(trackedRace, columnName, /* medalRace */false, defaultLeaderboard.addRace(trackedRace, columnName, /* medalRace */false,
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory, columnIdentifier), defaultLeaderboard.getFleet(null));
defaultLeaderboard.getFleet(null));
} }
TrackedRaceReplicator trackedRaceReplicator = new TrackedRaceReplicator(trackedRace); TrackedRaceReplicator trackedRaceReplicator = new TrackedRaceReplicator(trackedRace);
trackedRaceReplicators.put(trackedRace, trackedRaceReplicator); trackedRaceReplicators.put(trackedRace, trackedRaceReplicator);
@@ -1654,9 +1644,9 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
} }
@Override @Override
public void recordRaceLogEvent(String leaderboardName, String raceColumnName, String fleetName, RaceLogEvent event) { public void recordRaceLogEvent(RaceLogIdentifier identifier, RaceLogEvent event) {
RecordRaceLogEvent command = new RecordRaceLogEvent(leaderboardName, raceColumnName, fleetName, event); //RaceLog raceLog = getRaceLog(identifier);
apply(command); //raceLog.add(event);
} }
} }
@@ -3,18 +3,14 @@ package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.base.RaceColumnInSeries; import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation; import com.sap.sailing.server.RacingEventServiceOperation;
public class AddColumnToSeries extends AbstractColumnInSeriesOperation<RaceColumnInSeries> { public class AddColumnToSeries extends AbstractColumnInSeriesOperation<RaceColumnInSeries> {
private static final long serialVersionUID = 8987540636040301063L; private static final long serialVersionUID = 8987540636040301063L;
private RaceLogStore raceLogStore; public AddColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) {
public AddColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName, RaceLogStore raceLogStore) {
super(regattaIdentifier, seriesName, columnName); super(regattaIdentifier, seriesName, columnName);
this.raceLogStore = raceLogStore;
} }
@Override @Override
@@ -22,7 +18,7 @@ public class AddColumnToSeries extends AbstractColumnInSeriesOperation<RaceColum
RaceColumnInSeries result = null; RaceColumnInSeries result = null;
Series series = getSeries(toState); Series series = getSeries(toState);
if (series != null) { if (series != null) {
result = series.addRaceColumn(getColumnName(), toState, raceLogStore); result = series.addRaceColumn(getColumnName(), toState);
if(result != null && series.getRegatta().isPersistent()) { if(result != null && series.getRegatta().isPersistent()) {
toState.updateStoredRegatta(series.getRegatta()); toState.updateStoredRegatta(series.getRegatta());
} }
@@ -15,7 +15,6 @@ import com.sap.sailing.domain.common.Color;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.domain.common.impl.Util.Triple;
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.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation; import com.sap.sailing.server.RacingEventServiceOperation;
@@ -25,22 +24,20 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation {
private final Map<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> seriesNamesWithFleetNamesAndFleetOrderingAndMedal; private final Map<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> seriesNamesWithFleetNamesAndFleetOrderingAndMedal;
private final boolean persistent; private final boolean persistent;
private final ScoringScheme scoringScheme; private final ScoringScheme scoringScheme;
private final RaceLogStore raceLogStore;
public AddSpecificRegatta(String regattaName, String boatClassName, Serializable id, public AddSpecificRegatta(String regattaName, String boatClassName, Serializable id,
Map<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> seriesNamesWithFleetNamesAndFleetOrdering, Map<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> seriesNamesWithFleetNamesAndFleetOrdering,
boolean persistent, ScoringScheme scoringScheme, RaceLogStore raceLogStore) { boolean persistent, ScoringScheme scoringScheme) {
super(regattaName, boatClassName, id); super(regattaName, boatClassName, id);
this.seriesNamesWithFleetNamesAndFleetOrderingAndMedal = seriesNamesWithFleetNamesAndFleetOrdering; this.seriesNamesWithFleetNamesAndFleetOrderingAndMedal = seriesNamesWithFleetNamesAndFleetOrdering;
this.persistent = persistent; this.persistent = persistent;
this.scoringScheme = scoringScheme; this.scoringScheme = scoringScheme;
this.raceLogStore = raceLogStore;
} }
@Override @Override
public Regatta internalApplyTo(RacingEventService toState) throws Exception { public Regatta internalApplyTo(RacingEventService toState) throws Exception {
return toState.createRegatta(getBaseEventName(), getBoatClassName(), getId(), createSeries(toState), return toState.createRegatta(getBaseEventName(), getBoatClassName(), getId(), createSeries(toState),
persistent, scoringScheme, raceLogStore); persistent, scoringScheme);
} }
private Iterable<? extends Series> createSeries(TrackedRegattaRegistry trackedRegattaRegistry) { private Iterable<? extends Series> createSeries(TrackedRegattaRegistry trackedRegattaRegistry) {
@@ -48,7 +45,7 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation {
for (Map.Entry<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> e : seriesNamesWithFleetNamesAndFleetOrderingAndMedal.entrySet()) { for (Map.Entry<String, Pair<List<Triple<String, Integer, Color>>, Boolean>> e : seriesNamesWithFleetNamesAndFleetOrderingAndMedal.entrySet()) {
final List<String> emptyRaceColumnNamesList = Collections.emptyList(); final List<String> emptyRaceColumnNamesList = Collections.emptyList();
Series s = new SeriesImpl(e.getKey(), /* isMedal */e.getValue().getB(), createFleets(e.getValue().getA()), Series s = new SeriesImpl(e.getKey(), /* isMedal */e.getValue().getB(), createFleets(e.getValue().getA()),
emptyRaceColumnNamesList, trackedRegattaRegistry, raceLogStore); emptyRaceColumnNamesList, trackedRegattaRegistry);
result.add(s); result.add(s);
} }
return result; return result;
@@ -28,7 +28,6 @@ public class RecordRaceLogEvent extends AbstractRacingEventServiceOperation<Void
Leaderboard leaderboard = toState.getLeaderboardByName(leaderboardName); Leaderboard leaderboard = toState.getLeaderboardByName(leaderboardName);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
Fleet fleet = raceColumn.getFleetByName(fleetName); Fleet fleet = raceColumn.getFleetByName(fleetName);
raceColumn.recordRaceLogEvent(leaderboardName, fleet, event);
return null; return null;
} }