42c8f86f6f4272fbeb768f24e4bde0883e2c8ed0
java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/LeagueEventHierarchyOwnershipChangeTest.java
| ... | ... | @@ -159,13 +159,11 @@ public class LeagueEventHierarchyOwnershipChangeTest { |
| 159 | 159 | new ThresholdBasedResultDiscardingRuleImpl(new int[0]), new LowPoint(), defaultCourseArea)); |
| 160 | 160 | event.addLeaderboardGroup(sharedLeaderboardGroup); |
| 161 | 161 | otherEvent.addLeaderboardGroup(sharedLeaderboardGroup); |
| 162 | - |
|
| 163 | 162 | assertTimeoutPreemptively(java.time.Duration.ofSeconds(5), () -> SailingHierarchyOwnershipUpdater |
| 164 | 163 | .createOwnershipUpdater(/* createNewGroup */ true, /* existingGroupIdOrNull */ null, |
| 165 | 164 | THE_NEW_OWNING_GROUP_NAME, /* migrateCompetitors */ true, /* migrateBoats */ true, |
| 166 | 165 | /* copyMembersAndRoles */ true, service) |
| 167 | 166 | .updateGroupOwnershipForEventHierarchy(event)); |
| 168 | - |
|
| 169 | 167 | final OwnershipAnnotation eventOwnership = securityService.getOwnership(event.getIdentifier()); |
| 170 | 168 | final OwnershipAnnotation otherEventOwnership = securityService.getOwnership(otherEvent.getIdentifier()); |
| 171 | 169 | assertSame(eventOwnership.getAnnotation().getTenantOwner(), |
java/com.sap.sailing.server/src/com/sap/sailing/server/hierarchy/SailingHierarchyOwnershipUpdater.java
| ... | ... | @@ -65,9 +65,9 @@ public class SailingHierarchyOwnershipUpdater { |
| 65 | 65 | private final boolean updateCompetitors; |
| 66 | 66 | private final boolean updateBoats; |
| 67 | 67 | private final Set<QualifiedObjectIdentifier> objectsToUpdateOwnershipsFor; |
| 68 | - private final Set<QualifiedObjectIdentifier> visitedEvents; |
|
| 69 | - private final Set<QualifiedObjectIdentifier> visitedLeaderboardGroups; |
|
| 70 | - private final Set<QualifiedObjectIdentifier> visitedLeaderboards; |
|
| 68 | + private final Set<Event> visitedEvents; |
|
| 69 | + private final Set<LeaderboardGroup> visitedLeaderboardGroups; |
|
| 70 | + private final Set<Leaderboard> visitedLeaderboards; |
|
| 71 | 71 | |
| 72 | 72 | private SailingHierarchyOwnershipUpdater(final RacingEventService service, SecurityService securityService, |
| 73 | 73 | final GroupOwnerUpdateStrategy updateStrategy, final boolean updateCompetitors, final boolean updateBoats) { |
| ... | ... | @@ -88,25 +88,24 @@ public class SailingHierarchyOwnershipUpdater { |
| 88 | 88 | } |
| 89 | 89 | |
| 90 | 90 | private void updateGroupOwnershipForEventHierarchyInternal(Event event) { |
| 91 | - if (!visitedEvents.add(event.getIdentifier())) { |
|
| 92 | - return; |
|
| 91 | + if (visitedEvents.add(event)) { |
|
| 92 | + updateGroupOwner(event.getIdentifier()); |
|
| 93 | + SailingHierarchyWalker.walkFromEvent(event, /* includeLeaderboardGroupsWithOverallLeaderboard */ false, |
|
| 94 | + new EventHierarchyVisitor() { |
|
| 95 | + @Override |
|
| 96 | + public void visit(Leaderboard leaderboard, Set<LeaderboardGroup> leaderboardGroups) { |
|
| 97 | + updateGroupOwnershipForLeaderboardHierarchyInternal(leaderboard); |
|
| 98 | + } |
|
| 99 | + |
|
| 100 | + @Override |
|
| 101 | + public void visit(LeaderboardGroup leaderboardGroup) { |
|
| 102 | + // leaderboard groups with overall leaderboard may be visited if all their leaderboards belong |
|
| 103 | + // to the "event", but the process won't recurse back into "event" as we pass it explicitly as |
|
| 104 | + // an event not to visit |
|
| 105 | + updateGroupOwnershipForLeaderboardGroupHierarchyInternal(leaderboardGroup, /* exclude */ event); |
|
| 106 | + } |
|
| 107 | + }); |
|
| 93 | 108 | } |
| 94 | - updateGroupOwner(event.getIdentifier()); |
|
| 95 | - SailingHierarchyWalker.walkFromEvent(event, /* includeLeaderboardGroupsWithOverallLeaderboard */ false, |
|
| 96 | - new EventHierarchyVisitor() { |
|
| 97 | - @Override |
|
| 98 | - public void visit(Leaderboard leaderboard, Set<LeaderboardGroup> leaderboardGroups) { |
|
| 99 | - updateGroupOwnershipForLeaderboardHierarchyInternal(leaderboard); |
|
| 100 | - } |
|
| 101 | - |
|
| 102 | - @Override |
|
| 103 | - public void visit(LeaderboardGroup leaderboardGroup) { |
|
| 104 | - // leaderboard groups with overall leaderboard may be visited if all their leaderboards belong |
|
| 105 | - // to the "event", but the process won't recurse back into "event" as we pass it explicitly as |
|
| 106 | - // an event not to visit |
|
| 107 | - updateGroupOwnershipForLeaderboardGroupHierarchyInternal(leaderboardGroup, /* exclude */ event); |
|
| 108 | - } |
|
| 109 | - }); |
|
| 110 | 109 | } |
| 111 | 110 | |
| 112 | 111 | public void updateGroupOwnershipForLeaderboardGroupHierarchy(LeaderboardGroup leaderboardGroup) { |
| ... | ... | @@ -115,27 +114,26 @@ public class SailingHierarchyOwnershipUpdater { |
| 115 | 114 | } |
| 116 | 115 | |
| 117 | 116 | private void updateGroupOwnershipForLeaderboardGroupHierarchyInternal(LeaderboardGroup leaderboardGroup, Event eventToExclude) { |
| 118 | - if (!visitedLeaderboardGroups.add(leaderboardGroup.getIdentifier())) { |
|
| 119 | - return; |
|
| 120 | - } |
|
| 121 | - updateGroupOwner(leaderboardGroup.getIdentifier()); |
|
| 122 | - SailingHierarchyWalker.walkFromLeaderboardGroup(service, leaderboardGroup, |
|
| 123 | - /* includeEventsIfLeaderboardGroupHasOverallLeaderboard */ true, |
|
| 124 | - new LeaderboardGroupHierarchyVisitor() { |
|
| 125 | - @Override |
|
| 126 | - public void visit(Leaderboard leaderboard) { |
|
| 127 | - updateGroupOwnershipForLeaderboardHierarchyInternal(leaderboard); |
|
| 128 | - } |
|
| 129 | - |
|
| 130 | - @Override |
|
| 131 | - public void visit(Event event) { |
|
| 132 | - if (event != eventToExclude) { |
|
| 133 | - // Only events of LeaderboardGroups with overall leaderboard are visited -> no infinite |
|
| 134 | - // recursion occurs |
|
| 135 | - updateGroupOwnershipForEventHierarchyInternal(event); |
|
| 117 | + if (visitedLeaderboardGroups.add(leaderboardGroup)) { |
|
| 118 | + updateGroupOwner(leaderboardGroup.getIdentifier()); |
|
| 119 | + SailingHierarchyWalker.walkFromLeaderboardGroup(service, leaderboardGroup, |
|
| 120 | + /* includeEventsIfLeaderboardGroupHasOverallLeaderboard */ true, |
|
| 121 | + new LeaderboardGroupHierarchyVisitor() { |
|
| 122 | + @Override |
|
| 123 | + public void visit(Leaderboard leaderboard) { |
|
| 124 | + updateGroupOwnershipForLeaderboardHierarchyInternal(leaderboard); |
|
| 136 | 125 | } |
| 137 | - } |
|
| 138 | - }); |
|
| 126 | + |
|
| 127 | + @Override |
|
| 128 | + public void visit(Event event) { |
|
| 129 | + if (event != eventToExclude) { |
|
| 130 | + // Only events of LeaderboardGroups with overall leaderboard are visited -> no infinite |
|
| 131 | + // recursion occurs |
|
| 132 | + updateGroupOwnershipForEventHierarchyInternal(event); |
|
| 133 | + } |
|
| 134 | + } |
|
| 135 | + }); |
|
| 136 | + } |
|
| 139 | 137 | } |
| 140 | 138 | |
| 141 | 139 | public void updateGroupOwnershipForLeaderboardHierarchy(Leaderboard leaderboard) { |
| ... | ... | @@ -144,34 +142,33 @@ public class SailingHierarchyOwnershipUpdater { |
| 144 | 142 | } |
| 145 | 143 | |
| 146 | 144 | private void updateGroupOwnershipForLeaderboardHierarchyInternal(Leaderboard leaderboard) { |
| 147 | - if (!visitedLeaderboards.add(leaderboard.getIdentifier())) { |
|
| 148 | - return; |
|
| 149 | - } |
|
| 150 | - updateGroupOwner(leaderboard.getIdentifier()); |
|
| 151 | - if (leaderboard instanceof RegattaLeaderboard) { |
|
| 152 | - RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard; |
|
| 153 | - updateGroupOwner(regattaLeaderboard.getRegatta().getIdentifier()); |
|
| 154 | - } |
|
| 155 | - SailingHierarchyWalker.walkFromLeaderboard(leaderboard, new LeaderboardHierarchyVisitor() { |
|
| 156 | - @Override |
|
| 157 | - public void visit(TrackedRace race) { |
|
| 158 | - updateGroupOwner(race.getIdentifier()); |
|
| 145 | + if (visitedLeaderboards.add(leaderboard)) { |
|
| 146 | + updateGroupOwner(leaderboard.getIdentifier()); |
|
| 147 | + if (leaderboard instanceof RegattaLeaderboard) { |
|
| 148 | + RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard; |
|
| 149 | + updateGroupOwner(regattaLeaderboard.getRegatta().getIdentifier()); |
|
| 159 | 150 | } |
| 160 | - |
|
| 161 | - @Override |
|
| 162 | - public void visit(Boat boat) { |
|
| 163 | - if (updateBoats) { |
|
| 164 | - updateGroupOwner(boat.getIdentifier()); |
|
| 151 | + SailingHierarchyWalker.walkFromLeaderboard(leaderboard, new LeaderboardHierarchyVisitor() { |
|
| 152 | + @Override |
|
| 153 | + public void visit(TrackedRace race) { |
|
| 154 | + updateGroupOwner(race.getIdentifier()); |
|
| 165 | 155 | } |
| 166 | - } |
|
| 167 | - |
|
| 168 | - @Override |
|
| 169 | - public void visit(Competitor competitor) { |
|
| 170 | - if (updateCompetitors) { |
|
| 171 | - updateGroupOwner(competitor.getIdentifier()); |
|
| 156 | + |
|
| 157 | + @Override |
|
| 158 | + public void visit(Boat boat) { |
|
| 159 | + if (updateBoats) { |
|
| 160 | + updateGroupOwner(boat.getIdentifier()); |
|
| 161 | + } |
|
| 172 | 162 | } |
| 173 | - } |
|
| 174 | - }); |
|
| 163 | + |
|
| 164 | + @Override |
|
| 165 | + public void visit(Competitor competitor) { |
|
| 166 | + if (updateCompetitors) { |
|
| 167 | + updateGroupOwner(competitor.getIdentifier()); |
|
| 168 | + } |
|
| 169 | + } |
|
| 170 | + }); |
|
| 171 | + } |
|
| 175 | 172 | } |
| 176 | 173 | |
| 177 | 174 | private void updateGroupOwner(QualifiedObjectIdentifier id) { |