refactored adding a race tracker in RacingEventService

This commit is contained in:
Axel Uhl
2012-03-30 18:17:59 +02:00
parent 4d8d02d5b1
commit 8e795aeab4
10 changed files with 93 additions and 54 deletions
@@ -9,7 +9,6 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -100,7 +99,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
@Test @Test
public void testEndToEndScenarioWithInitMessages() throws IOException, InterruptedException, ParseException { public void testEndToEndScenarioWithInitMessages() throws Exception {
String[] racesToTrack = new String[] { "4711", "4712" }; String[] racesToTrack = new String[] { "4711", "4712" };
String scriptName = "/InitMessagesScript.txt"; String scriptName = "/InitMessagesScript.txt";
setUpUsingScript(racesToTrack, scriptName); setUpUsingScript(racesToTrack, scriptName);
@@ -128,7 +127,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
@Test @Test
public void testLongRaceLog() throws IOException, InterruptedException, ParseException { public void testLongRaceLog() throws Exception {
String[] racesToTrack = new String[] { "W4702" }; String[] racesToTrack = new String[] { "W4702" };
String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt"; String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt";
String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt"; String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt";
@@ -180,7 +179,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
@Test @Test
public void testLongLogRaceNewConfig() throws UnknownHostException, InterruptedException, IOException, ParseException { public void testLongLogRaceNewConfig() throws Exception {
String[] racesToTrack = new String[] { "W4702" }; String[] racesToTrack = new String[] { "W4702" };
String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt"; String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt";
String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt"; String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt";
@@ -232,7 +231,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
@Test @Test
public void testDuplicateCCGMessageAndWaypointUniqueness() throws IOException, InterruptedException, ParseException { public void testDuplicateCCGMessageAndWaypointUniqueness() throws Exception {
String[] racesToTrack = new String[] { "W4702" }; String[] racesToTrack = new String[] { "W4702" };
setUpUsingScript(racesToTrack, "/DuplicateCCG.txt"); setUpUsingScript(racesToTrack, "/DuplicateCCG.txt");
@@ -255,7 +254,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
@Test @Test
public void testRongRaceLogRACZero() throws UnknownHostException, InterruptedException, IOException, ParseException{ public void testRongRaceLogRACZero() throws Exception{
String[] racesToTrack = new String[] { "W4702" }; String[] racesToTrack = new String[] { "W4702" };
String scriptName2 = "/SailMasterDataInterfaceRACZero.txt"; String scriptName2 = "/SailMasterDataInterfaceRACZero.txt";
setUpUsingScript(racesToTrack, scriptName2); setUpUsingScript(racesToTrack, scriptName2);
@@ -272,7 +271,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
@Test @Test
public void testEndToEndWithSwissTimingData() throws IOException, InterruptedException, ParseException { public void testEndToEndWithSwissTimingData() throws Exception {
String[] racesToTrack = new String[] { "W4702" }; String[] racesToTrack = new String[] { "W4702" };
String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt"; String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt";
String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt"; String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt";
@@ -289,8 +288,7 @@ public class EndToEndListeningStoreAndFowardTest {
} }
} }
private void setUpUsingScript(String[] racesToTrack, String... scriptNames) throws InterruptedException, private void setUpUsingScript(String[] racesToTrack, String... scriptNames) throws Exception {
UnknownHostException, IOException, ParseException {
for (String raceToTrack : racesToTrack) { for (String raceToTrack : racesToTrack) {
RacesHandle raceHandle = racingEventService.addSwissTimingRace(raceToTrack, "localhost", CLIENT_PORT, /* canSendRequests */ RacesHandle raceHandle = racingEventService.addSwissTimingRace(raceToTrack, "localhost", CLIENT_PORT, /* canSendRequests */
false, emptyWindStore, -1); false, emptyWindStore, -1);
@@ -12,6 +12,8 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl; import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.WindStore;
import difflib.PatchFailedException; import difflib.PatchFailedException;
@@ -37,4 +39,8 @@ 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, boolean canSendRequests,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader);
} }
@@ -35,9 +35,13 @@ import com.sap.sailing.domain.swisstimingadapter.Fix;
import com.sap.sailing.domain.swisstimingadapter.Mark; import com.sap.sailing.domain.swisstimingadapter.Mark;
import com.sap.sailing.domain.swisstimingadapter.MessageType; import com.sap.sailing.domain.swisstimingadapter.MessageType;
import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.Race;
import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader;
import com.sap.sailing.domain.swisstimingadapter.StartList; import com.sap.sailing.domain.swisstimingadapter.StartList;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
import difflib.PatchFailedException; import difflib.PatchFailedException;
@@ -250,4 +254,12 @@ public class DomainFactoryImpl implements DomainFactory {
return baseDomainFactory.getOrCreateNationality(nationalityName); return baseDomainFactory.getOrCreateNationality(nationalityName);
} }
@Override
public RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID, boolean canSendRequests,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader) {
return new SwissTimingTrackingConnectivityParameters(hostname, port, raceID, canSendRequests,
swissTimingFactory, domainFactory, windStore, messageLoader);
}
} }
@@ -78,13 +78,17 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
this.raceID = raceID; this.raceID = raceID;
this.messageLoader = messageLoader; this.messageLoader = messageLoader;
this.windStore = windStore; this.windStore = windStore;
this.id = new Triple<String, String, Integer>(raceID, hostname, port); this.id = createID(raceID, hostname, port);
connector.addSailMasterListener(raceID, this); connector.addSailMasterListener(raceID, this);
event = domainFactory.getOrCreateEvent(raceID); event = domainFactory.getOrCreateEvent(raceID);
setTrackedEvent(trackedEventRegistry.getOrCreateTrackedEvent(event)); setTrackedEvent(trackedEventRegistry.getOrCreateTrackedEvent(event));
connector.trackRace(raceID); connector.trackRace(raceID);
} }
static Triple<String, String, Integer> createID(String raceID, String hostname, int port) {
return new Triple<String, String, Integer>(raceID, hostname, port);
}
@Override @Override
public void stop() throws MalformedURLException, IOException, InterruptedException { public void stop() throws MalformedURLException, IOException, InterruptedException {
connector.removeSailMasterListener(raceID, this); connector.removeSailMasterListener(raceID, this);
@@ -0,0 +1,46 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.TrackedEventRegistry;
import com.sap.sailing.domain.tracking.WindStore;
public class SwissTimingTrackingConnectivityParameters implements RaceTrackingConnectivityParameters {
private final String hostname;
private final int port;
private final String raceID;
private final boolean canSendRequests;
private final SwissTimingFactory swissTimingFactory;
private final DomainFactory domainFactory;
private final WindStore windStore;
private final RaceSpecificMessageLoader messageLoader;
public SwissTimingTrackingConnectivityParameters(String hostname, int port, String raceID, boolean canSendRequests,
SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore,
RaceSpecificMessageLoader messageLoader) {
super();
this.hostname = hostname;
this.port = port;
this.raceID = raceID;
this.canSendRequests = canSendRequests;
this.swissTimingFactory = swissTimingFactory;
this.domainFactory = domainFactory;
this.windStore = windStore;
this.messageLoader = messageLoader;
}
@Override
public RaceTracker createRaceTracker(TrackedEventRegistry trackedEventRegistry) throws Exception {
return swissTimingFactory.createRaceTracker(raceID, hostname, port, canSendRequests, windStore, messageLoader,
domainFactory, trackedEventRegistry);
}
@Override
public Object getTrackerID() {
return SwissTimingRaceTrackerImpl.createID(raceID, hostname, port);
}
}
@@ -233,5 +233,5 @@ public interface DomainFactory {
* will have to create a new one. * will have to create a new one.
*/ */
void removeRace(Event tractracEvent, Race tractracRace, TrackedEventRegistry trackedEventRegistry); void removeRace(Event tractracEvent, Race tractracRace, TrackedEventRegistry trackedEventRegistry);
} }
@@ -7,6 +7,7 @@ import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters;
import com.sap.sailing.domain.tracking.TrackedEventRegistry; import com.sap.sailing.domain.tracking.TrackedEventRegistry;
@@ -43,9 +44,8 @@ public class RaceTrackingConnectivityParametersImpl implements RaceTrackingConne
} }
@Override @Override
public Object getTrackerID() { public Util.Triple<URL, URI, URI> getTrackerID() {
// TODO Auto-generated method stub return TracTracRaceTrackerImpl.createID(paramURL, liveURI, storedURI);
return null;
} }
} }
@@ -108,7 +108,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
TrackedEventRegistry trackedEventRegistry) throws URISyntaxException, MalformedURLException, TrackedEventRegistry trackedEventRegistry) throws URISyntaxException, MalformedURLException,
FileNotFoundException { FileNotFoundException {
super(); super();
urls = new Triple<URL, URI, URI>(paramURL, liveURI, storedURI); urls = createID(paramURL, liveURI, storedURI);
this.races = new HashSet<RaceDefinition>(); this.races = new HashSet<RaceDefinition>();
this.windStore = windStore; this.windStore = windStore;
this.domainFactory = domainFactory; this.domainFactory = domainFactory;
@@ -144,6 +144,10 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements
} }
addListenersForStoredDataAndStartController(typeControllers); addListenersForStoredDataAndStartController(typeControllers);
} }
static Triple<URL, URI, URI> createID(URL paramURL, URI liveURI, URI storedURI) {
return new Triple<URL, URI, URI>(paramURL, liveURI, storedURI);
}
/** /**
* Control points may get added late in the race. If they don't have a tracker installed, their position * Control points may get added late in the race. If they don't have a tracker installed, their position
@@ -242,7 +242,8 @@ public interface RacingEventService extends TrackedEventRegistry {
void updateStoredLeaderboard(Leaderboard leaderboard); void updateStoredLeaderboard(Leaderboard leaderboard);
RacesHandle addSwissTimingRace(String raceID, String hostname, int port, boolean canSendRequests, RacesHandle addSwissTimingRace(String raceID, String hostname, int port, boolean canSendRequests,
WindStore windStore, long timeoutInMilliseconds) throws InterruptedException, UnknownHostException, IOException, ParseException; WindStore windStore, long timeoutInMilliseconds) throws InterruptedException, UnknownHostException,
IOException, ParseException, Exception;
SwissTimingFactory getSwissTimingFactory(); SwissTimingFactory getSwissTimingFactory();
@@ -391,44 +391,12 @@ public class RacingEventServiceImpl implements RacingEventService, EventFetcher,
} }
@Override @Override
public synchronized RacesHandle addSwissTimingRace(String raceID, String hostname, int port, boolean canSendRequests, public synchronized RacesHandle addSwissTimingRace(String raceID, String hostname, int port,
WindStore windStore, long timeoutInMilliseconds) throws InterruptedException, UnknownHostException, IOException, ParseException { boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds) throws Exception {
Triple<String, String, Integer> key = new Triple<String, String, Integer>(raceID, hostname, port); return addRace(
RaceTracker tracker = raceTrackersByID.get(key); swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port, raceID, canSendRequests,
if (tracker == null) { swissTimingFactory, swissTimingDomainFactory, windStore, swissTimingAdapterPersistence),
tracker = getSwissTimingFactory().createRaceTracker(raceID, hostname, port, canSendRequests, windStore, timeoutInMilliseconds);
windStore, swissTimingAdapterPersistence, swissTimingDomainFactory, this);
raceTrackersByID.put(tracker.getID(), tracker);
Set<RaceTracker> trackers = raceTrackersByEvent.get(tracker.getEvent());
if (trackers == null) {
trackers = new HashSet<RaceTracker>();
raceTrackersByEvent.put(tracker.getEvent(), trackers);
}
trackers.add(tracker);
// TODO we assume here that the event name is unique which necessesitates adding the boat class name to it in EventImpl constructor
String eventName = tracker.getEvent().getName();
Event eventWithName = eventsByName.get(eventName);
// TODO we assume here that the event name is unique which necessesitates adding the boat class name to it in EventImpl constructor
if (eventWithName != null) {
if (eventWithName != tracker.getEvent()) {
throw new RuntimeException("Internal error. Two Event objects with equal name "+eventName);
}
} else {
eventsByName.put(eventName, tracker.getEvent());
}
} else {
WindStore existingTrackersWindStore = tracker.getWindStore();
if (!existingTrackersWindStore.equals(windStore)) {
logger.warning("Wind store mismatch. Requested wind store: "+windStore+
". Wind store in use by existing tracker: "+existingTrackersWindStore);
}
}
DynamicTrackedEvent trackedEvent = tracker.getTrackedEvent();
ensureEventIsObservedForDefaultLeaderboardAndAutoLeaderboardLinking(trackedEvent);
if (timeoutInMilliseconds != -1) {
scheduleAbortTrackerAfterInitialTimeout(tracker, timeoutInMilliseconds);
}
return tracker.getRacesHandle();
} }
@Override @Override