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/02/16 17:38:43 UTC

[isis] branch master updated (fb03b93 -> 69eccb3)

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

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from fb03b93  ISIS-2223: more mitigations; also some js fixes
     new ed0baf7  ISIS-2291: move static content 'jdo' -> 'model'
     new 69eccb3  ISIS-2291: convert app-role actions to mixins

The 2 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.


Summary of changes:
 .../ApplicationPermissionRepository.java           |  37 +-
 .../secman/api/role/ApplicationRole.java           |  18 +
 .../secman/api/role/ApplicationRoleRepository.java |   2 +
 .../model/dom/role/ApplicationRole_addAction.java  | 103 ++++++
 .../model/dom/role/ApplicationRole_addClass.java   |  78 ++++
 .../dom/role/ApplicationRole_addCollection.java    | 107 ++++++
 .../model/dom/role/ApplicationRole_addPackage.java |  82 +++++
 .../dom/role/ApplicationRole_addProperty.java      | 117 ++++++
 .../ApplicationRole_delete.java}                   |  33 +-
 .../dom/role/ApplicationRole_removePermission.java | 109 ++++++
 ...java => ApplicationRole_updateDescription.java} |  49 +--
 .../ApplicationRole_updateName.java}               |  39 +-
 .../main/resources/images/ApplicationFeature.png   | Bin
 .../main/resources/images/ApplicationPassword.png  | Bin
 .../resources/images/ApplicationPermission.png     | Bin
 .../src/main/resources/images/ApplicationRole.png  | Bin
 .../main/resources/images/ApplicationTenancy.png   | Bin
 .../resources/images/ApplicationUser-disabled.png  | Bin
 .../resources/images/ApplicationUser-enabled.png   | Bin
 .../src/main/resources/images/UserPermission.png   | Bin
 .../images/pdn/UserPermissionViewModel.pdn         | Bin
 .../src/main/resources/images/zip/key_security.zip | Bin
 .../src/main/resources/images/zip/outline_star.zip | Bin
 .../main/resources/images/zip/question_shield.zip  | Bin
 .../main/resources/images/zip/theatre_masks.zip    | Bin
 .../src/main/resources/images/zip/user.zip         | Bin
 .../resources/images/zip/worldwide_location.zip    | Bin
 .../jdo/dom/permission/ApplicationPermission.java  |   3 -
 .../ApplicationPermissionRepository.java           |  63 +++-
 .../secman/jdo/dom/role/ApplicationRole.java       | 409 +--------------------
 .../jdo/dom/role/ApplicationRoleRepository.java    |  17 +
 31 files changed, 781 insertions(+), 485 deletions(-)
 create mode 100644 extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
 create mode 100644 extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java
 create mode 100644 extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java
 create mode 100644 extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java
 create mode 100644 extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
 copy extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/{permission/ApplicationPermission_updateRole.java => role/ApplicationRole_delete.java} (63%)
 create mode 100644 extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermission.java
 copy extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/{ApplicationRole_addUser.java => ApplicationRole_updateDescription.java} (51%)
 copy extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/{permission/ApplicationPermission_updateRole.java => role/ApplicationRole_updateName.java} (54%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationFeature.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationPassword.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationPermission.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationRole.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationTenancy.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationUser-disabled.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/ApplicationUser-enabled.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/UserPermission.png (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/pdn/UserPermissionViewModel.pdn (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/zip/key_security.zip (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/zip/outline_star.zip (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/zip/question_shield.zip (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/zip/theatre_masks.zip (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/zip/user.zip (100%)
 rename extensions/security/secman/{persistence-jdo => model}/src/main/resources/images/zip/worldwide_location.zip (100%)


[isis] 02/02: ISIS-2291: convert app-role actions to mixins

Posted by ah...@apache.org.
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

commit 69eccb3a7c239ef599ca8bd891f35cdbddeee0b9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Feb 16 18:38:27 2020 +0100

    ISIS-2291: convert app-role actions to mixins
---
 .../ApplicationPermissionRepository.java           |  37 +-
 .../secman/api/role/ApplicationRole.java           |  18 +
 .../secman/api/role/ApplicationRoleRepository.java |   2 +
 .../model/dom/role/ApplicationRole_addAction.java  | 103 ++++++
 .../model/dom/role/ApplicationRole_addClass.java   |  78 ++++
 .../dom/role/ApplicationRole_addCollection.java    | 107 ++++++
 .../model/dom/role/ApplicationRole_addPackage.java |  82 +++++
 .../dom/role/ApplicationRole_addProperty.java      | 117 ++++++
 .../model/dom/role/ApplicationRole_delete.java     |  54 +++
 .../dom/role/ApplicationRole_removePermission.java | 109 ++++++
 .../role/ApplicationRole_updateDescription.java    |  61 +++
 .../model/dom/role/ApplicationRole_updateName.java |  50 +++
 .../jdo/dom/permission/ApplicationPermission.java  |   3 -
 .../ApplicationPermissionRepository.java           |  63 +++-
 .../secman/jdo/dom/role/ApplicationRole.java       | 409 +--------------------
 .../jdo/dom/role/ApplicationRoleRepository.java    |  17 +
 16 files changed, 888 insertions(+), 422 deletions(-)

diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRepository.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRepository.java
index b9d607e..c80c780 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRepository.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRepository.java
@@ -21,16 +21,47 @@ package org.apache.isis.extensions.secman.api.permission;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 
 public interface ApplicationPermissionRepository {
 
     ApplicationPermission findByUserAndPermissionValue(String username,
             ApplicationPermissionValue changingPermissionValue);
 
-    List<? extends ApplicationPermission> findByFeatureCached(ApplicationFeatureId featureId);
+    List<ApplicationPermission> findByFeatureCached(ApplicationFeatureId featureId);
 
-    List<? extends ApplicationPermission> findOrphaned();
+    List<ApplicationPermission> findByRoleAndRuleAndFeatureTypeCached(
+            ApplicationRole holder,
+            ApplicationPermissionRule rule, 
+            ApplicationFeatureType type);
+    
+    ApplicationPermission findByRoleAndRuleAndFeature(
+            ApplicationRole holder, 
+            ApplicationPermissionRule rule,
+            ApplicationFeatureType type, 
+            String featureFqn);
+    
+    List<ApplicationPermission> findOrphaned();
 
-    List<? extends ApplicationPermission> allPermissions();
+    List<ApplicationPermission> allPermissions();
+
+    ApplicationPermission newPermission(
+            ApplicationRole role,
+            ApplicationPermissionRule rule, 
+            ApplicationPermissionMode mode,
+            String packageFqn, 
+            String className, 
+            String memberName);
+
+    ApplicationPermission newPermission(
+            ApplicationRole holder, 
+            ApplicationPermissionRule rule, 
+            ApplicationPermissionMode mode,
+            ApplicationFeatureType featureType, 
+            String featureFqn);
+
+    
+    
 
 }
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRole.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRole.java
index d3a4741..86173a3 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRole.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/role/ApplicationRole.java
@@ -27,6 +27,10 @@ public interface ApplicationRole {
     public static final int TYPICAL_LENGTH_DESCRIPTION = 50;
 
     String getName();
+    void setName(String name);
+    
+    String getDescription();
+    void setDescription(String description);
     
     // -- EVENTS
     
@@ -36,5 +40,19 @@ public interface ApplicationRole {
     
     public static class AddUserDomainEvent extends ActionDomainEvent {}
     public static class RemoveUserDomainEvent extends ActionDomainEvent {}
+    public static class AddActionDomainEvent extends ActionDomainEvent {}
+    public static class AddClassDomainEvent extends ActionDomainEvent {}
+    public static class AddCollectionDomainEvent extends ActionDomainEvent {}
+    public static class AddPackageDomainEvent extends ActionDomainEvent {}
+    public static class AddPropertyDomainEvent extends ActionDomainEvent {}
+    public static class RemovePermissionDomainEvent extends ActionDomainEvent {}
+    
+    public static class DeleteDomainEvent extends ActionDomainEvent {}
+    
+    public static class UpdateDescriptionDomainEvent extends ActionDomainEvent {}
+    public static class UpdateNameDomainEvent extends ActionDomainEvent {}
+    
+    
+
 
 }
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 bec38d6..3e53f01 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
@@ -40,6 +40,8 @@ public interface ApplicationRoleRepository {
     void removeRoleFromUser(ApplicationRole role, ApplicationUser holder);
 
     boolean isAdminRole(ApplicationRole role);
+
+    void deleteRole(ApplicationRole holder);
     
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
new file mode 100644
index 0000000..179b291
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
@@ -0,0 +1,103 @@
+/*
+ *  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.model.dom.role;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddActionDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = AddActionDomainEvent.class, associateWith = "permissions")
+@RequiredArgsConstructor
+public class ApplicationRole_addAction {
+    
+    @Inject private ApplicationFeatureRepository applicationFeatureRepository;
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
+    private final ApplicationRole holder;
+
+    /**
+     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
+     * {@link ApplicationMemberType#ACTION action}
+     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeature feature}.
+     */
+    @MemberOrder(sequence = "3")
+    public ApplicationRole act(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Mode")
+            final ApplicationPermissionMode mode,
+            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
+            final String packageFqn,
+            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
+            final String className,
+            @ParameterLayout(named="Action", typicalLength = ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
+            final String memberName) {
+        
+        applicationPermissionRepository.newPermission(holder, rule, mode, packageFqn, className, memberName);
+        return holder;
+    }
+
+    @Model
+    public ApplicationPermissionRule default0Act() {
+        return ApplicationPermissionRule.ALLOW;
+    }
+
+    @Model
+    public ApplicationPermissionMode default1Act() {
+        return ApplicationPermissionMode.CHANGING;
+    }
+
+    @Model
+    public java.util.Collection<String> choices2Act() {
+        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.ACTION);
+    }
+
+    @Model
+    public java.util.Collection<String> choices3Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationPermissionMode mode,
+            final String packageFqn) {
+        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.ACTION);
+    }
+
+    @Model
+    public java.util.Collection<String> choices4Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationPermissionMode mode,
+            final String packageFqn,
+            final String className) {
+        return applicationFeatureRepository.memberNamesOf(packageFqn, className, ApplicationMemberType.ACTION);
+    }
+    
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java
new file mode 100644
index 0000000..f112312
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java
@@ -0,0 +1,78 @@
+/*
+ *  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.model.dom.role;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddClassDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = AddClassDomainEvent.class, associateWith = "permissions")
+@RequiredArgsConstructor
+public class ApplicationRole_addClass {
+    
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
+    private final ApplicationRole holder;
+
+    /**
+     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
+     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeature feature}.
+     */
+    @MemberOrder(sequence = "1")
+    public ApplicationRole act(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Mode")
+            final ApplicationPermissionMode mode,
+            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
+            final String packageFqn,
+            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
+            final String className) {
+        
+        applicationPermissionRepository.newPermission(
+                holder, rule, mode, ApplicationFeatureType.CLASS,
+                packageFqn + "." + className);
+        
+        return holder;
+    }
+
+    @Model
+    public ApplicationPermissionRule default0Act() {
+        return ApplicationPermissionRule.ALLOW;
+    }
+
+    @Model
+    public ApplicationPermissionMode default1Act() {
+        return ApplicationPermissionMode.CHANGING;
+    }
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java
new file mode 100644
index 0000000..e44d04a
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java
@@ -0,0 +1,107 @@
+/*
+ *  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.model.dom.role;
+
+import java.util.Collection;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddCollectionDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = AddCollectionDomainEvent.class, associateWith = "permissions")
+@RequiredArgsConstructor
+public class ApplicationRole_addCollection {
+    
+    @Inject private ApplicationFeatureRepository applicationFeatureRepository;
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
+    private final ApplicationRole holder;
+
+
+    /**
+     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
+     * {@link ApplicationMemberType#COLLECTION collection}
+     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeature feature}.
+     */
+    @MemberOrder(sequence = "5")
+    public ApplicationRole act(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Mode")
+            final ApplicationPermissionMode mode,
+            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
+            final String packageFqn,
+            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
+            final String className,
+            @ParameterLayout(named="Collection", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
+            final String memberName) {
+        
+        applicationPermissionRepository
+            .newPermission(holder, rule, mode, packageFqn, className, memberName);
+        return holder;
+    }
+
+    @Model
+    public ApplicationPermissionRule default0Act() {
+        return ApplicationPermissionRule.ALLOW;
+    }
+
+    @Model
+    public ApplicationPermissionMode default1Act() {
+        return ApplicationPermissionMode.CHANGING;
+    }
+
+    @Model
+    public Collection<String> choices2Act() {
+        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.COLLECTION);
+    }
+    
+    @Model
+    public Collection<String> choices3Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationPermissionMode mode,
+            final String packageFqn) {
+        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.COLLECTION);
+    }
+
+    @Model
+    public Collection<String> choices4Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationPermissionMode mode,
+            final String packageFqn,
+            final String className) {
+        return applicationFeatureRepository.memberNamesOf(packageFqn, className, ApplicationMemberType.COLLECTION);
+    }
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java
new file mode 100644
index 0000000..489d9bf
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java
@@ -0,0 +1,82 @@
+/*
+ *  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.model.dom.role;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPackageDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = AddPackageDomainEvent.class, associateWith = "permissions")
+@RequiredArgsConstructor
+public class ApplicationRole_addPackage {
+    
+    @Inject private ApplicationFeatureRepository applicationFeatureRepository;
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
+    private final ApplicationRole holder;
+    
+    /**
+     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
+     * {@link ApplicationFeatureType#PACKAGE package}
+     * {@link ApplicationFeature feature}.
+     */
+    @MemberOrder(sequence = "1")
+    public ApplicationRole act(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Mode")
+            final ApplicationPermissionMode mode,
+            @ParameterLayout(named="Package", typicalLength= ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
+            final String packageFqn) {
+        
+        applicationPermissionRepository
+            .newPermission(
+                    holder, rule, mode, ApplicationFeatureType.PACKAGE, packageFqn);
+        return holder;
+    }
+
+    @Model
+    public ApplicationPermissionRule default0Act() {
+        return ApplicationPermissionRule.ALLOW;
+    }
+
+    @Model
+    public ApplicationPermissionMode default1Act() {
+        return ApplicationPermissionMode.CHANGING;
+    }
+
+    @Model
+    public java.util.Collection<String> choices2Act() {
+        return applicationFeatureRepository.packageNames();
+    }
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
new file mode 100644
index 0000000..f16ae38
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
@@ -0,0 +1,117 @@
+/*
+ *  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.model.dom.role;
+
+import java.util.Collection;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPropertyDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = AddPropertyDomainEvent.class, associateWith = "permissions")
+@RequiredArgsConstructor
+public class ApplicationRole_addProperty {
+    
+    @Inject private ApplicationFeatureRepository applicationFeatureRepository;
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
+    private final ApplicationRole holder;
+
+    // -- addProperty (action)
+    
+    /**
+     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
+     * {@link ApplicationMemberType#PROPERTY property}
+     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeature feature}.
+     */
+    @MemberOrder(sequence = "4")
+    public ApplicationRole act(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Mode")
+            final ApplicationPermissionMode mode,
+            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
+            final String packageFqn,
+            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
+            final String className,
+            @ParameterLayout(named="Property", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
+            final String memberName) {
+        
+        applicationPermissionRepository
+            .newPermission(holder, rule, mode, packageFqn, className, memberName);
+        return holder;
+    }
+
+    @Model
+    public ApplicationPermissionRule default0Act() {
+        return ApplicationPermissionRule.ALLOW;
+    }
+
+    @Model
+    public ApplicationPermissionMode default1Act() {
+        return ApplicationPermissionMode.CHANGING;
+    }
+
+    /**
+     * Package names that have classes in them.
+     */
+    @Model
+    public Collection<String> choices2Act() {
+        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.PROPERTY);
+    }
+
+    /**
+     * Class names for selected package.
+     */
+    @Model
+    public Collection<String> choices3Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationPermissionMode mode,
+            final String packageFqn) {
+        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.PROPERTY);
+    }
+
+    /**
+     * Member names for selected class.
+     */
+    @Model
+    public Collection<String> choices4Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationPermissionMode mode,
+            final String packageFqn,
+            final String className) {
+        return applicationFeatureRepository.memberNamesOf(packageFqn, className, ApplicationMemberType.PROPERTY);
+    }
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_delete.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_delete.java
new file mode 100644
index 0000000..3ef303d
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_delete.java
@@ -0,0 +1,54 @@
+/*
+ *  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.model.dom.role;
+
+import java.util.Collection;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.DeleteDomainEvent;
+import org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = DeleteDomainEvent.class, semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE)
+@RequiredArgsConstructor
+public class ApplicationRole_delete {
+    
+    @Inject private ApplicationRoleRepository applicationRoleRepository;
+    
+    private final ApplicationRole holder;
+    
+    @MemberOrder(sequence = "1")
+    public Collection<ApplicationRole> act() {
+        applicationRoleRepository.deleteRole(holder);
+        return applicationRoleRepository.allRoles();
+    }
+
+    @Model
+    public String disableAct() {
+        return applicationRoleRepository.isAdminRole(holder) ? "Cannot delete the admin role" : null;
+    }
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermission.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermission.java
new file mode 100644
index 0000000..b4e9f94
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermission.java
@@ -0,0 +1,109 @@
+/*
+ *  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.model.dom.role;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.enterprise.inject.Model;
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.core.commons.internal.collections._Lists;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.extensions.secman.api.SecurityModuleConfig;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.RemovePermissionDomainEvent;
+import org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = RemovePermissionDomainEvent.class, associateWith = "permissions")
+@RequiredArgsConstructor
+public class ApplicationRole_removePermission {
+
+    @Inject private SecurityModuleConfig configBean;
+    @Inject private RepositoryService repository;
+    @Inject private ApplicationRoleRepository applicationRoleRepository;
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
+    private final ApplicationRole holder;
+
+    @MemberOrder(sequence = "9")
+    public ApplicationRole act(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Type")
+            final ApplicationFeatureType type,
+            @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
+            final String featureFqn) {
+        
+        final ApplicationPermission permission = applicationPermissionRepository
+                .findByRoleAndRuleAndFeature(holder, rule, type, featureFqn);
+        if(permission != null) {
+            repository.remove(permission);
+        }
+        return holder;
+    }
+
+    @Model
+    public String validateAct(
+            @ParameterLayout(named="Rule")
+            final ApplicationPermissionRule rule,
+            @ParameterLayout(named="Type")
+            final ApplicationFeatureType type,
+            @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
+            final String featureFqn) {
+        if(applicationRoleRepository.isAdminRole(holder) 
+                && configBean.isStickyAdminPackage(featureFqn)) {
+            return "Cannot remove top-level package permissions for the admin role.";
+        }
+        return null;
+    }
+    
+    @Model
+    public ApplicationPermissionRule default0Act() {
+        return ApplicationPermissionRule.ALLOW;
+    }
+    
+    @Model
+    public ApplicationFeatureType default1Act() {
+        return ApplicationFeatureType.PACKAGE;
+    }
+
+    @Model
+    public Collection<String> choices2Act(
+            final ApplicationPermissionRule rule,
+            final ApplicationFeatureType type) {
+        
+        final List<ApplicationPermission> permissions = applicationPermissionRepository
+                .findByRoleAndRuleAndFeatureTypeCached(holder, rule, type);
+        return _Lists.map(
+                permissions,
+                ApplicationPermission::getFeatureFqn);
+    }
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_updateDescription.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_updateDescription.java
new file mode 100644
index 0000000..d748d1c
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_updateDescription.java
@@ -0,0 +1,61 @@
+/*
+ *  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.model.dom.role;
+
+import javax.enterprise.inject.Model;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+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.types.DescriptionType;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.UpdateDescriptionDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = UpdateDescriptionDomainEvent.class, associateWith = "description")
+@RequiredArgsConstructor
+public class ApplicationRole_updateDescription {
+    
+    private final ApplicationRole holder;
+    
+    @MemberOrder(sequence = "1")
+    public ApplicationRole act(
+            @Parameter(
+                    maxLength = DescriptionType.Meta.MAX_LEN,
+                    optionality = Optionality.OPTIONAL
+                    )
+            @ParameterLayout(
+                    named="Description", 
+                    typicalLength=ApplicationRole.TYPICAL_LENGTH_DESCRIPTION)
+            final String description) {
+        
+        holder.setDescription(description);
+        return holder;
+    }
+
+    @Model
+    public String default0Act() {
+        return holder.getDescription();
+    }
+
+
+}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_updateName.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_updateName.java
new file mode 100644
index 0000000..a8e7614
--- /dev/null
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_updateName.java
@@ -0,0 +1,50 @@
+/*
+ *  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.model.dom.role;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole;
+import org.apache.isis.extensions.secman.api.role.ApplicationRole.UpdateNameDomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(domainEvent = UpdateNameDomainEvent.class, associateWith = "name")
+@RequiredArgsConstructor
+public class ApplicationRole_updateName {
+    
+    private final ApplicationRole holder;
+    
+    @MemberOrder(sequence = "1")
+    public ApplicationRole updateName(
+            @Parameter(maxLength = ApplicationRole.MAX_LENGTH_NAME) 
+            @ParameterLayout(named="Name", typicalLength = ApplicationRole.TYPICAL_LENGTH_NAME)
+            final String name) {
+        
+        holder.setName(name);
+        return holder;
+    }
+
+    public String default0UpdateName() {
+        return holder.getName();
+    }
+
+}
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java
index 43981e2..293d4fd 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java
@@ -382,9 +382,6 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
                             input.getRule(), 
                             input.getMode());
 
-        public static final Function<ApplicationPermission, String> GET_FQN = 
-                ApplicationPermission::getFeatureFqn;
-
     }
 
     @Inject private ApplicationFeatureRepositoryDefault applicationFeatureRepository;
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java
index 22900da..8170012 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java
@@ -36,6 +36,7 @@ import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.core.commons.internal.base._Casts;
 import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.internal.base._Strings;
 import org.apache.isis.core.commons.internal.collections._Lists;
@@ -177,7 +178,10 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
     public ApplicationPermission findByRoleAndRuleAndFeature(
             final ApplicationRole role,
-            final ApplicationPermissionRule rule, final ApplicationFeatureType type, final String featureFqn) {
+            final ApplicationPermissionRule rule, 
+            final ApplicationFeatureType type, 
+            final String featureFqn) {
+        
         return repository
                 .uniqueMatch(
                         new QueryDefault<>(
@@ -193,12 +197,16 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     // -- findByFeature (programmatic)
 
     @Override
-    public List<ApplicationPermission> findByFeatureCached(final ApplicationFeatureId featureId) {
+    public List<org.apache.isis.extensions.secman.api.permission.ApplicationPermission> 
+    findByFeatureCached(final ApplicationFeatureId featureId) {
         return queryResultsCache.execute(new Callable<List<ApplicationPermission>>() {
             @Override public List<ApplicationPermission> call() throws Exception {
                 return findByFeature(featureId);
             }
-        }, ApplicationPermissionRepository.class, "findByFeatureCached", featureId);
+        }, ApplicationPermissionRepository.class, "findByFeatureCached", featureId)
+        .stream()
+        .map(org.apache.isis.extensions.secman.api.permission.ApplicationPermission.class::cast)
+        .collect(Collectors.toList());
     }
 
     public List<ApplicationPermission> findByFeature(final ApplicationFeatureId featureId) {
@@ -208,16 +216,40 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
                         "featureType", featureId.getType(),
                         "featureFqn", featureId.getFullyQualifiedName()));
     }
+    
+    @Override
+    public List<org.apache.isis.extensions.secman.api.permission.ApplicationPermission> 
+    findByRoleAndRuleAndFeatureTypeCached(
+            org.apache.isis.extensions.secman.api.role.ApplicationRole holder, 
+            ApplicationPermissionRule rule,
+            ApplicationFeatureType type) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public org.apache.isis.extensions.secman.api.permission.ApplicationPermission 
+    findByRoleAndRuleAndFeature(
+            org.apache.isis.extensions.secman.api.role.ApplicationRole holder, 
+            ApplicationPermissionRule rule,
+            ApplicationFeatureType type, String featureFqn) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 
 
     // -- newPermission (programmatic)
 
+    @Override
     public ApplicationPermission newPermission(
-            final ApplicationRole role,
+            final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
             final ApplicationFeatureType featureType,
             final String featureFqn) {
+        
+        val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
+        
         final ApplicationFeatureId featureId = ApplicationFeatureId.newFeature(featureType, featureFqn);
         final ApplicationFeature feature = applicationFeatureRepository.findFeature(featureId);
         if(feature == null) {
@@ -248,14 +280,17 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         return permission;
     }
 
+    @Override
     public ApplicationPermission newPermission(
-            final ApplicationRole role,
+            final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
             final String featurePackage,
             final String featureClassName,
             final String featureMemberName) {
 
+        val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
+        
         val featureId = ApplicationFeatureId.newFeature(featurePackage, featureClassName, featureMemberName);
         val featureType = featureId.getType();
         val featureFqn = featureId.getFullyQualifiedName();
@@ -280,15 +315,20 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
     // -- allPermission (programmatic)
     @Override
-    public List<ApplicationPermission> allPermissions() {
-        return repository.allInstances(ApplicationPermission.class);
+    public List<org.apache.isis.extensions.secman.api.permission.ApplicationPermission> 
+    allPermissions() {
+        return repository.allInstances(ApplicationPermission.class)
+                .stream()
+                .map(org.apache.isis.extensions.secman.api.permission.ApplicationPermission.class::cast)
+                .collect(Collectors.toList());
     }
 
 
     // -- findOrphaned (programmatic)
 
     @Override
-    public List<ApplicationPermission> findOrphaned() {
+    public List<org.apache.isis.extensions.secman.api.permission.ApplicationPermission> 
+    findOrphaned() {
 
         final Collection<String> packageNames = applicationFeatureRepository.packageNames();
         final Set<String> availableClasses = _Sets.newTreeSet();
@@ -298,10 +338,10 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             appendClasses(packageName, ApplicationMemberType.ACTION, availableClasses);
         }
 
-        final List<ApplicationPermission> orphaned = _Lists.newArrayList();
+        val orphaned = _Lists.<org.apache.isis.extensions.secman.api.permission.ApplicationPermission>newArrayList();
 
-        final List<ApplicationPermission> permissions = allPermissions();
-        for (ApplicationPermission permission : permissions) {
+        val permissions = allPermissions();
+        for (val permission : permissions) {
             final ApplicationFeatureType featureType = permission.getFeatureType();
             final String featureFqn = permission.getFeatureFqn();
 
@@ -376,4 +416,5 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     @Inject FactoryService factory;
     @Inject MessageService messages;
 
+
 }
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java
index 4f2044c..c5ef0ed 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java
@@ -28,7 +28,6 @@ import javax.jdo.annotations.IdGeneratorStrategy;
 import javax.jdo.annotations.IdentityType;
 import javax.jdo.annotations.InheritanceStrategy;
 
-import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.Collection;
@@ -37,36 +36,22 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.MemberOrder;
-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.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
-import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
-import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
-import org.apache.isis.applib.services.factory.FactoryService;
-import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.types.DescriptionType;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
-import org.apache.isis.extensions.secman.api.SecurityModuleConfig;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermissionRepository;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser;
-import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUserRepository;
-import org.apache.isis.extensions.secman.model.dom.permission.ApplicationPermission_delete;
 
 import lombok.Getter;
 import lombok.Setter;
-import lombok.val;
 
 @javax.jdo.annotations.PersistenceCapable(
         identityType = IdentityType.DATASTORE,
@@ -105,6 +90,9 @@ import lombok.val;
 public class ApplicationRole 
 implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparable<ApplicationRole> {
 
+    @Inject private ApplicationFeatureRepository applicationFeatureRepository;
+    @Inject private ApplicationPermissionRepository applicationPermissionRepository;
+    
     // -- identification
     /**
      * having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use
@@ -130,29 +118,6 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparabl
     private String name;
 
 
-
-    // -- updateName (action)
-
-    public static class UpdateNameDomainEvent extends ActionDomainEvent {}
-
-    @Action(
-            domainEvent = UpdateNameDomainEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT
-            )
-    @MemberOrder(name="name", sequence = "1")
-    public ApplicationRole updateName(
-            @Parameter(maxLength = MAX_LENGTH_NAME) @ParameterLayout(named="Name", typicalLength = TYPICAL_LENGTH_NAME)
-            final String name) {
-        setName(name);
-        return this;
-    }
-
-    public String default0UpdateName() {
-        return getName();
-    }
-
-
-
     // -- description (property)
 
     public static class DescriptionDomainEvent extends PropertyDomainEvent<String> {}
@@ -170,34 +135,6 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparabl
     @Getter @Setter
     private String description;
 
-
-
-    // -- updateDescription (action)
-
-    public static class UpdateDescriptionDomainEvent extends ActionDomainEvent {}
-
-    @Action(
-            domainEvent = UpdateDescriptionDomainEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT
-            )
-    @MemberOrder(name="description", sequence = "1")
-    public ApplicationRole updateDescription(
-            @Parameter(
-                    maxLength = DescriptionType.Meta.MAX_LEN,
-                    optionality = Optionality.OPTIONAL
-                    )
-            @ParameterLayout(named="Description", typicalLength=TYPICAL_LENGTH_DESCRIPTION)
-            final String description) {
-        setDescription(description);
-        return this;
-    }
-
-    public String default0UpdateDescription() {
-        return getDescription();
-    }
-
-
-
     // -- permissions (derived collection)
     public static class PermissionsCollectionDomainEvent extends CollectionDomainEvent<ApplicationPermission> {}
 
@@ -214,78 +151,7 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparabl
     }
 
 
-    // -- addPackage (action)
-
-    public static class AddPackageDomainEvent extends ActionDomainEvent {}
-
-    /**
-     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
-     * {@link ApplicationFeatureType#PACKAGE package}
-     * {@link ApplicationFeature feature}.
-     */
-    @Action(
-            domainEvent = AddPackageDomainEvent.class,
-            semantics = SemanticsOf.NON_IDEMPOTENT
-            )
-    @MemberOrder(name = "Permissions", sequence = "1")
-    public ApplicationRole addPackage(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Mode")
-            final ApplicationPermissionMode mode,
-            @ParameterLayout(named="Package", typicalLength= ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
-            final String packageFqn) {
-        applicationPermissionRepository.newPermission(this, rule, mode, ApplicationFeatureType.PACKAGE, packageFqn);
-        return this;
-    }
-
-    public ApplicationPermissionRule default0AddPackage() {
-        return ApplicationPermissionRule.ALLOW;
-    }
-
-    public ApplicationPermissionMode default1AddPackage() {
-        return ApplicationPermissionMode.CHANGING;
-    }
-
-    public java.util.Collection<String> choices2AddPackage() {
-        return applicationFeatureRepository.packageNames();
-    }
-
-
-    // -- addClass (action)
-    public static class AddClassDomainEvent extends ActionDomainEvent {}
 
-    /**
-     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
-     * {@link ApplicationFeatureType#MEMBER member}
-     * {@link ApplicationFeature feature}.
-     */
-    @Action(
-            domainEvent = AddClassDomainEvent.class,
-            semantics = SemanticsOf.NON_IDEMPOTENT
-            )
-    @MemberOrder(name = "Permissions", sequence = "2")
-    public ApplicationRole addClass(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Mode")
-            final ApplicationPermissionMode mode,
-            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
-            final String packageFqn,
-            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
-            final String className) {
-        applicationPermissionRepository.newPermission(this, rule, mode, ApplicationFeatureType.CLASS,
-                packageFqn + "." + className);
-        return this;
-    }
-
-    public ApplicationPermissionRule default0AddClass() {
-        return ApplicationPermissionRule.ALLOW;
-    }
-
-    public ApplicationPermissionMode default1AddClass() {
-        return ApplicationPermissionMode.CHANGING;
-    }
 
     /**
      * Package names that have classes in them.
@@ -304,243 +170,6 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparabl
         return applicationFeatureRepository.classNamesContainedIn(packageFqn, null);
     }
 
-
-
-    // -- addAction (action)
-    public static class AddActionDomainEvent extends ActionDomainEvent {}
-
-    /**
-     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
-     * {@link ApplicationMemberType#ACTION action}
-     * {@link ApplicationFeatureType#MEMBER member}
-     * {@link ApplicationFeature feature}.
-     */
-    @Action(
-            domainEvent = AddActionDomainEvent.class,
-            semantics = SemanticsOf.NON_IDEMPOTENT
-            )
-    @MemberOrder(name = "Permissions", sequence = "3")
-    public ApplicationRole addAction(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Mode")
-            final ApplicationPermissionMode mode,
-            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
-            final String packageFqn,
-            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
-            final String className,
-            @ParameterLayout(named="Action", typicalLength = ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
-            final String memberName) {
-        applicationPermissionRepository.newPermission(this, rule, mode, packageFqn, className, memberName);
-        return this;
-    }
-
-    public ApplicationPermissionRule default0AddAction() {
-        return ApplicationPermissionRule.ALLOW;
-    }
-
-    public ApplicationPermissionMode default1AddAction() {
-        return ApplicationPermissionMode.CHANGING;
-    }
-
-    public java.util.Collection<String> choices2AddAction() {
-        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.ACTION);
-    }
-
-    public java.util.Collection<String> choices3AddAction(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn) {
-        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.ACTION);
-    }
-
-    public java.util.Collection<String> choices4AddAction(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn,
-            final String className) {
-        return applicationFeatureRepository.memberNamesOf(packageFqn, className, ApplicationMemberType.ACTION);
-    }
-
-
-
-    // -- addProperty (action)
-    public static class AddPropertyDomainEvent extends ActionDomainEvent {}
-    /**
-     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
-     * {@link ApplicationMemberType#PROPERTY property}
-     * {@link ApplicationFeatureType#MEMBER member}
-     * {@link ApplicationFeature feature}.
-     */
-    @Action(
-            domainEvent = AddPropertyDomainEvent.class,
-            semantics = SemanticsOf.NON_IDEMPOTENT
-            )
-    @MemberOrder(name = "Permissions", sequence = "4")
-    public ApplicationRole addProperty(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Mode")
-            final ApplicationPermissionMode mode,
-            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
-            final String packageFqn,
-            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
-            final String className,
-            @ParameterLayout(named="Property", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
-            final String memberName) {
-        applicationPermissionRepository.newPermission(this, rule, mode, packageFqn, className, memberName);
-        return this;
-    }
-
-    public ApplicationPermissionRule default0AddProperty() {
-        return ApplicationPermissionRule.ALLOW;
-    }
-
-    public ApplicationPermissionMode default1AddProperty() {
-        return ApplicationPermissionMode.CHANGING;
-    }
-
-    /**
-     * Package names that have classes in them.
-     */
-    public java.util.Collection<String> choices2AddProperty() {
-        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.PROPERTY);
-    }
-
-    /**
-     * Class names for selected package.
-     */
-    public java.util.Collection<String> choices3AddProperty(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn) {
-        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.PROPERTY);
-    }
-
-    /**
-     * Member names for selected class.
-     */
-    public java.util.Collection<String> choices4AddProperty(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn,
-            final String className) {
-        return applicationFeatureRepository.memberNamesOf(packageFqn, className, ApplicationMemberType.PROPERTY);
-    }
-
-
-    // -- addCollection (action)
-    public static class AddCollectionDomainEvent extends ActionDomainEvent {}
-
-    /**
-     * Adds a {@link org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission permission} for this role to a
-     * {@link ApplicationMemberType#COLLECTION collection}
-     * {@link ApplicationFeatureType#MEMBER member}
-     * {@link ApplicationFeature feature}.
-     */
-    @Action(
-            domainEvent = AddCollectionDomainEvent.class,
-            semantics = SemanticsOf.NON_IDEMPOTENT
-            )
-    @MemberOrder(name = "Permissions", sequence = "5")
-    public ApplicationRole addCollection(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Mode")
-            final ApplicationPermissionMode mode,
-            @ParameterLayout(named="Package", typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
-            final String packageFqn,
-            @ParameterLayout(named="Class", typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
-            final String className,
-            @ParameterLayout(named="Collection", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
-            final String memberName) {
-        applicationPermissionRepository.newPermission(this, rule, mode, packageFqn, className, memberName);
-        return this;
-    }
-
-    public ApplicationPermissionRule default0AddCollection() {
-        return ApplicationPermissionRule.ALLOW;
-    }
-
-    public ApplicationPermissionMode default1AddCollection() {
-        return ApplicationPermissionMode.CHANGING;
-    }
-
-    public java.util.Collection<String> choices2AddCollection() {
-        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.COLLECTION);
-    }
-
-    public java.util.Collection<String> choices3AddCollection(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn) {
-        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.COLLECTION);
-    }
-
-    public java.util.Collection<String> choices4AddCollection(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn,
-            final String className) {
-        return applicationFeatureRepository.memberNamesOf(packageFqn, className, ApplicationMemberType.COLLECTION);
-    }
-
-
-
-    // -- removePermission (action)
-    public static class RemovePermissionDomainEvent extends ActionDomainEvent {}
-
-    @Action(
-            domainEvent= RemovePermissionDomainEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT
-            )
-    @MemberOrder(name = "Permissions", sequence = "9")
-    public ApplicationRole removePermission(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Type")
-            final ApplicationFeatureType type,
-            @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
-            final String featureFqn) {
-        final ApplicationPermission permission = applicationPermissionRepository.findByRoleAndRuleAndFeature(this,
-                rule, type, featureFqn);
-        if(permission != null) {
-            repository.remove(permission);
-        }
-        return this;
-    }
-
-    public String validateRemovePermission(
-            @ParameterLayout(named="Rule")
-            final ApplicationPermissionRule rule,
-            @ParameterLayout(named="Type")
-            final ApplicationFeatureType type,
-            @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
-            final String featureFqn) {
-        if(applicationRoleRepository.isAdminRole(this) && configBean.isStickyAdminPackage(featureFqn)) {
-            return "Cannot remove top-level package permissions for the admin role.";
-        }
-        return null;
-    }
-    public ApplicationPermissionRule default0RemovePermission() {
-        return ApplicationPermissionRule.ALLOW;
-    }
-    public ApplicationFeatureType default1RemovePermission() {
-        return ApplicationFeatureType.PACKAGE;
-    }
-
-    public java.util.Collection<String> choices2RemovePermission(
-            final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type) {
-        final List<ApplicationPermission> permissions = applicationPermissionRepository.findByRoleAndRuleAndFeatureTypeCached(
-                this, rule, type);
-        return _Lists.map(
-                permissions,
-                ApplicationPermission.Functions.GET_FQN);
-    }
-
-
-
     // -- users (collection)
 
     public static class UsersDomainEvent extends CollectionDomainEvent<ApplicationUser> {}
@@ -568,30 +197,6 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparabl
     }
 
 
