Changed the analyzers to read only after aquiring the read lock

This commit is contained in:
Armin Zamani committed 2013-03-19 01:30:27 +01:00
1 parent 212b2e2d82
commit fdff49ebb8
8 files changed
+210 -109

No files matched your search

@@ -75,7 +75,7 @@ public class ManagedRaceImpl implements ManagedRace {
@Override
public CourseData getCourseDesign() {
return null;
return state.getCourseDesign();
}
}
@@ -41,6 +41,13 @@ public interface RaceState {
* @return the finished time or <code>null</code>.
*/
TimePoint getFinishedTime();
/**
* Sets the current race's course design
*
* @return the course data or <code>null</code>.
*/
CourseData getCourseDesign();
/**
* Sets the current race's start time
@@ -20,6 +20,7 @@ import com.sap.sailing.racecommittee.app.domain.state.RaceState;
import com.sap.sailing.racecommittee.app.domain.state.RaceStateChangedListener;
import com.sap.sailing.racecommittee.app.domain.state.StartProcedure;
import com.sap.sailing.racecommittee.app.domain.state.impl.analyzers.FinishedTimeFinder;
import com.sap.sailing.racecommittee.app.domain.state.impl.analyzers.LastPublishedCourseDesignFinder;
import com.sap.sailing.racecommittee.domain.state.impl.analyzers.RaceStatusAnalyzer;
import com.sap.sailing.racecommittee.domain.state.impl.analyzers.StartTimeFinder;
@@ -36,6 +37,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
private RaceStatusAnalyzer statusAnalyzer;
private StartTimeFinder startTimeFinder;
private FinishedTimeFinder finishedTimeFinder;
private LastPublishedCourseDesignFinder lastCourseDesignFinder;
public RaceStateImpl(PassAwareRaceLog raceLog, StartProcedure procedure) {
this.raceLog = raceLog;
@@ -50,6 +52,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
this.startTimeFinder = new StartTimeFinder(raceLog);
this.finishedTimeFinder = new FinishedTimeFinder(raceLog);
this.statusAnalyzer = new RaceStatusAnalyzer(raceLog);
this.lastCourseDesignFinder = new LastPublishedCourseDesignFinder(raceLog);
updateStatus();
}
@@ -104,6 +107,12 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
return finishedTimeFinder.getFinishedTime();
}
@Override
public CourseData getCourseDesign() {
return lastCourseDesignFinder.getLastCourseDesign();
}
public void setCourseDesign(CourseData newCourseData) {
TimePoint eventTime = MillisecondsTimePoint.now();
@@ -1,29 +1,44 @@
package com.sap.sailing.racecommittee.app.domain.state.impl.analyzers;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.racecommittee.domain.state.impl.analyzers.RaceLogAnalyzer;
public class FinishedTimeFinder extends RaceLogAnalyzer {
public FinishedTimeFinder(RaceLog raceLog) {
super(raceLog);
}
public TimePoint getFinishedTime() {
TimePoint finishedTime = null;
for (RaceLogEvent event : getPassEvents()) {
if (event instanceof RaceLogRaceStatusEvent) {
RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event;
if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHED)) {
finishedTime = statusEvent.getTimePoint();
}
}
}
return finishedTime;
}
}
package com.sap.sailing.racecommittee.app.domain.state.impl.analyzers;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.domain.racelog.RaceLogRaceStatusEvent;
import com.sap.sailing.racecommittee.domain.state.impl.analyzers.RaceLogAnalyzer;
public class FinishedTimeFinder extends RaceLogAnalyzer {
public FinishedTimeFinder(RaceLog raceLog) {
super(raceLog);
}
public TimePoint getFinishedTime() {
TimePoint finishedTime = null;
this.raceLog.lockForRead();
try {
finishedTime = searchForFinishedTime();
} finally {
this.raceLog.unlockAfterRead();
}
return finishedTime;
}
private TimePoint searchForFinishedTime() {
TimePoint finishedTime = null;
for (RaceLogEvent event : getPassEvents()) {
if (event instanceof RaceLogRaceStatusEvent) {
RaceLogRaceStatusEvent statusEvent = (RaceLogRaceStatusEvent) event;
if (statusEvent.getNextStatus().equals(RaceLogRaceStatus.FINISHED)) {
finishedTime = statusEvent.getTimePoint();
}
}
}
return finishedTime;
}
}
@@ -0,0 +1,41 @@
package com.sap.sailing.racecommittee.app.domain.state.impl.analyzers;
import com.sap.sailing.domain.base.CourseData;
import com.sap.sailing.domain.racelog.RaceLog;
import com.sap.sailing.domain.racelog.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.racelog.RaceLogEvent;
import com.sap.sailing.racecommittee.domain.state.impl.analyzers.RaceLogAnalyzer;
public class LastPublishedCourseDesignFinder extends RaceLogAnalyzer {
public LastPublishedCourseDesignFinder(RaceLog raceLog) {
super(raceLog);
}
public CourseData getLastCourseDesign() {
CourseData lastCourseData = null;
this.raceLog.lockForRead();
try {
lastCourseData = searchForLastCourseData();
} finally {
this.raceLog.unlockAfterRead();
}
return lastCourseData;
}
private CourseData searchForLastCourseData() {
CourseData lastCourseData = null;
for (RaceLogEvent event : getAllEvents()) {
if (event instanceof RaceLogCourseDesignChangedEvent) {
RaceLogCourseDesignChangedEvent courseDesignEvent = (RaceLogCourseDesignChangedEvent) event;
lastCourseData = courseDesignEvent.getCourseDesign();
}
}
return lastCourseData;
}
}