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 2022/01/13 09:49:43 UTC

[isis] branch master updated: ISIS-2905: move new-role and all-roles menu entries to RoleManager

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 78b4b20  ISIS-2905: move new-role and all-roles menu entries to RoleManager
78b4b20 is described below

commit 78b4b208da2c00fdfad006171ed00a87fe67fa8e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 13 10:49:32 2022 +0100

    ISIS-2905: move new-role and all-roles menu entries to RoleManager
    
    - also update 'locked user' icon
---
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   3 +-
 .../secman/applib/IsisModuleExtSecmanApplib.java   |  14 +++--
 .../man/ApplicationRoleManager.java}               |  10 +--
 .../ApplicationRoleManager.layout.fallback.xml}    |   2 +-
 .../mixins/ApplicationRoleManager_allRoles.java}   |  18 +++---
 .../man/mixins/ApplicationRoleManager_newRole.java |  67 +++++++++++++++++++++
 .../applib/role/menu/ApplicationRoleMenu.java      |  64 ++++++++------------
 .../user/{app => man}/ApplicationUserManager.java  |   2 +-
 .../ApplicationUserManager.layout.fallback.xml     |   0
 .../mixins/ApplicationUserManager_allUsers.java    |   4 +-
 .../ApplicationUserManager_newDelegateUser.java    |   6 +-
 .../ApplicationUserManager_newLocalUser.java       |   6 +-
 ...pplicationUserManager_newLocalUserAbstract.java |   2 +-
 .../applib/user/menu/ApplicationUserMenu.java      |   2 +-
 .../resources/images/ApplicationRoleManager.png    | Bin 0 -> 1287 bytes
 .../resources/images/ApplicationUser-locked.png    | Bin 1170 -> 7887 bytes
 16 files changed, 128 insertions(+), 72 deletions(-)

diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index d28f18e..5e9494f 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -340,9 +340,8 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
             </mb3:section>
             <mb3:section>
                 <mb3:named>Roles</mb3:named>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="roleManager"/>
                 <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="findRoles"/>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="newRole"/>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="allRoles"/>
             </mb3:section>
             <mb3:section>
                 <mb3:named>Permissions</mb3:named>
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java
index 6e7fbc3..e9fa913 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java
@@ -40,6 +40,8 @@ import org.apache.isis.extensions.secman.applib.role.dom.mixins.ApplicationRole_
 import org.apache.isis.extensions.secman.applib.role.dom.mixins.ApplicationRole_removeUsers;
 import org.apache.isis.extensions.secman.applib.role.dom.mixins.ApplicationRole_updateDescription;
 import org.apache.isis.extensions.secman.applib.role.dom.mixins.ApplicationRole_updateName;
+import org.apache.isis.extensions.secman.applib.role.man.mixins.ApplicationRoleManager_allRoles;
+import org.apache.isis.extensions.secman.applib.role.man.mixins.ApplicationRoleManager_newRole;
 import org.apache.isis.extensions.secman.applib.role.menu.ApplicationRoleMenu;
 import org.apache.isis.extensions.secman.applib.seed.SeedSecurityModuleService;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTenancy_addChild;
@@ -50,10 +52,6 @@ import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTe
 import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTenancy_updateName;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTenancy_users;
 import org.apache.isis.extensions.secman.applib.tenancy.menu.ApplicationTenancyMenu;
-import org.apache.isis.extensions.secman.applib.user.app.ApplicationUserManager;
-import org.apache.isis.extensions.secman.applib.user.app.mixins.ApplicationUserManager_allUsers;
-import org.apache.isis.extensions.secman.applib.user.app.mixins.ApplicationUserManager_newDelegateUser;
-import org.apache.isis.extensions.secman.applib.user.app.mixins.ApplicationUserManager_newLocalUser;
 import org.apache.isis.extensions.secman.applib.user.contributions.HasUsername_open;
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_addRole;
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_delete;
@@ -74,6 +72,10 @@ import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.perms.ApplicationUser_effectiveMemberPermissions;
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.perms.ApplicationUser_filterEffectiveMemberPermissions;
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.perms.UserPermissionViewModel;
+import org.apache.isis.extensions.secman.applib.user.man.ApplicationUserManager;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_allUsers;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_newDelegateUser;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_newLocalUser;
 import org.apache.isis.extensions.secman.applib.user.menu.ApplicationUserMenu;
 import org.apache.isis.extensions.secman.applib.user.menu.MeService;
 import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
