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 5ca05cc49ec..7ea121022b3 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 @@ -93,7 +93,10 @@ public class DomainFactoryImpl implements DomainFactory { @Override public Regatta getOrCreateRegatta(String raceID, TrackedRegattaRegistry trackedRegattaRegistry) { - Regatta result = raceIDToRegattaCache.get(raceID); + Regatta result = trackedRegattaRegistry.getRememberedRegattaForRace(raceID); + if (result == null) { + result = raceIDToRegattaCache.get(raceID); + } if (result == null) { result = new RegattaImpl(raceID, null, trackedRegattaRegistry); logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")"); 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 6e2cb2da9b1..281808ed330 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 @@ -73,7 +73,6 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen DomainFactory domainFactory, SwissTimingFactory factory, RaceSpecificMessageLoader messageLoader, TrackedRegattaRegistry trackedRegattaRegistry, boolean canSendRequests, long delayToLiveInMillis) throws InterruptedException, UnknownHostException, IOException, ParseException { - // TODO bug 733: use trackedRegattaRegistry to obtain a regatta using the race ID this(domainFactory.getOrCreateRegatta(raceID, trackedRegattaRegistry), raceID, hostname, port, windStore, domainFactory, factory, messageLoader, trackedRegattaRegistry, canSendRequests, delayToLiveInMillis); } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java index afa47004b63..19bcb08d546 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/DummyTrackedRegattaRegistry.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.test; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; @@ -40,7 +41,7 @@ public class DummyTrackedRegattaRegistry implements TrackedRegattaRegistry { } @Override - public Regatta getRememberedRegattaForRace(RaceDefinition race) { + public Regatta getRememberedRegattaForRace(Serializable race) { return null; } 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 6ce4dd680e4..04b516f61da 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 @@ -2,6 +2,7 @@ package com.sap.sailing.domain.tractracadapter; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.Serializable; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -241,4 +242,9 @@ public interface DomainFactory { */ void removeRace(Event tractracEvent, Race tractracRace, TrackedRegattaRegistry trackedRegattaRegistry); + /** + * Computes an ID to use for a {@link RaceDefinition} based on the TracTrac race. + */ + Serializable getRaceID(Race tractracRace); + } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index c58bdd1dd75..60445834518 100644 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.tractracadapter.impl; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.Serializable; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -314,6 +315,11 @@ public class DomainFactoryImpl implements DomainFactory { ReceiverType.MARKPASSINGS, ReceiverType.MARKPOSITIONS, ReceiverType.RACESTARTFINISH, ReceiverType.RAWPOSITIONS); } + @Override + public Serializable getRaceID(Race tractracRace) { + return tractracRace.getId(); + } + @Override public void removeRace(com.tractrac.clientmodule.Event tractracEvent, Race tractracRace, TrackedRegattaRegistry trackedRegattaRegistry) { RaceDefinition raceDefinition; @@ -370,7 +376,7 @@ public class DomainFactoryImpl implements DomainFactory { Pair, BoatClass> competitorsAndDominantBoatClass = getCompetitorsAndDominantBoatClass(race); logger.info("Creating RaceDefinitionImpl for race "+race.getName()); raceDefinition = new RaceDefinitionImpl(race.getName(), course, competitorsAndDominantBoatClass.getB(), - competitorsAndDominantBoatClass.getA(), race.getId()); + competitorsAndDominantBoatClass.getA(), getRaceID(race)); // add to domain Event only if boat class matches if (raceDefinition.getBoatClass() == trackedRegatta.getRegatta().getBoatClass()) { trackedRegatta.getRegatta().addRace(raceDefinition); 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 3e0863361aa..9ece623a264 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 @@ -5,6 +5,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.Serializable; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -173,12 +174,18 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements // Start live and stored data streams ioThread = new Thread(controller, "I/O for event "+tractracEvent.getName()+", race URL "+paramURL); for (Race tractracRace : tractracEvent.getRaceList()) { + // Try to find a pre-associated event based on the Race ID + if (regatta == null) { + Serializable raceID = domainFactory.getRaceID(tractracRace); + regatta = trackedRegattaRegistry.getRememberedRegattaForRace(raceID); + } // removeRace may detach the domain regatta from the domain factory if that // removed the last race; therefore, it's important to getOrCreate the // domain regatta *after* calling removeRace domainFactory.removeRace(tractracEvent, tractracRace, trackedRegattaRegistry); } - // TODO bug 733: use trackedRegattaRegistry to obtain a regatta using the race ID + // if regatta is still null, no previous assignment of any of the races in this TracTrac event to a Regatta was found; + // in this case, create a default regatta based on the TracTrac event data this.regatta = regatta == null ? domainFactory.getOrCreateRegatta(tractracEvent, trackedRegattaRegistry) : regatta; trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(this.regatta); receivers = new HashSet(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java index 9e7c8710373..41b58e32c1a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegattaRegistry.java @@ -1,5 +1,7 @@ package com.sap.sailing.domain.tracking; +import java.io.Serializable; + import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; @@ -34,10 +36,11 @@ public interface TrackedRegattaRegistry { * regatta will be returned. *

* - * If no such explicit assignment has been performed, an "appropriate" non-persistent default regatta will be - * selected and returned. + * If no such explicit assignment has been performed, null is returned. + * + * @param raceID the ID as obtained from {@link RaceDefinition#getId()} */ - Regatta getRememberedRegattaForRace(RaceDefinition race); + Regatta getRememberedRegattaForRace(Serializable raceID); /** * Persistently remembers the association of the race with its {@link RaceDefinition#getId()} to the 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 b8034af1f16..f5c8e332f1f 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 @@ -1374,8 +1374,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen } @Override - public Regatta getRememberedRegattaForRace(RaceDefinition race) { - return persistentRegattasForRaceIDs.get(race.getId().toString()); + public Regatta getRememberedRegattaForRace(Serializable raceID) { + return persistentRegattasForRaceIDs.get(raceID.toString()); } @Override