fixed issue with regatta creation

This commit is contained in:
Axel Uhl committed 2012-05-23 14:28:45 +02:00
1 parent c953955d5f
commit fe1180f7bd
10 files changed
+57 -29

No files matched your search

@@ -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<String, Regatta> raceIDToEventCache;
private final Map<Iterable<String>, ControlPoint> controlPointCache;
private final Map<String, BoatClass> 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<Competitor> competitors = createCompetitorList(startList, boatClass);
logger.info("Creating RaceDefinitionImpl for race "+race.getRaceID());
RaceDefinition result = new RaceDefinitionImpl(race.getRaceID(), domainCourse,
boatClass, competitors);
regatta.addRace(result);
@@ -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<String, String, Integer> createID(String raceID, String hostname, int port) {
return new Triple<String, String, Integer>(raceID, hostname, port);
}
@@ -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<List<Competitor>, 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
@@ -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
@@ -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<RaceDefinition> 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 <code>null</code>, then <code>domainFactory.getOrCreateRegatta(tractracEvent)</code> 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<Receiver>();
Set<TypeController> typeControllers = new HashSet<TypeController>();
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<URL, URI, URI> createID(URL paramURL, URI liveURI, URI storedURI) {
return new Triple<URL, URI, URI>(paramURL, liveURI, storedURI);
}
@@ -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<RaceDefinition> 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) {
@@ -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();
}
@@ -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<TrackedRace> coll = trackedRacesByBoatClass.get(trackedRace.getRace().getBoatClass());
if (coll == null) {
@@ -64,10 +64,14 @@ public class RaceTrackerTest {
logger.info("Calling raceHandle.getRaces()");
Set<RaceDefinition> 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();
@@ -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);