copy all wind sources during slicing that canBeStored()

Change-Id: Ia1ecf55226d1a49cf57a069937c37d5733c77e5d
This commit is contained in:
Axel Uhl
2018-02-20 15:08:29 +01:00
parent c4ec2d709e
commit 8fa1873471
2 changed files with 17 additions and 30 deletions
@@ -69,6 +69,9 @@ public class SliceRaceHandler {
private boolean canSlice = false;
/**
* Registers this handler as a zoom event handler on the {@code competitorRaceChart}.
*/
public SliceRaceHandler(SailingServiceAsync sailingService, UserService userService, final ErrorReporter errorReporter,
MultiCompetitorRaceChart competitorRaceChart, RegattaAndRaceIdentifier selectedRaceIdentifier,
final String leaderboardGroupName, String leaderboardName, UUID eventId) {
@@ -79,9 +82,7 @@ public class SliceRaceHandler {
this.leaderboardGroupName = leaderboardGroupName;
this.leaderboardName = leaderboardName;
this.eventId = eventId;
styles.ensureInjected();
sliceButtonUi = new Button();
sliceButtonUi.setStyleName(styles.sliceButtonBackgroundImage());
sliceButtonUi.setTitle(StringMessages.INSTANCE.sliceRace());
@@ -93,7 +94,6 @@ public class SliceRaceHandler {
updateVisibility();
});
sliceButtonUi.addClickHandler((e) -> doSlice());
sailingService.canSliceRace(selectedRaceIdentifier, new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
@@ -107,7 +107,6 @@ public class SliceRaceHandler {
updateVisibility();
}
});
final UserStatusEventHandler userStatusEventHandler = (user, preAuthenticated) -> {
updateVisibility();
};
@@ -7004,19 +7004,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
private boolean isSmartphoneTrackingEnabled(DynamicTrackedRace trackedRace) {
boolean result = false;
for (RaceLog raceLog : trackedRace.getAttachedRaceLogs()) {
RaceLogTrackingState raceLogTrackingState = new RaceLogTrackingStateAnalyzer(raceLog).analyze();
if (raceLogTrackingState.isTracking()) {
return true;
result = true;
break;
}
}
return false;
return result;
}
@Override
public SliceRacePreperationDTO prepareForSlicingOfRace(final RegattaAndRaceIdentifier raceIdentifier) {
final Leaderboard regattaLeaderboard = getService().getLeaderboardByName(raceIdentifier.getRegattaName());
String prefix = null;
int currentCount = 0;
final Pattern pattern = Pattern.compile("^([a-zA-Z_ -]+)([0-9]+)$");
@@ -7029,7 +7030,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
currentCount = Integer.parseInt(matcher.group(2));
}
}
if (prefix == null) {
prefix = "R";
}
@@ -7057,28 +7057,21 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|| (endOfTrackingOfRaceToSlice != null && endOfTrackingOfRaceToSlice.before(sliceTo))) {
throw new RuntimeException("The TimeRange to slice is not part of the race");
}
final RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) getService().getLeaderboardByName(raceIdentifier.getRegattaName());
final Pair<RaceColumn, Fleet> raceColumnAndFleetOfRaceToSlice = regattaLeaderboard.getRaceColumnAndFleet(trackedRaceToSlice);
// RaceColumns in a RegattaLeaderboard are always RaceColumnInSeries instances
final RaceColumnInSeries raceColumnOfRaceToSlice = (RaceColumnInSeries) raceColumnAndFleetOfRaceToSlice.getA();
final Fleet fleet = raceColumnAndFleetOfRaceToSlice.getB();
final Series series = raceColumnOfRaceToSlice.getSeries();
final RaceLog raceLogOfRaceToSlice = raceColumnOfRaceToSlice.getRaceLog(fleet);
getService().apply(new AddColumnToSeries(regattaIdentifier, series.getName(), newRaceColumnName));
final RaceColumn raceColumn = regattaLeaderboard.getRaceColumnByName(newRaceColumnName);
final RaceLog raceLog = raceColumn.getRaceLog(fleet);
final AbstractLogEventAuthor author = getService().getServerAuthor();
final TimePoint startOfTracking = sliceFrom;
final TimePoint endOfTracking = sliceTo;
raceLog.add(new RaceLogStartOfTrackingEventImpl(startOfTracking, author, raceLog.getCurrentPassId()));
raceLog.add(new RaceLogEndOfTrackingEventImpl(endOfTracking, author, raceLog.getCurrentPassId()));
final TimeRange timeRange = new TimeRangeImpl(sliceFrom, sliceTo);
final StartTimeFinderResult startTimeFinderResult = new StartTimeFinder(getService(), raceLogOfRaceToSlice).analyze();
final TimePoint startTime = startTimeFinderResult.getStartTime();
@@ -7268,25 +7261,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
});
}
windFixEvents.getFilteredEvents()
.forEach(event -> raceLog.add(new RaceLogWindFixEventImpl(event.getCreatedAt(),
event.getLogicalTimePoint(), event.getAuthor(), UUID.randomUUID(), raceLog.getCurrentPassId(),
event.getWindFix(), event.isMagnetic())));
final TimePoint startTrackingTimePoint = MillisecondsTimePoint.now();
// this ensures that the events consistently have different timepoints to ensure a consistent result of the state analysis
// that's why we can't just call adapter.denoteRaceForRaceLogTracking
final TimePoint denotationTimePoint = startTrackingTimePoint.minus(1);
raceLog.add(new RaceLogDenoteForTrackingEventImpl(denotationTimePoint,
author, raceLog.getCurrentPassId(), trackedRaceName, regatta.getBoatClass(), UUID.randomUUID()));
raceLog.add(new RaceLogStartTrackingEventImpl(startTrackingTimePoint, author, raceLog.getCurrentPassId()));
try {
getRaceLogTrackingAdapter().startTracking(getService(), regattaLeaderboard,
raceColumn, fleet, /* trackWind */ true, /* correctWindDirectionByMagneticDeclination */ true);
DynamicTrackedRace trackedRace = null;
for (int i = 0; i < 100 ; i++) {
trackedRace = (DynamicTrackedRace) raceColumn.getTrackedRace(fleet);
@@ -7296,20 +7284,20 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
Thread.sleep(100);
}
}
if (trackedRace == null) {
throw new IllegalStateException("Could not obtain sliced race after 10s");
}
for (WindSource windSourceToCopy : trackedRaceToSlice.getWindSources(WindSourceType.EXPEDITION)) {
final WindTrack windTrackToCopyFrom = trackedRaceToSlice.getOrCreateWindTrack(windSourceToCopy);
windTrackToCopyFrom.lockForRead();
try {
for (Wind windToCopy : windTrackToCopyFrom.getFixes(startOfTracking, true, endOfTracking, true)) {
trackedRace.recordWind(windToCopy, windSourceToCopy);
for (WindSource windSourceToCopy : trackedRaceToSlice.getWindSources()) {
if (windSourceToCopy.canBeStored()) {
final WindTrack windTrackToCopyFrom = trackedRaceToSlice.getOrCreateWindTrack(windSourceToCopy);
windTrackToCopyFrom.lockForRead();
try {
for (Wind windToCopy : windTrackToCopyFrom.getFixes(startOfTracking, true, endOfTracking, true)) {
trackedRace.recordWind(windToCopy, windSourceToCopy);
}
} finally {
windTrackToCopyFrom.unlockAfterRead();
}
} finally {
windTrackToCopyFrom.unlockAfterRead();
}
}
return trackedRace.getRaceIdentifier();