Skip to content

Commit aa64fdf

Browse files
authored
OAK-11810 resolve UserMonitor lazily (#2395)
* OAK-11810 resolve UserMonitor lazily * OAK-11810 move the lamdba into its own private method to reduce Cyclomatic Complexity
1 parent 06b7ff2 commit aa64fdf

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import java.util.Map;
7878
import java.util.Set;
7979
import java.util.TreeSet;
80+
import java.util.function.Supplier;
8081

8182
import static java.util.Objects.requireNonNull;
8283
import static java.util.concurrent.TimeUnit.NANOSECONDS;
@@ -169,7 +170,8 @@ class UserImporter implements ProtectedPropertyImporter, ProtectedNodeImporter,
169170
*/
170171
private final Map<String, Principal> principals = new HashMap<>();
171172

172-
private UserMonitor userMonitor = UserMonitor.NOOP;
173+
private UserMonitor userMonitor; // do not access directly, but only via the userMonitorSupplier
174+
private Supplier<UserMonitor> userMonitorSupplier;
173175

174176
UserImporter(ConfigurationParameters config) {
175177
importBehavior = UserUtil.getImportBehavior(config);
@@ -207,18 +209,35 @@ public boolean init(@NotNull Session session, @NotNull Root root, @NotNull NameP
207209
return false;
208210
}
209211

210-
if (securityProvider instanceof WhiteboardAware) {
211-
Whiteboard whiteboard = ((WhiteboardAware) securityProvider).getWhiteboard();
212-
UserMonitor monitor = WhiteboardUtils.getService(whiteboard, UserMonitor.class);
213-
if (monitor != null) {
214-
userMonitor = monitor;
215-
}
216-
}
212+
/*
213+
* resolve the userMonitor lazily, as resolving that service via the OSGi service registry
214+
* can be costly; this is often a redundant operation, because a UserImporter is typically much more
215+
* frequent initialized than actually used.
216+
*/
217+
userMonitorSupplier = getUserMonitorSupplier(securityProvider);
217218

218219
initialized = true;
219220
return initialized;
220221
}
221222

223+
private Supplier<UserMonitor> getUserMonitorSupplier(SecurityProvider securityProvider) {
224+
return () -> {
225+
if (userMonitor == null) {
226+
if (securityProvider instanceof WhiteboardAware) {
227+
Whiteboard whiteboard = ((WhiteboardAware) securityProvider).getWhiteboard();
228+
UserMonitor monitor = WhiteboardUtils.getService(whiteboard, UserMonitor.class);
229+
if (monitor != null) {
230+
userMonitor = monitor;
231+
}
232+
}
233+
if (userMonitor == null) { // always fall back to the NOOP version
234+
userMonitor = UserMonitor.NOOP;
235+
}
236+
}
237+
return userMonitor;
238+
};
239+
}
240+
222241
private static boolean canInitUserManager(@NotNull JackrabbitSession session, boolean isWorkspaceImport) {
223242
try {
224243
if (!isWorkspaceImport && session.getUserManager().isAutoSave()) {
@@ -647,7 +666,7 @@ void process() throws RepositoryException {
647666
memberContentIds.removeAll(failedContentIds);
648667

649668
userManager.onGroupUpdate(gr, false, true, memberContentIds, failedContentIds);
650-
userMonitor.doneUpdateMembers(watch.elapsed(NANOSECONDS), totalSize, failedContentIds.size(), false);
669+
userMonitorSupplier.get().doneUpdateMembers(watch.elapsed(NANOSECONDS), totalSize, failedContentIds.size(), false);
651670
}
652671
}
653672

oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterMembershipMonitoringTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import java.lang.reflect.Field;
2828

29-
import static org.junit.Assert.assertSame;
29+
import static org.junit.Assert.assertNull;
3030
import static org.mockito.ArgumentMatchers.anyBoolean;
3131
import static org.mockito.ArgumentMatchers.anyLong;
3232
import static org.mockito.Mockito.atLeastOnce;
@@ -84,11 +84,10 @@ private static void replaceUserMonitor(@NotNull UserConfigurationImpl uc, @NotNu
8484
boolean init(boolean createAction, Class<?>... extraInterfaces) throws Exception {
8585
boolean b = super.init(createAction, extraInterfaces);
8686

87-
// verify that the usermonitor has been properly initialized and replace it with the spied instance
87+
// verify that the userMonitor is not initialized on init, but only on demand
8888
Field f = UserImporter.class.getDeclaredField("userMonitor");
8989
f.setAccessible(true);
90-
assertSame(userMonitor, f.get(importer));
91-
90+
assertNull(f.get(importer));
9291
return b;
9392
}
9493
}

0 commit comments

Comments
 (0)