Merge branch 'bug5085' into bug5165

This commit is contained in:
Steffen Schaefer committed 2020-01-17 16:14:16 +01:00
commit 79dde49c53
11 files changed
+69 -49

No files matched your search

@@ -262,7 +262,8 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl {
}
try {
final Course course = trackedRace.getRace().getCourse();
course.update(update, event.getCourseDesign().getAssociatedRoles(), params.getDomainFactory());
course.update(update, event.getCourseDesign().getAssociatedRoles(),
event.getCourseDesign().getOriginatingCourseTemplateIdOrNull(), params.getDomainFactory());
if (base.getName() != null) {
course.setName(base.getName());
}
@@ -391,7 +391,8 @@ public class DomainFactoryImpl implements DomainFactory {
mark.getDeviceIds(), getMarkType(mark.getMarkType()), mark.getDescription());
newDomainControlPoints.add(new com.sap.sse.common.Util.Pair<>(domainControlPoint, PassingInstruction.None));
}
courseToUpdate.update(newDomainControlPoints, courseToUpdate.getAssociatedRoles(), baseDomainFactory);
courseToUpdate.update(newDomainControlPoints, courseToUpdate.getAssociatedRoles(),
courseToUpdate.getOriginatingCourseTemplateIdOrNull(), baseDomainFactory);
}
@Override
@@ -393,7 +393,8 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter i
for (ControlPoint cp : currentCourseDefinition) {
courseToUpdate.add(new Pair<ControlPoint, PassingInstruction>(cp, PassingInstruction.None));
}
course.update(courseToUpdate, course.getAssociatedRoles(), domainFactory.getBaseDomainFactory());
course.update(courseToUpdate, course.getAssociatedRoles(),
course.getOriginatingCourseTemplateIdOrNull(), domainFactory.getBaseDomainFactory());
} catch (PatchFailedException e) {
throw new RuntimeException(e);
}
@@ -193,7 +193,8 @@ public class CourseTest {
courseToUpdate.add(new com.sap.sse.common.Util.Pair<ControlPoint, PassingInstruction>(wp2.getMarks().iterator().next(), wp2.getPassingInstructions()));
courseToUpdate.add(new com.sap.sse.common.Util.Pair<ControlPoint, PassingInstruction>(wp3.getMarks().iterator().next(), wp3.getPassingInstructions()));
courseToUpdate.add(new com.sap.sse.common.Util.Pair<ControlPoint, PassingInstruction>(wp1.getMarks().iterator().next(), wp1.getPassingInstructions()));
course.update(courseToUpdate, new HashMap<>(), DomainFactory.INSTANCE);
course.update(courseToUpdate, new HashMap<>(), course.getOriginatingCourseTemplateIdOrNull(),
DomainFactory.INSTANCE);
assertWaypointIndexes(course);
}
@@ -231,7 +232,8 @@ public class CourseTest {
courseToUpdate.add(new Pair<>(red.getControlPoint(), red.getPassingInstructions()));
courseToUpdate.add(new Pair<>(yellow.getControlPoint(), yellow.getPassingInstructions()));
courseToUpdate.add(new Pair<>(finishPoleCylinder.getControlPoint(), finishPoleCylinder.getPassingInstructions()));
course.update(courseToUpdate, new HashMap<>(), DomainFactory.INSTANCE);
course.update(courseToUpdate, new HashMap<>(), course.getOriginatingCourseTemplateIdOrNull(),
DomainFactory.INSTANCE);
assertWaypointIndexes(course);
List<ControlPoint> newControlPoints = new ArrayList<>();
for (Waypoint newWp : course.getWaypoints()) {
@@ -16,6 +16,10 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.After;
import org.junit.Before;
@@ -71,7 +75,7 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
private Course course;
private Regatta domainRegatta;
private DynamicTrackedRegatta trackedRegatta;
private final IControlRoute[] routeData = new IControlRoute[1];
private CompletableFuture<IControlRoute> routeDataFuture;
private DomainFactory domainFactory;
public CourseUpdateTest() throws URISyntaxException, MalformedURLException {
@@ -81,6 +85,7 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
@Before
public void setUp() throws Exception {
super.setUp();
routeDataFuture = new CompletableFuture<>();
domainFactory = new DomainFactoryImpl(new com.sap.sailing.domain.base.impl.DomainFactoryImpl(com.sap.sailing.domain.base.DomainFactory.TEST_RACE_LOG_RESOLVER));
domainRegatta = domainFactory.getOrCreateDefaultRegatta(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
getTracTracRace(), /* trackedRegattaRegistry */ null);
@@ -100,9 +105,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
@Override
protected void handleEvent(Triple<IControlRoute, Long, Void> event) {
super.handleEvent(event);
synchronized (routeData) {
routeData[0] = event.getA();
routeData.notifyAll();
if (!event.getA().getControls().isEmpty()) {
routeDataFuture.complete(event.getA());
}
}
});
@@ -133,20 +137,25 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
private void testLegStructure(int minimalNumberOfLegsExpected) throws InterruptedException {
waitForRouteData();
assertTrue(course.getLegs().size() >= minimalNumberOfLegsExpected);
TrackedRace trackedRace = trackedRegatta.getTrackedRace(race);
assertEquals(course.getLegs().size(), Util.size(trackedRace.getTrackedLegs()));
Iterator<Leg> legIter = course.getLegs().iterator();
for (TrackedLeg trackedLeg : trackedRace.getTrackedLegs()) {
assertTrue(legIter.hasNext());
Leg leg = legIter.next();
assertSame(leg, trackedLeg.getLeg());
for (Competitor competitor : race.getCompetitors()) {
TrackedLegOfCompetitor tloc = trackedLeg.getTrackedLeg(competitor);
assertNotNull(tloc);
assertSame(competitor, tloc.getCompetitor());
assertSame(leg, tloc.getLeg());
course.lockForRead();
try {
assertTrue(course.getLegs().size() >= minimalNumberOfLegsExpected);
TrackedRace trackedRace = trackedRegatta.getTrackedRace(race);
assertEquals(course.getLegs().size(), Util.size(trackedRace.getTrackedLegs()));
Iterator<Leg> legIter = course.getLegs().iterator();
for (TrackedLeg trackedLeg : trackedRace.getTrackedLegs()) {
assertTrue(legIter.hasNext());
Leg leg = legIter.next();
assertSame(leg, trackedLeg.getLeg());
for (Competitor competitor : race.getCompetitors()) {
TrackedLegOfCompetitor tloc = trackedLeg.getTrackedLeg(competitor);
assertNotNull(tloc);
assertSame(competitor, tloc.getCompetitor());
assertSame(leg, tloc.getLeg());
}
}
} finally {
course.unlockAfterRead();
}
}
@@ -198,7 +207,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
changedControlPoints.add(new Pair<>(wp2.getControlPoint(), wp2.getPassingInstructions()));
changedControlPoints.add(new Pair<>(wp3.getControlPoint(), wp3.getPassingInstructions()));
changedControlPoints.add(new Pair<>(wp4.getControlPoint(), wp4.getPassingInstructions()));
course.update(changedControlPoints, new HashMap<>(), com.sap.sailing.domain.base.DomainFactory.INSTANCE);
course.update(changedControlPoints, new HashMap<>(), course.getOriginatingCourseTemplateIdOrNull(),
com.sap.sailing.domain.base.DomainFactory.INSTANCE);
assertNotSame(wp1, Util.get(course.getWaypoints(), 0));
assertSame(wp2, Util.get(course.getWaypoints(), 1));
@@ -209,8 +219,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
@Test
public void testLastWaypointRemoved() throws PatchFailedException, InterruptedException {
final boolean[] result = new boolean[1];
waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
final IControlRoute routeData = waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
final IControl removedControlPoint = controlPoints.remove(controlPoints.size()-1);
course.addCourseListener(new CourseListener() {
@Override
@@ -233,8 +243,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
@Test
public void testLastButOneWaypointRemoved() throws PatchFailedException, InterruptedException {
final boolean[] result = new boolean[1];
waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
final IControlRoute routeData = waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
final IControl removedControlPoint = controlPoints.remove(1);
course.addCourseListener(new CourseListener() {
@Override
@@ -254,11 +264,11 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
testLegStructure(1);
}
private void waitForRouteData() throws InterruptedException {
synchronized (routeData) {
while (routeData[0] == null) {
routeData.wait();
}
private IControlRoute waitForRouteData() {
try {
return routeDataFuture.get(1, TimeUnit.MINUTES);
} catch (ExecutionException | TimeoutException | InterruptedException e) {
throw new RuntimeException(e);
}
}
@@ -266,8 +276,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
public void testWaypointAddedAtEnd() throws PatchFailedException, InterruptedException {
final boolean[] result = new boolean[1];
final IControl cp1 = createMockedControlPoint("CP1", 1, UUID.randomUUID());
waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
final IControlRoute routeData = waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
controlPoints.add(cp1);
course.addCourseListener(new CourseListener() {
@Override
@@ -304,8 +314,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
public void testTrackedRacesTrackedLegsUpdatedProperly() throws InterruptedException, PatchFailedException {
final boolean[] result = new boolean[1];
final IControl cp1 = createMockedControlPoint("CP1", 1, UUID.randomUUID());
waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
final IControlRoute routeData = waitForRouteData();
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
controlPoints.add(cp1);
course.addCourseListener(new CourseListener() {
@Override
@@ -328,6 +338,6 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
@After
public void tearDown() throws MalformedURLException, IOException, InterruptedException {
super.tearDown();
routeData[0] = null;
routeDataFuture = null;
}
}
@@ -200,7 +200,8 @@ public class DomainFactoryImpl implements DomainFactory {
com.sap.sailing.domain.base.ControlPoint newDomainControlPoint = getOrCreateControlPoint(tractracControlPoint.getA());
newDomainControlPoints.add(new com.sap.sse.common.Util.Pair<com.sap.sailing.domain.base.ControlPoint, PassingInstruction>(newDomainControlPoint, tractracControlPoint.getB()));
}
courseToUpdate.update(newDomainControlPoints, courseToUpdate.getAssociatedRoles(), baseDomainFactory);
courseToUpdate.update(newDomainControlPoints, courseToUpdate.getAssociatedRoles(),
courseToUpdate.getOriginatingCourseTemplateIdOrNull(), baseDomainFactory);
}
@Override
@@ -43,8 +43,8 @@ public interface Course extends CourseBase, Renamable {
* to the registered {@link CourseListener}s as if {@link #addWaypoint(int, Waypoint)} and {@link #removeWaypoint(int)}
* had been used.
*/
void update(Iterable<Util.Pair<ControlPoint, PassingInstruction>> newControlPoints,
Map<Mark, UUID> associatedRoles, DomainFactory baseDomainFactory) throws PatchFailedException;
void update(Iterable<Util.Pair<ControlPoint, PassingInstruction>> newControlPoints, Map<Mark, UUID> associatedRoles,
UUID originatingCouseTemplateIdOrNull, DomainFactory baseDomainFactory) throws PatchFailedException;
int getNumberOfWaypoints();
@@ -44,7 +44,7 @@ public class CourseImpl extends RenamableImpl implements Course {
private final List<Waypoint> waypoints;
private final Map<Waypoint, Integer> waypointIndexes;
private final List<Leg> legs;
private final UUID originatingCourseTemplateId;
private UUID originatingCourseTemplateId;
private final Map<Mark, UUID> associatedRoles;
private transient Set<CourseListener> listeners;
private transient NamedReentrantReadWriteLock lock;
@@ -335,7 +335,8 @@ public class CourseImpl extends RenamableImpl implements Course {
@Override
public void update(Iterable<Pair<ControlPoint, PassingInstruction>> newControlPoints,
Map<Mark, UUID> associatedRoles, DomainFactory baseDomainFactory) throws PatchFailedException {
Map<Mark, UUID> associatedRoles, UUID originatingCouseTemplateIdOrNull, DomainFactory baseDomainFactory)
throws PatchFailedException {
Patch<Waypoint> patch = null;
synchronized (updateMonitor) {
lockForRead();
@@ -368,9 +369,6 @@ public class CourseImpl extends RenamableImpl implements Course {
newWaypointList.add(waypoint);
}
patch = DiffUtils.diff(courseWaypoints, newWaypointList);
this.getAssociatedRoles().clear();
this.getAssociatedRoles().putAll(associatedRoles);
} finally {
unlockAfterRead();
}
@@ -378,6 +376,9 @@ public class CourseImpl extends RenamableImpl implements Course {
lockForWrite();
try {
logger.info("applying course update " + patch + " to course " + this);
this.getAssociatedRoles().clear();
this.getAssociatedRoles().putAll(associatedRoles);
this.originatingCourseTemplateId = originatingCouseTemplateIdOrNull;
CourseAsWaypointList courseAsWaypointList = new CourseAsWaypointList(this);
patch.applyToInPlace(courseAsWaypointList);
} finally {
@@ -2011,7 +2011,7 @@ enterTagsForTheVideo=Entrez des balises pour la vidéo.
enterIdOfWindFinderReviewedSpotCollection=Entrez l''ID d''un ensemble d''endroits WindFinder révisé, par exemple, "Schilksee".
windFinderSpotCollectionsList=Ensemble d''endroits WindFinder
enterTagsForTheImage=Entrez des balises pour l''image.
unableToResolveWindFinderSpotId=Impossible de traiter l''endroit WindFinder ayant l''ID {0} : {1}
unableToResolveWindFinderSpotId=Impossible de traiter l''endroit WindFinder avec l''ID {0} : {1}
windFinderWeatherData=Données météo
positionEditOnNonTrackingRace=Cette course n''est pas suivie actuellement. Les mises à jour d''erreurs ne sont plus reçues par la course suivie. Pour voir les modifications, vous devez recharger la course.
errorCreatingLeaderboardGroup=Erreur lors de la tentative de création du nouveau groupe de palmarès {0}
@@ -2635,7 +2635,8 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
controlPoints.add(new Pair<>(getOrCreateControlPoint(waypointDTO.getA()), waypointDTO.getB()));
}
try {
course.update(controlPoints, course.getAssociatedRoles(), baseDomainFactory);
course.update(controlPoints, course.getAssociatedRoles(), course.getOriginatingCourseTemplateIdOrNull(),
baseDomainFactory);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -6988,7 +6989,8 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
Course course = new CourseImpl(courseName, lastPublishedCourse.getWaypoints());
try {
course.update(controlPoints, lastPublishedCourse.getAssociatedRoles(), baseDomainFactory);
course.update(controlPoints, lastPublishedCourse.getAssociatedRoles(),
lastPublishedCourse.getOriginatingCourseTemplateIdOrNull(), baseDomainFactory);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -271,7 +271,8 @@ public class MarkResource extends AbstractSailingServerResource {
}
Course course = new CourseImpl(courseName, lastPublishedCourse.getWaypoints(), originatingCourseTemplateId);
try {
course.update(controlPoints, lastPublishedCourse.getAssociatedRoles(), getService().getBaseDomainFactory());
course.update(controlPoints, lastPublishedCourse.getAssociatedRoles(),
lastPublishedCourse.getOriginatingCourseTemplateIdOrNull(), getService().getBaseDomainFactory());
} catch (Exception e) {
throw new RuntimeException(e);
}