mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-16 09:11:02 +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
+1
-1
@@ -183,7 +183,7 @@ public class MessageFileServiceImpl implements MessageFileService {
|
|||||||
List<Race> result = new ArrayList<Race>();
|
List<Race> result = new ArrayList<Race>();
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
String[] idAndDescription = message.getSections()[2 + i].split(";");
|
String[] idAndDescription = message.getSections()[2 + i].split(";");
|
||||||
result.add(new RaceImpl(idAndDescription[0], idAndDescription[1]));
|
result.add(new RaceImpl(idAndDescription[0], idAndDescription[1], null /* boat class */));
|
||||||
}
|
}
|
||||||
return new RACMessage(result);
|
return new RACMessage(result);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -64,9 +64,9 @@ public class SailMasterConnectivityTest {
|
|||||||
Race race4702 = new RaceImpl("W4702", "470 Women Race 2");
|
Race race4702 = new RaceImpl("W4702", "470 Women Race 2");
|
||||||
Race race4711 = new RaceImpl("4711", "A wonderful test race");
|
Race race4711 = new RaceImpl("4711", "A wonderful test race");
|
||||||
Race race4712 = new RaceImpl("4712", "Not such a wonderful race");
|
Race race4712 = new RaceImpl("4712", "Not such a wonderful race");
|
||||||
connector4702 = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("localhost", port, race4702.getRaceID(), race4702.getDescription());
|
connector4702 = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("localhost", port, race4702.getRaceID(), race4702.getDescription(), null /* boat class */);
|
||||||
connector4711 = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("localhost", port, race4711.getRaceID(), race4711.getDescription());
|
connector4711 = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("localhost", port, race4711.getRaceID(), race4711.getDescription(), null /* boat class */);
|
||||||
connector4712 = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("localhost", port, race4712.getRaceID(), race4712.getDescription());
|
connector4712 = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("localhost", port, race4712.getRaceID(), race4712.getDescription(), null /* boat class */);
|
||||||
Thread.sleep(1000); // wait until all connectors are really connected to the SailMasterDummy
|
Thread.sleep(1000); // wait until all connectors are really connected to the SailMasterDummy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-1
@@ -10,6 +10,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
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;
|
||||||
@@ -57,7 +58,7 @@ public class SimpleDomainFactoryTest {
|
|||||||
final String raceID = "SAX920103";
|
final String raceID = "SAX920103";
|
||||||
RaceDefinition raceDefinition = domainFactory.createRaceDefinition(domainFactory.getOrCreateDefaultRegatta(
|
RaceDefinition raceDefinition = domainFactory.createRaceDefinition(domainFactory.getOrCreateDefaultRegatta(
|
||||||
EmptyRaceLogStore.INSTANCE,
|
EmptyRaceLogStore.INSTANCE,
|
||||||
raceID,
|
raceID, null /* boat class */,
|
||||||
new RacingEventServiceImpl()),
|
new RacingEventServiceImpl()),
|
||||||
new Race() {
|
new Race() {
|
||||||
@Override
|
@Override
|
||||||
@@ -69,6 +70,11 @@ public class SimpleDomainFactoryTest {
|
|||||||
public String getRaceID() {
|
public String getRaceID() {
|
||||||
return raceID;
|
return raceID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoatClass getBoatClass() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}, new StartList() {
|
}, new StartList() {
|
||||||
@Override
|
@Override
|
||||||
public String getRaceID() {
|
public String getRaceID() {
|
||||||
|
|||||||
+1
-1
@@ -42,7 +42,7 @@ public class SwissTimingSailMasterLiveTest implements SailMasterListener {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void connect() throws InterruptedException, ParseException {
|
public void connect() throws InterruptedException, ParseException {
|
||||||
connector = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("gps.sportresult.com", 40300, "W4702", "Women 470 Race 2");
|
connector = SwissTimingFactory.INSTANCE.getOrCreateSailMasterConnector("gps.sportresult.com", 40300, "W4702", "Women 470 Race 2", null /* boat class*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|||||||
+9
-10
@@ -2,6 +2,7 @@ package com.sap.sailing.domain.swisstimingadapter;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
import com.sap.sailing.domain.base.Competitor;
|
import com.sap.sailing.domain.base.Competitor;
|
||||||
import com.sap.sailing.domain.base.ControlPoint;
|
import com.sap.sailing.domain.base.ControlPoint;
|
||||||
import com.sap.sailing.domain.base.Course;
|
import com.sap.sailing.domain.base.Course;
|
||||||
@@ -29,17 +30,15 @@ public interface DomainFactory {
|
|||||||
|
|
||||||
com.sap.sailing.domain.base.DomainFactory getBaseDomainFactory();
|
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);
|
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 getCompetitorByBoatIDAndRaceIDOrBoatClass(String boatID, String raceID, BoatClass boatClass);
|
||||||
|
|
||||||
Competitor getCompetitorByBoatIDAndRaceID(String boatID, String raceID);
|
|
||||||
|
|
||||||
RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, com.sap.sailing.domain.swisstimingadapter.Course course);
|
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);
|
MarkPassing createMarkPassing(TimePoint timePoint, Waypoint waypoint, Competitor competitor);
|
||||||
|
|
||||||
void removeRace(String raceID);
|
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);
|
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);
|
ControlPoint getOrCreateControlPoint(Iterable<String> devices);
|
||||||
|
|
||||||
RaceDefinition createRaceDefinition(Regatta regatta, String raceID, Iterable<Competitor> competitors,
|
RaceDefinition createRaceDefinition(Regatta regatta, String raceID, Iterable<Competitor> competitors,
|
||||||
|
|||||||
+3
@@ -1,6 +1,9 @@
|
|||||||
package com.sap.sailing.domain.swisstimingadapter;
|
package com.sap.sailing.domain.swisstimingadapter;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
|
|
||||||
|
|
||||||
public interface Race extends WithDescription {
|
public interface Race extends WithDescription {
|
||||||
String getRaceID();
|
String getRaceID();
|
||||||
|
BoatClass getBoatClass();
|
||||||
}
|
}
|
||||||
+2
-1
@@ -5,6 +5,7 @@ import java.net.UnknownHostException;
|
|||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
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.domain.racelog.RaceLogStore;
|
||||||
import com.sap.sailing.domain.tracking.RacesHandle;
|
import com.sap.sailing.domain.tracking.RacesHandle;
|
||||||
@@ -23,7 +24,7 @@ public interface SwissTimingAdapter {
|
|||||||
* @param raceDescription TODO
|
* @param raceDescription TODO
|
||||||
*/
|
*/
|
||||||
RacesHandle addSwissTimingRace(TrackerManager trackerManager, RegattaIdentifier regattaToAddTo, String raceID, String raceDescription,
|
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;
|
throws InterruptedException, UnknownHostException, IOException, ParseException, Exception;
|
||||||
|
|
||||||
SwissTimingFactory getSwissTimingFactory();
|
SwissTimingFactory getSwissTimingFactory();
|
||||||
|
|||||||
+6
-5
@@ -4,6 +4,7 @@ import java.io.IOException;
|
|||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
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.racelog.RaceLogStore;
|
||||||
import com.sap.sailing.domain.swisstimingadapter.impl.SwissTimingFactoryImpl;
|
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
|
* {@link MessageType#isRaceSpecific() Race-specific messages} for other races are ignored and not forwarded to any
|
||||||
* listener.
|
* 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;
|
throws InterruptedException, ParseException;
|
||||||
|
|
||||||
SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, String raceId,
|
SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, String raceId,
|
||||||
String raceDescription) throws InterruptedException, ParseException;
|
String raceDescription, BoatClass boatClass) throws InterruptedException, ParseException;
|
||||||
|
|
||||||
SailMasterTransceiver createSailMasterTransceiver();
|
SailMasterTransceiver createSailMasterTransceiver();
|
||||||
|
|
||||||
SwissTimingConfiguration createSwissTimingConfiguration(String name, String jsonURL, String hostname, int port);
|
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,
|
long delayToLiveInMillis, RaceLogStore raceLogStore, WindStore windStore,
|
||||||
DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException, UnknownHostException,
|
DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException, UnknownHostException,
|
||||||
IOException, ParseException;
|
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,
|
WindStore windStore, DomainFactory domainFactory, TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException, InterruptedException,
|
||||||
IOException, ParseException;
|
IOException, ParseException;
|
||||||
|
|
||||||
Race createRace(String raceId, String description);
|
Race createRace(String raceId, String description, BoatClass boatClass);
|
||||||
|
|
||||||
SailMasterMessage createMessage(String message);
|
SailMasterMessage createMessage(String message);
|
||||||
|
|
||||||
|
|||||||
+47
-24
@@ -90,13 +90,14 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
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(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);
|
getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), raceID, null);
|
||||||
logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")");
|
logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")");
|
||||||
raceIDToRegattaCache.put(raceID, result);
|
raceIDToRegattaCache.put(raceID, result);
|
||||||
@@ -104,47 +105,70 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private Competitor getCompetitorByBoatIDAndRaceType(String boatID, RaceType raceType) {
|
||||||
public Competitor getCompetitorByBoatIDAndRaceType(String boatID, RaceType raceType) {
|
|
||||||
return baseDomainFactory.getExistingCompetitorById(getCompetitorID(boatID, raceType));
|
return baseDomainFactory.getExistingCompetitorById(getCompetitorID(boatID, raceType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Competitor getCompetitorByBoatIDAndBoatClass(String boatID, BoatClass boatClass) {
|
||||||
|
return baseDomainFactory.getExistingCompetitorById(getCompetitorID(boatID, boatClass));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Competitor getCompetitorByBoatIDAndRaceID(String boatID, String raceID) {
|
public Competitor getCompetitorByBoatIDAndRaceIDOrBoatClass(String boatID, String raceID, BoatClass boatClass) {
|
||||||
RaceType raceType = getRaceTypeFromRaceID(raceID);
|
Competitor result = null;
|
||||||
if (raceType != null) {
|
if(boatClass != null) {
|
||||||
return getCompetitorByBoatIDAndRaceType(boatID, raceType);
|
result = getCompetitorByBoatIDAndBoatClass(boatID, boatClass);
|
||||||
} else {
|
} 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) {
|
private String getCompetitorID(String boatID, RaceType raceType) {
|
||||||
return boatID + "/" + raceType.getRaceCode();
|
return boatID + "/" + raceType.getRaceCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getCompetitorID(String boatID, BoatClass boatClass) {
|
||||||
|
return boatID + "/" + boatClass.getName();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, RaceType raceType) {
|
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, String raceId, BoatClass boatClass) {
|
||||||
Competitor result = getCompetitorByBoatIDAndRaceType(competitor.getBoatID(), raceType);
|
Competitor result = getCompetitorByBoatIDAndRaceIDOrBoatClass(competitor.getBoatID(), raceId, boatClass);
|
||||||
CompetitorStore competitorStore = baseDomainFactory.getCompetitorStore();
|
CompetitorStore competitorStore = baseDomainFactory.getCompetitorStore();
|
||||||
if (result == null || competitorStore.isCompetitorToUpdateDuringGetOrCreate(result)) {
|
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>();
|
List<DynamicPerson> teamMembers = new ArrayList<DynamicPerson>();
|
||||||
for (String teamMemberName : competitor.getName().split("[-+&]")) {
|
for (String teamMemberName : competitor.getName().split("[-+&]")) {
|
||||||
teamMembers.add(new PersonImpl(teamMemberName.trim(), getOrCreateNationality(competitor.getThreeLetterIOCCode()),
|
teamMembers.add(new PersonImpl(teamMemberName.trim(), getOrCreateNationality(competitor.getThreeLetterIOCCode()),
|
||||||
/* dateOfBirth */ null, teamMemberName.trim()));
|
/* dateOfBirth */ null, teamMemberName.trim()));
|
||||||
}
|
}
|
||||||
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
|
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);
|
competitor.getName(), null /*displayColor*/, team, boat);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Competitor getOrCreateCompetitor(String boatID, String threeLetterIOCCode, String name,
|
public Competitor getOrCreateCompetitor(String boatID, String threeLetterIOCCode, String name, String raceId, BoatClass boatClass) {
|
||||||
RaceType raceType) {
|
return getOrCreateCompetitor(new CompetitorImpl(boatID, threeLetterIOCCode, name), raceId, boatClass);
|
||||||
return getOrCreateCompetitor(new CompetitorImpl(boatID, threeLetterIOCCode, name), raceType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -166,11 +190,10 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
@Override
|
@Override
|
||||||
public RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, Course course) {
|
public RaceDefinition createRaceDefinition(Regatta regatta, Race race, StartList startList, Course course) {
|
||||||
com.sap.sailing.domain.base.Course domainCourse = createCourse(race.getDescription(), course);
|
com.sap.sailing.domain.base.Course domainCourse = createCourse(race.getDescription(), course);
|
||||||
RaceType raceType = getRaceTypeFromRaceID(race.getRaceID());
|
Iterable<Competitor> competitors = createCompetitorList(startList, race.getRaceID(), race.getBoatClass());
|
||||||
Iterable<Competitor> competitors = createCompetitorList(startList, raceType);
|
|
||||||
logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID());
|
logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID());
|
||||||
RaceDefinition result = new RaceDefinitionImpl(race.getRaceID(), domainCourse,
|
BoatClass boatClass = race.getBoatClass() != null ? race.getBoatClass() : getRaceTypeFromRaceID(race.getRaceID()).getBoatClass();
|
||||||
raceType.getBoatClass(), competitors);
|
RaceDefinition result = new RaceDefinitionImpl(race.getRaceID(), domainCourse, boatClass, competitors);
|
||||||
regatta.addRace(result);
|
regatta.addRace(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -220,10 +243,10 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
return result;
|
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>();
|
List<Competitor> result = new ArrayList<Competitor>();
|
||||||
for (com.sap.sailing.domain.swisstimingadapter.Competitor swissTimingCompetitor : startList.getCompetitors()) {
|
for (com.sap.sailing.domain.swisstimingadapter.Competitor swissTimingCompetitor : startList.getCompetitors()) {
|
||||||
Competitor domainCompetitor = getOrCreateCompetitor(swissTimingCompetitor, raceType);
|
Competitor domainCompetitor = getOrCreateCompetitor(swissTimingCompetitor, raceId, boatClass);
|
||||||
result.add(domainCompetitor);
|
result.add(domainCompetitor);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -326,9 +349,9 @@ public class DomainFactoryImpl implements DomainFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
|
public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID,
|
||||||
String raceDescription, long delayToLiveInMillis,
|
String raceDescription, BoatClass boatClass, long delayToLiveInMillis,
|
||||||
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, RaceLogStore raceLogStore) {
|
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);
|
swissTimingFactory, domainFactory, raceLogStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-2
@@ -1,15 +1,21 @@
|
|||||||
package com.sap.sailing.domain.swisstimingadapter.impl;
|
package com.sap.sailing.domain.swisstimingadapter.impl;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
import com.sap.sailing.domain.swisstimingadapter.Race;
|
import com.sap.sailing.domain.swisstimingadapter.Race;
|
||||||
|
|
||||||
public class RaceImpl implements Race {
|
public class RaceImpl implements Race {
|
||||||
private final String description;
|
private final String description;
|
||||||
private final String raceId;
|
private final String raceId;
|
||||||
|
private final BoatClass boatClass;
|
||||||
|
|
||||||
public RaceImpl(String raceId, String description) {
|
public RaceImpl(String raceId, String description, BoatClass boatClass) {
|
||||||
super();
|
|
||||||
this.raceId = raceId;
|
this.raceId = raceId;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
|
this.boatClass = boatClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RaceImpl(String raceId, String description) {
|
||||||
|
this(raceId, description, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -21,4 +27,9 @@ public class RaceImpl implements Race {
|
|||||||
public String getRaceID() {
|
public String getRaceID() {
|
||||||
return raceId;
|
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.Level;
|
||||||
import java.util.logging.Logger;
|
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.Distance;
|
||||||
import com.sap.sailing.domain.common.Position;
|
import com.sap.sailing.domain.common.Position;
|
||||||
import com.sap.sailing.domain.common.Speed;
|
import com.sap.sailing.domain.common.Speed;
|
||||||
@@ -92,6 +93,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
|
|||||||
private boolean connected;
|
private boolean connected;
|
||||||
private final String raceId;
|
private final String raceId;
|
||||||
private final String raceDescription;
|
private final String raceDescription;
|
||||||
|
private final BoatClass boatClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Currently the SwissTiming SailMaster protocol only transmits time zone information when sending
|
* 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;
|
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();
|
super();
|
||||||
maxSequenceNumber = -1l;
|
maxSequenceNumber = -1l;
|
||||||
this.raceId = raceId; // from this time on, the connector interprets messages for raceID
|
this.raceId = raceId; // from this time on, the connector interprets messages for raceID
|
||||||
this.raceDescription = raceDescription;
|
this.raceDescription = raceDescription;
|
||||||
|
this.boatClass = boatClass;
|
||||||
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
|
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
|
||||||
this.host = host;
|
this.host = host;
|
||||||
this.port = port;
|
this.port = port;
|
||||||
@@ -516,7 +519,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Race getRace() {
|
public Race getRace() {
|
||||||
return new RaceImpl(raceId, raceDescription);
|
return new RaceImpl(raceId, raceDescription, boatClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Race> parseAvailableRacesMessage(SailMasterMessage availableRacesMessage) {
|
private List<Race> parseAvailableRacesMessage(SailMasterMessage availableRacesMessage) {
|
||||||
@@ -525,7 +528,7 @@ public class SailMasterConnectorImpl extends SailMasterTransceiverImpl implement
|
|||||||
List<Race> result = new ArrayList<Race>();
|
List<Race> result = new ArrayList<Race>();
|
||||||
for (int i=0; i<count; i++) {
|
for (int i=0; i<count; i++) {
|
||||||
String[] idAndDescription = availableRacesMessage.getSections()[2+i].split(";");
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -5,6 +5,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
|
import com.sap.sailing.domain.swisstimingadapter.SailMasterMessage;
|
||||||
|
|
||||||
public class SailMasterLiveSimulatorConnectorImpl extends SailMasterConnectorImpl {
|
public class SailMasterLiveSimulatorConnectorImpl extends SailMasterConnectorImpl {
|
||||||
@@ -12,9 +13,9 @@ public class SailMasterLiveSimulatorConnectorImpl extends SailMasterConnectorImp
|
|||||||
|
|
||||||
private long messageDeliveryIntervalInMs = Long.valueOf(System.getProperty("simulateLiveMode.delayInMillis", "250"));
|
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 {
|
throws InterruptedException, ParseException {
|
||||||
super(host, port, raceId, raceDescription);
|
super(host, port, raceId, raceDescription, boatClass);
|
||||||
bufferedMessageList = Collections.synchronizedList(new ArrayList<SailMasterMessage>());
|
bufferedMessageList = Collections.synchronizedList(new ArrayList<SailMasterMessage>());
|
||||||
Thread messageDeliveryThread = new Thread("SailMasterLiveSimulatorConnector") {
|
Thread messageDeliveryThread = new Thread("SailMasterLiveSimulatorConnector") {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|||||||
+3
-2
@@ -6,6 +6,7 @@ import java.text.ParseException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
import com.sap.sailing.domain.base.DomainFactory;
|
import com.sap.sailing.domain.base.DomainFactory;
|
||||||
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.domain.racelog.RaceLogStore;
|
||||||
@@ -46,10 +47,10 @@ public class SwissTimingAdapterImpl implements SwissTimingAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RacesHandle addSwissTimingRace(TrackerManager trackerManager, RegattaIdentifier regattaToAddTo, String raceID, String raceDescription,
|
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 {
|
throws Exception {
|
||||||
return trackerManager.addRace(regattaToAddTo, swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port,
|
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),
|
swissTimingDomainFactory, logStore),
|
||||||
timeoutInMilliseconds);
|
timeoutInMilliseconds);
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-12
@@ -7,6 +7,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
import com.sap.sailing.domain.base.Regatta;
|
import com.sap.sailing.domain.base.Regatta;
|
||||||
import com.sap.sailing.domain.common.impl.Util.Triple;
|
import com.sap.sailing.domain.common.impl.Util.Triple;
|
||||||
import com.sap.sailing.domain.racelog.RaceLogStore;
|
import com.sap.sailing.domain.racelog.RaceLogStore;
|
||||||
@@ -40,9 +41,9 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SailMasterConnector getOrCreateSailMasterConnector(String host, int port, String raceId,
|
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"))) {
|
if (Boolean.valueOf(System.getProperty("simulateLiveMode", "false"))) {
|
||||||
return getOrCreateSailMasterLiveSimulatorConnector(host, port, raceId, raceDescription);
|
return getOrCreateSailMasterLiveSimulatorConnector(host, port, raceId, raceDescription, boatClass);
|
||||||
} else {
|
} else {
|
||||||
Triple<String, Integer, String> key = new Triple<String, Integer, String>(host, port, raceId);
|
Triple<String, Integer, String> key = new Triple<String, Integer, String>(host, port, raceId);
|
||||||
SailMasterConnector result = connectors.get(key);
|
SailMasterConnector result = connectors.get(key);
|
||||||
@@ -52,7 +53,7 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
|
|||||||
} else {
|
} else {
|
||||||
logger.info("Creating a new connector for "+key+" because the old one was stopped");
|
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);
|
connectors.put(key, result);
|
||||||
// TODO how do connectors get stopped, terminated and removed from the connectors map again?
|
// TODO how do connectors get stopped, terminated and removed from the connectors map again?
|
||||||
} else {
|
} else {
|
||||||
@@ -64,15 +65,15 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SailMasterConnector getOrCreateSailMasterLiveSimulatorConnector(String host, int port, String raceId,
|
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);
|
Triple<String, Integer, String> key = new Triple<>(host, port, raceId);
|
||||||
SailMasterConnector result = connectors.get(key);
|
SailMasterConnector result = connectors.get(key);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription);
|
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription, boatClass);
|
||||||
connectors.put(key, result);
|
connectors.put(key, result);
|
||||||
// TODO how do connectors get stopped, terminated and removed from the connectors map again?
|
// TODO how do connectors get stopped, terminated and removed from the connectors map again?
|
||||||
} else if (result.isStopped()) {
|
} else if (result.isStopped()) {
|
||||||
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription);
|
result = new SailMasterLiveSimulatorConnectorImpl(host, port, raceId, raceDescription, boatClass);
|
||||||
connectors.put(key, result);
|
connectors.put(key, result);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -84,20 +85,20 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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,
|
long delayToLiveInMillis, RaceLogStore raceLogStore, WindStore windStore, DomainFactory domainFactory,
|
||||||
TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException,
|
TrackedRegattaRegistry trackedRegattaRegistry) throws InterruptedException,
|
||||||
UnknownHostException, IOException, ParseException {
|
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);
|
trackedRegattaRegistry, delayToLiveInMillis);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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,
|
int port, long delayToLiveInMillis, WindStore windStore, DomainFactory domainFactory,
|
||||||
TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException,
|
TrackedRegattaRegistry trackedRegattaRegistry) throws UnknownHostException,
|
||||||
InterruptedException, IOException, ParseException {
|
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);
|
this, trackedRegattaRegistry, delayToLiveInMillis);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,8 +113,8 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Race createRace(String raceId, String description) {
|
public Race createRace(String raceId, String description, BoatClass boatClass) {
|
||||||
return new RaceImpl(raceId, description);
|
return new RaceImpl(raceId, description, boatClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+18
-11
@@ -13,6 +13,7 @@ import java.util.TreeMap;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
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.Competitor;
|
||||||
import com.sap.sailing.domain.base.Mark;
|
import com.sap.sailing.domain.base.Mark;
|
||||||
import com.sap.sailing.domain.base.RaceDefinition;
|
import com.sap.sailing.domain.base.RaceDefinition;
|
||||||
@@ -60,6 +61,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
private final SailMasterConnector connector;
|
private final SailMasterConnector connector;
|
||||||
private final String raceID;
|
private final String raceID;
|
||||||
private final String raceDescription;
|
private final String raceDescription;
|
||||||
|
private final BoatClass boatClass;
|
||||||
private final DomainFactory domainFactory;
|
private final DomainFactory domainFactory;
|
||||||
private final Triple<String, String, Integer> id;
|
private final Triple<String, String, Integer> id;
|
||||||
private final Regatta regatta;
|
private final Regatta regatta;
|
||||||
@@ -86,26 +88,27 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
*/
|
*/
|
||||||
private final TMDMessageQueue tmdMessageQueue;
|
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,
|
WindStore windStore, DomainFactory domainFactory, SwissTimingFactory factory,
|
||||||
TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis) throws InterruptedException,
|
TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis) throws InterruptedException,
|
||||||
UnknownHostException, IOException, ParseException {
|
UnknownHostException, IOException, ParseException {
|
||||||
this(domainFactory.getOrCreateDefaultRegatta(raceLogStore, raceID, trackedRegattaRegistry), raceID,
|
this(domainFactory.getOrCreateDefaultRegatta(raceLogStore, raceID, boatClass, trackedRegattaRegistry), raceID,
|
||||||
raceDescription, hostname, port, windStore, domainFactory, factory, trackedRegattaRegistry,
|
raceDescription, boatClass, hostname, port, windStore, domainFactory, factory, trackedRegattaRegistry,
|
||||||
delayToLiveInMillis);
|
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,
|
WindStore windStore, DomainFactory domainFactory, SwissTimingFactory factory,
|
||||||
TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis) throws InterruptedException,
|
TrackedRegattaRegistry trackedRegattaRegistry, long delayToLiveInMillis) throws InterruptedException,
|
||||||
UnknownHostException, IOException, ParseException {
|
UnknownHostException, IOException, ParseException {
|
||||||
super();
|
super();
|
||||||
this.tmdMessageQueue = new TMDMessageQueue(this);
|
this.tmdMessageQueue = new TMDMessageQueue(this);
|
||||||
this.regatta = regatta;
|
this.regatta = regatta;
|
||||||
this.connector = factory.getOrCreateSailMasterConnector(hostname, port, raceID, raceDescription);
|
this.connector = factory.getOrCreateSailMasterConnector(hostname, port, raceID, raceDescription, boatClass);
|
||||||
this.domainFactory = domainFactory;
|
this.domainFactory = domainFactory;
|
||||||
this.raceID = raceID;
|
this.raceID = raceID;
|
||||||
this.raceDescription = raceDescription;
|
this.raceDescription = raceDescription;
|
||||||
|
this.boatClass = boatClass;
|
||||||
this.windStore = windStore;
|
this.windStore = windStore;
|
||||||
this.id = createID(raceID, hostname, port);
|
this.id = createID(raceID, hostname, port);
|
||||||
connector.addSailMasterListener(this);
|
connector.addSailMasterListener(this);
|
||||||
@@ -231,8 +234,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
trackedRace.recordFix(mark, gpsFix);
|
trackedRace.recordFix(mark, gpsFix);
|
||||||
break;
|
break;
|
||||||
case COMPETITOR:
|
case COMPETITOR:
|
||||||
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceID(
|
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceIDOrBoatClass(
|
||||||
fix.getBoatID(), raceID);
|
fix.getBoatID(), raceID, boatClass);
|
||||||
DynamicGPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
|
DynamicGPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
|
||||||
competitorTrack.addGPSFix(gpsFix);
|
competitorTrack.addGPSFix(gpsFix);
|
||||||
break;
|
break;
|
||||||
@@ -257,8 +260,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
List<Triple<Integer, Integer, Long>> markIndicesRanksAndTimesSinceStartInMilliseconds) {
|
List<Triple<Integer, Integer, Long>> markIndicesRanksAndTimesSinceStartInMilliseconds) {
|
||||||
assert this.raceID.equals(raceID);
|
assert this.raceID.equals(raceID);
|
||||||
if (isTrackedRaceStillReachable()) {
|
if (isTrackedRaceStillReachable()) {
|
||||||
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceID(boatID,
|
Competitor competitor = domainFactory.getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID,
|
||||||
raceID);
|
raceID, boatClass);
|
||||||
// the list of mark indices and time stamps is partial and usually only shows the last mark passing;
|
// 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
|
// we need to use this to *update* the competitor's mark passings list, not *replace* it
|
||||||
TreeMap<Integer, MarkPassing> markPassingsByMarkIndex = new TreeMap<Integer, MarkPassing>();
|
TreeMap<Integer, MarkPassing> markPassingsByMarkIndex = new TreeMap<Integer, MarkPassing>();
|
||||||
@@ -286,7 +289,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
MillisecondsTimePoint timePoint = new MillisecondsTimePoint(
|
MillisecondsTimePoint timePoint = new MillisecondsTimePoint(
|
||||||
startTime.asMillis() + markIndexRankAndTimeSinceStartInMilliseconds.getC());
|
startTime.asMillis() + markIndexRankAndTimeSinceStartInMilliseconds.getC());
|
||||||
MarkPassing markPassing = domainFactory.createMarkPassing(timePoint, waypoint,
|
MarkPassing markPassing = domainFactory.createMarkPassing(timePoint, waypoint,
|
||||||
domainFactory.getCompetitorByBoatIDAndRaceID(boatID, raceID));
|
domainFactory.getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID, raceID, boatClass));
|
||||||
markPassingsByMarkIndex.put(markIndexRankAndTimeSinceStartInMilliseconds.getA(), markPassing);
|
markPassingsByMarkIndex.put(markIndexRankAndTimeSinceStartInMilliseconds.getA(), markPassing);
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
@@ -347,7 +350,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
assert startList != null;
|
assert startList != null;
|
||||||
assert course != null;
|
assert course != null;
|
||||||
// now we can create the RaceDefinition and most other things
|
// 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);
|
race = domainFactory.createRaceDefinition(regatta, swissTimingRace, startList, course);
|
||||||
trackedRace = getTrackedRegatta().createTrackedRace(race, Collections.<Sideline> emptyList(), windStore, delayToLiveInMillis,
|
trackedRace = getTrackedRegatta().createTrackedRace(race, Collections.<Sideline> emptyList(), windStore, delayToLiveInMillis,
|
||||||
WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND,
|
WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND,
|
||||||
@@ -413,4 +416,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
|
|||||||
public DomainFactory getDomainFactory() {
|
public DomainFactory getDomainFactory() {
|
||||||
return domainFactory;
|
return domainFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BoatClass getBoatClass() {
|
||||||
|
return boatClass;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+6
-3
@@ -1,6 +1,7 @@
|
|||||||
package com.sap.sailing.domain.swisstimingadapter.impl;
|
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.base.Regatta;
|
||||||
import com.sap.sailing.domain.racelog.RaceLogStore;
|
import com.sap.sailing.domain.racelog.RaceLogStore;
|
||||||
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
|
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
|
||||||
@@ -15,12 +16,13 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
|
|||||||
private final int port;
|
private final int port;
|
||||||
private final String raceID;
|
private final String raceID;
|
||||||
private final String raceDescription;
|
private final String raceDescription;
|
||||||
|
private final BoatClass boatClass;
|
||||||
private final SwissTimingFactory swissTimingFactory;
|
private final SwissTimingFactory swissTimingFactory;
|
||||||
private final DomainFactory domainFactory;
|
private final DomainFactory domainFactory;
|
||||||
private final RaceLogStore raceLogStore;
|
private final RaceLogStore raceLogStore;
|
||||||
private final long delayToLiveInMillis;
|
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,
|
long delayToLiveInMillis, SwissTimingFactory swissTimingFactory, DomainFactory domainFactory,
|
||||||
RaceLogStore raceLogStore) {
|
RaceLogStore raceLogStore) {
|
||||||
super();
|
super();
|
||||||
@@ -28,6 +30,7 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
|
|||||||
this.port = port;
|
this.port = port;
|
||||||
this.raceID = raceID;
|
this.raceID = raceID;
|
||||||
this.raceDescription = raceDescription;
|
this.raceDescription = raceDescription;
|
||||||
|
this.boatClass = boatClass;
|
||||||
this.delayToLiveInMillis = delayToLiveInMillis;
|
this.delayToLiveInMillis = delayToLiveInMillis;
|
||||||
this.swissTimingFactory = swissTimingFactory;
|
this.swissTimingFactory = swissTimingFactory;
|
||||||
this.domainFactory = domainFactory;
|
this.domainFactory = domainFactory;
|
||||||
@@ -36,14 +39,14 @@ public class SwissTimingTrackingConnectivityParameters implements RaceTrackingCo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore) throws Exception {
|
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);
|
trackedRegattaRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore)
|
public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore)
|
||||||
throws Exception {
|
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);
|
trackedRegattaRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -101,8 +101,8 @@ public class TMDMessageQueue {
|
|||||||
// otherwise, this could lead to the "guessed time" to
|
// otherwise, this could lead to the "guessed time" to
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
TMDMessageContents messageContents = i.next();
|
TMDMessageContents messageContents = i.next();
|
||||||
Competitor competitor = raceTracker.getDomainFactory().getCompetitorByBoatIDAndRaceID(messageContents.getBoatID(),
|
Competitor competitor = raceTracker.getDomainFactory().getCompetitorByBoatIDAndRaceIDOrBoatClass(messageContents.getBoatID(),
|
||||||
messageContents.getRaceID());
|
messageContents.getRaceID(), raceTracker.getBoatClass());
|
||||||
NavigableSet<MarkPassing> oldMarkPassings = trackedRace.getMarkPassings(competitor);
|
NavigableSet<MarkPassing> oldMarkPassings = trackedRace.getMarkPassings(competitor);
|
||||||
TreeMap<Integer, MarkPassing> cleansedMarkPassingsForCompetitor = cleansedMarkPassings.get(competitor);
|
TreeMap<Integer, MarkPassing> cleansedMarkPassingsForCompetitor = cleansedMarkPassings.get(competitor);
|
||||||
if (cleansedMarkPassingsForCompetitor == null) {
|
if (cleansedMarkPassingsForCompetitor == null) {
|
||||||
|
|||||||
+2
-6
@@ -39,7 +39,6 @@ import com.sap.sailing.domain.common.impl.Util.Pair;
|
|||||||
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.racelog.impl.EmptyRaceLogStore;
|
||||||
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
|
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
|
||||||
import com.sap.sailing.domain.swisstimingadapter.RaceType;
|
|
||||||
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;
|
||||||
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayParser;
|
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayParser;
|
||||||
@@ -83,8 +82,6 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter {
|
|||||||
* {@link #trackedRacePerRaceID} for storing data from subsequent messages.
|
* {@link #trackedRacePerRaceID} for storing data from subsequent messages.
|
||||||
*/
|
*/
|
||||||
private String currentRaceID;
|
private String currentRaceID;
|
||||||
|
|
||||||
private RaceType currentRaceType;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reference time point for time specifications
|
* Reference time point for time specifications
|
||||||
@@ -174,7 +171,6 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void raceID(String raceID) {
|
public void raceID(String raceID) {
|
||||||
currentRaceID = raceID;
|
currentRaceID = raceID;
|
||||||
currentRaceType = domainFactory.getRaceTypeFromRaceID(currentRaceID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isValid(int threeByteValue) {
|
private boolean isValid(int threeByteValue) {
|
||||||
@@ -236,7 +232,7 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter {
|
|||||||
short ctPoints_x10_Winner) {
|
short ctPoints_x10_Winner) {
|
||||||
if (boatType == BoatType.Competitor) {
|
if (boatType == BoatType.Competitor) {
|
||||||
Competitor competitor = domainFactory.getOrCreateCompetitor(sailNumberOrTrackerID, threeLetterIOCCode.trim(), name.trim(),
|
Competitor competitor = domainFactory.getOrCreateCompetitor(sailNumberOrTrackerID, threeLetterIOCCode.trim(), name.trim(),
|
||||||
currentRaceType);
|
currentRaceID, null /* boat class */);
|
||||||
Set<Competitor> competitorsOfCurrentRace = competitorsPerRaceID.get(currentRaceID);
|
Set<Competitor> competitorsOfCurrentRace = competitorsPerRaceID.get(currentRaceID);
|
||||||
if (competitorsOfCurrentRace == null) {
|
if (competitorsOfCurrentRace == null) {
|
||||||
competitorsOfCurrentRace = new HashSet<>();
|
competitorsOfCurrentRace = new HashSet<>();
|
||||||
@@ -309,7 +305,7 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter {
|
|||||||
|
|
||||||
private void createRace() {
|
private void createRace() {
|
||||||
final Regatta myRegatta = regatta != null ? regatta : domainFactory.getOrCreateDefaultRegatta(EmptyRaceLogStore.INSTANCE,
|
final Regatta myRegatta = regatta != null ? regatta : domainFactory.getOrCreateDefaultRegatta(EmptyRaceLogStore.INSTANCE,
|
||||||
currentRaceID, trackedRegattaRegistry);
|
currentRaceID, null /* boat class */, 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);
|
||||||
|
|||||||
+2
-1
@@ -12,6 +12,7 @@ import java.util.List;
|
|||||||
import org.osgi.framework.BundleContext;
|
import org.osgi.framework.BundleContext;
|
||||||
import org.osgi.util.tracker.ServiceTracker;
|
import org.osgi.util.tracker.ServiceTracker;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.base.BoatClass;
|
||||||
import com.sap.sailing.domain.base.DomainFactory;
|
import com.sap.sailing.domain.base.DomainFactory;
|
||||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||||
import com.sap.sailing.domain.common.ScoreCorrectionProvider;
|
import com.sap.sailing.domain.common.ScoreCorrectionProvider;
|
||||||
@@ -106,7 +107,7 @@ public class SailingServiceImplMock extends SailingServiceImpl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RacesHandle addSwissTimingRace(TrackerManager trackerManager,
|
public RacesHandle addSwissTimingRace(TrackerManager trackerManager,
|
||||||
RegattaIdentifier regattaToAddTo, String raceID, String raceDescription, String hostname,
|
RegattaIdentifier regattaToAddTo, String raceID, String raceDescription, BoatClass boatClass, String hostname,
|
||||||
int port, RaceLogStore logStore, long timeoutInMilliseconds)
|
int port, RaceLogStore logStore, long timeoutInMilliseconds)
|
||||||
throws InterruptedException, UnknownHostException, IOException, ParseException,
|
throws InterruptedException, UnknownHostException, IOException, ParseException,
|
||||||
Exception {
|
Exception {
|
||||||
|
|||||||
+2
-1
@@ -2210,8 +2210,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
|||||||
logger.info("tracWithSwissTiming for regatta " + regattaToAddTo + " for race records " + rrs
|
logger.info("tracWithSwissTiming for regatta " + regattaToAddTo + " for race records " + rrs
|
||||||
+ " with hostname " + hostname + " and port " + port);
|
+ " with hostname " + hostname + " and port " + port);
|
||||||
for (SwissTimingRaceRecordDTO rr : rrs) {
|
for (SwissTimingRaceRecordDTO rr : rrs) {
|
||||||
|
BoatClass boatClass = getBaseDomainFactory().getOrCreateBoatClass(rr.boatClass);
|
||||||
final RacesHandle raceHandle = getSwissTimingAdapter().addSwissTimingRace(getService(), regattaToAddTo, rr.raceId, rr.raceName,
|
final RacesHandle raceHandle = getSwissTimingAdapter().addSwissTimingRace(getService(), regattaToAddTo, rr.raceId, rr.raceName,
|
||||||
hostname, port,
|
boatClass, hostname, port,
|
||||||
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
|
MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory), RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
|
||||||
if (trackWind) {
|
if (trackWind) {
|
||||||
new Thread("Wind tracking starter for race " + rr.raceId + "/" + rr.raceName) {
|
new Thread("Wind tracking starter for race " + rr.raceId + "/" + rr.raceName) {
|
||||||
|
|||||||
Reference in new issue
Block a user