mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-09 22:01:02 +00:00
fixed issue with regatta creation
This commit is contained in:
1 parent
c953955d5f
commit
fe1180f7bd
10 files changed
+57
-29
No files matched your search
+6
-2
@@ -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);
|
||||
|
||||
+7
-1
@@ -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);
|
||||
}
|
||||
|
||||
+4
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+18
-6
@@ -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) {
|
||||
|
||||
+1
-12
@@ -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();
|
||||
}
|
||||
+2
@@ -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();
|
||||
|
||||
+9
-6
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user