You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/01/27 12:26:17 UTC
[isis] branch master updated: ISIS-2158: UserServiceDefault:
cleanup thread-local on end-of-life
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new dd56a70 ISIS-2158: UserServiceDefault: cleanup thread-local on end-of-life
dd56a70 is described below
commit dd56a7004b22cf75cfa17ddcd756fd7d3f448a21
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jan 27 13:26:06 2020 +0100
ISIS-2158: UserServiceDefault: cleanup thread-local on end-of-life
---
.../services/user/UserServiceDefault.java | 87 +++++++++++-----------
1 file changed, 44 insertions(+), 43 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/user/UserServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/user/UserServiceDefault.java
index 63e2607..842a8e4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/user/UserServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/user/UserServiceDefault.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
+import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;
@@ -49,6 +50,31 @@ import lombok.val;
public class UserServiceDefault implements UserService {
@Inject private AuthenticationSessionProvider authenticationSessionProvider;
+
+ @Service
+ @Named("isisMetaModel.UserServiceDefault.SudoServiceSpi")
+ @Order(OrderPrecedence.MIDPOINT)
+ @Qualifier("UserServiceDefault")
+ public static class SudoServiceSpi implements SudoService.Spi {
+
+ @Inject UserServiceDefault userServiceDefault;
+
+ @Override
+ public void runAs(final String username, final List<String> roles) {
+ userServiceDefault.overrideUserAndRoles(username, roles);
+ }
+
+ @Override
+ public void releaseRunAs() {
+ userServiceDefault.resetOverrides();
+ }
+
+ }
+
+ @PreDestroy
+ public void cleanUp() {
+ overrides.remove();
+ }
@Override
public UserMemento getUser() {
@@ -77,13 +103,6 @@ public class UserServiceDefault implements UserService {
}
}
- private Can<String> previousRoles() {
- val authenticationSession =
- authenticationSessionProvider.getAuthenticationSession();
- val roles = authenticationSession.getRoles();
- return roles;
- }
-
public static class UserAndRoleOverrides {
final String user;
final Can<String> roles;
@@ -107,23 +126,6 @@ public class UserServiceDefault implements UserService {
}
}
- private final ThreadLocal<Stack<UserAndRoleOverrides>> overrides =
- new ThreadLocal<Stack<UserAndRoleOverrides>>() {
- @Override protected Stack<UserAndRoleOverrides> initialValue() {
- return new Stack<>();
- }
- };
-
-
- private void overrideUserAndRoles(final String user, final List<String> rolesIfAny) {
- final Iterable<String> roles = rolesIfAny != null ? rolesIfAny : inheritRoles();
- this.overrides.get().push(new UserAndRoleOverrides(user, roles));
- }
-
- private void resetOverrides() {
- this.overrides.get().pop();
- }
-
/**
* Not API; for use by the implementation of sudo/runAs (see {@link SudoService} etc.
*/
@@ -133,6 +135,15 @@ public class UserServiceDefault implements UserService {
? userAndRoleOverrides.peek()
: null;
}
+
+ // -- HELPER
+
+ private Can<String> previousRoles() {
+ val authenticationSession =
+ authenticationSessionProvider.getAuthenticationSession();
+ val roles = authenticationSession.getRoles();
+ return roles;
+ }
private Can<String> inheritRoles() {
final UserAndRoleOverrides currentOverridesIfAny = currentOverridesIfAny();
@@ -150,28 +161,18 @@ public class UserServiceDefault implements UserService {
}
return mementos;
}
+
+ private final ThreadLocal<Stack<UserAndRoleOverrides>> overrides = ThreadLocal.withInitial(Stack::new);
-
- @Service
- @Named("isisMetaModel.UserServiceDefault.SudoServiceSpi")
- @Order(OrderPrecedence.MIDPOINT)
- @Qualifier("UserServiceDefault")
- public static class SudoServiceSpi implements SudoService.Spi {
-
- @Override
- public void runAs(final String username, final List<String> roles) {
- userServiceDefault.overrideUserAndRoles(username, roles);
- }
-
- @Override
- public void releaseRunAs() {
- userServiceDefault.resetOverrides();
- }
-
- @Inject
- UserServiceDefault userServiceDefault;
+ private void overrideUserAndRoles(final String user, final List<String> rolesIfAny) {
+ final Iterable<String> roles = rolesIfAny != null ? rolesIfAny : inheritRoles();
+ this.overrides.get().push(new UserAndRoleOverrides(user, roles));
}
+ private void resetOverrides() {
+ this.overrides.get().pop();
+ }
+
}