Merge branch 'master' into kiwo2014

This commit is contained in:
Axel Uhl committed 2014-06-22 01:09:44 +02:00
commit 46111440c1
13 files changed
+143 -71

No files matched your search

@@ -31,7 +31,7 @@ import com.sap.sailing.domain.racelog.tracking.test.mock.SmartphoneImeiIdentifie
import com.sap.sailing.domain.racelogtracking.test.AbstractGPSFixStoreTest;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.impl.BaseRaceChangeListener;
import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tracking.impl.TrackedRegattaImpl;
@@ -114,7 +114,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections.<Sideline>emptyList(),
EmptyWindStore.INSTANCE, store, 0, 0, 0);
trackedRace.addListener(new BaseRaceChangeListener() {
trackedRace.addListener(new AbstractRaceChangeListener() {
boolean currentlyLoadingFirst = true;
@Override
public void competitorPositionChanged(GPSFixMoving fix, Competitor competitor) {
@@ -103,6 +103,16 @@ public class LeaderboardCacheManager {
removeFromCache(leaderboard);
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
removeFromCache(leaderboard);
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
removeFromCache(leaderboard);
}
@Override
public void delayToLiveChanged(long delayToLiveInMillis) {
removeFromCache(leaderboard);
@@ -288,6 +288,16 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
invalidateCacheAndRemoveThisListenerFromTrackedRace();
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
invalidateCacheAndRemoveThisListenerFromTrackedRace();
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
invalidateCacheAndRemoveThisListenerFromTrackedRace();
}
@Override
public void statusChanged(TrackedRaceStatus newStatus) {
// when the status changes away from LOADING, calculations may start or resume, making it necessary to clear the cache
@@ -59,5 +59,13 @@ public abstract class AbstractRaceChangeListener implements RaceChangeListener {
@Override
public void delayToLiveChanged(long delayToLiveInMillis) {
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
}
}
@@ -1,64 +0,0 @@
package com.sap.sailing.domain.tracking.impl;
import java.util.Map;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.TrackedRaceStatus;
import com.sap.sailing.domain.tracking.Wind;
public class BaseRaceChangeListener implements RaceChangeListener {
@Override
public void competitorPositionChanged(GPSFixMoving fix, Competitor competitor) {
}
@Override
public void markPositionChanged(GPSFix fix, Mark mark) {
}
@Override
public void markPassingReceived(Competitor competitor, Map<Waypoint, MarkPassing> oldMarkPassings,
Iterable<MarkPassing> markPassings) {
}
@Override
public void speedAveragingChanged(long oldMillisecondsOverWhichToAverage, long newMillisecondsOverWhichToAverage) {
}
@Override
public void windDataReceived(Wind wind, WindSource windSource) {
}
@Override
public void windDataRemoved(Wind wind, WindSource windSource) {
}
@Override
public void windAveragingChanged(long oldMillisecondsOverWhichToAverage, long newMillisecondsOverWhichToAverage) {
}
@Override
public void raceTimesChanged(TimePoint startOfTracking, TimePoint endOfTracking, TimePoint startTimeReceived) {
}
@Override
public void delayToLiveChanged(long delayToLiveInMillis) {
}
@Override
public void windSourcesToExcludeChanged(Iterable<? extends WindSource> windSourcesToExclude) {
}
@Override
public void statusChanged(TrackedRaceStatus newStatus) {
}
}
@@ -85,6 +85,15 @@ public class CrossTrackErrorCache extends AbstractRaceChangeListener {
private static final long serialVersionUID = 4884868659665863604L;
public void deleteAll() {
lockForWrite();
try {
getInternalRawFixes().clear();
} finally {
unlockAfterWrite();
}
}
public void deleteAllLaterThan(TimePoint from) {
// TODO use a specialized ArrayList in a specialized ArrayListNavigableSet and then make removeRange public
lockForWrite();
@@ -171,7 +180,11 @@ public class CrossTrackErrorCache extends AbstractRaceChangeListener {
FromTimePointToEndUpdateInterval updateInterval) {
CrossTrackErrorSumAndNumberOfFixesTrack result;
if (oldValue != null) {
oldValue.deleteAllLaterThan(updateInterval.getFrom());
if (updateInterval == null) {
oldValue.deleteAll();
} else {
oldValue.deleteAllLaterThan(updateInterval.getFrom());
}
computedCacheUpdate.lockForRead();
try {
for (CrossTrackErrorSumAndNumberOfFixes entry : computedCacheUpdate.getRawFixes()) {
@@ -434,6 +447,27 @@ public class CrossTrackErrorCache extends AbstractRaceChangeListener {
}
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
invalidate();
}
/**
* Invalidates all cache contents for all competitors from the beginning of time
*/
private void invalidate() {
final List<Competitor> shuffledCompetitors = new ArrayList<>(cachePerCompetitor.keySet());
Collections.shuffle(shuffledCompetitors);
for (Competitor competitor : shuffledCompetitors) {
cachePerCompetitor.triggerUpdate(competitor, null /* meaning: from the beginning of time */);
}
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
invalidate();
}
@Override
public String toString() {
return "CrossTrackErrorCache for competitors "+cachePerCompetitor.keySet();
@@ -362,6 +362,48 @@ DynamicTrackedRace, GPSTrackListener<Competitor, GPSFixMoving> {
}
}
private void notifyListenersWaypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
RaceChangeListener[] listeners;
synchronized (getListeners()) {
listeners = getListeners().toArray(new RaceChangeListener[getListeners().size()]);
}
for (RaceChangeListener listener : listeners) {
try {
listener.waypointAdded(zeroBasedIndex, waypointThatGotAdded);
} catch (Exception e) {
logger.log(Level.SEVERE, "RaceChangeListener " + listener + " threw exception " + e.getMessage());
logger.log(Level.SEVERE, "notifyListenersWaypointAdded(int, Waypoint)", e);
}
}
}
private void notifyListenersWaypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
RaceChangeListener[] listeners;
synchronized (getListeners()) {
listeners = getListeners().toArray(new RaceChangeListener[getListeners().size()]);
}
for (RaceChangeListener listener : listeners) {
try {
listener.waypointRemoved(zeroBasedIndex, waypointThatGotRemoved);
} catch (Exception e) {
logger.log(Level.SEVERE, "RaceChangeListener " + listener + " threw exception " + e.getMessage());
logger.log(Level.SEVERE, "notifyListenersWaypointRemoved(int, Waypoint)", e);
}
}
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
super.waypointAdded(zeroBasedIndex, waypointThatGotAdded);
notifyListenersWaypointAdded(zeroBasedIndex, waypointThatGotAdded);
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
super.waypointRemoved(zeroBasedIndex, waypointThatGotRemoved);
notifyListenersWaypointRemoved(zeroBasedIndex, waypointThatGotRemoved);
}
private void notifyListeners(GPSFix fix, Mark mark) {
RaceChangeListener[] listeners;
synchronized (getListeners()) {
@@ -677,6 +677,16 @@ public class TrackBasedEstimationWindTrackImpl extends VirtualWindTrackImpl impl
clearCache();
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
clearCache();
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
clearCache();
}
@Override
public void markPositionChanged(GPSFix fix, Mark mark) {
assert fix != null && fix.getTimePoint() != null;
@@ -234,6 +234,16 @@ public class TrackedLegImpl implements TrackedLeg, RaceChangeListener {
clearCaches();
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
clearCaches(); // necessary because the competitor tracks ordered by rank may change for legs adjacent to the waypoint added
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
clearCaches(); // necessary because the competitor tracks ordered by rank may change for legs adjacent to the waypoint removed
}
@Override
public void statusChanged(TrackedRaceStatus newStatus) {
// no-op; the leg doesn't mind the tracked race's status being updated
@@ -223,15 +223,16 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
@Override
public Color getColor(CompetitorDTO competitor) {
Color result = null;
final Color result;
if (allCompetitors.contains(competitor)) {
if (competitor.getColor() != null) {
result = competitor.getColor();
} else {
result = competitorsColorMap.getColorByID(competitor);
}
} else {
result = null;
}
return result;
}
@@ -15,4 +15,5 @@ Fragment-Host: com.sap.sailing.manage2sail.resultimport
Require-Bundle: org.junit4;bundle-version="4.8.2",
com.sap.sse.common,
org.mockito.mockito-core;bundle-version="1.9.5",
org.objenesis;bundle-version="1.3.0"
org.objenesis;bundle-version="1.3.0",
org.hamcrest;bundle-version="1.1.0"
@@ -101,7 +101,7 @@ public class ScoreCorrectionProviderImpl implements ScoreCorrectionProvider, Res
if(divisionGender != null) {
divisionBoatClassAndGender += ", " + divisionGender.name();
}
if (boatClassName.equalsIgnoreCase(divisionBoatClassAndGender)) {
if (boatClassName.equalsIgnoreCase(divisionBoatClassAndGender) || boatClassName.contains(divisionBoatClassAndGender)) {
return new XRRRegattaResultsAsScoreCorrections(event, division, this,
parser);
}
@@ -1328,6 +1328,16 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
public void raceTimesChanged(TimePoint startOfTracking, TimePoint endOfTracking, TimePoint startTimeReceived) {
replicate(new UpdateRaceTimes(getRaceIdentifier(), startOfTracking, endOfTracking, startTimeReceived));
}
@Override
public void waypointAdded(int zeroBasedIndex, Waypoint waypointThatGotAdded) {
// no-op; the course change is replicated by the separate CourseChangeReplicator
}
@Override
public void waypointRemoved(int zeroBasedIndex, Waypoint waypointThatGotRemoved) {
// no-op; the course change is replicated by the separate CourseChangeReplicator
}
@Override
public void delayToLiveChanged(long delayToLiveInMillis) {