From ab7daf375215c624f7a17e706cdb22b042401ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Tue, 24 Apr 2018 11:19:22 +0200 Subject: [PATCH 1/4] bug4502 adjusted refreshing to respect currently selected values correctly --- .../LeaderboardGroupConfigPanel.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java index d56e660cfa3..77481f4154e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java @@ -656,44 +656,42 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements @Override public void fillLeaderboards(Iterable leaderboards) { availableLeaderboards.clear(); + leaderboardsProvider.getList().clear(); if (leaderboards != null) { Util.addAll(leaderboards, availableLeaderboards); } - leaderboardsFilterablePanel.updateAll(availableLeaderboards); + final LeaderboardGroupDTO selectedGroup = getSelectedGroup(); + if(selectedGroup != null) { + leaderboardsProvider.getList().addAll(availableLeaderboards); + leaderboardsProvider.getList().removeAll(selectedGroup.leaderboards); + leaderboardsFilterablePanel.getTextBox().setText(""); + leaderboardsFilterablePanel.updateAll(leaderboardsProvider.getList()); + refreshableLeaderboardsSelectionModel.clear(); + final Set selectedLeaderboards = refreshableLeaderboardsSelectionModel.getSelectedSet(); + for (StrippedLeaderboardDTO leaderboard : selectedLeaderboards) { + refreshableLeaderboardsSelectionModel.setSelected(leaderboard, true); + } + } } /** - * If no leaderboard group is selected or more than one is selected, this method is a no-op because the - * leaderboard list displayed is defined to the be list of all leaderboards available, excluding those - * leaderboards that are already assigned to the selected leaderboard group. In other words, - * the leaderboard list is only well-defined in case a single leaderboard group is selected. + * If no leaderboard group is selected or more than one is selected, this method is a no-op because the leaderboard + * list displayed is defined to the be list of all leaderboards available, excluding those leaderboards that are + * already assigned to the selected leaderboard group. In other words, the leaderboard list is only + * well-defined in case a single leaderboard group is selected. */ private void refreshLeaderboardsList() { - final LeaderboardGroupDTO selectedGroup = getSelectedGroup(); - final Set selectedLeaderboards = refreshableLeaderboardsSelectionModel.getSelectedSet(); - if (isSingleGroupSelected && selectedGroup != null) { + if (isSingleGroupSelected && getSelectedGroup() != null) { sailingService.getLeaderboards(new MarkedAsyncCallback>( new AsyncCallback>() { @Override public void onFailure(Throwable t) { errorReporter.reportError("Error trying to obtain list of leaderboards: " + t.getMessage()); } - + @Override public void onSuccess(List leaderboards) { - availableLeaderboards.clear(); - if (leaderboards != null) { - availableLeaderboards.addAll(leaderboards); - } - leaderboardsProvider.getList().clear(); - leaderboardsProvider.getList().addAll(availableLeaderboards); - leaderboardsProvider.getList().removeAll(selectedGroup.leaderboards); - leaderboardsFilterablePanel.getTextBox().setText(""); - leaderboardsFilterablePanel.updateAll(availableLeaderboards); - refreshableLeaderboardsSelectionModel.clear(); - for (StrippedLeaderboardDTO leaderboard : selectedLeaderboards) { - refreshableLeaderboardsSelectionModel.setSelected(leaderboard, true); - } + fillLeaderboards(leaderboards); } })); } @@ -903,7 +901,7 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements } updateGroup(selectedGroup); //Refilters the leaderboards list (hides the moved leaderboards if they don't fit to the filter) and resorts the list - leaderboardsFilterablePanel.updateAll(availableLeaderboards); + leaderboardsFilterablePanel.updateAll(leaderboardsProvider.getList()); } } From ad5550bdc3ea6a43feb0d1d4e93f7d4ff8e9ef61 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 8 May 2018 08:40:19 +0200 Subject: [PATCH 2/4] Bug 4502: the filter field isn't cleared anymore when refreshing the leaderboard list due to the fact that the previous filter is still active --- .../sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java index 77481f4154e..fad9c27a9a8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java @@ -664,7 +664,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements if(selectedGroup != null) { leaderboardsProvider.getList().addAll(availableLeaderboards); leaderboardsProvider.getList().removeAll(selectedGroup.leaderboards); - leaderboardsFilterablePanel.getTextBox().setText(""); leaderboardsFilterablePanel.updateAll(leaderboardsProvider.getList()); refreshableLeaderboardsSelectionModel.clear(); final Set selectedLeaderboards = refreshableLeaderboardsSelectionModel.getSelectedSet(); From da613dadefc7663a7d2745f58adea2805d125c59 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 8 May 2018 10:21:08 +0200 Subject: [PATCH 3/4] bug4546 Avoided NPE in Mark Position Editor when the mark is deselected while adding or editing positions --- .../gwt/ui/client/shared/charts/EditMarkPositionPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java index bd3497671db..edd0f7cb900 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/EditMarkPositionPanel.java @@ -529,7 +529,7 @@ public class EditMarkPositionPanel extends AbstractRaceChart i public void resetPointColor(int index) { Point[] points = markSeries.getPoints(); - if (points.length > index) { + if (points.length > index && selectedMark != null) { points[index].setMarker(new Marker().setFillColor(selectedMark.color==null?null:selectedMark.color.getAsHtml())); setSeriesPoints(markSeries, points, /* manageZoom */ true); } From 9ed9a42cbf9ca3fa79f45231dba4b055f05117b8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 8 May 2018 18:04:29 +0200 Subject: [PATCH 4/4] implemented DB migration for old, deprecated representation of two-mark control points Change-Id: I14adcd5af2a1ab3d22bc137e10159c96f960d1e9 --- .../impl/DomainObjectFactoryImpl.java | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index e5eeadf1c1f..75d88a3fa67 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1541,8 +1541,10 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } else if (eventClass.equals(RaceLogPassChangeEvent.class.getSimpleName())) { resultEvent = loadRaceLogPassChangeEvent(createdAt, author, logicalTimePoint, id, passId, competitors); } else if (eventClass.equals(RaceLogCourseDesignChangedEvent.class.getSimpleName())) { - resultEvent = loadRaceLogCourseDesignChangedEvent(createdAt, author, logicalTimePoint, id, passId, competitors, - dbObject); + final Pair> resultPair = loadRaceLogCourseDesignChangedEvent( + createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); + resultEvent = resultPair.getA(); + dbObjectForUpdate = resultPair.getB(); } else if (eventClass.equals(RaceLogFinishPositioningListChangedEvent.class.getSimpleName())) { resultEvent = loadRaceLogFinishPositioningListChangedEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); @@ -1815,17 +1817,21 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return new RaceLogPassChangeEventImpl(createdAt, logicalTimePoint, author, id, passId); } - private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, + /** + * @return the second pair component has a DBObject in case migration was performed and the updated race log event's + * DBObject representation shall be updated to the DB + */ + private Pair> loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String courseName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN_NAME.name()); - CourseBase courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), + Pair courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), courseName); final String courseDesignerModeName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGNER_MODE.name()); final CourseDesignerMode courseDesignerMode = courseDesignerModeName == null ? null : CourseDesignerMode.valueOf(courseDesignerModeName); - return new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, author, id, passId, courseData, - courseDesignerMode); + return new Pair<>(new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, author, id, passId, courseData.getA(), + courseDesignerMode), courseData.getB() ? /* migrated */ Optional.of(dbObject) : Optional.empty()); } private RaceLogEvent loadRaceLogFixedMarkPassingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, @@ -2313,9 +2319,12 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { * field is loaded, the value of PASSINGSIDE is used and then migrated to PASSINGINSTRUCTION. If the first or last * Waypoint has the PassingInstructions Gate, it is transfered to Line. * + * @return the second component tells if migration was performed; in this case the {@code dbCourseList} passed has + * been edited "in place" to describe the migration that has happened */ @SuppressWarnings("deprecation") // Used to migrate from PASSINGSIDE to the new PASSINGINSTRUCTIONS - private CourseBase loadCourseData(BasicDBList dbCourseList, String courseName) { + private Pair loadCourseData(BasicDBList dbCourseList, String courseName) { + boolean migrated = false; if (courseName == null) { courseName = "Course"; } @@ -2338,25 +2347,31 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } dbObject.put(FieldNames.WAYPOINT_PASSINGINSTRUCTIONS.name(), waypointPassingInstruction); dbObject.removeField(FieldNames.WAYPOINT_PASSINGSIDE.name()); + migrated = true; } } if (waypointPassingInstruction != null) { passingInstructions = PassingInstruction.valueOfIgnoringCase(waypointPassingInstruction); } - ControlPoint controlPoint = loadControlPoint((DBObject) dbObject.get(FieldNames.CONTROLPOINT.name())); + Pair controlPoint = loadControlPoint((DBObject) dbObject.get(FieldNames.CONTROLPOINT.name())); + migrated = migrated || controlPoint.getB(); if (passingInstructions == null) { - waypoint = new WaypointImpl(controlPoint); + waypoint = new WaypointImpl(controlPoint.getA()); } else { - waypoint = new WaypointImpl(controlPoint, passingInstructions); + waypoint = new WaypointImpl(controlPoint.getA(), passingInstructions); } courseData.addWaypoint(i++, waypoint); } - return courseData; + return new Pair<>(courseData, migrated); } - private ControlPoint loadControlPoint(DBObject dbObject) { + /** + * @return second component tells whether migration was performed on {@code dbObject} in place + */ + private Pair loadControlPoint(DBObject dbObject) { String controlPointClass = (String) dbObject.get(FieldNames.CONTROLPOINT_CLASS.name()); ControlPoint controlPoint = null; + boolean migrated = false; if (controlPointClass != null) { if (controlPointClass.equals(Mark.class.getSimpleName())) { Mark mark = loadMark((DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); @@ -2366,13 +2381,14 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { (DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); dbObject.put(FieldNames.CONTROLPOINT_CLASS.name(), ControlPointWithTwoMarks.class.getSimpleName()); controlPoint = cpwtm; + migrated = true; } else if (controlPointClass.equals(ControlPointWithTwoMarks.class.getSimpleName())) { ControlPointWithTwoMarks cpwtm = loadControlPointWithTwoMarks( (DBObject) dbObject.get(FieldNames.CONTROLPOINT_VALUE.name())); controlPoint = cpwtm; } } - return controlPoint; + return new Pair<>(controlPoint, migrated); } /**