passed boat class (now sometimes known and not always part of the raceId anymore) through the call hierachy of the swisstiming tracking classes to use it in the DomainFactory for the regatta and race defintion creation

This commit is contained in:
fmittag committed 2014-03-22 14:22:48 +01:00
1 parent 60f2e2a10b
commit c6bc13dcf7
20 files changed
+149 -91

No files matched your search

@@ -2,6 +2,7 @@ package com.sap.sailing.domain.swisstimingadapter;
import java.util.List;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course;
@@ -29,17 +30,15 @@ public interface DomainFactory {
com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory();
Regatta getOrCreateDefaultRegatta(RaceLogStore raceLogStore, String raceID, TrackedRegattaRegistry trackedRegattaRegistry);
Regatta getOrCreateDefaultRegatta(RaceLogStore raceLogStore, String raceID, BoatClass boatClass, TrackedRegattaRegistry trackedRegattaRegistry);
Nationality getOrCreateNationality(String threeLetterIOCCode);
Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, RaceType raceType);
Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, String raceId, BoatClass boatClass);
Competitor getOrCreateCompetitor(String boatID, String threeLetterIOCCode, String name, RaceType raceType);
Competitor getOrCreateCompetitor(String boatID, String threeLetterIOCCode, String name, String raceId, BoatClass boatClass);
Competitor getCompetitorByBoatIDAndRaceType(String boatID, RaceType raceType);
Competitor getCompetitorByBoatIDAndRaceID(String boatID, String raceID);
Competitor getCompetitorByBoatIDAndRaceIDOrBoatClass(String boatID, String raceID, BoatClass boatClass);
RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, com.sap.sailing.domain.swisstimingadapter.Course course);
@@ -52,13 +51,13 @@ public interface DomainFactory {
MarkPassing createMarkPassing(TimePoint timePoint, Waypoint waypoint, Competitor competitor);
void removeRace(String raceID);
RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
String raceDescription, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, RaceLogStore raceLogStore);
RaceType getRaceTypeFromRaceID(String raceID);
RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
String raceDescription, BoatClass boatClass, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, RaceLogStore raceLogStore);
ControlPoint getOrCreateControlPoint(Iterable<String> devices);
RaceDefinition createRaceDefinition(Regatta regatta, String raceID, Iterable<Competitor> competitors,
@@ -1,6 +1,9 @@
package com.sap.sailing.domain.swisstimingadapter;
import com.sap.sailing.domain.base.BoatClass;
public interface Race extends WithDescription {
String getRaceID();
BoatClass getBoatClass();
}
@@ -5,6 +5,7 @@ import java.net.UnknownHostException;
import java.text.ParseException;
import java.util.List;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.tracking.RacesHandle;
@@ -23,7 +24,7 @@ public interface SwissTimingAdapter {
* @param raceDescription TODO
*/
RacesHandle addSwissTimingRace(TrackerManager trackerManager, RegattaIdentifier regattaToAddTo, String raceID, String raceDescription,
String hostname, int port, RaceLogStore logStore, long timeoutInMilliseconds)
BoatClass boatClass, String hostname, int port, RaceLogStore logStore, long timeoutInMilliseconds)
throws InterruptedException, UnknownHostException, IOException, ParseException, Exception;
SwissTimingFactory getSwissTimingFactory();
@@ -4,6 +4,7 @@ import java.io.IOException;
import java.net.UnknownHostException;
import java.text.ParseException;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingFactoryImpl;
@@ -37,26 +38,26 @@ public interface SwissTimingFactory {
* {@link MessageType#isRaceSpecific() Race-specific messages} for other races are ignored and not forwarded to any
* listener.
*/
SailMasterConnector getOrCreateSailMasterConnector(String hostname, int port, String raceId, String raceDescription)
SailMasterConnector getOrCreateSailMasterConnector(String hostname, int port, String raceId, String raceDescription, BoatClass boatClass)
throws InterruptedException, ParseException;
SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, String raceId,
String raceDescription) throws InterruptedException, ParseException;
String raceDescription, BoatClass boatClass) throws InterruptedException, ParseException;
SailMasterTransceiver createSailMasterTransceiver();
SwissTimingConfiguration createSwissTimingConfiguration(String name, String jsonURL, String hostname, int port);
SwissTimingRaceTracker createRaceTracker(String raceID, String raceDescription, String hostname, int port,
SwissTimingRaceTracker createRaceTracker(String raceID, String raceDescription, BoatClass boatClass, String hostname, int port,
long delayToLiveInMillis, RaceLogStore raceLogStore, WindStore windStore,
DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException, UnknownHostException,
IOException, ParseException;
RaceTracker createRaceTracker(Regatta regatta, String raceID, String raceDescription, String hostname, int port, long delayToLiveInMillis,
RaceTracker createRaceTracker(Regatta regatta, String raceID, String raceDescription, BoatClass boatClass, String hostname, int port, long delayToLiveInMillis,
WindStore windStore, DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException, InterruptedException,
IOException, ParseException;
Race createRace(String raceId, String description);
Race createRace(String raceId, String description, BoatClass boatClass);
SailMasterMessage createMessage(String message);
@@ -90,13 +90,14 @@ public class DomainFactoryImpl implements DomainFactory {
}
@Override
public Regatta getOrCreateDefaultRegatta(RaceLogStore raceLogStore, String raceID, TrackedRegattaRegistry trackedRegattaRegistry) {
public Regatta getOrCreateDefaultRegatta(RaceLogStore raceLogStore, String raceID, BoatClass boatClass, TrackedRegattaRegistry trackedRegattaRegistry) {
Regatta result = trackedRegattaRegistry.getRememberedRegattaForRace(raceID);
if (result == null) {
result = raceIDToRegattaCache.get(raceID);
}
if (result == null) {
result = new RegattaImpl(raceLogStore, raceID, getRaceTypeFromRaceID(raceID).getBoatClass(), trackedRegattaRegistry,
BoatClass regattaBoatClass = boatClass != null ? boatClass : getRaceTypeFromRaceID(raceID).getBoatClass();
result = new RegattaImpl(raceLogStore, raceID, regattaBoatClass, trackedRegattaRegistry,
getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), raceID, null);
logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")");
raceIDToRegattaCache.put(raceID, result);
@@ -104,47 +105,70 @@ public class DomainFactoryImpl implements DomainFactory {
return result;
}
@Override
public Competitor getCompetitorByBoatIDAndRaceType(String boatID, RaceType raceType) {
private Competitor getCompetitorByBoatIDAndRaceType(String boatID, RaceType raceType) {
return baseDomainFactory.getExistingCompetitorById(getCompetitorID(boatID, raceType));
}
private Competitor getCompetitorByBoatIDAndBoatClass(String boatID, BoatClass boatClass) {
return baseDomainFactory.getExistingCompetitorById(getCompetitorID(boatID, boatClass));
}
@Override
public Competitor getCompetitorByBoatIDAndRaceID(String boatID, String raceID) {
RaceType raceType = getRaceTypeFromRaceID(raceID);
if (raceType != null) {
return getCompetitorByBoatIDAndRaceType(boatID, raceType);
public Competitor getCompetitorByBoatIDAndRaceIDOrBoatClass(String boatID, String raceID, BoatClass boatClass) {
Competitor result = null;
if(boatClass != null) {
result = getCompetitorByBoatIDAndBoatClass(boatID, boatClass);
} else {
return null;
RaceType raceType = getRaceTypeFromRaceID(raceID);
if (raceType != null) {
result = getCompetitorByBoatIDAndRaceType(boatID, raceType);
}
}
return result;
}
private String getCompetitorID(String boatID, String raceId, BoatClass boatClass) {
String result = null;
if(boatClass != null) {
result = getCompetitorID(boatID, boatClass);
} else {
RaceType raceType = getRaceTypeFromRaceID(raceId);
if (raceType != null) {
result = getCompetitorID(boatID, raceType);
}
}
return result;
}
private String getCompetitorID(String boatID, RaceType raceType) {
return boatID + "/" + raceType.getRaceCode();
}
private String getCompetitorID(String boatID, BoatClass boatClass) {
return boatID + "/" + boatClass.getName();
}
@Override
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, RaceType raceType) {
Competitor result = getCompetitorByBoatIDAndRaceType(competitor.getBoatID(), raceType);
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, String raceId, BoatClass boatClass) {
Competitor result = getCompetitorByBoatIDAndRaceIDOrBoatClass(competitor.getBoatID(), raceId, boatClass);
CompetitorStore competitorStore = baseDomainFactory.getCompetitorStore();
if (result == null || competitorStore.isCompetitorToUpdateDuringGetOrCreate(result)) {
DynamicBoat boat = new BoatImpl(competitor.getName(), raceType.getBoatClass(), competitor.getBoatID());
DynamicBoat boat = new BoatImpl(competitor.getName(), boatClass, competitor.getBoatID());
List<DynamicPerson> teamMembers = new ArrayList<DynamicPerson>();
for (String teamMemberName : competitor.getName().split("[-+&]")) {
teamMembers.add(new PersonImpl(teamMemberName.trim(), getOrCreateNationality(competitor.getThreeLetterIOCCode()),
/* dateOfBirth */ null, teamMemberName.trim()));
}
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = competitorStore.getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceType),
result = competitorStore.getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceId, boatClass),
competitor.getName(), null /*displayColor*/, team, boat);
}
return result;
}
@Override
public Competitor getOrCreateCompetitor(String boatID, String threeLetterIOCCode, String name,
RaceType raceType) {
return getOrCreateCompetitor(new CompetitorImpl(boatID, threeLetterIOCCode, name), raceType);
public Competitor getOrCreateCompetitor(String boatID, String threeLetterIOCCode, String name, String raceId, BoatClass boatClass) {
return getOrCreateCompetitor(new CompetitorImpl(boatID, threeLetterIOCCode, name), raceId, boatClass);
}
@Override
@@ -166,11 +190,10 @@ public class DomainFactoryImpl implements DomainFactory {
@Override
public RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, Course course) {
com.sap.sailing.domain.base.Course domainCourse = createCourse(race.getDescription(), course);
RaceType raceType = getRaceTypeFromRaceID(race.getRaceID());
Iterable<Competitor> competitors = createCompetitorList(startList, raceType);
Iterable<Competitor> competitors = createCompetitorList(startList, race.getRaceID(), race.getBoatClass());
logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID());
RaceDefinition result = new RaceDefinitionImpl(race.getRaceID(), domainCourse,
raceType.getBoatClass(), competitors);
BoatClass boatClass = race.getBoatClass() != null ? race.getBoatClass() : getRaceTypeFromRaceID(race.getRaceID()).getBoatClass();
RaceDefinition result = new RaceDefinitionImpl(race.getRaceID(), domainCourse, boatClass, competitors);
regatta.addRace(result);
return result;
}
@@ -220,10 +243,10 @@ public class DomainFactoryImpl implements DomainFactory {
return result;
}
private Iterable<Competitor> createCompetitorList(StartList startList, RaceType raceType) {
private Iterable<Competitor> createCompetitorList(StartList startList, String raceId, BoatClass boatClass) {
List<Competitor> result = new ArrayList<Competitor>();
for (com.sap.sailing.domain.swisstimingadapter.Competitor swissTimingCompetitor : startList.getCompetitors()) {
Competitor domainCompetitor = getOrCreateCompetitor(swissTimingCompetitor, raceType);
Competitor domainCompetitor = getOrCreateCompetitor(swissTimingCompetitor, raceId, boatClass);
result.add(domainCompetitor);
}
return result;
@@ -326,9 +349,9 @@ public class DomainFactoryImpl implements DomainFactory {
@Override
public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
String raceDescription, long delayToLiveInMillis,
String raceDescription, BoatClass boatClass, long delayToLiveInMillis,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, RaceLogStore raceLogStore) {
return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, raceDescription, delayToLiveInMillis,
return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, raceDescription, boatClass, delayToLiveInMillis,
swissTimingFactory, domainFactory, raceLogStore);
}
@@ -1,15 +1,21 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.swisstimingadapter.Race;
public class RaceImpl implements Race {
private final String description;
private final String raceId;
private final BoatClass boatClass;
public RaceImpl(String raceId, String description) {
super();
public RaceImpl(String raceId, String description, BoatClass boatClass) {
this.raceId = raceId;
this.description = description;
this.boatClass = boatClass;
}
public RaceImpl(String raceId, String description) {
this(raceId, description, null);
}
@Override
@@ -21,4 +27,9 @@ public class RaceImpl implements Race {
public String getRaceID() {
return raceId;
}
@Override
public BoatClass getBoatClass() {
return boatClass;
}
}
@@ -26,6 +26,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Speed;
@@ -92,6 +93,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
private boolean connected;
private final String raceId;
private final String raceDescription;
private final BoatClass boatClass;
/**
* Currently the SwissTiming SailMaster protocol only transmits time zone information when sending
@@ -119,11 +121,12 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
private Long numberOfStoredMessages;
public SailMasterConnectorImpl(String host, int port, String raceId, String raceDescription) throws InterruptedException, ParseException {
public SailMasterConnectorImpl(String host, int port, String raceId, String raceDescription, BoatClass boatClass) throws InterruptedException, ParseException {
super();
maxSequenceNumber = -1l;
this.raceId = raceId; // from this time on, the connector interprets messages for raceID
this.raceDescription = raceDescription;
this.boatClass = boatClass;
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
this.host = host;
this.port = port;
@@ -516,7 +519,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
@Override
public Race getRace() {
return new RaceImpl(raceId, raceDescription);
return new RaceImpl(raceId, raceDescription, boatClass);
}
private List<Race> parseAvailableRacesMessage(SailMasterMessage availableRacesMessage) {
@@ -525,7 +528,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
List<Race> result = new ArrayList<Race>();
for (int i=0; i<count; i++) {
String[] idAndDescription = availableRacesMessage.getSections()[2+i].split(";");
result.add(new RaceImpl(idAndDescription[0], idAndDescription[1]));
result.add(new RaceImpl(idAndDescription[0], idAndDescription[1], boatClass));
}
return result;
}
@@ -5,6 +5,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
public class SailMasterLiveSimulatorConnectorImpl extends SailMasterConnectorImpl {
@@ -12,9 +13,9 @@ public class SailMasterLiveSimulatorConnectorImpl extends SailMasterConnectorImp
private long messageDeliveryIntervalInMs = Long.valueOf(System.getProperty("simulateLiveMode.delayInMillis", "250"));
public SailMasterLiveSimulatorConnectorImpl(String host, int port, String raceId, String raceDescription)
public SailMasterLiveSimulatorConnectorImpl(String host, int port, String raceId, String raceDescription, BoatClass boatClass)
throws InterruptedException, ParseException {
super(host, port, raceId, raceDescription);
super(host, port, raceId, raceDescription, boatClass);
bufferedMessageList = Collections.synchronizedList(new ArrayList<SailMasterMessage>());
Thread messageDeliveryThread = new Thread("SailMasterLiveSimulatorConnector") {
public void run() {
@@ -6,6 +6,7 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.racelog.RaceLogStore;
@@ -46,10 +47,10 @@ public class SwissTimingAdapterImpl implements SwissTimingAdapter {
@Override
public RacesHandle addSwissTimingRace(TrackerManager trackerManager, RegattaIdentifier regattaToAddTo, String raceID, String raceDescription,
String hostname, int port, RaceLogStore logStore, long timeoutInMilliseconds)
BoatClass boatClass, String hostname, int port, RaceLogStore logStore, long timeoutInMilliseconds)
throws Exception {
return trackerManager.addRace(regattaToAddTo, swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port,
raceID, raceDescription, TrackedRace.DEFAULT_LIVE_DELAY_IN_MILLISECONDS, swissTimingFactory,
raceID, raceDescription, boatClass, TrackedRace.DEFAULT_LIVE_DELAY_IN_MILLISECONDS, swissTimingFactory,
swissTimingDomainFactory, logStore),
timeoutInMilliseconds);
}
@@ -7,6 +7,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.racelog.RaceLogStore;
@@ -40,9 +41,9 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
@Override
public SailMasterConnector getOrCreateSailMasterConnector(String host, int port, String raceId,
String raceDescription) throws InterruptedException, ParseException {
String raceDescription, BoatClass boatClass) throws InterruptedException, ParseException {
if (Boolean.valueOf(System.getProperty("simulateLiveMode", "false"))) {
return getOrCreateSailMasterLiveSimulatorConnector(host, port, raceId, raceDescription);
return getOrCreateSailMasterLiveSimulatorConnector(host, port, raceId, raceDescription, boatClass);
} else {
Triple<String, Integer, String> key = new Triple<String, Integer, String>(host, port, raceId);
SailMasterConnector result = connectors.get(key);
@@ -52,7 +53,7 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
} else {
logger.info("Creating a new connector for "+key+" because the old one was stopped");
}
result = new SailMasterConnectorImpl(host, port, raceId, raceDescription);
result = new SailMasterConnectorImpl(host, port, raceId, raceDescription, boatClass);
connectors.put(key, result);
// TODO how do connectors get stopped, terminated and removed from the connectors map again?
} else {
@@ -64,15 +65,15 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
@Override
public SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, String raceId,
String raceDescription) throws InterruptedException, ParseException {
String raceDescription, BoatClass boatClass) throws InterruptedException, ParseException {
Triple<String, Integer, String> key = new Triple<>(host, port, raceId);
SailMasterConnector result = connectors.get(key);
if (result == null) {
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription);
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription, boatClass);
connectors.put(key, result);
// TODO how do connectors get stopped, terminated and removed from the connectors map again?
} else if (result.isStopped()) {
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription);
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription, boatClass);
connectors.put(key, result);
}
return result;
@@ -84,20 +85,20 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
}
@Override
public SwissTimingRaceTracker createRaceTracker(String raceID, String raceDescription, String hostname, int port,
public SwissTimingRaceTracker createRaceTracker(String raceID, String raceDescription, BoatClass boatClass, String hostname, int port,
long delayToLiveInMillis, RaceLogStore raceLogStore, WindStore windStore, DomainFactory domainFactory,
TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException,
UnknownHostException, IOException, ParseException {
return new SwissTimingRaceTrackerImpl(raceID, raceDescription, hostname, port, raceLogStore, windStore, domainFactory, this,
return new SwissTimingRaceTrackerImpl(raceID, raceDescription, boatClass, hostname, port, raceLogStore, windStore, domainFactory, this,
trackedRegattaRegistry, delayToLiveInMillis);
}
@Override
public RaceTracker createRaceTracker(Regatta regatta, String raceID, String raceDescription, String hostname,
public RaceTracker createRaceTracker(Regatta regatta, String raceID, String raceDescription, BoatClass boatClass, String hostname,
int port, long delayToLiveInMillis, WindStore windStore, DomainFactory domainFactory,
TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException,
InterruptedException, IOException, ParseException {
return new SwissTimingRaceTrackerImpl(regatta, raceID, raceDescription, hostname, port, windStore, domainFactory,
return new SwissTimingRaceTrackerImpl(regatta, raceID, raceDescription, boatClass, hostname, port, windStore, domainFactory,
this, trackedRegattaRegistry, delayToLiveInMillis);
}
@@ -112,8 +113,8 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
}
@Override
public Race createRace(String raceId, String description) {
return new RaceImpl(raceId, description);
public Race createRace(String raceId, String description, BoatClass boatClass) {
return new RaceImpl(raceId, description, boatClass);
}
@Override
@@ -13,6 +13,7 @@ import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -60,6 +61,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
private final SailMasterConnector connector;
private final String raceID;
private final String raceDescription;
private final BoatClass boatClass;
private final DomainFactory domainFactory;
private final Triple<String, String, Integer> id;
private final Regatta regatta;
@@ -86,26 +88,27 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
*/
private final TMDMessageQueue tmdMessageQueue;
protected SwissTimingRaceTrackerImpl(String raceID, String raceDescription, String hostname, int port, RaceLogStore raceLogStore,
protected SwissTimingRaceTrackerImpl(String raceID, String raceDescription, BoatClass boatClass, String hostname, int port, RaceLogStore raceLogStore,
WindStore windStore, DomainFactory domainFactory, SwissTimingFactory factory,
TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis) throws InterruptedException,
UnknownHostException, IOException, ParseException {
this(domainFactory.getOrCreateDefaultRegatta(raceLogStore, raceID, trackedRegattaRegistry), raceID,
raceDescription, hostname, port, windStore, domainFactory, factory, trackedRegattaRegistry,
this(domainFactory.getOrCreateDefaultRegatta(raceLogStore, raceID, boatClass, trackedRegattaRegistry), raceID,
raceDescription, boatClass, hostname, port, windStore, domainFactory, factory, trackedRegattaRegistry,
delayToLiveInMillis);
}
protected SwissTimingRaceTrackerImpl(Regatta regatta, String raceID, String raceDescription, String hostname, int port,
protected SwissTimingRaceTrackerImpl(Regatta regatta, String raceID, String raceDescription, BoatClass boatClass, String hostname, int port,
WindStore windStore, DomainFactory domainFactory, SwissTimingFactory factory,
TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis) throws InterruptedException,
UnknownHostException, IOException, ParseException {
super();
this.tmdMessageQueue = new TMDMessageQueue(this);
this.regatta = regatta;
this.connector = factory.getOrCreateSailMasterConnector(hostname, port, raceID, raceDescription);
this.connector = factory.getOrCreateSailMasterConnector(hostname, port, raceID, raceDescription, boatClass);
this.domainFactory = domainFactory;
this.raceID = raceID;
this.raceDescription = raceDescription;
this.boatClass = boatClass;
this.windStore = windStore;
this.id = createID(raceID, hostname, port);
connector.addSailMasterListener(this);
@@ -231,8 +234,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
trackedRace.recordFix(mark, gpsFix);
break;
case COMPETITOR:
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceID(
fix.getBoatID(), raceID);
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceIDOrBoatClass(
fix.getBoatID(), raceID, boatClass);
DynamicGPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
competitorTrack.addGPSFix(gpsFix);
break;
@@ -257,8 +260,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
List<Triple<Integer, Integer, Long>> markIndicesRanksAndTimesSinceStartInMilliseconds) {
assert this.raceID.equals(raceID);
if (isTrackedRaceStillReachable()) {
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceID(boatID,
raceID);
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID,
raceID, boatClass);
// the list of mark indices and time stamps is partial and usually only shows the last mark passing;
// we need to use this to *update* the competitor's mark passings list, not *replace* it
TreeMap<Integer, MarkPassing> markPassingsByMarkIndex = new TreeMap<Integer, MarkPassing>();
@@ -286,7 +289,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
MillisecondsTimePoint timePoint = new MillisecondsTimePoint(
startTime.asMillis() + markIndexRankAndTimeSinceStartInMilliseconds.getC());
MarkPassing markPassing = domainFactory.createMarkPassing(timePoint, waypoint,
domainFactory.getCompetitorByBoatIDAndRaceID(boatID, raceID));
domainFactory.getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID, raceID, boatClass));
markPassingsByMarkIndex.put(markIndexRankAndTimeSinceStartInMilliseconds.getA(), markPassing);
} else {
//
@@ -347,7 +350,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
assert startList != null;
assert course != null;
// now we can create the RaceDefinition and most other things
Race swissTimingRace = new RaceImpl(raceID, raceDescription);
Race swissTimingRace = new RaceImpl(raceID, raceDescription, boatClass);
race = domainFactory.createRaceDefinition(regatta, swissTimingRace, startList, course);
trackedRace = getTrackedRegatta().createTrackedRace(race, Collections.<Sideline> emptyList(), windStore, delayToLiveInMillis,
WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND,
@@ -413,4 +416,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
public DomainFactory getDomainFactory() {
return domainFactory;
}
public BoatClass getBoatClass() {
return boatClass;
}
}
@@ -1,6 +1,7 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.racelog.RaceLogStore;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
@@ -15,12 +16,13 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
private final int port;
private final String raceID;
private final String raceDescription;
private final BoatClass boatClass;
private final SwissTimingFactory swissTimingFactory;
private final DomainFactory domainFactory;
private final RaceLogStore raceLogStore;
private final long delayToLiveInMillis;
public SwissTimingTrackingConnectivityParameters(String hostname, int port, String raceID, String raceDescription,
public SwissTimingTrackingConnectivityParameters(String hostname, int port, String raceID, String raceDescription, BoatClass boatClass,
long delayToLiveInMillis, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory,
RaceLogStore raceLogStore) {
super();
@@ -28,6 +30,7 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
this.port = port;
this.raceID = raceID;
this.raceDescription = raceDescription;
this.boatClass = boatClass;
this.delayToLiveInMillis = delayToLiveInMillis;
this.swissTimingFactory = swissTimingFactory;
this.domainFactory = domainFactory;
@@ -36,14 +39,14 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
@Override
public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore) throws Exception {
return swissTimingFactory.createRaceTracker(raceID, raceDescription, hostname, port, delayToLiveInMillis, raceLogStore, windStore, domainFactory,
return swissTimingFactory.createRaceTracker(raceID, raceDescription, boatClass, hostname, port, delayToLiveInMillis, raceLogStore, windStore, domainFactory,
trackedRegattaRegistry);
}
@Override
public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore)
throws Exception {
return swissTimingFactory.createRaceTracker(regatta, raceID, raceDescription, hostname, port, delayToLiveInMillis, windStore, domainFactory,
return swissTimingFactory.createRaceTracker(regatta, raceID, raceDescription, boatClass, hostname, port, delayToLiveInMillis, windStore, domainFactory,
trackedRegattaRegistry);
}
@@ -101,8 +101,8 @@ public class TMDMessageQueue {
// otherwise, this could lead to the "guessed time" to
while (i.hasNext()) {
TMDMessageContents messageContents = i.next();
Competitor competitor = raceTracker.getDomainFactory().getCompetitorByBoatIDAndRaceID(messageContents.getBoatID(),
messageContents.getRaceID());
Competitor competitor = raceTracker.getDomainFactory().getCompetitorByBoatIDAndRaceIDOrBoatClass(messageContents.getBoatID(),
messageContents.getRaceID(), raceTracker.getBoatClass());
NavigableSet<MarkPassing> oldMarkPassings = trackedRace.getMarkPassings(competitor);
TreeMap<Integer, MarkPassing> cleansedMarkPassingsForCompetitor = cleansedMarkPassings.get(competitor);
if (cleansedMarkPassingsForCompetitor == null) {