updating existing competitors' search tag during import

Change-Id: Ifd29082673f148d742fd5de4a3e318e3c1ba956d
This commit is contained in:
Axel Uhl committed 2016-12-16 06:23:53 +01:00
1 parent 2074d43e06
commit de7baff50f
8 files changed
+86 -41

No files matched your search

@@ -20,6 +20,11 @@ public interface CompetitorDTO extends Serializable, MappableToDevice {
String getSearchTag();
/**
* If the {@code searchTag} is not contained in {@link #getSearchTag()}, appends it to the search tag, separated by a space character
*/
void addToSearchTag(String searchTag);
BoatDTO getBoat();
BoatClassDTO getBoatClass();
@@ -45,5 +50,5 @@ public interface CompetitorDTO extends Serializable, MappableToDevice {
Double getTimeOnTimeFactor();
Duration getTimeOnDistanceAllowancePerNauticalMile();
}
@@ -181,22 +181,30 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
return this;
}
@Override
public Color getColor() {
return color;
}
@Override
public String getSearchTag() {
return searchTag;
}
@Override
public void addToSearchTag(String searchTag) {
if (this.searchTag == null) {
this.searchTag = searchTag;
} else if (!this.searchTag.contains(searchTag)) {
this.searchTag += " "+searchTag;
}
}
@Override
public String getEmail() {
return email;
}
public String email(){
return email;
}
@Override
public boolean hasEmail() {
return email != null && !email.isEmpty();
@@ -112,6 +112,12 @@ public class PreviousCompetitorDTOImpl implements CompetitorDTO {
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override
public void addToSearchTag(String searchTag) {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override
public String getImageURL() {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
@@ -333,23 +333,26 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
final CompetitorEditDialog dialog = new CompetitorEditDialog(stringMessages, originalCompetitor, new DialogCallback<CompetitorDTO>() {
@Override
public void ok(final CompetitorDTO competitor) {
sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback<CompetitorDTO>() {
final List<CompetitorDTO> competitors = new ArrayList<>();
competitors.add(competitor);
sailingService.addOrUpdateCompetitor(competitors, new AsyncCallback<List<CompetitorDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to update competitor: " + caught.getMessage());
}
@Override
public void onSuccess(CompetitorDTO updatedCompetitor) {
public void onSuccess(List<CompetitorDTO> updatedCompetitor) {
assert updatedCompetitor.size() == 1;
//only reload selected competitors reloading with refreshCompetitorList(leaderboardName)
//would not work in case the list is not based on a leaderboard e.g. AbstractCompetitorRegistrationDialog
int editedCompetitorIndex = getFilterField().indexOf(originalCompetitor);
getFilterField().remove(originalCompetitor);
if (editedCompetitorIndex >= 0){
getFilterField().add(editedCompetitorIndex, updatedCompetitor);
getFilterField().add(editedCompetitorIndex, updatedCompetitor.iterator().next());
} else {
//in case competitor was not present --> not edit, but create
getFilterField().add(updatedCompetitor);
getFilterField().add(updatedCompetitor.iterator().next());
}
getDataProvider().refresh();
}
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -14,6 +15,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
/**
@@ -46,6 +48,24 @@ public class ImportCompetitorCallback implements DialogCallback<Pair<Map<Competi
@Override
public void ok(final Pair<Map<CompetitorDescriptor, CompetitorDTO>, String> competitorsForRegisteringAndSearchTag) {
final Set<CompetitorDTO> existingCompetitorsSelected = new HashSet<>();
for (final CompetitorDTO existingCompetitor : competitorsForRegisteringAndSearchTag.getA().values()) {
if (existingCompetitor != null) {
existingCompetitor.addToSearchTag(competitorsForRegisteringAndSearchTag.getB());
existingCompetitorsSelected.add(existingCompetitor);
}
}
sailingService.addOrUpdateCompetitor(new ArrayList<>(existingCompetitorsSelected), new MarkedAsyncCallback<>(
new AsyncCallback<List<CompetitorDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void onSuccess(List<CompetitorDTO> result) {
// TODO trigger an update of any client-side competitor display
}
}));
registerCompetitorsAfterSaving(competitorsForRegisteringAndSearchTag.getA().entrySet().stream().filter((e->e.getValue() == null)).map(e->e.getKey()).
collect(Collectors.toList()),
competitorsForRegisteringAndSearchTag.getA().values(), competitorsForRegisteringAndSearchTag.getB());
@@ -53,8 +73,6 @@ public class ImportCompetitorCallback implements DialogCallback<Pair<Map<Competi
private void registerCompetitorsAfterSaving(final List<CompetitorDescriptor> competitorsForSaving,
final Iterable<CompetitorDTO> competitorsForRegistration, String searchTag) {
// TODO for those competitors that already exist, update their search tag accordingly, using
// sailingService.addOrUpdateCompetitor(competitor, asyncCallback);
sailingService.addCompetitors(competitorsForSaving, searchTag, new AsyncCallback<List<CompetitorDTO>>() {
@Override
public void onFailure(Throwable caught) {
@@ -445,7 +445,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
Iterable<CompetitorDTO> getCompetitorsOfLeaderboard(String leaderboardName);
CompetitorDTO addOrUpdateCompetitor(CompetitorDTO competitor) throws Exception;
List<CompetitorDTO> addOrUpdateCompetitor(List<CompetitorDTO> competitors) throws Exception;
List<CompetitorDTO> addCompetitors(List<CompetitorDescriptor> competitorsForSaving, String searchTag) throws Exception;
@@ -596,7 +596,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void getCompetitorsOfLeaderboard(String leaderboardName, AsyncCallback<Iterable<CompetitorDTO>> asyncCallback);
void addOrUpdateCompetitor(CompetitorDTO competitor, AsyncCallback<CompetitorDTO> asyncCallback);
void addOrUpdateCompetitor(List<CompetitorDTO> competitors, AsyncCallback<List<CompetitorDTO>> asyncCallback);
void addCompetitors(List<CompetitorDescriptor> competitorsForSaving, String searchTag,
AsyncCallback<List<CompetitorDTO>> asyncCallback);
@@ -4802,35 +4802,40 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public CompetitorDTO addOrUpdateCompetitor(CompetitorDTO competitor) throws URISyntaxException {
Competitor existingCompetitor = getService().getCompetitorStore().getExistingCompetitorByIdAsString(competitor.getIdAsString());
Nationality nationality = (competitor.getThreeLetterIocCountryCode() == null || competitor.getThreeLetterIocCountryCode().isEmpty()) ? null :
getBaseDomainFactory().getOrCreateNationality(competitor.getThreeLetterIocCountryCode());
final CompetitorDTO result;
// new competitor
if (competitor.getIdAsString() == null || competitor.getIdAsString().isEmpty() || existingCompetitor == null) {
BoatClass boatClass = getBaseDomainFactory().getOrCreateBoatClass(competitor.getBoatClass().getName());
DynamicPerson sailor = new PersonImpl(competitor.getName(), nationality, null, null);
DynamicTeam team = new TeamImpl(competitor.getName() + " team", Collections.singleton(sailor), null);
DynamicBoat boat = new BoatImpl(competitor.getName() + " boat", boatClass, competitor.getSailID());
result = getBaseDomainFactory().convertToCompetitorDTO(
getBaseDomainFactory().getOrCreateCompetitor(UUID.randomUUID(), competitor.getName(),
competitor.getColor(), competitor.getEmail(),
competitor.getFlagImageURL() == null ? null : new URI(competitor.getFlagImageURL()), team, boat,
competitor.getTimeOnTimeFactor(),
competitor.getTimeOnDistanceAllowancePerNauticalMile(), competitor.getSearchTag()));
} else {
result = getBaseDomainFactory().convertToCompetitorDTO(
getService().apply(
new UpdateCompetitor(competitor.getIdAsString(), competitor.getName(), competitor
.getColor(), competitor.getEmail(), competitor.getSailID(), nationality,
competitor.getImageURL() == null ? null : new URI(competitor.getImageURL()),
competitor.getFlagImageURL() == null ? null : new URI(competitor.getFlagImageURL()),
competitor.getTimeOnTimeFactor(),
competitor.getTimeOnDistanceAllowancePerNauticalMile(),
competitor.getSearchTag())));
public List<CompetitorDTO> addOrUpdateCompetitor(List<CompetitorDTO> competitors) throws URISyntaxException {
final List<CompetitorDTO> results = new ArrayList<>();
for (final CompetitorDTO competitor : competitors) {
Competitor existingCompetitor = getService().getCompetitorStore().getExistingCompetitorByIdAsString(competitor.getIdAsString());
Nationality nationality = (competitor.getThreeLetterIocCountryCode() == null
|| competitor.getThreeLetterIocCountryCode().isEmpty()) ? null
: getBaseDomainFactory().getOrCreateNationality(competitor.getThreeLetterIocCountryCode());
final CompetitorDTO result;
// new competitor
if (competitor.getIdAsString() == null || competitor.getIdAsString().isEmpty() || existingCompetitor == null) {
BoatClass boatClass = getBaseDomainFactory().getOrCreateBoatClass(competitor.getBoatClass().getName());
DynamicPerson sailor = new PersonImpl(competitor.getName(), nationality, null, null);
DynamicTeam team = new TeamImpl(competitor.getName() + " team", Collections.singleton(sailor), null);
DynamicBoat boat = new BoatImpl(competitor.getName() + " boat", boatClass, competitor.getSailID());
result = getBaseDomainFactory().convertToCompetitorDTO(
getBaseDomainFactory().getOrCreateCompetitor(UUID.randomUUID(), competitor.getName(),
competitor.getColor(), competitor.getEmail(),
competitor.getFlagImageURL() == null ? null : new URI(competitor.getFlagImageURL()), team, boat,
competitor.getTimeOnTimeFactor(),
competitor.getTimeOnDistanceAllowancePerNauticalMile(), competitor.getSearchTag()));
} else {
result = getBaseDomainFactory().convertToCompetitorDTO(
getService().apply(
new UpdateCompetitor(competitor.getIdAsString(), competitor.getName(), competitor
.getColor(), competitor.getEmail(), competitor.getSailID(), nationality,
competitor.getImageURL() == null ? null : new URI(competitor.getImageURL()),
competitor.getFlagImageURL() == null ? null : new URI(competitor.getFlagImageURL()),
competitor.getTimeOnTimeFactor(),
competitor.getTimeOnDistanceAllowancePerNauticalMile(),
competitor.getSearchTag())));
}
results.add(result);
}
return result;
return results;
}
@Override