bug3246: added saving competitors and callback for registering to race

Change-Id: Ib391411f41c1bf68c45be57401189e216c89a74a
This commit is contained in:
Alexander Tatarinovich committed 2016-12-07 16:14:51 +03:00
1 parent e7d1c8b60f
commit a4dfe4fc38
14 files changed
+189 -16

No files matched your search

@@ -125,6 +125,8 @@ public interface MongoObjectFactory {
*/
void storeCompetitor(Competitor competitor);
void storeCompetitors(Iterable<Competitor> competitor);
void removeAllCompetitors();
void removeCompetitor(Competitor competitor);
@@ -2,6 +2,7 @@ package com.sap.sailing.domain.persistence.impl;
import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -1244,6 +1245,18 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
collection.update(query, entry, /* upsrt */true, /* multi */false, WriteConcern.SAFE);
}
@Override
public void storeCompetitors(Iterable<Competitor> competitors) {
DBCollection collection = database.getCollection(CollectionNames.COMPETITORS.name());
List<DBObject> competitorsDB = new ArrayList<>();
for (Competitor competitor: competitors){
JSONObject json = competitorSerializer.serialize(competitor);
DBObject entry = (DBObject) JSON.parse(json.toString());
competitorsDB.add(entry);
}
collection.insert(competitorsDB);
}
@Override
public void removeAllCompetitors() {
logger.info("Removing all persistent competitor info");
@@ -68,6 +68,8 @@ public interface CompetitorStore extends CompetitorFactory {
String newSailId, Nationality newNationality, URI newTeamImageUri, URI newFlagImageUri,
Double timeOnTimeFactor, Duration timeOnDistanceAllowancePerNauticalMile, String searchTag);
void addCompetitors(Iterable<Competitor> competitors);
CompetitorDTO convertToCompetitorDTO(Competitor c);
/**
@@ -274,4 +274,17 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
LockUtil.unlockAfterWrite(lock);
}
}
@Override
public void addCompetitors(Iterable<Competitor> competitors) {
LockUtil.lockForWrite(lock);
try {
for (Competitor competitor: competitors) {
competitorCache.put(competitor.getId(), competitor);
competitorsByIdAsString.put(competitor.getId().toString(), competitor);
}
} finally {
LockUtil.unlockAfterWrite(lock);
}
}
}
@@ -205,6 +205,8 @@ public class CompetitorImportProviderSelectionDialog extends DataEntryDialog<Com
@Override
public void onFailure(Throwable caught) {
busynessPanel.setBusy(false);
errorReporter.reportError(
stringMessages.errorMessageLoadingData());
}
@Override
@@ -1,7 +1,10 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -9,15 +12,16 @@ import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
/**
* Ñallback is responsible for saving competitors in store and registering them if necessary.
* Logic for registering should be implemented in child's classes.
* Ñallback is responsible for saving competitors in store and registering them if necessary. Logic for registering
* should be implemented in child's classes.
*
* @author Alexander_Tatarinovich
*
*/
public class ImportCompetitorCallback implements DialogCallback<Set<CompetitorDTO>> {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final StringMessages stringMessages;
protected final SailingServiceAsync sailingService;
protected final ErrorReporter errorReporter;
protected final StringMessages stringMessages;
public ImportCompetitorCallback(SailingServiceAsync sailingService, ErrorReporter errorReporter,
StringMessages stringMessages) {
@@ -26,20 +30,41 @@ public class ImportCompetitorCallback implements DialogCallback<Set<CompetitorDT
this.stringMessages = stringMessages;
}
@Override
public void ok(Set<CompetitorDTO> competitorDTOs) {
saveCompetitors(competitorDTOs);
}
@Override
public void cancel() {
}
private void saveCompetitors(Set<CompetitorDTO> competitorDTOs) {
// TODO: implement logic for saving competitors
@Override
public void ok(final Set<CompetitorDTO> competitorsForRegistering) {
List<CompetitorDTO> competitorsForSaving = prepareCompetitorsForSaving(competitorsForRegistering);
registerCompetitorsAfterSaving(competitorsForSaving, competitorsForRegistering);
}
protected List<CompetitorDTO> prepareCompetitorsForSaving(Set<CompetitorDTO> competitors) {
List<CompetitorDTO> competitorsForSaving = new ArrayList<>();
for (CompetitorDTO competitor : competitors) {
if (competitor.getIdAsString() == null) {
competitorsForSaving.add(competitor);
}
}
return competitorsForSaving;
}
private void registerCompetitorsAfterSaving(final List<CompetitorDTO> competitorsForSaving,
final Set<CompetitorDTO> competitorsForRegistration) {
sailingService.addCompetitors(competitorsForSaving, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(Void result) {
registerCompetitors(competitorsForRegistration);
}
});
}
protected void registerCompetitors(Set<CompetitorDTO> competitorDTOs) {
// Don't register by default
}
}
@@ -12,10 +12,12 @@ import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
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.CompetitorDTOImpl;
import com.sap.sailing.domain.common.dto.CompetitorDescriptorDTO;
import com.sap.sailing.domain.common.impl.MeterDistance;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
@@ -155,9 +157,10 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
}
private CompetitorDTO convertCompetitorDescriptorToCompetitorDTO(CompetitorDescriptorDTO competitorDescriptor) {
BoatDTO boat = new BoatDTO(null, competitorDescriptor.getSailNumber());
BoatDTO defaultBoat = new BoatDTO(null, competitorDescriptor.getSailNumber());
BoatClassDTO defaultBoatClass = new BoatClassDTO(BoatClassDTO.DEFAULT_NAME, /* hull length */ new MeterDistance(5));
return new CompetitorDTOImpl(competitorDescriptor.getName(), null, null,
competitorDescriptor.getTwoLetterIsoCountryCode(), competitorDescriptor.getThreeLetterIocCountryCode(),
competitorDescriptor.getCountryName(), null, null, null, boat, null, null, null, null);
competitorDescriptor.getCountryName(), null, null, null, defaultBoat, defaultBoatClass, null, null, null);
}
}
@@ -0,0 +1,73 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.BoatClassMasterdata;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTOImpl;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
public class RaceImportCompetitorCallback extends ImportCompetitorCallback {
private final String leaderboardName;
private final String raceColumnName;
private final String fleetName;
private final String boatClassName;
public RaceImportCompetitorCallback(String leaderboardName, String raceColumnName, String fleetName,
String boatClassName, SailingServiceAsync sailingService, ErrorReporter errorReporter,
StringMessages stringMessages) {
super(sailingService, errorReporter, stringMessages);
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
this.boatClassName = boatClassName;
}
@Override
public List<CompetitorDTO> prepareCompetitorsForSaving(Set<CompetitorDTO> competitors) {
List<CompetitorDTO> competitorsForSaving = super.prepareCompetitorsForSaving(competitors);
return getCompetitorsWithNewBoatClass(competitorsForSaving);
}
private List<CompetitorDTO> getCompetitorsWithNewBoatClass(List<CompetitorDTO> competitors) {
List<CompetitorDTO> newCompetitors = new ArrayList<>();
for (CompetitorDTO competitor : competitors) {
final BoatClassMasterdata boatClassMasterdata = BoatClassMasterdata.resolveBoatClass(boatClassName);
if (boatClassMasterdata == null) {
return competitors;
}
BoatClassDTO boatClass = new BoatClassDTO(boatClassMasterdata.getDisplayName(),
boatClassMasterdata.getHullLength());
CompetitorDTO newCompetitor = new CompetitorDTOImpl(competitor.getName(), competitor.getColor(),
competitor.getEmail(), competitor.getTwoLetterIsoCountryCode(),
competitor.getThreeLetterIocCountryCode(), competitor.getCountryName(), competitor.getIdAsString(),
competitor.getImageURL(), competitor.getFlagImageURL(), competitor.getBoat(), boatClass,
competitor.getTimeOnTimeFactor(), competitor.getTimeOnDistanceAllowancePerNauticalMile(),
competitor.getSailID());
newCompetitors.add(newCompetitor);
}
return newCompetitors;
}
@Override
protected void registerCompetitors(Set<CompetitorDTO> competitors) {
sailingService.setCompetitorRegistrationsInRaceLog(leaderboardName, raceColumnName, fleetName, competitors,
new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(stringMessages.couldNotSaveCompetitorRegistrations(caught.getMessage()));
}
});
}
}
@@ -445,6 +445,8 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
CompetitorDTO addOrUpdateCompetitor(CompetitorDTO competitor) throws Exception;
void addCompetitors(Iterable<CompetitorDTO> competitorDTOs) throws Exception;
void allowCompetitorResetToDefaults(Iterable<CompetitorDTO> competitors);
List<DeviceConfigurationMatcherDTO> getDeviceConfigurationMatchers();
@@ -597,6 +597,8 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void addOrUpdateCompetitor(CompetitorDTO competitor, AsyncCallback<CompetitorDTO> asyncCallback);
void addCompetitors(Iterable<CompetitorDTO> competitorDTOs, AsyncCallback<Void> asyncCallback);
void allowCompetitorResetToDefaults(Iterable<CompetitorDTO> competitors, AsyncCallback<Void> asyncCallback);
void getDeviceConfigurationMatchers(AsyncCallback<List<DeviceConfigurationMatcherDTO>> asyncCallback);
@@ -1749,4 +1749,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String filterImportedCompetitorsByNameSailRaceFleet();
String errorLoadingCompetitorImportProviders(String message);
String errorLoadingCompetitorImportDescriptors(String message);
String couldNotSaveCompetitorRegistrations(String message);
}
@@ -1720,4 +1720,5 @@ importedCompetitors=Imported Competitors
hasMatches=Has matches
filterImportedCompetitorsByNameSailRaceFleet=Filter imported competitors by name, sail number, race or fleet
errorLoadingCompetitorImportProviders=Error loading competitor import providers: {0}
errorLoadingCompetitorImportDescriptors=Error loading competitor import descriptors: {0}
errorLoadingCompetitorImportDescriptors=Error loading competitor import descriptors: {0}
couldNotSaveCompetitorRegistrations=Could not save competitor registrations: {0}
@@ -131,6 +131,7 @@ import com.sap.sailing.domain.base.configuration.impl.RRS26ConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RacingProcedureConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl;
import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseDataImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
@@ -4853,6 +4854,33 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return result;
}
@Override
public void addCompetitors(Iterable<CompetitorDTO> competitorDTOs) throws URISyntaxException {
List<Competitor> competitorsForSaving = new ArrayList<>();
for (CompetitorDTO competitorDTO : competitorDTOs) {
Competitor competitor = convertCompetitorDTOToCompetitor(competitorDTO);
competitorsForSaving.add(competitor);
}
getBaseDomainFactory().getCompetitorStore().addCompetitors(competitorsForSaving);
}
private Competitor convertCompetitorDTOToCompetitor(CompetitorDTO competitorDTO) throws URISyntaxException {
Nationality nationality = (competitorDTO.getThreeLetterIocCountryCode() == null
|| competitorDTO.getThreeLetterIocCountryCode().isEmpty()) ? null
: getBaseDomainFactory()
.getOrCreateNationality(competitorDTO.getThreeLetterIocCountryCode());
BoatClass boatClass = getBaseDomainFactory().getOrCreateBoatClass(competitorDTO.getBoatClass().getName());
DynamicPerson sailor = new PersonImpl(competitorDTO.getName(), nationality, null, null);
DynamicTeam team = new TeamImpl(competitorDTO.getName() + " team", Collections.singleton(sailor), null);
DynamicBoat boat = new BoatImpl(competitorDTO.getName() + " boat", boatClass, competitorDTO.getSailID());
Competitor competitor = new CompetitorImpl(UUID.randomUUID(), competitorDTO.getName(),
competitorDTO.getColor(), competitorDTO.getEmail(),
competitorDTO.getFlagImageURL() == null ? null : new URI(competitorDTO.getFlagImageURL()), team,
boat, competitorDTO.getTimeOnTimeFactor(),
competitorDTO.getTimeOnDistanceAllowancePerNauticalMile(), competitorDTO.getSearchTag());
return competitor;
}
@Override
public void allowCompetitorResetToDefaults(Iterable<CompetitorDTO> competitors) {
List<String> competitorIdsAsStrings = new ArrayList<String>();
@@ -107,4 +107,10 @@ public class PersistentCompetitorStore extends TransientCompetitorStoreImpl impl
storeTo.storeCompetitor(result);
return result;
}
@Override
public void addCompetitors(Iterable<Competitor> competitors) {
storeTo.storeCompetitors(competitors);
super.addCompetitors(competitors);
}
}