@@ -168,6 +170,10 @@ import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
         ApplicationUserManager_newDelegateUser.class,
         ApplicationUserManager_newLocalUser.class,
 
+        // ApplicationRoleManager
+        ApplicationRoleManager_allRoles.class,
+        ApplicationRoleManager_newRole.class,
+
         // other @Services
         SeedSecurityModuleService.class,
 
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java
similarity index 83%
copy from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.java
copy to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java
index 5b598b5..1f2cbd9 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app;
+package org.apache.isis.extensions.secman.applib.role.man;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
@@ -25,14 +25,14 @@ import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 
 @DomainObject(
         nature = Nature.VIEW_MODEL,
-        logicalTypeName = ApplicationUserManager.LOGICAL_TYPE_NAME
+        logicalTypeName = ApplicationRoleManager.LOGICAL_TYPE_NAME
 )
-public class ApplicationUserManager {
+public class ApplicationRoleManager {
 
-    public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationUserManager";
+    public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationRoleManager";
 
     @ObjectSupport public String title() {
-        return "Application User Manager";
+        return "Application Role Manager";
     }
 
     // behaviour provided by mixins
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.layout.fallback.xml b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.layout.fallback.xml
similarity index 98%
copy from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.layout.fallback.xml
copy to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.layout.fallback.xml
index 767a179..6e7b4ee 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.layout.fallback.xml
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.layout.fallback.xml
@@ -22,7 +22,7 @@
 	<bs3:row>
 		<bs3:col span="12">
 			<bs3:tabGroup unreferencedCollections="true">
-				<bs3:tab name="All Users">
+				<bs3:tab name="All Roles">
 					<bs3:row>
 						<bs3:col span="12" size="MD" />
 					</bs3:row>
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_allUsers.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/mixins/ApplicationRoleManager_allRoles.java
similarity index 65%
copy from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_allUsers.java
copy to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/mixins/ApplicationRoleManager_allRoles.java
index 176dd4c..d8dbaab 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_allUsers.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/mixins/ApplicationRoleManager_allRoles.java
@@ -16,31 +16,31 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app.mixins;
+package org.apache.isis.extensions.secman.applib.role.man.mixins;
 
 import java.util.Collection;
 
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.MemberSupport;
-import org.apache.isis.extensions.secman.applib.user.app.ApplicationUserManager;
-import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
-import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
+import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
+import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRoleRepository;
+import org.apache.isis.extensions.secman.applib.role.man.ApplicationRoleManager;
 
 import lombok.RequiredArgsConstructor;
 
 @org.apache.isis.applib.annotation.Collection
 @RequiredArgsConstructor
-public class ApplicationUserManager_allUsers {
+public class ApplicationRoleManager_allRoles {
 
     @SuppressWarnings("unused")
-    private final ApplicationUserManager target;
+    private final ApplicationRoleManager target;
 
     @Inject
-    private ApplicationUserRepository applicationUserRepository;
+    private ApplicationRoleRepository applicationRoleRepository;
 
-    @MemberSupport public Collection<ApplicationUser> coll() {
-        return applicationUserRepository.allUsers();
+    @MemberSupport public Collection<ApplicationRole> coll() {
+        return applicationRoleRepository.allRoles();
     }
 
 }
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/mixins/ApplicationRoleManager_newRole.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/mixins/ApplicationRoleManager_newRole.java
new file mode 100644
index 0000000..5c47fce
--- /dev/null
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/mixins/ApplicationRoleManager_newRole.java
@@ -0,0 +1,67 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.secman.applib.role.man.mixins;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.MemberSupport;
+import org.apache.isis.applib.annotation.Optionality;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
+import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
+import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRoleRepository;
+import org.apache.isis.extensions.secman.applib.role.man.ApplicationRoleManager;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_newLocalUser.DomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(
+        domainEvent = DomainEvent.class,
+        semantics = SemanticsOf.IDEMPOTENT
+)
+@ActionLayout(
+        associateWith = "allRoles",
+        sequence = "1"
+)
+@RequiredArgsConstructor
+public class ApplicationRoleManager_newRole {
+
+    public static class DomainEvent
+            extends IsisModuleExtSecmanApplib.ActionDomainEvent<ApplicationRoleManager_newRole> {}
+
+    @Inject private ApplicationRoleRepository applicationRoleRepository;
+
+    private final ApplicationRoleManager target;
+
+    @MemberSupport public ApplicationRoleManager act (
+            @Parameter(maxLength = ApplicationRole.Name.MAX_LENGTH)
+            @ParameterLayout(named="Name", typicalLength= ApplicationRole.Name.TYPICAL_LENGTH)
+            final String name,
+            @Parameter(maxLength = ApplicationRole.Description.MAX_LENGTH, optionality = Optionality.OPTIONAL)
+            @ParameterLayout(named="Description", typicalLength= ApplicationRole.Description.TYPICAL_LENGTH)
+            final String description) {
+        applicationRoleRepository.newRole(name, description);
+        return target;
+    }
+
+}
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
index 18af54c..7deb1d5 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/menu/ApplicationRoleMenu.java
@@ -29,14 +29,15 @@ import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.ObjectSupport;
-import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRoleRepository;
+import org.apache.isis.extensions.secman.applib.role.man.ApplicationRoleManager;
 
 import lombok.RequiredArgsConstructor;
 
@@ -57,6 +58,7 @@ public class ApplicationRoleMenu {
     public static abstract class ActionDomainEvent<T> extends IsisModuleExtSecmanApplib.ActionDomainEvent<T> {}
 
     private final ApplicationRoleRepository applicationRoleRepository;
+    private final FactoryService factory;
 
 
     @ObjectSupport public String iconName() {
@@ -64,62 +66,44 @@ public class ApplicationRoleMenu {
     }
 
 
+    // -- ROLE MANAGER
 
     @Action(
-            domainEvent = findRoles.ActionEvent.class,
-            semantics = SemanticsOf.SAFE
-            )
-    @ActionLayout(sequence = "100.20.1")
-    public class findRoles {
+            domainEvent = roleManager.ActionEvent.class,
+            semantics = SemanticsOf.IDEMPOTENT
+    )
+    @ActionLayout(
+            sequence = "100.20.1",
+            cssClassFa = "user-tag"
+    )
+    public class roleManager{
 
-        public class ActionEvent extends ActionDomainEvent<findRoles> {}
+        public class ActionEvent extends ActionDomainEvent<roleManager> { }
 
-        @MemberSupport public Collection<? extends ApplicationRole> act(
-                @Parameter(maxLength = ApplicationRole.Name.MAX_LENGTH)
-                @ParameterLayout(named = "Search", typicalLength = ApplicationRole.Name.TYPICAL_LENGTH)
-                final String search) {
-            return applicationRoleRepository.findNameContaining(search);
+        @MemberSupport public ApplicationRoleManager act(){
+            return factory.viewModel(new ApplicationRoleManager());
         }
 
     }
 
+    // -- FIND ROLES
 
     @Action(
-            domainEvent = newRole.ActionEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT
+            domainEvent = findRoles.ActionEvent.class,
+            semantics = SemanticsOf.SAFE
             )
     @ActionLayout(sequence = "100.20.2")
-    public class newRole{
+    public class findRoles {
 
-        public class ActionEvent extends ActionDomainEvent<newRole> {}
+        public class ActionEvent extends ActionDomainEvent<findRoles> {}
 
-        @MemberSupport public ApplicationRole act (
+        @MemberSupport public Collection<? extends ApplicationRole> act(
                 @Parameter(maxLength = ApplicationRole.Name.MAX_LENGTH)
-                @ParameterLayout(named="Name", typicalLength= ApplicationRole.Name.TYPICAL_LENGTH)
-                final String name,
-                @Parameter(maxLength = ApplicationRole.Description.MAX_LENGTH, optionality = Optionality.OPTIONAL)
-                @ParameterLayout(named="Description", typicalLength= ApplicationRole.Description.TYPICAL_LENGTH)
-                final String description) {
-            return applicationRoleRepository.newRole(name, description);
-        }
-    }
-
-
-
-    @Action(
-            domainEvent = allRoles.ActionEvent.class,
-            semantics = SemanticsOf.SAFE
-            )
-    @ActionLayout(sequence = "100.20.3")
-    public class allRoles {
-
-        public class ActionEvent extends ActionDomainEvent<allRoles> {}
-
-        @MemberSupport public Collection<? extends ApplicationRole> act() {
-            return applicationRoleRepository.allRoles();
+                @ParameterLayout(named = "Search", typicalLength = ApplicationRole.Name.TYPICAL_LENGTH)
+                final String search) {
+            return applicationRoleRepository.findNameContaining(search);
         }
 
     }
 
-
 }
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java
similarity index 96%
rename from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.java
rename to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java
index 5b598b5..770697b 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app;
+package org.apache.isis.extensions.secman.applib.user.man;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.layout.fallback.xml b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.layout.fallback.xml
similarity index 100%
rename from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/ApplicationUserManager.layout.fallback.xml
rename to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.layout.fallback.xml
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_allUsers.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_allUsers.java
similarity index 92%
rename from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_allUsers.java
rename to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_allUsers.java
index 176dd4c..d1ff880 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_allUsers.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_allUsers.java
@@ -16,16 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app.mixins;
+package org.apache.isis.extensions.secman.applib.user.man.mixins;
 
 import java.util.Collection;
 
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.MemberSupport;
-import org.apache.isis.extensions.secman.applib.user.app.ApplicationUserManager;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
+import org.apache.isis.extensions.secman.applib.user.man.ApplicationUserManager;
 
 import lombok.RequiredArgsConstructor;
 
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newDelegateUser.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newDelegateUser.java
similarity index 95%
rename from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newDelegateUser.java
rename to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newDelegateUser.java
index 4d18d90..4475198 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newDelegateUser.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newDelegateUser.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app.mixins;
+package org.apache.isis.extensions.secman.applib.user.man.mixins;
 
 import javax.inject.Inject;
 
@@ -31,11 +31,11 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRoleRepository;
-import org.apache.isis.extensions.secman.applib.user.app.ApplicationUserManager;
-import org.apache.isis.extensions.secman.applib.user.app.mixins.ApplicationUserManager_newDelegateUser.DomainEvent;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus;
+import org.apache.isis.extensions.secman.applib.user.man.ApplicationUserManager;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_newDelegateUser.DomainEvent;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newLocalUser.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newLocalUser.java
similarity index 96%
rename from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newLocalUser.java
rename to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newLocalUser.java
index cce5665..5e9a105 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newLocalUser.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newLocalUser.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app.mixins;
+package org.apache.isis.extensions.secman.applib.user.man.mixins;
 
 import java.util.Objects;
 
@@ -35,12 +35,12 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole;
 import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRoleRepository;
-import org.apache.isis.extensions.secman.applib.user.app.ApplicationUserManager;
-import org.apache.isis.extensions.secman.applib.user.app.mixins.ApplicationUserManager_newLocalUser.DomainEvent;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus;
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_updateEmailAddress;
+import org.apache.isis.extensions.secman.applib.user.man.ApplicationUserManager;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_newLocalUser.DomainEvent;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newLocalUserAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newLocalUserAbstract.java
similarity index 95%
rename from extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newLocalUserAbstract.java
rename to extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newLocalUserAbstract.java
index 5f7c0e6..cc78510 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/app/mixins/ApplicationUserManager_newLocalUserAbstract.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/mixins/ApplicationUserManager_newLocalUserAbstract.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.extensions.secman.applib.user.app.mixins;
+package org.apache.isis.extensions.secman.applib.user.man.mixins;
 
 /**
  * @apiNote This mixin requires concrete implementations associated with JPA and JDO,
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
index 39cf2ad..b444dd9 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
@@ -34,9 +34,9 @@ import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
-import org.apache.isis.extensions.secman.applib.user.app.ApplicationUserManager;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository;
+import org.apache.isis.extensions.secman.applib.user.man.ApplicationUserManager;
 
 import lombok.RequiredArgsConstructor;
 
diff --git a/extensions/security/secman/integration/src/main/resources/images/ApplicationRoleManager.png b/extensions/security/secman/integration/src/main/resources/images/ApplicationRoleManager.png
new file mode 100644
index 0000000..9cd459a
Binary files /dev/null and b/extensions/security/secman/integration/src/main/resources/images/ApplicationRoleManager.png differ
diff --git a/extensions/security/secman/integration/src/main/resources/images/ApplicationUser-locked.png b/extensions/security/secman/integration/src/main/resources/images/ApplicationUser-locked.png
index 94e8aac..8fd5bf5 100644
Binary files a/extensions/security/secman/integration/src/main/resources/images/ApplicationUser-locked.png and b/extensions/security/secman/integration/src/main/resources/images/ApplicationUser-locked.png differ