Merge remote-tracking branch 'origin/bug5201' into bug5201

This commit is contained in:
Axel Uhl committed 2021-01-20 00:14:30 +01:00
commit a6d369e684
6 files changed
+118 -208

No files matched your search

@@ -20,7 +20,7 @@ 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;
import com.sap.sailing.manage2sail.resultimport.CompetitorImporter;
import com.sap.sailing.manage2sail.resultimport.Manage2SailCompetitorProvider;
import com.sap.sailing.resultimport.ResultUrlRegistry;
import com.sap.sailing.xrr.resultimport.ParserFactory;
import com.sap.sse.common.Util;
@@ -41,7 +41,7 @@ public class CompetitorImportTest extends AbstractEventResultJsonServiceTest {
public void simpleCompetitorImportTest() throws FileNotFoundException, IOException, JAXBException {
ResultUrlRegistry resultUrlRegistry = mock(ResultUrlRegistry.class);
when(resultUrlRegistry.getReadableResultUrls(AbstractManage2SailProvider.NAME)).thenReturn(Arrays.asList(getClass().getClassLoader().getResource(EVENT_RESULTS_JSON+".txt")));
final CompetitorImporter competitorImporter = new CompetitorImporter(ParserFactory.INSTANCE, resultUrlRegistry);
final Manage2SailCompetitorProvider competitorImporter = new Manage2SailCompetitorProvider(ParserFactory.INSTANCE, resultUrlRegistry);
assertTrue(competitorImporter.getHasCompetitorsForRegattasInEvent().containsKey("YES - Young Europeans Sailing 2013"));
assertTrue(competitorImporter.getHasCompetitorsForRegattasInEvent().get("YES - Young Europeans Sailing 2013").contains("29er"));
final Iterable<CompetitorDescriptor> competitorDescriptors = competitorImporter.getCompetitorDescriptors("YES - Young Europeans Sailing 2013", null); // get competitors for all regattas in event
@@ -56,7 +56,7 @@ public class CompetitorImportTest extends AbstractEventResultJsonServiceTest {
public void simpleCompetitorImportTestNoResultsYet() throws FileNotFoundException, IOException, JAXBException {
ResultUrlRegistry resultUrlRegistry = mock(ResultUrlRegistry.class);
when(resultUrlRegistry.getReadableResultUrls(AbstractManage2SailProvider.NAME)).thenReturn(Arrays.asList(getClass().getClassLoader().getResource("VSaW_420_Test.json.txt")));
final CompetitorProvider competitorImporter = new CompetitorImporter(ParserFactory.INSTANCE, resultUrlRegistry) {
final CompetitorProvider competitorImporter = new Manage2SailCompetitorProvider(ParserFactory.INSTANCE, resultUrlRegistry) {
private static final long serialVersionUID = 6450491595924905L;
@Override
@@ -80,7 +80,7 @@ public class CompetitorImportTest extends AbstractEventResultJsonServiceTest {
public void simpleCompetitorImportTestNoResultsYetAndDivisionEmpty() throws FileNotFoundException, IOException, JAXBException {
ResultUrlRegistry resultUrlRegistry = mock(ResultUrlRegistry.class);
when(resultUrlRegistry.getReadableResultUrls(AbstractManage2SailProvider.NAME)).thenReturn(Arrays.asList(getClass().getClassLoader().getResource("VSaW_420_Test_EmptyDivision.json.txt")));
final CompetitorProvider competitorImporter = new CompetitorImporter(ParserFactory.INSTANCE, resultUrlRegistry) {
final CompetitorProvider competitorImporter = new Manage2SailCompetitorProvider(ParserFactory.INSTANCE, resultUrlRegistry) {
private static final long serialVersionUID = -7647297718831584969L;
@Override
@@ -12,17 +12,19 @@ import com.sap.sailing.manage2sail.EventResultDescriptor;
import com.sap.sailing.manage2sail.Manage2SailEventResultsParserImpl;
import com.sap.sailing.manage2sail.RegattaResultDescriptor;
import com.sap.sailing.resultimport.ResultDocumentDescriptor;
import com.sap.sailing.resultimport.ResultDocumentProvider;
import com.sap.sailing.resultimport.impl.ResultDocumentDescriptorImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.util.HttpUrlConnectionHelper;
public abstract class AbstractManage2SailResultDocumentProvider {
public abstract class AbstractManage2SailResultDocumentProvider implements ResultDocumentProvider{
private final ResultUrlProvider resultUrlProvider;
public AbstractManage2SailResultDocumentProvider(final ResultUrlProvider resultUrlProvider) {
this.resultUrlProvider = resultUrlProvider;
}
@Override
public Iterable<ResultDocumentDescriptor> getResultDocumentDescriptors() throws IOException {
List<ResultDocumentDescriptor> result = new ArrayList<>();
Manage2SailEventResultsParserImpl parser = new Manage2SailEventResultsParserImpl();
@@ -35,7 +35,7 @@ public class Activator implements BundleActivator {
}
@Override
protected CompetitorProvider configureCompetitorProvider(ResultUrlRegistry resultUrlRegistry) {
final CompetitorProvider service = new CompetitorImporter(ParserFactory.INSTANCE,
final CompetitorProvider service = new Manage2SailCompetitorProvider(ParserFactory.INSTANCE,
resultUrlRegistry);
return service;
}
@@ -0,0 +1,56 @@
package com.sap.sailing.manage2sail.resultimport;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.xml.bind.JAXBException;
import com.sap.sailing.competitorimport.CompetitorProvider;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.resultimport.ResultUrlRegistry;
import com.sap.sailing.xrr.resultimport.ParserFactory;
import com.sap.sailing.xrr.resultimport.impl.CompetitorResolver;
import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl;
public class Manage2SailCompetitorProvider extends AbstractManage2SailProvider implements CompetitorProvider {
private static final long serialVersionUID = 7389956404604333931L;
private final static String STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages";
private final static String ID_PREFIX = "Manage2Sail";
private final CompetitorDocumentProvider documentProvider;
private final ResourceBundleStringMessages stringMessages;
private final CompetitorResolver competitorResolver;
public Manage2SailCompetitorProvider(ParserFactory parserFactory, ResultUrlRegistry resultUrlRegistry) {
super(parserFactory, resultUrlRegistry);
documentProvider = new CompetitorDocumentProvider(this);
competitorResolver = new CompetitorResolver(documentProvider, parserFactory, ID_PREFIX);
stringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClass().getClassLoader());
}
@Override
public Map<String, Set<String>> getHasCompetitorsForRegattasInEvent() throws IOException {
return competitorResolver.getHasCompetitorsForRegattasInEvent();
}
@Override
public String getName() {
return NAME;
}
@Override
public Iterable<CompetitorDescriptor> getCompetitorDescriptors(String eventName, String regattaName) throws JAXBException, IOException {
return competitorResolver.getCompetitorDescriptors(eventName, regattaName);
}
protected CompetitorDocumentProvider getDocumentProvider() {
return documentProvider;
}
@Override
public String getHint(Locale locale) {
return stringMessages.get(locale, "CompetitorImporterHint");
}
}
@@ -1,11 +1,11 @@
package com.sap.sailing.manage2sail.resultimport;
package com.sap.sailing.xrr.resultimport.impl;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -15,44 +15,45 @@ import java.util.stream.Collectors;
import javax.xml.bind.JAXBException;
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.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.resultimport.ResultDocumentProvider;
import com.sap.sailing.xrr.resultimport.Parser;
import com.sap.sailing.xrr.resultimport.ParserFactory;
import com.sap.sailing.xrr.schema.Boat;
import com.sap.sailing.xrr.schema.Division;
import com.sap.sailing.xrr.schema.Event;
import com.sap.sailing.xrr.schema.IFNationCode;
import com.sap.sailing.xrr.schema.Person;
import com.sap.sailing.xrr.schema.Race;
import com.sap.sailing.xrr.schema.RaceResult;
import com.sap.sailing.xrr.schema.RegattaResults;
import com.sap.sailing.xrr.schema.SeriesResult;
import com.sap.sailing.xrr.schema.Team;
import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl;
public class CompetitorImporter extends AbstractManage2SailProvider implements CompetitorProvider {
private static final long serialVersionUID = 7389956404604333931L;
private static final Logger logger = Logger.getLogger(CompetitorImporter.class.getName());
private final static String STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages";
private final CompetitorDocumentProvider documentProvider;
private final ResourceBundleStringMessages stringMessages;
public class CompetitorResolver {
private static final Logger logger = Logger.getLogger(CompetitorResolver.class.getName());
public CompetitorImporter(ParserFactory parserFactory, ResultUrlRegistry resultUrlRegistry) {
super(parserFactory, resultUrlRegistry);
documentProvider = new CompetitorDocumentProvider(this);
stringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClass().getClassLoader());
private static final String ID_CONNECTOR_SYMBOL = "-";
private final ResultDocumentProvider documentProvider;
private final ParserFactory parserFactory;
private final String idPrefix;
public CompetitorResolver(ResultDocumentProvider documentProvider, ParserFactory parserFactory, String idPrefix) {
this.documentProvider = documentProvider;
this.parserFactory = parserFactory;
this.idPrefix = idPrefix;
}
@Override
public Map<String, Set<String>> getHasCompetitorsForRegattasInEvent() throws IOException {
Map<String, Set<String>> result = new HashMap<>();
for (ResultDocumentDescriptor resultDocDescr : getDocumentProvider().getResultDocumentDescriptors()) {
for (ResultDocumentDescriptor resultDocDescr : documentProvider.getResultDocumentDescriptors()) {
final String eventName = resultDocDescr.getEventName();
final String regattaName = resultDocDescr.getRegattaName();
Set<String> set = result.get(eventName);
@@ -64,21 +65,15 @@ public class CompetitorImporter extends AbstractManage2SailProvider implements C
}
return result;
}
@Override
public String getName() {
return NAME;
}
@Override
public Iterable<CompetitorDescriptor> getCompetitorDescriptors(String eventName, String regattaName) throws JAXBException, IOException {
final List<CompetitorDescriptor> result = new ArrayList<>();
final Map<String, CompetitorDescriptor> resultsByTeamID = new HashMap<>();
final Map<String, CompetitorDescriptor> teamsWithoutRaceAssignments = new HashMap<>(); // keys are the teamID
for (ResultDocumentDescriptor resultDocDescr : getDocumentProvider().getResultDocumentDescriptors()) {
for (ResultDocumentDescriptor resultDocDescr : documentProvider.getResultDocumentDescriptors()) {
if (resultDocDescr.getEventName().equals(eventName) &&
(regattaName == null || regattaName.equals(resultDocDescr.getRegattaName()))) {
final Parser parser = getParserFactory().createParser(resultDocDescr.getInputStream(), resultDocDescr.getEventName());
final Parser parser = parserFactory.createParser(resultDocDescr.getInputStream(), resultDocDescr.getEventName());
try {
final RegattaResults regattaResults = parser.parse();
// If teams are found outside of a Division context then no boat class would be assigned to the
@@ -149,7 +144,7 @@ public class CompetitorImporter extends AbstractManage2SailProvider implements C
}
return result;
}
private CompetitorDescriptor createCompetitorDescriptor(Team team, final Parser parser, Event event,
Division division, String raceID) {
final Boat boat = parser.getBoat(team.getBoatID());
@@ -159,9 +154,11 @@ public class CompetitorImporter extends AbstractManage2SailProvider implements C
// use that of team; if not defined for team, use first nationality of a team member that has one defined
team.getNOC() == null ? null : new NationalityImpl(team.getNOC().name())
};
String boatClassName = parser.getBoatClassName(division);
final String boatClassName;
if(division != null) {
boatClassName = parser.getBoatClassName(division);
}else {
boatClassName = null;
}
List<PersonDTO> persons = team.getCrew().stream().sorted((c1, c2) -> -c1.getPosition().name().compareTo(c2.getPosition().name())).map((crew)->{
Person xrrPerson = parser.getPerson(crew.getPersonID());
@@ -180,36 +177,38 @@ public class CompetitorImporter extends AbstractManage2SailProvider implements C
nationality==null?null:nationality.getCountryCode().getThreeLetterIOCCode());
return person;
}).collect(Collectors.toList());
UUID competitorUUID;
try {
competitorUUID = UUID.fromString(team.getTeamID());
} catch (IllegalArgumentException e) {
competitorUUID = null;
if(teamNationality[0] == null && sailNumber!= null && sailNumber.length() > 3) {
// if the team nationality could not directly be inferred, try to extract it from the sail number.
try {
final String substring = sailNumber.substring(0, 3);
final IFNationCode nationalityCode = IFNationCode.fromValue(substring);
teamNationality[0] = new NationalityImpl(nationalityCode.name());
System.out.println("hit with: " + sailNumber);
}catch (Exception e) {
logger.log(Level.WARNING, "Could not infer team nationality from sail number: " + sailNumber + ". Nationality will be nulled");
}
}
UUID boatUUID;
Serializable competitorId;
try {
boatUUID = UUID.fromString(boat.getBoatID());
competitorId = UUID.fromString(team.getTeamID());
} catch (IllegalArgumentException e) {
boatUUID = null;
competitorId = idPrefix + ID_CONNECTOR_SYMBOL + team.getTeamID();
}
Serializable boatId;
try {
boatId = UUID.fromString(boat.getBoatID());
} catch (IllegalArgumentException e) {
boatId = idPrefix + ID_CONNECTOR_SYMBOL + boat.getBoatID();
}
final CompetitorDescriptor competitorDescriptor = new CompetitorDescriptor(
event == null ? null : event.getTitle(),
division == null ? null
: (division.getTitle() + (division.getGender() == null ? "" : division.getGender().name())),
race != null ? race.getRaceName() : null, /* fleetName */ null, competitorUUID,
race != null ? race.getRaceName() : null, /* fleetName */ null, competitorId,
/* name */ team.getTeamName(), /* short name */ null, /* team name */ team.getTeamName(), persons,
teamNationality[0] == null ? null : teamNationality[0].getCountryCode(), /* timeOnTimeFactor */ null,
/* timeOnDistanceAllowancePerNauticalMile */ null, boatUUID, boat.getBoatName(), boatClassName,
/* timeOnDistanceAllowancePerNauticalMile */ null, boatId, boat.getBoatName(), boatClassName,
sailNumber);
return competitorDescriptor;
}
protected CompetitorDocumentProvider getDocumentProvider() {
return documentProvider;
}
@Override
public String getHint(Locale locale) {
return stringMessages.get(locale, "CompetitorImporterHint");
}
}
@@ -1,201 +1,54 @@
package com.sap.sailing.yachtscoring.resultimport;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.xml.bind.JAXBException;
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.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.PersonDTO;
import com.sap.sailing.resultimport.ResultDocumentDescriptor;
import com.sap.sailing.resultimport.ResultDocumentProvider;
import com.sap.sailing.resultimport.ResultUrlRegistry;
import com.sap.sailing.xrr.resultimport.Parser;
import com.sap.sailing.xrr.resultimport.ParserFactory;
import com.sap.sailing.xrr.schema.Boat;
import com.sap.sailing.xrr.schema.Division;
import com.sap.sailing.xrr.schema.Event;
import com.sap.sailing.xrr.schema.Person;
import com.sap.sailing.xrr.schema.Race;
import com.sap.sailing.xrr.schema.RaceResult;
import com.sap.sailing.xrr.schema.RegattaResults;
import com.sap.sailing.xrr.schema.SeriesResult;
import com.sap.sailing.xrr.schema.Team;
import com.sap.sailing.xrr.resultimport.impl.CompetitorResolver;
import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl;
public class YachtScoringCompetitorProvider extends AbstractYachtScoringProvider implements CompetitorProvider {
private static final long serialVersionUID = 7389956404604333931L;
private static final Logger logger = Logger.getLogger(YachtScoringCompetitorProvider.class.getName());
private final static String STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages";
private final static String ID_PREFIX = "YachtScoring";
private final ResultDocumentProvider documentProvider;
private final ResourceBundleStringMessages stringMessages;
private final CompetitorResolver competitorResolver;
// Constructor for Testing
public YachtScoringCompetitorProvider(ParserFactory parserFactory, ResultUrlRegistry resultUrlRegistry, ResultDocumentProvider documentProvider) {
super(parserFactory, resultUrlRegistry);
this.documentProvider = documentProvider;
competitorResolver = new CompetitorResolver(documentProvider, parserFactory, ID_PREFIX);
stringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClass().getClassLoader());
}
public YachtScoringCompetitorProvider(ParserFactory parserFactory, ResultUrlRegistry resultUrlRegistry) {
super(parserFactory, resultUrlRegistry);
documentProvider = new YachtscoringResultDocumentProvider(this, parserFactory);
competitorResolver = new CompetitorResolver(documentProvider, parserFactory, ID_PREFIX);
stringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClass().getClassLoader());
}
@Override
public Map<String, Set<String>> getHasCompetitorsForRegattasInEvent() throws IOException {
Map<String, Set<String>> result = new HashMap<>();
for (ResultDocumentDescriptor resultDocDescr : getDocumentProvider().getResultDocumentDescriptors()) {
final String eventName = resultDocDescr.getEventName();
final String regattaName = resultDocDescr.getRegattaName();
Set<String> set = result.get(eventName);
if (set == null) {
set = new HashSet<>();
result.put(eventName, set);
}
set.add(regattaName);
}
return result;
}
@Override
public String getName() {
return NAME;
return competitorResolver.getHasCompetitorsForRegattasInEvent();
}
@Override
public Iterable<CompetitorDescriptor> getCompetitorDescriptors(String eventName, String regattaName) throws JAXBException, IOException {
final List<CompetitorDescriptor> result = new ArrayList<>();
final Map<String, CompetitorDescriptor> resultsByTeamID = new HashMap<>();
final Map<String, CompetitorDescriptor> teamsWithoutRaceAssignments = new HashMap<>(); // keys are the teamID
for (ResultDocumentDescriptor resultDocDescr : getDocumentProvider().getResultDocumentDescriptors()) {
if (resultDocDescr.getEventName().equals(eventName) &&
(regattaName == null || regattaName.equals(resultDocDescr.getRegattaName()))) {
final Parser parser = parserFactory.createParser(resultDocDescr.getInputStream(), resultDocDescr.getEventName());
try {
final RegattaResults regattaResults = parser.parse();
// If teams are found outside of a Division context then no boat class would be assigned to the
// competitor. However, if only one Division exists it can be used as default and the boat class
// can therefore be derived from it. This, however, is not clear until the document has been fully
// consumed. So we keep track of the teams found outside of Divisions, and if exactly one division
// is found we create the CompetitorDescriptors as if they were part of that Division; otherwise
// we need to come up with a default boat class instead.
final Set<Team> teamsOutsideOfDivision = new HashSet<>();
Map<Division, Event> divisions = new HashMap<>();
for (Object o : regattaResults.getPersonOrBoatOrTeam()) {
if (o instanceof Team) {
final Team team = (Team) o;
teamsOutsideOfDivision.add(team);
} else if (o instanceof Event) {
Event event = (Event) o;
for (Object eventO : event.getRaceOrDivisionOrRegattaSeriesResult()) {
if (eventO instanceof Division) {
Division division = (Division) eventO;
divisions.put(division, event);
if (regattaName == null || regattaName.equals(division.getTitle())) {
for (Object divisionO : division.getSeriesResultOrRaceResultOrTRResult()) {
String raceID = null;
Team team = null;
if (divisionO instanceof RaceResult) {
RaceResult raceResult = (RaceResult) divisionO;
raceID = raceResult.getRaceID();
team = parser.getTeam(raceResult.getTeamID());
} else if (divisionO instanceof SeriesResult) {
SeriesResult seriesResult = (SeriesResult) divisionO;
team = parser.getTeam(seriesResult.getTeamID());
}
if (team != null) {
final CompetitorDescriptor competitorDescriptor = createCompetitorDescriptor(
team, parser, event, division, raceID);
resultsByTeamID.put(team.getTeamID(), competitorDescriptor);
result.add(competitorDescriptor);
}
}
}
}
}
}
}
for (final Team teamOutsideOfDivision : teamsOutsideOfDivision) {
if (divisions.size() == 1) { // exactly one Division; use as default for teams outside of division that were not assigned to a division later
if (!resultsByTeamID.containsKey(teamOutsideOfDivision.getTeamID())) {
final CompetitorDescriptor competitorDescriptor = createCompetitorDescriptor(
teamOutsideOfDivision, parser, divisions.values().iterator().next(), divisions.keySet().iterator().next(), /* raceID */ null);
resultsByTeamID.put(teamOutsideOfDivision.getTeamID(), competitorDescriptor);
result.add(competitorDescriptor);
}
} else {
teamsWithoutRaceAssignments.put(teamOutsideOfDivision.getTeamID(),
createCompetitorDescriptor(teamOutsideOfDivision, parser, /* event */ null, /* division */ null, /* raceID */ null));
}
}
} catch (JAXBException e) {
logger.log(Level.WARNING, "Exception trying to read competitors for event "+resultDocDescr.getEventName()+
", regatta "+resultDocDescr.getRegattaName()+" from document "+resultDocDescr.getDocumentName(), e);
}
}
}
for (final Map.Entry<String, CompetitorDescriptor> tid : teamsWithoutRaceAssignments.entrySet()) {
if (!resultsByTeamID.containsKey(tid.getKey())) {
result.add(tid.getValue());
}
}
return result;
return competitorResolver.getCompetitorDescriptors(eventName, regattaName);
}
private CompetitorDescriptor createCompetitorDescriptor(Team team, final Parser parser, Event event,
Division division, String raceID) {
final Boat boat = parser.getBoat(team.getBoatID());
final String sailNumber = boat.getSailNumber();
final Race race = parser.getRace(raceID);
final Nationality[] teamNationality = new Nationality[] {
// use that of team; if not defined for team, use first nationality of a team member that has one defined
team.getNOC() == null ? null : new NationalityImpl(team.getNOC().name())
};
String boatClassName = null;
if(division != null) {
boatClassName = parser.getBoatClassName(division);
}
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;
if (xrrPerson.getNOC() == null) {
nationality = null;
} else {
nationality = new NationalityImpl(xrrPerson.getNOC().name());
if (teamNationality[0] == null) {
teamNationality[0] = nationality;
}
}
PersonDTO person = new PersonDTO(
name, /* dateOfBirth */ null, /* description */ xrrPerson.getGender()==null?null:xrrPerson.getGender().name(),
nationality==null?null: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())),
race != null ? race.getRaceName() : null, /* fleetName */ null, team.getTeamID(), /* name */ team.getTeamName(),
/* short name */ null, /* team name */ team.getTeamName(), persons,
teamNationality[0] == null ? null : teamNationality[0].getCountryCode(), /* timeOnTimeFactor */ null,
/* timeOnDistanceAllowancePerNauticalMile */ null, boat.getBoatID(), boat.getBoatName(), boatClassName, sailNumber);
return competitorDescriptor;
}
protected ResultDocumentProvider getDocumentProvider() {
return documentProvider;