-    // -- delete (action)
-    public static class DeleteDomainEvent extends ActionDomainEvent {}
-
-    @Action(
-            domainEvent = DeleteDomainEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE
-            )
-    @MemberOrder(sequence = "1")
-    public java.util.Collection<org.apache.isis.extensions.secman.api.role.ApplicationRole> delete() {
-        getUsers().clear();
-        final List<ApplicationPermission> permissions = getPermissions();
-        for (final ApplicationPermission permission : permissions) {
-            val deleteMixin = factoryService.mixin(ApplicationPermission_delete.class, permission);
-            deleteMixin.act();
-        }
-        repository.removeAndFlush(this);
-        return applicationRoleRepository.allRoles();
-    }
-
-    public String disableDelete() {
-        return applicationRoleRepository.isAdminRole(this) ? "Cannot delete the admin role" : null;
-    }
-
-
     // -- equals, hashCode, compareTo, toString
 
     private final static Comparator<ApplicationRole> comparator =
@@ -627,13 +232,7 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRole, Comparabl
         return toString.toString(this);
     }
 
-    @Inject FactoryService factoryService;
-    @Inject RepositoryService repository;
-    @Inject ApplicationFeatureRepository applicationFeatureRepository;
-    @Inject ApplicationPermissionRepository applicationPermissionRepository;
-    @Inject ApplicationUserRepository applicationUserRepository;
-    @Inject ApplicationRoleRepository applicationRoleRepository;
-    @Inject private SecurityModuleConfig configBean;
+
 
 
 }
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 6af601b..1c1d14f 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
@@ -29,12 +29,14 @@ import org.springframework.stereotype.Repository;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.query.QueryDefault;
+import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.core.commons.internal.base._Casts;
 import org.apache.isis.core.commons.internal.collections._Sets;
 import org.apache.isis.extensions.secman.api.SecurityModuleConfig;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser;
