mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 22:43:57 +00:00
Merge remote-tracking branch 'origin/bug5201' into bug5201
This commit is contained in:
commit
a6d369e684
6 files changed
+118
-208
No files matched your search
+4
-4
@@ -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
|
||||
|
||||
+3
-1
@@ -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();
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
+56
@@ -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");
|
||||
}
|
||||
}
|
||||
+47
-48
@@ -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");
|
||||
}
|
||||
}
|
||||
+7
-154
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user