allow a competitor to be modified through the UpdateCompetitor operation

This commit is contained in:
Axel Uhl committed 2013-10-31 18:10:56 +01:00
1 parent 5068f0268a
commit fe8bd57a19
30 files changed
+354 -185

No files matched your search

@@ -7,5 +7,4 @@ public interface Competitor extends Named, WithID, IsManagedBySharedDomainFactor
Team getTeam(); Team getTeam();
Boat getBoat(); Boat getBoat();
} }
@@ -3,6 +3,9 @@ package com.sap.sailing.domain.base;
import java.io.Serializable; import java.io.Serializable;
import java.util.UUID; import java.util.UUID;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicCompetitor;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.MarkType;
import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.NauticalSide;
@@ -74,10 +77,18 @@ public interface SharedDomainFactory {
Competitor getExistingCompetitorById(Serializable competitorId); Competitor getExistingCompetitorById(Serializable competitorId);
Competitor getOrCreateCompetitor(Serializable competitorId, String name, Team team, Boat boat); Competitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat);
/**
* Same as {@link #getOrCreateCompetitor(Serializable, String, DynamicTeam, DynamicBoat)} but returns the writable
* specialization of the {@link Competitor} interface. Use with care because the setters offered by the <code>Dynamic...</code>
* subinterfaces don't automatically replicate or store the changes.
*/
DynamicCompetitor getOrCreateDynamicCompetitor(UUID competitorId, String name, DynamicTeam team, DynamicBoat boat);
CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name); CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name);
CourseArea getExistingCourseAreaById(Serializable courseAreaId); CourseArea getExistingCourseAreaById(Serializable courseAreaId);
} }
@@ -1,13 +1,12 @@
package com.sap.sailing.domain.base.impl; package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.common.impl.NamedImpl; import com.sap.sailing.domain.common.impl.NamedImpl;
public class BoatImpl extends NamedImpl implements Boat { public class BoatImpl extends NamedImpl implements DynamicBoat {
private static final long serialVersionUID = 3489730487528955788L; private static final long serialVersionUID = 3489730487528955788L;
private final BoatClass boatClass; private final BoatClass boatClass;
private final String sailID; private String sailID;
public BoatImpl(String name, BoatClass boatClass, String sailID) { public BoatImpl(String name, BoatClass boatClass, String sailID) {
super(name); super(name);
@@ -24,4 +23,9 @@ public class BoatImpl extends NamedImpl implements Boat {
public String getSailID() { public String getSailID() {
return sailID; return sailID;
} }
@Override
public void setSailId(String newSailId) {
this.sailID = newSailId;
}
} }
@@ -2,37 +2,45 @@ package com.sap.sailing.domain.base.impl;
import java.io.Serializable; import java.io.Serializable;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.common.impl.NamedImpl;
public class CompetitorImpl extends NamedImpl implements Competitor { public class CompetitorImpl implements DynamicCompetitor {
private static final long serialVersionUID = 294603681016643157L; private static final long serialVersionUID = 294603681016643157L;
private final Team team; private final DynamicTeam team;
private final Boat boat; private final DynamicBoat boat;
private final Serializable id; private final Serializable id;
private String name;
public CompetitorImpl(Serializable id, String name, Team team, Boat boat) { public CompetitorImpl(Serializable id, String name, DynamicTeam team, DynamicBoat boat) {
super(name);
this.id = id; this.id = id;
this.name = name;
this.team = team; this.team = team;
this.boat = boat; this.boat = boat;
} }
@Override
public String getName() {
return name;
}
@Override
public void setName(String newName) {
this.name = newName;
}
@Override @Override
public Serializable getId() { public Serializable getId() {
return id; return id;
} }
@Override @Override
public Team getTeam() { public DynamicTeam getTeam() {
return team; return team;
} }
@Override @Override
public Boat getBoat() { public DynamicBoat getBoat() {
return boat; return boat;
} }
@@ -0,0 +1,7 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Boat;
public interface DynamicBoat extends Boat {
void setSailId(String newSailId);
}
@@ -0,0 +1,9 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.Renamable;
public interface DynamicCompetitor extends Competitor, Renamable {
DynamicBoat getBoat();
DynamicTeam getTeam();
}
@@ -0,0 +1,8 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person;
public interface DynamicPerson extends Person {
void setNationality(Nationality newNationality);
}
@@ -0,0 +1,8 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Team;
public interface DynamicTeam extends Team {
void setNationality(Nationality newNationality);
}
@@ -4,12 +4,11 @@ import java.io.InputStream;
import java.util.Date; import java.util.Date;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.common.impl.NamedImpl; import com.sap.sailing.domain.common.impl.NamedImpl;
public class PersonImpl extends NamedImpl implements Person { public class PersonImpl extends NamedImpl implements DynamicPerson {
private static final long serialVersionUID = -2104903799224233508L; private static final long serialVersionUID = -2104903799224233508L;
private final Nationality nationality; private Nationality nationality;
private final Date dateOfBirth; private final Date dateOfBirth;
private final String description; private final String description;
@@ -29,6 +28,11 @@ public class PersonImpl extends NamedImpl implements Person {
public Nationality getNationality() { public Nationality getNationality() {
return nationality; return nationality;
} }
@Override
public void setNationality(Nationality newNationality) {
this.nationality = newNationality;
}
@Override @Override
public Date getDateOfBirth() { public Date getDateOfBirth() {
@@ -2,15 +2,14 @@ package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.common.impl.NamedImpl; import com.sap.sailing.domain.common.impl.NamedImpl;
public class TeamImpl extends NamedImpl implements Team { public class TeamImpl extends NamedImpl implements DynamicTeam {
private static final long serialVersionUID = 4646922280429210183L; private static final long serialVersionUID = 4646922280429210183L;
private final Iterable<? extends Person> sailors; private final Iterable<? extends DynamicPerson> sailors;
private final Person coach; private final Person coach;
public TeamImpl(String name, Iterable<? extends Person> sailors, Person coach) { public TeamImpl(String name, Iterable<? extends DynamicPerson> sailors, Person coach) {
super(name); super(name);
this.sailors = sailors; this.sailors = sailors;
this.coach = coach; this.coach = coach;
@@ -39,4 +38,11 @@ public class TeamImpl extends NamedImpl implements Team {
return null; return null;
} }
@Override
public void setNationality(Nationality newNationality) {
for (Person sailor : getSailors()) {
((DynamicPerson) sailor).setNationality(newNationality);
}
}
} }
@@ -9,18 +9,18 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.RegattaImpl;
@@ -41,9 +41,9 @@ import com.sap.sailing.domain.swisstimingadapter.Mark;
import com.sap.sailing.domain.swisstimingadapter.MessageType; import com.sap.sailing.domain.swisstimingadapter.MessageType;
import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.Race;
import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader; import com.sap.sailing.domain.swisstimingadapter.RaceSpecificMessageLoader;
import com.sap.sailing.domain.swisstimingadapter.StartList;
import com.sap.sailing.domain.swisstimingadapter.RaceType; import com.sap.sailing.domain.swisstimingadapter.RaceType;
import com.sap.sailing.domain.swisstimingadapter.RaceType.OlympicRaceCode; import com.sap.sailing.domain.swisstimingadapter.RaceType.OlympicRaceCode;
import com.sap.sailing.domain.swisstimingadapter.StartList;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory; import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.tracking.GPSFixMoving; import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.MarkPassing;
@@ -128,13 +128,13 @@ public class DomainFactoryImpl implements DomainFactory {
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, RaceType raceType) { public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor, RaceType raceType) {
Competitor result = getCompetitorByBoatIDAndRaceType(competitor.getBoatID(), raceType); Competitor result = getCompetitorByBoatIDAndRaceType(competitor.getBoatID(), raceType);
if (result == null) { if (result == null) {
Boat boat = new BoatImpl(competitor.getName(), raceType.getBoatClass(), competitor.getBoatID()); DynamicBoat boat = new BoatImpl(competitor.getName(), raceType.getBoatClass(), competitor.getBoatID());
List<Person> teamMembers = new ArrayList<Person>(); List<DynamicPerson> teamMembers = new ArrayList<DynamicPerson>();
for (String teamMemberName : competitor.getName().split("[-+&]")) { for (String teamMemberName : competitor.getName().split("[-+&]")) {
teamMembers.add(new PersonImpl(teamMemberName.trim(), getOrCreateNationality(competitor.getThreeLetterIOCCode()), teamMembers.add(new PersonImpl(teamMemberName.trim(), getOrCreateNationality(competitor.getThreeLetterIOCCode()),
/* dateOfBirth */ null, teamMemberName.trim())); /* dateOfBirth */ null, teamMemberName.trim()));
} }
Team team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null); DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = baseDomainFactory.getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceType), result = baseDomainFactory.getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceType),
competitor.getName(), team, boat); competitor.getName(), team, boat);
} }
@@ -17,11 +17,11 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Position;
@@ -114,8 +114,8 @@ public abstract class StoredTrackBasedTest extends TrackBasedTest {
Map<Competitor, DynamicGPSFixTrack<Competitor, GPSFixMoving>> tracks = new HashMap<Competitor, DynamicGPSFixTrack<Competitor,GPSFixMoving>>(); Map<Competitor, DynamicGPSFixTrack<Competitor, GPSFixMoving>> tracks = new HashMap<Competitor, DynamicGPSFixTrack<Competitor,GPSFixMoving>>();
final String KIELER_WOCHE = "Kieler Woche"; final String KIELER_WOCHE = "Kieler Woche";
for (String competitorName : getCompetitorNamesOfStoredTracks(KIELER_WOCHE)) { for (String competitorName : getCompetitorNamesOfStoredTracks(KIELER_WOCHE)) {
Person p = new PersonImpl(competitorName, /* nationality */ null, /* dateOfBirth */ null, /* description */ null); DynamicPerson p = new PersonImpl(competitorName, /* nationality */ null, /* dateOfBirth */ null, /* description */ null);
Team t = new TeamImpl(competitorName, Collections.singleton(p), /* coach */ null); DynamicTeam t = new TeamImpl(competitorName, Collections.singleton(p), /* coach */ null);
Competitor c = new CompetitorImpl(competitorName, competitorName, t, new BoatImpl(competitorName, Competitor c = new CompetitorImpl(competitorName, competitorName, t, new BoatImpl(competitorName,
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null)); new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = readTrack(c, KIELER_WOCHE); DynamicGPSFixTrack<Competitor, GPSFixMoving> track = readTrack(c, KIELER_WOCHE);
@@ -19,21 +19,21 @@ import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.Course; import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CourseImpl; import com.sap.sailing.domain.base.impl.CourseImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedWithBearingImpl; import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl; import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
@@ -87,9 +87,9 @@ public class DomainFactoryImpl implements DomainFactory {
private final Map<TracTracControlPoint, com.sap.sailing.domain.base.ControlPoint> controlPointCache = private final Map<TracTracControlPoint, com.sap.sailing.domain.base.ControlPoint> controlPointCache =
new HashMap<TracTracControlPoint, com.sap.sailing.domain.base.ControlPoint>(); new HashMap<TracTracControlPoint, com.sap.sailing.domain.base.ControlPoint>();
private final Map<Pair<String, UUID>, Person> personCache = new HashMap<>(); private final Map<Pair<String, UUID>, DynamicPerson> personCache = new HashMap<>();
private final Map<Serializable, Team> teamCache = new HashMap<>(); private final Map<Serializable, DynamicTeam> teamCache = new HashMap<>();
/** /**
* Caches regattas by their name and their boat class's name * Caches regattas by their name and their boat class's name
@@ -245,20 +245,20 @@ public class DomainFactoryImpl implements DomainFactory {
nationality = null; nationality = null;
logger.log(Level.SEVERE, "Unknown nationality "+nationalityAsString+" for competitor "+name+"; leaving null", iae); logger.log(Level.SEVERE, "Unknown nationality "+nationalityAsString+" for competitor "+name+"; leaving null", iae);
} }
Team team = getOrCreateTeam(name, nationality, competitorId); DynamicTeam team = getOrCreateTeam(name, nationality, competitorId);
Boat boat = new BoatImpl(shortName, boatClass, shortName); DynamicBoat boat = new BoatImpl(shortName, boatClass, shortName);
result = baseDomainFactory.getOrCreateCompetitor(competitorId, name, team, boat); result = baseDomainFactory.getOrCreateCompetitor(competitorId, name, team, boat);
} }
return result; return result;
} }
@Override @Override
public Team getOrCreateTeam(String name, Nationality nationality, UUID competitorId) { public DynamicTeam getOrCreateTeam(String name, Nationality nationality, UUID competitorId) {
synchronized (teamCache) { synchronized (teamCache) {
Team result = teamCache.get(competitorId); DynamicTeam result = teamCache.get(competitorId);
if (result == null) { if (result == null) {
String[] sailorNames = name.split("\\b*\\+\\b*"); String[] sailorNames = name.split("\\b*\\+\\b*");
List<Person> sailors = new ArrayList<Person>(); List<DynamicPerson> sailors = new ArrayList<DynamicPerson>();
for (String sailorName : sailorNames) { for (String sailorName : sailorNames) {
sailors.add(getOrCreatePerson(sailorName.trim(), nationality, competitorId)); sailors.add(getOrCreatePerson(sailorName.trim(), nationality, competitorId));
} }
@@ -270,10 +270,10 @@ public class DomainFactoryImpl implements DomainFactory {
} }
@Override @Override
public Person getOrCreatePerson(String name, Nationality nationality, UUID competitorId) { public DynamicPerson getOrCreatePerson(String name, Nationality nationality, UUID competitorId) {
synchronized (personCache) { synchronized (personCache) {
Pair<String, UUID> key = new Pair<String, UUID>(name, competitorId); Pair<String, UUID> key = new Pair<String, UUID>(name, competitorId);
Person result = personCache.get(key); DynamicPerson result = personCache.get(key);
if (result == null) { if (result == null) {
result = new PersonImpl(name, nationality, /* date of birth unknown */null, /* description */""); result = new PersonImpl(name, nationality, /* date of birth unknown */null, /* description */"");
personCache.put(key, result); personCache.put(key, result);
@@ -2,6 +2,9 @@ package com.sap.sailing.domain.base;
import java.io.Serializable; import java.io.Serializable;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicTeam;
/** /**
* Manages a set of {@link Competitor} objects. There may be a transient implementation based on a simple cache, * Manages a set of {@link Competitor} objects. There may be a transient implementation based on a simple cache,
* and there may be persistent implementations. * and there may be persistent implementations.
@@ -13,7 +16,7 @@ public interface CompetitorStore {
Competitor getExistingCompetitorById(Serializable competitorId); Competitor getExistingCompetitorById(Serializable competitorId);
Competitor getOrCreateCompetitor(Serializable competitorId, String name, Team team, Boat boat); Competitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat);
int size(); int size();
@@ -22,7 +25,18 @@ public interface CompetitorStore {
*/ */
void clear(); void clear();
Iterable<Competitor> getCompetitors(); Iterable<? extends Competitor> getCompetitors();
void removeCompetitor(Competitor competitor); void removeCompetitor(Competitor competitor);
/**
* Updates the competitor with {@link Competitor#getId() ID} <code>id</code> by setting the name, sail ID and nationality to
* the values provided. Doing so will not fire any events nor will it replicate this change from a master to any replicas.
* The calling client has to make sure that the changes applied will reach replicas and all other interested clients. It will
* be sufficient to ensure that subsequent DTOs produced from the competitor modified will reflect the changes.<p>
*
* If no competitor with the ID requested is found, the call is a no-op, doing nothing, not even throwing an exception.
* @return TODO
*/
Competitor updateCompetitor(Serializable id, String newName, String newSailId, Nationality newNationality);
} }
@@ -14,11 +14,11 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.CompetitorStore;
@@ -30,7 +30,6 @@ import com.sap.sailing.domain.base.Gate;
import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.ObjectInputStreamResolvingAgainstDomainFactory; import com.sap.sailing.domain.base.ObjectInputStreamResolvingAgainstDomainFactory;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.CountryCode; import com.sap.sailing.domain.common.CountryCode;
import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.Distance;
@@ -300,10 +299,15 @@ public class DomainFactoryImpl implements DomainFactory {
} }
@Override @Override
public synchronized Competitor getOrCreateCompetitor(Serializable competitorId, String name, Team team, Boat boat) { public synchronized Competitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat) {
return competitorStore.getOrCreateCompetitor(competitorId, name, team, boat); return competitorStore.getOrCreateCompetitor(competitorId, name, team, boat);
} }
@Override
public DynamicCompetitor getOrCreateDynamicCompetitor(UUID fromString, String name, DynamicTeam team, DynamicBoat boat) {
return (DynamicCompetitor) getOrCreateDynamicCompetitor(fromString, name, team, boat);
}
@Override @Override
public ObjectInputStreamResolvingAgainstDomainFactory createObjectInputStreamResolvingAgainstThisFactory(InputStream inputStream) throws IOException { public ObjectInputStreamResolvingAgainstDomainFactory createObjectInputStreamResolvingAgainstThisFactory(InputStream inputStream) throws IOException {
return new ObjectInputStreamResolvingAgainstDomainFactoryImpl(inputStream, this); return new ObjectInputStreamResolvingAgainstDomainFactoryImpl(inputStream, this);
@@ -0,0 +1,17 @@
package com.sap.sailing.domain.base.impl;
import java.io.Serializable;
import com.sap.sailing.domain.base.CompetitorStore;
public interface DynamicCompetitorStore extends CompetitorStore {
@Override
DynamicCompetitor getExistingCompetitorById(Serializable competitorId);
@Override
DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat);
@Override
Iterable<? extends DynamicCompetitor> getCompetitors();
}
@@ -4,10 +4,9 @@ import java.io.Serializable;
import java.util.Collections; import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.Nationality;
public class TransientCompetitorStoreImpl implements CompetitorStore, Serializable { public class TransientCompetitorStoreImpl implements CompetitorStore, Serializable {
private static final long serialVersionUID = -4198298775476586931L; private static final long serialVersionUID = -4198298775476586931L;
@@ -17,7 +16,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
competitorCache = new ConcurrentHashMap<>(); competitorCache = new ConcurrentHashMap<>();
} }
private Competitor createCompetitor(Serializable id, String name, Team team, Boat boat) { private Competitor createCompetitor(Serializable id, String name, DynamicTeam team, DynamicBoat boat) {
Competitor result = new CompetitorImpl(id, name, team, boat); Competitor result = new CompetitorImpl(id, name, team, boat);
addNewCompetitor(id, result); addNewCompetitor(id, result);
return result; return result;
@@ -33,7 +32,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
} }
@Override @Override
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Team team, Boat boat) { public Competitor getOrCreateCompetitor(Serializable competitorId, String name, 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) {
synchronized(this) { synchronized(this) {
@@ -70,5 +69,16 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
public void removeCompetitor(Competitor competitor) { public void removeCompetitor(Competitor competitor) {
competitorCache.remove(competitor.getId()); competitorCache.remove(competitor.getId());
} }
@Override
public Competitor updateCompetitor(Serializable id, String newName, String newSailId, Nationality newNationality) {
DynamicCompetitor competitor = (DynamicCompetitor) getExistingCompetitorById(id);
if (competitor != null) {
competitor.setName(newName);
competitor.getBoat().setSailId(newSailId);
competitor.getTeam().setNationality(newNationality);
}
return competitor;
}
} }
@@ -2,14 +2,14 @@ package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer;
public class BoatJsonDeserializer implements JsonDeserializer<Boat> { public class BoatJsonDeserializer implements JsonDeserializer<DynamicBoat> {
private final BoatClassJsonDeserializer boatClassDeserializer; private final BoatClassJsonDeserializer boatClassDeserializer;
public BoatJsonDeserializer(BoatClassJsonDeserializer boatClassDeserializer) { public BoatJsonDeserializer(BoatClassJsonDeserializer boatClassDeserializer) {
@@ -17,7 +17,7 @@ public class BoatJsonDeserializer implements JsonDeserializer<Boat> {
this.boatClassDeserializer = boatClassDeserializer; this.boatClassDeserializer = boatClassDeserializer;
} }
public Boat deserialize(JSONObject object) throws JsonDeserializationException { public DynamicBoat deserialize(JSONObject object) throws JsonDeserializationException {
String name = object.get(BoatJsonSerializer.FIELD_NAME).toString(); String name = object.get(BoatJsonSerializer.FIELD_NAME).toString();
String sailId = object.get(BoatJsonSerializer.FIELD_SAIL_ID).toString(); String sailId = object.get(BoatJsonSerializer.FIELD_SAIL_ID).toString();
BoatClass boatClass = null; BoatClass boatClass = null;
@@ -4,19 +4,19 @@ import java.io.Serializable;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor> { public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor> {
protected final SharedDomainFactory factory; protected final SharedDomainFactory factory;
protected final JsonDeserializer<Team> teamJsonDeserializer; protected final JsonDeserializer<DynamicTeam> teamJsonDeserializer;
protected final JsonDeserializer<Boat> boatJsonDeserializer; protected final JsonDeserializer<DynamicBoat> boatJsonDeserializer;
public static CompetitorJsonDeserializer create(DomainFactory baseDomainFactory) { public static CompetitorJsonDeserializer create(DomainFactory baseDomainFactory) {
return new CompetitorJsonDeserializer(baseDomainFactory, new TeamJsonDeserializer(new PersonJsonDeserializer( return new CompetitorJsonDeserializer(baseDomainFactory, new TeamJsonDeserializer(new PersonJsonDeserializer(
@@ -27,7 +27,7 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
this(factory, null, /* boatDeserializer */ null); this(factory, null, /* boatDeserializer */ null);
} }
public CompetitorJsonDeserializer(SharedDomainFactory factory, JsonDeserializer<Team> teamJsonDeserializer, JsonDeserializer<Boat> boatDeserializer) { public CompetitorJsonDeserializer(SharedDomainFactory factory, JsonDeserializer<DynamicTeam> teamJsonDeserializer, JsonDeserializer<DynamicBoat> boatDeserializer) {
this.factory = factory; this.factory = factory;
this.teamJsonDeserializer = teamJsonDeserializer; this.teamJsonDeserializer = teamJsonDeserializer;
this.boatJsonDeserializer = boatDeserializer; this.boatJsonDeserializer = boatDeserializer;
@@ -38,8 +38,8 @@ public class CompetitorJsonDeserializer implements JsonDeserializer<Competitor>
Serializable competitorId = (Serializable) object.get(CompetitorJsonSerializer.FIELD_ID); Serializable competitorId = (Serializable) object.get(CompetitorJsonSerializer.FIELD_ID);
competitorId = Helpers.tryUuidConversion(competitorId); competitorId = Helpers.tryUuidConversion(competitorId);
String name = (String) object.get(CompetitorJsonSerializer.FIELD_NAME); String name = (String) object.get(CompetitorJsonSerializer.FIELD_NAME);
Team team = null; DynamicTeam team = null;
Boat boat = null; DynamicBoat boat = null;
if (teamJsonDeserializer != null) { if (teamJsonDeserializer != null) {
team = teamJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object, team = teamJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonSerializer.FIELD_TEAM)); CompetitorJsonSerializer.FIELD_TEAM));
@@ -5,13 +5,13 @@ import java.util.Date;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
public class PersonJsonDeserializer implements JsonDeserializer<Person> { public class PersonJsonDeserializer implements JsonDeserializer<DynamicPerson> {
private final JsonDeserializer<Nationality> nationalityDeserializer; private final JsonDeserializer<Nationality> nationalityDeserializer;
@@ -20,7 +20,7 @@ public class PersonJsonDeserializer implements JsonDeserializer<Person> {
} }
@Override @Override
public Person deserialize(JSONObject object) throws JsonDeserializationException { public DynamicPerson deserialize(JSONObject object) throws JsonDeserializationException {
if (object == null) { if (object == null) {
// Coach is often null // Coach is often null
return null; return null;
@@ -8,32 +8,33 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
public class TeamJsonDeserializer implements JsonDeserializer<Team> { public class TeamJsonDeserializer implements JsonDeserializer<DynamicTeam> {
private final JsonDeserializer<Person> personDeserializer; private final JsonDeserializer<DynamicPerson> personDeserializer;
public static TeamJsonDeserializer create(DomainFactory baseDomainFactory) { public static TeamJsonDeserializer create(DomainFactory baseDomainFactory) {
return new TeamJsonDeserializer(new PersonJsonDeserializer( return new TeamJsonDeserializer(new PersonJsonDeserializer(
new NationalityJsonDeserializer(baseDomainFactory))); new NationalityJsonDeserializer(baseDomainFactory)));
} }
public TeamJsonDeserializer(JsonDeserializer<Person> personDeserializer) { public TeamJsonDeserializer(JsonDeserializer<DynamicPerson> personDeserializer) {
this.personDeserializer = personDeserializer; this.personDeserializer = personDeserializer;
} }
@Override @Override
public Team deserialize(JSONObject object) public DynamicTeam deserialize(JSONObject object)
throws JsonDeserializationException { throws JsonDeserializationException {
String name = (String) object.get(TeamJsonSerializer.FIELD_NAME); String name = (String) object.get(TeamJsonSerializer.FIELD_NAME);
Person coach = personDeserializer.deserialize((JSONObject) object Person coach = personDeserializer.deserialize((JSONObject) object
.get(TeamJsonSerializer.FIELD_COACH)); .get(TeamJsonSerializer.FIELD_COACH));
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
JSONArray sailorsJson = (JSONArray) object JSONArray sailorsJson = (JSONArray) object
.get(TeamJsonSerializer.FIELD_SAILORS); .get(TeamJsonSerializer.FIELD_SAILORS);
@@ -4,44 +4,44 @@ import java.util.UUID;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicCompetitor;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.masterdata.impl.CompetitorMasterDataJsonSerializer; import com.sap.sailing.server.gateway.serialization.masterdata.impl.CompetitorMasterDataJsonSerializer;
public class CompetitorMasterDataDeserializer implements JsonDeserializer<Competitor> { public class CompetitorMasterDataDeserializer implements JsonDeserializer<DynamicCompetitor> {
private final JsonDeserializer<BoatClass> boatClassDeserializer; private final JsonDeserializer<BoatClass> boatClassDeserializer;
private final JsonDeserializer<Team> teamDeserializer; private final JsonDeserializer<DynamicTeam> teamDeserializer;
private final SharedDomainFactory domainFactory; private final SharedDomainFactory domainFactory;
public CompetitorMasterDataDeserializer(JsonDeserializer<BoatClass> boatClassDeserializer, public CompetitorMasterDataDeserializer(JsonDeserializer<BoatClass> boatClassDeserializer,
JsonDeserializer<Team> teamDeserializer, SharedDomainFactory domainFactory) { JsonDeserializer<DynamicTeam> teamDeserializer, SharedDomainFactory domainFactory) {
this.boatClassDeserializer = boatClassDeserializer; this.boatClassDeserializer = boatClassDeserializer;
this.teamDeserializer = teamDeserializer; this.teamDeserializer = teamDeserializer;
this.domainFactory = domainFactory; this.domainFactory = domainFactory;
} }
@Override @Override
public Competitor deserialize(JSONObject object) throws JsonDeserializationException { public DynamicCompetitor deserialize(JSONObject object) throws JsonDeserializationException {
String name = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_NAME); String name = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_NAME);
String id = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_ID); String id = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_ID);
Boat boat = createBoatFromJson((JSONObject) object.get(CompetitorMasterDataJsonSerializer.FIELD_BOAT)); DynamicBoat boat = createBoatFromJson((JSONObject) object.get(CompetitorMasterDataJsonSerializer.FIELD_BOAT));
Team team = teamDeserializer.deserialize((JSONObject) object.get(CompetitorMasterDataJsonSerializer.FIELD_TEAM)); DynamicTeam team = teamDeserializer.deserialize((JSONObject) object.get(CompetitorMasterDataJsonSerializer.FIELD_TEAM));
return domainFactory.getOrCreateCompetitor(UUID.fromString(id), name, team, boat); return domainFactory.getOrCreateDynamicCompetitor(UUID.fromString(id), name, team, boat);
} }
private Boat createBoatFromJson(JSONObject object) throws JsonDeserializationException { private DynamicBoat createBoatFromJson(JSONObject object) throws JsonDeserializationException {
String name = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_NAME); String name = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_NAME);
String sailID = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_SAIL_ID); String sailID = (String) object.get(CompetitorMasterDataJsonSerializer.FIELD_SAIL_ID);
BoatClass boatClass = boatClassDeserializer.deserialize((JSONObject) object.get(CompetitorMasterDataJsonSerializer.FIELD_BOAT_CLASS)); BoatClass boatClass = boatClassDeserializer.deserialize((JSONObject) object.get(CompetitorMasterDataJsonSerializer.FIELD_BOAT_CLASS));
@@ -9,13 +9,13 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.LeaderboardMasterData; import com.sap.sailing.domain.base.LeaderboardMasterData;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.Person; import com.sap.sailing.domain.base.impl.DynamicCompetitor;
import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.Color;
import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.masterdataimport.EventMasterData; import com.sap.sailing.domain.masterdataimport.EventMasterData;
@@ -47,9 +47,9 @@ public class LeaderboardGroupMasterDataJsonDeserializer implements JsonDeseriali
public static JsonDeserializer<LeaderboardGroupMasterData> create(DomainFactory domainFactory) { public static JsonDeserializer<LeaderboardGroupMasterData> create(DomainFactory domainFactory) {
JsonDeserializer<BoatClass> boatClassDeserializer = new BoatClassJsonDeserializer(domainFactory); JsonDeserializer<BoatClass> boatClassDeserializer = new BoatClassJsonDeserializer(domainFactory);
JsonDeserializer<Nationality> nationalityDeserializer = new NationalityJsonDeserializer(domainFactory); JsonDeserializer<Nationality> nationalityDeserializer = new NationalityJsonDeserializer(domainFactory);
JsonDeserializer<Person> personDeserializer = new PersonJsonDeserializer(nationalityDeserializer); JsonDeserializer<DynamicPerson> personDeserializer = new PersonJsonDeserializer(nationalityDeserializer);
JsonDeserializer<Team> teamDeserializer = new TeamJsonDeserializer(personDeserializer); JsonDeserializer<DynamicTeam> teamDeserializer = new TeamJsonDeserializer(personDeserializer);
JsonDeserializer<Competitor> competitorDeserializer = new CompetitorMasterDataDeserializer( JsonDeserializer<DynamicCompetitor> competitorDeserializer = new CompetitorMasterDataDeserializer(
boatClassDeserializer, teamDeserializer, domainFactory); boatClassDeserializer, teamDeserializer, domainFactory);
JsonDeserializer<RaceLogEvent> raceLogEventDeserializer = RaceLogEventDeserializer.create(domainFactory); JsonDeserializer<RaceLogEvent> raceLogEventDeserializer = RaceLogEventDeserializer.create(domainFactory);
JsonDeserializer<LeaderboardMasterData> leaderboardDeserializer = new LeaderboardMasterDataJsonDeserializer( JsonDeserializer<LeaderboardMasterData> leaderboardDeserializer = new LeaderboardMasterDataJsonDeserializer(
@@ -13,6 +13,7 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.LeaderboardMasterData; import com.sap.sailing.domain.base.LeaderboardMasterData;
import com.sap.sailing.domain.base.impl.DynamicCompetitor;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.ScoringSchemeType;
@@ -30,11 +31,11 @@ import com.sap.sailing.server.gateway.serialization.masterdata.impl.RaceColumnMa
public class LeaderboardMasterDataJsonDeserializer implements JsonDeserializer<LeaderboardMasterData> { public class LeaderboardMasterDataJsonDeserializer implements JsonDeserializer<LeaderboardMasterData> {
private final JsonDeserializer<Competitor> competitorDeserializer; private final JsonDeserializer<DynamicCompetitor> competitorDeserializer;
private final DomainFactory domainFactory; private final DomainFactory domainFactory;
private final JsonDeserializer<RaceLogEvent> raceLogEventDeseriaizer; private final JsonDeserializer<RaceLogEvent> raceLogEventDeseriaizer;
public LeaderboardMasterDataJsonDeserializer(JsonDeserializer<Competitor> competitorDeserializer, public LeaderboardMasterDataJsonDeserializer(JsonDeserializer<DynamicCompetitor> competitorDeserializer,
DomainFactory domainFactory, JsonDeserializer<RaceLogEvent> raceLogEventDeseriaizer) { DomainFactory domainFactory, JsonDeserializer<RaceLogEvent> raceLogEventDeseriaizer) {
this.competitorDeserializer = competitorDeserializer; this.competitorDeserializer = competitorDeserializer;
this.domainFactory = domainFactory; this.domainFactory = domainFactory;
@@ -22,7 +22,6 @@ import org.junit.Test;
import com.mongodb.DBCollection; import com.mongodb.DBCollection;
import com.mongodb.DBCursor; import com.mongodb.DBCursor;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseArea;
@@ -33,12 +32,14 @@ import com.sap.sailing.domain.base.Person;
import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.BoatImpl; import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseAreaImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl;
import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.DomainFactoryImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicPerson;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
@@ -180,24 +181,24 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID(); UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L), sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit")); "segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L), Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach"); "Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337"); DynamicBoat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2); CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress); competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -345,22 +346,22 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitor2UUID = UUID.randomUUID(); UUID competitor2UUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Test Mustermann", new NationalityImpl("GER"), new Date(645487200000L), "desc")); sailors2.add(new PersonImpl("Test Mustermann", new NationalityImpl("GER"), new Date(645487200000L), "desc"));
Person coach2 = new PersonImpl("Max Test", new NationalityImpl("GER"), new Date(645487200000L), "desc"); Person coach2 = new PersonImpl("Max Test", new NationalityImpl("GER"), new Date(645487200000L), "desc");
Team team2 = new TeamImpl("Pros2", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Pros2", sailors2, coach2);
Boat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133"); DynamicBoat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133");
CompetitorImpl competitor2 = new CompetitorImpl(competitor2UUID, "Froderik", team2, boat2); CompetitorImpl competitor2 = new CompetitorImpl(competitor2UUID, "Froderik", team2, boat2);
competitors.add(competitor2); competitors.add(competitor2);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -500,22 +501,22 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
Competitor competitor = sourceDomainFactory.getOrCreateCompetitor(competitorUUID, "Froderik", team, boat); Competitor competitor = sourceDomainFactory.getOrCreateCompetitor(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitor2UUID = UUID.randomUUID(); UUID competitor2UUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Test Mustermann", new NationalityImpl("GER"), new Date(645487200000L), "desc")); sailors2.add(new PersonImpl("Test Mustermann", new NationalityImpl("GER"), new Date(645487200000L), "desc"));
Person coach2 = new PersonImpl("Max Test", new NationalityImpl("GER"), new Date(645487200000L), "desc"); Person coach2 = new PersonImpl("Max Test", new NationalityImpl("GER"), new Date(645487200000L), "desc");
Team team2 = new TeamImpl("Pros2", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Pros2", sailors2, coach2);
Boat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133"); DynamicBoat boat2 = new BoatImpl("FastBoat", boatClass, "GER70133");
Competitor competitor2 = sourceDomainFactory.getOrCreateCompetitor(competitor2UUID, "Froderik", team2, boat2); Competitor competitor2 = sourceDomainFactory.getOrCreateCompetitor(competitor2UUID, "Froderik", team2, boat2);
competitors.add(competitor2); competitors.add(competitor2);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -632,24 +633,24 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID(); UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L), sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit")); "segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L), Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach"); "Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337"); DynamicBoat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2); CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress); competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -808,24 +809,24 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID(); UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L), sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit")); "segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L), Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach"); "Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337"); DynamicBoat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2); CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress); competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -978,24 +979,24 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID(); UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L), sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit")); "segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L), Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach"); "Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337"); DynamicBoat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2); CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress); competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -1103,24 +1104,24 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID(); UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L), sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit")); "segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L), Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach"); "Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337"); DynamicBoat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2); CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress); competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -1277,24 +1278,24 @@ public class MasterDataImportTest {
// Set tracked Race with competitors // Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>(); Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID(); UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>(); Set<DynamicPerson> sailors = new HashSet<DynamicPerson>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L), sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy")); "Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L), Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt"); "Der Lennart halt");
Team 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);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133"); DynamicBoat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat); CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor); competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID(); UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>(); Set<DynamicPerson> sailors2 = new HashSet<DynamicPerson>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L), sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit")); "segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L), Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach"); "Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2); DynamicTeam team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337"); DynamicBoat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2); CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress); competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta); TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
@@ -7,6 +7,7 @@ import java.io.Serializable;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore; import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.DomainFactoryImpl;
import com.sap.sailing.domain.base.impl.TransientCompetitorStoreImpl; import com.sap.sailing.domain.base.impl.TransientCompetitorStoreImpl;
import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.DomainObjectFactory;
@@ -79,5 +80,13 @@ public class PersistentCompetitorStore extends TransientCompetitorStoreImpl impl
storeTo.removeCompetitor(competitor); storeTo.removeCompetitor(competitor);
super.removeCompetitor(competitor); super.removeCompetitor(competitor);
} }
@Override
public Competitor updateCompetitor(Serializable id, String newName, String newSailId, Nationality newNationality) {
Competitor result = super.updateCompetitor(id, newName, newSailId, newNationality);
storeTo.storeCompetitor(result);
return result;
}
} }
@@ -42,6 +42,7 @@ import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.DynamicCompetitor;
import com.sap.sailing.domain.base.impl.EventImpl; import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.LeaderboardNameConstants;
@@ -1702,7 +1703,8 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
// only copy the competitors from the deserialized competitor store; don't use it because it will have set // only copy the competitors from the deserialized competitor store; don't use it because it will have set
// a default Mongo object factory // a default Mongo object factory
for (Competitor competitor : ((CompetitorStore) ois.readObject()).getCompetitors()) { for (Competitor competitor : ((CompetitorStore) ois.readObject()).getCompetitors()) {
persistentCompetitorStore.getOrCreateCompetitor(competitor.getId(), competitor.getName(), competitor.getTeam(), competitor.getBoat()); DynamicCompetitor dynamicCompetitor = (DynamicCompetitor) competitor;
persistentCompetitorStore.getOrCreateCompetitor(dynamicCompetitor.getId(), dynamicCompetitor.getName(), dynamicCompetitor.getTeam(), dynamicCompetitor.getBoat());
} }
logoutput.append("\nReceived " + persistentCompetitorStore.size() + " NEW competitors\n"); logoutput.append("\nReceived " + persistentCompetitorStore.size() + " NEW competitors\n");
@@ -2,46 +2,42 @@ package com.sap.sailing.server.operationaltransformation;
import java.io.Serializable; import java.io.Serializable;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Team; import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation; import com.sap.sailing.server.RacingEventServiceOperation;
public class CreatePersistentCompetitor extends public class CreatePersistentCompetitor extends AbstractRacingEventServiceOperation<Competitor> {
AbstractRacingEventServiceOperation<Competitor> {
private static final long serialVersionUID = 1538753300467120249L;
// private static final Logger logger =
// Logger.getLogger(CreatePersistentCompetitor.class.getName());
private final Serializable id; private static final long serialVersionUID = 1538753300467120249L;
private final String name; // private static final Logger logger =
private final Team team; // Logger.getLogger(CreatePersistentCompetitor.class.getName());
private final Boat boat;
public CreatePersistentCompetitor(Serializable id, String name, Team team, private final Serializable id;
Boat boat) { private final String name;
this.id = id; private final DynamicTeam team;
this.name = name; private final DynamicBoat boat;
this.team = team;
this.boat = boat;
}
@Override public CreatePersistentCompetitor(Serializable id, String name, DynamicTeam team, DynamicBoat boat) {
public Competitor internalApplyTo(RacingEventService toState) { this.id = id;
return toState.getBaseDomainFactory().getOrCreateCompetitor(id, name, team, boat); this.name = name;
} this.team = team;
this.boat = boat;
}
@Override @Override
public RacingEventServiceOperation<?> transformClientOp( public Competitor internalApplyTo(RacingEventService toState) {
RacingEventServiceOperation<?> serverOp) { return toState.getBaseDomainFactory().getOrCreateCompetitor(id, name, team, boat);
return serverOp.transformCreatePersistentCompetitorClientOp(this); }
}
@Override @Override
public RacingEventServiceOperation<?> transformServerOp( public RacingEventServiceOperation<?> transformClientOp(RacingEventServiceOperation<?> serverOp) {
RacingEventServiceOperation<?> clientOp) { return serverOp.transformCreatePersistentCompetitorClientOp(this);
return clientOp.transformCreatePersistentCompetitorServerOp(this); }
}
@Override
public RacingEventServiceOperation<?> transformServerOp(RacingEventServiceOperation<?> clientOp) {
return clientOp.transformCreatePersistentCompetitorServerOp(this);
}
} }
@@ -0,0 +1,42 @@
package com.sap.sailing.server.operationaltransformation;
import java.io.Serializable;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
public class UpdateCompetitor extends AbstractRacingEventServiceOperation<Void> {
private static final long serialVersionUID = 1172181354320184263L;
private final Serializable id;
private final String newName;
private final String newSailId;
private final Nationality newNationality;
public UpdateCompetitor(Serializable id, String newName, String newSailId, Nationality newNationality) {
super();
this.id = id;
this.newName = newName;
this.newSailId = newSailId;
this.newNationality = newNationality;
}
@Override
public Void internalApplyTo(RacingEventService toState) throws Exception {
toState.getBaseDomainFactory().getCompetitorStore().updateCompetitor(id, newName, newSailId, newNationality);
return null;
}
@Override
public RacingEventServiceOperation<?> transformClientOp(RacingEventServiceOperation<?> serverOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventServiceOperation<?> transformServerOp(RacingEventServiceOperation<?> clientOp) {
// TODO Auto-generated method stub
return null;
}
}
@@ -6,23 +6,25 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import com.sap.sailing.domain.base.Boat;
import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint; import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Gate; import com.sap.sailing.domain.base.Gate;
import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Nationality; import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl; import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseAreaImpl; import com.sap.sailing.domain.base.impl.CourseAreaImpl;
import com.sap.sailing.domain.base.impl.DynamicBoat;
import com.sap.sailing.domain.base.impl.DynamicCompetitor;
import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.GateImpl; import com.sap.sailing.domain.base.impl.GateImpl;
import com.sap.sailing.domain.base.impl.MarkImpl; import com.sap.sailing.domain.base.impl.MarkImpl;
import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.NationalityImpl;
@@ -39,7 +41,7 @@ public enum DomainFactoryImpl implements SharedDomainFactory {
private final Map<String, BoatClass> boatClassCache = new HashMap<String, BoatClass>(); private final Map<String, BoatClass> boatClassCache = new HashMap<String, BoatClass>();
private final ConcurrentHashMap<Serializable, Waypoint> waypointCache = new ConcurrentHashMap<Serializable, Waypoint>(); private final ConcurrentHashMap<Serializable, Waypoint> waypointCache = new ConcurrentHashMap<Serializable, Waypoint>();
private final Set<String> mayStartWithNoUpwindLeg = new HashSet<String>(Arrays.asList(new String[] { "extreme40", "ess", "ess40" })); private final Set<String> mayStartWithNoUpwindLeg = new HashSet<String>(Arrays.asList(new String[] { "extreme40", "ess", "ess40" }));
private final Map<Serializable, Competitor> competitorCache = new HashMap<Serializable, Competitor>(); private final Map<Serializable, DynamicCompetitor> competitorCache = new HashMap<Serializable, DynamicCompetitor>();
private final Map<Serializable, CourseArea> courseAreaCache = new HashMap<Serializable, CourseArea>(); private final Map<Serializable, CourseArea> courseAreaCache = new HashMap<Serializable, CourseArea>();
public Nationality getOrCreateNationality(String threeLetterIOCCode) { public Nationality getOrCreateNationality(String threeLetterIOCCode) {
@@ -134,23 +136,29 @@ public enum DomainFactoryImpl implements SharedDomainFactory {
return getOrCreateBoatClass(name, /* typicallyStartsUpwind */!mayStartWithNoUpwindLeg.contains(name.toLowerCase())); return getOrCreateBoatClass(name, /* typicallyStartsUpwind */!mayStartWithNoUpwindLeg.contains(name.toLowerCase()));
} }
public Competitor getExistingCompetitorById(Serializable competitorId) { public DynamicCompetitor getExistingCompetitorById(Serializable competitorId) {
return competitorCache.get(competitorId); return competitorCache.get(competitorId);
} }
public Competitor createCompetitor(Serializable id, String name, Team team, Boat boat) { public DynamicCompetitor createCompetitor(Serializable id, String name, DynamicTeam team, DynamicBoat boat) {
Competitor result = new CompetitorImpl(id, name, team, boat); DynamicCompetitor result = new CompetitorImpl(id, name, team, boat);
competitorCache.put(id, result); competitorCache.put(id, result);
return result; return result;
} }
public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Team team, Boat boat) { public DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, DynamicTeam team, DynamicBoat boat) {
Competitor result = getExistingCompetitorById(competitorId); DynamicCompetitor result = getExistingCompetitorById(competitorId);
if (result == null) { if (result == null) {
result = createCompetitor(competitorId, name, team, boat); result = createCompetitor(competitorId, name, team, boat);
} }
return result; return result;
} }
@Override
public DynamicCompetitor getOrCreateDynamicCompetitor(UUID competitorId, String name, DynamicTeam team,
DynamicBoat boat) {
return getOrCreateCompetitor(competitorId, name, team, boat);
}
@Override @Override
public CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name) { public CourseArea getOrCreateCourseArea(Serializable courseAreaId, String name) {