bug5419: fixed sync between boats and competitors (with boat) after edit boat entry.

This commit is contained in:
Udo Wessels
2021-08-16 11:25:39 +02:00
parent 2c5bbce8d6
commit 8c12859a4d
14 changed files with 122 additions and 65 deletions
@@ -123,7 +123,8 @@ public class BoatDTO extends NamedSecuredObjectDTO implements WithID, Serializab
@Override
public String toString() {
return getName() == null ? (getBoatClass().getName() + " / " + getSailId()) : getName();
return "BoatDTO [idAsString=" + idAsString + ", boatClass=" + boatClass + ", sailId=" + sailId + ", color="
+ color + "]";
}
@Override
@@ -45,9 +45,9 @@ public class AbstractRegattaLogFixesAddMappingsDialog extends DataEntryDialog<Co
private BoatDTO boatToSelect;
private boolean inInstableTransitionState = false;
public AbstractRegattaLogFixesAddMappingsDialog(SailingServiceWriteAsync sailingServiceWrite, UserService userService,
final ErrorReporter errorReporter, final StringMessages stringMessages, String leaderboardName,
DialogCallback<Collection<DeviceMappingDTO>> callback) {
public AbstractRegattaLogFixesAddMappingsDialog(SailingServiceWriteAsync sailingServiceWrite,
UserService userService, final ErrorReporter errorReporter, final StringMessages stringMessages,
String leaderboardName, DialogCallback<Collection<DeviceMappingDTO>> callback) {
super(stringMessages.add(stringMessages.deviceMappings()), stringMessages.add(stringMessages.deviceMappings()),
stringMessages.add(), stringMessages.cancel(),
new DataEntryDialog.Validator<Collection<DeviceMappingDTO>>() {
@@ -70,11 +70,12 @@ public class AbstractRegattaLogFixesAddMappingsDialog extends DataEntryDialog<Co
/* boatsRefresher not needed; fetching competitors from registrations */ null, stringMessages,
errorReporter, /* multiSelection */ false, /* enable pager */ true,
/* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(
/* multiSelection */ false, sailingServiceWrite, stringMessages, errorReporter);
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(/* multiSelection */ false,
sailingServiceWrite, stringMessages, errorReporter);
boatTable = new BoatTableWrapper<RefreshableSingleSelectionModel<BoatDTO>>(sailingServiceWrite, userService,
/* boatsRefresher not needed; registered boats taken from regatta log */ null,
stringMessages, errorReporter, /* multiSelection */ false, /* enable Pager */ true, /* allowActions */ false);
/* competitorsRefresher not neede */ null, stringMessages, errorReporter, /* multiSelection */ false,
/* enable Pager */ true, /* allowActions */ false);
registerSelectionChangeHandler(competitorTable.getSelectionModel(), this::mappedToSelectionChanged);
registerSelectionChangeHandler(markTable.getSelectionModel(), this::mappedToSelectionChanged);
@@ -60,6 +60,7 @@ public abstract class AbstractRegattaLogSensorDataAddMappingsDialog extends Data
event -> deviceSelectionChanged(deviceIdTable.getSelectionModel().getSelectedObject()));
boatTable = new BoatTableWrapper<RefreshableSingleSelectionModel<BoatDTO>>(sailingServiceWrite, userService,
/* boatsRefresher not needed; registrations are fetched for the leaderboard specifically */ null,
/* competitorsRefresher not neede */ null,
stringMessages, errorReporter, /* multiSelection */ false, /* enable Pager */ true, /* allowActions */ false);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
/* competitorsRefresher not needed; registrations are fetched for the leaderboard specifically */ null,
@@ -33,8 +33,8 @@ public class BoatPanel extends SimplePanel implements FilterablePanelProvider<Bo
super();
this.boatsDisplayer = result->refreshBoatList();
this.boatTable = new BoatTableWrapper<>(presenter.getSailingService(), presenter.getUserService(),
presenter.getBoatsRefresher(), stringMessages, presenter.getErrorReporter(), /* multiSelection */ true,
/* enablePager */ true, 100, true);
presenter.getBoatsRefresher(), presenter.getCompetitorsRefresher(), stringMessages,
presenter.getErrorReporter(), /* multiSelection */ true, /* enablePager */ true, 100, true);
this.refreshableBoatSelectionModel = (RefreshableMultiSelectionModel<BoatDTO>) boatTable.getSelectionModel();
VerticalPanel mainPanel = new VerticalPanel();
this.setWidget(mainPanel);
@@ -19,6 +19,7 @@ import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -68,9 +69,9 @@ public class BoatRegistrationsPanel extends FlowPanel implements BusyDisplay {
* to all boats in the server's boat store
*/
protected BoatRegistrationsPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, final StringMessages stringMessages, final ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass,
Runnable validator,
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher,
final StringMessages stringMessages, final ErrorReporter errorReporter, boolean editable,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass, Runnable validator,
Consumer<AsyncCallback<Collection<BoatDTO>>> registeredBoatsRetriever, boolean restrictPoolToLeaderboard) {
this.errorReporter = errorReporter;
this.validator = validator;
@@ -89,12 +90,13 @@ public class BoatRegistrationsPanel extends FlowPanel implements BusyDisplay {
final HorizontalPanel boatRegistrationPanel = new HorizontalPanel();
final CaptionPanel allBoatsPanel = new CaptionPanel(stringMessages.boatPool());
final CaptionPanel registeredBoatsPanel = new CaptionPanel(stringMessages.registeredBoats());
allBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, boatsRefresher, stringMessages, /* multiSelection */
allBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, boatsRefresher, competitorsRefresher,
stringMessages, /* multiSelection */
errorReporter, true, /* enablePager */true, 20, false);
registeredBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService,
/* boatsRefresher not needed; boats fetched for registrations */ null, stringMessages,
errorReporter, /* multiSelection */ true, /* enablePager */ false, /* paging size */ 20,
/* allowActions */ false);
/* boatsRefresher not needed; boats fetched for registrations */ null,
/* competiorsRefresher not needed */ null, stringMessages, errorReporter, /* multiSelection */ true,
/* enablePager */ false, /* paging size */ 20, /* allowActions */ false);
allBoatsPanel.add(allBoatsTable);
registeredBoatsPanel.add(registeredBoatsTable);
VerticalPanel movePanel = new VerticalPanel();
@@ -19,6 +19,7 @@ import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever;
import com.sap.sailing.gwt.ui.client.Refresher;
@@ -47,17 +48,20 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
private final LabeledAbstractFilterablePanel<BoatDTO> filterField;
private final SailingServiceWriteAsync sailingServiceWrite;
private final Refresher<BoatDTO> boatsRefresher;
private final Refresher<CompetitorDTO> competitorsRefresher;
public BoatTableWrapper(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager, boolean allowActions) {
this(sailingServiceWrite, userService, boatsRefresher, stringMessages, errorReporter, multiSelection,
enablePager, DEFAULT_PAGING_SIZE, allowActions);
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean multiSelection, boolean enablePager,
boolean allowActions) {
this(sailingServiceWrite, userService, boatsRefresher, competitorsRefresher, stringMessages, errorReporter,
multiSelection, enablePager, DEFAULT_PAGING_SIZE, allowActions);
}
public BoatTableWrapper(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager, int pagingSize, boolean allowActions) {
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean multiSelection, boolean enablePager,
int pagingSize, boolean allowActions) {
super(sailingServiceWrite, stringMessages, errorReporter, multiSelection, enablePager, pagingSize,
new EntityIdentityComparator<BoatDTO>() {
@Override
@@ -70,6 +74,7 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
}
});
this.boatsRefresher = boatsRefresher;
this.competitorsRefresher = competitorsRefresher;
this.sailingServiceWrite = sailingServiceWrite;
ListHandler<BoatDTO> boatColumnListHandler = getColumnSortHandler();
// boats table
@@ -235,7 +240,7 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
if (boatsRefresher != null) {
// Don't fetch from server but ask our unified data model to deliver the boats without forcing server
// round-trip unless the boats haven't been loaded at all so far
boatsRefresher.callFillAndReloadInitially(boats->{
boatsRefresher.callFillAndReloadInitially(boats -> {
getFilteredBoats(boats);
filterBoats(boats);
if (callback != null) {
@@ -281,7 +286,12 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
@Override
public void onSuccess(BoatDTO updatedBoat) {
boatsRefresher.addIfNotContainedElseReplace(updatedBoat);
if (boatsRefresher != null) {
boatsRefresher.addIfNotContainedElseReplace(originalBoat, updatedBoat);
}
if (competitorsRefresher != null) {
competitorsRefresher.reloadAndCallFillAll();
}
int editedBoatIndex = getFilterField().indexOf(originalBoat);
getFilterField().remove(originalBoat);
if (editedBoatIndex >= 0){
@@ -138,7 +138,10 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
TextColumn<CompetitorDTO> boatClassColumn = new TextColumn<CompetitorDTO>() {
@Override
public String getValue(CompetitorDTO competitor) {
return competitor.hasBoat() && ((CompetitorWithBoatDTO) competitor).getBoatClass() != null ? ((CompetitorWithBoatDTO) competitor).getBoatClass().getName() : "";
return competitor.hasBoat()
&& ((CompetitorWithBoatDTO) competitor).getBoatClass() != null
? ((CompetitorWithBoatDTO) competitor).getBoatClass().getName()
: "";
}
};
boatClassColumn.setSortable(true);
@@ -459,11 +462,12 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
@Override
public void onSuccess(CompetitorWithBoatDTO updatedCompetitor) {
GWT.log("OK 002");
if (competitorsRefresher != null) {
competitorsRefresher.addIfNotContainedElseReplace(updatedCompetitor);
if (updatedCompetitor.getBoat() != null) {
boatsRefresher.addIfNotContainedElseReplace(updatedCompetitor.getBoat());
competitorsRefresher.addIfNotContainedElseReplace(originalCompetitor, updatedCompetitor);
competitorsRefresher.callAllFill();
if (boatsRefresher != null) {
boatsRefresher.addIfNotContainedElseReplace(originalCompetitor.getBoat(), updatedCompetitor.getBoat());
boatsRefresher.callAllFill();
}
}
@@ -523,7 +527,7 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
@Override
public void onSuccess(CompetitorDTO updatedCompetitor) {
if (competitorsRefresher != null) {
competitorsRefresher.addIfNotContainedElseReplace(updatedCompetitor);
competitorsRefresher.addIfNotContainedElseReplace(originalCompetitor, updatedCompetitor);
}
//only reload selected competitors reloading with refreshCompetitorList(leaderboardName)
//would not work in case the list is not based on a leaderboard e.g. AbstractCompetitorRegistrationDialog
@@ -599,7 +603,7 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
@Override
public void onSuccess(T addedCompetitor) {
if (competitorsRefresher != null) {
competitorsRefresher.addIfNotContainedElseReplace(addedCompetitor);
competitorsRefresher.add(addedCompetitor);
}
getFilterField().add(addedCompetitor);
getDataProvider().refresh();
@@ -13,6 +13,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
@@ -44,7 +45,7 @@ public class CompetitorWithBoatCreateDialog extends AbstractCompetitorWithBoatDi
* already initialized or you don't want a default boat class.
*/
public CompetitorWithBoatCreateDialog(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
CompetitorWithBoatDTO competitorToEdit, DialogCallback<CompetitorWithBoatDTO> callback, String boatClass) {
super("Add competitor with boat", stringMessages, competitorToEdit, callback, boatClass);
this.ensureDebugId("CompetitorWithBoatCreateDialog");
@@ -65,7 +66,7 @@ public class CompetitorWithBoatCreateDialog extends AbstractCompetitorWithBoatDi
});
newBoatPanel = new VerticalPanel();
existingBoatPanel = new VerticalPanel();
this.existingBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, boatsRefresher, stringMessages, errorReporter,
this.existingBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, boatsRefresher, competitorsRefresher, stringMessages, errorReporter,
/* multiSelection */ false, /* enablePager */ true, /* pagingSize*/ 10, false);
existingBoatsTable.refreshBoatList(/* loadOnlyStandaloneBoats */ true, /* callback */ null);
this.existingBoatsTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -87,19 +87,19 @@ public class ExpeditionAllInOneAfterImportHandler {
@Override
public void onSuccess(EventDTO result) {
event = result;
eventsRefresher.addIfNotContainedElseReplace(result);
eventsRefresher.addIfNotContained(result);
sailingServiceWrite.getRegattaByName(regattaName, new DataLoadingCallback<RegattaDTO>() {
@Override
public void onSuccess(RegattaDTO result) {
regatta = result;
regattasRefresher.addIfNotContainedElseReplace(result);
regattasRefresher.addIfNotContained(result);
regattasRefresher.callFillAndReloadInitially(regattaOracleToRefresh);
sailingServiceWrite.getLeaderboardWithSecurity(leaderboardName,
new DataLoadingCallback<StrippedLeaderboardDTOWithSecurity>() {
@Override
public void onSuccess(StrippedLeaderboardDTOWithSecurity result) {
leaderboard = result;
leaderboardsRefresher.addIfNotContainedElseReplace(result);
leaderboardsRefresher.addIfNotContained(result);
sailingServiceWrite.getTrackFileImportDeviceIds(gpsDeviceIds,
new DataLoadingCallback<List<TrackFileImportDeviceIdentifierDTO>>() {
@Override
@@ -124,20 +124,25 @@ public class ExpeditionAllInOneAfterImportHandler {
}
private class RegattaLogCompetitorRegistrationAndSelectionDialog extends RegattaLogCompetitorRegistrationDialog {
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter, boolean editable,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace) {
this(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter, editable,
leaderboardName, canBoatsOfCompetitorsChangePerRace,
new ValidatorForCompetitorRegistrationDialog(stringMessages), new CallbackForCompetitorRegistrationDialog());
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass,
SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName,
boolean canBoatsOfCompetitorsChangePerRace) {
this(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace,
new ValidatorForCompetitorRegistrationDialog(stringMessages),
new CallbackForCompetitorRegistrationDialog());
}
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter, boolean editable,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
ValidatorForCompetitorRegistrationDialog validator, CallbackForCompetitorRegistrationDialog callback) {
super(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter, editable,
leaderboardName, canBoatsOfCompetitorsChangePerRace, validator, callback);
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass,
SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName,
boolean canBoatsOfCompetitorsChangePerRace, ValidatorForCompetitorRegistrationDialog validator,
CallbackForCompetitorRegistrationDialog callback) {
super(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace, validator, callback);
validator.setCompetitorRegistrationsPanel(competitorRegistrationsPanel);
callback.setCompetitorRegistrationsPanel(competitorRegistrationsPanel);
}
@@ -34,8 +34,9 @@ public class ItemToMapToDeviceSelectionPanel implements IsWidget {
void onSelectionChange(MarkDTO mark);
}
public ItemToMapToDeviceSelectionPanel(SailingServiceWriteAsync sailingServiceWrite, final UserService userService, StringMessages stringMessages,
ErrorReporter errorReporter, final SelectionChangedHandler handler, MappableToDevice selected) {
public ItemToMapToDeviceSelectionPanel(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
StringMessages stringMessages, ErrorReporter errorReporter, final SelectionChangedHandler handler,
MappableToDevice selected) {
this.selected = selected;
this.errorReporter = errorReporter;
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
@@ -44,6 +45,7 @@ public class ItemToMapToDeviceSelectionPanel implements IsWidget {
/* enablePager */ true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
boatTable = new BoatTableWrapper<>(sailingServiceWrite, userService,
/* boatsRefresher not needed; boats are obtained from the regatta log registrations */ null,
/* competitorsRefresher not needed */ null,
stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true,
/* allowActions */ false);
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(/* multiSelection */ false, sailingServiceWrite,
@@ -7,6 +7,7 @@ import java.util.function.Consumer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
@@ -23,9 +24,11 @@ public class RegattaLogBoatRegistrationDialog extends DataEntryDialog<Set<BoatDT
protected final boolean canBoatsOfCompetitorsChangePerRace;
protected final BoatRegistrationsPanel boatRegistrationsPanel;
public RegattaLogBoatRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName,
boolean canBoatsOfCompetitorsChangePerRace, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<BoatDTO>> callback) {
public RegattaLogBoatRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, Refresher<BoatDTO> boatsRefresher,
Refresher<CompetitorDTO> competitorsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<BoatDTO>> callback) {
super(stringMessages.registerBoats(), /* messsage */null, stringMessages.save(), stringMessages.cancel(),
/* validator */ null, callback);
this.errorReporter = errorReporter;
@@ -33,8 +36,10 @@ public class RegattaLogBoatRegistrationDialog extends DataEntryDialog<Set<BoatDT
this.sailingService = sailingServiceWrite;
this.leaderboardName = leaderboardName;
this.canBoatsOfCompetitorsChangePerRace = canBoatsOfCompetitorsChangePerRace;
this.boatRegistrationsPanel = new BoatRegistrationsPanel(sailingServiceWrite, userService, boatsRefresher, stringMessages, errorReporter, editable,
leaderboardName, canBoatsOfCompetitorsChangePerRace, boatClass, ()->validateAndUpdate(), getRegisteredBoatsRetriever(), /* restrictPoolToLeaderboard */ false);
this.boatRegistrationsPanel = new BoatRegistrationsPanel(sailingServiceWrite, userService, boatsRefresher,
competitorsRefresher, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, boatClass, () -> validateAndUpdate(), getRegisteredBoatsRetriever(),
/* restrictPoolToLeaderboard */ false);
}
protected Consumer<AsyncCallback<Collection<BoatDTO>>> getRegisteredBoatsRetriever() {
@@ -1003,7 +1003,7 @@ public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardC
String boatClassName = regatta.boatClass.getName();
new RegattaLogBoatRegistrationDialog(boatClassName, sailingServiceWrite, userService, boatsRefresher,
stringMessages, errorReporter, /* editable */true, t.getName(),
competitorsRefresher, stringMessages, errorReporter, /* editable */true, t.getName(),
t.canBoatsOfCompetitorsChangePerRace, new DialogCallback<Set<BoatDTO>>() {
@Override
public void ok(Set<BoatDTO> registeredBoats) {
@@ -121,7 +121,7 @@ public abstract class AbstractRefresher<T> implements Refresher<T> {
}
@Override
public void addIfNotContainedElseReplace(T dto) {
public void addIfNotContained(T dto) {
if (dto != null && dtos != null) {
final int index = dtos.indexOf(dto);
if (index != -1) {
@@ -132,6 +132,22 @@ public abstract class AbstractRefresher<T> implements Refresher<T> {
}
}
@Override
public void addIfNotContainedElseReplace(T oldDto, T newDto) {
if (dtos != null) {
final int index = dtos.indexOf(oldDto);
if (index != -1) {
if (newDto == null) {
dtos.remove(index);
} else {
dtos.set(index, newDto);
}
} else {
add(newDto);
}
}
}
@Override
public void add(T dto) {
if (dto != null && dtos != null) {
@@ -141,17 +157,19 @@ public abstract class AbstractRefresher<T> implements Refresher<T> {
@Override
public void remove(T dto) {
if (dto != null) {
if (dto != null && dtos != null) {
dtos.remove(dto);
}
}
@Override
public void removeAll(Predicate<T> filter) {
for (final Iterator<T> i=dtos.iterator(); i.hasNext(); ) {
final T dto = i.next();
if (filter.test(dto)) {
i.remove();
if (dtos != null) {
for (final Iterator<T> i=dtos.iterator(); i.hasNext(); ) {
final T dto = i.next();
if (filter.test(dto)) {
i.remove();
}
}
}
}
@@ -82,11 +82,18 @@ public interface Refresher<T> {
void remove(T dto);
/**
* Like {@link #add(Object)}, but an {@link Object#equals(Object) equal} DTO will be replaced by {@code dto} if
* Like {@link #add(Object)}, but an {@link Object#equals(Object) equal} original DTO will be replaced by {@code newDto} if
* found in the list of DTOs known to this refresher. This will only take place if the DTO list already exists,
* indicating that it has been requested before.
*/
void addIfNotContainedElseReplace(T dto);
void addIfNotContainedElseReplace(T oldDto, T newDto);
/**
* Like {@link #add(Object)}, but an {@link Object#equals(Object) equal} DTO will be ignored if
* found in the list of DTOs known to this refresher. This will only take place if the DTO list already exists,
* indicating that it has been requested before.
*/
void addIfNotContained(T dto);
/**
* {@link #remove(Object) Removes} all objects from this refresher that {@link Predicate#test(Object) are matched) by the