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();
+    }
+    
     
 
 }