added missing properties to CompetitorDescriptor, removed CompetitorDescriptorDTO and pass along searchTag for competitor creation;

introduced CustomFieldSerializers for CountryCodeImpl and CompetitorDescriptor to allow for final fields

Change-Id: Idcec2cce798464a125f9d8c7ef1cd70fc800e106
This commit is contained in:
Axel Uhl committed 2016-12-15 23:44:57 +01:00
1 parent aa4f72731d
commit 306ef48a5d
22 files changed
+413 -428

No files matched your search

@@ -7,4 +7,5 @@ Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: com.sap.sailing.competitorimport
Require-Bundle: com.sap.sse.common,
com.sap.sailing.domain.shared.android
com.sap.sailing.domain.shared.android,
com.sap.sailing.domain.common
@@ -1,73 +0,0 @@
package com.sap.sailing.competitorimport;
import com.sap.sailing.domain.base.Person;
import com.sap.sse.common.CountryCode;
public class CompetitorDescriptor {
private final String eventName;
private final String regattaName;
private final String boatClassName;
private final String raceName;
private final String fleetName;
private final String sailNumber;
private final String competitorName;
private final CountryCode countryCode;
private final Iterable<Person> persons;
public CompetitorDescriptor(String eventName, String regattaName, String boatClassName, String raceName,
String fleetName, String sailNumber, String competitorName, CountryCode countryCode, Iterable<Person> persons) {
super();
this.eventName = eventName;
this.regattaName = regattaName;
this.boatClassName = boatClassName;
this.raceName = raceName;
this.fleetName = fleetName;
this.sailNumber = sailNumber;
this.competitorName = competitorName;
this.countryCode = countryCode;
this.persons = persons;
}
public String getEventName() {
return eventName;
}
public String getRegattaName() {
return regattaName;
}
public String getBoatClassName() {
return boatClassName;
}
public String getRaceName() {
return raceName;
}
public String getFleetName() {
return fleetName;
}
public String getSailNumber() {
return sailNumber;
}
public String getCompetitorName() {
return competitorName;
}
public CountryCode getCountryCode() {
return countryCode;
}
public Iterable<Person> getPersons() {
return persons;
}
@Override
public String toString() {
return ""+countryCode+" "+sailNumber+" "+getCompetitorName()+" at event: "+eventName+", regatta: "+regattaName+
", boat class: "+boatClassName+", race: "+raceName+", fleet: "+fleetName+", "+persons;
}
}
@@ -5,7 +5,8 @@ import java.util.Map;
import java.util.Set;
import javax.xml.bind.JAXBException;
import com.sap.sailing.competitorimport.CompetitorDescriptor;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sse.common.Named;
/**
@@ -0,0 +1,106 @@
package com.sap.sailing.domain.common;
import com.sap.sailing.domain.common.dto.PersonDTO;
import com.sap.sse.common.CountryCode;
import com.sap.sse.common.Duration;
import com.sap.sse.common.Named;
import com.sap.sse.common.impl.NamedImpl;
public class CompetitorDescriptor extends NamedImpl implements Named {
private static final long serialVersionUID = -6645726854552711646L;
private final String eventName;
private final String regattaName;
private final String boatClassName;
private final String boatName;
private final String teamName;
private final String raceName;
private final String fleetName;
private final String sailNumber;
private final String name;
private final CountryCode countryCode;
private final Iterable<PersonDTO> persons;
private final Double timeOnTimeFactor;
private final Duration timeOnDistanceAllowancePerNauticalMile;
public CompetitorDescriptor(String eventName, String regattaName, String boatClassName, String raceName,
String fleetName, String sailNumber, String name, String teamName, String boatName, CountryCode countryCode,
Iterable<PersonDTO> persons, Double timeOnTimeFactor, Duration timeOnDistanceAllowancePerNauticalMile) {
super(name);
this.eventName = eventName;
this.regattaName = regattaName;
this.boatClassName = boatClassName;
this.boatName = boatName;
this.raceName = raceName;
this.fleetName = fleetName;
this.sailNumber = sailNumber;
this.name = name;
this.teamName = teamName;
this.countryCode = countryCode;
this.persons = persons;
this.timeOnTimeFactor = timeOnTimeFactor;
this.timeOnDistanceAllowancePerNauticalMile = timeOnDistanceAllowancePerNauticalMile;
}
public String getEventName() {
return eventName;
}
public String getRegattaName() {
return regattaName;
}
public String getBoatClassName() {
return boatClassName;
}
public String getRaceName() {
return raceName;
}
public String getFleetName() {
return fleetName;
}
public String getSailNumber() {
return sailNumber;
}
public String getName() {
return name;
}
public CountryCode getCountryCode() {
return countryCode;
}
public Iterable<PersonDTO> getPersons() {
return persons;
}
public Double getTimeOnTimeFactor() {
return timeOnTimeFactor;
}
public String getBoatName() {
return boatName;
}
public String getTeamName() {
return teamName;
}
public Duration getTimeOnDistanceAllowancePerNauticalMile() {
return timeOnDistanceAllowancePerNauticalMile;
}
@Override
public String toString() {
return "CompetitorDescriptor [eventName=" + eventName + ", regattaName=" + regattaName + ", boatClassName="
+ boatClassName + ", boatName=" + boatName + ", teamName=" + teamName + ", raceName=" + raceName
+ ", fleetName=" + fleetName + ", sailNumber=" + sailNumber + ", name=" + name + ", countryCode="
+ countryCode + ", persons=" + persons + ", timeOnTimeFactor=" + timeOnTimeFactor
+ ", timeOnDistanceAllowancePerNauticalMile=" + timeOnDistanceAllowancePerNauticalMile + "]";
}
}
@@ -1,108 +0,0 @@
package com.sap.sailing.domain.common.dto;
import java.util.Objects;
import java.util.Set;
public class CompetitorDescriptorDTO extends NamedDTO {
private static final long serialVersionUID = 4855053239521181610L;
private String eventName;
private String regattaName;
private String boatClassName;
private String raceName;
private String fleetName;
private String sailNumber;
private String countryName;
private String twoLetterIsoCountryCode;
private String threeLetterIocCountryCode;
private Set<PersonDTO> persons;
CompetitorDescriptorDTO() {} // for GWT de-serialization only
public CompetitorDescriptorDTO(String eventName, String regattaName, String boatClassName, String raceName,
String fleetName, String sailNumber, String competitorName, String countryName,
String twoLetterIsoCountryCode, String threeLetterIocCountryCode, Set<PersonDTO> persons) {
super(competitorName);
this.eventName = eventName;
this.regattaName = regattaName;
this.boatClassName = boatClassName;
this.raceName = raceName;
this.fleetName = fleetName;
this.sailNumber = sailNumber;
this.countryName = countryName;
this.twoLetterIsoCountryCode = twoLetterIsoCountryCode;
this.threeLetterIocCountryCode = threeLetterIocCountryCode;
this.persons = persons;
}
public String getEventName() {
return eventName;
}
public String getRegattaName() {
return regattaName;
}
public String getBoatClassName() {
return boatClassName;
}
public String getRaceName() {
return raceName;
}
public String getFleetName() {
return fleetName;
}
public String getSailNumber() {
return sailNumber;
}
public Iterable<PersonDTO> getPersons() {
return persons;
}
public String getCountryName() {
return countryName;
}
public String getTwoLetterIsoCountryCode() {
return twoLetterIsoCountryCode;
}
public String getThreeLetterIocCountryCode() {
return threeLetterIocCountryCode;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + Objects.hash(eventName, regattaName, boatClassName, raceName, fleetName, sailNumber, persons,
countryName, twoLetterIsoCountryCode, threeLetterIocCountryCode);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
if (!super.equals(obj)) {
return false;
}
CompetitorDescriptorDTO other = (CompetitorDescriptorDTO) obj;
return Objects.equals(countryName, other.countryName) && Objects.equals(eventName, other.eventName)
&& Objects.equals(fleetName, other.fleetName) && Objects.deepEquals(persons, other.persons)
&& Objects.equals(boatClassName, other.boatClassName)
&& Objects.equals(raceName, other.raceName) && Objects.equals(regattaName, other.regattaName)
&& Objects.equals(sailNumber, other.sailNumber)
&& Objects.equals(threeLetterIocCountryCode, other.threeLetterIocCountryCode)
&& Objects.equals(twoLetterIsoCountryCode, other.twoLetterIsoCountryCode);
}
}
@@ -0,0 +1,71 @@
package com.google.gwt.user.client.rpc.core.com.sap.sailing.domain.common;
import java.util.List;
import com.google.gwt.user.client.rpc.CustomFieldSerializer;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.PersonDTO;
import com.sap.sse.common.CountryCode;
import com.sap.sse.common.Duration;
public class CompetitorDescriptor_CustomFieldSerializer extends CustomFieldSerializer<CompetitorDescriptor> {
@Override
public void serializeInstance(SerializationStreamWriter streamWriter, CompetitorDescriptor instance)
throws SerializationException {
serialize(streamWriter, instance);
}
public static void serialize(SerializationStreamWriter streamWriter, CompetitorDescriptor instance)
throws SerializationException {
streamWriter.writeObject(instance.getPersons());
streamWriter.writeString(instance.getEventName());
streamWriter.writeString(instance.getRegattaName());
streamWriter.writeString(instance.getBoatClassName());
streamWriter.writeString(instance.getRaceName());
streamWriter.writeString(instance.getFleetName());
streamWriter.writeString(instance.getSailNumber());
streamWriter.writeString(instance.getName());
streamWriter.writeString(instance.getTeamName());
streamWriter.writeString(instance.getBoatName());
streamWriter.writeObject(instance.getCountryCode());
streamWriter.writeDouble(instance.getTimeOnTimeFactor());
streamWriter.writeObject(instance.getTimeOnDistanceAllowancePerNauticalMile());
}
@Override
public boolean hasCustomInstantiateInstance() {
return true;
}
@Override
public CompetitorDescriptor instantiateInstance(SerializationStreamReader streamReader)
throws SerializationException {
return instantiate(streamReader);
}
public static CompetitorDescriptor instantiate(SerializationStreamReader streamReader)
throws SerializationException {
@SuppressWarnings("unchecked")
final List<PersonDTO> persons = (List<PersonDTO>) streamReader.readObject();
return new CompetitorDescriptor(streamReader.readString(), streamReader.readString(),
streamReader.readString(), streamReader.readString(), streamReader.readString(),
streamReader.readString(), streamReader.readString(), streamReader.readString(),
streamReader.readString(), (CountryCode) streamReader.readObject(),
persons, streamReader.readDouble(), (Duration) streamReader.readObject());
}
@Override
public void deserializeInstance(SerializationStreamReader streamReader, CompetitorDescriptor instance)
throws SerializationException {
deserialize(streamReader, instance);
}
public static void deserialize(SerializationStreamReader streamReader, CompetitorDescriptor instance) {
// Done by instantiateInstance
}
}
@@ -0,0 +1,57 @@
package com.google.gwt.user.client.rpc.core.com.sap.sse.common;
import com.google.gwt.user.client.rpc.CustomFieldSerializer;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sse.common.impl.CountryCodeImpl;
public class CountryCodeImpl_CustomFieldSerializer extends CustomFieldSerializer<CountryCodeImpl> {
@Override
public void serializeInstance(SerializationStreamWriter streamWriter, CountryCodeImpl instance)
throws SerializationException {
serialize(streamWriter, instance);
}
public static void serialize(SerializationStreamWriter streamWriter, CountryCodeImpl instance)
throws SerializationException {
streamWriter.writeString(instance.getName());
streamWriter.writeString(instance.getTwoLetterISOCode());
streamWriter.writeString(instance.getThreeLetterISOCode());
streamWriter.writeString(instance.getIANAInternet());
streamWriter.writeString(instance.getUNVehicle());
streamWriter.writeString(instance.getThreeLetterIOCCode());
streamWriter.writeString(instance.getUNISONumeric());
streamWriter.writeString(instance.getITUCallPrefix());
}
@Override
public boolean hasCustomInstantiateInstance() {
return true;
}
@Override
public CountryCodeImpl instantiateInstance(SerializationStreamReader streamReader)
throws SerializationException {
return instantiate(streamReader);
}
public static CountryCodeImpl instantiate(SerializationStreamReader streamReader)
throws SerializationException {
return new CountryCodeImpl(streamReader.readString(), streamReader.readString(),
streamReader.readString(), streamReader.readString(), streamReader.readString(), streamReader.readString(),
streamReader.readString(), streamReader.readString());
}
@Override
public void deserializeInstance(SerializationStreamReader streamReader, CountryCodeImpl instance)
throws SerializationException {
deserialize(streamReader, instance);
}
public static void deserialize(SerializationStreamReader streamReader, CountryCodeImpl instance) {
// Done by instantiateInstance
}
}
@@ -16,8 +16,8 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.ImageResourceRenderer;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDescriptorDTO;
import com.sap.sailing.gwt.ui.client.FlagImageResolver;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -28,10 +28,10 @@ import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionModel<CompetitorDescriptorDTO>>
extends TableWrapper<CompetitorDescriptorDTO, S> {
public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionModel<CompetitorDescriptor>>
extends TableWrapper<CompetitorDescriptor, S> {
private final LabeledAbstractFilterablePanel<CompetitorDescriptorDTO> filterablePanelCompetitorDescriptor;
private final LabeledAbstractFilterablePanel<CompetitorDescriptor> filterablePanelCompetitorDescriptor;
private final CompetitorImportMatcher competitorImportMatcher;
@@ -77,31 +77,31 @@ public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionMode
*
*/
public static interface CompetitorsToImportToExistingLinking {
void unlinkCompetitor(CompetitorDescriptorDTO competitor);
CompetitorDTO getExistingCompetitorToUseInsteadOf(CompetitorDescriptorDTO competitor);
void unlinkCompetitor(CompetitorDescriptor competitor);
CompetitorDTO getExistingCompetitorToUseInsteadOf(CompetitorDescriptor competitor);
}
public CompetitorDescriptorTableWrapper(CompetitorImportMatcher competitorImportMatcherParam,
SailingServiceAsync sailingService, final StringMessages stringMessages, ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager, final CompetitorsToImportToExistingLinking unlinkCallback) {
super(sailingService, stringMessages, errorReporter, multiSelection, enablePager,
new EntityIdentityComparator<CompetitorDescriptorDTO>() {
new EntityIdentityComparator<CompetitorDescriptor>() {
@Override
public boolean representSameEntity(CompetitorDescriptorDTO dto1, CompetitorDescriptorDTO dto2) {
public boolean representSameEntity(CompetitorDescriptor dto1, CompetitorDescriptor dto2) {
return dto1.equals(dto2);
}
@Override
public int hashCode(CompetitorDescriptorDTO dto) {
public int hashCode(CompetitorDescriptor dto) {
return dto.hashCode();
}
});
this.competitorImportMatcher = competitorImportMatcherParam;
filterablePanelCompetitorDescriptor = new LabeledAbstractFilterablePanel<CompetitorDescriptorDTO>(
filterablePanelCompetitorDescriptor = new LabeledAbstractFilterablePanel<CompetitorDescriptor>(
new Label(stringMessages.filterImportedCompetitorsByNameSailRaceFleet()),
new ArrayList<CompetitorDescriptorDTO>(), table, dataProvider) {
new ArrayList<CompetitorDescriptor>(), table, dataProvider) {
@Override
public Iterable<String> getSearchableStrings(CompetitorDescriptorDTO competitorDescriptor) {
public Iterable<String> getSearchableStrings(CompetitorDescriptor competitorDescriptor) {
List<String> string = new ArrayList<String>();
string.add(competitorDescriptor.getName());
string.add(competitorDescriptor.getSailNumber());
@@ -113,22 +113,21 @@ public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionMode
};
registerSelectionModelOnNewDataProvider(filterablePanelCompetitorDescriptor.getAllListDataProvider());
TextColumn<CompetitorDescriptorDTO> competitorNameColumn = new TextColumn<CompetitorDescriptorDTO>() {
TextColumn<CompetitorDescriptor> competitorNameColumn = new TextColumn<CompetitorDescriptor>() {
@Override
public String getValue(CompetitorDescriptorDTO competitor) {
public String getValue(CompetitorDescriptor competitor) {
return competitor.getName();
}
};
competitorNameColumn.setSortable(true);
Column<CompetitorDescriptorDTO, SafeHtml> sailIdColumn = new Column<CompetitorDescriptorDTO, SafeHtml>(
Column<CompetitorDescriptor, SafeHtml> sailIdColumn = new Column<CompetitorDescriptor, SafeHtml>(
new SafeHtmlCell()) {
@Override
public SafeHtml getValue(CompetitorDescriptorDTO competitor) {
public SafeHtml getValue(CompetitorDescriptor competitor) {
SafeHtmlBuilder sb = new SafeHtmlBuilder();
ImageResourceRenderer renderer = new ImageResourceRenderer();
final String twoLetterIsoCountryCode = competitor.getTwoLetterIsoCountryCode();
final String twoLetterIsoCountryCode = competitor.getCountryCode().getTwoLetterISOCode();
final ImageResource flagImageResource;
if (twoLetterIsoCountryCode == null || twoLetterIsoCountryCode.isEmpty()) {
flagImageResource = FlagImageResolver.getEmptyFlagImageResource();
@@ -146,49 +145,49 @@ public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionMode
};
sailIdColumn.setSortable(true);
TextColumn<CompetitorDescriptorDTO> boatClassNameColumn = new TextColumn<CompetitorDescriptorDTO>() {
TextColumn<CompetitorDescriptor> boatClassNameColumn = new TextColumn<CompetitorDescriptor>() {
@Override
public String getValue(CompetitorDescriptorDTO competitorDescriptor) {
public String getValue(CompetitorDescriptor competitorDescriptor) {
return competitorDescriptor.getBoatClassName();
}
};
boatClassNameColumn.setSortable(true);
TextColumn<CompetitorDescriptorDTO> raceNameColumn = new TextColumn<CompetitorDescriptorDTO>() {
TextColumn<CompetitorDescriptor> raceNameColumn = new TextColumn<CompetitorDescriptor>() {
@Override
public String getValue(CompetitorDescriptorDTO competitorDescriptor) {
public String getValue(CompetitorDescriptor competitorDescriptor) {
return competitorDescriptor.getRaceName();
}
};
raceNameColumn.setSortable(true);
TextColumn<CompetitorDescriptorDTO> fleetNameColumn = new TextColumn<CompetitorDescriptorDTO>() {
TextColumn<CompetitorDescriptor> fleetNameColumn = new TextColumn<CompetitorDescriptor>() {
@Override
public String getValue(CompetitorDescriptorDTO competitorDescriptor) {
public String getValue(CompetitorDescriptor competitorDescriptor) {
return competitorDescriptor.getFleetName();
}
};
fleetNameColumn.setSortable(true);
TextColumn<CompetitorDescriptorDTO> isHasMatchesColumn = new TextColumn<CompetitorDescriptorDTO>() {
TextColumn<CompetitorDescriptor> isHasMatchesColumn = new TextColumn<CompetitorDescriptor>() {
@Override
public String getValue(CompetitorDescriptorDTO competitorDescriptor) {
public String getValue(CompetitorDescriptor competitorDescriptor) {
return competitorImportMatcher.getMatchesCompetitors(competitorDescriptor).isEmpty()
? stringMessages.no() : stringMessages.yes();
}
};
isHasMatchesColumn.setSortable(true);
// alters the getValue method such that it returns an empty string if the competitor to import is not linked to an existing one, non-null otherwise
ImagesBarColumn<CompetitorDescriptorDTO, CompetitorImportTableActionIcons> unlinkColumn =
new ImagesBarColumn<CompetitorDescriptorDTO, CompetitorDescriptorTableWrapper.CompetitorImportTableActionIcons>(new CompetitorImportTableActionIcons(stringMessages)) {
ImagesBarColumn<CompetitorDescriptor, CompetitorImportTableActionIcons> unlinkColumn =
new ImagesBarColumn<CompetitorDescriptor, CompetitorDescriptorTableWrapper.CompetitorImportTableActionIcons>(new CompetitorImportTableActionIcons(stringMessages)) {
@Override
public String getValue(CompetitorDescriptorDTO competitor) {
public String getValue(CompetitorDescriptor competitor) {
return unlinkCallback.getExistingCompetitorToUseInsteadOf(competitor)==null?"":"linked";
}
};
unlinkColumn.setFieldUpdater(new FieldUpdater<CompetitorDescriptorDTO, String>() {
unlinkColumn.setFieldUpdater(new FieldUpdater<CompetitorDescriptor, String>() {
@Override
public void update(int index, final CompetitorDescriptorDTO competitor, String value) {
public void update(int index, final CompetitorDescriptor competitor, String value) {
if (CompetitorImportTableActionIcons.ACTION_UNLINK.equals(value)) {
if (unlinkCallback != null) {
unlinkCallback.unlinkCompetitor(competitor);
@@ -209,13 +208,13 @@ public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionMode
sailIdColumn, raceNameColumn, fleetNameColumn, isHasMatchesColumn, unlinkColumn, unlinkCallback));
}
private ListHandler<CompetitorDescriptorDTO> getCompetitorDescriptorTableColumnListSortHandler(
TextColumn<CompetitorDescriptorDTO> competitorNameColumn,
TextColumn<CompetitorDescriptorDTO> boatClassNameColumn, Column<CompetitorDescriptorDTO, SafeHtml> sailIdColumn,
TextColumn<CompetitorDescriptorDTO> raceNameColumn,
TextColumn<CompetitorDescriptorDTO> fleetNameColumn, TextColumn<CompetitorDescriptorDTO> isHasMatchesColumn,
ImagesBarColumn<CompetitorDescriptorDTO, CompetitorImportTableActionIcons> unlinkColumn, CompetitorsToImportToExistingLinking unlinkCallback) {
ListHandler<CompetitorDescriptorDTO> competitorColumnListHandler = getColumnSortHandler();
private ListHandler<CompetitorDescriptor> getCompetitorDescriptorTableColumnListSortHandler(
TextColumn<CompetitorDescriptor> competitorNameColumn,
TextColumn<CompetitorDescriptor> boatClassNameColumn, Column<CompetitorDescriptor, SafeHtml> sailIdColumn,
TextColumn<CompetitorDescriptor> raceNameColumn,
TextColumn<CompetitorDescriptor> fleetNameColumn, TextColumn<CompetitorDescriptor> isHasMatchesColumn,
ImagesBarColumn<CompetitorDescriptor, CompetitorImportTableActionIcons> unlinkColumn, CompetitorsToImportToExistingLinking unlinkCallback) {
ListHandler<CompetitorDescriptor> competitorColumnListHandler = getColumnSortHandler();
final NaturalComparator caseInsensitiveNaturalComparator = new NaturalComparator(/* case sensitive */ false);
final Comparator<CompetitorDTO> nullFirstComparator = Comparator.nullsFirst(/* real comparator */ null);
competitorColumnListHandler.setComparator(competitorNameColumn, (cd1, cd2)->caseInsensitiveNaturalComparator.compare(cd1.getName(), cd2.getName()));
@@ -230,11 +229,11 @@ public class CompetitorDescriptorTableWrapper<S extends RefreshableSelectionMode
return competitorColumnListHandler;
}
public Iterable<CompetitorDescriptorDTO> getAllCompetitorDescriptors() {
public Iterable<CompetitorDescriptor> getAllCompetitorDescriptors() {
return filterablePanelCompetitorDescriptor.getAll();
}
public void refreshCompetitorDescriptorList(Iterable<CompetitorDescriptorDTO> competitors) {
public void refreshCompetitorDescriptorList(Iterable<CompetitorDescriptor> competitors) {
filterablePanelCompetitorDescriptor.updateAll(competitors);
}
@@ -3,8 +3,8 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDescriptorDTO;
import com.sap.sse.common.Util;
/**
@@ -22,7 +22,7 @@ public class CompetitorImportMatcher {
this.existingCompetitorDTOs = existingCompetitors;
}
public Set<CompetitorDTO> getMatchesCompetitors(CompetitorDescriptorDTO competitorDescriptor) {
public Set<CompetitorDTO> getMatchesCompetitors(CompetitorDescriptor competitorDescriptor) {
Set<CompetitorDTO> matchesCompetitor = new HashSet<>();
if (competitorDescriptor == null) {
return matchesCompetitor;
@@ -35,7 +35,7 @@ public class CompetitorImportMatcher {
return matchesCompetitor;
}
private boolean isEqual(CompetitorDescriptorDTO competitorDescriptor, CompetitorDTO existingCompetitor) {
private boolean isEqual(CompetitorDescriptor competitorDescriptor, CompetitorDTO existingCompetitor) {
return Util.equalsWithNull(competitorDescriptor.getName(), existingCompetitor.getName(), /* ignoreCase */ true)
&& Util.equalsWithNull(removeSpaces(competitorDescriptor.getSailNumber()), removeSpaces(existingCompetitor.getSailID()), /* ignoreCase */ true)
&& compareCountryCode(competitorDescriptor, existingCompetitor);
@@ -45,11 +45,8 @@ public class CompetitorImportMatcher {
return s==null?null:s.replace(" ", "").replace("\t", "");
}
private boolean compareCountryCode(CompetitorDescriptorDTO competitorDescriptor, CompetitorDTO existingCompetitor) {
return Util.equalsWithNull(competitorDescriptor.getCountryName(), existingCompetitor.getCountryName(), /* ignoreCase */ true)
&& Util.equalsWithNull(competitorDescriptor.getThreeLetterIocCountryCode(),
existingCompetitor.getThreeLetterIocCountryCode(), /* ignoreCase */ true)
&& Util.equalsWithNull(competitorDescriptor.getTwoLetterIsoCountryCode(),
existingCompetitor.getTwoLetterIsoCountryCode(), /* ignoreCase */ true);
private boolean compareCountryCode(CompetitorDescriptor competitorDescriptor, CompetitorDTO existingCompetitor) {
return Util.equalsWithNull(competitorDescriptor.getCountryCode().getThreeLetterIOCCode(),
existingCompetitor.getThreeLetterIocCountryCode(), /* ignoreCase */ true);
}
}
@@ -4,8 +4,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
@@ -15,8 +15,8 @@ import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDescriptorDTO;
import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback;
import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -25,8 +25,8 @@ import com.sap.sailing.gwt.ui.shared.CompetitorProviderDTO;
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.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.BusyDisplay;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
@@ -186,13 +186,13 @@ public class CompetitorImportProviderSelectionDialog extends DataEntryDialog<Com
final String regattaName = competitorImportDialogResult.getRegattaName();
busyDisplay.setBusy(true);
@SuppressWarnings("unchecked")
final Iterable<CompetitorDescriptorDTO>[] competitorDescriptors = (Iterable<CompetitorDescriptorDTO>[]) new Iterable<?>[1];
final Iterable<CompetitorDescriptor>[] competitorDescriptors = (Iterable<CompetitorDescriptor>[]) new Iterable<?>[1];
@SuppressWarnings("unchecked")
final Iterable<CompetitorDTO>[] competitors = (Iterable<CompetitorDTO>[]) new Iterable<?>[1];
final ParallelExecutionCallback<Iterable<CompetitorDescriptorDTO>> getCompetitorDescriptorsCallback =
new ParallelExecutionCallback<Iterable<CompetitorDescriptorDTO>>() {
final ParallelExecutionCallback<Iterable<CompetitorDescriptor>> getCompetitorDescriptorsCallback =
new ParallelExecutionCallback<Iterable<CompetitorDescriptor>>() {
@Override
public void onSuccess(Iterable<CompetitorDescriptorDTO> myCompetitorDescriptors) {
public void onSuccess(Iterable<CompetitorDescriptor> myCompetitorDescriptors) {
competitorDescriptors[0] = myCompetitorDescriptors;
super.onSuccess(myCompetitorDescriptors);
}
@@ -232,7 +232,7 @@ public class CompetitorImportProviderSelectionDialog extends DataEntryDialog<Com
* competitors.
*
* @param competitorDescriptors
* imported competitor descriptors {@link CompetitorDescriptorDTO}
* imported competitor descriptors {@link CompetitorDescriptor}
* @param competitors
* existing competitors from {@link CompetitorStore}
* @author Alexander Tatarinovich
@@ -240,7 +240,7 @@ public class CompetitorImportProviderSelectionDialog extends DataEntryDialog<Com
*/
public interface MatchImportedCompetitorsDialogFactory {
MatchImportedCompetitorsDialog createMatchImportedCompetitorsDialog(
Iterable<CompetitorDescriptorDTO> competitorDescriptors, Iterable<CompetitorDTO> competitors);
Iterable<CompetitorDescriptor> competitorDescriptors, Iterable<CompetitorDTO> competitors);
}
@Override
@@ -11,16 +11,16 @@ import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.domain.common.CompetitorDescriptor;
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.gwt.ui.adminconsole.CompetitorImportProviderSelectionDialog.MatchImportedCompetitorsDialogFactory;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.BusyDisplay;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
/**
@@ -158,7 +158,7 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay {
return new MatchImportedCompetitorsDialogFactory() {
@Override
public MatchImportedCompetitorsDialog createMatchImportedCompetitorsDialog(
final Iterable<CompetitorDescriptorDTO> competitorDescriptors,
final Iterable<CompetitorDescriptor> competitorDescriptors,
final Iterable<CompetitorDTO> competitors) {
ImportCompetitorCallback importCompetitorCallback = new ImportCompetitorCallback(sailingService,
errorReporter, stringMessages);
@@ -1,27 +1,34 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
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.dialog.DataEntryDialog.DialogCallback;
/**
* Callback is responsible for saving competitors that have a {@code null} {@link CompetitorDTO#getIdAsString() ID} to
* the competitor store using {@link SailingServiceAsync#addCompetitors(Iterable, AsyncCallback)} and registering them
* if necessary. Logic for registering should be implemented in subclasses by overriding the {@link #registerCompetitors(Set)}
* method which does nothing in this class.
* Callback is responsible for creation competitors for which no {@link CompetitorDTO} that represents an
* already existing competitor has been provided, and save those newly created competitors to
* the competitor store using {@link SailingServiceAsync#addCompetitors(Iterable, AsyncCallback)}. The combined
* set of competitors as represented by the {@link CompetitorDTO}s provided as values representing the existing
* competitors to use, plus those {@link CompetitorDTO}s returned from the service representing the newly
* created competitors (those actually "imported") are then passed to {@link #registerCompetitors(Set)} which
* in this class does nothing but may be overridden by subclasses.
*
* @author Alexander Tatarinovich
*
*/
public class ImportCompetitorCallback implements DialogCallback<Set<CompetitorDTO>> {
public class ImportCompetitorCallback implements DialogCallback<Pair<Map<CompetitorDescriptor, CompetitorDTO>, String>> {
protected final SailingServiceAsync sailingService;
protected final ErrorReporter errorReporter;
protected final StringMessages stringMessages;
@@ -38,24 +45,17 @@ public class ImportCompetitorCallback implements DialogCallback<Set<CompetitorDT
}
@Override
public void ok(final Set<CompetitorDTO> competitorsForRegistering) {
List<CompetitorDTO> competitorsForSaving = prepareCompetitorsForSaving(competitorsForRegistering);
registerCompetitorsAfterSaving(competitorsForSaving, competitorsForRegistering);
public void ok(final Pair<Map<CompetitorDescriptor, CompetitorDTO>, String> competitorsForRegisteringAndSearchTag) {
registerCompetitorsAfterSaving(competitorsForRegisteringAndSearchTag.getA().entrySet().stream().filter((e->e.getValue() != null)).map(e->e.getKey()).
collect(Collectors.toList()),
competitorsForRegisteringAndSearchTag.getA().values(), competitorsForRegisteringAndSearchTag.getB());
}
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<List<CompetitorDTO>>() {
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) {
errorReporter.reportError(caught.getMessage());
@@ -63,7 +63,8 @@ public class ImportCompetitorCallback implements DialogCallback<Set<CompetitorDT
@Override
public void onSuccess(List<CompetitorDTO> result) {
final Set<CompetitorDTO> competitorsToAddWithNewOnesReplacedBySavedOnesWithId = new HashSet<>(competitorsForRegistration);
final Set<CompetitorDTO> competitorsToAddWithNewOnesReplacedBySavedOnesWithId = new HashSet<>();
Util.addAll(competitorsForRegistration, competitorsToAddWithNewOnesReplacedBySavedOnesWithId);
// remove the locally constructed CompetitorDTOs that had null as their ID...
competitorsToAddWithNewOnesReplacedBySavedOnesWithId.removeAll(competitorsForSaving);
// ...and replace by those returned by the server after saving to the competitor store where they received an ID:
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -9,20 +8,19 @@ import java.util.Set;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
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.CompetitorDescriptor;
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.adminconsole.CompetitorDescriptorTableWrapper.CompetitorsToImportToExistingLinking;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
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.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
@@ -41,6 +39,11 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog;
* {@link CompetitorDTO#getIdAsString() ID}.
* <p>
*
* The result is a {@link Map} whose keys are all competitors selected for import and whose values are {@code null}
* in case the competitor shall really be imported and hence be created anew, or a valid {@link CompetitorDTO} with
* a valid {@link CompetitorDTO#getIdAsString() ID}, representing an already existing competitor that shall be used
* instead of the key competitor descriptor.<p>
*
* Use an {@link ImportCompetitorCallback} or subclass thereof as the {@link DialogCallback} passed to the constructor
* for conveniently saving imported competitors to the store using
* {@link SailingServiceAsync#addCompetitors(Iterable, com.google.gwt.user.client.rpc.AsyncCallback)}. Define a subclass
@@ -50,35 +53,37 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog;
* @author Alexander Tatarinovich
*
*/
public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<CompetitorDTO>> {
public class MatchImportedCompetitorsDialog extends DataEntryDialog<Pair<Map<CompetitorDescriptor, CompetitorDTO>, String>> {
private CompetitorDescriptorTableWrapper<RefreshableMultiSelectionModel<CompetitorDescriptorDTO>> importedCompetitorsTable;
private CompetitorDescriptorTableWrapper<RefreshableMultiSelectionModel<CompetitorDescriptor>> importedCompetitorsTable;
private CompetitorTableWrapper<RefreshableSingleSelectionModel<CompetitorDTO>> existingCompetitorsTable;
private TextBox searchTagField;
private final StringMessages stringMessages;
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final Iterable<CompetitorDescriptorDTO> competitorDescriptorDTOs;
private final Iterable<CompetitorDescriptor> CompetitorDescriptors;
private final CompetitorImportMatcher competitorImportMatcher;
private final Map<CompetitorDescriptorDTO, CompetitorDTO> existingCompetitorsByImported = new HashMap<>();
private final Map<CompetitorDescriptor, CompetitorDTO> existingCompetitorsByImported = new HashMap<>();
public MatchImportedCompetitorsDialog(final Iterable<CompetitorDescriptorDTO> competitorDescriptorDTOs,
public MatchImportedCompetitorsDialog(final Iterable<CompetitorDescriptor> CompetitorDescriptors,
final Iterable<CompetitorDTO> existingCompetitor, StringMessages stringMessages,
SailingServiceAsync sailingService, ErrorReporter errorReporter,
DialogCallback<Set<CompetitorDTO>> callback) {
DialogCallback<Pair<Map<CompetitorDescriptor, CompetitorDTO>, String>> callback) {
super(stringMessages.importCompetitors(), stringMessages.chooseWhichCompetitorsShouldBeImported(),
stringMessages.ok(), stringMessages.cancel(), null, callback);
stringMessages.ok(), stringMessages.cancel(), /* validator */ null, callback);
this.stringMessages = stringMessages;
this.sailingService = sailingService;
this.errorReporter = errorReporter;
this.competitorDescriptorDTOs = competitorDescriptorDTOs;
this.CompetitorDescriptors = CompetitorDescriptors;
competitorImportMatcher = new CompetitorImportMatcher(existingCompetitor);
}
protected void refreshInImportTable(CompetitorDescriptorDTO competitor) {
final List<CompetitorDescriptorDTO> importedCompetitors = importedCompetitorsTable.getDataProvider().getList();
protected void refreshInImportTable(CompetitorDescriptor competitor) {
final List<CompetitorDescriptor> importedCompetitors = importedCompetitorsTable.getDataProvider().getList();
importedCompetitors.set(importedCompetitors.indexOf(competitor), competitor); // force refresh of line item in table, showing new linkage state
}
@@ -89,7 +94,7 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
false, /* enablePager */true);
final CompetitorsToImportToExistingLinking linker = new CompetitorsToImportToExistingLinking() {
@Override
public void unlinkCompetitor(CompetitorDescriptorDTO competitor) {
public void unlinkCompetitor(CompetitorDescriptor competitor) {
final CompetitorDTO existingCompetitor = existingCompetitorsByImported.remove(competitor);
if (existingCompetitor != null) {
existingCompetitorsTable.getSelectionModel().setSelected(existingCompetitor, false);
@@ -98,15 +103,15 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
}
@Override
public CompetitorDTO getExistingCompetitorToUseInsteadOf(CompetitorDescriptorDTO competitor) {
public CompetitorDTO getExistingCompetitorToUseInsteadOf(CompetitorDescriptor competitor) {
return existingCompetitorsByImported.get(competitor);
}
};
importedCompetitorsTable = new CompetitorDescriptorTableWrapper<>(competitorImportMatcher, sailingService,
stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */false, /* unlinkCallback */ linker);
importedCompetitorsTable.refreshCompetitorDescriptorList(competitorDescriptorDTOs);
importedCompetitorsTable.refreshCompetitorDescriptorList(CompetitorDescriptors);
final RefreshableMultiSelectionModel<CompetitorDescriptorDTO> importedCompetitorSelectionModel = importedCompetitorsTable
final RefreshableMultiSelectionModel<CompetitorDescriptor> importedCompetitorSelectionModel = importedCompetitorsTable
.getSelectionModel();
importedCompetitorSelectionModel
.addSelectionChangeHandler(getHandlerForImportedCompetitorsModel(importedCompetitorSelectionModel));
@@ -120,7 +125,6 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
final HorizontalPanel competitorImportPanel = new HorizontalPanel();
final CaptionPanel existingCompetitorsPanel = new CaptionPanel(stringMessages.existingCompetitors());
final CaptionPanel importedCompetitorsPanel = new CaptionPanel(stringMessages.importedCompetitors());
existingCompetitorsPanel.add(existingCompetitorsTable);
importedCompetitorsPanel.add(importedCompetitorsTable);
@@ -130,21 +134,27 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
scrollCompetitorRegistrationPanel.setSize("100%", "500px");
competitorImportPanel.add(scrollCompetitorRegistrationPanel);
competitorImportPanel.add(scrollExistingCompetitorRegistrationPanel);
searchTagField = createTextBox("", 40);
searchTagField.getElement().setPropertyString("placeholder", stringMessages.searchTagForImportedCompetitorPlaceholder());
final Label searchTagLabel = new Label(stringMessages.searchTag());
final HorizontalPanel searchTagPanel = new HorizontalPanel();
searchTagPanel.add(searchTagLabel);
searchTagPanel.add(searchTagField);
mainPanel.add(searchTagPanel);
mainPanel.add(competitorImportPanel);
return mainPanel;
}
private Handler getHandlerForExistingCompetitorsModel(
final RefreshableMultiSelectionModel<CompetitorDescriptorDTO> importedCompetitorSelectionModel,
final RefreshableMultiSelectionModel<CompetitorDescriptor> importedCompetitorSelectionModel,
final RefreshableSingleSelectionModel<CompetitorDTO> existingCompetitorSelectionModel) {
return new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
Set<CompetitorDescriptorDTO> competitorDescriptors = importedCompetitorSelectionModel.getSelectedSet();
Set<CompetitorDescriptor> competitorDescriptors = importedCompetitorSelectionModel.getSelectedSet();
if (competitorDescriptors.size() == 1) {
final CompetitorDTO selectedCompetitor = existingCompetitorSelectionModel.getSelectedObject();
final CompetitorDescriptorDTO competitorFromImport = competitorDescriptors.iterator().next();
final CompetitorDescriptor competitorFromImport = competitorDescriptors.iterator().next();
final boolean changed;
if (selectedCompetitor == null) {
changed = existingCompetitorsByImported.remove(competitorFromImport) != null;
@@ -161,18 +171,18 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
}
private Handler getHandlerForImportedCompetitorsModel(
final RefreshableMultiSelectionModel<CompetitorDescriptorDTO> importedCompetitorSelectionModel) {
final RefreshableMultiSelectionModel<CompetitorDescriptor> importedCompetitorSelectionModel) {
return new Handler() {
private boolean refreshing = false;
@Override
public void onSelectionChange(SelectionChangeEvent event) {
if (!refreshing) {
Set<CompetitorDescriptorDTO> selectedCompetitorDescriptors = importedCompetitorSelectionModel.getSelectedSet();
Set<CompetitorDescriptor> selectedCompetitorDescriptors = importedCompetitorSelectionModel.getSelectedSet();
if (selectedCompetitorDescriptors.size() > 1) {
existingCompetitorsTable.getFilterField().removeAll();
return;
}
CompetitorDescriptorDTO selectedCompetitorDescriptor = selectedCompetitorDescriptors.isEmpty() ? null
CompetitorDescriptor selectedCompetitorDescriptor = selectedCompetitorDescriptors.isEmpty() ? null
: importedCompetitorSelectionModel.getSelectedSet().iterator().next();
refreshing = true;
try {
@@ -191,26 +201,11 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Set<Competit
}
@Override
protected Set<CompetitorDTO> getResult() {
final Set<CompetitorDTO> competitorsForSave = new HashSet<>();
for (CompetitorDescriptorDTO competitorDescriptor : importedCompetitorsTable.getSelectionModel().getSelectedSet()) {
CompetitorDTO existingCompetitor = existingCompetitorsByImported.get(competitorDescriptor);
if (existingCompetitor != null) {
competitorsForSave.add(existingCompetitor);
} else {
competitorsForSave.add(convertCompetitorDescriptorToCompetitorDTO(competitorDescriptor));
}
protected Pair<Map<CompetitorDescriptor, CompetitorDTO>, String> getResult() {
final Map<CompetitorDescriptor, CompetitorDTO> result = new HashMap<>();
for (CompetitorDescriptor competitorDescriptor : importedCompetitorsTable.getSelectionModel().getSelectedSet()) {
result.put(competitorDescriptor, existingCompetitorsByImported.get(competitorDescriptor));
}
return competitorsForSave;
}
private CompetitorDTO convertCompetitorDescriptorToCompetitorDTO(CompetitorDescriptorDTO competitorDescriptor) {
BoatDTO defaultBoat = new BoatDTO(null, competitorDescriptor.getSailNumber());
BoatClassDTO defaultBoatClass = new BoatClassDTO(competitorDescriptor.getBoatClassName() == null
? BoatClassDTO.DEFAULT_NAME : competitorDescriptor.getBoatClassName(),
/* some default hull length; not used if boat class name can be resolved on the server */ new MeterDistance(5));
return new CompetitorDTOImpl(competitorDescriptor.getName(), null, null,
competitorDescriptor.getTwoLetterIsoCountryCode(), competitorDescriptor.getThreeLetterIocCountryCode(),
competitorDescriptor.getCountryName(), null, null, null, defaultBoat, defaultBoatClass, null, null, null);
return new Pair<>(result, searchTagField.getText());
}
}
@@ -1,14 +1,9 @@
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;
@@ -17,43 +12,13 @@ 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) {
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
@@ -11,6 +11,7 @@ import java.util.UUID;
import com.google.gwt.user.client.rpc.RemoteService;
import com.sap.sailing.domain.abstractlog.Revokable;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDenoteForTrackingEvent;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.DataImportProgress;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.LeaderboardType;
@@ -32,7 +33,6 @@ import com.sap.sailing.domain.common.abstractlog.NotRevokableException;
import com.sap.sailing.domain.common.abstractlog.TimePointSpecificationFoundInLog;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDescriptorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.IncrementalOrFullLeaderboardDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
@@ -348,7 +348,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
CompetitorProviderDTO getCompetitorProviderDTOByName(String providerName) throws Exception;
Iterable<CompetitorDescriptorDTO> getCompetitorDescriptors(String competitorProviderName, String eventName,
Iterable<CompetitorDescriptor> getCompetitorDescriptors(String competitorProviderName, String eventName,
String regattaName) throws Exception;
WindInfoForRaceDTO getWindSourcesInfo(RegattaAndRaceIdentifier raceIdentifier);
@@ -445,7 +445,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
CompetitorDTO addOrUpdateCompetitor(CompetitorDTO competitor) throws Exception;
List<CompetitorDTO> addCompetitors(Iterable<CompetitorDTO> competitorDTOs) throws Exception;
List<CompetitorDTO> addCompetitors(Iterable<CompetitorDescriptor> competitorsForSaving, String searchTag) throws Exception;
void allowCompetitorResetToDefaults(Iterable<CompetitorDTO> competitors);
@@ -9,6 +9,7 @@ import java.util.Set;
import java.util.UUID;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.DataImportProgress;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.LeaderboardType;
@@ -27,7 +28,6 @@ import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.abstractlog.TimePointSpecificationFoundInLog;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDescriptorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.IncrementalOrFullLeaderboardDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
@@ -469,8 +469,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void getCompetitorProviderDTOByName(String providerName, AsyncCallback<CompetitorProviderDTO> callback);
void getCompetitorDescriptors(String competitorProviderName, String eventName, String regattaName,
AsyncCallback<Iterable<CompetitorDescriptorDTO>> callback);
void getCompetitorDescriptors(String competitorProviderName, String eventName, String regattaName, AsyncCallback<Iterable<CompetitorDescriptor>> callback);
void getWindSourcesInfo(RegattaAndRaceIdentifier raceIdentifier, AsyncCallback<WindInfoForRaceDTO> callback);
@@ -597,7 +596,12 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void addOrUpdateCompetitor(CompetitorDTO competitor, AsyncCallback<CompetitorDTO> asyncCallback);
void addCompetitors(Iterable<CompetitorDTO> competitorDTOs, AsyncCallback<List<CompetitorDTO>> asyncCallback);
/**
* @param searchTag
* set as the {@code searchTag} property on all new competitors created and therefore returned in the
* {@link CompetitorDTO#getSearchTag()} properties
*/
void addCompetitors(Iterable<CompetitorDescriptor> competitorsForSaving, String searchTag, AsyncCallback<List<CompetitorDTO>> asyncCallback);
void allowCompetitorResetToDefaults(Iterable<CompetitorDTO> competitors, AsyncCallback<Void> asyncCallback);
@@ -1759,4 +1759,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String errorLoadingCompetitorImportProviders(String message);
String errorLoadingCompetitorImportDescriptors(String message);
String couldNotSaveCompetitorRegistrations(String message);
String searchTagForImportedCompetitorPlaceholder();
}
@@ -1730,4 +1730,5 @@ hasMatches=Has matches
filterImportedCompetitorsByNameSailRaceFleet=Filter competitors to import by name, sail number, race or fleet
errorLoadingCompetitorImportProviders=Error loading competitor import providers: {0}
errorLoadingCompetitorImportDescriptors=Error loading competitor import descriptors: {0}
couldNotSaveCompetitorRegistrations=Could not save competitor registrations: {0}
couldNotSaveCompetitorRegistrations=Could not save competitor registrations: {0}
searchTagForImportedCompetitorPlaceholder=Use, e.g., the race+fleet name
@@ -1715,4 +1715,5 @@ hasMatches=ähnliche vorhanden
filterImportedCompetitorsByNameSailRaceFleet=Zu importierende Teilnehmer filtern nach Name, Segelnummer, Wettfahrt oder Gruppe
errorLoadingCompetitorImportProviders=Fehler beim Laden der Quellen für den Teilnehmerdaten-Import: {0}
errorLoadingCompetitorImportDescriptors=Fehler beim Laden der zu importierenden Teilnehmerdaten: {0}
couldNotSaveCompetitorRegistrations=Teilnehmerregistrierung konnte nicht gespeichert werden: {0}
couldNotSaveCompetitorRegistrations=Teilnehmerregistrierung konnte nicht gespeichert werden: {0}
searchTagForImportedCompetitorPlaceholder=Z.B. Renn- und Gruppenname
@@ -55,7 +55,6 @@ import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.competitorimport.CompetitorDescriptor;
import com.sap.sailing.competitorimport.CompetitorProvider;
import com.sap.sailing.domain.abstractlog.AbstractLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
@@ -108,7 +107,6 @@ import com.sap.sailing.domain.base.LeaderboardGroupBase;
import com.sap.sailing.domain.base.Leg;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.RaceDefinition;
@@ -148,6 +146,7 @@ import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.DataImportProgress;
import com.sap.sailing.domain.common.DataImportSubProgress;
@@ -190,13 +189,11 @@ import com.sap.sailing.domain.common.abstractlog.TimePointSpecificationFoundInLo
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.CompetitorDescriptorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.FullLeaderboardDTO;
import com.sap.sailing.domain.common.dto.IncrementalLeaderboardDTO;
import com.sap.sailing.domain.common.dto.IncrementalOrFullLeaderboardDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.PersonDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTOFactory;
import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO;
@@ -728,52 +725,16 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public Iterable<CompetitorDescriptorDTO> getCompetitorDescriptors(String competitorProviderName, String eventName,
public Iterable<CompetitorDescriptor> getCompetitorDescriptors(String competitorProviderName, String eventName,
String regattaName) throws Exception {
for (CompetitorProvider cp : getAllCompetitorProviders()) {
if (cp.getName().equals(competitorProviderName)) {
Iterable<CompetitorDescriptor> competitorDescriptors = cp.getCompetitorDescriptors(eventName, regattaName);
Set<CompetitorDescriptorDTO> competitorDescriptorDTOs = getCompetitorProviderDTOs(competitorDescriptors);
return competitorDescriptorDTOs;
return cp.getCompetitorDescriptors(eventName, regattaName);
}
}
return Collections.emptySet();
}
private Set<CompetitorDescriptorDTO> getCompetitorProviderDTOs(
Iterable<CompetitorDescriptor> competitorDescriptors) {
Set<CompetitorDescriptorDTO> competitorDescriptorDTOs = new HashSet<>();
for (CompetitorDescriptor cd : competitorDescriptors) {
CompetitorDescriptorDTO cdDTO = convertToCompetitorDescriptorDTO(cd);
competitorDescriptorDTOs.add(cdDTO);
}
return competitorDescriptorDTOs;
}
private CompetitorDescriptorDTO convertToCompetitorDescriptorDTO(CompetitorDescriptor competitorDescriptor) {
Set<PersonDTO> persons = new HashSet<>();
for (Person person : competitorDescriptor.getPersons()) {
String nationalityThreeLetterIOCAcronym = person.getNationality() != null
? person.getNationality().getThreeLetterIOCAcronym() : null;
PersonDTO personDTO = new PersonDTO(person.getName(), person.getDateOfBirth(), person.getDescription(),
nationalityThreeLetterIOCAcronym);
persons.add(personDTO);
}
CountryCode countryCode = competitorDescriptor.getCountryCode();
String countryName = countryCode == null ? null : countryCode.getName();
String twoLetterIsoCountryCode = countryCode == null ? null : countryCode.getTwoLetterISOCode();
String threeLetterIocCountryCode = countryCode == null ? null : countryCode.getThreeLetterIOCCode();
CompetitorDescriptorDTO competitorDescriptorDTO = new CompetitorDescriptorDTO(
competitorDescriptor.getEventName(), competitorDescriptor.getRegattaName(),
competitorDescriptor.getBoatClassName(), competitorDescriptor.getRaceName(),
competitorDescriptor.getFleetName(), competitorDescriptor.getSailNumber(), competitorDescriptor.getCompetitorName(),
countryName, twoLetterIsoCountryCode, threeLetterIocCountryCode, persons);
return competitorDescriptorDTO;
}
/**
* If <code>date</code> is <code>null</code>, the {@link LiveLeaderboardUpdater} for the
* <code>leaderboardName</code> requested is obtained or created if it doesn't exist yet. The request is then passed
@@ -4867,10 +4828,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public List<CompetitorDTO> addCompetitors(Iterable<CompetitorDTO> competitorDTOs) throws URISyntaxException {
public List<CompetitorDTO> addCompetitors(Iterable<CompetitorDescriptor> competitorDescriptors, String searchTag) throws URISyntaxException {
List<Competitor> competitorsForSaving = new ArrayList<>();
for (CompetitorDTO competitorDTO : competitorDTOs) {
Competitor competitor = convertCompetitorDTOToCompetitor(competitorDTO);
for (final CompetitorDescriptor competitorDescriptor : competitorDescriptors) {
Competitor competitor = convertCompetitorDescriptorToCompetitor(competitorDescriptor, searchTag);
competitorsForSaving.add(competitor);
}
getBaseDomainFactory().getCompetitorStore().addCompetitors(competitorsForSaving);
@@ -4878,24 +4839,25 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
/**
* Creates a new {@link Competitor} object from a {@link CompetitorDTO}, assuming that the DTO does not have
* a valid {@link CompetitorDTO#getIdAsString() ID} set.
* Creates a new {@link Competitor} object from a {@link CompetitorDescriptor} with a new random {@link UUID}.
*
* @param searchTag
* set as the {@link Competitor#getSearchTag() searchTag} property of all new competitors
*/
private Competitor convertCompetitorDTOToCompetitor(CompetitorDTO competitorDTO) throws URISyntaxException {
assert competitorDTO.getIdAsString() == null;
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(), Collections.singleton(sailor), null);
DynamicBoat boat = new BoatImpl(competitorDTO.getSailID(), 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());
private Competitor convertCompetitorDescriptorToCompetitor(CompetitorDescriptor competitorDescriptor, String searchTag) throws URISyntaxException {
Nationality nationality = (competitorDescriptor.getCountryCode() == null
|| competitorDescriptor.getCountryCode().getThreeLetterIOCCode() == null
|| competitorDescriptor.getCountryCode().getThreeLetterIOCCode().isEmpty()) ? null
: getBaseDomainFactory().getOrCreateNationality(competitorDescriptor.getCountryCode().getThreeLetterIOCCode());
BoatClass boatClass = getBaseDomainFactory().getOrCreateBoatClass(competitorDescriptor.getBoatClassName());
DynamicPerson sailor = new PersonImpl(competitorDescriptor.getName(), nationality, null, null);
DynamicTeam team = new TeamImpl(competitorDescriptor.getName(), Collections.singleton(sailor), null);
DynamicBoat boat = new BoatImpl(competitorDescriptor.getSailNumber(), boatClass, competitorDescriptor.getSailNumber());
Competitor competitor = new CompetitorImpl(UUID.randomUUID(), competitorDescriptor.getName(),
/* color */ null, /* eMail */ null,
/* flag image */ null, team,
boat, competitorDescriptor.getTimeOnTimeFactor(),
competitorDescriptor.getTimeOnDistanceAllowancePerNauticalMile(), searchTag);
return competitor;
}
@@ -15,8 +15,8 @@ import javax.xml.bind.JAXBException;
import org.junit.Test;
import com.sap.sailing.competitorimport.CompetitorDescriptor;
import com.sap.sailing.competitorimport.CompetitorProvider;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.manage2sail.RegattaResultDescriptor;
import com.sap.sailing.manage2sail.resultimport.AbstractManage2SailProvider;
import com.sap.sailing.manage2sail.resultimport.CompetitorDocumentProvider;
@@ -13,11 +13,11 @@ import java.util.stream.Collectors;
import javax.xml.bind.JAXBException;
import com.sap.sailing.competitorimport.CompetitorDescriptor;
import com.sap.sailing.competitorimport.CompetitorProvider;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.PersonDTO;
import com.sap.sailing.resultimport.ResultDocumentDescriptor;
import com.sap.sailing.resultimport.ResultUrlRegistry;
import com.sap.sailing.xrr.resultimport.Parser;
@@ -153,7 +153,7 @@ public class CompetitorImporter extends AbstractManage2SailProvider implements C
team.getNOC() == null ? null : new NationalityImpl(team.getNOC().name())
};
final String boatClassName = parser.getBoatClassName(division);
List<com.sap.sailing.domain.base.Person> persons = team.getCrew().stream().sorted((c1, c2) -> -c1.getPosition().name().compareTo(c2.getPosition().name())).map((crew)->{
List<PersonDTO> persons = team.getCrew().stream().sorted((c1, c2) -> -c1.getPosition().name().compareTo(c2.getPosition().name())).map((crew)->{
Person xrrPerson = parser.getPerson(crew.getPersonID());
String name = xrrPerson.getGivenName()+" "+xrrPerson.getFamilyName();
final Nationality nationality;
@@ -165,14 +165,18 @@ public class CompetitorImporter extends AbstractManage2SailProvider implements C
teamNationality[0] = nationality;
}
}
com.sap.sailing.domain.base.Person person = new PersonImpl(name, nationality, /* date of birth */ null, /* description */ xrrPerson.getGender()==null?null:xrrPerson.getGender().name());
PersonDTO person = new PersonDTO(
name, /* dateOfBirth */ null, /* description */ xrrPerson.getGender()==null?null:xrrPerson.getGender().name(),
nationality.getCountryCode().getThreeLetterIOCCode());
return person;
}).collect(Collectors.toList());
final CompetitorDescriptor competitorDescriptor = new CompetitorDescriptor(
event==null?null:event.getTitle(),
division==null?null:(division.getTitle() + (division.getGender() == null ? "" : division.getGender().name())),
boatClassName, race != null ? race.getRaceName() : null, /* fleetName */ null, sailNumber,
team.getTeamName(), teamNationality[0] == null ? null : teamNationality[0].getCountryCode(), persons);
team.getTeamName(), team.getTeamName(), boat.getBoatName(),
teamNationality[0] == null ? null : teamNationality[0].getCountryCode(),
persons, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null);
return competitorDescriptor;
}