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