From fe1180f7bdd81c288818e38e79a4071af4393544 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 23 May 2012 14:28:45 +0200 Subject: [PATCH] fixed issue with regatta creation --- .../impl/DomainFactoryImpl.java | 8 +++++-- .../impl/SwissTimingRaceTrackerImpl.java | 8 ++++++- .../impl/DomainFactoryImpl.java | 5 +++- .../tractracadapter/impl/RaceHandleImpl.java | 2 +- .../impl/TracTracRaceTrackerImpl.java | 24 ++++++++++++++----- .../sailing/domain/base/impl/RegattaImpl.java | 4 ++++ .../tracking/AbstractRaceTrackerImpl.java | 13 +--------- .../tracking/impl/TrackedRegattaImpl.java | 2 ++ .../sailing/server/test/RaceTrackerTest.java | 5 ++++ .../server/impl/RacingEventServiceImpl.java | 15 +++++++----- 10 files changed, 57 insertions(+), 29 deletions(-) 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 cbe6e8ca9c5..470fe81d9aa 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 @@ -7,24 +7,25 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import com.sap.sailing.domain.base.Boat; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Buoy; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; -import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.CourseImpl; -import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; +import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.Util; @@ -54,6 +55,7 @@ import difflib.PatchFailedException; * */ public class DomainFactoryImpl implements DomainFactory { + private final static Logger logger = Logger.getLogger(DomainFactoryImpl.class.getName()); private final Map raceIDToEventCache; private final Map, ControlPoint> controlPointCache; private final Map olympicClassesByID; @@ -93,6 +95,7 @@ public class DomainFactoryImpl implements DomainFactory { Regatta result = raceIDToEventCache.get(raceID); if (result == null) { result = new RegattaImpl(raceID, null); + logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")"); raceIDToEventCache.put(raceID, result); } return result; @@ -124,6 +127,7 @@ public class DomainFactoryImpl implements DomainFactory { com.sap.sailing.domain.base.Course domainCourse = createCourse(race.getDescription(), course); BoatClass boatClass = getOrCreateBoatClassFromRaceID(race.getRaceID()); Iterable competitors = createCompetitorList(startList, boatClass); + logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID()); RaceDefinition result = new RaceDefinitionImpl(race.getRaceID(), domainCourse, boatClass, competitors); regatta.addRace(result); 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 00c68cec7bc..4b13350f3eb 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 @@ -64,6 +64,7 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen private Course course; private StartList startList; private DynamicTrackedRace trackedRace; + private final DynamicTrackedRegatta trackedRegatta; private boolean loggedIgnore; @@ -88,10 +89,15 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen this.windStore = windStore; this.id = createID(raceID, hostname, port); connector.addSailMasterListener(raceID, this); - setTrackedRegatta(trackedRegattaRegistry.getOrCreateTrackedRegatta(regatta)); + trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(regatta); connector.trackRace(raceID); } + @Override + public DynamicTrackedRegatta getTrackedRegatta() { + return trackedRegatta; + } + static Triple createID(String raceID, String hostname, int port) { return new Triple(raceID, hostname, port); } 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 7e7bb602c6d..85ddd8f39c3 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 @@ -273,7 +273,7 @@ public class DomainFactoryImpl implements DomainFactory { result = new RegattaImpl(event.getName(), boatClass); regattaCache.put(key, result); weakRegattaCache.put(event, result); - logger.info("Created regatta "+result.getName()); + logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+") because none found for key "+key); } } return result; @@ -328,6 +328,7 @@ public class DomainFactoryImpl implements DomainFactory { raceDefinition = getExistingRaceDefinitionForRace(tractracRace); if (raceDefinition != null) { // otherwise, this domain factory doesn't seem to know about the race raceCache.remove(tractracRace); + logger.info("Removed race "+raceDefinition.getName()+" from TracTrac DomainFactoryImpl"); } } if (raceDefinition != null) { @@ -348,6 +349,7 @@ public class DomainFactoryImpl implements DomainFactory { int oldSize = Util.size(regatta.getAllRaces()); regatta.removeRace(raceDefinition); if (oldSize > 0 && Util.size(regatta.getAllRaces()) == 0) { + logger.info("Removing regatta "+regatta.getName()+" ("+regatta.hashCode()+") from TracTrac DomainFactoryImpl"); regattaCache.remove(key); weakRegattaCache.remove(tractracEvent); } @@ -373,6 +375,7 @@ public class DomainFactoryImpl implements DomainFactory { RaceDefinition raceDefinition = raceCache.get(race); if (raceDefinition == null) { Pair, BoatClass> competitorsAndDominantBoatClass = getCompetitorsAndDominantBoatClass(race); + logger.info("Creating RaceDefinitionImpl for race "+race.getName()); raceDefinition = new RaceDefinitionImpl(race.getName(), course, competitorsAndDominantBoatClass.getB(), competitorsAndDominantBoatClass.getA()); // add to domain Event only if boat class matches diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceHandleImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceHandleImpl.java index 9b3223f42c3..0677d6d4dd0 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceHandleImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceHandleImpl.java @@ -26,7 +26,7 @@ public class RaceHandleImpl implements RacesHandle { @Override public com.sap.sailing.domain.base.Regatta getRegatta() { - return domainFactory.getOrCreateRegatta(tractracEvent); + return trackedRegatta.getRegatta(); } @Override 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 f90d48e50ff..cd987a00381 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 @@ -28,6 +28,7 @@ import com.sap.sailing.domain.tracking.AbstractRaceTrackerImpl; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; import com.sap.sailing.domain.tracking.DynamicTrackedRace; +import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.GPSFix; import com.sap.sailing.domain.tracking.RacesHandle; import com.sap.sailing.domain.tracking.TrackedRace; @@ -64,7 +65,8 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements private final DomainFactory domainFactory; private final WindStore windStore; private final Set races; - + private final DynamicTrackedRegatta trackedRegatta; + /** * paramURL, liveURI and storedURI for TracTrac connection */ @@ -116,7 +118,7 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements TimePoint startOfTracking, TimePoint endOfTracking, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry) throws URISyntaxException, MalformedURLException, FileNotFoundException { - this(tractracEvent, domainFactory.getOrCreateRegatta(tractracEvent), domainFactory, paramURL, liveURI, storedURI, + this(tractracEvent, null, domainFactory, paramURL, liveURI, storedURI, startOfTracking, endOfTracking, windStore, trackedRegattaRegistry); } @@ -134,6 +136,11 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements endOfTracking, windStore, trackedRegattaRegistry); } + /** + * + * @param regatta if null, then domainFactory.getOrCreateRegatta(tractracEvent) will be used to + * obtain a default regatta + */ private TracTracRaceTrackerImpl(Event tractracEvent, Regatta regatta, DomainFactory domainFactory, URL paramURL, URI liveURI, URI storedURI, TimePoint startOfTracking, TimePoint endOfTracking, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry) throws URISyntaxException, MalformedURLException, @@ -157,13 +164,13 @@ 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()) { - // removeRace may detach the domain event from the domain factory if that + // removeRace may detach the domain regatta from the domain factory if that // removed the last race; therefore, it's important to getOrCreate the - // domainEvent *after* calling removeRace + // domain regatta *after* calling removeRace domainFactory.removeRace(tractracEvent, tractracRace, trackedRegattaRegistry); } - this.regatta = regatta; - setTrackedRegatta(trackedRegattaRegistry.getOrCreateTrackedRegatta(regatta)); + this.regatta = regatta == null ? domainFactory.getOrCreateRegatta(tractracEvent) : regatta; + trackedRegatta = trackedRegattaRegistry.getOrCreateTrackedRegatta(this.regatta); receivers = new HashSet(); Set typeControllers = new HashSet(); for (Receiver receiver : domainFactory.getUpdateReceivers(getTrackedRegatta(), tractracEvent, startOfTracking, @@ -176,6 +183,11 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl implements addListenersForStoredDataAndStartController(typeControllers); } + @Override + public DynamicTrackedRegatta getTrackedRegatta() { + return trackedRegatta; + } + static Triple createID(URL paramURL, URI liveURI, URI storedURI) { return new Triple(paramURL, liveURI, storedURI); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 412f2ac2f0b..099dccb32b5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.logging.Logger; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -18,6 +19,7 @@ import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.impl.NamedImpl; public class RegattaImpl extends NamedImpl implements Regatta { + private static final Logger logger = Logger.getLogger(RegattaImpl.class.getName()); private static final long serialVersionUID = 6509564189552478869L; private final Set races; private final BoatClass boatClass; @@ -85,6 +87,7 @@ public class RegattaImpl extends NamedImpl implements Regatta { @Override public void addRace(RaceDefinition race) { + logger.info("Adding race "+race.getName()+" to regatta "+getName()+" ("+hashCode()+")"); if (getBoatClass() != null && race.getBoatClass() != getBoatClass()) { throw new IllegalArgumentException("Boat class "+race.getBoatClass()+" doesn't match regatta's boat class "+getBoatClass()); } @@ -101,6 +104,7 @@ public class RegattaImpl extends NamedImpl implements Regatta { @Override public void removeRace(RaceDefinition race) { synchronized (races) { + logger.info("Removing race "+race.getName()+" from regatta "+getName()+" ("+hashCode()+")"); races.remove(race); } synchronized (regattaListeners) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/AbstractRaceTrackerImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/AbstractRaceTrackerImpl.java index 88f0e6d7250..e07508bc40e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/AbstractRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/AbstractRaceTrackerImpl.java @@ -20,17 +20,6 @@ public abstract class AbstractRaceTrackerImpl implements RaceTracker { return result; } - private DynamicTrackedRegatta trackedRegatta; - - public AbstractRaceTrackerImpl() { - } - @Override - public DynamicTrackedRegatta getTrackedRegatta() { - return trackedRegatta; - } - - protected void setTrackedRegatta(DynamicTrackedRegatta trackedRegatta) { - this.trackedRegatta = trackedRegatta; - } + public abstract DynamicTrackedRegatta getTrackedRegatta(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 2ec2f523462..467e575eb9a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -60,6 +60,8 @@ public class TrackedRegattaImpl implements TrackedRegatta { @Override public void addTrackedRace(TrackedRace trackedRace) { synchronized (trackedRaces) { + logger.info("adding tracked race for "+trackedRace.getRace()+" to tracked regatta "+getRegatta().getName()+ + " with regatta hash code "+getRegatta().hashCode()); trackedRaces.put(trackedRace.getRace(), trackedRace); Collection coll = trackedRacesByBoatClass.get(trackedRace.getRace().getBoatClass()); if (coll == null) { diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerTest.java index d936ea82fdf..f4885841fa1 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceTrackerTest.java @@ -64,10 +64,14 @@ public class RaceTrackerTest { logger.info("Calling raceHandle.getRaces()"); Set races = raceHandle.getRaces(); // wait for RaceDefinition to be completely wired in Regatta logger.info("Obtained races: "+races); + assertTrue(!races.isEmpty()); + // TODO the following assertion fails; this suggests that the race obtained above hasn't properly been entered into the regatta. Why??? + assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces())); } @After public void tearDown() throws MalformedURLException, IOException, InterruptedException { + logger.info("calling stopTrackingAndRemove("+raceHandle.getRegatta().getName()+" ("+raceHandle.getRegatta().hashCode()+"))"); service.stopTrackingAndRemove(raceHandle.getRegatta()); } @@ -106,6 +110,7 @@ public class RaceTrackerTest { @Test public void testStopTracking() throws Exception { logger.entering(getClass().getName(), "testStopTracking"); + assertTrue(!Util.isEmpty(raceHandle.getRegatta().getAllRaces())); TrackedRegatta oldTrackedRegatta = raceHandle.getTrackedRegatta(); TrackedRace oldTrackedRace = getTrackedRace(oldTrackedRegatta); RaceDefinition oldRaceDefinition = oldTrackedRace.getRace(); 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 77c36532890..94e0d60be69 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 @@ -30,16 +30,16 @@ import com.sap.sailing.domain.base.Buoy; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.RegattaListener; -import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.common.DefaultLeaderboardName; +import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.RegattaName; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.impl.Util; @@ -49,8 +49,8 @@ import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.RaceColumn; -import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; +import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.persistence.DomainObjectFactory; @@ -70,8 +70,8 @@ import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RacesHandle; -import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTracker; @@ -88,8 +88,8 @@ import com.sap.sailing.operationaltransformation.Operation; import com.sap.sailing.server.OperationExecutionListener; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventServiceOperation; -import com.sap.sailing.server.operationaltransformation.AddRegatta; import com.sap.sailing.server.operationaltransformation.AddRaceDefinition; +import com.sap.sailing.server.operationaltransformation.AddRegatta; import com.sap.sailing.server.operationaltransformation.ConnectTrackedRaceToLeaderboardColumn; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.RecordBuoyGPSFix; @@ -418,6 +418,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen Regatta result = regattasByName.get(regatta.getName()); if (result == null) { result = regatta; + logger.info("Created regatta "+result.getName()+" ("+hashCode()+")"); cacheAndReplicateRegatta(result); } return result; @@ -726,6 +727,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen stopTracking(regatta); if (regatta != null) { if (regatta.getName() != null) { + logger.info("Removing regatta "+regatta.getName()+" ("+regatta.hashCode()+") from RacingEventServiceImpl"); regattasByName.remove(regatta.getName()); regattaTrackingCache.remove(regatta); regatta.removeRegattaListener(this); @@ -927,7 +929,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen synchronized (regattaTrackingCache) { DynamicTrackedRegatta result = regattaTrackingCache.get(regatta); if (result == null) { - logger.info("Creating DynamicTrackedRegattaImpl for regatta "+regatta.getName()); + logger.info("Creating DynamicTrackedRegattaImpl for regatta "+regatta.getName()+ + " with hashCode "+regatta.hashCode()); result = new DynamicTrackedRegattaImpl(regatta); replicate(new TrackRegatta(regatta.getRegattaIdentifier())); regattaTrackingCache.put(regatta, result);