+import org.apache.isis.extensions.secman.model.dom.permission.ApplicationPermission_delete;
 
 import lombok.val;
 
@@ -43,6 +45,7 @@ import lombok.val;
 public class ApplicationRoleRepository 
 implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository {
 
+    @Inject private FactoryService factoryService;
     @Inject private RepositoryService repository;
     @Inject private QueryResultsCache queryResultsCache;
     @Inject private ApplicationRoleFactory applicationRoleFactory;
@@ -146,4 +149,18 @@ implements org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository
         return adminRole.equals(genericRole);
     }
 
+    @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) {
+            val deleteMixin = factoryService.mixin(ApplicationPermission_delete.class, permission);
+            deleteMixin.act();
+        }
+        repository.removeAndFlush(role);
+    }
+
 }


[isis] 01/02: ISIS-2291: move static content 'jdo' -> 'model'

Posted by ah...@apache.org.
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

commit ed0baf7508ad2985bcc0bea57cea42ff75cb2ea1
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Feb 16 18:37:57 2020 +0100

    ISIS-2291: move static content 'jdo' -> 'model'
---
 .../src/main/resources/images/ApplicationFeature.png        | Bin
 .../src/main/resources/images/ApplicationPassword.png       | Bin
 .../src/main/resources/images/ApplicationPermission.png     | Bin
 .../src/main/resources/images/ApplicationRole.png           | Bin
 .../src/main/resources/images/ApplicationTenancy.png        | Bin
 .../src/main/resources/images/ApplicationUser-disabled.png  | Bin
 .../src/main/resources/images/ApplicationUser-enabled.png   | Bin
 .../src/main/resources/images/UserPermission.png            | Bin
 .../main/resources/images/pdn/UserPermissionViewModel.pdn   | Bin
 .../src/main/resources/images/zip/key_security.zip          | Bin
 .../src/main/resources/images/zip/outline_star.zip          | Bin
 .../src/main/resources/images/zip/question_shield.zip       | Bin
 .../src/main/resources/images/zip/theatre_masks.zip         | Bin
 .../src/main/resources/images/zip/user.zip                  | Bin
 .../src/main/resources/images/zip/worldwide_location.zip    | Bin
 15 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationFeature.png b/extensions/security/secman/model/src/main/resources/images/ApplicationFeature.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationFeature.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationFeature.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationPassword.png b/extensions/security/secman/model/src/main/resources/images/ApplicationPassword.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationPassword.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationPassword.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationPermission.png b/extensions/security/secman/model/src/main/resources/images/ApplicationPermission.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationPermission.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationPermission.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationRole.png b/extensions/security/secman/model/src/main/resources/images/ApplicationRole.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationRole.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationRole.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationTenancy.png b/extensions/security/secman/model/src/main/resources/images/ApplicationTenancy.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationTenancy.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationTenancy.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationUser-disabled.png b/extensions/security/secman/model/src/main/resources/images/ApplicationUser-disabled.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationUser-disabled.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationUser-disabled.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationUser-enabled.png b/extensions/security/secman/model/src/main/resources/images/ApplicationUser-enabled.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/ApplicationUser-enabled.png
