mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-08 20:12:23 +00:00
Merge branch 'bug5085' into bug5165
This commit is contained in:
commit
79dde49c53
11 files changed
+69
-49
No files matched your search
+2
-1
@@ -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());
|
||||
}
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+2
-1
@@ -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()) {
|
||||
|
||||
+42
-32
@@ -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;
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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();
|
||||
|
||||
|
||||
Executable → Regular
+6
-5
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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}
|
||||
|
||||
+4
-2
@@ -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);
|
||||
}
|
||||
|
||||
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user