cleaner solution, passing on dependentRaceStates, as had already been prepared but not completed

Change-Id: Ib3d6c3b5ae6a1b1167b77e3ec3fdb9542ddfc48b
This commit is contained in:
Axel Uhl committed 2017-06-23 12:33:32 +02:00
1 parent 66b5a093df
commit 330fdddaa5
1 file changed
+20 -13
@@ -22,7 +22,6 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.ProtestTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceStatusAnalyzer.Clock;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult.ResolutionFailed;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RacingProcedureTypeAnalyzer;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult;
@@ -174,7 +173,7 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
protected ReadonlyRaceStateImpl(RaceLogResolver raceLogResolver, RaceLog raceLog,
SimpleRaceLogIdentifier forRaceLogIdentifier, Clock analyzersClock,
RacingProcedureFactory procedureFactory,
Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStates, boolean update) {
final Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStates, boolean update) {
this.raceLog = raceLog;
this.raceLogResolver = raceLogResolver;
this.procedureFactory = procedureFactory;
@@ -213,7 +212,6 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
this.raceLog.addListener(new WeakRaceLogChangedVisitor(this.raceLog, this));
// We known that recreateRacingProcedure calls update() when done, therefore this RaceState
// will be fully initialized after this line
recreateRacingProcedure();
final Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStatesAndMe;
if (forRaceLogIdentifier != null) {
dependentRaceStatesAndMe = new HashMap<>(dependentRaceStates);
@@ -221,9 +219,10 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
} else {
dependentRaceStatesAndMe = dependentRaceStates;
}
recreateRacingProcedure(dependentRaceStatesAndMe);
// Check whether the latest known StartTimeEvent is a non-dependent or dependent start time in case of a
// dependent startTime setup listeners
adjustObserverForRelativeStartTime();
adjustObserverForRelativeStartTime(dependentRaceStatesAndMe);
}
protected ReadonlyRaceState getRaceStateToObserve() {
@@ -373,13 +372,17 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
}
private void adjustObserverForRelativeStartTime() {
final StartTimeFinderResult startTimeAnalysisResult = startTimeAnalyzer.analyze();
adjustObserverForRelativeStartTime(startTimeAnalysisResult);
adjustObserverForRelativeStartTime(Collections.<SimpleRaceLogIdentifier, ReadonlyRaceState>emptyMap());
}
private void adjustObserverForRelativeStartTime(final StartTimeFinderResult startTimeAnalysisResult) {
if (startTimeAnalysisResult.getResolutionFailed() != ResolutionFailed.CYCLIC_DEPENDENCY && startTimeAnalysisResult.isDependentStartTime()) {
setupListenersOnDependentRace(startTimeAnalysisResult, Collections.<SimpleRaceLogIdentifier, ReadonlyRaceState>emptyMap());
private void adjustObserverForRelativeStartTime(final Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStates) {
final StartTimeFinderResult startTimeAnalysisResult = startTimeAnalyzer.analyze();
adjustObserverForRelativeStartTime(startTimeAnalysisResult, dependentRaceStates);
}
private void adjustObserverForRelativeStartTime(final StartTimeFinderResult startTimeAnalysisResult, Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStates) {
if (startTimeAnalysisResult.isDependentStartTime()) {
setupListenersOnDependentRace(startTimeAnalysisResult, dependentRaceStates);
} else if (raceStateToObserve != null) {
raceStateToObserve.removeChangedListener(raceStateToObserveListener);
raceStateToObserve = null;
@@ -419,11 +422,15 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
}
protected void update() {
update(/* dependentRaceStates */ Collections.<SimpleRaceLogIdentifier, ReadonlyRaceState>emptyMap());
}
protected void update(Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStates) {
RacingProcedureType type = racingProcedureAnalyzer.analyze();
if (!Util.equalsWithNull(cachedRacingProcedureType, type) && type != RacingProcedureType.UNKNOWN) {
cachedRacingProcedureType = type;
cachedRacingProcedureTypeNoFallback = determineInitialProcedureType(type);
recreateRacingProcedure();
recreateRacingProcedure(dependentRaceStates);
changedListeners.onRacingProcedureChanged(this);
}
@@ -447,7 +454,7 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
cachedStartTimeFinderResult = startTimeFinderResult;
changedListeners.onStartTimeChanged(this);
}
adjustObserverForRelativeStartTime(startTimeFinderResult);
adjustObserverForRelativeStartTime(startTimeFinderResult, dependentRaceStates);
TimePoint finishingTime = finishingTimeAnalyzer.analyze();
if (!Util.equalsWithNull(cachedFinishingTime, finishingTime)) {
@@ -494,7 +501,7 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
}
}
private void recreateRacingProcedure() {
private void recreateRacingProcedure(Map<SimpleRaceLogIdentifier, ReadonlyRaceState> dependentRaceStates) {
if (racingProcedure != null) {
removeChangedListener(racingProcedure);
racingProcedure.detach();
@@ -505,7 +512,7 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL
statusAnalyzer = new RaceStatusAnalyzer(raceLogResolver, raceLog, statusAnalyzerClock, racingProcedure);
// let's do an update because status might have changed with new procedure
update();
update(dependentRaceStates);
}
}