mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-09 13:50:57 +00:00
add new RaceDefinition to Event before notifying waiters
This commit is contained in:
1 parent
b7ac55ae5f
commit
58a20e9bdd
3 files changed
+26
-21
No files matched your search
+10
-6
@@ -134,12 +134,16 @@ public interface DomainFactory {
|
||||
|
||||
/**
|
||||
* Creates a {@link RaceDefinition} from a TracTrac {@link Race} and a domain {@link Course} definition. The
|
||||
* resulting {@link RaceDefinition} is <em>not</em> added to any {@link com.sap.sailing.domain.base.Event} yet. It
|
||||
* is added to the internal race cache. The corresponding {@link TrackedRace} object is also created, and the
|
||||
* notification of threads waiting on the race cache such as a blocking {@link #getAndWaitForRaceDefinition(Race)}
|
||||
* happens only <em>after</em> the tracked race has been created. This ensures that waiters for the
|
||||
* {@link RaceDefinition} are guaranteed to obtain a valid, non-<code>null</code> tracked race already immediately
|
||||
* after the notification was sent.
|
||||
* resulting {@link RaceDefinition} is added to the {@link com.sap.sailing.domain.base.Event} to which
|
||||
* <code>trackedEvent</code> belongs (see {@link TrackedEvent#getEvent()}). It is added to the internal race cache.
|
||||
* The corresponding {@link TrackedRace} object is also created, and the notification of threads waiting on the race
|
||||
* cache such as a blocking {@link #getAndWaitForRaceDefinition(Race)} happens only <em>after</em> the tracked race
|
||||
* has been created and the {@link RaceDefinition} was
|
||||
* {@link com.sap.sailing.domain.base.Event#addRace(RaceDefinition) added} to the domain event. This ensures that
|
||||
* waiters for the {@link RaceDefinition} are guaranteed to obtain a valid, non- <code>null</code> tracked race
|
||||
* already immediately after the notification was sent, and that the {@link RaceDefinition} is already
|
||||
* {@link com.sap.sailing.domain.base.Event#getAllRaces() known} by its containing
|
||||
* {@link com.sap.sailing.domain.base.Event}.
|
||||
*
|
||||
* @param raceDefinitionSetToUpdate
|
||||
* if not <code>null</code>, after creating the {@link TrackedRace}, the {@link RaceDefinition} is
|
||||
|
||||
+13
-1
@@ -13,6 +13,7 @@ import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sap.sailing.domain.base.Boat;
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
@@ -66,6 +67,8 @@ import com.tractrac.clientmodule.data.ControlPointPositionData;
|
||||
import difflib.PatchFailedException;
|
||||
|
||||
public class DomainFactoryImpl implements DomainFactory {
|
||||
private static final Logger logger = Logger.getLogger(DomainFactoryImpl.class.getName());
|
||||
|
||||
private final com.sap.sailing.domain.base.DomainFactory baseDomainFactory;
|
||||
|
||||
// TODO consider (re-)introducing WeakHashMaps for cache structures, but such that the cache is maintained as long as our domain objects are strongly referenced
|
||||
@@ -336,7 +339,16 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
Pair<List<Competitor>, BoatClass> competitorsAndDominantBoatClass = getCompetitorsAndDominantBoatClass(race);
|
||||
raceDefinition = new RaceDefinitionImpl(race.getName(), course, competitorsAndDominantBoatClass.getB(),
|
||||
competitorsAndDominantBoatClass.getA());
|
||||
TrackedRace trackedRace = createTrackedRace(trackedEvent, raceDefinition, windStore, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
|
||||
TrackedRace trackedRace = createTrackedRace(trackedEvent, raceDefinition, windStore,
|
||||
millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
|
||||
// add to domain Event only if boat class matches
|
||||
if (raceDefinition.getBoatClass() == trackedEvent.getEvent().getBoatClass()) {
|
||||
trackedEvent.getEvent().addRace(raceDefinition);
|
||||
} else {
|
||||
logger.warning("Not adding race "+raceDefinition+" to event "+trackedEvent.getEvent()+
|
||||
" because boat class "+raceDefinition.getBoatClass()+" doesn't match event's boat class "+
|
||||
trackedEvent.getEvent().getBoatClass());
|
||||
}
|
||||
synchronized (raceCache) {
|
||||
raceCache.put(race, raceDefinition);
|
||||
raceCache.notifyAll();
|
||||
|
||||
+3
-14
@@ -12,10 +12,8 @@ import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
|
||||
import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.tracking.WindStore;
|
||||
import com.sap.sailing.domain.tractracadapter.DomainFactory;
|
||||
import com.sap.sailing.util.Util.Pair;
|
||||
import com.sap.sailing.util.Util.Triple;
|
||||
import com.tractrac.clientmodule.Race;
|
||||
import com.tractrac.clientmodule.Route;
|
||||
@@ -92,18 +90,9 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<Route, RouteDa
|
||||
}
|
||||
} else {
|
||||
logger.log(Level.INFO, "Received course for non-existing race "+event.getC().getName()+". Creating RaceDefinition.");
|
||||
// create race definition
|
||||
Pair<RaceDefinition, TrackedRace> raceDefinitionAndTrackedRace = getDomainFactory().getOrCreateRaceDefinitionAndTrackedRace(
|
||||
getTrackedEvent(), event.getC(), course, windStore, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
|
||||
// add race only if boat class matches
|
||||
RaceDefinition raceDefinition = raceDefinitionAndTrackedRace.getA();
|
||||
if (raceDefinition.getBoatClass() == getTrackedEvent().getEvent().getBoatClass()) {
|
||||
getTrackedEvent().getEvent().addRace(raceDefinition);
|
||||
} else {
|
||||
logger.warning("Not adding race "+raceDefinition+" to event "+getTrackedEvent().getEvent()+
|
||||
" because boat class "+raceDefinition.getBoatClass()+" doesn't match event's boat class "+
|
||||
getTrackedEvent().getEvent().getBoatClass());
|
||||
}
|
||||
// create race definition and add to event
|
||||
getDomainFactory().getOrCreateRaceDefinitionAndTrackedRace(getTrackedEvent(), event.getC(), course,
|
||||
windStore, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user