aligned synchronous and asynchronous code paths when adding new fixes

Bug 4551
This commit is contained in:
Steffen Jacobs
2018-07-23 13:38:12 +02:00
parent be775edba9
commit ff9ebaaef2
2 changed files with 53 additions and 23 deletions
@@ -5,9 +5,11 @@ import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -132,6 +134,8 @@ public class EditMarkPositionPanel extends AbstractRaceChart<AbstractSettings> i
private final RaceIdentifierToLeaderboardRaceColumnAndFleetMapper raceIdentifierToLeaderboardRaceColumnAndFleetMapper;
protected boolean nonTrackingWarningWasDisplayed;
private final Set<MarkDTO> marksCurrentlyRequestedViaRemoteCall = new HashSet<>();
public EditMarkPositionPanel(Component<?> parent, ComponentContext<?> context, final RaceMap raceMap,
final SingleRaceLeaderboardPanel leaderboardPanel,
RegattaAndRaceIdentifier selectedRaceIdentifier, String leaderboardName, final StringMessages stringMessages,
@@ -859,11 +863,13 @@ public class EditMarkPositionPanel extends AbstractRaceChart<AbstractSettings> i
}
private void selectMark(MarkDTO mark) {
selectedMark = mark;
if (currentFixPositionChooser != null) {
currentFixPositionChooser.cancel();
currentFixPositionChooser = null;
if (selectedMark != mark) {
if (currentFixPositionChooser != null) {
currentFixPositionChooser.cancel();
currentFixPositionChooser = null;
}
}
selectedMark = mark;
if (selectedMark != null) {
if (marksFromToTimes.get(selectedMark) != null) {
// For some reason the time slider does not change with this method only if you comment out line 430 and 432 in TimePanel it works
@@ -905,24 +911,43 @@ public class EditMarkPositionPanel extends AbstractRaceChart<AbstractSettings> i
@Override
public void onSelectionChange(SelectionChangeEvent event) {
final MarkDTO mark = marksPanel.getSelectedMark();
retrieveAndSelectMarkIfNecessary(mark, null);
}
protected void retrieveAndSelectMarkIfNecessary(final MarkDTO mark, final Runnable callback) {
if (mark != null && (marks.get(mark) == null || marks.get(mark).isEmpty())) {
if (mark != null) {
markPositionService.getMarkTrack(raceIdentifierToLeaderboardRaceColumnAndFleetMapper.getLeaderboardNameAndRaceColumnNameAndFleetName(selectedRaceIdentifier),
if (marksCurrentlyRequestedViaRemoteCall.add(mark)) {
markPositionService.getMarkTrack(
raceIdentifierToLeaderboardRaceColumnAndFleetMapper
.getLeaderboardNameAndRaceColumnNameAndFleetName(selectedRaceIdentifier),
mark.getIdAsString(), new AsyncCallback<MarkTrackDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(stringMessages.errorCommunicatingWithServer()+": "+caught.getMessage());
marksCurrentlyRequestedViaRemoteCall.remove(mark);
errorReporter.reportError(
stringMessages.errorCommunicatingWithServer() + ": " + caught.getMessage());
}
@Override
public void onSuccess(MarkTrackDTO result) {
marksCurrentlyRequestedViaRemoteCall.remove(mark);
createMarkTrackUi(mark, result.getFixes());
selectMark(mark);
if (callback != null) {
callback.run();
}
}
});
}
else {
// remote call of the same mark already in progress -> ignore this request
}
} else {
selectMark(mark);
if (callback != null) {
callback.run();
}
}
}
@@ -85,22 +85,27 @@ public class MarksPanel extends AbstractCompositeComponent<AbstractSettings> {
@Override
public void update(int index, final MarkDTO mark, String value) {
final Date timePoint = parent.timer.getTime();
select(mark);
if (parent.hasFixAtTimePoint(mark, timePoint)) {
parent.showNotification(stringMessages.pleaseSelectOtherTimepoint(), NotificationType.ERROR);
} else {
parent.createFixPositionChooserToAddFixToMark(mark, new Callback<Position, Exception>() {
@Override
public void onFailure(Exception reason) {
parent.resetCurrentFixPositionChooser();
parent.retrieveAndSelectMarkIfNecessary(mark, new Runnable() {
@Override
public void run() {
if (parent.hasFixAtTimePoint(mark, timePoint)) {
parent.showNotification(stringMessages.pleaseSelectOtherTimepoint(), NotificationType.ERROR);
} else {
parent.createFixPositionChooserToAddFixToMark(mark, new Callback<Position, Exception>() {
@Override
public void onFailure(final Exception reason) {
parent.resetCurrentFixPositionChooser();
}
@Override
public void onSuccess(Position result) {
parent.addMarkFix(mark, timePoint, result);
parent.resetCurrentFixPositionChooser();
}
});
}
@Override
public void onSuccess(Position result) {
parent.addMarkFix(mark, timePoint, result);
parent.resetCurrentFixPositionChooser();
}
});
}
}
});
}
});
markTable.addColumn(addFixColumn);