mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-15 08:41:01 +00:00
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:
1 parent
60f2e2a10b
commit
c6bc13dcf7
20 files changed
+149
-91
No files matched your search
+9
-10
@@ -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,
|
||||
|
||||
+3
@@ -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();
|
||||
}
|
||||
+2
-1
@@ -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();
|
||||
|
||||
+6
-5
@@ -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);
|
||||
|
||||
|
||||
+47
-24
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+13
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
+6
-3
@@ -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;
|
||||
}
|
||||
|
||||
+3
-2
@@ -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() {
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
|
||||
+13
-12
@@ -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
|
||||
|
||||
+18
-11
@@ -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;
|
||||
}
|
||||
}
|
||||
+6
-3
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user