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) {