diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/EndToEndListeningStoreAndFowardTest.java b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/EndToEndListeningStoreAndFowardTest.java index 9eb5d52acac..6104c6413d2 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/EndToEndListeningStoreAndFowardTest.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/EndToEndListeningStoreAndFowardTest.java @@ -9,7 +9,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; -import java.text.ParseException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -100,7 +99,7 @@ public class EndToEndListeningStoreAndFowardTest { } @Test - public void testEndToEndScenarioWithInitMessages() throws IOException, InterruptedException, ParseException { + public void testEndToEndScenarioWithInitMessages() throws Exception { String[] racesToTrack = new String[] { "4711", "4712" }; String scriptName = "/InitMessagesScript.txt"; setUpUsingScript(racesToTrack, scriptName); @@ -128,7 +127,7 @@ public class EndToEndListeningStoreAndFowardTest { } @Test - public void testLongRaceLog() throws IOException, InterruptedException, ParseException { + public void testLongRaceLog() throws Exception { String[] racesToTrack = new String[] { "W4702" }; String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt"; String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt"; @@ -180,7 +179,7 @@ public class EndToEndListeningStoreAndFowardTest { } @Test - public void testLongLogRaceNewConfig() throws UnknownHostException, InterruptedException, IOException, ParseException { + public void testLongLogRaceNewConfig() throws Exception { String[] racesToTrack = new String[] { "W4702" }; String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt"; String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt"; @@ -232,7 +231,7 @@ public class EndToEndListeningStoreAndFowardTest { } @Test - public void testDuplicateCCGMessageAndWaypointUniqueness() throws IOException, InterruptedException, ParseException { + public void testDuplicateCCGMessageAndWaypointUniqueness() throws Exception { String[] racesToTrack = new String[] { "W4702" }; setUpUsingScript(racesToTrack, "/DuplicateCCG.txt"); @@ -255,7 +254,7 @@ public class EndToEndListeningStoreAndFowardTest { } @Test - public void testRongRaceLogRACZero() throws UnknownHostException, InterruptedException, IOException, ParseException{ + public void testRongRaceLogRACZero() throws Exception{ String[] racesToTrack = new String[] { "W4702" }; String scriptName2 = "/SailMasterDataInterfaceRACZero.txt"; setUpUsingScript(racesToTrack, scriptName2); @@ -272,7 +271,7 @@ public class EndToEndListeningStoreAndFowardTest { } @Test - public void testEndToEndWithSwissTimingData() throws IOException, InterruptedException, ParseException { + public void testEndToEndWithSwissTimingData() throws Exception { String[] racesToTrack = new String[] { "W4702" }; String scriptName1 = "/SailMasterDataInterfaceRACandSTL.txt"; String scriptName2 = "/SailMasterDataInterface-ExampleAsText.txt"; @@ -289,8 +288,7 @@ public class EndToEndListeningStoreAndFowardTest { } } - private void setUpUsingScript(String[] racesToTrack, String... scriptNames) throws InterruptedException, - UnknownHostException, IOException, ParseException { + private void setUpUsingScript(String[] racesToTrack, String... scriptNames) throws Exception { for (String raceToTrack : racesToTrack) { RacesHandle raceHandle = racingEventService.addSwissTimingRace(raceToTrack, "localhost", CLIENT_PORT, /* canSendRequests */ false, emptyWindStore, -1); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java index dc8a2af5d29..b4c0ba07d4f 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/DomainFactory.java @@ -12,6 +12,8 @@ import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl; import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; +import com.sap.sailing.domain.tracking.WindStore; import difflib.PatchFailedException; @@ -37,4 +39,8 @@ public interface DomainFactory { MarkPassing createMarkPassing(TimePoint timePoint, Waypoint waypoint, Competitor competitor); void removeRace(String raceID); + + RaceTrackingConnectivityParameters createTrackingConnectivityParameters(String hostname, int port, String raceID, boolean canSendRequests, + SwissTimingFactory swissTimingFactory, DomainFactory domainFactory, WindStore windStore, + RaceSpecificMessageLoader messageLoader); } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java index 990b7826578..625bf706386 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java @@ -35,9 +35,13 @@ import com.sap.sailing.domain.swisstimingadapter.Fix; import com.sap.sailing.domain.swisstimingadapter.Mark; import com.sap.sailing.domain.swisstimingadapter.MessageType; 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.SwissTimingFactory; import com.sap.sailing.domain.tracking.GPSFixMoving; 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 difflib.PatchFailedException; @@ -250,4 +254,12 @@ public class DomainFactoryImpl implements DomainFactory { 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); + } + } diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java index 9270a3acd67..1d50c776671 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java @@ -78,13 +78,17 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen this.raceID = raceID; this.messageLoader = messageLoader; this.windStore = windStore; - this.id = new Triple(raceID, hostname, port); + this.id = createID(raceID, hostname, port); connector.addSailMasterListener(raceID, this); event = domainFactory.getOrCreateEvent(raceID); setTrackedEvent(trackedEventRegistry.getOrCreateTrackedEvent(event)); connector.trackRace(raceID); } + static Triple createID(String raceID, String hostname, int port) { + return new Triple(raceID, hostname, port); + } + @Override public void stop() throws MalformedURLException, IOException, InterruptedException { connector.removeSailMasterListener(raceID, this); diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java new file mode 100755 index 00000000000..f0a44343ced --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingTrackingConnectivityParameters.java @@ -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); + } + +} diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java index 6a5cd4a0eae..6c432ce4025 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/DomainFactory.java @@ -233,5 +233,5 @@ public interface DomainFactory { * will have to create a new one. */ void removeRace(Event tractracEvent, Race tractracRace, TrackedEventRegistry trackedEventRegistry); - + } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java index 1cea8e7c2b1..5f9970f1f37 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceTrackingConnectivityParametersImpl.java @@ -7,6 +7,7 @@ import java.net.URISyntaxException; import java.net.URL; 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.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.TrackedEventRegistry; @@ -43,9 +44,8 @@ public class RaceTrackingConnectivityParametersImpl implements RaceTrackingConne } @Override - public Object getTrackerID() { - // TODO Auto-generated method stub - return null; + public Util.Triple getTrackerID() { + return TracTracRaceTrackerImpl.createID(paramURL, liveURI, storedURI); } } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java index 60409483e1f..aea349a0ded 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/TracTracRaceTrackerImpl.java @@ -108,7 +108,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements TrackedEventRegistry trackedEventRegistry) throws URISyntaxException, MalformedURLException, FileNotFoundException { super(); - urls = new Triple(paramURL, liveURI, storedURI); + urls = createID(paramURL, liveURI, storedURI); this.races = new HashSet(); this.windStore = windStore; this.domainFactory = domainFactory; @@ -144,6 +144,10 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements } addListenersForStoredDataAndStartController(typeControllers); } + + static Triple createID(URL paramURL, URI liveURI, URI storedURI) { + return new Triple(paramURL, liveURI, storedURI); + } /** * Control points may get added late in the race. If they don't have a tracker installed, their position diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index b41832f4347..1b3dd1b8d03 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -242,7 +242,8 @@ public interface RacingEventService extends TrackedEventRegistry { void updateStoredLeaderboard(Leaderboard leaderboard); 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(); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index f61d50c2236..ac71e0dbc60 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -391,44 +391,12 @@ public class RacingEventServiceImpl implements RacingEventService, EventFetcher, } @Override - public synchronized RacesHandle addSwissTimingRace(String raceID, String hostname, int port, boolean canSendRequests, - WindStore windStore, long timeoutInMilliseconds) throws InterruptedException, UnknownHostException, IOException, ParseException { - Triple key = new Triple(raceID, hostname, port); - RaceTracker tracker = raceTrackersByID.get(key); - if (tracker == null) { - tracker = getSwissTimingFactory().createRaceTracker(raceID, hostname, port, canSendRequests, - windStore, swissTimingAdapterPersistence, swissTimingDomainFactory, this); - raceTrackersByID.put(tracker.getID(), tracker); - Set trackers = raceTrackersByEvent.get(tracker.getEvent()); - if (trackers == null) { - trackers = new HashSet(); - 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(); + public synchronized RacesHandle addSwissTimingRace(String raceID, String hostname, int port, + boolean canSendRequests, WindStore windStore, long timeoutInMilliseconds) throws Exception { + return addRace( + swissTimingDomainFactory.createTrackingConnectivityParameters(hostname, port, raceID, canSendRequests, + swissTimingFactory, swissTimingDomainFactory, windStore, swissTimingAdapterPersistence), + windStore, timeoutInMilliseconds); } @Override