You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/04/14 22:25:31 UTC

[isis] branch ISIS-2614 created (now 658d594)

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a change to branch ISIS-2614
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at 658d594  ISIS-2614 : cleans up secman imports and references

This branch includes the following new commits:

     new 658d594  ISIS-2614 : cleans up secman imports and references

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[isis] 01/01: ISIS-2614 : cleans up secman imports and references

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2614
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 658d594b4deab989371fbf7679b2016a68498ea7
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Apr 14 23:25:04 2021 +0100

    ISIS-2614 : cleans up secman imports and references
---
 .../secman/api/role/ApplicationRoleRepository.java |  5 ++++
 .../secman/api/user/ApplicationUserRepository.java |  8 ++++++
 .../secman/model/IsisModuleExtSecmanModel.java     | 30 +++++++++++++++++---
 .../dom/feature/ApplicationFeatureViewModel.java   | 25 +++++++----------
 .../model/dom/feature/ApplicationTypeMember.java   |  7 ++---
 .../secman/model/dom/role/ApplicationRoleMenu.java | 10 ++++---
 extensions/security/secman/persistence-jdo/pom.xml | 23 ++++++++--------
 .../jdo/IsisModuleExtSecmanPersistenceJdo.java     | 32 ++++++++++++++++++----
 .../jdo/dom/role/ApplicationRoleRepository.java    | 28 +++++++++++--------
 .../AbstractRoleAndPermissionsFixtureScript.java   | 14 ++++------
 extensions/security/secman/persistence-jpa/pom.xml | 29 +++++++++-----------
 .../jpa/IsisModuleExtSecmanPersistenceJpa.java     | 17 ++++++++----
 12 files changed, 143 insertions(+), 85 deletions(-)

diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRoleRepository.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRoleRepository.java
index 75b16a1..da3e1e7 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRoleRepository.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRoleRepository.java
@@ -50,6 +50,11 @@ public interface ApplicationRoleRepository<R extends ApplicationRole> {
     Optional<R> findByName(String roleName);
     Optional<R> findByNameCached(String roleName);
 
+    default R upsert(final String name, final String roleDescription) {
+        return findByName(name)
+                .orElseGet(() -> newRole(name, roleDescription));
+    }
+
     void addRoleToUser(ApplicationRole role, ApplicationUser user);
     void removeRoleFromUser(ApplicationRole role, ApplicationUser user);
 
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUserRepository.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUserRepository.java
index 7d0b7cf..791620b 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUserRepository.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/user/ApplicationUserRepository.java
@@ -65,6 +65,14 @@ public interface ApplicationUserRepository<U extends ApplicationUser> {
 
     U newUser(String username, AccountType accountType, Consumer<U> beforePersist);
 
+    default U upsertLocal(
+            @NonNull String username,
+            @Nullable Password password,
+            @NonNull ApplicationUserStatus status) {
+        return findByUsername(username)
+                .orElseGet(() -> newLocalUser(username, password, status));
+    }
+
     default U newLocalUser(
             @NonNull String username,
             @Nullable Password password,
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/IsisModuleExtSecmanModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/IsisModuleExtSecmanModel.java
index 642daec..e7f9dc1 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/IsisModuleExtSecmanModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/IsisModuleExtSecmanModel.java
@@ -20,15 +20,37 @@ package org.apache.isis.extensions.secman.model;
 
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
+import org.apache.isis.extensions.secman.model.dom.feature.ApplicationFeatureViewModels;
+import org.apache.isis.extensions.secman.model.dom.permission.ApplicationOrphanedPermissionManager;
+import org.apache.isis.extensions.secman.model.dom.permission.ApplicationPermissionMenu;
+import org.apache.isis.extensions.secman.model.dom.role.ApplicationRoleMenu;
+import org.apache.isis.extensions.secman.model.dom.tenancy.ApplicationTenancyMenu;
+import org.apache.isis.extensions.secman.model.dom.user.ApplicationUserMenu;
+import org.apache.isis.extensions.secman.model.facets.TenantedAuthorizationFacetFactory;
 
 /**
  * @since 2.0 {@index}
  */
 @Configuration
-@ComponentScan(
-        basePackageClasses= {
-                IsisModuleExtSecmanModel.class
-        })
+@Import({
+        // Module
+        IsisModuleExtSecmanApi.class,
+
+        // @DomainService
+        ApplicationFeatureViewModels.class,
+        ApplicationOrphanedPermissionManager.class,
+        ApplicationPermissionMenu.class,
+        ApplicationRoleMenu.class,
+        ApplicationTenancyMenu.class,
+        ApplicationUserMenu.class,
+
+        // @Component
+        TenantedAuthorizationFacetFactory.Register.class,
+
+})
 public class IsisModuleExtSecmanModel {
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java
index 955c8c1..dbcd3be 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java
@@ -53,11 +53,6 @@ import lombok.val;
 /**
  * View model identified by {@link ApplicationFeatureId} and backed by an {@link ApplicationFeature}.
  */
-//@MemberGroupLayout(
-//        columnSpans = {6,0,6,12},
-//        left = {"Id", "Data Type", "Metadata"},
-//        right= {"Parent", "Contributed", "Detail"}
-//)
 public abstract class ApplicationFeatureViewModel implements ViewModel {
 
     public static abstract class PropertyDomainEvent<S extends ApplicationFeatureViewModel,T> extends IsisModuleExtSecmanApi.PropertyDomainEvent<S, T> {}
@@ -86,8 +81,8 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
         case TYPE:
             return ApplicationType.class;
         case MEMBER:
-            
-            val memberSort = 
+
+            val memberSort =
             Optional.ofNullable(applicationFeatureRepository.findFeature(featureId))
                 .flatMap(ApplicationFeature::getMemberSort)
                 .orElse(null);
@@ -182,7 +177,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
             )
     @PropertyLayout(
             typicalLength=ApplicationFeatureConstants.TYPICAL_LENGTH_NAMESPACE,
-            fieldSetId="Id", 
+            fieldSetId="Id",
             sequence = "2.2")
     public String getNamespaceName() {
         return getFeatureId().getNamespace();
@@ -201,7 +196,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
             )
     @PropertyLayout(
             typicalLength=ApplicationFeatureConstants.TYPICAL_LENGTH_TYPE_SIMPLE_NAME,
-            fieldSetId="Id", 
+            fieldSetId="Id",
             sequence = "2.3")
     public String getTypeSimpleName() {
         return getFeatureId().getTypeSimpleName();
@@ -222,7 +217,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
             )
     @PropertyLayout(
             typicalLength=ApplicationFeatureConstants.TYPICAL_LENGTH_MEMBER_NAME,
-            fieldSetId="Id", 
+            fieldSetId="Id",
             sequence = "2.4")
     public String getMemberName() {
         return getFeatureId().getMemberName();
@@ -243,7 +238,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     @PropertyLayout(
             navigable = Navigable.PARENT,
             hidden = Where.ALL_TABLES,
-            fieldSetId = "Parent", 
+            fieldSetId = "Parent",
             sequence = "2.6")
     public ApplicationFeatureViewModel getParent() {
         final ApplicationFeatureId parentId;
@@ -257,7 +252,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
         if (feature == null) {
             return null;
         }
-        final Class<? extends ApplicationFeatureViewModel> cls = 
+        final Class<? extends ApplicationFeatureViewModel> cls =
                 viewModelClassFor(parentId, featureRepository);
         return factory.viewModel(cls, parentId.asEncodedString());
     }
@@ -332,16 +327,16 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
         private Functions(){}
 
         public static <T extends ApplicationFeatureViewModel> Function<ApplicationFeatureId, T> asViewModelForId(
-                final ApplicationFeatureRepository applicationFeatureRepository, 
+                final ApplicationFeatureRepository applicationFeatureRepository,
                 final FactoryService factoryService) {
 
-            return (ApplicationFeatureId input) -> 
+            return (ApplicationFeatureId input) ->
             _Casts.uncheckedCast(ApplicationFeatureViewModel
                     .newViewModel(input, applicationFeatureRepository, factoryService));
 
         }
         public static <T extends ApplicationFeatureViewModel> Function<ApplicationFeature, T> asViewModel(
-                final ApplicationFeatureRepository applicationFeatureRepository, 
+                final ApplicationFeatureRepository applicationFeatureRepository,
                 final FactoryService factoryService) {
 
             return (ApplicationFeature input) ->
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationTypeMember.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationTypeMember.java
index a9aa8b8..4c4b66c 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationTypeMember.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationTypeMember.java
@@ -25,12 +25,15 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
+import lombok.NoArgsConstructor;
+
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationTypeMember"
         )
 @DomainObjectLayout(
         bookmarking = BookmarkPolicy.AS_CHILD
         )
+@NoArgsConstructor
 public abstract class ApplicationTypeMember extends ApplicationFeatureViewModel {
 
     public static abstract class PropertyDomainEvent<S extends ApplicationTypeMember, T> extends ApplicationFeatureViewModel.PropertyDomainEvent<ApplicationTypeMember, T> {}
@@ -40,11 +43,7 @@ public abstract class ApplicationTypeMember extends ApplicationFeatureViewModel
     public static abstract class ActionDomainEvent<S extends ApplicationTypeMember> extends ApplicationFeatureViewModel.ActionDomainEvent<S> {}
 
 
-
     // -- constructors
-    public ApplicationTypeMember() {
-    }
-
     public ApplicationTypeMember(final ApplicationFeatureId featureId) {
         super(featureId);
     }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRoleMenu.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRoleMenu.java
index db640e1..8360006 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRoleMenu.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRoleMenu.java
@@ -36,6 +36,8 @@ import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 import org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository;
 
+import lombok.RequiredArgsConstructor;
+
 @DomainService(
         nature = NatureOfService.VIEW,
         objectType = "isis.ext.secman.ApplicationRoleMenu"
@@ -44,16 +46,16 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository;
         named = "Security",
         menuBar = DomainServiceLayout.MenuBar.SECONDARY
         )
-public class  ApplicationRoleMenu {
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
+public class ApplicationRoleMenu {
 
     // -- domain event classes
     public static class PropertyDomainEvent<T> extends IsisModuleExtSecmanApi.PropertyDomainEvent<ApplicationRoleMenu, T> {}
     public static abstract class CollectionDomainEvent<T> extends IsisModuleExtSecmanApi.CollectionDomainEvent<ApplicationRoleMenu, T> {}
     public static abstract class ActionDomainEvent extends IsisModuleExtSecmanApi.ActionDomainEvent<ApplicationRoleMenu> {}
 
-    
-    @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
-    
+    private final ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
+
 
     // -- iconName
     public String iconName() {
diff --git a/extensions/security/secman/persistence-jdo/pom.xml b/extensions/security/secman/persistence-jdo/pom.xml
index 02b6541..8293472 100644
--- a/extensions/security/secman/persistence-jdo/pom.xml
+++ b/extensions/security/secman/persistence-jdo/pom.xml
@@ -34,42 +34,41 @@
     <properties>
         <jar-plugin.automaticModuleName>org.apache.isis.extensions.secman.persistence.jdo</jar-plugin.automaticModuleName>
         <git-plugin.propertiesDir>org/apache/isis/extensions/secman/persistence/jdo</git-plugin.propertiesDir>
-        
+
     </properties>
 
 
     <dependencies>
-	
+
+		<dependency>
+			<groupId>org.apache.isis.extensions</groupId>
+			<artifactId>isis-extensions-secman-api</artifactId>
+		</dependency>
+
 		<dependency>
 			<groupId>org.apache.isis.persistence</groupId>
 			<artifactId>isis-persistence-jdo-applib</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.persistence</groupId>
 			<artifactId>isis-persistence-jdo-datanucleus</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-core-runtime</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		
-		<dependency>
-			<groupId>org.apache.isis.extensions</groupId>
-			<artifactId>isis-extensions-secman-api</artifactId>
-			<scope>provided</scope>
-		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.extensions</groupId>
 			<artifactId>isis-extensions-secman-model</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.testing</groupId>
 			<artifactId>isis-testing-fixtures-applib</artifactId>
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/IsisModuleExtSecmanPersistenceJdo.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/IsisModuleExtSecmanPersistenceJdo.java
index 148215d..856cdc3 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/IsisModuleExtSecmanPersistenceJdo.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/IsisModuleExtSecmanPersistenceJdo.java
@@ -18,17 +18,39 @@
  */
 package org.apache.isis.extensions.secman.jdo;
 
-import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository;
+import org.apache.isis.extensions.secman.api.tenancy.ApplicationTenancyRepository;
+import org.apache.isis.extensions.secman.api.user.ApplicationUserRepository;
+import org.apache.isis.extensions.secman.jdo.seed.SeedSecurityModuleService;
+import org.apache.isis.extensions.secman.model.IsisModuleExtSecmanModel;
 
 /**
  * @since 2.0 {@index}
  */
 @Configuration
-@ComponentScan(
-        basePackageClasses= {
-                IsisModuleExtSecmanPersistenceJdo.class
-        })
+@Import({
+        // modules
+        IsisModuleExtSecmanModel.class,
+
+        // services
+        ApplicationPermissionRepository.class,
+        ApplicationRoleRepository.class,
+        ApplicationTenancyRepository.class,
+        ApplicationUserRepository.class,
+        SeedSecurityModuleService.class,
+
+        // pretty sure we don't need to import/register these view models
+//        ApplicationPermission.class,
+//        ApplicationRole.class,
+//        ApplicationTenancy.class,
+//        ApplicationUser.class,
+
+
+})
 public class IsisModuleExtSecmanPersistenceJdo {
 
 }
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java
index 24ecaa1..ff5178e 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java
@@ -42,21 +42,21 @@ import lombok.val;
 
 @Repository
 @Named("isis.ext.secman.ApplicationRoleRepository")
-public class ApplicationRoleRepository 
+public class ApplicationRoleRepository
 implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<ApplicationRole> {
 
     @Inject private FactoryService factoryService;
     @Inject private RepositoryService repository;
     @Inject private SecmanConfiguration configBean;
-    
+
     @Inject private javax.inject.Provider<QueryResultsCache> queryResultsCacheProvider;
 
-    
+
     @Override
     public ApplicationRole newApplicationRole() {
         return factoryService.detachedEntity(new ApplicationRole());
     }
-    
+
     @Override
     public Optional<ApplicationRole> findByNameCached(final String name) {
         return queryResultsCacheProvider.get().execute(()->findByName(name),
@@ -64,6 +64,12 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<
     }
 
     @Override
+    public ApplicationRole upsert(final String name, final String roleDescription) {
+        return findByName(name)
+                .orElseGet(() -> newRole(name, roleDescription));
+    }
+
+    @Override
     public Optional<ApplicationRole> findByName(final String name) {
         if(name == null) {
             return Optional.empty();
@@ -74,7 +80,7 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<
 
     @Override
     public Collection<ApplicationRole> findNameContaining(final String search) {
-        
+
         if(search != null && search.length() > 0) {
             String nameRegex = String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."));
             return repository.allMatches(
@@ -117,20 +123,20 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<
 
     @Override
     public void addRoleToUser(
-            org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole, 
+            org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
             org.apache.isis.extensions.secman.api.user.ApplicationUser genericUser) {
-        
+
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
         val user = _Casts.<ApplicationUser>uncheckedCast(genericUser);
         // no need to add to users set, since will be done by JDO/DN.
         user.getRoles().add(role);
     }
-    
+
     @Override
     public void removeRoleFromUser(
             org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
             org.apache.isis.extensions.secman.api.user.ApplicationUser genericUser) {
-        
+
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
         val user = _Casts.<ApplicationUser>uncheckedCast(genericUser);
         // no need to remove from users set, since will be done by JDO/DN.
@@ -145,9 +151,9 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository<
 
     @Override
     public void deleteRole(org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole) {
-        
+
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
-        
+
         role.getUsers().clear();
         val permissions = role.getPermissions();
         for (val permission : permissions) {
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
index 4e5ad4a..67642da 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
@@ -35,7 +35,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
 
     @Inject private ApplicationRoleRepository applicationRoleRepository;
     @Inject private ApplicationPermissionRepository applicationPermissionRepository;
-    
+
     private final String roleName;
     private final String roleDescription;
 
@@ -66,12 +66,10 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             return;
         }
 
-        ApplicationRole securityRole = applicationRoleRepository.findByName(roleName).orElse(null);
-        if(securityRole == null) {
-            securityRole = applicationRoleRepository.newRole(roleName, roleDescription);
-        }
-        
-        for(ApplicationFeatureId featureId : featureIds) {
+        val securityRole = applicationRoleRepository.findByName(roleName)
+                .orElseGet(() -> applicationRoleRepository.newRole(roleName, roleDescription));
+
+        for(val featureId : featureIds) {
             val featureFqn = featureId.getFullyQualifiedName();
 
             // can't use role#addPackage because that does a check for existence of the package, which is
@@ -82,7 +80,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
                     (org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole)securityRole,
                     rule,
                     mode,
-                    featureId.getSort(), 
+                    featureId.getSort(),
                     featureFqn);
         }
     }
diff --git a/extensions/security/secman/persistence-jpa/pom.xml b/extensions/security/secman/persistence-jpa/pom.xml
index d6b04de..22b7181 100644
--- a/extensions/security/secman/persistence-jpa/pom.xml
+++ b/extensions/security/secman/persistence-jpa/pom.xml
@@ -34,36 +34,33 @@
     <properties>
         <jar-plugin.automaticModuleName>org.apache.isis.extensions.secman.persistence.jpa</jar-plugin.automaticModuleName>
         <git-plugin.propertiesDir>org/apache/isis/extensions/secman/persistence/jpa</git-plugin.propertiesDir>
-        
+
     </properties>
 
 
     <dependencies>
-	
+
 		<dependency>
-			<groupId>org.apache.isis.persistence</groupId>
-			<artifactId>isis-persistence-jpa-applib</artifactId>
-			<scope>provided</scope>
+			<groupId>org.apache.isis.extensions</groupId>
+			<artifactId>isis-extensions-secman-api</artifactId>
 		</dependency>
-		
 		<dependency>
-			<groupId>org.apache.isis.core</groupId>
-			<artifactId>isis-core-runtime</artifactId>
-			<scope>provided</scope>
+			<groupId>org.apache.isis.extensions</groupId>
+			<artifactId>isis-extensions-secman-model</artifactId>
 		</dependency>
-		
+
 		<dependency>
-			<groupId>org.apache.isis.extensions</groupId>
-			<artifactId>isis-extensions-secman-api</artifactId>
+			<groupId>org.apache.isis.persistence</groupId>
+			<artifactId>isis-persistence-jpa-applib</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		
+
 		<dependency>
-			<groupId>org.apache.isis.extensions</groupId>
-			<artifactId>isis-extensions-secman-model</artifactId>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-runtime</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.testing</groupId>
 			<artifactId>isis-testing-fixtures-applib</artifactId>
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/IsisModuleExtSecmanPersistenceJpa.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/IsisModuleExtSecmanPersistenceJpa.java
index 6fe1ec0..6d79bae 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/IsisModuleExtSecmanPersistenceJpa.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/IsisModuleExtSecmanPersistenceJpa.java
@@ -31,24 +31,29 @@ import org.apache.isis.extensions.secman.jpa.dom.tenancy.ApplicationTenancyRepos
 import org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUser;
 import org.apache.isis.extensions.secman.jpa.dom.user.ApplicationUserRepository;
 import org.apache.isis.extensions.secman.jpa.seed.SeedSecurityModuleService;
+import org.apache.isis.extensions.secman.model.IsisModuleExtSecmanModel;
 
 /**
  * @since 2.0 {@index}
  */
 @Configuration
 @Import({
+    // modules
+    IsisModuleExtSecmanModel.class,
+
+    // services
     ApplicationPermissionRepository.class,
     ApplicationRoleRepository.class,
     ApplicationTenancyRepository.class,
     ApplicationUserRepository.class,
-
-    ApplicationPermission.class,
-    ApplicationRole.class,
-    ApplicationTenancy.class,
-    ApplicationUser.class,
-
     SeedSecurityModuleService.class,
 
+    // pretty sure we don't need to import/register these view models
+//    ApplicationPermission.class,
+//    ApplicationRole.class,
+//    ApplicationTenancy.class,
+//    ApplicationUser.class,
+
 })
 @EntityScan(basePackageClasses = {
         ApplicationPermission.class,