add new RaceDefinition to Event before notifying waiters

This commit is contained in:
Axel Uhl committed 2011-12-19 14:46:40 +01:00
1 parent b7ac55ae5f
commit 58a20e9bdd
3 files changed
+26 -21

No files matched your search

@@ -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,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();
@@ -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);
}
}