Add email field to Competitor

This commit is contained in:
Jan Broß committed 2015-02-04 22:36:48 +01:00
1 parent 45936be60d
commit 0e4775d51f
47 files changed
+155 -76

No files matched your search

@@ -22,6 +22,8 @@ public interface CompetitorDTO extends Serializable, MappableToDevice {
String getName(); String getName();
Color getColor(); Color getColor();
String getEmail();
/** /**
* A regular instance will simply return this object. A compacted version may compute the result by looking it up * A regular instance will simply return this object. A compacted version may compute the result by looking it up
@@ -19,16 +19,18 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
private String twoLetterIsoCountryCode; private String twoLetterIsoCountryCode;
private String threeLetterIocCountryCode; private String threeLetterIocCountryCode;
private Color color; private Color color;
private String email;
private String sailID; private String sailID;
private String idAsString; private String idAsString;
private BoatClassDTO boatClass; private BoatClassDTO boatClass;
public CompetitorDTOImpl() {} public CompetitorDTOImpl() {}
public CompetitorDTOImpl(String name, Color color, String twoLetterIsoCountryCode, String threeLetterIocCountryCode, public CompetitorDTOImpl(String name, Color color, String email, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
String countryName, String sailID, String idAsString, BoatClassDTO boatClass) { String countryName, String sailID, String idAsString, BoatClassDTO boatClass) {
super(name); super(name);
this.color = color; this.color = color;
this.email = email;
this.twoLetterIsoCountryCode = twoLetterIsoCountryCode; this.twoLetterIsoCountryCode = twoLetterIsoCountryCode;
this.threeLetterIocCountryCode = threeLetterIocCountryCode; this.threeLetterIocCountryCode = threeLetterIocCountryCode;
this.countryName = countryName; this.countryName = countryName;
@@ -45,6 +47,7 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
result = prime * result + ((idAsString == null) ? 0 : idAsString.hashCode()); result = prime * result + ((idAsString == null) ? 0 : idAsString.hashCode());
result = prime * result + ((sailID == null) ? 0 : sailID.hashCode()); result = prime * result + ((sailID == null) ? 0 : sailID.hashCode());
result = prime * result + ((color == null) ? 0 : color.hashCode()); result = prime * result + ((color == null) ? 0 : color.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((threeLetterIocCountryCode == null) ? 0 : threeLetterIocCountryCode.hashCode()); result = prime * result + ((threeLetterIocCountryCode == null) ? 0 : threeLetterIocCountryCode.hashCode());
return result; return result;
} }
@@ -83,6 +86,11 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
return false; return false;
} else if (!color.equals(other.color)) } else if (!color.equals(other.color))
return false; return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
return true; return true;
} }
@@ -124,4 +132,12 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
public Color getColor() { public Color getColor() {
return color; return color;
} }
public String getEmail() {
return email;
}
public String email(){
return email;
}
} }
@@ -92,6 +92,12 @@ public class PreviousCompetitorDTOImpl implements CompetitorDTO {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+ throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization"); " need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
} }
@Override
public String getEmail() {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
@Override @Override
public CompetitorDTO getCompetitorFromPrevious(LeaderboardDTO previousVersion) { public CompetitorDTO getCompetitorFromPrevious(LeaderboardDTO previousVersion) {
@@ -40,7 +40,7 @@ public class AbstractGPSFixStoreTest {
protected final DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); protected final DeviceIdentifier device = new SmartphoneImeiIdentifier("a");
protected RaceLog raceLog; protected RaceLog raceLog;
protected GPSFixStore store; protected GPSFixStore store;
protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null); protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null);
protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark"); protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark");
private final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0); private final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0);
@@ -168,7 +168,7 @@ public class CreateAndTrackWithRaceLogTest {
assertFalse(raceLog.isEmpty()); assertFalse(raceLog.isEmpty());
// add a mapping and one fix in, one out of mapping // add a mapping and one fix in, one out of mapping
Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null); Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null);
DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1"); DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1");
raceLog.add(factory.createDeviceCompetitorMappingEvent(t(), author, dev1, comp1, 0, t(0), t(10))); raceLog.add(factory.createDeviceCompetitorMappingEvent(t(), author, dev1, comp1, 0, t(0), t(10)));
addFixes0(dev1); addFixes0(dev1);
@@ -202,7 +202,7 @@ public class CreateAndTrackWithRaceLogTest {
adapter.denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, "race"); adapter.denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, "race");
// add a mapping and one fix in, one out of mapping // add a mapping and one fix in, one out of mapping
Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null); Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null);
DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1"); DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1");
regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), author, t(), UUID.randomUUID(), comp1, dev1, regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), author, t(), UUID.randomUUID(), comp1, dev1,
t(0), t(10))); t(0), t(10)));
@@ -49,7 +49,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
@Test @Test
public void areFixesStoredInDb() throws TransformationException, NoCorrespondingServiceRegisteredException, public void areFixesStoredInDb() throws TransformationException, NoCorrespondingServiceRegisteredException,
InterruptedException { InterruptedException {
Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null); Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null, null);
Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2"); Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2");
DeviceIdentifier device2 = new SmartphoneImeiIdentifier("imei2"); DeviceIdentifier device2 = new SmartphoneImeiIdentifier("imei2");
DeviceIdentifier device3 = new SmartphoneImeiIdentifier("imei3"); DeviceIdentifier device3 = new SmartphoneImeiIdentifier("imei3");
@@ -15,6 +15,10 @@ public interface Competitor extends Named, WithID, IsManagedByCache<SharedDomain
Color getColor(); Color getColor();
String getEmail();
boolean hasEmail();
/** /**
* Adds a listener to this competitor. The listener is also added to the boat and the team for changes. * Adds a listener to this competitor. The listener is also added to the boat and the team for changes.
* Adding a listener that is already part of this competitor's listeners set remains without effect. * Adding a listener that is already part of this competitor's listeners set remains without effect.
@@ -26,5 +26,5 @@ public interface CompetitorFactory {
*/ */
boolean isCompetitorToUpdateDuringGetOrCreate(Competitor result); boolean isCompetitorToUpdateDuringGetOrCreate(Competitor result);
Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat); Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat);
} }
@@ -63,7 +63,7 @@ public interface CompetitorStore extends CompetitorFactory {
* *
* If no competitor with the ID requested is found, the call is a no-op, doing nothing, not even throwing an exception. * If no competitor with the ID requested is found, the call is a no-op, doing nothing, not even throwing an exception.
*/ */
Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newSailId, Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri); Nationality newNationality, URI newTeamImageUri);
CompetitorDTO convertToCompetitorDTO(Competitor c); CompetitorDTO convertToCompetitorDTO(Competitor c);
@@ -20,6 +20,7 @@ public class CompetitorImpl implements DynamicCompetitor {
private String name; private String name;
private Color color; private Color color;
private transient Set<CompetitorChangeListener> listeners; private transient Set<CompetitorChangeListener> listeners;
private String email;
public CompetitorImpl(Serializable id, String name, Color color, DynamicTeam team, DynamicBoat boat) { public CompetitorImpl(Serializable id, String name, Color color, DynamicTeam team, DynamicBoat boat) {
this.id = id; this.id = id;
@@ -73,7 +74,7 @@ public class CompetitorImpl implements DynamicCompetitor {
@Override @Override
public Competitor resolve(SharedDomainFactory domainFactory) { public Competitor resolve(SharedDomainFactory domainFactory) {
Competitor result = domainFactory.getOrCreateCompetitor(getId(), getName(), getColor(), getTeam(), getBoat()); Competitor result = domainFactory.getOrCreateCompetitor(getId(), getName(), getColor(), getEmail(), getTeam(), getBoat());
return result; return result;
} }
@@ -114,4 +115,17 @@ public class CompetitorImpl implements DynamicCompetitor {
return new HashSet<CompetitorChangeListener>(listeners); return new HashSet<CompetitorChangeListener>(listeners);
} }
} }
public String getEmail() {
return email;
}
public void setEmail(String eMail) {
//TODO: add E-Mail verification from SecurityServiceImpl
this.email = eMail;
}
public boolean hasEmail(){
return !email.isEmpty();
}
} }
@@ -9,4 +9,5 @@ public interface DynamicCompetitor extends Competitor, Renamable {
DynamicTeam getTeam(); DynamicTeam getTeam();
void setColor(Color displayColor); void setColor(Color displayColor);
void setEmail(String email);
} }
@@ -332,11 +332,11 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
} }
@Override @Override
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) { public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
if (logger.isLoggable(Level.FINEST)) { if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, "getting or creating competitor "+name+" with ID "+competitorId+" in domain factory "+this); logger.log(Level.FINEST, "getting or creating competitor "+name+" with ID "+competitorId+" in domain factory "+this);
} }
return getCompetitorStore().getOrCreateCompetitor(competitorId, name, displayColor, team, boat); return getCompetitorStore().getOrCreateCompetitor(competitorId, name, displayColor, email, team, boat);
} }
@Override @Override
@@ -93,7 +93,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
} }
@Override @Override
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) { public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
Competitor result = getExistingCompetitorById(competitorId); // avoid synchronization for successful read access Competitor result = getExistingCompetitorById(competitorId); // avoid synchronization for successful read access
if (result == null) { if (result == null) {
LockUtil.lockForWrite(lock); LockUtil.lockForWrite(lock);
@@ -106,7 +106,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
LockUtil.unlockAfterWrite(lock); LockUtil.unlockAfterWrite(lock);
} }
} else if (isCompetitorToUpdateDuringGetOrCreate(result)) { } else if (isCompetitorToUpdateDuringGetOrCreate(result)) {
updateCompetitor(result.getId().toString(), name, displayColor, boat.getSailID(), team.getNationality(), updateCompetitor(result.getId().toString(), name, displayColor, email, boat.getSailID(), team.getNationality(),
team.getImage()); team.getImage());
competitorNoLongerToUpdateDuringGetOrCreate(result); competitorNoLongerToUpdateDuringGetOrCreate(result);
} }
@@ -191,7 +191,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
} }
@Override @Override
public Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newSailId, public Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri) { Nationality newNationality, URI newTeamImageUri) {
DynamicCompetitor competitor = (DynamicCompetitor) getExistingCompetitorByIdAsString(idAsString); DynamicCompetitor competitor = (DynamicCompetitor) getExistingCompetitorByIdAsString(idAsString);
if (competitor != null) { if (competitor != null) {
@@ -199,6 +199,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
try { try {
competitor.setName(newName); competitor.setName(newName);
competitor.setColor(newDisplayColor); competitor.setColor(newDisplayColor);
competitor.setEmail(newEmail);
competitor.getBoat().setSailId(newSailId); competitor.getBoat().setSailId(newSailId);
competitor.getTeam().setNationality(newNationality); competitor.getTeam().setNationality(newNationality);
competitor.getTeam().setImage(newTeamImageUri); competitor.getTeam().setImage(newTeamImageUri);
@@ -229,7 +230,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
if (competitorDTO == null) { if (competitorDTO == null) {
final Nationality nationality = c.getTeam().getNationality(); final Nationality nationality = c.getTeam().getNationality();
CountryCode countryCode = nationality == null ? null : nationality.getCountryCode(); CountryCode countryCode = nationality == null ? null : nationality.getCountryCode();
competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), countryCode == null ? "" competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), c.getEmail(), countryCode == null ? ""
: countryCode.getTwoLetterISOCode(), countryCode == null ? "" : countryCode.getTwoLetterISOCode(), countryCode == null ? ""
: countryCode.getThreeLetterIOCCode(), countryCode == null ? "" : countryCode.getName(), c : countryCode.getThreeLetterIOCCode(), countryCode == null ? "" : countryCode.getName(), c
.getBoat().getSailID(), c.getId().toString(), new BoatClassDTO(c.getBoat().getBoatClass() .getBoat().getSailID(), c.getId().toString(), new BoatClassDTO(c.getBoat().getBoatClass()
@@ -124,7 +124,7 @@ public class DomainFactoryImpl implements DomainFactory {
teamMembers.add(person); teamMembers.add(person);
} }
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null); DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = competitorStore.getOrCreateCompetitor(competitor.getID(), competitor.getName(), null /*displayColor*/, team, boat); result = competitorStore.getOrCreateCompetitor(competitor.getID(), competitor.getName(), null /*displayColor*/, null /*email*/, team, boat);
} }
return result; return result;
} }
@@ -140,7 +140,7 @@ public class DomainFactoryImpl implements DomainFactory {
} }
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null); DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = baseDomainFactory.getCompetitorStore().getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceId, boatClass), result = baseDomainFactory.getCompetitorStore().getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceId, boatClass),
competitor.getName(), null /*displayColor*/, team, boat); competitor.getName(), null /*displayColor*/, null /*email*/, team, boat);
return result; return result;
} }
@@ -232,7 +232,7 @@ public class LeaderboardDTODiffingTest {
@Test @Test
public void testCompetitorListChange() { public void testCompetitorListChange() {
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987", CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05)); new BoatClassDTO("505", 5.05));
newVersion.competitors.add(13, somebodyNew); // insert a competitor; this should mess up all others' indexes; check if this works newVersion.competitors.add(13, somebodyNew); // insert a competitor; this should mess up all others' indexes; check if this works
CompetitorDTO wolfgang = getPreviousCompetitorByName("HUNGER +JESS"); CompetitorDTO wolfgang = getPreviousCompetitorByName("HUNGER +JESS");
@@ -252,7 +252,7 @@ public class LeaderboardDTODiffingTest {
Util.addAll(newVersion.getSuppressedCompetitors(), newSuppressedCompetitors); Util.addAll(newVersion.getSuppressedCompetitors(), newSuppressedCompetitors);
newVersion.setSuppressedCompetitors(newSuppressedCompetitors); newVersion.setSuppressedCompetitors(newSuppressedCompetitors);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987", CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05)); new BoatClassDTO("505", 5.05));
newVersion.setSuppressed(newVersion.competitors.get(13), true); // suppress an existing competitor; compaction should reduce this to a single number only newVersion.setSuppressed(newVersion.competitors.get(13), true); // suppress an existing competitor; compaction should reduce this to a single number only
newVersion.setSuppressed(somebodyNew, true); // check that mixed mode with existing and new competitors works as well newVersion.setSuppressed(somebodyNew, true); // check that mixed mode with existing and new competitors works as well
@@ -274,7 +274,7 @@ public class LeaderboardDTODiffingTest {
@Test @Test
public void testDisplayNameChange() { public void testDisplayNameChange() {
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987", CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05)); new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew); newVersion.competitors.add(somebodyNew);
newVersion.competitorDisplayNames = new HashMap<CompetitorDTO, String>(newVersion.competitorDisplayNames); newVersion.competitorDisplayNames = new HashMap<CompetitorDTO, String>(newVersion.competitorDisplayNames);
@@ -303,7 +303,7 @@ public class LeaderboardDTODiffingTest {
List<CompetitorDTO> newOrdering = new ArrayList<CompetitorDTO>(newVersion.getCompetitorsFromBestToWorst(r9)); List<CompetitorDTO> newOrdering = new ArrayList<CompetitorDTO>(newVersion.getCompetitorsFromBestToWorst(r9));
newVersion.setCompetitorsFromBestToWorst(r9, newOrdering); newVersion.setCompetitorsFromBestToWorst(r9, newOrdering);
newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version newVersion.competitors = new ArrayList<CompetitorDTO>(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987", CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05)); new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew); newVersion.competitors.add(somebodyNew);
newOrdering.add(somebodyNew); newOrdering.add(somebodyNew);
@@ -24,7 +24,7 @@ public abstract class AbstractLeaderboardTest {
} }
public static Competitor createCompetitor(String competitorName, CompetitorFactory competitorFactory) { public static Competitor createCompetitor(String competitorName, CompetitorFactory competitorFactory) {
return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton( return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, "someone@nobody.de", new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"), new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)), /* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
@@ -259,7 +259,7 @@ public class DomainFactoryImpl implements DomainFactory {
} }
DynamicTeam team = getOrCreateTeam(name, nationality, competitorId); DynamicTeam team = getOrCreateTeam(name, nationality, competitorId);
DynamicBoat boat = new BoatImpl(shortName, boatClass, shortName); DynamicBoat boat = new BoatImpl(shortName, boatClass, shortName);
result = competitorStore.getOrCreateCompetitor(competitorId, name, null /*displayColor*/, team, boat); result = competitorStore.getOrCreateCompetitor(competitorId, name, null /*displayColor*/, null /*email*/, team, boat);
} }
return result; return result;
} }
@@ -10,7 +10,7 @@ public interface DynamicCompetitorStore extends CompetitorStore {
DynamicCompetitor getExistingCompetitorById(Serializable competitorId); DynamicCompetitor getExistingCompetitorById(Serializable competitorId);
@Override @Override
DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat); DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat);
@Override @Override
Iterable<? extends DynamicCompetitor> getCompetitors(); Iterable<? extends DynamicCompetitor> getCompetitors();
@@ -72,6 +72,16 @@ public class DummyMarkPassingWithTimePointOnly implements MarkPassing {
@Override @Override
public void removeCompetitorChangeListener(CompetitorChangeListener listener) { public void removeCompetitorChangeListener(CompetitorChangeListener listener) {
} }
@Override
public String getEmail() {
return null;
}
@Override
public boolean hasEmail() {
return false;
}
}; };
} }
} }
@@ -38,6 +38,7 @@ public class CompetitorEditDialog extends DataEntryDialog<CompetitorDTO> {
private final TextBox displayColorTextBox; private final TextBox displayColorTextBox;
private final ListBox threeLetterIocCountryCode; private final ListBox threeLetterIocCountryCode;
private final TextBox sailId; private final TextBox sailId;
private final TextBox email;
private final StringMessages stringMessages; private final StringMessages stringMessages;
public CompetitorEditDialog(final StringMessages stringMessages, CompetitorDTO competitorToEdit, public CompetitorEditDialog(final StringMessages stringMessages, CompetitorDTO competitorToEdit,
@@ -56,6 +57,9 @@ public class CompetitorEditDialog extends DataEntryDialog<CompetitorDTO> {
if (displayColor instanceof InvalidColor) { if (displayColor instanceof InvalidColor) {
result = displayColor.getAsHtml(); result = displayColor.getAsHtml();
} }
} else if (valueToValidate.getEmail() == null) {
//TODO: Proper Email-Validation
result = stringMessages.pleaseEnterAnEmail();
} else if (valueToValidate.getBoatClass().getName() == null || valueToValidate.getBoatClass().getName().isEmpty()) { } else if (valueToValidate.getBoatClass().getName() == null || valueToValidate.getBoatClass().getName().isEmpty()) {
result = stringMessages.pleaseEnterABoatClass(); result = stringMessages.pleaseEnterABoatClass();
} }
@@ -89,6 +93,7 @@ public class CompetitorEditDialog extends DataEntryDialog<CompetitorDTO> {
} }
this.name = createTextBox(competitorToEdit.getName()); this.name = createTextBox(competitorToEdit.getName());
this.email = createTextBox(competitorToEdit.getEmail());
this.displayColorTextBox = createTextBox(competitorToEdit.getColor() == null ? "" : competitorToEdit.getColor().getAsHtml()); this.displayColorTextBox = createTextBox(competitorToEdit.getColor() == null ? "" : competitorToEdit.getColor().getAsHtml());
this.threeLetterIocCountryCode = createListBox(/* isMultipleSelect */ false); this.threeLetterIocCountryCode = createListBox(/* isMultipleSelect */ false);
CountryCodeFactory ccf = CountryCodeFactory.INSTANCE; CountryCodeFactory ccf = CountryCodeFactory.INSTANCE;
@@ -170,7 +175,7 @@ public class CompetitorEditDialog extends DataEntryDialog<CompetitorDTO> {
} }
} }
BoatClassDTO boatClass = new BoatClassDTO(boatClassName.getValue(boatClassName.getSelectedIndex()), 0); BoatClassDTO boatClass = new BoatClassDTO(boatClassName.getValue(boatClassName.getSelectedIndex()), 0);
CompetitorDTO result = new CompetitorDTOImpl(name.getText(), color, CompetitorDTO result = new CompetitorDTOImpl(name.getText(), color, email.getText(),
/* twoLetterIsoCountryCode */ null, /* twoLetterIsoCountryCode */ null,
threeLetterIocCountryCode.getValue(threeLetterIocCountryCode.getSelectedIndex()), threeLetterIocCountryCode.getValue(threeLetterIocCountryCode.getSelectedIndex()),
/* countryName */ null, sailId.getText(), competitorToEdit.getIdAsString(), /* countryName */ null, sailId.getText(), competitorToEdit.getIdAsString(),
@@ -189,8 +194,10 @@ public class CompetitorEditDialog extends DataEntryDialog<CompetitorDTO> {
result.setWidget(2, 1, threeLetterIocCountryCode); result.setWidget(2, 1, threeLetterIocCountryCode);
result.setWidget(3, 0, new Label(stringMessages.color())); result.setWidget(3, 0, new Label(stringMessages.color()));
result.setWidget(3, 1, displayColorTextBox); result.setWidget(3, 1, displayColorTextBox);
result.setWidget(4, 0, new Label(stringMessages.boatClass())); result.setWidget(4, 0, new Label(stringMessages.email()));
result.setWidget(4, 1, boatClassName); result.setWidget(4, 1, email);
result.setWidget(5, 0, new Label(stringMessages.boatClass()));
result.setWidget(5, 1, boatClassName);
return result; return result;
} }
@@ -1137,4 +1137,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
String error(); String error();
String setAsActive(); String setAsActive();
String fileStorage(); String fileStorage();
String email();
String pleaseEnterAnEmail();
} }
@@ -1119,4 +1119,6 @@ errorTryingToRegisterRacesForTracking=Error trying to register races {0} for tra
errorDeterminingPolarAvailability=Error determining availability of polar / VPP data for race {0}: {1} errorDeterminingPolarAvailability=Error determining availability of polar / VPP data for race {0}: {1}
error=Error error=Error
setAsActive=Set as active setAsActive=Set as active
fileStorage=File Storage fileStorage=File Storage
email=E-Mail
pleaseEnterAnEmail=Please enter an E-Mail.
@@ -1108,4 +1108,6 @@ errorTryingToRegisterRacesForTracking=Fehler beim Versuch, die Wettfahrten {0} z
errorDeterminingPolarAvailability=Fehler bei der Verfügbarkeitsprüfung für Polardaten für Wettfahrt {0}: {1} errorDeterminingPolarAvailability=Fehler bei der Verfügbarkeitsprüfung für Polardaten für Wettfahrt {0}: {1}
error=Fehler error=Fehler
setAsActive=Aktiv setzen setAsActive=Aktiv setzen
fileStorage=Datei Speicherung fileStorage=Datei Speicherung
email=E-Mail
pleaseEnterAnEmail=Bitte geben Sie eine E-Mail ein.
@@ -1056,4 +1056,6 @@ errorTryingToRegisterRacesForTracking=Error trying to register races {0} for tra
errorDeterminingPolarAvailability=Error determining availability of polar / VPP data for race {0}: {1} errorDeterminingPolarAvailability=Error determining availability of polar / VPP data for race {0}: {1}
error=Error error=Error
setAsActive=Set as active setAsActive=Set as active
fileStorage=File Storage fileStorage=File Storage
email=эмаль
pleaseEnterAnEmail=Пожалуйста, введите эмаль
@@ -4536,12 +4536,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
DynamicBoat boat = new BoatImpl(competitor.getName() + " boat", boatClass, competitor.getSailID()); DynamicBoat boat = new BoatImpl(competitor.getName() + " boat", boatClass, competitor.getSailID());
result = getBaseDomainFactory().convertToCompetitorDTO( result = getBaseDomainFactory().convertToCompetitorDTO(
getBaseDomainFactory().getOrCreateCompetitor(UUID.randomUUID(), competitor.getName(), getBaseDomainFactory().getOrCreateCompetitor(UUID.randomUUID(), competitor.getName(),
competitor.getColor(), team, boat)); competitor.getColor(), competitor.getEmail(), team, boat));
} else { } else {
result = getBaseDomainFactory().convertToCompetitorDTO( result = getBaseDomainFactory().convertToCompetitorDTO(
getService().apply( getService().apply(
new UpdateCompetitor(competitor.getIdAsString(), competitor.getName(), competitor new UpdateCompetitor(competitor.getIdAsString(), competitor.getName(), competitor
.getColor(), competitor.getSailID(), nationality, existingCompetitor.getTeam().getImage()))); .getColor(), competitor.getEmail(), competitor.getSailID(), nationality, existingCompetitor.getTeam().getImage())));
} }
return result; return result;
} }
@@ -174,7 +174,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest {
@Test @Test
public void testStoreAndLoadDeviceCompetitorMappingEvent() { public void testStoreAndLoadDeviceCompetitorMappingEvent() {
DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); DeviceIdentifier device = new SmartphoneImeiIdentifier("a");
Competitor mappedTo = DomainFactory.INSTANCE.getOrCreateCompetitor("abc", "abc", null, null, null); Competitor mappedTo = DomainFactory.INSTANCE.getOrCreateCompetitor("abc", "abc", null, null, null, null);
TimePoint from = new MillisecondsTimePoint(20); TimePoint from = new MillisecondsTimePoint(20);
TimePoint to = new MillisecondsTimePoint(30); TimePoint to = new MillisecondsTimePoint(30);
RaceLogDeviceCompetitorMappingEvent expectedEvent = eventFactory.createDeviceCompetitorMappingEvent( RaceLogDeviceCompetitorMappingEvent expectedEvent = eventFactory.createDeviceCompetitorMappingEvent(
@@ -251,7 +251,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest {
public void testStoreAndLoadRegisterCompetitorEvent() { public void testStoreAndLoadRegisterCompetitorEvent() {
RaceLogRegisterCompetitorEvent expectedEvent = eventFactory.createRegisterCompetitorEvent( RaceLogRegisterCompetitorEvent expectedEvent = eventFactory.createRegisterCompetitorEvent(
expectedEventTime, author, expectedEventTime, expectedId, expectedPassId, expectedEventTime, author, expectedEventTime, expectedId, expectedPassId,
DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null)); DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null));
DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent); DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent);
RaceLogRegisterCompetitorEvent actualEvent = loadEvent(dbObject); RaceLogRegisterCompetitorEvent actualEvent = loadEvent(dbObject);
@@ -58,7 +58,7 @@ public class StoreGPSFixTrackTest extends AbstractMongoDBTest {
public void testStoreAndLoadFixes() throws TransformationException, NoCorrespondingServiceRegisteredException { public void testStoreAndLoadFixes() throws TransformationException, NoCorrespondingServiceRegisteredException {
TypeBasedServiceFinderFactory factory = new MockSmartphoneImeiServiceFinderFactory(); TypeBasedServiceFinderFactory factory = new MockSmartphoneImeiServiceFinderFactory();
AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0); AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0);
Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null); Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null);
Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark"); Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark");
MongoObjectFactory mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService(), factory); MongoObjectFactory mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService(), factory);
DomainObjectFactory domainObjectFactory = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE, factory); DomainObjectFactory domainObjectFactory = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE, factory);
@@ -350,7 +350,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
final DomainFactory domainFactory = new DomainFactoryImpl(); final DomainFactory domainFactory = new DomainFactoryImpl();
// create the competitor through the competitor store/factory here so that the DomainObjectFactory finds it and // create the competitor through the competitor store/factory here so that the DomainObjectFactory finds it and
// resolves the score corrections appropriate // resolves the score corrections appropriate
Competitor competitor = domainFactory.getOrCreateCompetitor(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, new TeamImpl("STG", Collections.singleton( Competitor competitor = domainFactory.getOrCreateCompetitor(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, "someone@nowhere.de", new TeamImpl("STG", Collections.singleton(
new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"), new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"), /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
@@ -273,7 +273,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD
@Test @Test
public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningConfirmedEvent() { public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningConfirmedEvent() {
Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null); Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl(); CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
@@ -342,7 +342,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD
@Test @Test
public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningListChangeEvent() { public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningListChangeEvent() {
Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null); Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl(); CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
@@ -187,7 +187,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin
@Test @Test
public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningListChangeEvent() { public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningListChangeEvent() {
Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null); Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl(); CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
@@ -217,7 +217,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin
@Test @Test
public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningConfirmedEvent() { public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningConfirmedEvent() {
Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null); Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl(); CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE)); storedPositioningList.add(new com.sap.sse.common.Util.Triple<Serializable, String, MaxPointsReason>(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
@@ -51,6 +51,8 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
} }
String name = (String) object.get(CompetitorJsonSerializer.FIELD_NAME); String name = (String) object.get(CompetitorJsonSerializer.FIELD_NAME);
String displayColorAsString = (String) object.get(CompetitorJsonSerializer.FIELD_DISPLAY_COLOR); String displayColorAsString = (String) object.get(CompetitorJsonSerializer.FIELD_DISPLAY_COLOR);
String email = (String) object.get(CompetitorJsonSerializer.FIELD_EMAIL);
final Color displayColor; final Color displayColor;
if (displayColorAsString == null || displayColorAsString.isEmpty()) { if (displayColorAsString == null || displayColorAsString.isEmpty()) {
displayColor = null; displayColor = null;
@@ -67,7 +69,8 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object, boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonSerializer.FIELD_BOAT)); CompetitorJsonSerializer.FIELD_BOAT));
} }
Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, displayColor, team, boat);
Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, displayColor, email, team, boat);
return competitor; return competitor;
} catch (Exception e) { } catch (Exception e) {
throw new JsonDeserializationException(e); throw new JsonDeserializationException(e);
@@ -30,6 +30,7 @@ public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
public static final String FIELD_TEAM = "team"; public static final String FIELD_TEAM = "team";
public static final String FIELD_BOAT = "boat"; public static final String FIELD_BOAT = "boat";
public static final String FIELD_DISPLAY_COLOR = "displayColor"; public static final String FIELD_DISPLAY_COLOR = "displayColor";
public static final String FIELD_EMAIL = "email";
private final JsonSerializer<Team> teamJsonSerializer; private final JsonSerializer<Team> teamJsonSerializer;
private final JsonSerializer<Boat> boatJsonSerializer; private final JsonSerializer<Boat> boatJsonSerializer;
@@ -66,6 +67,7 @@ public class CompetitorJsonSerializer implements JsonSerializer<Competitor> {
} }
result.put(FIELD_NAME, competitor.getName()); result.put(FIELD_NAME, competitor.getName());
result.put(FIELD_DISPLAY_COLOR, competitor.getColor() == null ? null : competitor.getColor().getAsHtml()); result.put(FIELD_DISPLAY_COLOR, competitor.getColor() == null ? null : competitor.getColor().getAsHtml());
result.put(FIELD_EMAIL, competitor.getEmail());
result.put(FIELD_SAILID, competitor.getBoat() == null ? "" : competitor.getBoat().getSailID()); result.put(FIELD_SAILID, competitor.getBoat() == null ? "" : competitor.getBoat().getSailID());
final Nationality nationality = competitor.getTeam() == null ? null : competitor.getTeam().getNationality(); final Nationality nationality = competitor.getTeam() == null ? null : competitor.getTeam().getNationality();
result.put(FIELD_NATIONALITY, nationality == null ? "" : nationality.getThreeLetterIOCAcronym()); result.put(FIELD_NATIONALITY, nationality == null ? "" : nationality.getThreeLetterIOCAcronym());
@@ -237,7 +237,7 @@ public class RaceLogEventSerializerTest {
public void testRegisterCompetitorEventSerializer() { public void testRegisterCompetitorEventSerializer() {
// we use the real event type here because we do not want to re-implement the dispatching. // we use the real event type here because we do not want to re-implement the dispatching.
RaceLogEvent event = factory.createRegisterCompetitorEvent(null, author, 0, RaceLogEvent event = factory.createRegisterCompetitorEvent(null, author, 0,
DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null)); DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null));
serializer.serialize(event); serializer.serialize(event);
verify(registerCompetitorEventSerializer).serialize(event); verify(registerCompetitorEventSerializer).serialize(event);
} }
@@ -34,7 +34,7 @@ public class CompetitorsResourceTest extends AbstractJaxRsApiTest {
super.setUp(); super.setUp();
DynamicTeam team = new TeamImpl(null, Collections.singleton(new PersonImpl(null, new NationalityImpl(nationality), null, null)), null); DynamicTeam team = new TeamImpl(null, Collections.singleton(new PersonImpl(null, new NationalityImpl(nationality), null, null)), null);
DynamicBoat boat = new BoatImpl(null, new BoatClassImpl(boatClassName, false), sailID); DynamicBoat boat = new BoatImpl(null, new BoatClassImpl(boatClassName, false), sailID);
racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, team, boat); racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, null, team, boat);
} }
@Test @Test
@@ -44,8 +44,8 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
public void setUp() { public void setUp() {
super.setUp(); super.setUp();
Competitor c = createCompetitors(1).get(0); Competitor c = createCompetitors(1).get(0);
competitor = racingEventService.getBaseDomainFactory().getOrCreateCompetitor(c.getId(), c.getName(), c.getColor(), competitor = racingEventService.getBaseDomainFactory().getOrCreateCompetitor(c.getId(), c.getName(),
(DynamicTeam) c.getTeam(), (DynamicBoat) c.getBoat()); c.getColor(), c.getEmail(), (DynamicTeam) c.getTeam(), (DynamicBoat) c.getBoat());
Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), MillisecondsTimePoint.now(), Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), MillisecondsTimePoint.now(),
MillisecondsTimePoint.now(), Collections.singleton(new SeriesImpl("series", false, Collections MillisecondsTimePoint.now(), Collections.singleton(new SeriesImpl("series", false, Collections
@@ -62,7 +62,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
LeaderboardsResource resource = spyResource(new LeaderboardsResource()); LeaderboardsResource resource = spyResource(new LeaderboardsResource());
UUID deviceUuid = UUID.randomUUID(); UUID deviceUuid = UUID.randomUUID();
//checkin // checkin
long fromMillis = 500; long fromMillis = 500;
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitor.getId().toString()); json.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitor.getId().toString());
@@ -82,22 +82,24 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
DeviceMapping<Competitor> mappingForC = mappingsForC.get(0); DeviceMapping<Competitor> mappingForC = mappingsForC.get(0);
assertThat("that mapping is for the correct device", assertThat("that mapping is for the correct device",
((SmartphoneUUIDIdentifier) mappingForC.getDevice()).getUUID(), equalTo(deviceUuid)); ((SmartphoneUUIDIdentifier) mappingForC.getDevice()).getUUID(), equalTo(deviceUuid));
assertThat("that mapping starts at the correct timepoint", mappingForC.getTimeRange().from().asMillis(), equalTo(fromMillis)); assertThat("that mapping starts at the correct timepoint", mappingForC.getTimeRange().from().asMillis(),
equalTo(fromMillis));
assertThat("that mapping is open-ended", mappingForC.getTimeRange().hasOpenEnd(), equalTo(true)); assertThat("that mapping is open-ended", mappingForC.getTimeRange().hasOpenEnd(), equalTo(true));
//checkout // checkout
long toMillis = 1000; long toMillis = 1000;
json = new JSONObject(); json = new JSONObject();
json.put(DeviceMappingConstants.JSON_TO_MILLIS, toMillis); json.put(DeviceMappingConstants.JSON_TO_MILLIS, toMillis);
json.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitor.getId().toString()); json.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitor.getId().toString());
json.put(DeviceMappingConstants.JSON_DEVICE_UUID, deviceUuid.toString()); json.put(DeviceMappingConstants.JSON_DEVICE_UUID, deviceUuid.toString());
response = resource.postCheckout(json.toString(), leaderboard.getName()); response = resource.postCheckout(json.toString(), leaderboard.getName());
assertThat("checkout returns OK", response.getStatus(), equalTo(Response.Status.OK.getStatusCode())); assertThat("checkout returns OK", response.getStatus(), equalTo(Response.Status.OK.getStatusCode()));
mappings = new DeviceCompetitorMappingFinder<>(log).analyze(); mappings = new DeviceCompetitorMappingFinder<>(log).analyze();
mappingForC = mappings.get(competitor).get(0); mappingForC = mappings.get(competitor).get(0);
assertThat("mapping now ends at checkout timepoint", mappingForC.getTimeRange().to().asMillis(), equalTo(toMillis)); assertThat("mapping now ends at checkout timepoint", mappingForC.getTimeRange().to().asMillis(),
equalTo(toMillis));
} }
} }
@@ -54,7 +54,7 @@ public class TeamImageTest extends AbstractJaxRsApiTest {
DynamicTeam team = new TeamImpl(null, Collections.singleton(new PersonImpl(null, new NationalityImpl( DynamicTeam team = new TeamImpl(null, Collections.singleton(new PersonImpl(null, new NationalityImpl(
nationality), null, null)), null); nationality), null, null)), null);
DynamicBoat boat = new BoatImpl(null, new BoatClassImpl(boatClassName, false), sailID); DynamicBoat boat = new BoatImpl(null, new BoatClassImpl(boatClassName, false), sailID);
racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, team, boat); racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, null, team, boat);
} }
@Test @Test
@@ -141,7 +141,7 @@ public class CompetitorsResource extends AbstractSailingServerResource {
.entity("Could not store competitor image").type(MediaType.TEXT_PLAIN).build()); .entity("Could not store competitor image").type(MediaType.TEXT_PLAIN).build());
} }
getService().getCompetitorStore().updateCompetitor(competitorId, competitor.getName(), competitor.getColor(), getService().getCompetitorStore().updateCompetitor(competitorId, competitor.getName(), competitor.getColor(), competitor.getEmail(),
competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), imageUri); competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), imageUri);
logger.log(Level.INFO, "Set team image for competitor " + competitor.getName()); logger.log(Level.INFO, "Set team image for competitor " + competitor.getName());
@@ -76,7 +76,7 @@ public class CompetitorReplicationTest extends AbstractServerReplicationTest {
Iterable<Waypoint> emptyWaypointList = Collections.emptyList(); Iterable<Waypoint> emptyWaypointList = Collections.emptyList();
final String competitorName = "Der mit dem Kiel zieht"; final String competitorName = "Der mit dem Kiel zieht";
Competitor competitor = master.getBaseDomainFactory().getOrCreateCompetitor( Competitor competitor = master.getBaseDomainFactory().getOrCreateCompetitor(
123, competitorName, Color.RED, 123, competitorName, Color.RED, "someone@nowhere.de",
new TeamImpl("STG", Collections.singleton(new PersonImpl(competitorName, new NationalityImpl("GER"), new TeamImpl("STG", Collections.singleton(new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */null, "This is famous " + competitorName)), new PersonImpl("Rigo van Maas", /* dateOfBirth */null, "This is famous " + competitorName)), new PersonImpl("Rigo van Maas",
new NationalityImpl("NED"), new NationalityImpl("NED"),
@@ -106,7 +106,7 @@ public class CompetitorReplicationTest extends AbstractServerReplicationTest {
// now update competitor on master using replicating operation // now update competitor on master using replicating operation
final String newCompetitorName = "Der Vogel, der mit dem Kiel zieht"; final String newCompetitorName = "Der Vogel, der mit dem Kiel zieht";
master.apply(new UpdateCompetitor(competitor.getId().toString(), newCompetitorName, competitor.getColor(), competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), master.apply(new UpdateCompetitor(competitor.getId().toString(), newCompetitorName, competitor.getColor(), competitor.getEmail(), competitor.getBoat().getSailID(), competitor.getTeam().getNationality(),
competitor.getTeam().getImage())); competitor.getTeam().getImage()));
Thread.sleep(1000); Thread.sleep(1000);
assertEquals(newCompetitorName, replicatedCompetitor.getName()); // expect in-place update of existing competitor in replica assertEquals(newCompetitorName, replicatedCompetitor.getName()); // expect in-place update of existing competitor in replica
@@ -114,7 +114,7 @@ public class CompetitorReplicationTest extends AbstractServerReplicationTest {
// now allow for resetting to default through some event, such as receiving a GPS position // now allow for resetting to default through some event, such as receiving a GPS position
master.apply(new AllowCompetitorResetToDefaults(Collections.singleton(competitor.getId().toString()))); master.apply(new AllowCompetitorResetToDefaults(Collections.singleton(competitor.getId().toString())));
// modify the competitor on the master "from below" without an UpdateCompetitor operation, only locally: // modify the competitor on the master "from below" without an UpdateCompetitor operation, only locally:
master.getBaseDomainFactory().getCompetitorStore().updateCompetitor(competitor.getId().toString(), competitorName, Color.RED, master.getBaseDomainFactory().getCompetitorStore().updateCompetitor(competitor.getId().toString(), competitorName, Color.RED, competitor.getEmail(),
competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), competitor.getTeam().getImage()); competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), competitor.getTeam().getImage());
final RegattaAndRaceIdentifier raceIdentifier = masterRegatta.getRaceIdentifier(raceDefinition); final RegattaAndRaceIdentifier raceIdentifier = masterRegatta.getRaceIdentifier(raceDefinition);
DynamicTrackedRace trackedRace = (DynamicTrackedRace) master.apply(new CreateTrackedRace(raceIdentifier, DynamicTrackedRace trackedRace = (DynamicTrackedRace) master.apply(new CreateTrackedRace(raceIdentifier,
@@ -71,7 +71,7 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio
// FIXME use master DomainFactory; see bug 592 // FIXME use master DomainFactory; see bug 592
final DomainFactory masterDomainFactory = DomainFactory.INSTANCE; final DomainFactory masterDomainFactory = DomainFactory.INSTANCE;
BoatClass boatClass = masterDomainFactory.getOrCreateBoatClass(boatClassName, /* typicallyStartsUpwind */true); BoatClass boatClass = masterDomainFactory.getOrCreateBoatClass(boatClassName, /* typicallyStartsUpwind */true);
competitor = masterDomainFactory.getCompetitorStore().getOrCreateCompetitor("GER 61", "Tina Lutz", Color.RED, new TeamImpl("Tina Lutz + Susann Beucke", competitor = masterDomainFactory.getCompetitorStore().getOrCreateCompetitor("GER 61", "Tina Lutz", Color.RED, "someone@nowhere.de", new TeamImpl("Tina Lutz + Susann Beucke",
(List<PersonImpl>) Arrays.asList(new PersonImpl[] { new PersonImpl("Tina Lutz", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null), (List<PersonImpl>) Arrays.asList(new PersonImpl[] { new PersonImpl("Tina Lutz", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null),
new PersonImpl("Tina Lutz", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null) }), new PersonImpl("Tina Lutz", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null) }),
new PersonImpl("Rigo de Mas", DomainFactory.INSTANCE.getOrCreateNationality("NED"), null, null)), new PersonImpl("Rigo de Mas", DomainFactory.INSTANCE.getOrCreateNationality("NED"), null, null)),
@@ -22,20 +22,20 @@ public class CompetitorStoreTest {
public void testAddingToTransientStore() { public void testAddingToTransientStore() {
CompetitorStore transientStore = new TransientCompetitorStoreImpl(); CompetitorStore transientStore = new TransientCompetitorStoreImpl();
DynamicCompetitor template = AbstractLeaderboardTest.createCompetitor("Test Competitor"); DynamicCompetitor template = AbstractLeaderboardTest.createCompetitor("Test Competitor");
Competitor competitor = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getTeam(), template.getBoat()); Competitor competitor = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), template.getTeam(), template.getBoat());
assertTrue(competitor != template); assertTrue(competitor != template);
Competitor competitor2 = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getTeam(), template.getBoat()); Competitor competitor2 = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), template.getTeam(), template.getBoat());
assertSame(competitor, competitor2); assertSame(competitor, competitor2);
assertEquals(DomainFactory.INSTANCE.getOrCreateNationality("GER"), competitor.getTeam().getNationality()); assertEquals(DomainFactory.INSTANCE.getOrCreateNationality("GER"), competitor.getTeam().getNationality());
DynamicTeam differentTeam = AbstractLeaderboardTest.createCompetitor("Test Competitor").getTeam(); DynamicTeam differentTeam = AbstractLeaderboardTest.createCompetitor("Test Competitor").getTeam();
differentTeam.setNationality(DomainFactory.INSTANCE.getOrCreateNationality("GHA")); // Ghana differentTeam.setNationality(DomainFactory.INSTANCE.getOrCreateNationality("GHA")); // Ghana
Competitor competitor3 = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), differentTeam, template.getBoat()); Competitor competitor3 = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), differentTeam, template.getBoat());
assertSame(competitor, competitor3); // use existing competitor despite the different team assertSame(competitor, competitor3); // use existing competitor despite the different team
assertSame(competitor.getTeam(), competitor3.getTeam()); assertSame(competitor.getTeam(), competitor3.getTeam());
// now mark the competitor as to update from defaults // now mark the competitor as to update from defaults
transientStore.allowCompetitorResetToDefaults(competitor); transientStore.allowCompetitorResetToDefaults(competitor);
Competitor competitor4 = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), differentTeam, template.getBoat()); Competitor competitor4 = transientStore.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), differentTeam, template.getBoat());
assertSame(competitor, competitor4); // expecting an in-place update assertSame(competitor, competitor4); // expecting an in-place update
assertEquals(differentTeam.getNationality(), competitor4.getTeam().getNationality()); assertEquals(differentTeam.getNationality(), competitor4.getTeam().getNationality());
} }
@@ -44,7 +44,7 @@ public class CompetitorStoreTest {
public void testPersistentCompetitorStore() { public void testPersistentCompetitorStore() {
CompetitorStore persistentStore1 = new PersistentCompetitorStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), /* clearStore */ true, null); CompetitorStore persistentStore1 = new PersistentCompetitorStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), /* clearStore */ true, null);
DynamicCompetitor template = AbstractLeaderboardTest.createCompetitor("Test Competitor"); DynamicCompetitor template = AbstractLeaderboardTest.createCompetitor("Test Competitor");
Competitor competitor = persistentStore1.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getTeam(), template.getBoat()); Competitor competitor = persistentStore1.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), template.getTeam(), template.getBoat());
CompetitorStore persistentStore2 = new PersistentCompetitorStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), /* clearStore */ false, null); CompetitorStore persistentStore2 = new PersistentCompetitorStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), /* clearStore */ false, null);
Competitor competitor2 = persistentStore2.getExistingCompetitorById(template.getId()); Competitor competitor2 = persistentStore2.getExistingCompetitorById(template.getId());
@@ -53,14 +53,14 @@ public class CompetitorStoreTest {
assertEquals(template.getTeam().getNationality(), competitor2.getTeam().getNationality()); assertEquals(template.getTeam().getNationality(), competitor2.getTeam().getNationality());
DynamicTeam differentTeam = AbstractLeaderboardTest.createCompetitor("Test Competitor").getTeam(); DynamicTeam differentTeam = AbstractLeaderboardTest.createCompetitor("Test Competitor").getTeam();
differentTeam.setNationality(DomainFactory.INSTANCE.getOrCreateNationality("GHA")); // Ghana differentTeam.setNationality(DomainFactory.INSTANCE.getOrCreateNationality("GHA")); // Ghana
Competitor competitor3 = persistentStore2.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), differentTeam, template.getBoat()); Competitor competitor3 = persistentStore2.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), differentTeam, template.getBoat());
assertSame(competitor2, competitor3); // use existing competitor despite the different team assertSame(competitor2, competitor3); // use existing competitor despite the different team
assertNotSame(differentTeam, competitor2.getTeam()); // team expected to remain unchanged assertNotSame(differentTeam, competitor2.getTeam()); // team expected to remain unchanged
assertEquals(competitor.getTeam().getNationality(), competitor3.getTeam().getNationality()); // no updatability requested; nationality expected to remain unchanged assertEquals(competitor.getTeam().getNationality(), competitor3.getTeam().getNationality()); // no updatability requested; nationality expected to remain unchanged
// now mark the competitor as to update from defaults // now mark the competitor as to update from defaults
persistentStore2.allowCompetitorResetToDefaults(competitor2); persistentStore2.allowCompetitorResetToDefaults(competitor2);
Competitor competitor4 = persistentStore2.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), differentTeam, template.getBoat()); Competitor competitor4 = persistentStore2.getOrCreateCompetitor(template.getId(), template.getName(), template.getColor(), template.getEmail(), differentTeam, template.getBoat());
assertSame(competitor2, competitor4); // expecting an in-place update assertSame(competitor2, competitor4); // expecting an in-place update
assertEquals(differentTeam.getNationality(), competitor4.getTeam().getNationality()); assertEquals(differentTeam.getNationality(), competitor4.getTeam().getNationality());
} }
@@ -61,7 +61,7 @@ public class LeaderboardStorageTest extends TestCase {
DynamicBoat boat = new BoatImpl("woot", service.getBaseDomainFactory().getOrCreateBoatClass("H16"), "70155"); DynamicBoat boat = new BoatImpl("woot", service.getBaseDomainFactory().getOrCreateBoatClass("H16"), "70155");
String competitorId = "testC"; String competitorId = "testC";
Competitor competitor = service.getBaseDomainFactory().getOrCreateCompetitor(competitorId, "Test C", null, Competitor competitor = service.getBaseDomainFactory().getOrCreateCompetitor(competitorId, "Test C", null,
team, boat); null, team, boat);
double carriedPoints = 2.0; double carriedPoints = 2.0;
leaderboard.setCarriedPoints(competitor, carriedPoints); leaderboard.setCarriedPoints(competitor, carriedPoints);
@@ -749,7 +749,7 @@ public class MasterDataImportTest {
DynamicTeam team = new TeamImpl("Pros", sailors, coach); DynamicTeam team = new TeamImpl("Pros", sailors, coach);
BoatClass boatClass = new BoatClassImpl("H16", true); BoatClass boatClass = new BoatClassImpl("H16", true);
DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
Competitor competitor = sourceDomainFactory.getOrCreateCompetitor(competitorUUID, "Froderik", Color.RED, team, Competitor competitor = sourceDomainFactory.getOrCreateCompetitor(competitorUUID, "Froderik", Color.RED, "noone@nowhere.de", team,
boat); boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitor2UUID = UUID.randomUUID(); UUID competitor2UUID = UUID.randomUUID();
@@ -759,7 +759,7 @@ public class MasterDataImportTest {
DynamicTeam team2 = new TeamImpl("Pros2", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Pros2", sailors2, coach2);
DynamicBoat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133"); DynamicBoat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133");
Competitor competitor2 = sourceDomainFactory.getCompetitorStore().getOrCreateCompetitor(competitor2UUID, Competitor competitor2 = sourceDomainFactory.getCompetitorStore().getOrCreateCompetitor(competitor2UUID,
"Froderik", Color.RED, team2, boat2); "Froderik", Color.RED, "noone@nowhere.de", team2, boat2);
competitors.add(competitor2); competitors.add(competitor2);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore()); TrackedRace trackedRace = new DummyTrackedRace(raceId, competitors, regatta, null, sourceService.getWindStore());
@@ -1206,7 +1206,7 @@ public class MasterDataImportTest {
DynamicBoat boatToOverride = new BoatImpl("Wingy", boatClassToOverride, "GER70133"); DynamicBoat boatToOverride = new BoatImpl("Wingy", boatClassToOverride, "GER70133");
String competitorOldName = "oldName"; String competitorOldName = "oldName";
Competitor competitorToOverride = domainFactory.getOrCreateCompetitor(competitorUUID, competitorOldName, Competitor competitorToOverride = domainFactory.getOrCreateCompetitor(competitorUUID, competitorOldName,
Color.BLUE, teamToOverride, boatToOverride); Color.BLUE, "noone@nowhere.de", teamToOverride, boatToOverride);
competitorsToOverride.add(competitorToOverride); competitorsToOverride.add(competitorToOverride);
Leaderboard leaderboardToOverride = destService.addRegattaLeaderboard( Leaderboard leaderboardToOverride = destService.addRegattaLeaderboard(
@@ -105,7 +105,7 @@ public class WindByRaceLogTest {
} }
private Competitor createCompetitor(final DomainFactory masterDomainFactory) { private Competitor createCompetitor(final DomainFactory masterDomainFactory) {
return masterDomainFactory.getOrCreateCompetitor("GER 61", "Sailor", Color.RED, new TeamImpl("Sailor", return masterDomainFactory.getOrCreateCompetitor("GER 61", "Sailor", Color.RED, "noone@nowhere.de", new TeamImpl("Sailor",
(List<PersonImpl>) Arrays.asList(new PersonImpl[] { new PersonImpl("Sailor 1", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null)}), (List<PersonImpl>) Arrays.asList(new PersonImpl[] { new PersonImpl("Sailor 1", DomainFactory.INSTANCE.getOrCreateNationality("GER"), null, null)}),
new PersonImpl("Sailor 2", DomainFactory.INSTANCE.getOrCreateNationality("NED"), null, null)), new PersonImpl("Sailor 2", DomainFactory.INSTANCE.getOrCreateNationality("NED"), null, null)),
new BoatImpl("GER 61", DomainFactory.INSTANCE.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true), "GER 61")); new BoatImpl("GER 61", DomainFactory.INSTANCE.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true), "GER 61"));
@@ -96,9 +96,9 @@ public class PersistentCompetitorStore extends TransientCompetitorStoreImpl impl
} }
@Override @Override
public Competitor updateCompetitor(String idAsString, String newName, Color newRgbDisplayColor, String newSailId, public Competitor updateCompetitor(String idAsString, String newName, Color newRgbDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri) { Nationality newNationality, URI newTeamImageUri) {
Competitor result = super.updateCompetitor(idAsString, newName, newRgbDisplayColor, newSailId, newNationality, Competitor result = super.updateCompetitor(idAsString, newName, newRgbDisplayColor, newEmail, newSailId, newNationality,
newTeamImageUri); newTeamImageUri);
storeTo.storeCompetitor(result); storeTo.storeCompetitor(result);
return result; return result;
@@ -462,7 +462,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
@Override @Override
public void competitorUpdated(Competitor competitor) { public void competitorUpdated(Competitor competitor) {
replicate(new UpdateCompetitor(competitor.getId().toString(), competitor.getName(), competitor replicate(new UpdateCompetitor(competitor.getId().toString(), competitor.getName(), competitor
.getColor(), competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), .getColor(), competitor.getEmail(), competitor.getBoat().getSailID(), competitor.getTeam().getNationality(),
competitor.getTeam().getImage())); competitor.getTeam().getImage()));
} }
}); });
@@ -2354,7 +2354,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
for (Competitor competitor : ((CompetitorStore) ois.readObject()).getCompetitors()) { for (Competitor competitor : ((CompetitorStore) ois.readObject()).getCompetitors()) {
DynamicCompetitor dynamicCompetitor = (DynamicCompetitor) competitor; DynamicCompetitor dynamicCompetitor = (DynamicCompetitor) competitor;
competitorStore.getOrCreateCompetitor(dynamicCompetitor.getId(), dynamicCompetitor.getName(), competitorStore.getOrCreateCompetitor(dynamicCompetitor.getId(), dynamicCompetitor.getName(),
dynamicCompetitor.getColor(), dynamicCompetitor.getTeam(), dynamicCompetitor.getBoat()); dynamicCompetitor.getColor(), dynamicCompetitor.getEmail(), dynamicCompetitor.getTeam(), dynamicCompetitor.getBoat());
} }
logoutput.append("Received " + competitorStore.size() + " NEW competitors\n"); logoutput.append("Received " + competitorStore.size() + " NEW competitors\n");
@@ -14,6 +14,7 @@ public class UpdateCompetitor extends AbstractRacingEventServiceOperation<Compet
private final String newName; private final String newName;
private final Color newDisplayColor; private final Color newDisplayColor;
private final String newSailId; private final String newSailId;
private final String newEmail;
private final Nationality newNationality; private final Nationality newNationality;
private final URI newTeamImageUri; private final URI newTeamImageUri;
@@ -24,7 +25,7 @@ public class UpdateCompetitor extends AbstractRacingEventServiceOperation<Compet
* if <code>null</code>, the competitor obtains the "NONE" nationality, usually represented by a white * if <code>null</code>, the competitor obtains the "NONE" nationality, usually represented by a white
* flag * flag
*/ */
public UpdateCompetitor(String idAsString, String newName, Color newDisplayColor, String newSailId, public UpdateCompetitor(String idAsString, String newName, Color newDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri) { Nationality newNationality, URI newTeamImageUri) {
super(); super();
this.idAsString = idAsString; this.idAsString = idAsString;
@@ -33,6 +34,7 @@ public class UpdateCompetitor extends AbstractRacingEventServiceOperation<Compet
this.newSailId = newSailId; this.newSailId = newSailId;
this.newNationality = newNationality; this.newNationality = newNationality;
this.newTeamImageUri = newTeamImageUri; this.newTeamImageUri = newTeamImageUri;
this.newEmail = newEmail;
} }
/** /**
@@ -46,7 +48,7 @@ public class UpdateCompetitor extends AbstractRacingEventServiceOperation<Compet
@Override @Override
public Competitor internalApplyTo(RacingEventService toState) throws Exception { public Competitor internalApplyTo(RacingEventService toState) throws Exception {
Competitor result = toState.getBaseDomainFactory().getCompetitorStore() Competitor result = toState.getBaseDomainFactory().getCompetitorStore()
.updateCompetitor(idAsString, newName, newDisplayColor, newSailId, newNationality, .updateCompetitor(idAsString, newName, newDisplayColor, newEmail, newSailId, newNationality,
newTeamImageUri); newTeamImageUri);
return result; return result;
} }
@@ -201,11 +201,12 @@ public class StructureImporter {
String idAsString = person.getPersonID(); String idAsString = person.getPersonID();
String name = person.getGivenName() + " " + person.getFamilyName(); String name = person.getGivenName() + " " + person.getFamilyName();
Color color = null; Color color = null;
String email = null;
Nationality nationality = (person.getNOC() == null) ? null : getNationality(person.getNOC() Nationality nationality = (person.getNOC() == null) ? null : getNationality(person.getNOC()
.toString()); .toString());
BoatAndTeam boatAndTeam = getBoatAndTeam(idAsString, name, nationality, boatClass); BoatAndTeam boatAndTeam = getBoatAndTeam(idAsString, name, nationality, boatClass);
this.baseDomainFactory.convertToCompetitorDTO(this.baseDomainFactory.getOrCreateCompetitor( this.baseDomainFactory.convertToCompetitorDTO(this.baseDomainFactory.getOrCreateCompetitor(
UUID.fromString(idAsString), name, color, boatAndTeam.getTeam(), boatAndTeam.getBoat())); UUID.fromString(idAsString), name, color, email, boatAndTeam.getTeam(), boatAndTeam.getBoat()));
} else { } else {
break; break;
} }