rename to extensions/security/secman/model/src/main/resources/images/ApplicationUser-enabled.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/UserPermission.png b/extensions/security/secman/model/src/main/resources/images/UserPermission.png
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/UserPermission.png
rename to extensions/security/secman/model/src/main/resources/images/UserPermission.png
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/pdn/UserPermissionViewModel.pdn b/extensions/security/secman/model/src/main/resources/images/pdn/UserPermissionViewModel.pdn
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/pdn/UserPermissionViewModel.pdn
rename to extensions/security/secman/model/src/main/resources/images/pdn/UserPermissionViewModel.pdn
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/zip/key_security.zip b/extensions/security/secman/model/src/main/resources/images/zip/key_security.zip
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/zip/key_security.zip
rename to extensions/security/secman/model/src/main/resources/images/zip/key_security.zip
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/zip/outline_star.zip b/extensions/security/secman/model/src/main/resources/images/zip/outline_star.zip
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/zip/outline_star.zip
rename to extensions/security/secman/model/src/main/resources/images/zip/outline_star.zip
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/zip/question_shield.zip b/extensions/security/secman/model/src/main/resources/images/zip/question_shield.zip
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/zip/question_shield.zip
rename to extensions/security/secman/model/src/main/resources/images/zip/question_shield.zip
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/zip/theatre_masks.zip b/extensions/security/secman/model/src/main/resources/images/zip/theatre_masks.zip
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/zip/theatre_masks.zip
rename to extensions/security/secman/model/src/main/resources/images/zip/theatre_masks.zip
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/zip/user.zip b/extensions/security/secman/model/src/main/resources/images/zip/user.zip
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/zip/user.zip
rename to extensions/security/secman/model/src/main/resources/images/zip/user.zip
diff --git a/extensions/security/secman/persistence-jdo/src/main/resources/images/zip/worldwide_location.zip b/extensions/security/secman/model/src/main/resources/images/zip/worldwide_location.zip
similarity index 100%
rename from extensions/security/secman/persistence-jdo/src/main/resources/images/zip/worldwide_location.zip
rename to extensions/security/secman/model/src/main/resources/images/zip/worldwide_location.zip