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 2021/03/03 18:39:05 UTC

[isis] branch master updated (f7c1a25 -> 3fbcd98)

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 f7c1a25  ISIS-2559: ApplicationUser_delete: add are_u_sure semantics (2)
     new 3d43024  ISIS-2553: promote ApplicationFeatureId to applib
     new ec7c553  ISIS-2553: simplify static functions
     new 547202f  ISIS-2553: remove redundant natural comp.
     new 23426dc  ISIS-2553: rename PACKAGE -> NAMESPACE, rename CLASS -> TYPE
     new c0cc90d  ISIS-2553: rename ApplicationFeatureType->ApplicationFeatureSort
     new 9e3d54e  ISIS-2553: refactor ApplicationFeatureId to have only a single constructor
     new 10aa6a3  ISIS-2553: simplify ApplicationFeatureSort
     new 099e65a  ISIS-2553: memoization for ApplicationFeatureId#getPathIds
     new 3fbcd98  ISIS-2553: add ApplicationFeatureId to doc index

The 9 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:
 .../services/appfeat/ApplicationFeatureId.java     | 396 ++++++++++++++++
 .../appfeat/ApplicationFeatureRepository.java      |   5 +
 ...MemberType.java => ApplicationFeatureSort.java} |  41 +-
 .../isis/commons/internal/base/_Strings.java       |  33 +-
 .../services/appfeat/ApplicationFeature.java       |  25 +-
 .../services/appfeat/ApplicationFeatureId.java     | 514 ---------------------
 .../ApplicationFeatureRepositoryDefault.java       | 108 ++---
 .../services/appfeat/ApplicationFeatureType.java   | 115 -----
 .../core/metamodel/services/appfeat/_Asserts.java  |  51 ++
 .../metamodel/services/appfeat/_Predicates.java    |  53 +++
 .../metamodel/MetaModelServiceDefault.java         |   6 +-
 .../specloader/SpecificationLoaderDefault.java     |   4 +-
 .../services/appfeat/ApplicationFeatureIdTest.java | 252 +++++-----
 .../ApplicationFeatureRepositoryDefaultTest.java   |  33 +-
 .../services/appfeat/ApplicationFeatureTest.java   |  29 +-
 .../appfeat/ApplicationFeatureTypeTest.java        |  62 ++-
 .../secman/api/authorizor/AuthorizorSecman.java    |   2 +-
 .../api/permission/ApplicationPermission.java      |  12 +-
 .../ApplicationPermissionRepository.java           |  20 +-
 .../api/permission/ApplicationPermissionValue.java |   5 +-
 .../permission/ApplicationPermissionValueSet.java  |   8 +-
 .../permission/PermissionsEvaluationService.java   |   2 +-
 .../PermissionsEvaluationServiceAbstract.java      |   2 +-
 .../secman/api/role/ApplicationRole.java           |   7 +-
 .../secman/model/app/feature/ApplicationClass.java |   2 +-
 .../model/app/feature/ApplicationClassAction.java  |   2 +-
 .../app/feature/ApplicationClassCollection.java    |   2 +-
 .../model/app/feature/ApplicationClassMember.java  |   2 +-
 .../app/feature/ApplicationClassProperty.java      |   2 +-
 .../app/feature/ApplicationFeatureViewModel.java   |  28 +-
 .../model/app/feature/ApplicationPackage.java      |   6 +-
 .../app/feature/ApplicationPermission_feature.java |   2 +-
 .../user/ApplicationUser_filterPermissions.java    |  16 +-
 .../app/user/ApplicationUser_permissions.java      |   4 +-
 .../model/app/user/UserPermissionViewModel.java    |  29 +-
 .../ApplicationOrphanedPermissionManager.java      |   9 +-
 ...OrphanedPermissionManager_relocateSelected.java |   2 +-
 .../permission/ApplicationPermission_allow.java    |   8 +-
 .../permission/ApplicationPermission_changing.java |   8 +-
 .../permission/ApplicationPermission_delete.java   |  10 +-
 .../ApplicationPermission_updateRole.java          |  12 +-
 .../dom/permission/ApplicationPermission_veto.java |  12 +-
 .../permission/ApplicationPermission_viewing.java  |  12 +-
 .../model/dom/role/ApplicationRole_addAction.java  |  10 +-
 .../model/dom/role/ApplicationRole_addClass.java   |  12 +-
 .../dom/role/ApplicationRole_addCollection.java    |  10 +-
 .../model/dom/role/ApplicationRole_addPackage.java |  12 +-
 ...ion.java => ApplicationRole_addPermission.java} |  87 ++--
 .../dom/role/ApplicationRole_addProperty.java      |  10 +-
 .../model/dom/role/ApplicationRole_addUser.java    |   8 +-
 .../dom/role/ApplicationRole_removePermission.java |  22 +-
 .../role/ApplicationRole_removePermissions.java    |   8 +-
 .../model/dom/role/ApplicationRole_removeUser.java |  10 +-
 .../dom/role/ApplicationRole_removeUsers.java      |   8 +-
 .../role/ApplicationRole_updateDescription.java    |  12 +-
 .../model/dom/role/ApplicationRole_updateName.java |  12 +-
 .../dom/tenancy/ApplicationTenancy_addChild.java   |   6 +-
 .../dom/tenancy/ApplicationTenancy_addUser.java    |   8 +-
 .../dom/tenancy/ApplicationTenancy_delete.java     |   4 +-
 .../tenancy/ApplicationTenancy_removeChild.java    |  12 +-
 .../dom/tenancy/ApplicationTenancy_removeUser.java |  12 +-
 .../dom/tenancy/ApplicationTenancy_updateName.java |  14 +-
 .../tenancy/ApplicationTenancy_updateParent.java   |   8 +-
 .../dom/tenancy/ApplicationTenancy_users.java      |   4 +-
 .../ApplicationUserManager_newDelegateUser.java    |   6 +-
 .../user/ApplicationUserManager_newLocalUser.java  |   6 +-
 .../model/dom/user/ApplicationUser_addRole.java    |  12 +-
 .../model/dom/user/ApplicationUser_delete.java     |   6 +-
 .../model/dom/user/ApplicationUser_duplicate.java  |   6 +-
 .../model/dom/user/ApplicationUser_lock.java       |  10 +-
 .../model/dom/user/ApplicationUser_removeRole.java |  12 +-
 .../dom/user/ApplicationUser_removeRoles.java      |   8 +-
 .../dom/user/ApplicationUser_resetPassword.java    |  10 +-
 .../model/dom/user/ApplicationUser_unlock.java     |   8 +-
 .../user/ApplicationUser_updateAccountType.java    |  10 +-
 .../dom/user/ApplicationUser_updateAtPath.java     |   8 +-
 .../user/ApplicationUser_updateEmailAddress.java   |  10 +-
 .../model/dom/user/ApplicationUser_updateName.java |  18 +-
 .../dom/user/ApplicationUser_updatePassword.java   |  18 +-
 .../user/ApplicationUser_updatePhoneNumber.java    |  10 +-
 .../dom/user/ApplicationUser_updateUsername.java   |   8 +-
 .../secman/model/dom/user/HasUsername_open.java    |  10 +-
 .../jdo/dom/permission/ApplicationPermission.java  |  10 +-
 .../ApplicationPermissionRepository.java           |  56 ++-
 .../secman/jdo/dom/user/ApplicationUser.java       |   2 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |  10 +-
 .../jpa/dom/permission/ApplicationPermission.java  |  10 +-
 .../ApplicationPermissionRepository.java           |  42 +-
 .../secman/jpa/dom/user/ApplicationUser.java       |   2 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |  10 +-
 .../secman/shiro/PermissionForMember.java          |   2 +-
 91 files changed, 1274 insertions(+), 1288 deletions(-)
 create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
 copy api/applib/src/main/java/org/apache/isis/applib/services/appfeat/{ApplicationMemberType.java => ApplicationFeatureSort.java} (56%)
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureType.java
 create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
 create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
 copy extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/{ApplicationRole_addAction.java => ApplicationRole_addPermission.java} (53%)


[isis] 09/09: ISIS-2553: add ApplicationFeatureId to doc index

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 3fbcd984cd07eebcafb8c39156c8bf860fc502fb
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 19:17:26 2021 +0100

    ISIS-2553: add ApplicationFeatureId to doc index
---
 .../org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java    | 1 +
 1 file changed, 1 insertion(+)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index a0e6886..abfa2a9 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -54,6 +54,7 @@ import lombok.val;
  * {@link #getSort() (feature) sort}, {@link #getNamespace() namespace}, 
  * {@link #getTypeSimpleName() type simple name} and {@link #getMemberName() member name}.
  * 
+ * @since 1.x revised for 2.0 {@index}
  */
 @Value
 public class ApplicationFeatureId 


[isis] 03/09: ISIS-2553: remove redundant natural comp.

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 547202f962fa42a845ff2ddf6a6d5bd8feda4ac8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 15:14:46 2021 +0100

    ISIS-2553: remove redundant natural comp.
---
 .../services/appfeat/ApplicationFeatureId.java     | 46 ++++++----------------
 .../permission/ApplicationPermissionValueSet.java  |  2 +-
 2 files changed, 14 insertions(+), 34 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index 4d728b1..faccc3e 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -132,20 +132,6 @@ implements
         return new ApplicationFeatureId(ApplicationFeatureType.MEMBER, fullyQualifiedName);
     }
 
-    /**
-     * Round-trip with {@link #asString()}
-     */
-    public static ApplicationFeatureId parse(final String asString) {
-        return new ApplicationFeatureId(asString);
-    }
-
-    /**
-     * Round-trip with {@link #asEncodedString()}
-     */
-    public static ApplicationFeatureId parseEncoded(final String encodedString) {
-        return new ApplicationFeatureId(_Strings.base64UrlDecode(encodedString));
-    }
-
     // -- CONSTRUCTOR
 
     private ApplicationFeatureId(final String asString) {
@@ -252,7 +238,7 @@ implements
         return newClass(classFqn);
     }
 
-    // -- ENCODING
+    // -- ENCODING / DECODING
 
     @Programmatic
     public String asString() {
@@ -263,26 +249,20 @@ implements
     public String asEncodedString() {
         return _Strings.base64UrlEncode(asString());
     }
-
-    // //////////////////////////////////////
-
-    // -- Comparators
-    public static final class Comparators {
-        private Comparators(){}
-        public static Comparator<ApplicationFeatureId> natural() {
-            return new ApplicationFeatureIdComparator();
-        }
-
-        static class ApplicationFeatureIdComparator implements Comparator<ApplicationFeatureId>, Serializable {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public int compare(final ApplicationFeatureId o1, final ApplicationFeatureId o2) {
-                return o1.compareTo(o2);
-            }
-        }
+    
+    /**
+     * Round-trip with {@link #asString()}
+     */
+    public static ApplicationFeatureId parse(final String asString) {
+        return new ApplicationFeatureId(asString);
     }
 
+    /**
+     * Round-trip with {@link #asEncodedString()}
+     */
+    public static ApplicationFeatureId parseEncoded(final String encodedString) {
+        return new ApplicationFeatureId(_Strings.base64UrlDecode(encodedString));
+    }
 
     // //////////////////////////////////////
 
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
index fadcaa1..6ffa62f 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
@@ -88,7 +88,7 @@ public class ApplicationPermissionValueSet implements Serializable {
      */
     private final _Multimaps.SetMultimap<ApplicationFeatureId, ApplicationPermissionValue> permissionsByFeature =
             _Multimaps.newSortedSetMultimap(
-                    Collections.reverseOrder(ApplicationFeatureId.Comparators.natural()),
+                    Collections.reverseOrder(),
                     null // natural element order
                     );
 


[isis] 07/09: ISIS-2553: simplify ApplicationFeatureSort

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 10aa6a362e4e887e52bbc24668ee052eb24e74e9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 18:09:32 2021 +0100

    ISIS-2553: simplify ApplicationFeatureSort
---
 .../services/appfeat/ApplicationFeatureId.java     | 83 ++++++++++++++--------
 .../services/appfeat/ApplicationFeatureSort.java   | 74 +++----------------
 .../services/appfeat/ApplicationFeature.java       | 18 ++---
 .../core/metamodel/services/appfeat/_Asserts.java  | 41 +++++------
 .../appfeat/ApplicationFeatureTypeTest.java        | 36 +++++-----
 .../app/feature/ApplicationFeatureViewModel.java   |  4 +-
 .../dom/role/ApplicationRole_addPermission.java    |  4 --
 7 files changed, 115 insertions(+), 145 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index 20152bf..c29f7e7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -37,6 +37,7 @@ import org.apache.isis.applib.util.Hashing;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.TitleBuffer;
 import org.apache.isis.applib.util.ToString;
+import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -112,31 +113,57 @@ implements
     }
 
     public static ApplicationFeatureId newNamespace(final String namespace) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
-        ApplicationFeatureSort.initNamespace(feat, namespace);
-        return feat;
+        val feature = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
+        feature.setNamespace(namespace);
+        feature.setTypeSimpleName(null);
+        feature.setMemberName(null);
+        return feature;
     }
 
     public static ApplicationFeatureId newType(final String logicalTypeName) {
         val feat = new ApplicationFeatureId(ApplicationFeatureSort.TYPE);
-        ApplicationFeatureSort.initType(feat, logicalTypeName);
+        initType(feat, logicalTypeName);
         return feat;
     }
 
     public static ApplicationFeatureId newMember(final String logicalTypeName, final String memberName) {
         final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
-        ApplicationFeatureSort.initType(featureId, logicalTypeName);
-        featureId.sort = ApplicationFeatureSort.MEMBER;
+        initType(featureId, logicalTypeName);
         featureId.setMemberName(memberName);
         return featureId;
     }
 
     public static ApplicationFeatureId newMember(String fqn) {
         val feat = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
-        ApplicationFeatureSort.initMember(feat, fqn);
+        initMember(feat, fqn);
         return feat;
     }
     
+    // -- FACTORY HELPERS
+    
+    private static void initType(final ApplicationFeatureId feature, final String fullyQualifiedName) {
+        final int i = fullyQualifiedName.lastIndexOf(".");
+        if(i != -1) {
+            feature.setNamespace(fullyQualifiedName.substring(0, i));
+            feature.setTypeSimpleName(fullyQualifiedName.substring(i+1));
+        } else {
+            feature.setNamespace("");
+            feature.setTypeSimpleName(fullyQualifiedName);
+        }
+        feature.setMemberName(null);
+    }
+    
+    private static void initMember(final ApplicationFeatureId feature, final String fullyQualifiedName) {
+        final int i = fullyQualifiedName.lastIndexOf("#");
+        if(i == -1) {
+            throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
+        }
+        final String className = fullyQualifiedName.substring(0, i);
+        final String memberName = fullyQualifiedName.substring(i+1);
+        initType(feature, className);
+        feature.setMemberName(memberName);
+    }
+    
     // -- CONSTRUCTOR
 
     private ApplicationFeatureId(final ApplicationFeatureSort sort) {
@@ -157,18 +184,27 @@ implements
 
     // -- PROPERTIES
     
-    @Getter ApplicationFeatureSort sort;
+    @Getter final @NonNull ApplicationFeatureSort sort;
     
     /**
      * The {@link ApplicationFeatureId id} of the member's class.
      */
     public ApplicationFeatureId getParentClassId() {
-        ApplicationFeatureSort.ensureMember(this);
-        final String classFqn = this.getNamespace() + "." + getTypeSimpleName();
-        return newType(classFqn);
+        _Assert.assertTrue(sort.isMember());
+        final String logicalTypeName = this.getNamespace() + "." + getTypeSimpleName();
+        return newType(logicalTypeName);
     }
     
     // -- PROPERTIES - NON UI
+    
+    @Programmatic 
+    @Getter @Setter private String namespace;
+
+    @Programmatic 
+    @Getter @Setter private String typeSimpleName;
+
+    @Programmatic 
+    @Getter @Setter private String memberName;
 
     @Programmatic
     public String getFullyQualifiedName() {
@@ -198,35 +234,24 @@ implements
         return buf.toString();
     }
 
-    @Programmatic 
-    @Getter @Setter private String namespace;
-
-    @Programmatic 
-    @Getter @Setter private String typeSimpleName;
-
-    @Programmatic 
-    @Getter @Setter private String memberName;
-
     /**
      * The {@link ApplicationFeatureId id} of the parent package of this
      * class or package.
      */
     @Programmatic
     public ApplicationFeatureId getParentPackageId() {
-        ApplicationFeatureSort.ensurePackageOrClass(this);
+        
+        _Assert.assertFalse(sort.isMember());
 
-        if(sort == ApplicationFeatureSort.TYPE) {
+        if(sort.isType()) {
             return ApplicationFeatureId.newNamespace(getNamespace());
         } else {
-            final String packageName = getNamespace(); // eg aaa.bbb.ccc
-
-            if(!packageName.contains(".")) {
+            val namespace = getNamespace(); // eg aaa.bbb.ccc
+            if(!namespace.contains(".")) {
                 return null; // parent is root
             }
-
-            final int cutOffPos = packageName.lastIndexOf('.');
-            final String parentPackageName = packageName.substring(0, cutOffPos);
-
+            final int cutOffPos = namespace.lastIndexOf('.');
+            final String parentPackageName = namespace.substring(0, cutOffPos);
             return newNamespace(parentPackageName);
         }
     }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
index 074e382..c1cb650 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
@@ -18,8 +18,10 @@
  */
 package org.apache.isis.applib.services.appfeat;
 
-import org.apache.isis.commons.internal.base._Strings;
-
+/**
+ * 
+ * @since 1.x revised for 2.0 {@index}
+ */
 public enum ApplicationFeatureSort {
     
     /** 
@@ -39,75 +41,21 @@ public enum ApplicationFeatureSort {
      */
     MEMBER;
 
-    public boolean hideClassName() {
+    public boolean isNamespace() {
         return this == ApplicationFeatureSort.NAMESPACE;
     }
     
-    public boolean hideMember() {
-        return this == ApplicationFeatureSort.NAMESPACE || this == ApplicationFeatureSort.TYPE;
+    public boolean isType() {
+        return this == ApplicationFeatureSort.TYPE;
     }
-
-    public static void ensurePackage(final ApplicationFeatureId feature) {
-        if(feature.sort != ApplicationFeatureSort.NAMESPACE) {
-            throw new IllegalStateException("Can only be called for a package; " + feature.toString());
-        }
-    }
-
-    public static void ensurePackageOrClass(final ApplicationFeatureId applicationFeatureId) {
-        if(applicationFeatureId.sort != ApplicationFeatureSort.NAMESPACE && applicationFeatureId.sort != ApplicationFeatureSort.TYPE) {
-            throw new IllegalStateException("Can only be called for a package or a class; " + applicationFeatureId.toString());
-        }
-    }
-
-    public static void ensureClass(final ApplicationFeatureId feature) {
-        if(feature.sort != ApplicationFeatureSort.TYPE) {
-            throw new IllegalStateException("Can only be called for a class; " + feature.toString());
-        }
-    }
-
-    public static void ensureMember(final ApplicationFeatureId feature) {
-        if(feature.sort != ApplicationFeatureSort.MEMBER) {
-            throw new IllegalStateException("Can only be called for a member; " + feature.toString());
-        }
+    
+    public boolean isMember() {
+        return this == ApplicationFeatureSort.MEMBER;
     }
 
     @Override
     public String toString() {
-        return _Strings.capitalize(name());
-    }
-    
-    // -- REFACTORING
-    
-    static void initNamespace(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-        feature.setNamespace(fullyQualifiedName);
-        feature.setTypeSimpleName(null);
-        feature.setMemberName(null);
-        feature.sort = NAMESPACE;
-    }
-    
-    static void initType(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-        final int i = fullyQualifiedName.lastIndexOf(".");
-        if(i != -1) {
-            feature.setNamespace(fullyQualifiedName.substring(0, i));
-            feature.setTypeSimpleName(fullyQualifiedName.substring(i+1));
-        } else {
-            feature.setNamespace("");
-            feature.setTypeSimpleName(fullyQualifiedName);
-        }
-        feature.setMemberName(null);
-        feature.sort = TYPE;
-    }
-    
-    static void initMember(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-        final int i = fullyQualifiedName.lastIndexOf("#");
-        if(i == -1) {
-            throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
-        }
-        final String className = fullyQualifiedName.substring(0, i);
-        final String memberName = fullyQualifiedName.substring(i+1);
-        initType(feature, className);
-        feature.setMemberName(memberName);
-        feature.sort = MEMBER;
+        return name();
     }
     
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
index 9781f0a..69d7e78 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
@@ -122,13 +122,13 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> contents = _Sets.newTreeSet();
 
     public SortedSet<ApplicationFeatureId> getContents() {
-        ApplicationFeatureSort.ensurePackage(this.getFeatureId());
+        _Asserts.ensureNamespace(this.getFeatureId());
         return contents;
     }
 
     public void addToContents(final ApplicationFeatureId contentId) {
-        ApplicationFeatureSort.ensurePackage(this.getFeatureId());
-        ApplicationFeatureSort.ensurePackageOrClass(contentId);
+        _Asserts.ensureNamespace(this.getFeatureId());
+        _Asserts.ensureNamespaceOrType(contentId);
         this.contents.add(contentId);
     }
 
@@ -137,7 +137,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> properties = _Sets.newTreeSet();
 
     public SortedSet<ApplicationFeatureId> getProperties() {
-        ApplicationFeatureSort.ensureClass(this.getFeatureId());
+        _Asserts.ensureType(this.getFeatureId());
         return properties;
     }
 
@@ -145,7 +145,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> collections = _Sets.newTreeSet();
     
     public SortedSet<ApplicationFeatureId> getCollections() {
-        ApplicationFeatureSort.ensureClass(this.getFeatureId());
+        _Asserts.ensureType(this.getFeatureId());
         return collections;
     }
 
@@ -153,19 +153,19 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> actions = _Sets.newTreeSet();
     
     public SortedSet<ApplicationFeatureId> getActions() {
-        ApplicationFeatureSort.ensureClass(this.getFeatureId());
+        _Asserts.ensureType(this.getFeatureId());
         return actions;
     }
     
     public void addToMembers(final ApplicationFeatureId memberId, final ApplicationMemberType memberType) {
-        ApplicationFeatureSort.ensureClass(this.getFeatureId());
-        ApplicationFeatureSort.ensureMember(memberId);
+        _Asserts.ensureType(this.getFeatureId());
+        _Asserts.ensureMember(memberId);
 
         membersOf(memberType).add(memberId);
     }
     
     public SortedSet<ApplicationFeatureId> membersOf(final ApplicationMemberType memberType) {
-        ApplicationFeatureSort.ensureClass(this.getFeatureId());
+        _Asserts.ensureType(this.getFeatureId());
         switch (memberType) {
         case PROPERTY:
             return properties;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
index 81b9c52..fe17bc7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
@@ -18,33 +18,34 @@
  */
 package org.apache.isis.core.metamodel.services.appfeat;
 
-import java.util.function.Predicate;
-
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
-import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 
 final class _Asserts {
 
-    public static Predicate<ApplicationFeatureId> isClassContaining(
-            final ApplicationMemberType memberType, final ApplicationFeatureRepositoryDefault applicationFeatures) {
-        return new Predicate<ApplicationFeatureId>() {
-            @Override
-            public boolean test(final ApplicationFeatureId input) {
-                if(input.getSort() != ApplicationFeatureSort.TYPE) {
-                    return false;
-                }
-                final ApplicationFeature feature = applicationFeatures.findFeature(input);
-                if(feature == null) {
-                    return false;
-                }
-                return memberType == null || !feature.membersOf(memberType).isEmpty();
-            }
-        };
+    public static void ensureNamespace(final ApplicationFeatureId feature) {
+        if(feature.getSort() != ApplicationFeatureSort.NAMESPACE) {
+            throw new IllegalStateException("Can only be called for a package; " + feature.toString());
+        }
+    }
+
+    public static void ensureNamespaceOrType(final ApplicationFeatureId applicationFeatureId) {
+        if(applicationFeatureId.getSort() != ApplicationFeatureSort.NAMESPACE 
+                && applicationFeatureId.getSort() != ApplicationFeatureSort.TYPE) {
+            throw new IllegalStateException("Can only be called for a package or a class; " + applicationFeatureId.toString());
+        }
+    }
+
+    public static void ensureType(final ApplicationFeatureId feature) {
+        if(feature.getSort() != ApplicationFeatureSort.TYPE) {
+            throw new IllegalStateException("Can only be called for a class; " + feature.toString());
+        }
     }
 
-    public static Predicate<ApplicationFeatureId> isClassRecursivelyWithin(final ApplicationFeatureId packageId) {
-        return (ApplicationFeatureId input) -> input.getParentIds().contains(packageId);
+    public static void ensureMember(final ApplicationFeatureId feature) {
+        if(feature.getSort() != ApplicationFeatureSort.MEMBER) {
+            throw new IllegalStateException("Can only be called for a member; " + feature.toString());
+        }
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
index 1da0471..bf237a1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
@@ -36,9 +36,9 @@ public class ApplicationFeatureTypeTest {
     public static class HideClassName extends ApplicationFeatureTypeTest {
         @Test
         public void all() throws Exception {
-            assertThat(ApplicationFeatureSort.NAMESPACE.hideClassName(), is(true));
-            assertThat(ApplicationFeatureSort.TYPE.hideClassName(), is(false));
-            assertThat(ApplicationFeatureSort.MEMBER.hideClassName(), is(false));
+            assertThat(ApplicationFeatureSort.NAMESPACE.isNamespace(), is(true));
+            assertThat(ApplicationFeatureSort.TYPE.isNamespace(), is(false));
+            assertThat(ApplicationFeatureSort.MEMBER.isNamespace(), is(false));
         }
     }
 
@@ -46,9 +46,9 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void all() throws Exception {
-            assertThat(ApplicationFeatureSort.NAMESPACE.hideMember(), is(true));
-            assertThat(ApplicationFeatureSort.TYPE.hideMember(), is(true));
-            assertThat(ApplicationFeatureSort.MEMBER.hideMember(), is(false));
+            assertThat(!ApplicationFeatureSort.NAMESPACE.isMember(), is(true));
+            assertThat(!ApplicationFeatureSort.TYPE.isMember(), is(true));
+            assertThat(!ApplicationFeatureSort.MEMBER.isMember(), is(false));
         }
     }
 
@@ -102,17 +102,17 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureSort.ensurePackage(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            _Asserts.ensureNamespace(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensurePackage(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
+            _Asserts.ensureNamespace(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensurePackage(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            _Asserts.ensureNamespace(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
     }
 
@@ -123,16 +123,16 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureSort.ensurePackageOrClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            _Asserts.ensureNamespaceOrType(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureSort.ensurePackageOrClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
+            _Asserts.ensureNamespaceOrType(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensurePackageOrClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            _Asserts.ensureNamespaceOrType(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
 
     }
@@ -144,16 +144,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            _Asserts.ensureType(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureSort.ensureClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
+            _Asserts.ensureType(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            _Asserts.ensureType(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
 
     }
@@ -165,16 +165,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            _Asserts.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
+            _Asserts.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
-            ApplicationFeatureSort.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            _Asserts.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
     }
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
index c0a100a..e143702 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
@@ -199,7 +199,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
         return getFeatureId().getTypeSimpleName();
     }
     public boolean hideClassName() {
-        return getType().hideClassName();
+        return getType().isNamespace();
     }
 
     // -- memberName
@@ -219,7 +219,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     }
 
     public boolean hideMemberName() {
-        return getType().hideMember();
+        return !getType().isMember();
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
index 8fa78bc..cdf53d0 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
@@ -25,14 +25,11 @@ import java.util.stream.Collectors;
 import javax.enterprise.inject.Model;
 import javax.inject.Inject;
 
-import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.MinLength;
 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.PromptStyle;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
@@ -41,7 +38,6 @@ import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMod
 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.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 import lombok.Value;


[isis] 08/09: ISIS-2553: memoization for ApplicationFeatureId#getPathIds

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 099e65acb9e74acaedbd1cd4f667e82e88398ce0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 19:06:14 2021 +0100

    ISIS-2553: memoization for ApplicationFeatureId#getPathIds
---
 .../services/appfeat/ApplicationFeatureId.java     | 121 +++++++++++----------
 .../ApplicationFeatureRepositoryDefault.java       |   4 +-
 .../metamodel/services/appfeat/_Predicates.java    |  19 ++--
 .../services/appfeat/ApplicationFeatureIdTest.java |  39 ++++---
 .../ApplicationFeatureRepositoryDefaultTest.java   |   2 +-
 .../api/permission/ApplicationPermissionValue.java |   3 +-
 .../permission/ApplicationPermissionValueSet.java  |   4 +-
 .../app/feature/ApplicationFeatureViewModel.java   |   6 +-
 .../user/ApplicationUser_filterPermissions.java    |  10 +-
 9 files changed, 110 insertions(+), 98 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index c29f7e7..a0e6886 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -19,9 +19,8 @@
 package org.apache.isis.applib.services.appfeat;
 
 import java.io.Serializable;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.List;
+import java.util.function.Consumer;
 
 import static java.util.Comparator.comparing;
 import static java.util.Comparator.naturalOrder;
@@ -37,6 +36,7 @@ import org.apache.isis.applib.util.Hashing;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.TitleBuffer;
 import org.apache.isis.applib.util.ToString;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -44,7 +44,7 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 import lombok.Getter;
 import lombok.NonNull;
-import lombok.Setter;
+import lombok.Synchronized;
 import lombok.val;
 
 /**
@@ -102,6 +102,7 @@ implements
             final @NonNull  String namespace, 
             final @Nullable String logicalTypeSimpleName,
             final @Nullable String memberName) {
+        
         if(logicalTypeSimpleName == null) {
             return newNamespace(namespace);
         }
@@ -113,55 +114,51 @@ implements
     }
 
     public static ApplicationFeatureId newNamespace(final String namespace) {
-        val feature = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
-        feature.setNamespace(namespace);
-        feature.setTypeSimpleName(null);
-        feature.setMemberName(null);
-        return feature;
+        val featureId = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
+        featureId.namespace = namespace;
+        featureId.typeSimpleName = null;
+        featureId.memberName = null;
+        return featureId;
     }
 
     public static ApplicationFeatureId newType(final String logicalTypeName) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureSort.TYPE);
-        initType(feat, logicalTypeName);
-        return feat;
+        val featureId = new ApplicationFeatureId(ApplicationFeatureSort.TYPE);
+        initType(featureId, logicalTypeName);
+        return featureId;
     }
 
     public static ApplicationFeatureId newMember(final String logicalTypeName, final String memberName) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
+        val featureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
         initType(featureId, logicalTypeName);
-        featureId.setMemberName(memberName);
+        featureId.memberName = memberName;
         return featureId;
     }
 
-    public static ApplicationFeatureId newMember(String fqn) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
-        initMember(feat, fqn);
-        return feat;
+    public static ApplicationFeatureId newMember(String fullyQualifiedName) {
+        val featureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
+        final int i = fullyQualifiedName.lastIndexOf("#");
+        if(i == -1) {
+            throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
+        }
+        val logicalTypeName = fullyQualifiedName.substring(0, i);
+        val memberName = fullyQualifiedName.substring(i + 1);
+        initType(featureId, logicalTypeName);
+        featureId.memberName = memberName;
+        return featureId;
     }
     
     // -- FACTORY HELPERS
     
-    private static void initType(final ApplicationFeatureId feature, final String fullyQualifiedName) {
+    private static void initType(final ApplicationFeatureId featureId, final String fullyQualifiedName) {
         final int i = fullyQualifiedName.lastIndexOf(".");
         if(i != -1) {
-            feature.setNamespace(fullyQualifiedName.substring(0, i));
-            feature.setTypeSimpleName(fullyQualifiedName.substring(i+1));
+            featureId.namespace = fullyQualifiedName.substring(0, i);
+            featureId.typeSimpleName = fullyQualifiedName.substring(i+1);
         } else {
-            feature.setNamespace("");
-            feature.setTypeSimpleName(fullyQualifiedName);
+            featureId.namespace = "";
+            featureId.typeSimpleName = fullyQualifiedName;
         }
-        feature.setMemberName(null);
-    }
-    
-    private static void initMember(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-        final int i = fullyQualifiedName.lastIndexOf("#");
-        if(i == -1) {
-            throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
-        }
-        final String className = fullyQualifiedName.substring(0, i);
-        final String memberName = fullyQualifiedName.substring(i+1);
-        initType(feature, className);
-        feature.setMemberName(memberName);
+        featureId.memberName = null;
     }
     
     // -- CONSTRUCTOR
@@ -187,9 +184,9 @@ implements
     @Getter final @NonNull ApplicationFeatureSort sort;
     
     /**
-     * The {@link ApplicationFeatureId id} of the member's class.
+     * The {@link ApplicationFeatureId id} of the member's logical type.
      */
-    public ApplicationFeatureId getParentClassId() {
+    public ApplicationFeatureId getParentTypeFeatureId() {
         _Assert.assertTrue(sort.isMember());
         final String logicalTypeName = this.getNamespace() + "." + getTypeSimpleName();
         return newType(logicalTypeName);
@@ -198,13 +195,13 @@ implements
     // -- PROPERTIES - NON UI
     
     @Programmatic 
-    @Getter @Setter private String namespace;
+    @Getter private String namespace;
 
     @Programmatic 
-    @Getter @Setter private String typeSimpleName;
+    @Getter private String typeSimpleName;
 
     @Programmatic 
-    @Getter @Setter private String memberName;
+    @Getter private String memberName;
 
     @Programmatic
     public String getFullyQualifiedName() {
@@ -239,7 +236,7 @@ implements
      * class or package.
      */
     @Programmatic
-    public ApplicationFeatureId getParentPackageId() {
+    public ApplicationFeatureId getParentNamespaceFeatureId() {
         
         _Assert.assertFalse(sort.isMember());
 
@@ -286,35 +283,43 @@ implements
 
     // -- pathIds, parentIds
 
-    @Programmatic
-    public List<ApplicationFeatureId> getPathIds() {
-        //TODO[2533] add memoization
-        return pathIds(this);
+    private transient Can<ApplicationFeatureId> pathIds;
+    
+    @Programmatic @Synchronized
+    public Can<ApplicationFeatureId> getPathIds() {
+        if(pathIds==null) {
+            pathIds = pathIds(this);
+        }
+        return pathIds;
     }
 
     @Programmatic
-    public List<ApplicationFeatureId> getParentIds() {
-        //TODO[2533] add memoization
-        return pathIds(getParentId());
+    public Can<ApplicationFeatureId> getParentFeatureIds() {
+        val parent = getParentFeatureId();
+        return parent!=null
+                ? getParentFeatureId().getPathIds()
+                : Can.empty();
     }
 
-    private ApplicationFeatureId getParentId() {
-        return sort == ApplicationFeatureSort.MEMBER
-                ? getParentClassId()
-                : getParentPackageId();
+    private ApplicationFeatureId getParentFeatureId() {
+        return sort.isMember()
+                ? getParentTypeFeatureId()
+                : getParentNamespaceFeatureId();
     }
 
-    private static List<ApplicationFeatureId> pathIds(final ApplicationFeatureId id) {
-        final List<ApplicationFeatureId> featureIds = _Lists.newArrayList();
-        return Collections.unmodifiableList(appendParents(id, featureIds));
+    private static Can<ApplicationFeatureId> pathIds(final ApplicationFeatureId featureId) {
+        val featureIds = _Lists.<ApplicationFeatureId>newArrayList();
+        visitSelfAndParents(featureId, featureIds::add);
+        return Can.ofCollection(featureIds);
     }
 
-    private static List<ApplicationFeatureId> appendParents(final ApplicationFeatureId featureId, final List<ApplicationFeatureId> parentIds) {
+    private static void visitSelfAndParents(
+            final ApplicationFeatureId featureId, 
+            final Consumer<ApplicationFeatureId> onNext) {
         if(featureId != null) {
-            parentIds.add(featureId);
-            appendParents(featureId.getParentId(), parentIds);
+            onNext.accept(featureId);
+            visitSelfAndParents(featureId.getParentFeatureId(), onNext);
         }
-        return parentIds;
     }
 
     // -- OBJECT CONTRACT
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index d325519..6efee8c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -212,7 +212,7 @@ implements ApplicationFeatureRepository {
 
 
     ApplicationFeatureId addClassParent(final ApplicationFeatureId classFeatureId) {
-        final ApplicationFeatureId parentPackageId = classFeatureId.getParentPackageId();
+        final ApplicationFeatureId parentPackageId = classFeatureId.getParentNamespaceFeatureId();
         final ApplicationFeature parentPackage = findPackageElseCreate(parentPackageId);
 
         parentPackage.addToContents(classFeatureId);
@@ -220,7 +220,7 @@ implements ApplicationFeatureRepository {
     }
 
     void addParents(final ApplicationFeatureId classOrPackageId) {
-        final ApplicationFeatureId parentPackageId = classOrPackageId.getParentPackageId();
+        final ApplicationFeatureId parentPackageId = classOrPackageId.getParentNamespaceFeatureId();
         if (parentPackageId == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
index bfca014..13a9c22 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.metamodel.services.appfeat;
 
+import java.util.Objects;
 import java.util.function.Predicate;
 
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
@@ -27,10 +28,10 @@ import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 final class _Predicates {
 
     public static Predicate<ApplicationFeatureId> isClassContaining(
-            final ApplicationMemberType memberType, final ApplicationFeatureRepositoryDefault applicationFeatures) {
-        return new Predicate<ApplicationFeatureId>() {
-            @Override
-            public boolean test(final ApplicationFeatureId input) {
+            final ApplicationMemberType memberType, 
+            final ApplicationFeatureRepositoryDefault applicationFeatures) {
+        
+        return (final ApplicationFeatureId input) -> {
                 if(input.getSort() != ApplicationFeatureSort.TYPE) {
                     return false;
                 }
@@ -38,13 +39,15 @@ final class _Predicates {
                 if(feature == null) {
                     return false;
                 }
-                return memberType == null || !feature.membersOf(memberType).isEmpty();
-            }
+                return memberType == null 
+                        || !feature.membersOf(memberType).isEmpty();
         };
     }
 
-    public static Predicate<ApplicationFeatureId> isClassRecursivelyWithin(final ApplicationFeatureId packageId) {
-        return (ApplicationFeatureId input) -> input.getParentIds().contains(packageId);
+    public static Predicate<ApplicationFeatureId> isClassRecursivelyWithin(
+            final ApplicationFeatureId packageId) {
+        return (final ApplicationFeatureId input) -> 
+            input.getPathIds().stream().skip(1L).anyMatch(id->Objects.equals(id, packageId));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 5f1da3d..b4d49e1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -181,7 +181,8 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newNamespace("com");
 
             // when
-            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
+            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentFeatureIds()
+                    .toList();
 
             // then
             assertThat(parentIds, emptyCollectionOf(ApplicationFeatureId.class));
@@ -194,7 +195,8 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
 
             // when
-            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
+            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentFeatureIds()
+                    .toList();
 
             // then
             assertThat(parentIds, contains(ApplicationFeatureId.newNamespace("com")));
@@ -207,7 +209,8 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany.bish.bosh");
 
             // when
-            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
+            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentFeatureIds()
+                    .toList();
 
             // then
             assertThat(parentIds, contains(
@@ -224,7 +227,8 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // when
-            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
+            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentFeatureIds()
+                    .toList();
 
             // then
             assertThat(parentIds, contains(
@@ -240,7 +244,8 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             // when
-            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
+            final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentFeatureIds()
+                    .toList();
 
             // then
             assertThat(parentIds, contains(
@@ -259,7 +264,7 @@ public class ApplicationFeatureIdTest {
             // given
             val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
             // when
-            val parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentNamespaceFeatureId();
             // then
             assertThat(parentPackageId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is("com"));
@@ -272,7 +277,7 @@ public class ApplicationFeatureIdTest {
             // given
             val applicationFeatureId = ApplicationFeatureId.newNamespace("com");
             // when
-            val parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentNamespaceFeatureId();
             // then
             assertThat(parentPackageId, is(nullValue()));
         }
@@ -282,7 +287,7 @@ public class ApplicationFeatureIdTest {
             // given
             val applicationFeatureId = ApplicationFeatureId.newNamespace("");
             // when
-            val parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentNamespaceFeatureId();
             // then
             assertThat(parentPackageId, is(nullValue()));
         }
@@ -293,7 +298,7 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // when
-            val parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentNamespaceFeatureId();
 
             // then
             assertThat(parentPackageId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
@@ -308,7 +313,7 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newType("Bar");
 
             // when
-            val parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentNamespaceFeatureId();
 
             // then
             assertThat(parentPackageId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
@@ -324,10 +329,10 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             // then
-            expectedException.expect(IllegalStateException.class);
+            expectedException.expect(AssertionError.class);
 
             // when
-            applicationFeatureId.getParentPackageId();
+            applicationFeatureId.getParentNamespaceFeatureId();
         }
 
     }
@@ -340,7 +345,7 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             // when
-            val parentClassId = applicationFeatureId.getParentClassId();
+            val parentClassId = applicationFeatureId.getParentTypeFeatureId();
 
             // then
             assertThat(parentClassId.getSort(), is(ApplicationFeatureSort.TYPE));
@@ -355,10 +360,10 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newNamespace("com");
 
             // then
-            expectedException.expect(IllegalStateException.class);
+            expectedException.expect(AssertionError.class);
 
             // when
-            applicationFeatureId.getParentClassId();
+            applicationFeatureId.getParentTypeFeatureId();
         }
 
         @Test
@@ -368,10 +373,10 @@ public class ApplicationFeatureIdTest {
             val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // then
-            expectedException.expect(IllegalStateException.class);
+            expectedException.expect(AssertionError.class);
 
             // when
-            applicationFeatureId.getParentClassId();
+            applicationFeatureId.getParentTypeFeatureId();
         }
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index a37c42c..2818b99 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -289,7 +289,7 @@ public class ApplicationFeatureRepositoryDefaultTest {
             final ApplicationFeatureId classParentId = applicationFeatureRepository.addClassParent(classFeatureId);
 
             // then
-            Assert.assertThat(classParentId, is(equalTo(classFeatureId.getParentPackageId())));
+            Assert.assertThat(classParentId, is(equalTo(classFeatureId.getParentNamespaceFeatureId())));
             final ApplicationFeature classPackage = applicationFeatureRepository.findPackage(classParentId);
             assertThat(classPackage, is(newlyCreatedParent));
         }
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java
index 6bd68ab..3545049 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java
@@ -109,8 +109,7 @@ public class ApplicationPermissionValue implements Comparable<ApplicationPermiss
 
     private boolean onPathOf(final ApplicationFeatureId featureId) {
 
-        final List<ApplicationFeatureId> pathIds = featureId.getPathIds();
-        for (final ApplicationFeatureId pathId : pathIds) {
+        for (final ApplicationFeatureId pathId : featureId.getPathIds()) {
             if(getFeatureId().equals(pathId)) {
                 return true;
             }
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
index 6ffa62f..b80476f 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
@@ -142,8 +142,8 @@ public class ApplicationPermissionValueSet implements Serializable {
     public Evaluation evaluate(
             final ApplicationFeatureId featureId,
             final ApplicationPermissionMode mode) {
-        final List<ApplicationFeatureId> pathIds = featureId.getPathIds();
-        for (final ApplicationFeatureId pathId : pathIds) {
+        
+        for (final ApplicationFeatureId pathId : featureId.getPathIds()) {
             final Collection<ApplicationPermissionValue> permissionValues = permissionsByFeature.get(pathId);
             final Evaluation evaluation = permissionsEvaluationService.evaluate(featureId, mode, permissionValues);
             if(evaluation != null) {
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
index e143702..1dad3e5 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
@@ -237,8 +237,8 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     public ApplicationFeatureViewModel getParent() {
         final ApplicationFeatureId parentId;
         parentId = getType() == ApplicationFeatureSort.MEMBER
-                ? getFeatureId().getParentClassId()
-                : getFeatureId().getParentPackageId();
+                ? getFeatureId().getParentTypeFeatureId()
+                : getFeatureId().getParentNamespaceFeatureId();
         if(parentId == null) {
             return null;
         }
@@ -275,7 +275,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     @Programmatic
     public ApplicationFeatureViewModel getParentPackage() {
         return Functions.asViewModelForId(applicationFeatureRepository, factory)
-                .apply(getFeatureId().getParentPackageId());
+                .apply(getFeatureId().getParentNamespaceFeatureId());
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
index bfdd50c..36d1451 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
@@ -84,19 +84,19 @@ public class ApplicationUser_filterPermissions {
     }
 
 
-    static Predicate<ApplicationFeature> within(final String packageFqn, final String className) {
+    static Predicate<ApplicationFeature> within(final String namespace, final String logicalTypeSimpleName) {
         return (ApplicationFeature input) -> {
             final ApplicationFeatureId inputFeatureId = input.getFeatureId();
 
             // recursive match on package
-            final ApplicationFeatureId packageId = ApplicationFeatureId.newNamespace(packageFqn);
-            final List<ApplicationFeatureId> pathIds = inputFeatureId.getPathIds();
-            if(!pathIds.contains(packageId)) {
+            val namespaceId = ApplicationFeatureId.newNamespace(namespace);
+            if(!inputFeatureId.getPathIds().contains(namespaceId)) {
                 return false;
             }
 
             // match on class (if specified)
-            return className == null || Objects.equals(inputFeatureId.getTypeSimpleName(), className);
+            return logicalTypeSimpleName == null 
+                    || Objects.equals(inputFeatureId.getTypeSimpleName(), logicalTypeSimpleName);
         };
     }
 


[isis] 02/09: ISIS-2553: simplify static functions

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 ec7c553f66c3a7f34f89d78e8a9758d4424699e7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 15:11:26 2021 +0100

    ISIS-2553: simplify static functions
---
 .../applib/services/appfeat/ApplicationFeatureId.java  | 18 ------------------
 .../appfeat/ApplicationFeatureRepositoryDefault.java   |  6 +++---
 .../services/appfeat/ApplicationFeatureIdTest.java     |  5 +++--
 3 files changed, 6 insertions(+), 23 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index f465792..4d728b1 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -23,7 +23,6 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import java.util.function.Function;
 
 import static java.util.Comparator.comparing;
 import static java.util.Comparator.naturalOrder;
@@ -267,23 +266,6 @@ implements
 
     // //////////////////////////////////////
 
-    // -- Functions
-
-    public static class Functions {
-
-        private Functions(){}
-
-        public static final Function<ApplicationFeatureId, String> GET_CLASS_NAME = 
-                ApplicationFeatureId::getTypeSimpleName;
-
-        public static final Function<ApplicationFeatureId, String> GET_MEMBER_NAME = 
-                ApplicationFeatureId::getMemberName;
-
-    }
-
-
-    // //////////////////////////////////////
-
     // -- Comparators
     public static final class Comparators {
         private Comparators(){}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index b718d1d..f4e6738 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -495,7 +495,7 @@ implements ApplicationFeatureRepository {
         final SortedSet<ApplicationFeatureId> contents = pkg.getContents();
         return contents.stream()
                 .filter(_Predicates.isClassContaining(memberType, this))
-                .map(ApplicationFeatureId.Functions.GET_CLASS_NAME)
+                .map(ApplicationFeatureId::getTypeSimpleName)
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
@@ -510,7 +510,7 @@ implements ApplicationFeatureRepository {
         final Set<ApplicationFeatureId> classIds = this.classFeatures.keySet();
         return classIds.stream()
                 .filter(_Predicates.isClassRecursivelyWithin(packageId))
-                .map(ApplicationFeatureId.Functions.GET_CLASS_NAME)
+                .map(ApplicationFeatureId::getTypeSimpleName)
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
@@ -527,7 +527,7 @@ implements ApplicationFeatureRepository {
         }
         final SortedSet<ApplicationFeatureId> featureIds = cls.membersOf(memberType);
         return featureIds.stream()
-                .map(ApplicationFeatureId.Functions.GET_MEMBER_NAME)
+                .map(ApplicationFeatureId::getMemberName)
                 .collect(_Sets.toUnmodifiableSorted());
     }
     
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 7c319c4..38526f5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -547,7 +547,7 @@ public class ApplicationFeatureIdTest {
 
         public static class GET_CLASS_NAME extends FunctionsTest {
 
-            private Function<ApplicationFeatureId, String> func = ApplicationFeatureId.Functions.GET_CLASS_NAME;
+            private Function<ApplicationFeatureId, String> func = ApplicationFeatureId::getTypeSimpleName;
 
             @Test
             public void whenNull() throws Exception {
@@ -574,7 +574,8 @@ public class ApplicationFeatureIdTest {
 
         public static class GET_MEMBER_NAME extends FunctionsTest {
 
-            private Function<ApplicationFeatureId, String> func = ApplicationFeatureId.Functions.GET_MEMBER_NAME;
+            private Function<ApplicationFeatureId, String> func = 
+                    ApplicationFeatureId::getMemberName;
 
             @Test
             public void whenNull() throws Exception {


[isis] 04/09: ISIS-2553: rename PACKAGE -> NAMESPACE, rename CLASS -> TYPE

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 23426dcaaf64a79dcb035168ddbc5ddb20fd3430
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 15:42:24 2021 +0100

    ISIS-2553: rename PACKAGE -> NAMESPACE, rename CLASS -> TYPE
---
 .../services/appfeat/ApplicationFeatureId.java     | 109 ++++++++--------
 .../services/appfeat/ApplicationFeatureType.java   |  20 +--
 .../ApplicationFeatureRepositoryDefault.java       |  20 +--
 .../core/metamodel/services/appfeat/_Asserts.java  |   2 +-
 .../metamodel/services/appfeat/_Predicates.java    |   2 +-
 .../services/appfeat/ApplicationFeatureIdTest.java | 138 ++++++++++-----------
 .../ApplicationFeatureRepositoryDefaultTest.java   |  30 ++---
 .../services/appfeat/ApplicationFeatureTest.java   |  28 ++---
 .../appfeat/ApplicationFeatureTypeTest.java        |  30 ++---
 .../api/permission/ApplicationPermission.java      |   4 +-
 .../app/feature/ApplicationFeatureViewModel.java   |   6 +-
 .../model/app/feature/ApplicationPackage.java      |   2 +-
 .../user/ApplicationUser_filterPermissions.java    |   2 +-
 .../model/app/user/UserPermissionViewModel.java    |   2 +-
 .../model/dom/role/ApplicationRole_addClass.java   |   2 +-
 .../model/dom/role/ApplicationRole_addPackage.java |   4 +-
 .../dom/role/ApplicationRole_removePermission.java |   2 +-
 .../ApplicationPermissionRepository.java           |   4 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |   4 +-
 .../ApplicationPermissionRepository.java           |   4 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |   4 +-
 21 files changed, 213 insertions(+), 206 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index faccc3e..d309436 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -28,6 +28,8 @@ import static java.util.Comparator.comparing;
 import static java.util.Comparator.naturalOrder;
 import static java.util.Comparator.nullsFirst;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Value;
@@ -62,8 +64,8 @@ implements
 
     // -- CONSTANTS
 
-    public static final ApplicationFeatureId PACKAGE_DEFAULT = 
-            new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "default");
+    public static final ApplicationFeatureId NAMESPACE_DEFAULT = 
+            new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "default");
 
     // -- FACTORY METHODS
 
@@ -72,7 +74,7 @@ implements
         val logicalTypeName = identifier.getLogicalTypeName();
         
         if(identifier.getType().isClass()) {
-            return newClass(logicalTypeName); 
+            return newType(logicalTypeName); 
         }
         if(identifier.getType().isPropertyOrCollection()) {
             return newMember(logicalTypeName, identifier.getMemberName());
@@ -83,46 +85,46 @@ implements
     
     public static ApplicationFeatureId newFeature(
             final ApplicationFeatureType featureType, 
-            final String fullyQualifiedName) {
+            final String qualifiedName) {
         
         switch (featureType) {
-        case PACKAGE:
-            return newPackage(fullyQualifiedName);
-        case CLASS:
-            return newClass(fullyQualifiedName);
+        case NAMESPACE:
+            return newNamespace(qualifiedName);
+        case TYPE:
+            return newType(qualifiedName);
         case MEMBER:
-            return newMember(fullyQualifiedName);
+            return newMember(qualifiedName);
         }
         throw new IllegalArgumentException("Unknown feature type " + featureType);
     }
 
     public static ApplicationFeatureId newFeature(
-            final String packageFqn, 
-            final String className,
-            final String memberName) {
-        if(className == null) {
-            return newPackage(packageFqn);
+            final @NonNull  String namespace, 
+            final @Nullable String logicalTypeSimpleName,
+            final @Nullable String memberName) {
+        if(logicalTypeSimpleName == null) {
+            return newNamespace(namespace);
         }
-        final String classFqn = packageFqn + "." + className;
+        val logicalTypeName = namespace + "." + logicalTypeSimpleName;
         if(memberName == null) {
-            return newClass(classFqn);
+            return newType(logicalTypeName);
         }
-        return newMember(classFqn, memberName);
+        return newMember(logicalTypeName, memberName);
     }
 
-    public static ApplicationFeatureId newPackage(final String packageFqn) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.PACKAGE);
-        featureId.setNamespace(packageFqn);
+    public static ApplicationFeatureId newNamespace(final String namespace) {
+        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE);
+        featureId.setNamespace(namespace);
         return featureId;
     }
 
-    public static ApplicationFeatureId newClass(final String classFqn) {
-        return new ApplicationFeatureId(ApplicationFeatureType.CLASS, classFqn);
+    public static ApplicationFeatureId newType(final String logicalTypeName) {
+        return new ApplicationFeatureId(ApplicationFeatureType.TYPE, logicalTypeName);
     }
 
-    public static ApplicationFeatureId newMember(final String classFqn, final String memberName) {
+    public static ApplicationFeatureId newMember(final String logicalTypeName, final String memberName) {
         final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
-        ApplicationFeatureType.CLASS.init(featureId, classFqn);
+        ApplicationFeatureType.TYPE.init(featureId, logicalTypeName);
         featureId.type = ApplicationFeatureType.MEMBER;
         featureId.setMemberName(memberName);
         return featureId;
@@ -152,7 +154,7 @@ implements
         type.init(this, fullyQualifiedName);
     }
 
-    // -- IDENTIFICATION
+    // -- TITLE
     
     /**
      * having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use
@@ -165,6 +167,19 @@ implements
     }
 
     // -- PROPERTIES
+    
+    @Getter ApplicationFeatureType type;
+    
+    /**
+     * The {@link ApplicationFeatureId id} of the member's class.
+     */
+    public ApplicationFeatureId getParentClassId() {
+        ApplicationFeatureType.ensureMember(this);
+        final String classFqn = this.getNamespace() + "." + getTypeSimpleName();
+        return newType(classFqn);
+    }
+    
+    // -- PROPERTIES - NON UI
 
     @Programmatic
     public String getFullyQualifiedName() {
@@ -194,8 +209,6 @@ implements
         return buf.toString();
     }
 
-    @Getter ApplicationFeatureType type;
-
     @Programmatic 
     @Getter @Setter private String namespace;
 
@@ -213,8 +226,8 @@ implements
     public ApplicationFeatureId getParentPackageId() {
         ApplicationFeatureType.ensurePackageOrClass(this);
 
-        if(type == ApplicationFeatureType.CLASS) {
-            return ApplicationFeatureId.newPackage(getNamespace());
+        if(type == ApplicationFeatureType.TYPE) {
+            return ApplicationFeatureId.newNamespace(getNamespace());
         } else {
             final String packageName = getNamespace(); // eg aaa.bbb.ccc
 
@@ -225,19 +238,10 @@ implements
             final int cutOffPos = packageName.lastIndexOf('.');
             final String parentPackageName = packageName.substring(0, cutOffPos);
 
-            return newPackage(parentPackageName);
+            return newNamespace(parentPackageName);
         }
     }
 
-    /**
-     * The {@link ApplicationFeatureId id} of the member's class.
-     */
-    public ApplicationFeatureId getParentClassId() {
-        ApplicationFeatureType.ensureMember(this);
-        final String classFqn = this.getNamespace() + "." + getTypeSimpleName();
-        return newClass(classFqn);
-    }
-
     // -- ENCODING / DECODING
 
     @Programmatic
@@ -264,22 +268,24 @@ implements
         return new ApplicationFeatureId(_Strings.base64UrlDecode(encodedString));
     }
 
-    // //////////////////////////////////////
-
     // -- pathIds, parentIds
 
     @Programmatic
     public List<ApplicationFeatureId> getPathIds() {
+        //TODO[2533] add memoization
         return pathIds(this);
     }
 
     @Programmatic
     public List<ApplicationFeatureId> getParentIds() {
+        //TODO[2533] add memoization
         return pathIds(getParentId());
     }
 
     private ApplicationFeatureId getParentId() {
-        return type == ApplicationFeatureType.MEMBER? getParentClassId(): getParentPackageId();
+        return type == ApplicationFeatureType.MEMBER
+                ? getParentClassId()
+                : getParentPackageId();
     }
 
     private static List<ApplicationFeatureId> pathIds(final ApplicationFeatureId id) {
@@ -326,8 +332,8 @@ implements
 
     private static final ToString<ApplicationFeatureId> toString =
             ObjectContracts.toString("type", ApplicationFeatureId::getType)
-            .thenToString("packageName", ApplicationFeatureId::getNamespace)
-            .thenToStringOmitIfAbsent("className", ApplicationFeatureId::getTypeSimpleName)
+            .thenToString("namespace", ApplicationFeatureId::getNamespace)
+            .thenToStringOmitIfAbsent("typeSimpleName", ApplicationFeatureId::getTypeSimpleName)
             .thenToStringOmitIfAbsent("memberName", ApplicationFeatureId::getMemberName);
 
 
@@ -354,7 +360,8 @@ implements
     // -- WITHERS
     
     /**
-     * Returns a new instance that is a clone of this, except for the namespace which is taken from the argument. 
+     * Returns a new instance that is a clone of this, except for the namespace,
+     * which is taken from the argument. 
      * @param namespace
      */
     public ApplicationFeatureId withNamespace(final @NonNull String namespace) {
@@ -362,16 +369,16 @@ implements
     }
 
     @Deprecated // duplicate
-    public static ApplicationFeatureId createPackage(String fqn) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureType.PACKAGE);
-        ApplicationFeatureType.PACKAGE.init(feat, fqn);
+    public static ApplicationFeatureId createNamespace(String namespace) {
+        val feat = new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE);
+        ApplicationFeatureType.NAMESPACE.init(feat, namespace);
         return feat;
     }
     
     @Deprecated // duplicate
-    public static ApplicationFeatureId createClass(String fqn) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureType.CLASS);
-        ApplicationFeatureType.CLASS.init(feat, fqn);
+    public static ApplicationFeatureId createType(String logicalTypeName) {
+        val feat = new ApplicationFeatureId(ApplicationFeatureType.TYPE);
+        ApplicationFeatureType.TYPE.init(feat, logicalTypeName);
         return feat;
     }
     
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
index 81415a9..99c65ee 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
@@ -23,9 +23,9 @@ import org.apache.isis.commons.internal.base._Strings;
 public enum ApplicationFeatureType {
     
     /** 
-     * logical package aka <i>object namespace</i>
+     * logical namespace, leading part of the <i>object type</i> (aka logical type)
      */
-    PACKAGE {
+    NAMESPACE {
         @Override
         void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
             feature.setNamespace(fullyQualifiedName);
@@ -36,9 +36,9 @@ public enum ApplicationFeatureType {
     },
     
     /** 
-     * logical class aka <i>object type</i>
+     * logical type, simple name of the <i>object type</i> (aka logical type)
      */
-    CLASS {
+    TYPE {
         @Override
         void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
             final int i = fullyQualifiedName.lastIndexOf(".");
@@ -67,36 +67,36 @@ public enum ApplicationFeatureType {
             }
             final String className = fullyQualifiedName.substring(0, i);
             final String memberName = fullyQualifiedName.substring(i+1);
-            CLASS.init(feature, className);
+            TYPE.init(feature, className);
             feature.setMemberName(memberName);
             feature.type = this;
         }
     };
 
     public boolean hideClassName() {
-        return this == ApplicationFeatureType.PACKAGE;
+        return this == ApplicationFeatureType.NAMESPACE;
     }
     
     public boolean hideMember() {
-        return this == ApplicationFeatureType.PACKAGE || this == ApplicationFeatureType.CLASS;
+        return this == ApplicationFeatureType.NAMESPACE || this == ApplicationFeatureType.TYPE;
     }
 
     abstract void init(ApplicationFeatureId applicationFeatureId, String fullyQualifiedName);
 
     public static void ensurePackage(final ApplicationFeatureId feature) {
-        if(feature.type != ApplicationFeatureType.PACKAGE) {
+        if(feature.type != ApplicationFeatureType.NAMESPACE) {
             throw new IllegalStateException("Can only be called for a package; " + feature.toString());
         }
     }
 
     public static void ensurePackageOrClass(final ApplicationFeatureId applicationFeatureId) {
-        if(applicationFeatureId.type != ApplicationFeatureType.PACKAGE && applicationFeatureId.type != ApplicationFeatureType.CLASS) {
+        if(applicationFeatureId.type != ApplicationFeatureType.NAMESPACE && applicationFeatureId.type != ApplicationFeatureType.TYPE) {
             throw new IllegalStateException("Can only be called for a package or a class; " + applicationFeatureId.toString());
         }
     }
 
     public static void ensureClass(final ApplicationFeatureId feature) {
-        if(feature.type != ApplicationFeatureType.CLASS) {
+        if(feature.type != ApplicationFeatureType.TYPE) {
             throw new IllegalStateException("Can only be called for a class; " + feature.toString());
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index f4e6738..9883a62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -158,7 +158,7 @@ implements ApplicationFeatureRepository {
         }
 
         final String logicalTypeName = spec.getLogicalTypeName();
-        final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass(logicalTypeName);
+        final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType(logicalTypeName);
 
         // add class to our map
         // (later on it may get removed if the class turns out to have no features,
@@ -373,9 +373,9 @@ implements ApplicationFeatureRepository {
     public ApplicationFeature findFeature(final ApplicationFeatureId featureId) {
         initializeIfRequired();
         switch (featureId.getType()) {
-        case PACKAGE:
+        case NAMESPACE:
             return findPackage(featureId);
-        case CLASS:
+        case TYPE:
             return findClass(featureId);
         case MEMBER:
             return findMember(featureId);
@@ -411,9 +411,9 @@ implements ApplicationFeatureRepository {
             return Collections.emptyList();
         }
         switch (featureType) {
-        case PACKAGE:
+        case NAMESPACE:
             return allPackages();
-        case CLASS:
+        case TYPE:
             return allClasses();
         case MEMBER:
             return allMembers();
@@ -468,7 +468,7 @@ implements ApplicationFeatureRepository {
     @Override
     public SortedSet<String> packageNames() {
         initializeIfRequired();
-        return stream(allFeatures(ApplicationFeatureType.PACKAGE))
+        return stream(allFeatures(ApplicationFeatureType.NAMESPACE))
                 .map(ApplicationFeature.Functions.GET_FQN)
                 .collect(_Sets.toUnmodifiableSorted());
     }
@@ -476,7 +476,7 @@ implements ApplicationFeatureRepository {
     @Override
     public SortedSet<String> packageNamesContainingClasses(final ApplicationMemberType memberType) {
         initializeIfRequired();
-        final Collection<ApplicationFeature> packages = allFeatures(ApplicationFeatureType.PACKAGE);
+        final Collection<ApplicationFeature> packages = allFeatures(ApplicationFeatureType.NAMESPACE);
 
         return stream(packages)
                 .filter(ApplicationFeature.Predicates.packageContainingClasses(memberType, this))
@@ -487,7 +487,7 @@ implements ApplicationFeatureRepository {
     @Override
     public SortedSet<String> classNamesContainedIn(final String packageFqn, final ApplicationMemberType memberType) {
         initializeIfRequired();
-        final ApplicationFeatureId packageId = ApplicationFeatureId.newPackage(packageFqn);
+        final ApplicationFeatureId packageId = ApplicationFeatureId.newNamespace(packageFqn);
         final ApplicationFeature pkg = findPackage(packageId);
         if (pkg == null) {
             return Collections.emptySortedSet();
@@ -502,7 +502,7 @@ implements ApplicationFeatureRepository {
     @Override
     public SortedSet<String> classNamesRecursivelyContainedIn(final String packageFqn) {
         initializeIfRequired();
-        final ApplicationFeatureId packageId = ApplicationFeatureId.newPackage(packageFqn);
+        final ApplicationFeatureId packageId = ApplicationFeatureId.newNamespace(packageFqn);
         final ApplicationFeature pkg = findPackage(packageId);
         if (pkg == null) {
             return Collections.emptySortedSet();
@@ -520,7 +520,7 @@ implements ApplicationFeatureRepository {
             final String className,
             final ApplicationMemberType memberType) {
         initializeIfRequired();
-        final ApplicationFeatureId classId = ApplicationFeatureId.newClass(packageFqn + "." + className);
+        final ApplicationFeatureId classId = ApplicationFeatureId.newType(packageFqn + "." + className);
         final ApplicationFeature cls = findClass(classId);
         if (cls == null) {
             return Collections.emptySortedSet();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
index 369d8f7..d3409c7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
@@ -31,7 +31,7 @@ final class _Asserts {
         return new Predicate<ApplicationFeatureId>() {
             @Override
             public boolean test(final ApplicationFeatureId input) {
-                if(input.getType() != ApplicationFeatureType.CLASS) {
+                if(input.getType() != ApplicationFeatureType.TYPE) {
                     return false;
                 }
                 final ApplicationFeature feature = applicationFeatures.findFeature(input);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
index 93b4fc7..99a8743 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
@@ -31,7 +31,7 @@ final class _Predicates {
         return new Predicate<ApplicationFeatureId>() {
             @Override
             public boolean test(final ApplicationFeatureId input) {
-                if(input.getType() != ApplicationFeatureType.CLASS) {
+                if(input.getType() != ApplicationFeatureType.TYPE) {
                     return false;
                 }
                 final ApplicationFeature feature = applicationFeatures.findFeature(input);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 38526f5..53a89fb 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -67,9 +67,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void testNewPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
             // then
-            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.PACKAGE));
+            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.NAMESPACE));
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is(nullValue()));
             assertThat(applicationFeatureId.getMemberName(), is(nullValue()));
@@ -81,9 +81,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void testNewClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
             // then
-            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.CLASS));
+            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.TYPE));
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
             assertThat(applicationFeatureId.getMemberName(), is(nullValue()));
@@ -121,17 +121,17 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "com.mycompany");
+            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "com.mycompany");
             // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newPackage("com.mycompany")));
+            assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
         }
 
         @Test
         public void whenClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.CLASS, "com.mycompany.Bar");
+            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.TYPE, "com.mycompany.Bar");
             // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newClass("com.mycompany.Bar")));
+            assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
         }
 
         @Test
@@ -148,17 +148,17 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.PACKAGE, "com.mycompany");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.NAMESPACE, "com.mycompany");
             // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newPackage("com.mycompany")));
+            assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
         }
 
         @Test
         public void whenClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.CLASS, "com.mycompany.Bar");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.TYPE, "com.mycompany.Bar");
             // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newClass("com.mycompany.Bar")));
+            assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
         }
 
         @Test
@@ -177,7 +177,7 @@ public class ApplicationFeatureIdTest {
             // when
             final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", null, null);
             // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newPackage("com.mycompany")));
+            assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
         }
 
         @Test
@@ -185,7 +185,7 @@ public class ApplicationFeatureIdTest {
             // when
             final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", null);
             // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newClass("com.mycompany.Bar")));
+            assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
         }
 
         @Test
@@ -203,7 +203,7 @@ public class ApplicationFeatureIdTest {
         public void whenPackageWithNoParent() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
@@ -216,29 +216,29 @@ public class ApplicationFeatureIdTest {
         public void whenPackageWithHasParent() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
 
             // then
-            assertThat(parentIds, contains(ApplicationFeatureId.newPackage("com")));
+            assertThat(parentIds, contains(ApplicationFeatureId.newNamespace("com")));
         }
 
         @Test
         public void whenPackageWithHasParents() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany.bish.bosh");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany.bish.bosh");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
 
             // then
             assertThat(parentIds, contains(
-                    ApplicationFeatureId.newPackage("com.mycompany.bish"),
-                    ApplicationFeatureId.newPackage("com.mycompany"),
-                    ApplicationFeatureId.newPackage("com")
+                    ApplicationFeatureId.newNamespace("com.mycompany.bish"),
+                    ApplicationFeatureId.newNamespace("com.mycompany"),
+                    ApplicationFeatureId.newNamespace("com")
                     ));
         }
 
@@ -246,15 +246,15 @@ public class ApplicationFeatureIdTest {
         public void whenClassWithParents() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
 
             // then
             assertThat(parentIds, contains(
-                    ApplicationFeatureId.newPackage("com.mycompany"),
-                    ApplicationFeatureId.newPackage("com")
+                    ApplicationFeatureId.newNamespace("com.mycompany"),
+                    ApplicationFeatureId.newNamespace("com")
                     ));
         }
 
@@ -269,9 +269,9 @@ public class ApplicationFeatureIdTest {
 
             // then
             assertThat(parentIds, contains(
-                    ApplicationFeatureId.newClass("com.mycompany.Bar"),
-                    ApplicationFeatureId.newPackage("com.mycompany"),
-                    ApplicationFeatureId.newPackage("com")
+                    ApplicationFeatureId.newType("com.mycompany.Bar"),
+                    ApplicationFeatureId.newNamespace("com.mycompany"),
+                    ApplicationFeatureId.newNamespace("com")
                     ));
         }
 
@@ -282,11 +282,11 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenPackageWhenParentIsNotRoot() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
             // when
             final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
             // then
-            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.PACKAGE));
+            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is("com"));
             assertThat(parentPackageId.getTypeSimpleName(), is(nullValue()));
             assertThat(parentPackageId.getMemberName(), is(nullValue()));
@@ -295,7 +295,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenPackageWhenParentIsRoot() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com");
             // when
             final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
             // then
@@ -305,7 +305,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenRootPackage() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("");
             // when
             final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
             // then
@@ -315,13 +315,13 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenClass() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // when
             final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
 
             // then
-            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.PACKAGE));
+            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is("com.mycompany"));
             assertThat(parentPackageId.getTypeSimpleName(), is(nullValue()));
             assertThat(parentPackageId.getMemberName(), is(nullValue()));
@@ -330,13 +330,13 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenClassInRootPackage() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("Bar");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("Bar");
 
             // when
             final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
 
             // then
-            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.PACKAGE));
+            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is(""));
             assertThat(parentPackageId.getTypeSimpleName(), is(nullValue()));
             assertThat(parentPackageId.getMemberName(), is(nullValue()));
@@ -368,7 +368,7 @@ public class ApplicationFeatureIdTest {
             final ApplicationFeatureId parentClassId = applicationFeatureId.getParentClassId();
 
             // then
-            assertThat(parentClassId.getType(), is(ApplicationFeatureType.CLASS));
+            assertThat(parentClassId.getType(), is(ApplicationFeatureType.TYPE));
             assertThat(parentClassId.getNamespace(), is("com.mycompany"));
             assertThat(parentClassId.getTypeSimpleName(), is("Bar"));
             assertThat(parentClassId.getMemberName(), is(nullValue()));
@@ -377,7 +377,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenPackage() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newPackage("com");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com");
 
             // then
             expectedException.expect(IllegalStateException.class);
@@ -390,7 +390,7 @@ public class ApplicationFeatureIdTest {
         public void givenClass() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // then
             expectedException.expect(IllegalStateException.class);
@@ -407,15 +407,15 @@ public class ApplicationFeatureIdTest {
             @Override
             protected List<ApplicationFeatureId> getObjectsWithSameValue() {
                 return Arrays.asList(
-                        ApplicationFeatureId.newPackage("com.mycompany"),
-                        ApplicationFeatureId.newPackage("com.mycompany"));
+                        ApplicationFeatureId.newNamespace("com.mycompany"),
+                        ApplicationFeatureId.newNamespace("com.mycompany"));
             }
 
             @Override
             protected List<ApplicationFeatureId> getObjectsWithDifferentValue() {
                 return Arrays.asList(
-                        ApplicationFeatureId.newPackage("com.mycompany2"),
-                        ApplicationFeatureId.newClass("com.mycompany.Foo"),
+                        ApplicationFeatureId.newNamespace("com.mycompany2"),
+                        ApplicationFeatureId.newType("com.mycompany.Foo"),
                         ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
             }
         }
@@ -425,15 +425,15 @@ public class ApplicationFeatureIdTest {
             @Override
             protected List<ApplicationFeatureId> getObjectsWithSameValue() {
                 return Arrays.asList(
-                        ApplicationFeatureId.newClass("com.mycompany.Foo"),
-                        ApplicationFeatureId.newClass("com.mycompany.Foo"));
+                        ApplicationFeatureId.newType("com.mycompany.Foo"),
+                        ApplicationFeatureId.newType("com.mycompany.Foo"));
             }
 
             @Override
             protected List<ApplicationFeatureId> getObjectsWithDifferentValue() {
                 return Arrays.asList(
-                        ApplicationFeatureId.newPackage("com.mycompany"),
-                        ApplicationFeatureId.newClass("com.mycompany.Foo2"),
+                        ApplicationFeatureId.newNamespace("com.mycompany"),
+                        ApplicationFeatureId.newType("com.mycompany.Foo2"),
                         ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
             }
         }
@@ -450,8 +450,8 @@ public class ApplicationFeatureIdTest {
             @Override
             protected List<ApplicationFeatureId> getObjectsWithDifferentValue() {
                 return Arrays.asList(
-                        ApplicationFeatureId.newPackage("com.mycompany"),
-                        ApplicationFeatureId.newClass("com.mycompany.Foo"),
+                        ApplicationFeatureId.newNamespace("com.mycompany"),
+                        ApplicationFeatureId.newType("com.mycompany.Foo"),
                         ApplicationFeatureId.newMember("com.mycompany.Foo#bar2"));
             }
         }
@@ -472,14 +472,14 @@ public class ApplicationFeatureIdTest {
 
         @Test
         public void classes() throws Exception {
-            feature1 = ApplicationFeatureId.newClass("com.mycompany.B");
+            feature1 = ApplicationFeatureId.newType("com.mycompany.B");
 
             assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=CLASS, packageName=com.mycompany, className=B}")));
         }
 
         @Test
         public void packages() throws Exception {
-            feature1 = ApplicationFeatureId.newPackage("com.b");
+            feature1 = ApplicationFeatureId.newNamespace("com.b");
 
             assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=PACKAGE, packageName=com.b}")));
         }
@@ -503,41 +503,41 @@ public class ApplicationFeatureIdTest {
             feature2 = ApplicationFeatureId.newMember("com.mycompany.Bar#a");
             assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
 
-            feature2 = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            feature2 = ApplicationFeatureId.newType("com.mycompany.Bar");
             assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
 
-            feature2 = ApplicationFeatureId.newPackage("com.mycompany");
+            feature2 = ApplicationFeatureId.newNamespace("com.mycompany");
             assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
         }
 
         @Test
         public void classes() throws Exception {
-            feature1 = ApplicationFeatureId.newClass("com.mycompany.B");
+            feature1 = ApplicationFeatureId.newType("com.mycompany.B");
 
-            feature2 = ApplicationFeatureId.newClass("com.mycompany.C");
+            feature2 = ApplicationFeatureId.newType("com.mycompany.C");
             assertThat(feature1.compareTo(feature2), is(lessThan(0)));
 
-            feature2 = ApplicationFeatureId.newClass("com.mycompany.B");
+            feature2 = ApplicationFeatureId.newType("com.mycompany.B");
             assertThat(feature1.compareTo(feature2), is(equalTo(0)));
 
-            feature2 = ApplicationFeatureId.newClass("com.mycompany.A");
+            feature2 = ApplicationFeatureId.newType("com.mycompany.A");
             assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
 
-            feature2 = ApplicationFeatureId.newPackage("com.mycompany");
+            feature2 = ApplicationFeatureId.newNamespace("com.mycompany");
             assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
         }
 
         @Test
         public void packages() throws Exception {
-            feature1 = ApplicationFeatureId.newPackage("com.b");
+            feature1 = ApplicationFeatureId.newNamespace("com.b");
 
-            feature2 = ApplicationFeatureId.newPackage("com.c");
+            feature2 = ApplicationFeatureId.newNamespace("com.c");
             assertThat(feature1.compareTo(feature2), is(lessThan(0)));
 
-            feature2 = ApplicationFeatureId.newPackage("com.b");
+            feature2 = ApplicationFeatureId.newNamespace("com.b");
             assertThat(feature1.compareTo(feature2), is(equalTo(0)));
 
-            feature2 = ApplicationFeatureId.newPackage("com.a");
+            feature2 = ApplicationFeatureId.newNamespace("com.a");
             assertThat(feature1.compareTo(feature2), is(greaterThan(0)));
         }
     }
@@ -557,12 +557,12 @@ public class ApplicationFeatureIdTest {
 
             @Test
             public void whenPackage() throws Exception {
-                assertThat(func.apply(ApplicationFeatureId.newPackage("com.mycompany")), is(nullValue()));
+                assertThat(func.apply(ApplicationFeatureId.newNamespace("com.mycompany")), is(nullValue()));
             }
 
             @Test
             public void whenClass() throws Exception {
-                assertThat(func.apply(ApplicationFeatureId.newClass("com.mycompany.Bar")), is("Bar"));
+                assertThat(func.apply(ApplicationFeatureId.newType("com.mycompany.Bar")), is("Bar"));
             }
 
             @Test
@@ -585,12 +585,12 @@ public class ApplicationFeatureIdTest {
 
             @Test
             public void whenPackage() throws Exception {
-                assertThat(func.apply(ApplicationFeatureId.newPackage("com.mycompany")), is(nullValue()));
+                assertThat(func.apply(ApplicationFeatureId.newNamespace("com.mycompany")), is(nullValue()));
             }
 
             @Test
             public void whenClass() throws Exception {
-                assertThat(func.apply(ApplicationFeatureId.newClass("com.mycompany.Bar")), is(nullValue()));
+                assertThat(func.apply(ApplicationFeatureId.newType("com.mycompany.Bar")), is(nullValue()));
             }
 
             @Test
@@ -628,7 +628,7 @@ public class ApplicationFeatureIdTest {
                 assertThat(
                         _Predicates.
                         isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
-                        test(ApplicationFeatureId.newPackage("com.mycompany")),
+                        test(ApplicationFeatureId.newNamespace("com.mycompany")),
                         is(false));
                 assertThat(
                         _Predicates.
@@ -639,7 +639,7 @@ public class ApplicationFeatureIdTest {
 
             @Test
             public void whenClassButFeatureNotFound() throws Exception {
-                final ApplicationFeatureId classFeature = ApplicationFeatureId.newClass("com.mycompany.Bar");
+                final ApplicationFeatureId classFeature = ApplicationFeatureId.newType("com.mycompany.Bar");
                 context.checking(new Expectations() {{
                     allowing(mockApplicationFeatureRepository).findFeature(classFeature);
                     will(returnValue(null));
@@ -653,7 +653,7 @@ public class ApplicationFeatureIdTest {
             }
             @Test
             public void whenClassAndFeatureNotFoundButHasNoMembersOfType() throws Exception {
-                final ApplicationFeatureId classFeature = ApplicationFeatureId.newClass("com.mycompany.Bar");
+                final ApplicationFeatureId classFeature = ApplicationFeatureId.newType("com.mycompany.Bar");
                 context.checking(new Expectations() {{
                     oneOf(mockApplicationFeatureRepository).findFeature(classFeature);
                     will(returnValue(mockApplicationFeature));
@@ -670,7 +670,7 @@ public class ApplicationFeatureIdTest {
             }
             @Test
             public void whenClassAndFeatureNotFoundAndHasMembersOfType() throws Exception {
-                final ApplicationFeatureId classFeature = ApplicationFeatureId.newClass("com.mycompany.Bar");
+                final ApplicationFeatureId classFeature = ApplicationFeatureId.newType("com.mycompany.Bar");
                 context.checking(new Expectations() {{
                     oneOf(mockApplicationFeatureRepository).findFeature(classFeature);
                     will(returnValue(mockApplicationFeature));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index 9f0dd47..a37c42c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -178,7 +178,7 @@ public class ApplicationFeatureRepositoryDefaultTest {
             context.checking(new Expectations() {{
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newClass(Bar.class.getName()))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newType(Bar.class.getName()))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
@@ -194,44 +194,44 @@ public class ApplicationFeatureRepositoryDefaultTest {
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newPackage("org.isisaddons.module.security.dom.feature"))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom.feature"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newPackage("org.isisaddons.module.security.dom"))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newPackage("org.isisaddons.module.security"))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newPackage("org.isisaddons.module"))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newPackage("org.isisaddons"))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newPackage("org"))));
+                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org"))));
             }});
 
             // when
             applicationFeatureRepository.createApplicationFeaturesFor(mockSpec);
 
             // then
-            final ApplicationFeature orgPkg = applicationFeatureRepository.findPackage(ApplicationFeatureId.newPackage("org"));
+            final ApplicationFeature orgPkg = applicationFeatureRepository.findPackage(ApplicationFeatureId.newNamespace("org"));
             assertThat(orgPkg, is(notNullValue()));
-            final ApplicationFeature orgIsisaddonsPkg = applicationFeatureRepository.findPackage(ApplicationFeatureId.newPackage("org.isisaddons"));
+            final ApplicationFeature orgIsisaddonsPkg = applicationFeatureRepository.findPackage(ApplicationFeatureId.newNamespace("org.isisaddons"));
             assertThat(orgPkg, is(notNullValue()));
-            final ApplicationFeature featurePkg = applicationFeatureRepository.findPackage(ApplicationFeatureId.newPackage("org.isisaddons.module.security.dom.feature"));
+            final ApplicationFeature featurePkg = applicationFeatureRepository.findPackage(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom.feature"));
             assertThat(orgPkg, is(notNullValue()));
             assertThat(orgPkg.getContents(), contains(orgIsisaddonsPkg.getFeatureId()));
-            assertThat(featurePkg.getContents(), contains(ApplicationFeatureId.newClass(Bar.class.getName())));
+            assertThat(featurePkg.getContents(), contains(ApplicationFeatureId.newType(Bar.class.getName())));
 
             // then
-            final ApplicationFeature barClass = applicationFeatureRepository.findClass(ApplicationFeatureId.newClass(Bar.class.getName()));
+            final ApplicationFeature barClass = applicationFeatureRepository.findClass(ApplicationFeatureId.newType(Bar.class.getName()));
             assertThat(barClass, is(Matchers.notNullValue()));
 
             // then the mockActThatIsHidden is not listed.
@@ -275,7 +275,7 @@ public class ApplicationFeatureRepositoryDefaultTest {
         public void parentNotYetEncountered() throws Exception {
 
             // given
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // expecting
             final ApplicationFeature newlyCreatedParent = new ApplicationFeature();
@@ -298,12 +298,12 @@ public class ApplicationFeatureRepositoryDefaultTest {
         public void parentAlreadyEncountered() throws Exception {
 
             // given
-            final ApplicationFeatureId packageId = ApplicationFeatureId.newPackage("com.mycompany");
+            final ApplicationFeatureId packageId = ApplicationFeatureId.newNamespace("com.mycompany");
             final ApplicationFeature pkg = new ApplicationFeature();
             pkg.setFeatureId(packageId);
             applicationFeatureRepository.packageFeatures.put(packageId, pkg);
 
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java
index 34c1f79..5b99a7a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java
@@ -39,9 +39,9 @@ public class ApplicationFeatureTest {
 
         @Test
         public void givenPackage_whenAddPackageAndClass() throws Exception {
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newPackage("com.mycompany"));
-            final ApplicationFeatureId packageFeatureId = ApplicationFeatureId.newPackage("com.mycompany.flob");
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bar");
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
+            final ApplicationFeatureId packageFeatureId = ApplicationFeatureId.newNamespace("com.mycompany.flob");
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             applicationFeature.addToContents(packageFeatureId);
             applicationFeature.addToContents(classFeatureId);
@@ -55,7 +55,7 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newPackage("com.mycompany"));
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
             final ApplicationFeatureId memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             applicationFeature.addToContents(memberFeatureId);
@@ -66,8 +66,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newClass("com.mycompany.Bar"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.flob.Bar");
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
 
             applicationFeature.addToContents(classFeatureId);
         }
@@ -78,7 +78,7 @@ public class ApplicationFeatureTest {
             expectedException.expect(IllegalStateException.class);
 
             final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Bar", "foo"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.flob.Bar");
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
 
             applicationFeature.addToContents(classFeatureId);
         }
@@ -95,7 +95,7 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newPackage("com.mycompany"));
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
             final ApplicationFeatureId memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             applicationFeature.addToMembers(memberFeatureId, ApplicationMemberType.PROPERTY);
@@ -104,7 +104,7 @@ public class ApplicationFeatureTest {
         @Test
         public void givenClass_whenAddMember() throws Exception {
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newClass("com.mycompany.Bar"));
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
             final ApplicationFeatureId memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
             final ApplicationFeatureId memberFeatureId2 = ApplicationFeatureId.newMember("com.mycompany.Bar", "boz");
 
@@ -120,8 +120,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newClass("com.mycompany.Bar"));
-            final ApplicationFeatureId packageFeatureId = ApplicationFeatureId.newPackage("com.mycompany");
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            final ApplicationFeatureId packageFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
 
             applicationFeature.addToMembers(packageFeatureId, ApplicationMemberType.PROPERTY);
         }
@@ -131,8 +131,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newClass("com.mycompany.Bar"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.Bop");
+            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bop");
 
             applicationFeature.addToMembers(classFeatureId, ApplicationMemberType.PROPERTY);
         }
@@ -143,7 +143,7 @@ public class ApplicationFeatureTest {
             expectedException.expect(IllegalStateException.class);
 
             final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Bar", "foo"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass("com.mycompany.flob.Bar");
+            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
 
             applicationFeature.addToMembers(classFeatureId, ApplicationMemberType.PROPERTY);
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
index 3ddb220..667368a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
@@ -36,8 +36,8 @@ public class ApplicationFeatureTypeTest {
     public static class HideClassName extends ApplicationFeatureTypeTest {
         @Test
         public void all() throws Exception {
-            assertThat(ApplicationFeatureType.PACKAGE.hideClassName(), is(true));
-            assertThat(ApplicationFeatureType.CLASS.hideClassName(), is(false));
+            assertThat(ApplicationFeatureType.NAMESPACE.hideClassName(), is(true));
+            assertThat(ApplicationFeatureType.TYPE.hideClassName(), is(false));
             assertThat(ApplicationFeatureType.MEMBER.hideClassName(), is(false));
         }
     }
@@ -46,8 +46,8 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void all() throws Exception {
-            assertThat(ApplicationFeatureType.PACKAGE.hideMember(), is(true));
-            assertThat(ApplicationFeatureType.CLASS.hideMember(), is(true));
+            assertThat(ApplicationFeatureType.NAMESPACE.hideMember(), is(true));
+            assertThat(ApplicationFeatureType.TYPE.hideMember(), is(true));
             assertThat(ApplicationFeatureType.MEMBER.hideMember(), is(false));
         }
     }
@@ -60,7 +60,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenPackage() throws Exception {
 
-            val applicationFeatureId = ApplicationFeatureId.createPackage("com.mycompany"); 
+            val applicationFeatureId = ApplicationFeatureId.createNamespace("com.mycompany"); 
 
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is(nullValue()));
@@ -70,7 +70,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenClass() throws Exception {
 
-            val applicationFeatureId = ApplicationFeatureId.createClass("com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.createType("com.mycompany.Bar");
 
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
@@ -102,12 +102,12 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
+            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
+            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
@@ -123,11 +123,11 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
+            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
+            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
@@ -144,11 +144,11 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
+            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
+            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
@@ -165,12 +165,12 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
+            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
+            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
@@ -182,7 +182,7 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void happyCase() throws Exception {
-            assertThat(ApplicationFeatureType.PACKAGE.toString(), is("PACKAGE"));
+            assertThat(ApplicationFeatureType.NAMESPACE.toString(), is("PACKAGE"));
         }
     }
 
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
index 1c423aa..c3b5ad7 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
@@ -101,10 +101,10 @@ public interface ApplicationPermission {
         .ifPresent(featureId->{
 
             switch (featureId.getType()) {
-            case PACKAGE:
+            case NAMESPACE:
                 buf.append(getFeatureFqn());              // com.mycompany
                 break;
-            case CLASS:
+            case TYPE:
                 // abbreviate if required because otherwise title overflows on action prompt.
                 if(getFeatureFqn().length() < 30) {
                     buf.append(getFeatureFqn());          // com.mycompany.Bar
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
index f7991c5..0f1b372 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
@@ -81,9 +81,9 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
             final ApplicationFeatureId featureId,
             final ApplicationFeatureRepositoryDefault applicationFeatureRepository) {
         switch (featureId.getType()) {
-        case PACKAGE:
+        case NAMESPACE:
             return ApplicationPackage.class;
-        case CLASS:
+        case TYPE:
             return ApplicationClass.class;
         case MEMBER:
             final ApplicationFeature feature = applicationFeatureRepository.findFeature(featureId);
@@ -104,7 +104,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     }
 
     public ApplicationFeatureViewModel() {
-        this(ApplicationFeatureId.PACKAGE_DEFAULT);
+        this(ApplicationFeatureId.NAMESPACE_DEFAULT);
     }
 
     ApplicationFeatureViewModel(final ApplicationFeatureId featureId) {
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
index 88a6cdd..a08ccf1 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
@@ -69,7 +69,7 @@ public class ApplicationPackage extends ApplicationFeatureViewModel {
         return asViewModels(contents);
     }
     public boolean hideContents() {
-        return getType() != ApplicationFeatureType.PACKAGE;
+        return getType() != ApplicationFeatureType.NAMESPACE;
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
index b8b1c7b..bfdd50c 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
@@ -89,7 +89,7 @@ public class ApplicationUser_filterPermissions {
             final ApplicationFeatureId inputFeatureId = input.getFeatureId();
 
             // recursive match on package
-            final ApplicationFeatureId packageId = ApplicationFeatureId.newPackage(packageFqn);
+            final ApplicationFeatureId packageId = ApplicationFeatureId.newNamespace(packageFqn);
             final List<ApplicationFeatureId> pathIds = inputFeatureId.getPathIds();
             if(!pathIds.contains(packageId)) {
                 return false;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
index 38296f8..359f8df 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
@@ -99,7 +99,7 @@ public class UserPermissionViewModel implements ViewModel {
     }
 
     public UserPermissionViewModel() {
-        setFeatureId(ApplicationFeatureId.PACKAGE_DEFAULT);
+        setFeatureId(ApplicationFeatureId.NAMESPACE_DEFAULT);
     }
 
 
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
index aa3a2a9..6208fa0 100644
--- 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
@@ -62,7 +62,7 @@ public class ApplicationRole_addClass {
             final String className) {
         
         applicationPermissionRepository.newPermission(
-                holder, rule, mode, ApplicationFeatureType.CLASS,
+                holder, rule, mode, ApplicationFeatureType.TYPE,
                 packageFqn + "." + className);
         
         return holder;
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
index 4b2994c..3e38695 100644
--- 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
@@ -50,7 +50,7 @@ public class ApplicationRole_addPackage {
     /**
      * Adds a {@link ApplicationPermission permission}
      * for this role to a
-     * {@link ApplicationFeatureType#PACKAGE package}
+     * {@link ApplicationFeatureType#NAMESPACE package}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "1")
@@ -63,7 +63,7 @@ public class ApplicationRole_addPackage {
             final String packageFqn) {
         
         applicationPermissionRepository
-            .newPermission(holder, rule, mode, ApplicationFeatureType.PACKAGE, packageFqn);
+            .newPermission(holder, rule, mode, ApplicationFeatureType.NAMESPACE, packageFqn);
         return holder;
     }
 
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
index a0093b8..c10f763 100644
--- 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
@@ -93,7 +93,7 @@ public class ApplicationRole_removePermission {
     
     @Model
     public ApplicationFeatureType default1Act() {
-        return ApplicationFeatureType.PACKAGE;
+        return ApplicationFeatureType.NAMESPACE;
     }
 
     @Model
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 2fb948a..444439d 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
@@ -332,12 +332,12 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
             switch (featureType) {
 
-            case PACKAGE:
+            case NAMESPACE:
                 if(!packageNames.contains(featureFqn)) {
                     orphaned.add(permission);
                 }
                 break;
-            case CLASS:
+            case TYPE:
                 if(!availableClasses.contains(featureFqn)) {
                     orphaned.add(permission);
                 }
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 3763454..7de472d 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
@@ -73,7 +73,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final String... featureFqns) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.PACKAGE, Arrays.asList(featureFqns));
+        newPermissions(rule, mode, ApplicationFeatureType.NAMESPACE, Arrays.asList(featureFqns));
     }
 
     /**
@@ -84,7 +84,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final Class<?>... classes) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.CLASS, asFeatureFqns(classes));
+        newPermissions(rule, mode, ApplicationFeatureType.TYPE, asFeatureFqns(classes));
     }
 
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
index 52e2e1a..e2bf103 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
@@ -352,12 +352,12 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
             switch (featureType) {
 
-            case PACKAGE:
+            case NAMESPACE:
                 if(!packageNames.contains(featureFqn)) {
                     orphaned.add(permission);
                 }
                 break;
-            case CLASS:
+            case TYPE:
                 if(!availableClasses.contains(featureFqn)) {
                     orphaned.add(permission);
                 }
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
index 4dbdb43..20df788 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
@@ -69,7 +69,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final String... featureFqns) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.PACKAGE, Arrays.asList(featureFqns));
+        newPermissions(rule, mode, ApplicationFeatureType.NAMESPACE, Arrays.asList(featureFqns));
     }
 
     /**
@@ -80,7 +80,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final Class<?>... classes) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.CLASS, asFeatureFqns(classes));
+        newPermissions(rule, mode, ApplicationFeatureType.TYPE, asFeatureFqns(classes));
     }
 
 


[isis] 06/09: ISIS-2553: refactor ApplicationFeatureId to have only a single constructor

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 9e3d54e24a6146ee5b587a5fe2057943673e5193
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 17:38:51 2021 +0100

    ISIS-2553: refactor ApplicationFeatureId to have only a single
    constructor
---
 .../services/appfeat/ApplicationFeatureId.java     | 100 ++++++++-------------
 .../services/appfeat/ApplicationFeatureSort.java   |  84 +++++++++--------
 .../isis/commons/internal/base/_Strings.java       |  33 ++++++-
 .../services/appfeat/ApplicationFeatureIdTest.java |  27 ------
 .../appfeat/ApplicationFeatureTypeTest.java        |  32 +++----
 .../model/app/user/UserPermissionViewModel.java    |  11 ++-
 .../dom/role/ApplicationRole_addPermission.java    |   2 +-
 7 files changed, 133 insertions(+), 156 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index c94a1f1..20152bf 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -21,7 +21,6 @@ package org.apache.isis.applib.services.appfeat;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Iterator;
 import java.util.List;
 
 import static java.util.Comparator.comparing;
@@ -40,6 +39,7 @@ import org.apache.isis.applib.util.TitleBuffer;
 import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -47,11 +47,11 @@ import lombok.Setter;
 import lombok.val;
 
 /**
- * Value type representing a package, class or member.
+ * Value type representing a namespace, type or member.
  * <p>
  * This value is {@link Comparable}, the implementation of which considers 
- * {@link #getType() (feature) type}, {@link #getNamespace() logical package name}, 
- * {@link #getTypeSimpleName() class name} and {@link #getMemberName() member name}.
+ * {@link #getSort() (feature) sort}, {@link #getNamespace() namespace}, 
+ * {@link #getTypeSimpleName() type simple name} and {@link #getMemberName() member name}.
  * 
  */
 @Value
@@ -64,8 +64,7 @@ implements
 
     // -- CONSTANTS
 
-    public static final ApplicationFeatureId NAMESPACE_DEFAULT = 
-            new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "default");
+    public static final ApplicationFeatureId NAMESPACE_DEFAULT = newNamespace("default");
 
     // -- FACTORY METHODS
 
@@ -84,10 +83,10 @@ implements
     }
     
     public static ApplicationFeatureId newFeature(
-            final ApplicationFeatureSort featureType, 
-            final String qualifiedName) {
+            final @NonNull ApplicationFeatureSort featureSort, 
+            final @NonNull String qualifiedName) {
         
-        switch (featureType) {
+        switch (featureSort) {
         case NAMESPACE:
             return newNamespace(qualifiedName);
         case TYPE:
@@ -95,7 +94,7 @@ implements
         case MEMBER:
             return newMember(qualifiedName);
         }
-        throw new IllegalArgumentException("Unknown feature type " + featureType);
+        throw _Exceptions.illegalArgument("Unknown feature sort '%s'", featureSort);
     }
 
     public static ApplicationFeatureId newFeature(
@@ -113,45 +112,35 @@ implements
     }
 
     public static ApplicationFeatureId newNamespace(final String namespace) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
-        featureId.setNamespace(namespace);
-        return featureId;
+        val feat = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
+        ApplicationFeatureSort.initNamespace(feat, namespace);
+        return feat;
     }
 
     public static ApplicationFeatureId newType(final String logicalTypeName) {
-        return new ApplicationFeatureId(ApplicationFeatureSort.TYPE, logicalTypeName);
+        val feat = new ApplicationFeatureId(ApplicationFeatureSort.TYPE);
+        ApplicationFeatureSort.initType(feat, logicalTypeName);
+        return feat;
     }
 
     public static ApplicationFeatureId newMember(final String logicalTypeName, final String memberName) {
         final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
-        ApplicationFeatureSort.TYPE.init(featureId, logicalTypeName);
+        ApplicationFeatureSort.initType(featureId, logicalTypeName);
         featureId.sort = ApplicationFeatureSort.MEMBER;
         featureId.setMemberName(memberName);
         return featureId;
     }
 
-    public static ApplicationFeatureId newMember(final String fullyQualifiedName) {
-        return new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, fullyQualifiedName);
+    public static ApplicationFeatureId newMember(String fqn) {
+        val feat = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
+        ApplicationFeatureSort.initMember(feat, fqn);
+        return feat;
     }
-
+    
     // -- CONSTRUCTOR
 
-    private ApplicationFeatureId(final String asString) {
-        final Iterator<String> iterator = _Strings.splitThenStream(asString, ":").iterator();
-        final ApplicationFeatureSort type = ApplicationFeatureSort.valueOf(iterator.next());
-        type.init(this, iterator.next());
-    }
-
-    /**
-     * Must be called by {@link ApplicationFeatureSort#init(ApplicationFeatureId, String)} 
-     * immediately afterwards to fully initialize.
-     */
-    ApplicationFeatureId(final ApplicationFeatureSort type) {
-        this.sort = type;
-    }
-
-    public ApplicationFeatureId(final ApplicationFeatureSort type, final String fullyQualifiedName) {
-        type.init(this, fullyQualifiedName);
+    private ApplicationFeatureId(final ApplicationFeatureSort sort) {
+        this.sort = sort;
     }
 
     // -- TITLE
@@ -245,27 +234,29 @@ implements
     // -- ENCODING / DECODING
 
     @Programmatic
-    public String asString() {
+    public String stringify() {
         return sort.name() + ":" + getFullyQualifiedName();
     }
 
-    @Programmatic
-    public String asEncodedString() {
-        return _Strings.base64UrlEncode(asString());
-    }
-    
     /**
-     * Round-trip with {@link #asString()}
+     * Round-trip with {@link #stringify()}
      */
-    public static ApplicationFeatureId parse(final String asString) {
-        return new ApplicationFeatureId(asString);
+    public static ApplicationFeatureId parse(final String stringified) {
+        return _Strings.splitThenApplyRequireNonEmpty(stringified, ":", (sort, fqn)->
+            newFeature(ApplicationFeatureSort.valueOf(sort), fqn))
+        .orElseThrow(()->_Exceptions.illegalArgument("cannot parse feature-id '%s'", stringified));
+    }
+    
+    @Programmatic
+    public String asEncodedString() {
+        return _Strings.base64UrlEncode(stringify());
     }
 
     /**
      * Round-trip with {@link #asEncodedString()}
      */
     public static ApplicationFeatureId parseEncoded(final String encodedString) {
-        return new ApplicationFeatureId(_Strings.base64UrlDecode(encodedString));
+        return parse(_Strings.base64UrlDecode(encodedString));
     }
 
     // -- pathIds, parentIds
@@ -368,26 +359,7 @@ implements
         return newFeature(namespace, this.getTypeSimpleName(), this.getMemberName()); 
     }
 
-    @Deprecated // duplicate
-    public static ApplicationFeatureId createNamespace(String namespace) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
-        ApplicationFeatureSort.NAMESPACE.init(feat, namespace);
-        return feat;
-    }
-    
-    @Deprecated // duplicate
-    public static ApplicationFeatureId createType(String logicalTypeName) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureSort.TYPE);
-        ApplicationFeatureSort.TYPE.init(feat, logicalTypeName);
-        return feat;
-    }
-    
-    @Deprecated // duplicate
-    public static ApplicationFeatureId createMember(String fqn) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
-        ApplicationFeatureSort.MEMBER.init(feat, fqn);
-        return feat;
-    }
+
 
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
index 352a380..074e382 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
@@ -23,55 +23,21 @@ import org.apache.isis.commons.internal.base._Strings;
 public enum ApplicationFeatureSort {
     
     /** 
-     * logical namespace, leading part of the <i>object type</i> (aka logical type)
+     * logical namespace
      */
-    NAMESPACE {
-        @Override
-        void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-            feature.setNamespace(fullyQualifiedName);
-            feature.setTypeSimpleName(null);
-            feature.setMemberName(null);
-            feature.sort = this;
-        }
-    },
+    NAMESPACE,
     
     /** 
-     * logical type, simple name of the <i>object type</i> (aka logical type)
+     * {@code namespace + "." + typeSimpleName} 
+     * makes up the fully qualified logical type
      */
-    TYPE {
-        @Override
-        void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-            final int i = fullyQualifiedName.lastIndexOf(".");
-            if(i != -1) {
-                feature.setNamespace(fullyQualifiedName.substring(0, i));
-                feature.setTypeSimpleName(fullyQualifiedName.substring(i+1));
-            } else {
-                feature.setNamespace("");
-                feature.setTypeSimpleName(fullyQualifiedName);
-            }
-            feature.setMemberName(null);
-            feature.sort = this;
-        }
-    },
+    TYPE,
     
     /** 
      * {@code namespace + "." + typeSimpleName + "." + memberName} 
-     * make up the fully qualified logical member name
+     * makes up the fully qualified logical member
      */
-    MEMBER {
-        @Override
-        void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
-            final int i = fullyQualifiedName.lastIndexOf("#");
-            if(i == -1) {
-                throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
-            }
-            final String className = fullyQualifiedName.substring(0, i);
-            final String memberName = fullyQualifiedName.substring(i+1);
-            TYPE.init(feature, className);
-            feature.setMemberName(memberName);
-            feature.sort = this;
-        }
-    };
+    MEMBER;
 
     public boolean hideClassName() {
         return this == ApplicationFeatureSort.NAMESPACE;
@@ -81,8 +47,6 @@ public enum ApplicationFeatureSort {
         return this == ApplicationFeatureSort.NAMESPACE || this == ApplicationFeatureSort.TYPE;
     }
 
-    abstract void init(ApplicationFeatureId applicationFeatureId, String fullyQualifiedName);
-
     public static void ensurePackage(final ApplicationFeatureId feature) {
         if(feature.sort != ApplicationFeatureSort.NAMESPACE) {
             throw new IllegalStateException("Can only be called for a package; " + feature.toString());
@@ -112,5 +76,39 @@ public enum ApplicationFeatureSort {
         return _Strings.capitalize(name());
     }
     
+    // -- REFACTORING
+    
+    static void initNamespace(final ApplicationFeatureId feature, final String fullyQualifiedName) {
+        feature.setNamespace(fullyQualifiedName);
+        feature.setTypeSimpleName(null);
+        feature.setMemberName(null);
+        feature.sort = NAMESPACE;
+    }
+    
+    static void initType(final ApplicationFeatureId feature, final String fullyQualifiedName) {
+        final int i = fullyQualifiedName.lastIndexOf(".");
+        if(i != -1) {
+            feature.setNamespace(fullyQualifiedName.substring(0, i));
+            feature.setTypeSimpleName(fullyQualifiedName.substring(i+1));
+        } else {
+            feature.setNamespace("");
+            feature.setTypeSimpleName(fullyQualifiedName);
+        }
+        feature.setMemberName(null);
+        feature.sort = TYPE;
+    }
+    
+    static void initMember(final ApplicationFeatureId feature, final String fullyQualifiedName) {
+        final int i = fullyQualifiedName.lastIndexOf("#");
+        if(i == -1) {
+            throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
+        }
+        final String className = fullyQualifiedName.substring(0, i);
+        final String memberName = fullyQualifiedName.substring(i+1);
+        initType(feature, className);
+        feature.setMemberName(memberName);
+        feature.sort = MEMBER;
+    }
+    
 
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
index ec8c8dd..cac0c85 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
@@ -31,6 +31,7 @@ import java.util.Scanner;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.UnaryOperator;
@@ -456,7 +457,37 @@ public final class _Strings {
         requires(delimiterPattern, "delimiterPattern");
         return delimiterPattern.splitAsStream(input);
     }
-    
+
+    /**
+     * Optionally applies {@code onNonEmptySplit} function, based on whether both split parts 
+     * <i>lhs</i> and <i>rhs</i> are non empty Strings. 
+     * @param <T>
+     * @param input
+     * @param separator
+     * @param onNonEmptySplit
+     */
+    public static <T> Optional<T> splitThenApplyRequireNonEmpty(
+            @Nullable final String input, 
+            final String separator, 
+            final BiFunction<String, String, T> onNonEmptySplit) {
+        
+        if(isEmpty(input)) {
+            return Optional.empty();
+        }
+        // we have a non-empty string
+        final int p = input.indexOf(separator);
+        if(p<1){
+            // separator not found or
+            // empty lhs in string
+            return Optional.empty();
+        }
+        final int q = p + separator.length();
+        if(q==input.length()) {
+            // empty rhs
+            return Optional.empty();
+        }
+        return Optional.ofNullable(onNonEmptySplit.apply(input.substring(0, p), input.substring(q)));
+    }
 
     public static void splitThenAccept(
             @Nullable final String input, 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 1d76bdc..5f1da3d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -118,33 +118,6 @@ public class ApplicationFeatureIdTest {
 
     }
 
-    public static class Constructor_AFT_String extends ApplicationFeatureIdTest {
-
-        @Test
-        public void whenPackage() throws Exception {
-            // when
-            val applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "com.mycompany");
-            // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
-        }
-
-        @Test
-        public void whenClass() throws Exception {
-            // when
-            val applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "com.mycompany.Bar");
-            // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
-        }
-
-        @Test
-        public void whenMember() throws Exception {
-            // when
-            val applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "com.mycompany.Bar#foo");
-            // then
-            assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
-        }
-    }
-
     public static class NewFeature_AFT_String extends ApplicationFeatureIdTest {
 
         @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
index f30f90c..1da0471 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
@@ -60,7 +60,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenPackage() throws Exception {
 
-            val applicationFeatureId = ApplicationFeatureId.createNamespace("com.mycompany"); 
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany"); 
 
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is(nullValue()));
@@ -70,7 +70,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenClass() throws Exception {
 
-            val applicationFeatureId = ApplicationFeatureId.createType("com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
@@ -80,7 +80,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenMember() throws Exception {
 
-            val applicationFeatureId = ApplicationFeatureId.createMember("com.mycompany.Bar#foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
             
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
@@ -91,7 +91,7 @@ public class ApplicationFeatureTypeTest {
 
             expectedException.expect(IllegalArgumentException.class);
             ApplicationFeatureId
-                    .createMember("com.mycompany.BarISMISSINGTHEHASHSYMBOL");
+                    .newMember("com.mycompany.BarISMISSINGTHEHASHSYMBOL");
         }
     }
 
@@ -102,17 +102,17 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureSort.ensurePackage(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensurePackage(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensurePackage(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
+            ApplicationFeatureSort.ensurePackage(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensurePackage(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensurePackage(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
     }
 
@@ -123,16 +123,16 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureSort.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensurePackageOrClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureSort.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
+            ApplicationFeatureSort.ensurePackageOrClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensurePackageOrClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
 
     }
@@ -144,16 +144,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureClass(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensureClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureSort.ensureClass(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
+            ApplicationFeatureSort.ensureClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureClass(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensureClass(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
 
     }
@@ -165,16 +165,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureMember(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureSort.ensureMember(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
+            ApplicationFeatureSort.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
-            ApplicationFeatureSort.ensureMember(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensureMember(ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
     }
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
index 9b5e25f..cf82d24 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
@@ -186,7 +186,9 @@ public class UserPermissionViewModel implements ViewModel {
         final String viewingEvaluationCauseFeatureIdType = iterator.next();
         final ApplicationFeatureSort viewingEvaluationFeatureIdType =  !viewingEvaluationCauseFeatureIdType.isEmpty() ? ApplicationFeatureSort.valueOf(viewingEvaluationCauseFeatureIdType) : null;
         final String viewingEvaluationFeatureFqn = iterator.next();
-        this.viewingFeatureId = viewingEvaluationFeatureIdType != null? new ApplicationFeatureId(viewingEvaluationFeatureIdType,viewingEvaluationFeatureFqn) : null;
+        this.viewingFeatureId = viewingEvaluationFeatureIdType != null
+                ? ApplicationFeatureId.newFeature(viewingEvaluationFeatureIdType, viewingEvaluationFeatureFqn) 
+                : null;
 
         final String viewingEvaluationCauseRule = iterator.next();
         this.viewingRule = !viewingEvaluationCauseRule.isEmpty()? ApplicationPermissionRule.valueOf(viewingEvaluationCauseRule): null;
@@ -198,7 +200,9 @@ public class UserPermissionViewModel implements ViewModel {
         final String changingEvaluationCauseFeatureIdType = iterator.next();
         final ApplicationFeatureSort changingEvaluationFeatureIdType =  !changingEvaluationCauseFeatureIdType.isEmpty() ? ApplicationFeatureSort.valueOf(changingEvaluationCauseFeatureIdType) : null;
         final String changingEvaluationFeatureFqn = iterator.next();
-        this.changingFeatureId = changingEvaluationFeatureIdType != null? new ApplicationFeatureId(changingEvaluationFeatureIdType,changingEvaluationFeatureFqn) : null;
+        this.changingFeatureId = changingEvaluationFeatureIdType != null
+                ? ApplicationFeatureId.newFeature(changingEvaluationFeatureIdType, changingEvaluationFeatureFqn) 
+                : null;
 
         final String changingEvaluationCauseRule = iterator.next();
         this.changingRule = !changingEvaluationCauseRule.isEmpty()? ApplicationPermissionRule.valueOf(changingEvaluationCauseRule): null;
@@ -206,11 +210,10 @@ public class UserPermissionViewModel implements ViewModel {
         this.changingMode = !changingEvaluationCauseMode.isEmpty()? ApplicationPermissionMode.valueOf(changingEvaluationCauseMode): null;
 
         final ApplicationFeatureSort type = ApplicationFeatureSort.valueOf(iterator.next());
-        this.featureId = new ApplicationFeatureId(type, iterator.next());
+        this.featureId = ApplicationFeatureId.newFeature(type, iterator.next());
     }
 
 
-
     @Programmatic
     public String asEncodedString() {
         return asEncodedString(getFeatureId(), getUsername(), newEvaluation(viewingGranted, viewingFeatureId, viewingRule, viewingMode), newEvaluation(changingGranted, changingFeatureId, changingRule, changingMode));
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
index d5293ee..8fa78bc 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
@@ -112,7 +112,7 @@ public class ApplicationRole_addPermission {
         return idsByName.entrySet().stream()
         .filter(entry->matches(entry.getKey(), entry.getValue(), search))
         .map(Map.Entry::getValue)
-        .map(ApplicationFeatureId::asString)
+        .map(ApplicationFeatureId::stringify)
         .collect(Collectors.toCollection(TreeSet::new));
     }
 


[isis] 05/09: ISIS-2553: rename ApplicationFeatureType->ApplicationFeatureSort

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 c0cc90d4e7941e80a5d5c81500ee50446b7a1e6b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 16:36:48 2021 +0100

    ISIS-2553: rename ApplicationFeatureType->ApplicationFeatureSort
---
 .../services/appfeat/ApplicationFeatureId.java     | 70 +++++++--------
 ...eatureType.java => ApplicationFeatureSort.java} | 20 ++---
 .../services/appfeat/ApplicationFeature.java       | 22 ++---
 .../ApplicationFeatureRepositoryDefault.java       | 13 +--
 .../core/metamodel/services/appfeat/_Asserts.java  |  4 +-
 .../metamodel/services/appfeat/_Predicates.java    |  4 +-
 .../metamodel/MetaModelServiceDefault.java         |  4 +-
 .../specloader/SpecificationLoaderDefault.java     |  4 +-
 .../services/appfeat/ApplicationFeatureIdTest.java | 99 ++++++++++++----------
 .../appfeat/ApplicationFeatureTypeTest.java        | 40 ++++-----
 .../api/permission/ApplicationPermission.java      |  6 +-
 .../ApplicationPermissionRepository.java           |  8 +-
 .../app/feature/ApplicationFeatureViewModel.java   | 10 +--
 .../model/app/feature/ApplicationPackage.java      |  4 +-
 .../model/app/user/UserPermissionViewModel.java    | 14 +--
 .../model/dom/role/ApplicationRole_addAction.java  |  4 +-
 .../model/dom/role/ApplicationRole_addClass.java   |  6 +-
 .../dom/role/ApplicationRole_addCollection.java    |  4 +-
 .../model/dom/role/ApplicationRole_addPackage.java |  6 +-
 .../dom/role/ApplicationRole_addProperty.java      |  4 +-
 .../dom/role/ApplicationRole_removePermission.java | 12 +--
 .../jdo/dom/permission/ApplicationPermission.java  |  8 +-
 .../ApplicationPermissionRepository.java           | 20 ++---
 .../AbstractRoleAndPermissionsFixtureScript.java   | 10 +--
 .../jpa/dom/permission/ApplicationPermission.java  |  8 +-
 .../ApplicationPermissionRepository.java           | 20 ++---
 .../AbstractRoleAndPermissionsFixtureScript.java   | 10 +--
 27 files changed, 220 insertions(+), 214 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index d309436..c94a1f1 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -65,7 +65,7 @@ implements
     // -- CONSTANTS
 
     public static final ApplicationFeatureId NAMESPACE_DEFAULT = 
-            new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "default");
+            new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "default");
 
     // -- FACTORY METHODS
 
@@ -84,7 +84,7 @@ implements
     }
     
     public static ApplicationFeatureId newFeature(
-            final ApplicationFeatureType featureType, 
+            final ApplicationFeatureSort featureType, 
             final String qualifiedName) {
         
         switch (featureType) {
@@ -113,44 +113,44 @@ implements
     }
 
     public static ApplicationFeatureId newNamespace(final String namespace) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE);
+        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
         featureId.setNamespace(namespace);
         return featureId;
     }
 
     public static ApplicationFeatureId newType(final String logicalTypeName) {
-        return new ApplicationFeatureId(ApplicationFeatureType.TYPE, logicalTypeName);
+        return new ApplicationFeatureId(ApplicationFeatureSort.TYPE, logicalTypeName);
     }
 
     public static ApplicationFeatureId newMember(final String logicalTypeName, final String memberName) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
-        ApplicationFeatureType.TYPE.init(featureId, logicalTypeName);
-        featureId.type = ApplicationFeatureType.MEMBER;
+        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
+        ApplicationFeatureSort.TYPE.init(featureId, logicalTypeName);
+        featureId.sort = ApplicationFeatureSort.MEMBER;
         featureId.setMemberName(memberName);
         return featureId;
     }
 
     public static ApplicationFeatureId newMember(final String fullyQualifiedName) {
-        return new ApplicationFeatureId(ApplicationFeatureType.MEMBER, fullyQualifiedName);
+        return new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, fullyQualifiedName);
     }
 
     // -- CONSTRUCTOR
 
     private ApplicationFeatureId(final String asString) {
         final Iterator<String> iterator = _Strings.splitThenStream(asString, ":").iterator();
-        final ApplicationFeatureType type = ApplicationFeatureType.valueOf(iterator.next());
+        final ApplicationFeatureSort type = ApplicationFeatureSort.valueOf(iterator.next());
         type.init(this, iterator.next());
     }
 
     /**
-     * Must be called by {@link ApplicationFeatureType#init(ApplicationFeatureId, String)} 
+     * Must be called by {@link ApplicationFeatureSort#init(ApplicationFeatureId, String)} 
      * immediately afterwards to fully initialize.
      */
-    ApplicationFeatureId(final ApplicationFeatureType type) {
-        this.type = type;
+    ApplicationFeatureId(final ApplicationFeatureSort type) {
+        this.sort = type;
     }
 
-    public ApplicationFeatureId(final ApplicationFeatureType type, final String fullyQualifiedName) {
+    public ApplicationFeatureId(final ApplicationFeatureSort type, final String fullyQualifiedName) {
         type.init(this, fullyQualifiedName);
     }
 
@@ -168,13 +168,13 @@ implements
 
     // -- PROPERTIES
     
-    @Getter ApplicationFeatureType type;
+    @Getter ApplicationFeatureSort sort;
     
     /**
      * The {@link ApplicationFeatureId id} of the member's class.
      */
     public ApplicationFeatureId getParentClassId() {
-        ApplicationFeatureType.ensureMember(this);
+        ApplicationFeatureSort.ensureMember(this);
         final String classFqn = this.getNamespace() + "." + getTypeSimpleName();
         return newType(classFqn);
     }
@@ -224,9 +224,9 @@ implements
      */
     @Programmatic
     public ApplicationFeatureId getParentPackageId() {
-        ApplicationFeatureType.ensurePackageOrClass(this);
+        ApplicationFeatureSort.ensurePackageOrClass(this);
 
-        if(type == ApplicationFeatureType.TYPE) {
+        if(sort == ApplicationFeatureSort.TYPE) {
             return ApplicationFeatureId.newNamespace(getNamespace());
         } else {
             final String packageName = getNamespace(); // eg aaa.bbb.ccc
@@ -246,7 +246,7 @@ implements
 
     @Programmatic
     public String asString() {
-        return type.name() + ":" + getFullyQualifiedName();
+        return sort.name() + ":" + getFullyQualifiedName();
     }
 
     @Programmatic
@@ -283,7 +283,7 @@ implements
     }
 
     private ApplicationFeatureId getParentId() {
-        return type == ApplicationFeatureType.MEMBER
+        return sort == ApplicationFeatureSort.MEMBER
                 ? getParentClassId()
                 : getParentPackageId();
     }
@@ -303,35 +303,35 @@ implements
 
     // -- OBJECT CONTRACT
 
-    private static final Comparator<ApplicationFeatureId> byType =
-            comparing(ApplicationFeatureId::getType, nullsFirst(naturalOrder()));
-    private static final Comparator<ApplicationFeatureId> byPackageName =
+    private static final Comparator<ApplicationFeatureId> bySort =
+            comparing(ApplicationFeatureId::getSort, nullsFirst(naturalOrder()));
+    private static final Comparator<ApplicationFeatureId> byNamespace =
             comparing(ApplicationFeatureId::getNamespace, nullsFirst(naturalOrder()));
-    private static final Comparator<ApplicationFeatureId> byClassName =
+    private static final Comparator<ApplicationFeatureId> byTypeSimpleName =
             comparing(ApplicationFeatureId::getTypeSimpleName, nullsFirst(naturalOrder()));
     private static final Comparator<ApplicationFeatureId> byMemberName =
             comparing(ApplicationFeatureId::getMemberName, nullsFirst(naturalOrder()));
 
     private static final Comparator<ApplicationFeatureId> applicationFeatureIdOrdering =
-            Comparator.nullsFirst(byType)
-            .thenComparing(byPackageName)
-            .thenComparing(byClassName)
+            Comparator.nullsFirst(bySort)
+            .thenComparing(byNamespace)
+            .thenComparing(byTypeSimpleName)
             .thenComparing(byMemberName);
 
     private static final Equality<ApplicationFeatureId> equality =
-            ObjectContracts.checkEquals(ApplicationFeatureId::getType)
+            ObjectContracts.checkEquals(ApplicationFeatureId::getSort)
             .thenCheckEquals(ApplicationFeatureId::getNamespace)
             .thenCheckEquals(ApplicationFeatureId::getTypeSimpleName)
             .thenCheckEquals(ApplicationFeatureId::getMemberName);
 
     private static final Hashing<ApplicationFeatureId> hashing =
-            ObjectContracts.hashing(ApplicationFeatureId::getType)
+            ObjectContracts.hashing(ApplicationFeatureId::getSort)
             .thenHashing(ApplicationFeatureId::getNamespace)
             .thenHashing(ApplicationFeatureId::getTypeSimpleName)
             .thenHashing(ApplicationFeatureId::getMemberName);
 
     private static final ToString<ApplicationFeatureId> toString =
-            ObjectContracts.toString("type", ApplicationFeatureId::getType)
+            ObjectContracts.toString("sort", ApplicationFeatureId::getSort)
             .thenToString("namespace", ApplicationFeatureId::getNamespace)
             .thenToStringOmitIfAbsent("typeSimpleName", ApplicationFeatureId::getTypeSimpleName)
             .thenToStringOmitIfAbsent("memberName", ApplicationFeatureId::getMemberName);
@@ -370,22 +370,22 @@ implements
 
     @Deprecated // duplicate
     public static ApplicationFeatureId createNamespace(String namespace) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE);
-        ApplicationFeatureType.NAMESPACE.init(feat, namespace);
+        val feat = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE);
+        ApplicationFeatureSort.NAMESPACE.init(feat, namespace);
         return feat;
     }
     
     @Deprecated // duplicate
     public static ApplicationFeatureId createType(String logicalTypeName) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureType.TYPE);
-        ApplicationFeatureType.TYPE.init(feat, logicalTypeName);
+        val feat = new ApplicationFeatureId(ApplicationFeatureSort.TYPE);
+        ApplicationFeatureSort.TYPE.init(feat, logicalTypeName);
         return feat;
     }
     
     @Deprecated // duplicate
     public static ApplicationFeatureId createMember(String fqn) {
-        val feat = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
-        ApplicationFeatureType.MEMBER.init(feat, fqn);
+        val feat = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER);
+        ApplicationFeatureSort.MEMBER.init(feat, fqn);
         return feat;
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
similarity index 86%
rename from api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
rename to api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
index 99c65ee..352a380 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java
@@ -20,7 +20,7 @@ package org.apache.isis.applib.services.appfeat;
 
 import org.apache.isis.commons.internal.base._Strings;
 
-public enum ApplicationFeatureType {
+public enum ApplicationFeatureSort {
     
     /** 
      * logical namespace, leading part of the <i>object type</i> (aka logical type)
@@ -31,7 +31,7 @@ public enum ApplicationFeatureType {
             feature.setNamespace(fullyQualifiedName);
             feature.setTypeSimpleName(null);
             feature.setMemberName(null);
-            feature.type = this;
+            feature.sort = this;
         }
     },
     
@@ -50,7 +50,7 @@ public enum ApplicationFeatureType {
                 feature.setTypeSimpleName(fullyQualifiedName);
             }
             feature.setMemberName(null);
-            feature.type = this;
+            feature.sort = this;
         }
     },
     
@@ -69,40 +69,40 @@ public enum ApplicationFeatureType {
             final String memberName = fullyQualifiedName.substring(i+1);
             TYPE.init(feature, className);
             feature.setMemberName(memberName);
-            feature.type = this;
+            feature.sort = this;
         }
     };
 
     public boolean hideClassName() {
-        return this == ApplicationFeatureType.NAMESPACE;
+        return this == ApplicationFeatureSort.NAMESPACE;
     }
     
     public boolean hideMember() {
-        return this == ApplicationFeatureType.NAMESPACE || this == ApplicationFeatureType.TYPE;
+        return this == ApplicationFeatureSort.NAMESPACE || this == ApplicationFeatureSort.TYPE;
     }
 
     abstract void init(ApplicationFeatureId applicationFeatureId, String fullyQualifiedName);
 
     public static void ensurePackage(final ApplicationFeatureId feature) {
-        if(feature.type != ApplicationFeatureType.NAMESPACE) {
+        if(feature.sort != ApplicationFeatureSort.NAMESPACE) {
             throw new IllegalStateException("Can only be called for a package; " + feature.toString());
         }
     }
 
     public static void ensurePackageOrClass(final ApplicationFeatureId applicationFeatureId) {
-        if(applicationFeatureId.type != ApplicationFeatureType.NAMESPACE && applicationFeatureId.type != ApplicationFeatureType.TYPE) {
+        if(applicationFeatureId.sort != ApplicationFeatureSort.NAMESPACE && applicationFeatureId.sort != ApplicationFeatureSort.TYPE) {
             throw new IllegalStateException("Can only be called for a package or a class; " + applicationFeatureId.toString());
         }
     }
 
     public static void ensureClass(final ApplicationFeatureId feature) {
-        if(feature.type != ApplicationFeatureType.TYPE) {
+        if(feature.sort != ApplicationFeatureSort.TYPE) {
             throw new IllegalStateException("Can only be called for a class; " + feature.toString());
         }
     }
 
     public static void ensureMember(final ApplicationFeatureId feature) {
-        if(feature.type != ApplicationFeatureType.MEMBER) {
+        if(feature.sort != ApplicationFeatureSort.MEMBER) {
             throw new IllegalStateException("Can only be called for a member; " + feature.toString());
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
index af36106..9781f0a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
@@ -83,7 +83,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private ApplicationFeatureId featureId;
 
     /**
-     * Only for {@link ApplicationFeatureType#MEMBER member}s.
+     * Only for {@link ApplicationFeatureSort#MEMBER member}s.
      */
     @Getter @Setter
     private ApplicationMemberType memberType;
@@ -122,13 +122,13 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> contents = _Sets.newTreeSet();
 
     public SortedSet<ApplicationFeatureId> getContents() {
-        ApplicationFeatureType.ensurePackage(this.getFeatureId());
+        ApplicationFeatureSort.ensurePackage(this.getFeatureId());
         return contents;
     }
 
     public void addToContents(final ApplicationFeatureId contentId) {
-        ApplicationFeatureType.ensurePackage(this.getFeatureId());
-        ApplicationFeatureType.ensurePackageOrClass(contentId);
+        ApplicationFeatureSort.ensurePackage(this.getFeatureId());
+        ApplicationFeatureSort.ensurePackageOrClass(contentId);
         this.contents.add(contentId);
     }
 
@@ -137,7 +137,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> properties = _Sets.newTreeSet();
 
     public SortedSet<ApplicationFeatureId> getProperties() {
-        ApplicationFeatureType.ensureClass(this.getFeatureId());
+        ApplicationFeatureSort.ensureClass(this.getFeatureId());
         return properties;
     }
 
@@ -145,7 +145,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> collections = _Sets.newTreeSet();
     
     public SortedSet<ApplicationFeatureId> getCollections() {
-        ApplicationFeatureType.ensureClass(this.getFeatureId());
+        ApplicationFeatureSort.ensureClass(this.getFeatureId());
         return collections;
     }
 
@@ -153,19 +153,19 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     private final SortedSet<ApplicationFeatureId> actions = _Sets.newTreeSet();
     
     public SortedSet<ApplicationFeatureId> getActions() {
-        ApplicationFeatureType.ensureClass(this.getFeatureId());
+        ApplicationFeatureSort.ensureClass(this.getFeatureId());
         return actions;
     }
     
     public void addToMembers(final ApplicationFeatureId memberId, final ApplicationMemberType memberType) {
-        ApplicationFeatureType.ensureClass(this.getFeatureId());
-        ApplicationFeatureType.ensureMember(memberId);
+        ApplicationFeatureSort.ensureClass(this.getFeatureId());
+        ApplicationFeatureSort.ensureMember(memberId);
 
         membersOf(memberType).add(memberId);
     }
     
     public SortedSet<ApplicationFeatureId> membersOf(final ApplicationMemberType memberType) {
-        ApplicationFeatureType.ensureClass(this.getFeatureId());
+        ApplicationFeatureSort.ensureClass(this.getFeatureId());
         switch (memberType) {
         case PROPERTY:
             return properties;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index 9883a62..d325519 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -39,10 +39,11 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.metamodel.services.ApplicationFeaturesInitConfiguration;
 import org.apache.isis.core.metamodel.events.MetamodelEvent;
@@ -372,7 +373,7 @@ implements ApplicationFeatureRepository {
 
     public ApplicationFeature findFeature(final ApplicationFeatureId featureId) {
         initializeIfRequired();
-        switch (featureId.getType()) {
+        switch (featureId.getSort()) {
         case NAMESPACE:
             return findPackage(featureId);
         case TYPE:
@@ -380,7 +381,7 @@ implements ApplicationFeatureRepository {
         case MEMBER:
             return findMember(featureId);
         }
-        throw new IllegalArgumentException("Feature has unknown feature type " + featureId.getType());
+        throw _Exceptions.illegalArgument("Feature of unknown sort '%s'", featureId.getSort());
     }
 
 
@@ -405,7 +406,7 @@ implements ApplicationFeatureRepository {
 
     // -- allFeatures, allPackages, allClasses, allMembers
 
-    public Collection<ApplicationFeature> allFeatures(final ApplicationFeatureType featureType) {
+    public Collection<ApplicationFeature> allFeatures(final ApplicationFeatureSort featureType) {
         initializeIfRequired();
         if (featureType == null) {
             return Collections.emptyList();
@@ -468,7 +469,7 @@ implements ApplicationFeatureRepository {
     @Override
     public SortedSet<String> packageNames() {
         initializeIfRequired();
-        return stream(allFeatures(ApplicationFeatureType.NAMESPACE))
+        return stream(allFeatures(ApplicationFeatureSort.NAMESPACE))
                 .map(ApplicationFeature.Functions.GET_FQN)
                 .collect(_Sets.toUnmodifiableSorted());
     }
@@ -476,7 +477,7 @@ implements ApplicationFeatureRepository {
     @Override
     public SortedSet<String> packageNamesContainingClasses(final ApplicationMemberType memberType) {
         initializeIfRequired();
-        final Collection<ApplicationFeature> packages = allFeatures(ApplicationFeatureType.NAMESPACE);
+        final Collection<ApplicationFeature> packages = allFeatures(ApplicationFeatureSort.NAMESPACE);
 
         return stream(packages)
                 .filter(ApplicationFeature.Predicates.packageContainingClasses(memberType, this))
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
index d3409c7..81b9c52 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.services.appfeat;
 import java.util.function.Predicate;
 
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 
 final class _Asserts {
@@ -31,7 +31,7 @@ final class _Asserts {
         return new Predicate<ApplicationFeatureId>() {
             @Override
             public boolean test(final ApplicationFeatureId input) {
-                if(input.getType() != ApplicationFeatureType.TYPE) {
+                if(input.getSort() != ApplicationFeatureSort.TYPE) {
                     return false;
                 }
                 final ApplicationFeature feature = applicationFeatures.findFeature(input);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
index 99a8743..bfca014 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.services.appfeat;
 import java.util.function.Predicate;
 
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 
 final class _Predicates {
@@ -31,7 +31,7 @@ final class _Predicates {
         return new Predicate<ApplicationFeatureId>() {
             @Override
             public boolean test(final ApplicationFeatureId input) {
-                if(input.getType() != ApplicationFeatureType.TYPE) {
+                if(input.getSort() != ApplicationFeatureSort.TYPE) {
                     return false;
                 }
                 final ApplicationFeature feature = applicationFeatures.findFeature(input);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 2969b3a..f64e9b1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -32,7 +32,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
 import org.apache.isis.applib.services.grid.GridService;
@@ -212,7 +212,7 @@ public class MetaModelServiceDefault implements MetaModelService {
     @Override
     public CommandDtoProcessor commandDtoProcessorFor(final String memberIdentifier) {
         final ApplicationFeatureId featureId = ApplicationFeatureId
-                .newFeature(ApplicationFeatureType.MEMBER, memberIdentifier);
+                .newFeature(ApplicationFeatureSort.MEMBER, memberIdentifier);
 
         final String logicalTypeName = featureId.getLogicalTypeName();
         if(_Strings.isNullOrEmpty(logicalTypeName)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
index 2026089..32d156f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
@@ -39,7 +39,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
@@ -226,7 +226,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         
         //XXX[ISIS-2403] these classes only get discovered by validators, so just preload their specs
         // (an optimization, not strictly required)
-        loadSpecifications(ApplicationFeatureType.class/*, ...*/);
+        loadSpecifications(ApplicationFeatureSort.class/*, ...*/);
 
         log.info(" - adding types from ValueTypeProviders");
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 53a89fb..1d76bdc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -39,11 +39,13 @@ import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.lessThan;
 
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.core.internaltestsupport.contract.ValueTypeContractTestAbstract;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 
+import lombok.val;
+
 public class ApplicationFeatureIdTest {
 
     @Rule
@@ -56,7 +58,7 @@ public class ApplicationFeatureIdTest {
 
         @Test
         public void happyCase() throws Exception {
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
 
             assertThat(applicationFeatureId.title(), is("com.mycompany.Bar#foo"));
         }
@@ -67,9 +69,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void testNewPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
             // then
-            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.NAMESPACE));
+            assertThat(applicationFeatureId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is(nullValue()));
             assertThat(applicationFeatureId.getMemberName(), is(nullValue()));
@@ -81,9 +83,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void testNewClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
             // then
-            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.TYPE));
+            assertThat(applicationFeatureId.getSort(), is(ApplicationFeatureSort.TYPE));
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
             assertThat(applicationFeatureId.getMemberName(), is(nullValue()));
@@ -95,9 +97,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void using_fullyQualifiedClassName_and_MemberName() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
             // then
-            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.MEMBER));
+            assertThat(applicationFeatureId.getSort(), is(ApplicationFeatureSort.MEMBER));
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
             assertThat(applicationFeatureId.getMemberName(), is("foo"));
@@ -106,9 +108,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void using_fullyQualifiedName() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar#foo");
             // then
-            assertThat(applicationFeatureId.getType(), is(ApplicationFeatureType.MEMBER));
+            assertThat(applicationFeatureId.getSort(), is(ApplicationFeatureSort.MEMBER));
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
             assertThat(applicationFeatureId.getMemberName(), is("foo"));
@@ -121,7 +123,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "com.mycompany");
+            val applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "com.mycompany");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
         }
@@ -129,7 +131,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.TYPE, "com.mycompany.Bar");
+            val applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "com.mycompany.Bar");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
         }
@@ -137,7 +139,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenMember() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "com.mycompany.Bar#foo");
+            val applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "com.mycompany.Bar#foo");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
         }
@@ -148,7 +150,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.NAMESPACE, "com.mycompany");
+            val applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureSort.NAMESPACE, "com.mycompany");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
         }
@@ -156,7 +158,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.TYPE, "com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureSort.TYPE, "com.mycompany.Bar");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
         }
@@ -164,7 +166,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenMember() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureType.MEMBER, "com.mycompany.Bar#foo");
+            val applicationFeatureId = ApplicationFeatureId.newFeature(ApplicationFeatureSort.MEMBER, "com.mycompany.Bar#foo");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
         }
@@ -175,7 +177,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenPackage() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", null, null);
+            val applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", null, null);
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newNamespace("com.mycompany")));
         }
@@ -183,7 +185,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenClass() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", null);
+            val applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", null);
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newType("com.mycompany.Bar")));
         }
@@ -191,7 +193,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void whenMember() throws Exception {
             // when
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", "foo");
+            val applicationFeatureId = ApplicationFeatureId.newFeature("com.mycompany", "Bar", "foo");
             // then
             assertThat(applicationFeatureId, is(ApplicationFeatureId.newMember("com.mycompany.Bar","foo")));
         }
@@ -203,7 +205,7 @@ public class ApplicationFeatureIdTest {
         public void whenPackageWithNoParent() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
@@ -216,7 +218,7 @@ public class ApplicationFeatureIdTest {
         public void whenPackageWithHasParent() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
@@ -229,7 +231,7 @@ public class ApplicationFeatureIdTest {
         public void whenPackageWithHasParents() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany.bish.bosh");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany.bish.bosh");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
@@ -246,7 +248,7 @@ public class ApplicationFeatureIdTest {
         public void whenClassWithParents() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
@@ -262,7 +264,7 @@ public class ApplicationFeatureIdTest {
         public void whenMember() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             // when
             final List<ApplicationFeatureId> parentIds = applicationFeatureId.getParentIds();
@@ -282,11 +284,11 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenPackageWhenParentIsNotRoot() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
             // when
-            final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentPackageId();
             // then
-            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.NAMESPACE));
+            assertThat(parentPackageId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is("com"));
             assertThat(parentPackageId.getTypeSimpleName(), is(nullValue()));
             assertThat(parentPackageId.getMemberName(), is(nullValue()));
@@ -295,9 +297,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenPackageWhenParentIsRoot() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com");
             // when
-            final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentPackageId();
             // then
             assertThat(parentPackageId, is(nullValue()));
         }
@@ -305,9 +307,9 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenRootPackage() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("");
             // when
-            final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentPackageId();
             // then
             assertThat(parentPackageId, is(nullValue()));
         }
@@ -315,13 +317,13 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenClass() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // when
-            final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentPackageId();
 
             // then
-            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.NAMESPACE));
+            assertThat(parentPackageId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is("com.mycompany"));
             assertThat(parentPackageId.getTypeSimpleName(), is(nullValue()));
             assertThat(parentPackageId.getMemberName(), is(nullValue()));
@@ -330,13 +332,13 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenClassInRootPackage() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("Bar");
+            val applicationFeatureId = ApplicationFeatureId.newType("Bar");
 
             // when
-            final ApplicationFeatureId parentPackageId = applicationFeatureId.getParentPackageId();
+            val parentPackageId = applicationFeatureId.getParentPackageId();
 
             // then
-            assertThat(parentPackageId.getType(), is(ApplicationFeatureType.NAMESPACE));
+            assertThat(parentPackageId.getSort(), is(ApplicationFeatureSort.NAMESPACE));
             assertThat(parentPackageId.getNamespace(), is(""));
             assertThat(parentPackageId.getTypeSimpleName(), is(nullValue()));
             assertThat(parentPackageId.getMemberName(), is(nullValue()));
@@ -346,7 +348,7 @@ public class ApplicationFeatureIdTest {
         public void givenMember() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             // then
             expectedException.expect(IllegalStateException.class);
@@ -362,13 +364,13 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenMember() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val applicationFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             // when
-            final ApplicationFeatureId parentClassId = applicationFeatureId.getParentClassId();
+            val parentClassId = applicationFeatureId.getParentClassId();
 
             // then
-            assertThat(parentClassId.getType(), is(ApplicationFeatureType.TYPE));
+            assertThat(parentClassId.getSort(), is(ApplicationFeatureSort.TYPE));
             assertThat(parentClassId.getNamespace(), is("com.mycompany"));
             assertThat(parentClassId.getTypeSimpleName(), is("Bar"));
             assertThat(parentClassId.getMemberName(), is(nullValue()));
@@ -377,7 +379,7 @@ public class ApplicationFeatureIdTest {
         @Test
         public void givenPackage() throws Exception {
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newNamespace("com");
+            val applicationFeatureId = ApplicationFeatureId.newNamespace("com");
 
             // then
             expectedException.expect(IllegalStateException.class);
@@ -390,7 +392,7 @@ public class ApplicationFeatureIdTest {
         public void givenClass() throws Exception {
 
             // given
-            final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             // then
             expectedException.expect(IllegalStateException.class);
@@ -466,22 +468,25 @@ public class ApplicationFeatureIdTest {
         public void members() throws Exception {
             feature1 = ApplicationFeatureId.newMember("com.mycompany.Bar#b");
 
-            assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=MEMBER, "
-                    + "packageName=com.mycompany, className=Bar, memberName=b}")));
+            assertThat(feature1.toString(), 
+                    is(equalTo("ApplicationFeatureId{sort=MEMBER, "
+                    + "namespace=com.mycompany, typeSimpleName=Bar, memberName=b}")));
         }
 
         @Test
         public void classes() throws Exception {
             feature1 = ApplicationFeatureId.newType("com.mycompany.B");
 
-            assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=CLASS, packageName=com.mycompany, className=B}")));
+            assertThat(feature1.toString(), 
+                    is(equalTo("ApplicationFeatureId{sort=TYPE, namespace=com.mycompany, typeSimpleName=B}")));
         }
 
         @Test
         public void packages() throws Exception {
             feature1 = ApplicationFeatureId.newNamespace("com.b");
 
-            assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=PACKAGE, packageName=com.b}")));
+            assertThat(feature1.toString(), 
+                    is(equalTo("ApplicationFeatureId{sort=NAMESPACE, namespace=com.b}")));
         }
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
index 667368a..f30f90c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
@@ -27,7 +27,7 @@ import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 
 import lombok.val;
 
@@ -36,9 +36,9 @@ public class ApplicationFeatureTypeTest {
     public static class HideClassName extends ApplicationFeatureTypeTest {
         @Test
         public void all() throws Exception {
-            assertThat(ApplicationFeatureType.NAMESPACE.hideClassName(), is(true));
-            assertThat(ApplicationFeatureType.TYPE.hideClassName(), is(false));
-            assertThat(ApplicationFeatureType.MEMBER.hideClassName(), is(false));
+            assertThat(ApplicationFeatureSort.NAMESPACE.hideClassName(), is(true));
+            assertThat(ApplicationFeatureSort.TYPE.hideClassName(), is(false));
+            assertThat(ApplicationFeatureSort.MEMBER.hideClassName(), is(false));
         }
     }
 
@@ -46,9 +46,9 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void all() throws Exception {
-            assertThat(ApplicationFeatureType.NAMESPACE.hideMember(), is(true));
-            assertThat(ApplicationFeatureType.TYPE.hideMember(), is(true));
-            assertThat(ApplicationFeatureType.MEMBER.hideMember(), is(false));
+            assertThat(ApplicationFeatureSort.NAMESPACE.hideMember(), is(true));
+            assertThat(ApplicationFeatureSort.TYPE.hideMember(), is(true));
+            assertThat(ApplicationFeatureSort.MEMBER.hideMember(), is(false));
         }
     }
 
@@ -102,17 +102,17 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensurePackage(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
+            ApplicationFeatureSort.ensurePackage(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensurePackage(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
     }
 
@@ -123,16 +123,16 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
+            ApplicationFeatureSort.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
 
     }
@@ -144,16 +144,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensureClass(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
+            ApplicationFeatureSort.ensureClass(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensureClass(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
 
     }
@@ -165,16 +165,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.NAMESPACE, "xxx"));
+            ApplicationFeatureSort.ensureMember(new ApplicationFeatureId(ApplicationFeatureSort.NAMESPACE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.TYPE, "xxx"));
+            ApplicationFeatureSort.ensureMember(new ApplicationFeatureId(ApplicationFeatureSort.TYPE, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
+            ApplicationFeatureSort.ensureMember(new ApplicationFeatureId(ApplicationFeatureSort.MEMBER, "xxx#x"));
         }
     }
 
@@ -182,7 +182,7 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void happyCase() throws Exception {
-            assertThat(ApplicationFeatureType.NAMESPACE.toString(), is("PACKAGE"));
+            assertThat(ApplicationFeatureSort.NAMESPACE.toString(), is("NAMESPACE"));
         }
     }
 
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
index c3b5ad7..1516199 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
@@ -100,7 +100,7 @@ public interface ApplicationPermission {
         createFeatureId()
         .ifPresent(featureId->{
 
-            switch (featureId.getType()) {
+            switch (featureId.getSort()) {
             case NAMESPACE:
                 buf.append(getFeatureFqn());              // com.mycompany
                 break;
@@ -124,7 +124,7 @@ public interface ApplicationPermission {
         return buf.toString();
     }
 
-    ApplicationFeatureType getFeatureType();
+    ApplicationFeatureSort getFeatureType();
 
     // -- ROLE
 
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 8af8ea8..9110834 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
@@ -22,7 +22,7 @@ import java.util.Collection;
 import java.util.Optional;
 
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 
 /**
@@ -35,7 +35,7 @@ public interface ApplicationPermissionRepository<P extends ApplicationPermission
     Optional<P> findByRoleAndRuleAndFeature(
             ApplicationRole holder,
             ApplicationPermissionRule rule,
-            ApplicationFeatureType type,
+            ApplicationFeatureSort type,
             String featureFqn);
 
     Collection<P> allPermissions();
@@ -45,7 +45,7 @@ public interface ApplicationPermissionRepository<P extends ApplicationPermission
     Collection<P> findByRoleAndRuleAndFeatureTypeCached(
             ApplicationRole holder,
             ApplicationPermissionRule rule,
-            ApplicationFeatureType type);
+            ApplicationFeatureSort type);
 
 
     /**
@@ -65,7 +65,7 @@ public interface ApplicationPermissionRepository<P extends ApplicationPermission
             ApplicationRole role,
             ApplicationPermissionRule rule,
             ApplicationPermissionMode mode,
-            ApplicationFeatureType featureType,
+            ApplicationFeatureSort featureType,
             String featureFqn);
 
     P newPermission(
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
index 0f1b372..c0a100a 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
@@ -34,7 +34,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
@@ -80,7 +80,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     private static Class<? extends ApplicationFeatureViewModel> viewModelClassFor(
             final ApplicationFeatureId featureId,
             final ApplicationFeatureRepositoryDefault applicationFeatureRepository) {
-        switch (featureId.getType()) {
+        switch (featureId.getSort()) {
         case NAMESPACE:
             return ApplicationPackage.class;
         case TYPE:
@@ -166,8 +166,8 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
 
     // -- type (programmatic)
     @Programmatic
-    public ApplicationFeatureType getType() {
-        return getFeatureId().getType();
+    public ApplicationFeatureSort getType() {
+        return getFeatureId().getSort();
     }
 
     // -- packageName
@@ -236,7 +236,7 @@ public abstract class ApplicationFeatureViewModel implements ViewModel {
     @MemberOrder(name = "Parent", sequence = "2.6")
     public ApplicationFeatureViewModel getParent() {
         final ApplicationFeatureId parentId;
-        parentId = getType() == ApplicationFeatureType.MEMBER
+        parentId = getType() == ApplicationFeatureSort.MEMBER
                 ? getFeatureId().getParentClassId()
                 : getFeatureId().getParentPackageId();
         if(parentId == null) {
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
index a08ccf1..fd32549 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationPackage"
@@ -69,7 +69,7 @@ public class ApplicationPackage extends ApplicationFeatureViewModel {
         return asViewModels(contents);
     }
     public boolean hideContents() {
-        return getType() != ApplicationFeatureType.NAMESPACE;
+        return getType() != ApplicationFeatureSort.NAMESPACE;
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
index 359f8df..9b5e25f 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
@@ -38,7 +38,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
@@ -149,18 +149,18 @@ public class UserPermissionViewModel implements ViewModel {
         username, 
         
         viewingEvaluationGranted,
-        viewingEvaluationCauseFeatureId != null? viewingEvaluationCauseFeatureId.getType(): "",
+        viewingEvaluationCauseFeatureId != null? viewingEvaluationCauseFeatureId.getSort(): "",
         viewingEvaluationCauseFeatureId != null? viewingEvaluationCauseFeatureId.getFullyQualifiedName(): "",
         viewingEvaluationCause != null? viewingEvaluationCause.getRule(): "",
         viewingEvaluationCause != null? viewingEvaluationCause.getMode(): "",
         
         changingEvaluationGranted,
-        changingEvaluationCauseFeatureId != null? changingEvaluationCauseFeatureId.getType(): "",
+        changingEvaluationCauseFeatureId != null? changingEvaluationCauseFeatureId.getSort(): "",
         changingEvaluationCauseFeatureId != null? changingEvaluationCauseFeatureId.getFullyQualifiedName(): "",
         changingEvaluationCause != null? changingEvaluationCause.getRule(): "",
         changingEvaluationCause != null? changingEvaluationCause.getMode(): "",
         
-        featureId.getType(), 
+        featureId.getSort(), 
         featureId.getFullyQualifiedName()
         );
     }
@@ -184,7 +184,7 @@ public class UserPermissionViewModel implements ViewModel {
 
         this.viewingGranted = Boolean.valueOf(iterator.next());
         final String viewingEvaluationCauseFeatureIdType = iterator.next();
-        final ApplicationFeatureType viewingEvaluationFeatureIdType =  !viewingEvaluationCauseFeatureIdType.isEmpty() ? ApplicationFeatureType.valueOf(viewingEvaluationCauseFeatureIdType) : null;
+        final ApplicationFeatureSort viewingEvaluationFeatureIdType =  !viewingEvaluationCauseFeatureIdType.isEmpty() ? ApplicationFeatureSort.valueOf(viewingEvaluationCauseFeatureIdType) : null;
         final String viewingEvaluationFeatureFqn = iterator.next();
         this.viewingFeatureId = viewingEvaluationFeatureIdType != null? new ApplicationFeatureId(viewingEvaluationFeatureIdType,viewingEvaluationFeatureFqn) : null;
 
@@ -196,7 +196,7 @@ public class UserPermissionViewModel implements ViewModel {
 
         this.changingGranted = Boolean.valueOf(iterator.next());
         final String changingEvaluationCauseFeatureIdType = iterator.next();
-        final ApplicationFeatureType changingEvaluationFeatureIdType =  !changingEvaluationCauseFeatureIdType.isEmpty() ? ApplicationFeatureType.valueOf(changingEvaluationCauseFeatureIdType) : null;
+        final ApplicationFeatureSort changingEvaluationFeatureIdType =  !changingEvaluationCauseFeatureIdType.isEmpty() ? ApplicationFeatureSort.valueOf(changingEvaluationCauseFeatureIdType) : null;
         final String changingEvaluationFeatureFqn = iterator.next();
         this.changingFeatureId = changingEvaluationFeatureIdType != null? new ApplicationFeatureId(changingEvaluationFeatureIdType,changingEvaluationFeatureFqn) : null;
 
@@ -205,7 +205,7 @@ public class UserPermissionViewModel implements ViewModel {
         final String changingEvaluationCauseMode = iterator.next();
         this.changingMode = !changingEvaluationCauseMode.isEmpty()? ApplicationPermissionMode.valueOf(changingEvaluationCauseMode): null;
 
-        final ApplicationFeatureType type = ApplicationFeatureType.valueOf(iterator.next());
+        final ApplicationFeatureSort type = ApplicationFeatureSort.valueOf(iterator.next());
         this.featureId = new ApplicationFeatureId(type, iterator.next());
     }
 
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
index c084589..84d057c 100644
--- 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
@@ -25,7 +25,7 @@ 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.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
@@ -51,7 +51,7 @@ public class ApplicationRole_addAction {
     /**
      * Adds a {@link ApplicationPermission permission} for this role to a
      * {@link ApplicationMemberType#ACTION action}
-     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeatureSort#MEMBER member}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "3")
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
index 6208fa0..e597c45 100644
--- 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
@@ -24,7 +24,7 @@ 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.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
@@ -47,7 +47,7 @@ public class ApplicationRole_addClass {
 
     /**
      * Adds a {@link ApplicationPermission permission} for this role to a
-     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeatureSort#MEMBER member}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "1")
@@ -62,7 +62,7 @@ public class ApplicationRole_addClass {
             final String className) {
         
         applicationPermissionRepository.newPermission(
-                holder, rule, mode, ApplicationFeatureType.TYPE,
+                holder, rule, mode, ApplicationFeatureSort.TYPE,
                 packageFqn + "." + className);
         
         return holder;
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
index d83db09..7555650 100644
--- 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
@@ -27,7 +27,7 @@ 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.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
@@ -54,7 +54,7 @@ public class ApplicationRole_addCollection {
     /**
      * Adds a {@link ApplicationPermission permission} for this role to a
      * {@link ApplicationMemberType#COLLECTION collection}
-     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeatureSort#MEMBER member}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "5")
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
index 3e38695..5bd8e21 100644
--- 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
@@ -25,7 +25,7 @@ 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.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
@@ -50,7 +50,7 @@ public class ApplicationRole_addPackage {
     /**
      * Adds a {@link ApplicationPermission permission}
      * for this role to a
-     * {@link ApplicationFeatureType#NAMESPACE package}
+     * {@link ApplicationFeatureSort#NAMESPACE package}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "1")
@@ -63,7 +63,7 @@ public class ApplicationRole_addPackage {
             final String packageFqn) {
         
         applicationPermissionRepository
-            .newPermission(holder, rule, mode, ApplicationFeatureType.NAMESPACE, packageFqn);
+            .newPermission(holder, rule, mode, ApplicationFeatureSort.NAMESPACE, packageFqn);
         return holder;
     }
 
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
index 7da2f1e..0045027 100644
--- 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
@@ -27,7 +27,7 @@ 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.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
@@ -55,7 +55,7 @@ public class ApplicationRole_addProperty {
     /**
      * Adds a {@link ApplicationPermission permission} for this role to a
      * {@link ApplicationMemberType#PROPERTY property}
-     * {@link ApplicationFeatureType#MEMBER member}
+     * {@link ApplicationFeatureSort#MEMBER member}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "4")
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
index c10f763..c801036 100644
--- 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
@@ -24,7 +24,7 @@ import javax.enterprise.inject.Model;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
@@ -58,7 +58,7 @@ public class ApplicationRole_removePermission {
             @ParameterLayout(named="Rule")
             final ApplicationPermissionRule rule,
             @ParameterLayout(named="Type")
-            final ApplicationFeatureType type,
+            final ApplicationFeatureSort type,
             @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
             final String featureFqn) {
         
@@ -76,7 +76,7 @@ public class ApplicationRole_removePermission {
             @ParameterLayout(named="Rule")
             final ApplicationPermissionRule rule,
             @ParameterLayout(named="Type")
-            final ApplicationFeatureType type,
+            final ApplicationFeatureSort type,
             @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
             final String featureFqn) {
         if(applicationRoleRepository.isAdminRole(target) 
@@ -92,14 +92,14 @@ public class ApplicationRole_removePermission {
     }
     
     @Model
-    public ApplicationFeatureType default1Act() {
-        return ApplicationFeatureType.NAMESPACE;
+    public ApplicationFeatureSort default1Act() {
+        return ApplicationFeatureSort.NAMESPACE;
     }
 
     @Model
     public Collection<String> choices2Act(
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type) {
+            final ApplicationFeatureSort type) {
         
         final Collection<? extends ApplicationPermission> permissions = applicationPermissionRepository
                 .findByRoleAndRuleAndFeatureTypeCached(target, rule, type);
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 d622e7f..461a685 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
@@ -38,7 +38,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
@@ -181,7 +181,7 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
             )
     @PropertyLayout(typicalLength=ApplicationPermission.TYPICAL_LENGTH_TYPE)
     public String getType() {
-        final Enum<?> e = getFeatureType() != ApplicationFeatureType.MEMBER 
+        final Enum<?> e = getFeatureType() != ApplicationFeatureSort.MEMBER 
                 ? getFeatureType() 
                 : getMemberType().orElse(null);
         return e != null ? e.name(): null;
@@ -209,11 +209,11 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
      */
     @javax.jdo.annotations.Column(allowsNull="false")
     @Setter
-    private ApplicationFeatureType featureType;
+    private ApplicationFeatureSort featureType;
 
     @Override
     @Programmatic
-    public ApplicationFeatureType getFeatureType() {
+    public ApplicationFeatureSort getFeatureType() {
         return featureType;
     }
 
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 444439d..f988e41 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
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Repository;
 
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.message.MessageService;
@@ -150,7 +150,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Collection<ApplicationPermission> findByRoleAndRuleAndFeatureTypeCached(
             org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             ApplicationPermissionRule rule,
-            ApplicationFeatureType type) {
+            ApplicationFeatureSort type) {
         return queryResultsCacheProvider.get().execute(this::findByRoleAndRuleAndFeatureType, 
                 ApplicationPermissionRepository.class, "findByRoleAndRuleAndFeatureTypeCached", 
                 role, rule, type);
@@ -159,7 +159,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Collection<ApplicationPermission> findByRoleAndRuleAndFeatureType(
             org.apache.isis.extensions.secman.api.role.ApplicationRole role, 
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type) {
+            final ApplicationFeatureSort type) {
         return repository.allMatches(Query.named(
                         ApplicationPermission.class, "findByRoleAndRuleAndFeatureType")
                     .withParameter("role", role)
@@ -174,7 +174,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Optional<ApplicationPermission> findByRoleAndRuleAndFeatureCached(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type,
+            final ApplicationFeatureSort type,
             final String featureFqn) {
         return queryResultsCacheProvider.get().execute(
                 this::findByRoleAndRuleAndFeature,
@@ -186,7 +186,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Optional<ApplicationPermission> findByRoleAndRuleAndFeature(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type,
+            final ApplicationFeatureSort type,
             final String featureFqn) {
 
         return repository
@@ -212,7 +212,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         return repository.allMatches(
                 Query.named(
                         ApplicationPermission.class, "findByFeature")
-                .withParameter("featureType", featureId.getType())
+                .withParameter("featureType", featureId.getSort())
                 .withParameter("featureFqn", featureId.getFullyQualifiedName()))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
@@ -225,7 +225,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureType featureType,
+            final ApplicationFeatureSort featureType,
             final String featureFqn) {
 
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
@@ -243,7 +243,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureType featureType,
+            final ApplicationFeatureSort featureType,
             final String featureFqn) {
 
         ApplicationPermission permission = findByRoleAndRuleAndFeature(role, rule, featureType, featureFqn)
@@ -282,7 +282,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final ApplicationFeatureId featureId) {
 
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
-        val featureType = featureId.getType();
+        val featureType = featureId.getSort();
         val featureFqn = featureId.getFullyQualifiedName();
 
         val feature = featureRepository.findFeature(featureId);
@@ -327,7 +327,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         val orphaned = _Lists.<ApplicationPermission>newArrayList();
 
         for (val permission : allPermissions()) {
-            final ApplicationFeatureType featureType = permission.getFeatureType();
+            final ApplicationFeatureSort featureType = permission.getFeatureType();
             final String featureFqn = permission.getFeatureFqn();
 
             switch (featureType) {
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 7de472d..9378d99 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
@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -73,7 +73,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final String... featureFqns) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.NAMESPACE, Arrays.asList(featureFqns));
+        newPermissions(rule, mode, ApplicationFeatureSort.NAMESPACE, Arrays.asList(featureFqns));
     }
 
     /**
@@ -84,7 +84,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final Class<?>... classes) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.TYPE, asFeatureFqns(classes));
+        newPermissions(rule, mode, ApplicationFeatureSort.TYPE, asFeatureFqns(classes));
     }
 
 
@@ -96,7 +96,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final Class<?> cls,
             final String... members) {
-        newPermissions(rule, mode, ApplicationFeatureType.MEMBER, asFeatureFqns(cls, members));
+        newPermissions(rule, mode, ApplicationFeatureSort.MEMBER, asFeatureFqns(cls, members));
     }
 
 
@@ -105,7 +105,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
     private void newPermissions(
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureType featureType,
+            final ApplicationFeatureSort featureType,
             final Iterable<String> featureFqns) {
 
         if(featureFqns == null) {
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
index ab64170..88839ed 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
@@ -46,7 +46,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
@@ -197,7 +197,7 @@ implements
             )
     @PropertyLayout(typicalLength=ApplicationPermission.TYPICAL_LENGTH_TYPE)
     public String getType() {
-        final Enum<?> e = getFeatureType() != ApplicationFeatureType.MEMBER 
+        final Enum<?> e = getFeatureType() != ApplicationFeatureSort.MEMBER 
                 ? getFeatureType() 
                         : getMemberType().orElse(null);
         return e != null ? e.name(): null;
@@ -226,11 +226,11 @@ implements
     @Column(nullable=false)
     @Enumerated(EnumType.STRING)
     @Setter
-    private ApplicationFeatureType featureType;
+    private ApplicationFeatureSort featureType;
 
     @Override
     @Programmatic
-    public ApplicationFeatureType getFeatureType() {
+    public ApplicationFeatureSort getFeatureType() {
         return featureType;
     }
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
index e2bf103..2033a66 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
@@ -32,7 +32,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.message.MessageService;
@@ -168,7 +168,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Collection<ApplicationPermission> findByRoleAndRuleAndFeatureTypeCached(
             org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             ApplicationPermissionRule rule,
-            ApplicationFeatureType type) {
+            ApplicationFeatureSort type) {
         return queryResultsCacheProvider.get().execute(this::findByRoleAndRuleAndFeatureType, 
                 ApplicationPermissionRepository.class, "findByRoleAndRuleAndFeatureTypeCached", 
                 role, rule, type);
@@ -177,7 +177,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Collection<ApplicationPermission> findByRoleAndRuleAndFeatureType(
             org.apache.isis.extensions.secman.api.role.ApplicationRole role, 
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type) {
+            final ApplicationFeatureSort type) {
         return repository.allMatches(Query.named(
                         ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE)
                     .withParameter("role", role)
@@ -192,7 +192,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Optional<ApplicationPermission> findByRoleAndRuleAndFeatureCached(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type,
+            final ApplicationFeatureSort type,
             final String featureFqn) {
         return queryResultsCacheProvider.get().execute(
                 this::findByRoleAndRuleAndFeature,
@@ -204,7 +204,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     public Optional<ApplicationPermission> findByRoleAndRuleAndFeature(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureType type,
+            final ApplicationFeatureSort type,
             final String featureFqn) {
 
         return repository
@@ -230,7 +230,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         return repository.allMatches(
                 Query.named(
                         ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_FEATURE)
-                .withParameter("featureType", featureId.getType())
+                .withParameter("featureType", featureId.getSort())
                 .withParameter("featureFqn", featureId.getFullyQualifiedName()))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
@@ -243,7 +243,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureType featureType,
+            final ApplicationFeatureSort featureType,
             final String featureFqn) {
 
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
@@ -261,7 +261,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureType featureType,
+            final ApplicationFeatureSort featureType,
             final String featureFqn) {
 
         ApplicationPermission permission = findByRoleAndRuleAndFeature(role, rule, featureType, featureFqn)
@@ -301,7 +301,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
         
-        val featureType = featureId.getType();
+        val featureType = featureId.getSort();
         val featureFqn = featureId.getFullyQualifiedName();
 
         val feature = applicationFeatureRepository.findFeature(featureId);
@@ -347,7 +347,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
         val permissions = allPermissions();
         for (val permission : permissions) {
-            final ApplicationFeatureType featureType = permission.getFeatureType();
+            final ApplicationFeatureSort featureType = permission.getFeatureType();
             final String featureFqn = permission.getFeatureFqn();
 
             switch (featureType) {
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
index 20df788..e12c342 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
-import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
@@ -69,7 +69,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final String... featureFqns) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.NAMESPACE, Arrays.asList(featureFqns));
+        newPermissions(rule, mode, ApplicationFeatureSort.NAMESPACE, Arrays.asList(featureFqns));
     }
 
     /**
@@ -80,7 +80,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final Class<?>... classes) {
 
-        newPermissions(rule, mode, ApplicationFeatureType.TYPE, asFeatureFqns(classes));
+        newPermissions(rule, mode, ApplicationFeatureSort.TYPE, asFeatureFqns(classes));
     }
 
 
@@ -92,7 +92,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
             final ApplicationPermissionMode mode,
             final Class<?> cls,
             final String... members) {
-        newPermissions(rule, mode, ApplicationFeatureType.MEMBER, asFeatureFqns(cls, members));
+        newPermissions(rule, mode, ApplicationFeatureSort.MEMBER, asFeatureFqns(cls, members));
     }
 
 
@@ -103,7 +103,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
     private void newPermissions(
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureType featureType,
+            final ApplicationFeatureSort featureType,
             final Iterable<String> featureFqns) {
 
         if(featureFqns == null) {


[isis] 01/09: ISIS-2553: promote ApplicationFeatureId to applib

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 3d430247f0da1825c16d9287e5748a01af2fcc3e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 3 14:53:32 2021 +0100

    ISIS-2553: promote ApplicationFeatureId to applib
    
    (still needs a lot of cleanup)
---
 .../services/appfeat/ApplicationFeatureId.java     | 172 +++++----------------
 .../appfeat/ApplicationFeatureRepository.java      |   5 +
 .../services/appfeat/ApplicationFeatureType.java   |  17 +-
 .../services/appfeat/ApplicationFeature.java       |   5 +-
 .../ApplicationFeatureRepositoryDefault.java       |  73 ++++-----
 .../core/metamodel/services/appfeat/_Asserts.java  |  50 ++++++
 .../metamodel/services/appfeat/_Predicates.java    |  50 ++++++
 .../metamodel/MetaModelServiceDefault.java         |   4 +-
 .../specloader/SpecificationLoaderDefault.java     |   2 +-
 .../services/appfeat/ApplicationFeatureIdTest.java |  14 +-
 .../ApplicationFeatureRepositoryDefaultTest.java   |   1 +
 .../services/appfeat/ApplicationFeatureTest.java   |   1 +
 .../appfeat/ApplicationFeatureTypeTest.java        |  48 +++---
 .../secman/api/authorizor/AuthorizorSecman.java    |   2 +-
 .../api/permission/ApplicationPermission.java      |   4 +-
 .../ApplicationPermissionRepository.java           |  14 +-
 .../api/permission/ApplicationPermissionValue.java |   2 +-
 .../permission/ApplicationPermissionValueSet.java  |   2 +-
 .../permission/PermissionsEvaluationService.java   |   2 +-
 .../PermissionsEvaluationServiceAbstract.java      |   2 +-
 .../secman/api/role/ApplicationRole.java           |   7 +-
 .../secman/model/app/feature/ApplicationClass.java |   2 +-
 .../model/app/feature/ApplicationClassAction.java  |   2 +-
 .../app/feature/ApplicationClassCollection.java    |   2 +-
 .../model/app/feature/ApplicationClassMember.java  |   2 +-
 .../app/feature/ApplicationClassProperty.java      |   2 +-
 .../app/feature/ApplicationFeatureViewModel.java   |   4 +-
 .../model/app/feature/ApplicationPackage.java      |   4 +-
 .../app/feature/ApplicationPermission_feature.java |   2 +-
 .../user/ApplicationUser_filterPermissions.java    |   6 +-
 .../app/user/ApplicationUser_permissions.java      |   4 +-
 .../model/app/user/UserPermissionViewModel.java    |   4 +-
 .../ApplicationOrphanedPermissionManager.java      |   9 +-
 ...OrphanedPermissionManager_relocateSelected.java |   2 +-
 .../permission/ApplicationPermission_allow.java    |   8 +-
 .../permission/ApplicationPermission_changing.java |   8 +-
 .../permission/ApplicationPermission_delete.java   |  10 +-
 .../ApplicationPermission_updateRole.java          |  12 +-
 .../dom/permission/ApplicationPermission_veto.java |  12 +-
 .../permission/ApplicationPermission_viewing.java  |  12 +-
 .../model/dom/role/ApplicationRole_addAction.java  |   8 +-
 .../model/dom/role/ApplicationRole_addClass.java   |   8 +-
 .../dom/role/ApplicationRole_addCollection.java    |   8 +-
 .../model/dom/role/ApplicationRole_addPackage.java |   8 +-
 ...ion.java => ApplicationRole_addPermission.java} |  89 +++++++----
 .../dom/role/ApplicationRole_addProperty.java      |   8 +-
 .../model/dom/role/ApplicationRole_addUser.java    |   8 +-
 .../dom/role/ApplicationRole_removePermission.java |  12 +-
 .../role/ApplicationRole_removePermissions.java    |   8 +-
 .../model/dom/role/ApplicationRole_removeUser.java |  10 +-
 .../dom/role/ApplicationRole_removeUsers.java      |   8 +-
 .../role/ApplicationRole_updateDescription.java    |  12 +-
 .../model/dom/role/ApplicationRole_updateName.java |  12 +-
 .../dom/tenancy/ApplicationTenancy_addChild.java   |   6 +-
 .../dom/tenancy/ApplicationTenancy_addUser.java    |   8 +-
 .../dom/tenancy/ApplicationTenancy_delete.java     |   4 +-
 .../tenancy/ApplicationTenancy_removeChild.java    |  12 +-
 .../dom/tenancy/ApplicationTenancy_removeUser.java |  12 +-
 .../dom/tenancy/ApplicationTenancy_updateName.java |  14 +-
 .../tenancy/ApplicationTenancy_updateParent.java   |   8 +-
 .../dom/tenancy/ApplicationTenancy_users.java      |   4 +-
 .../ApplicationUserManager_newDelegateUser.java    |   6 +-
 .../user/ApplicationUserManager_newLocalUser.java  |   6 +-
 .../model/dom/user/ApplicationUser_addRole.java    |  12 +-
 .../model/dom/user/ApplicationUser_delete.java     |   6 +-
 .../model/dom/user/ApplicationUser_duplicate.java  |   6 +-
 .../model/dom/user/ApplicationUser_lock.java       |  10 +-
 .../model/dom/user/ApplicationUser_removeRole.java |  12 +-
 .../dom/user/ApplicationUser_removeRoles.java      |   8 +-
 .../dom/user/ApplicationUser_resetPassword.java    |  10 +-
 .../model/dom/user/ApplicationUser_unlock.java     |   8 +-
 .../user/ApplicationUser_updateAccountType.java    |  10 +-
 .../dom/user/ApplicationUser_updateAtPath.java     |   8 +-
 .../user/ApplicationUser_updateEmailAddress.java   |  10 +-
 .../model/dom/user/ApplicationUser_updateName.java |  18 +--
 .../dom/user/ApplicationUser_updatePassword.java   |  18 +--
 .../user/ApplicationUser_updatePhoneNumber.java    |  10 +-
 .../dom/user/ApplicationUser_updateUsername.java   |   8 +-
 .../secman/model/dom/user/HasUsername_open.java    |  10 +-
 .../jdo/dom/permission/ApplicationPermission.java  |   4 +-
 .../ApplicationPermissionRepository.java           |  34 ++--
 .../secman/jdo/dom/user/ApplicationUser.java       |   2 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |   2 +-
 .../jpa/dom/permission/ApplicationPermission.java  |   4 +-
 .../ApplicationPermissionRepository.java           |  20 ++-
 .../secman/jpa/dom/user/ApplicationUser.java       |   2 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |   2 +-
 .../secman/shiro/PermissionForMember.java          |   2 +-
 88 files changed, 593 insertions(+), 506 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
similarity index 78%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
rename to api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
index f6ce177..f465792 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureId.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.services.appfeat;
+package org.apache.isis.applib.services.appfeat;
 
 import java.io.Serializable;
 import java.util.Collections;
@@ -24,7 +24,6 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.function.Function;
-import java.util.function.Predicate;
 
 import static java.util.Comparator.comparing;
 import static java.util.Comparator.naturalOrder;
@@ -33,7 +32,6 @@ import static java.util.Comparator.nullsFirst;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Value;
-import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
 import org.apache.isis.applib.util.ObjectContracts;
@@ -42,7 +40,9 @@ import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 
+import lombok.Getter;
 import lombok.NonNull;
+import lombok.Setter;
 import lombok.val;
 
 /**
@@ -118,9 +118,7 @@ implements
     }
 
     public static ApplicationFeatureId newClass(final String classFqn) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.CLASS);
-        featureId.type.init(featureId, classFqn);
-        return featureId;
+        return new ApplicationFeatureId(ApplicationFeatureType.CLASS, classFqn);
     }
 
     public static ApplicationFeatureId newMember(final String classFqn, final String memberName) {
@@ -132,9 +130,7 @@ implements
     }
 
     public static ApplicationFeatureId newMember(final String fullyQualifiedName) {
-        final ApplicationFeatureId featureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
-        featureId.type.init(featureId, fullyQualifiedName);
-        return featureId;
+        return new ApplicationFeatureId(ApplicationFeatureType.MEMBER, fullyQualifiedName);
     }
 
     /**
@@ -151,10 +147,7 @@ implements
         return new ApplicationFeatureId(_Strings.base64UrlDecode(encodedString));
     }
 
-
-    // //////////////////////////////////////
-
-    // -- constructor
+    // -- CONSTRUCTOR
 
     private ApplicationFeatureId(final String asString) {
         final Iterator<String> iterator = _Strings.splitThenStream(asString, ":").iterator();
@@ -163,8 +156,8 @@ implements
     }
 
     /**
-     * Must be called by {@link ApplicationFeatureType#init(ApplicationFeatureId, String)} immediately afterwards
-     * to fully initialize.
+     * Must be called by {@link ApplicationFeatureType#init(ApplicationFeatureId, String)} 
+     * immediately afterwards to fully initialize.
      */
     ApplicationFeatureId(final ApplicationFeatureType type) {
         this.type = type;
@@ -174,11 +167,8 @@ implements
         type.init(this, fullyQualifiedName);
     }
 
-
-
-    // //////////////////////////////////////
-
-    // -- identification
+    // -- IDENTIFICATION
+    
     /**
      * having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use
      * wrapperFactory#unwrap(...) method, which is otherwise broken in Isis 1.6.0
@@ -189,10 +179,7 @@ implements
         return buf.toString();
     }
 
-
-    // //////////////////////////////////////
-
-    // -- fullyQualifiedName (property)
+    // -- PROPERTIES
 
     @Programmatic
     public String getFullyQualifiedName() {
@@ -207,10 +194,6 @@ implements
         return buf.toString();
     }
 
-
-
-    // -- objectSpecId (property)
-
     @Programmatic
     public String getLogicalTypeName() {
         if (getTypeSimpleName() == null) {
@@ -226,67 +209,16 @@ implements
         return buf.toString();
     }
 
+    @Getter ApplicationFeatureType type;
 
+    @Programmatic 
+    @Getter @Setter private String namespace;
 
-    // //////////////////////////////////////
-
-    // -- type (property)
-    ApplicationFeatureType type;
-
-    public ApplicationFeatureType getType() {
-        return type;
-    }
-
-
-    // //////////////////////////////////////
-
-    // -- namespace (property)
-    private String namespace;
-
-    @Programmatic
-    public String getNamespace() {
-        return namespace;
-    }
-
-    void setNamespace(final String namespace) {
-        this.namespace = namespace;
-    }
-
-
-    // //////////////////////////////////////
-
-    // -- className (property, optional)
-
-    private String typeSimpleName;
-
-    @Programmatic
-    public String getTypeSimpleName() {
-        return typeSimpleName;
-    }
-
-    void setTypeSimpleName(final String className) {
-        this.typeSimpleName = className;
-    }
-
-
-    // //////////////////////////////////////
-
-    // -- memberName (property, optional)
-    private String memberName;
-
-    @Programmatic
-    public String getMemberName() {
-        return memberName;
-    }
-
-    void setMemberName(final String memberName) {
-        this.memberName = memberName;
-    }
-
-
-    // //////////////////////////////////////
+    @Programmatic 
+    @Getter @Setter private String typeSimpleName;
 
-    // -- Package or Class: getParentPackageId
+    @Programmatic 
+    @Getter @Setter private String memberName;
 
     /**
      * The {@link ApplicationFeatureId id} of the parent package of this
@@ -312,12 +244,6 @@ implements
         }
     }
 
-
-
-    // //////////////////////////////////////
-
-    // -- Member: getParentClassId
-
     /**
      * The {@link ApplicationFeatureId id} of the member's class.
      */
@@ -327,10 +253,7 @@ implements
         return newClass(classFqn);
     }
 
-
-    // //////////////////////////////////////
-
-    // -- asString, asEncodedString
+    // -- ENCODING
 
     @Programmatic
     public String asString() {
@@ -341,7 +264,6 @@ implements
     public String asEncodedString() {
         return _Strings.base64UrlEncode(asString());
     }
-    
 
     // //////////////////////////////////////
 
@@ -362,36 +284,6 @@ implements
 
     // //////////////////////////////////////
 
-    // -- Predicates
-
-    public static class Predicates {
-        private Predicates(){}
-
-        public static Predicate<ApplicationFeatureId> isClassContaining(
-                final ApplicationMemberType memberType, final ApplicationFeatureRepositoryDefault applicationFeatures) {
-            return new Predicate<ApplicationFeatureId>() {
-                @Override
-                public boolean test(final ApplicationFeatureId input) {
-                    if(input.getType() != ApplicationFeatureType.CLASS) {
-                        return false;
-                    }
-                    final ApplicationFeature feature = applicationFeatures.findFeature(input);
-                    if(feature == null) {
-                        return false;
-                    }
-                    return memberType == null || !feature.membersOf(memberType).isEmpty();
-                }
-            };
-        }
-
-        public static Predicate<ApplicationFeatureId> isClassRecursivelyWithin(final ApplicationFeatureId packageId) {
-            return (ApplicationFeatureId input) -> input.getParentIds().contains(packageId);
-        }
-    }
-
-
-    // //////////////////////////////////////
-
     // -- Comparators
     public static final class Comparators {
         private Comparators(){}
@@ -441,10 +333,7 @@ implements
         return parentIds;
     }
 
-
-    // //////////////////////////////////////
-
-    // -- equals, hashCode, compareTo, toString
+    // -- OBJECT CONTRACT
 
     private static final Comparator<ApplicationFeatureId> byType =
             comparing(ApplicationFeatureId::getType, nullsFirst(naturalOrder()));
@@ -510,5 +399,26 @@ implements
         return newFeature(namespace, this.getTypeSimpleName(), this.getMemberName()); 
     }
 
+    @Deprecated // duplicate
+    public static ApplicationFeatureId createPackage(String fqn) {
+        val feat = new ApplicationFeatureId(ApplicationFeatureType.PACKAGE);
+        ApplicationFeatureType.PACKAGE.init(feat, fqn);
+        return feat;
+    }
+    
+    @Deprecated // duplicate
+    public static ApplicationFeatureId createClass(String fqn) {
+        val feat = new ApplicationFeatureId(ApplicationFeatureType.CLASS);
+        ApplicationFeatureType.CLASS.init(feat, fqn);
+        return feat;
+    }
+    
+    @Deprecated // duplicate
+    public static ApplicationFeatureId createMember(String fqn) {
+        val feat = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
+        ApplicationFeatureType.MEMBER.init(feat, fqn);
+        return feat;
+    }
+
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureRepository.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureRepository.java
index fbc1910..558126f 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureRepository.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureRepository.java
@@ -18,8 +18,11 @@
  */
 package org.apache.isis.applib.services.appfeat;
 
+import java.util.Map;
 import java.util.SortedSet;
 
+import org.apache.isis.applib.Identifier;
+
 /**
  * Provides the access to string representations of the packages, classes and
  * class members (collectively: "application features") of the domain classes
@@ -46,4 +49,6 @@ public interface ApplicationFeatureRepository  {
             String className,
             ApplicationMemberType memberType);
 
+    Map<String, ApplicationFeatureId> getFeatureIdentifiersByName();
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureType.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
similarity index 89%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureType.java
rename to api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
index 441b36a..81415a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureType.java
@@ -16,9 +16,9 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.services.appfeat;
+package org.apache.isis.applib.services.appfeat;
 
-import org.apache.isis.core.metamodel.commons.StringExtensions;
+import org.apache.isis.commons.internal.base._Strings;
 
 public enum ApplicationFeatureType {
     
@@ -76,40 +76,41 @@ public enum ApplicationFeatureType {
     public boolean hideClassName() {
         return this == ApplicationFeatureType.PACKAGE;
     }
+    
     public boolean hideMember() {
         return this == ApplicationFeatureType.PACKAGE || this == ApplicationFeatureType.CLASS;
     }
 
     abstract void init(ApplicationFeatureId applicationFeatureId, String fullyQualifiedName);
 
-    static void ensurePackage(final ApplicationFeatureId feature) {
+    public static void ensurePackage(final ApplicationFeatureId feature) {
         if(feature.type != ApplicationFeatureType.PACKAGE) {
             throw new IllegalStateException("Can only be called for a package; " + feature.toString());
         }
     }
 
-    static void ensurePackageOrClass(final ApplicationFeatureId applicationFeatureId) {
+    public static void ensurePackageOrClass(final ApplicationFeatureId applicationFeatureId) {
         if(applicationFeatureId.type != ApplicationFeatureType.PACKAGE && applicationFeatureId.type != ApplicationFeatureType.CLASS) {
             throw new IllegalStateException("Can only be called for a package or a class; " + applicationFeatureId.toString());
         }
     }
 
-    static void ensureClass(final ApplicationFeatureId feature) {
+    public static void ensureClass(final ApplicationFeatureId feature) {
         if(feature.type != ApplicationFeatureType.CLASS) {
             throw new IllegalStateException("Can only be called for a class; " + feature.toString());
         }
     }
 
-    static void ensureMember(final ApplicationFeatureId feature) {
+    public static void ensureMember(final ApplicationFeatureId feature) {
         if(feature.type != ApplicationFeatureType.MEMBER) {
             throw new IllegalStateException("Can only be called for a member; " + feature.toString());
         }
     }
 
-
     @Override
     public String toString() {
-        return StringExtensions.capitalize(name());
+        return _Strings.capitalize(name());
     }
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
index b43ffbf..af36106 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
@@ -28,7 +28,9 @@ import javax.enterprise.inject.Vetoed;
 import org.apache.isis.applib.IsisModuleApplib;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
@@ -193,7 +195,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
 
             return (final ApplicationFeature input) ->
             input.getContents().stream() // all the classes in this package
-            .anyMatch(ApplicationFeatureId.Predicates.isClassContaining(memberType, applicationFeatures));
+            .anyMatch(_Predicates.isClassContaining(memberType, applicationFeatures));
         }
     }
 
@@ -230,6 +232,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     public String toString() {
         return toString.toString(this);
     }
+    
 
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index 8174e00..b718d1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -20,10 +20,13 @@ package org.apache.isis.core.metamodel.services.appfeat;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
@@ -34,7 +37,9 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.collections._Sets;
@@ -62,9 +67,11 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @Named("isis.metamodel.ApplicationFeatureRepositoryDefault")
 @Log4j2
-public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRepository {
+public class ApplicationFeatureRepositoryDefault 
+implements ApplicationFeatureRepository {
 
     // -- caches
+    private Map<String, ApplicationFeatureId> featureIdentifiersByName;
     final SortedMap<ApplicationFeatureId, ApplicationFeature> packageFeatures = _Maps.newTreeMap();
     private final SortedMap<ApplicationFeatureId, ApplicationFeature> classFeatures = _Maps.newTreeMap();
     private final SortedMap<ApplicationFeatureId, ApplicationFeature> memberFeatures = _Maps.newTreeMap();
@@ -115,9 +122,22 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
             return;
         }
         initializationState = InitializationState.INITIALIZED;
+        
         for (val spec : specificationLoader.snapshotSpecifications()) {
             createApplicationFeaturesFor(spec);
         }
+        
+        val featuresByName = new HashMap<String, ApplicationFeatureId>();
+        visitFeatureIdentifierByName(packageFeatures, featuresByName::put);
+        visitFeatureIdentifierByName(classFeatures, featuresByName::put);
+        visitFeatureIdentifierByName(memberFeatures, featuresByName::put);
+        this.featureIdentifiersByName = Collections.unmodifiableMap(featuresByName);
+    }
+    
+    private void visitFeatureIdentifierByName(
+            final Map<ApplicationFeatureId, ApplicationFeature> map, 
+            final BiConsumer<String, ApplicationFeatureId> onEntry) {
+        map.forEach((k, v)->onEntry.accept(k.toString(), k));
     }
 
     void createApplicationFeaturesFor(final ObjectSpecification spec) {
@@ -137,8 +157,8 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
             return;
         }
 
-        final String specIdString = spec.getLogicalTypeName();
-        final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass(specIdString);
+        final String logicalTypeName = spec.getLogicalTypeName();
+        final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newClass(logicalTypeName);
 
         // add class to our map
         // (later on it may get removed if the class turns out to have no features,
@@ -335,41 +355,6 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
         return excluded;
     }
 
-//XXX[2286] .. replaced by check 'spec.getBeanSort().isUnknown()'
-//    /**
-//     * Ignore the (strict) super-classes of any services.
-//     * <p>
-//     * For example, we want to ignore <code>ExceptionRecognizerComposite</code>
-//     * because there is no service of that type (only of subtypes of that).
-//     * </p>
-//     */
-//    private boolean isSuperClassOfService(final ObjectSpecification spec) {
-//
-//        val specClass = spec.getCorrespondingClass();
-//
-//        // is this class a supertype or the actual type of one of the services?
-//        boolean serviceCls = false;
-//        for (final ManagedBeanAdapter bean : registeredServices.get()) {
-//            final Class<?> serviceClass = bean.getBeanClass();
-//            if (specClass.isAssignableFrom(serviceClass)) {
-//                serviceCls = true;
-//            }
-//        }
-//        if (!serviceCls) {
-//            return false;
-//        }
-//
-//        // yes it is.  In which case, is it the actual concrete class of one of those services?
-//        for (final Object registeredService : registeredServices.get()) {
-//            final Class<?> serviceClass = registeredService.getClass();
-//            if (serviceClass.isAssignableFrom(specClass)) {
-//                return false;
-//            }
-//        }
-//        // couldn't find a service of exactly this type, so ignore the spec.
-//        return true;
-//    }
-
     protected boolean isHidden(final ObjectSpecification spec) {
         final HiddenFacet facet = spec.getFacet(HiddenFacet.class);
         return facet != null &&
@@ -472,6 +457,12 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
         return actionFeatures.values();
     }
 
+    @Override
+    public Map<String, ApplicationFeatureId> getFeatureIdentifiersByName() {
+        initializeIfRequired();
+        return featureIdentifiersByName;
+    }
+    
     // -- packageNames, packageNamesContainingClasses, classNamesContainedIn, memberNamesOf
     
     @Override
@@ -503,7 +494,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
         }
         final SortedSet<ApplicationFeatureId> contents = pkg.getContents();
         return contents.stream()
-                .filter(ApplicationFeatureId.Predicates.isClassContaining(memberType, this))
+                .filter(_Predicates.isClassContaining(memberType, this))
                 .map(ApplicationFeatureId.Functions.GET_CLASS_NAME)
                 .collect(_Sets.toUnmodifiableSorted());
     }
@@ -518,7 +509,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
         }
         final Set<ApplicationFeatureId> classIds = this.classFeatures.keySet();
         return classIds.stream()
-                .filter(ApplicationFeatureId.Predicates.isClassRecursivelyWithin(packageId))
+                .filter(_Predicates.isClassRecursivelyWithin(packageId))
                 .map(ApplicationFeatureId.Functions.GET_CLASS_NAME)
                 .collect(_Sets.toUnmodifiableSorted());
     }
@@ -539,6 +530,6 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
                 .map(ApplicationFeatureId.Functions.GET_MEMBER_NAME)
                 .collect(_Sets.toUnmodifiableSorted());
     }
-
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.java
new file mode 100644
index 0000000..369d8f7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Asserts.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.core.metamodel.services.appfeat;
+
+import java.util.function.Predicate;
+
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+
+final class _Asserts {
+
+    public static Predicate<ApplicationFeatureId> isClassContaining(
+            final ApplicationMemberType memberType, final ApplicationFeatureRepositoryDefault applicationFeatures) {
+        return new Predicate<ApplicationFeatureId>() {
+            @Override
+            public boolean test(final ApplicationFeatureId input) {
+                if(input.getType() != ApplicationFeatureType.CLASS) {
+                    return false;
+                }
+                final ApplicationFeature feature = applicationFeatures.findFeature(input);
+                if(feature == null) {
+                    return false;
+                }
+                return memberType == null || !feature.membersOf(memberType).isEmpty();
+            }
+        };
+    }
+
+    public static Predicate<ApplicationFeatureId> isClassRecursivelyWithin(final ApplicationFeatureId packageId) {
+        return (ApplicationFeatureId input) -> input.getParentIds().contains(packageId);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.java
new file mode 100644
index 0000000..93b4fc7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/_Predicates.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.core.metamodel.services.appfeat;
+
+import java.util.function.Predicate;
+
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+
+final class _Predicates {
+
+    public static Predicate<ApplicationFeatureId> isClassContaining(
+            final ApplicationMemberType memberType, final ApplicationFeatureRepositoryDefault applicationFeatures) {
+        return new Predicate<ApplicationFeatureId>() {
+            @Override
+            public boolean test(final ApplicationFeatureId input) {
+                if(input.getType() != ApplicationFeatureType.CLASS) {
+                    return false;
+                }
+                final ApplicationFeature feature = applicationFeatures.findFeature(input);
+                if(feature == null) {
+                    return false;
+                }
+                return memberType == null || !feature.membersOf(memberType).isEmpty();
+            }
+        };
+    }
+
+    public static Predicate<ApplicationFeatureId> isClassRecursivelyWithin(final ApplicationFeatureId packageId) {
+        return (ApplicationFeatureId input) -> input.getParentIds().contains(packageId);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index df26aa9..2969b3a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -31,6 +31,8 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.commanddto.processor.CommandDtoProcessor;
 import org.apache.isis.applib.services.grid.GridService;
@@ -43,8 +45,6 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.facets.members.publish.command.CommandPublishingFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
index 81d201e..2026089 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
@@ -39,6 +39,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.id.LogicalType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
@@ -60,7 +61,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelService;
 import org.apache.isis.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutor.Substitution;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorDefault;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 9f91565..7c319c4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -38,6 +38,8 @@ import static org.hamcrest.Matchers.emptyCollectionOf;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.lessThan;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.core.internaltestsupport.contract.ValueTypeContractTestAbstract;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
@@ -615,7 +617,7 @@ public class ApplicationFeatureIdTest {
             public void whenNull() throws Exception {
                 expectedException.expect(NullPointerException.class);
 
-                ApplicationFeatureId.Predicates.
+                _Predicates.
                 isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
                 test(null);
             }
@@ -623,12 +625,12 @@ public class ApplicationFeatureIdTest {
             @Test
             public void whenNotClass() throws Exception {
                 assertThat(
-                        ApplicationFeatureId.Predicates.
+                        _Predicates.
                         isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
                         test(ApplicationFeatureId.newPackage("com.mycompany")),
                         is(false));
                 assertThat(
-                        ApplicationFeatureId.Predicates.
+                        _Predicates.
                         isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
                         test(ApplicationFeatureId.newMember("com.mycompany.Bar#foo")),
                         is(false));
@@ -643,7 +645,7 @@ public class ApplicationFeatureIdTest {
                 }});
 
                 assertThat(
-                        ApplicationFeatureId.Predicates.
+                        _Predicates.
                         isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
                         test(classFeature),
                         is(false));
@@ -660,7 +662,7 @@ public class ApplicationFeatureIdTest {
                 }});
 
                 assertThat(
-                        ApplicationFeatureId.Predicates.
+                        _Predicates.
                         isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
                         test(classFeature),
                         is(false));
@@ -679,7 +681,7 @@ public class ApplicationFeatureIdTest {
                 }});
 
                 assertThat(
-                        ApplicationFeatureId.Predicates.
+                        _Predicates.
                         isClassContaining(ApplicationMemberType.ACTION, mockApplicationFeatureRepository).
                         test(classFeature),
                         is(true));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index 4e2b515..9f0dd47 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -39,6 +39,7 @@ import static org.hamcrest.Matchers.containsInAnyOrder;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.collections.Can;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java
index fe47c9e..34c1f79 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTest.java
@@ -27,6 +27,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 
 public class ApplicationFeatureTest {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
index 7398248..3ddb220 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureTypeTest.java
@@ -26,6 +26,11 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
+
+import lombok.val;
+
 public class ApplicationFeatureTypeTest {
 
     public static class HideClassName extends ApplicationFeatureTypeTest {
@@ -55,9 +60,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenPackage() throws Exception {
 
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.PACKAGE);
-
-            ApplicationFeatureType.PACKAGE.init(applicationFeatureId, "com.mycompany");
+            val applicationFeatureId = ApplicationFeatureId.createPackage("com.mycompany"); 
 
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is(nullValue()));
@@ -67,9 +70,7 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenClass() throws Exception {
 
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.CLASS);
-
-            ApplicationFeatureType.CLASS.init(applicationFeatureId, "com.mycompany.Bar");
+            val applicationFeatureId = ApplicationFeatureId.createClass("com.mycompany.Bar");
 
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
@@ -79,10 +80,8 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void givenMember() throws Exception {
 
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
-
-            ApplicationFeatureType.MEMBER.init(applicationFeatureId, "com.mycompany.Bar#foo");
-
+            val applicationFeatureId = ApplicationFeatureId.createMember("com.mycompany.Bar#foo");
+            
             assertThat(applicationFeatureId.getNamespace(), is("com.mycompany"));
             assertThat(applicationFeatureId.getTypeSimpleName(), is("Bar"));
             assertThat(applicationFeatureId.getMemberName(), is("foo"));
@@ -91,9 +90,8 @@ public class ApplicationFeatureTypeTest {
         public void givenMemberMalformed() throws Exception {
 
             expectedException.expect(IllegalArgumentException.class);
-            final ApplicationFeatureId applicationFeatureId = new ApplicationFeatureId(ApplicationFeatureType.MEMBER);
-
-            ApplicationFeatureType.MEMBER.init(applicationFeatureId, "com.mycompany.BarISMISSINGTHEHASHSYMBOL");
+            ApplicationFeatureId
+                    .createMember("com.mycompany.BarISMISSINGTHEHASHSYMBOL");
         }
     }
 
@@ -104,17 +102,17 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE));
+            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.CLASS));
+            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.MEMBER));
+            ApplicationFeatureType.ensurePackage(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
         }
     }
 
@@ -125,16 +123,16 @@ public class ApplicationFeatureTypeTest {
 
         @Test
         public void whenPackage() throws Exception {
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE));
+            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.CLASS));
+            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.MEMBER));
+            ApplicationFeatureType.ensurePackageOrClass(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
         }
 
     }
@@ -146,16 +144,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE));
+            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.CLASS));
+            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.MEMBER));
+            ApplicationFeatureType.ensureClass(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
         }
 
     }
@@ -167,16 +165,16 @@ public class ApplicationFeatureTypeTest {
         @Test
         public void whenPackage() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE));
+            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.PACKAGE, "xxx"));
         }
         @Test
         public void whenClass() throws Exception {
             expectedException.expect(IllegalStateException.class);
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.CLASS));
+            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.CLASS, "xxx"));
         }
         @Test
         public void whenMember() throws Exception {
-            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.MEMBER));
+            ApplicationFeatureType.ensureMember(new ApplicationFeatureId(ApplicationFeatureType.MEMBER, "xxx#x"));
         }
     }
 
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java
index dc3188a..f49b996 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/authorizor/AuthorizorSecman.java
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.security.authentication.Authentication;
 import org.apache.isis.core.security.authorization.Authorizor;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
index 0a7b6d0..1c423aa 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermission.java
@@ -26,10 +26,10 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-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.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 
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 eb7c476..8af8ea8 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,8 +21,8 @@ package org.apache.isis.extensions.secman.api.permission;
 import java.util.Collection;
 import java.util.Optional;
 
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 
 /**
@@ -62,11 +62,17 @@ public interface ApplicationPermissionRepository<P extends ApplicationPermission
             String memberName);
 
     P newPermission(
-            ApplicationRole holder,
+            ApplicationRole role,
             ApplicationPermissionRule rule,
             ApplicationPermissionMode mode,
             ApplicationFeatureType featureType,
             String featureFqn);
 
-
+    P newPermission(
+            ApplicationRole role,
+            ApplicationPermissionRule rule,
+            ApplicationPermissionMode mode,
+            ApplicationFeatureId featureId);
+    
+    
 }
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java
index fbd3766..6bd68ab 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValue.java
@@ -23,9 +23,9 @@ import java.util.Comparator;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 
 /**
  * A serializable value object representing an (anonymized)
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
index 5c53ecc..fadcaa1 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
@@ -24,10 +24,10 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 
 /**
  * A serializable value object representing a set of (anonymized)
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationService.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationService.java
index dfef149..25cc3da 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationService.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationService.java
@@ -21,7 +21,7 @@ package org.apache.isis.extensions.secman.api.permission;
 import java.io.Serializable;
 import java.util.Collection;
 
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 /**
  * Strategy for determining which permission should apply when there are multiple that apply for a particular target
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceAbstract.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceAbstract.java
index 3c041ac..ed76f82 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceAbstract.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceAbstract.java
@@ -20,8 +20,8 @@ package org.apache.isis.extensions.secman.api.permission;
 
 import java.util.Collection;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 
 /**
  * @since 2.0 {@index}
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 1fa9dd0..7a17ceb 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
@@ -37,11 +37,8 @@ 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 AddPermissionDomainEvent extends ActionDomainEvent {}
     public static class RemovePermissionDomainEvent extends ActionDomainEvent {}
 
     public static class DeleteDomainEvent extends ActionDomainEvent {}
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClass.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClass.java
index 3025871..6758fd1 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClass.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClass.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationClass"
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassAction.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassAction.java
index 4e0786c..8240238 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassAction.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassAction.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationClassAction"
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassCollection.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassCollection.java
index eddfe64..c1a1cad 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassCollection.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassCollection.java
@@ -22,7 +22,7 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationClassCollection"
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassMember.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassMember.java
index 12294b9..3b3ad36 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassMember.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassMember.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationClassMember"
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassProperty.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassProperty.java
index e59a407..e4c5bf9 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassProperty.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationClassProperty.java
@@ -23,7 +23,7 @@ import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationClassProperty"
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
index 463f638..f7991c5 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationFeatureViewModel.java
@@ -33,6 +33,8 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.util.Equality;
 import org.apache.isis.applib.util.Hashing;
@@ -41,9 +43,7 @@ import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
index 7ca2deb..88a6cdd 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPackage.java
@@ -26,8 +26,8 @@ import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationPackage"
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPermission_feature.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPermission_feature.java
index 72aae4e..21ae587 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPermission_feature.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/feature/ApplicationPermission_feature.java
@@ -24,9 +24,9 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
index 6e07945..b8b1c7b 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_filterPermissions.java
@@ -31,10 +31,10 @@ import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
 
@@ -52,7 +52,7 @@ public class ApplicationUser_filterPermissions {
     @Inject private FactoryService factory;
     @Inject private ApplicationFeatureRepositoryDefault applicationFeatureRepository;
 
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public List<UserPermissionViewModel> act(
@@ -103,7 +103,7 @@ public class ApplicationUser_filterPermissions {
     List<UserPermissionViewModel> asViewModels(final Collection<ApplicationFeature> features) {
         return _Lists.map(
                 features,
-                UserPermissionViewModel.Functions.asViewModel(holder, factory));
+                UserPermissionViewModel.Functions.asViewModel(target, factory));
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_permissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_permissions.java
index 64c4455..f357af5 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_permissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/ApplicationUser_permissions.java
@@ -51,7 +51,7 @@ public class ApplicationUser_permissions {
     @Inject private FactoryService factory;
     @Inject private ApplicationFeatureRepositoryDefault applicationFeatureRepository;
 
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public List<UserPermissionViewModel> coll() {
@@ -62,7 +62,7 @@ public class ApplicationUser_permissions {
     List<UserPermissionViewModel> asViewModels(final java.util.Collection<ApplicationFeature> features) {
         return _Lists.map(
                 features,
-                UserPermissionViewModel.Functions.asViewModel(holder, factory));
+                UserPermissionViewModel.Functions.asViewModel(target, factory));
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
index 89c4472..38296f8 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/app/user/UserPermissionViewModel.java
@@ -37,15 +37,15 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ToString;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager.java
index f3ab4a7..7af6069 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager.java
@@ -22,7 +22,6 @@ import java.util.Collection;
 
 import javax.inject.Inject;
 
-import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
@@ -45,9 +44,9 @@ public class ApplicationOrphanedPermissionManager {
         return applicationPermissionRepository.findOrphaned();
     }
     
-    @Action
-    public Collection<? extends ApplicationPermission> debugOrphanedPermissions() {
-        return applicationPermissionRepository.findOrphaned();
-    }
+//    @Action
+//    public Collection<? extends ApplicationPermission> debugOrphanedPermissions() {
+//        return applicationPermissionRepository.findOrphaned();
+//    }
     
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager_relocateSelected.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager_relocateSelected.java
index 76dc2a5..b168e67 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager_relocateSelected.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationOrphanedPermissionManager_relocateSelected.java
@@ -26,7 +26,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission.RelocateNamespaceDomainEvent;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_allow.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_allow.java
index 05f7213..c3fb67b 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_allow.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_allow.java
@@ -29,16 +29,16 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationPermission_allow {
 
-    private final ApplicationPermission holder;
+    private final ApplicationPermission target;
 
     //@MemberOrder(name = "Rule", sequence = "1")
     public ApplicationPermission act() {
-        holder.setRule(ApplicationPermissionRule.ALLOW);
-        return holder;
+        target.setRule(ApplicationPermissionRule.ALLOW);
+        return target;
     }
 
     public String disableAct() {
-        return holder.getRule() == ApplicationPermissionRule.ALLOW? "Rule is already set to ALLOW": null;
+        return target.getRule() == ApplicationPermissionRule.ALLOW? "Rule is already set to ALLOW": null;
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_changing.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_changing.java
index f4c2f3c..621ee0f 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_changing.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_changing.java
@@ -29,16 +29,16 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationPermission_changing {
 
-    private final ApplicationPermission holder;
+    private final ApplicationPermission target;
 
     //@MemberOrder(name = "Mode", sequence = "2")
     public ApplicationPermission act() {
-        holder.setMode(ApplicationPermissionMode.CHANGING);
-        return holder;
+        target.setMode(ApplicationPermissionMode.CHANGING);
+        return target;
     }
     
     public String disableAct() {
-        return holder.getMode() == ApplicationPermissionMode.CHANGING ? "Mode is already set to CHANGING": null;
+        return target.getMode() == ApplicationPermissionMode.CHANGING ? "Mode is already set to CHANGING": null;
     }
     
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_delete.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_delete.java
index 0f7194c..8ffda8a 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_delete.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_delete.java
@@ -30,17 +30,19 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@Action(domainEvent = DeleteDomainEvent.class, semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE)
+@Action(
+        domainEvent = DeleteDomainEvent.class, 
+        semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE)
 @RequiredArgsConstructor
 public class ApplicationPermission_delete {
     
     @Inject private RepositoryService repository;
 
-    private final ApplicationPermission holder;
+    private final ApplicationPermission target;
 
     public ApplicationRole act() {
-        val owningRole = holder.getRole();
-        repository.remove(holder);
+        val owningRole = target.getRole();
+        repository.remove(target);
         return owningRole;
     }
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_updateRole.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_updateRole.java
index da3c3e1..9e3d4f0 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_updateRole.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_updateRole.java
@@ -31,23 +31,25 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRoleRepository;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = UpdateRoleDomainEvent.class, associateWith = "role")
+@Action(
+        domainEvent = UpdateRoleDomainEvent.class, 
+        associateWith = "role")
 @RequiredArgsConstructor
 public class ApplicationPermission_updateRole {
 
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     
-    private final ApplicationPermission holder;
+    private final ApplicationPermission target;
     
     @Model
     public ApplicationPermission act(final ApplicationRole applicationRole) {
-        holder.setRole(applicationRole);
-        return holder;
+        target.setRole(applicationRole);
+        return target;
     }
 
     @Model
     public ApplicationRole default0Act() {
-        return holder.getRole();
+        return target.getRole();
     }
 
     @Model
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_veto.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_veto.java
index 0d5ee2e..1e97cb9 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_veto.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_veto.java
@@ -25,19 +25,21 @@ import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRul
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = VetoDomainEvent.class, associateWith = "rule")
+@Action(
+        domainEvent = VetoDomainEvent.class, 
+        associateWith = "rule")
 @RequiredArgsConstructor
 public class ApplicationPermission_veto {
 
-    private final ApplicationPermission holder;
+    private final ApplicationPermission target;
 
     //@MemberOrder(name = "Rule", sequence = "1")
     public ApplicationPermission act() {
-        holder.setRule(ApplicationPermissionRule.VETO);
-        return holder;
+        target.setRule(ApplicationPermissionRule.VETO);
+        return target;
     }
     public String disableAct() {
-        return holder.getRule() == ApplicationPermissionRule.VETO? "Rule is already set to VETO": null;
+        return target.getRule() == ApplicationPermissionRule.VETO? "Rule is already set to VETO": null;
     }
     
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_viewing.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_viewing.java
index 98e96e3..f3af1e5 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_viewing.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/permission/ApplicationPermission_viewing.java
@@ -25,20 +25,22 @@ import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMod
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = ViewingDomainEvent.class, associateWith = "mode")
+@Action(
+        domainEvent = ViewingDomainEvent.class, 
+        associateWith = "mode")
 @RequiredArgsConstructor
 public class ApplicationPermission_viewing {
 
-    private final ApplicationPermission holder;
+    private final ApplicationPermission target;
     
     //@MemberOrder(name = "Mode", sequence = "1")
     public ApplicationPermission act() {
-        holder.setMode(ApplicationPermissionMode.VIEWING);
-        return holder;
+        target.setMode(ApplicationPermissionMode.VIEWING);
+        return target;
     }
     
     public String disableAct() {
-        return holder.getMode() == ApplicationPermissionMode.VIEWING ? "Mode is already set to VIEWING": null;
+        return target.getMode() == ApplicationPermissionMode.VIEWING ? "Mode is already set to VIEWING": null;
     }
     
 
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
index ef977c7..c084589 100644
--- 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
@@ -25,19 +25,21 @@ 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.ApplicationFeatureType;
 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.ApplicationPermission;
 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 org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = AddActionDomainEvent.class, associateWith = "permissions")
+@Action(
+        domainEvent = AddPermissionDomainEvent.class, 
+        associateWith = "permissions")
 @RequiredArgsConstructor
 public class ApplicationRole_addAction {
     
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
index db47ff7..aa3a2a9 100644
--- 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
@@ -24,18 +24,20 @@ 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.ApplicationFeatureType;
 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.ApplicationPermission;
 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 org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = AddClassDomainEvent.class, associateWith = "permissions")
+@Action(
+        domainEvent = AddPermissionDomainEvent.class, 
+        associateWith = "permissions")
 @RequiredArgsConstructor
 public class ApplicationRole_addClass {
     
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
index c64442b..d83db09 100644
--- 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
@@ -27,19 +27,21 @@ 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.ApplicationFeatureType;
 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.ApplicationPermission;
 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 org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = AddCollectionDomainEvent.class, associateWith = "permissions")
+@Action(
+        domainEvent = AddPermissionDomainEvent.class, 
+        associateWith = "permissions")
 @RequiredArgsConstructor
 public class ApplicationRole_addCollection {
     
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
index 29c360d..4b2994c 100644
--- 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
@@ -25,18 +25,20 @@ 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.ApplicationFeatureType;
 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.ApplicationPermission;
 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 org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = AddPackageDomainEvent.class, associateWith = "permissions")
+@Action(
+        domainEvent = AddPermissionDomainEvent.class, 
+        associateWith = "permissions")
 @RequiredArgsConstructor
 public class ApplicationRole_addPackage {
     
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_addPermission.java
similarity index 52%
copy from extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
copy to extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
index ef977c7..d5293ee 100644
--- 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_addPermission.java
@@ -18,87 +18,108 @@
  */
 package org.apache.isis.extensions.secman.model.dom.role;
 
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
 import javax.enterprise.inject.Model;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.MinLength;
+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.PromptStyle;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 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.ApplicationPermission;
 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 org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
+import lombok.Value;
+import lombok.val;
+import lombok.experimental.Accessors;
 
-@Action(domainEvent = AddActionDomainEvent.class, associateWith = "permissions")
+//TODO[2560] wip
+//@Action(
+//        domainEvent = AddPermissionDomainEvent.class, 
+//        associateWith = "permissions")
+//@ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL)
 @RequiredArgsConstructor
-public class ApplicationRole_addAction {
+public class ApplicationRole_addPermission {
     
     @Inject private ApplicationFeatureRepository applicationFeatureRepository;
     @Inject private ApplicationPermissionRepository<? extends ApplicationPermission> applicationPermissionRepository;
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
+    
+    @Value @Accessors(fluent = true)           
+    public static class Parameters {
+        ApplicationPermissionRule rule; // ALLOW/VETO
+        ApplicationPermissionMode mode; // r/w
+        String feature;
+    }
 
     /**
      * Adds a {@link ApplicationPermission permission} for this role to a
-     * {@link ApplicationMemberType#ACTION action}
-     * {@link ApplicationFeatureType#MEMBER member}
      * {@link ApplicationFeature feature}.
      */
     @MemberOrder(sequence = "3")
     public ApplicationRole act(
+            
+            @Parameter(optionality = Optionality.MANDATORY)
             @ParameterLayout(named="Rule")
             final ApplicationPermissionRule rule,
+            
+            @Parameter(optionality = Optionality.MANDATORY)
             @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) {
+            
+            @Parameter(optionality = Optionality.MANDATORY)
+            @ParameterLayout(named="Feature")
+            final String featureName) {
+        
+        val featureId = ApplicationFeatureId.parse(featureName);
         
-        applicationPermissionRepository.newPermission(holder, rule, mode, packageFqn, className, memberName);
-        return holder;
+        applicationPermissionRepository.newPermission(target, rule, mode, featureId);
+        return target;
     }
 
     @Model
-    public ApplicationPermissionRule default0Act() {
+    public ApplicationPermissionRule defaultRule(Parameters params) {
         return ApplicationPermissionRule.ALLOW;
     }
 
     @Model
-    public ApplicationPermissionMode default1Act() {
+    public ApplicationPermissionMode defaultMode(Parameters params) {
         return ApplicationPermissionMode.CHANGING;
     }
 
     @Model
-    public java.util.Collection<String> choices2Act() {
-        return applicationFeatureRepository.packageNamesContainingClasses(ApplicationMemberType.ACTION);
+    public java.util.Collection<String> autoComplete2Act(             
+            @MinLength(3) String search) {
+        
+        val idsByName = applicationFeatureRepository.getFeatureIdentifiersByName();
+        
+        return idsByName.entrySet().stream()
+        .filter(entry->matches(entry.getKey(), entry.getValue(), search))
+        .map(Map.Entry::getValue)
+        .map(ApplicationFeatureId::asString)
+        .collect(Collectors.toCollection(TreeSet::new));
     }
 
-    @Model
-    public java.util.Collection<String> choices3Act(
-            final ApplicationPermissionRule rule,
-            final ApplicationPermissionMode mode,
-            final String packageFqn) {
-        return applicationFeatureRepository.classNamesContainedIn(packageFqn, ApplicationMemberType.ACTION);
+    private boolean matches(String featureName, ApplicationFeatureId featureId, String search) {
+        //TODO yet not very smart
+        return featureName.contains(search);
     }
 
-    @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_addProperty.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
index 131cbbb..7da2f1e 100644
--- 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
@@ -27,19 +27,21 @@ 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.ApplicationFeatureType;
 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.ApplicationPermission;
 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 org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = AddPropertyDomainEvent.class, associateWith = "permissions")
+@Action(
+        domainEvent = AddPermissionDomainEvent.class, 
+        associateWith = "permissions")
 @RequiredArgsConstructor
 public class ApplicationRole_addProperty {
     
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addUser.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addUser.java
index 4eebbf3..2301c4e 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addUser.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addUser.java
@@ -46,19 +46,19 @@ public class ApplicationRole_addUser {
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
 
     @Model
     public ApplicationRole act(final ApplicationUser applicationUser) {
-        applicationRoleRepository.addRoleToUser(holder, applicationUser);
-        return holder;
+        applicationRoleRepository.addRoleToUser(target, applicationUser);
+        return target;
     }
 
     @Model
     public List<? extends ApplicationUser> autoComplete0Act(final String search) {
         final Collection<? extends ApplicationUser> matchingSearch = applicationUserRepository.find(search);
         final List<? extends ApplicationUser> list = _Lists.newArrayList(matchingSearch);
-        list.removeAll(applicationUserRepository.findByRole(holder));
+        list.removeAll(applicationUserRepository.findByRole(target));
         return list;
     }
 }
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
index e5a27b2..a0093b8 100644
--- 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
@@ -24,10 +24,10 @@ import javax.enterprise.inject.Model;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.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.SecmanConfiguration;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository;
@@ -51,7 +51,7 @@ public class ApplicationRole_removePermission {
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     @Inject private ApplicationPermissionRepository<? extends ApplicationPermission> applicationPermissionRepository;
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
 
     @Model
     public ApplicationRole act(
@@ -63,12 +63,12 @@ public class ApplicationRole_removePermission {
             final String featureFqn) {
         
         final ApplicationPermission permission = applicationPermissionRepository
-                .findByRoleAndRuleAndFeature(holder, rule, type, featureFqn)
+                .findByRoleAndRuleAndFeature(target, rule, type, featureFqn)
                 .orElse(null);
         if(permission != null) {
             repository.remove(permission);
         }
-        return holder;
+        return target;
     }
 
     @Model
@@ -79,7 +79,7 @@ public class ApplicationRole_removePermission {
             final ApplicationFeatureType type,
             @ParameterLayout(named="Feature", typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
             final String featureFqn) {
-        if(applicationRoleRepository.isAdminRole(holder) 
+        if(applicationRoleRepository.isAdminRole(target) 
                 && configBean.isStickyAdminNamespace(featureFqn)) {
             return "Cannot remove top-level namespace permissions for the admin role.";
         }
@@ -102,7 +102,7 @@ public class ApplicationRole_removePermission {
             final ApplicationFeatureType type) {
         
         final Collection<? extends ApplicationPermission> permissions = applicationPermissionRepository
-                .findByRoleAndRuleAndFeatureTypeCached(holder, rule, type);
+                .findByRoleAndRuleAndFeatureTypeCached(target, 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_removePermissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermissions.java
index 82d3da1..9188f36 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removePermissions.java
@@ -51,7 +51,7 @@ public class ApplicationRole_removePermissions {
     @Inject private RepositoryService repository;
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
 
     @Model
     public ApplicationRole act(Collection<ApplicationPermission> permissions) {
@@ -60,14 +60,14 @@ public class ApplicationRole_removePermissions {
         .filter(this::canRemove)
         .forEach(repository::remove);
         
-        return holder;
+        return target;
     }
 
     private boolean canRemove(ApplicationPermission permission) {
-        if(!Objects.equals(permission.getRole(), holder)) {
+        if(!Objects.equals(permission.getRole(), target)) {
             return false;
         }
-        if(applicationRoleRepository.isAdminRole(holder) 
+        if(applicationRoleRepository.isAdminRole(target) 
                 && configBean.isStickyAdminNamespace(permission.getFeatureFqn())) {
             
             messageService.warnUser("Cannot remove top-level namespace permissions for the admin role.");
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUser.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUser.java
index 4720c3c..9d8f9c7 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUser.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUser.java
@@ -42,23 +42,23 @@ public class ApplicationRole_removeUser {
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
 
     @Model
     public ApplicationRole act(final ApplicationUser applicationUser) {
-        applicationRoleRepository.removeRoleFromUser(holder, applicationUser);
-        return holder;
+        applicationRoleRepository.removeRoleFromUser(target, applicationUser);
+        return target;
     }
 
     @Model
     public Collection<? extends ApplicationUser> choices0Act() {
-        return applicationUserRepository.findByRole(holder);
+        return applicationUserRepository.findByRole(target);
     }
 
     @Model
     public String validateAct(final ApplicationUser applicationUser) {
         if(applicationUserRepository.isAdminUser(applicationUser) 
-                && applicationRoleRepository.isAdminRole(holder)) {
+                && applicationRoleRepository.isAdminRole(target)) {
             return "Cannot remove admin user from the admin role.";
         }
         return null;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUsers.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUsers.java
index 90e991c..4d0773b 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUsers.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_removeUsers.java
@@ -47,21 +47,21 @@ public class ApplicationRole_removeUsers {
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
 
     @Model
     public ApplicationRole act(Collection<ApplicationUser> users) {
         
         _NullSafe.stream(users)
         .filter(this::canRemove)
-        .forEach(user->applicationRoleRepository.removeRoleFromUser(holder, user));
+        .forEach(user->applicationRoleRepository.removeRoleFromUser(target, user));
 
-        return holder;
+        return target;
     }
     
     public boolean canRemove(ApplicationUser applicationUser) {
         if(applicationUserRepository.isAdminUser(applicationUser) 
-                && applicationRoleRepository.isAdminRole(holder)) {
+                && applicationRoleRepository.isAdminRole(target)) {
             messageService.warnUser("Cannot remove admin user from the admin role.");
             return false;
         }
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
index d748d1c..4b8fdd6 100644
--- 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
@@ -31,11 +31,13 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.UpdateDescript
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = UpdateDescriptionDomainEvent.class, associateWith = "description")
+@Action(
+        domainEvent = UpdateDescriptionDomainEvent.class, 
+        associateWith = "description")
 @RequiredArgsConstructor
 public class ApplicationRole_updateDescription {
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
     
     @MemberOrder(sequence = "1")
     public ApplicationRole act(
@@ -48,13 +50,13 @@ public class ApplicationRole_updateDescription {
                     typicalLength=ApplicationRole.TYPICAL_LENGTH_DESCRIPTION)
             final String description) {
         
-        holder.setDescription(description);
-        return holder;
+        target.setDescription(description);
+        return target;
     }
 
     @Model
     public String default0Act() {
-        return holder.getDescription();
+        return target.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
index a8e7614..3d72bc6 100644
--- 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
@@ -27,11 +27,13 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.UpdateNameDoma
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = UpdateNameDomainEvent.class, associateWith = "name")
+@Action(
+        domainEvent = UpdateNameDomainEvent.class, 
+        associateWith = "name")
 @RequiredArgsConstructor
 public class ApplicationRole_updateName {
     
-    private final ApplicationRole holder;
+    private final ApplicationRole target;
     
     @MemberOrder(sequence = "1")
     public ApplicationRole updateName(
@@ -39,12 +41,12 @@ public class ApplicationRole_updateName {
             @ParameterLayout(named="Name", typicalLength = ApplicationRole.TYPICAL_LENGTH_NAME)
             final String name) {
         
-        holder.setName(name);
-        return holder;
+        target.setName(name);
+        return target;
     }
 
     public String default0UpdateName() {
-        return holder.getName();
+        return target.getName();
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addChild.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addChild.java
index 728e120..b4359b9 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addChild.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addChild.java
@@ -37,11 +37,11 @@ public class ApplicationTenancy_addChild {
     
     @Inject private ApplicationTenancyRepository<? extends ApplicationTenancy> applicationTenancyRepository;
     
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     @Model
     public ApplicationTenancy act(final ApplicationTenancy child) {
-        applicationTenancyRepository.setParentOnTenancy(child, holder);
-        return holder;
+        applicationTenancyRepository.setParentOnTenancy(child, target);
+        return target;
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addUser.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addUser.java
index c0c814d..4e8bf7d 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addUser.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_addUser.java
@@ -46,19 +46,19 @@ public class ApplicationTenancy_addUser {
     @Inject private ApplicationTenancyRepository<? extends ApplicationTenancy> applicationTenancyRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     @Model
     public ApplicationTenancy act(final ApplicationUser applicationUser) {
-        applicationTenancyRepository.setTenancyOnUser(holder, applicationUser);
-        return holder;
+        applicationTenancyRepository.setTenancyOnUser(target, applicationUser);
+        return target;
     }
 
     @Model
     public List<? extends ApplicationUser> autoComplete0Act(final String search) {
         final Collection<? extends ApplicationUser> matchingSearch = applicationUserRepository.find(search);
         final List<? extends ApplicationUser> list = _Lists.newArrayList(matchingSearch);
-        list.removeAll(applicationUserRepository.findByTenancy(holder));
+        list.removeAll(applicationUserRepository.findByTenancy(target));
         return list;
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_delete.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_delete.java
index 9d6edaf..43d7174 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_delete.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_delete.java
@@ -49,12 +49,12 @@ public class ApplicationTenancy_delete {
     @Inject private FactoryService factoryService;
     @Inject private RepositoryService repository;
 
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     
     @Model
     public Collection<? extends ApplicationTenancy> act() {
-        for (val user : applicationUserRepository.findByTenancy(holder)) {
+        for (val user : applicationUserRepository.findByTenancy(target)) {
             val updateAtPathMixin = factoryService.mixin(ApplicationUser_updateAtPath.class, user);
             updateAtPathMixin.act(null);
         }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeChild.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeChild.java
index 02bfc24..0c75ec2 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeChild.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeChild.java
@@ -30,24 +30,26 @@ import org.apache.isis.extensions.secman.api.tenancy.ApplicationTenancyRepositor
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = RemoveChildDomainEvent.class, associateWith = "children", 
-associateWithSequence = "2")
+@Action(
+        domainEvent = RemoveChildDomainEvent.class, 
+        associateWith = "children", 
+        associateWithSequence = "2")
 @RequiredArgsConstructor
 public class ApplicationTenancy_removeChild {
     
     @Inject private ApplicationTenancyRepository<? extends ApplicationTenancy> applicationTenancyRepository;
 
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     @Model
     public ApplicationTenancy act(final ApplicationTenancy child) {
         applicationTenancyRepository.clearParentOnTenancy(child);
-        return holder;
+        return target;
     }
     
     @Model
     public Collection<? extends ApplicationTenancy> choices0Act() {
-        return applicationTenancyRepository.getChildren(holder);
+        return applicationTenancyRepository.getChildren(target);
     }
     
     @Model
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeUser.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeUser.java
index 5707cae..f19cd38 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeUser.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_removeUser.java
@@ -33,8 +33,10 @@ import org.apache.isis.extensions.secman.api.user.ApplicationUserRepository;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = RemoveUserDomainEvent.class, associateWith = "users", 
-associateWithSequence = "2")
+@Action(
+        domainEvent = RemoveUserDomainEvent.class, 
+        associateWith = "users", 
+        associateWithSequence = "2")
 @ActionLayout(named="Remove")
 @RequiredArgsConstructor
 public class ApplicationTenancy_removeUser {
@@ -42,17 +44,17 @@ public class ApplicationTenancy_removeUser {
     @Inject private ApplicationTenancyRepository<? extends ApplicationTenancy> applicationTenancyRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
     
     @Model
     public ApplicationTenancy act(final ApplicationUser applicationUser) {
         applicationTenancyRepository.clearTenancyOnUser(applicationUser);
-        return holder;
+        return target;
     }
     
     @Model
     public Collection<? extends ApplicationUser> choices0Act() {
-        return applicationUserRepository.findByTenancy(holder);
+        return applicationUserRepository.findByTenancy(target);
     }
     
     @Model
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateName.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateName.java
index 15338e6..da1755c 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateName.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateName.java
@@ -28,24 +28,26 @@ import org.apache.isis.extensions.secman.api.tenancy.ApplicationTenancy.UpdateNa
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = UpdateNameDomainEvent.class, associateWith = "name", 
-associateWithSequence = "1")
+@Action(
+        domainEvent = UpdateNameDomainEvent.class, 
+        associateWith = "name",
+        associateWithSequence = "1")
 @RequiredArgsConstructor
 public class ApplicationTenancy_updateName {
     
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     @Model
     public ApplicationTenancy act(
             @Parameter(maxLength = ApplicationTenancy.MAX_LENGTH_NAME)
             @ParameterLayout(named="Name", typicalLength=ApplicationTenancy.TYPICAL_LENGTH_NAME)
             final String name) {
-        holder.setName(name);
-        return holder;
+        target.setName(name);
+        return target;
     }
 
     @Model
     public String default0Act() {
-        return holder.getName();
+        return target.getName();
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateParent.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateParent.java
index 011e800..0e17732 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateParent.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_updateParent.java
@@ -39,19 +39,19 @@ public class ApplicationTenancy_updateParent {
     
     @Inject private ApplicationTenancyRepository<? extends ApplicationTenancy> applicationTenancyRepository;
     
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     @Model
     public ApplicationTenancy act(
             @Parameter(optionality = Optionality.OPTIONAL)
             final ApplicationTenancy parent) {
         
-        applicationTenancyRepository.setParentOnTenancy(holder, parent);
-        return holder;
+        applicationTenancyRepository.setParentOnTenancy(target, parent);
+        return target;
     }
 
     @Model
     public ApplicationTenancy default0Act() {
-        return holder.getParent();
+        return target.getParent();
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_users.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_users.java
index e49ef74..f6ee381 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_users.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/tenancy/ApplicationTenancy_users.java
@@ -39,14 +39,14 @@ public class ApplicationTenancy_users {
     
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationTenancy holder;
+    private final ApplicationTenancy target;
 
     // -- users (collection)
 
     public static class UsersDomainEvent extends CollectionDomainEvent<ApplicationUser> {}
 
     public java.util.Collection<? extends ApplicationUser> coll() {
-        return applicationUserRepository.findByAtPath(holder.getPath());
+        return applicationUserRepository.findByAtPath(target.getPath());
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newDelegateUser.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newDelegateUser.java
index 2ca0d25..604311d 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newDelegateUser.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newDelegateUser.java
@@ -32,7 +32,9 @@ import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = NewDelegateUserDomainEvent.class, associateWith = "allUsers")
+@Action(
+        domainEvent = NewDelegateUserDomainEvent.class, 
+        associateWith = "allUsers")
 @RequiredArgsConstructor
 public class ApplicationUserManager_newDelegateUser {
     
@@ -41,7 +43,7 @@ public class ApplicationUserManager_newDelegateUser {
     @Inject private RepositoryService repository;
 
     @SuppressWarnings("unused")
-    private final ApplicationUserManager holder;
+    private final ApplicationUserManager target;
     
     @Model
     public ApplicationUser act(
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newLocalUser.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newLocalUser.java
index 995ce0a..de986c7 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newLocalUser.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUserManager_newLocalUser.java
@@ -36,7 +36,9 @@ import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
 
 import lombok.RequiredArgsConstructor;
 
-@Action(domainEvent = NewLocalUserDomainEvent.class, associateWith = "allUsers")
+@Action(
+        domainEvent = NewLocalUserDomainEvent.class, 
+        associateWith = "allUsers")
 @RequiredArgsConstructor
 public class ApplicationUserManager_newLocalUser {
     
@@ -46,7 +48,7 @@ public class ApplicationUserManager_newLocalUser {
     @Inject private RepositoryService repository;
     
     @SuppressWarnings("unused")
-    private final ApplicationUserManager holder;
+    private final ApplicationUserManager target;
 
     @Model
     public ApplicationUser act(
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_addRole.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_addRole.java
index cc50625..fbd9217 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_addRole.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_addRole.java
@@ -34,25 +34,27 @@ import org.apache.isis.extensions.secman.api.user.ApplicationUser.AddRoleDomainE
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
-@Action(domainEvent = AddRoleDomainEvent.class, associateWith = "roles")
+@Action(
+        domainEvent = AddRoleDomainEvent.class, 
+        associateWith = "roles")
 @ActionLayout(named="Add")
 @RequiredArgsConstructor
 public class ApplicationUser_addRole {
     
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @MemberOrder(sequence = "1")
     public ApplicationUser act(final ApplicationRole role) {
-        applicationRoleRepository.addRoleToUser(role, holder);
-        return holder;
+        applicationRoleRepository.addRoleToUser(role, target);
+        return target;
     }
 
     public Collection<? extends ApplicationRole> choices0Act() {
         val allRoles = applicationRoleRepository.allRoles();
         val applicationRoles = _Sets.newTreeSet(allRoles);
-        applicationRoles.removeAll(holder.getRoles());
+        applicationRoles.removeAll(target.getRoles());
         return applicationRoles;
     }
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_delete.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_delete.java
index b9d10a9..56ca931 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_delete.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_delete.java
@@ -42,16 +42,16 @@ public class ApplicationUser_delete {
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     @Inject private RepositoryService repository;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public Collection<? extends ApplicationUser> act() {
-        repository.removeAndFlush(holder);
+        repository.removeAndFlush(target);
         return applicationUserRepository.allUsers();
     }
 
     @Model
     public String disableAct() {
-        return applicationUserRepository.isAdminUser(holder)? "Cannot delete the admin user": null;
+        return applicationUserRepository.isAdminUser(target)? "Cannot delete the admin user": null;
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_duplicate.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_duplicate.java
index a84659b..841c6f5 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_duplicate.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_duplicate.java
@@ -42,7 +42,7 @@ public class ApplicationUser_duplicate {
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
 
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
@@ -52,12 +52,12 @@ public class ApplicationUser_duplicate {
             final String emailAddress) {
         
         return applicationUserRepository
-                .newUser(username, holder.getAccountType(), user->{
+                .newUser(username, target.getAccountType(), user->{
         
                     user.setStatus(ApplicationUserStatus.DISABLED);
                     user.setEmailAddress(emailAddress);
         
-                    for (ApplicationRole role : holder.getRoles()) {
+                    for (ApplicationRole role : target.getRoles()) {
                         applicationRoleRepository.addRoleToUser(role, user);
                     }
                     
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_lock.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_lock.java
index 55cd9df..2dcca68 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_lock.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_lock.java
@@ -42,19 +42,19 @@ public class ApplicationUser_lock {
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     @Inject private SecmanConfiguration configBean;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act() {
-        holder.setStatus(ApplicationUserStatus.DISABLED);
-        return holder;
+        target.setStatus(ApplicationUserStatus.DISABLED);
+        return target;
     }
     
     @Model
     public String disableAct() {
-        if(applicationUserRepository.isAdminUser(holder)) {
+        if(applicationUserRepository.isAdminUser(target)) {
             return "Cannot disable the '" + configBean.getAdminUserName() + "' user.";
         }
-        return holder.getStatus() == ApplicationUserStatus.DISABLED ? "Status is already set to DISABLE": null;
+        return target.getStatus() == ApplicationUserStatus.DISABLED ? "Status is already set to DISABLE": null;
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRole.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRole.java
index ee2d78c..a56745d 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRole.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRole.java
@@ -44,29 +44,29 @@ public class ApplicationUser_removeRole {
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(final ApplicationRole role) {
-        applicationRoleRepository.removeRoleFromUser(role, holder);
-        return holder;
+        applicationRoleRepository.removeRoleFromUser(role, target);
+        return target;
     }
 
     @Model
     public String disableAct() {
-        return holder.getRoles().isEmpty()? "No roles to remove": null;
+        return target.getRoles().isEmpty()? "No roles to remove": null;
     }
 
     @Model
     public Collection<? extends ApplicationRole> choices0Act() {
-        return applicationRoleRepository.getRoles(holder);
+        return applicationRoleRepository.getRoles(target);
     }
 
     @Model
     // duplicated in ApplicationRole_removeUser mixin
     public String validateAct(
             final ApplicationRole applicationRole) {
-        if(applicationUserRepository.isAdminUser(holder) 
+        if(applicationUserRepository.isAdminUser(target) 
                 && applicationRoleRepository.isAdminRole(applicationRole)) {
             return "Cannot remove admin user from the admin role.";
         }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRoles.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRoles.java
index 139ae9c..fb67117 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRoles.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_removeRoles.java
@@ -49,7 +49,7 @@ public class ApplicationUser_removeRoles {
     @Inject private ApplicationRoleRepository<? extends ApplicationRole> applicationRoleRepository;
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     
     @Model
@@ -57,9 +57,9 @@ public class ApplicationUser_removeRoles {
         
         _NullSafe.stream(roles)
         .filter(this::canRemove)
-        .forEach(role->applicationRoleRepository.removeRoleFromUser(role, holder));
+        .forEach(role->applicationRoleRepository.removeRoleFromUser(role, target));
         
-        return holder;
+        return target;
     }
 
     @Model
@@ -67,7 +67,7 @@ public class ApplicationUser_removeRoles {
     public boolean canRemove(
             final ApplicationRole applicationRole) {
         
-        if(applicationUserRepository.isAdminUser(holder) 
+        if(applicationUserRepository.isAdminUser(target) 
                 && applicationRoleRepository.isAdminRole(applicationRole)) {
             messageService.warnUser("Cannot remove admin user from the admin role.");
             return false;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_resetPassword.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_resetPassword.java
index 245d37d..588afa3 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_resetPassword.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_resetPassword.java
@@ -41,7 +41,7 @@ public class ApplicationUser_resetPassword {
     
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
@@ -50,13 +50,13 @@ public class ApplicationUser_resetPassword {
             @ParameterLayout(named="Repeat password")
             final Password newPasswordRepeat) {
         
-        applicationUserRepository.updatePassword(holder, newPassword.getPassword());
-        return holder;
+        applicationUserRepository.updatePassword(target, newPassword.getPassword());
+        return target;
     }
 
     @Model
     public boolean hideAct() {
-        return !applicationUserRepository.isPasswordFeatureEnabled(holder);
+        return !applicationUserRepository.isPasswordFeatureEnabled(target);
     }
 
     @Model
@@ -64,7 +64,7 @@ public class ApplicationUser_resetPassword {
             final Password newPassword,
             final Password newPasswordRepeat) {
         
-        if(!applicationUserRepository.isPasswordFeatureEnabled(holder)) {
+        if(!applicationUserRepository.isPasswordFeatureEnabled(target)) {
             return "Password feature is not available for this User";
         }
         
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_unlock.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_unlock.java
index 6225ad3..8763975 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_unlock.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_unlock.java
@@ -36,16 +36,16 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationUser_unlock {
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act() {
-        holder.setStatus(ApplicationUserStatus.ENABLED);
-        return holder;
+        target.setStatus(ApplicationUserStatus.ENABLED);
+        return target;
     }
     
     @Model
     public String disableAct() {
-        return holder.getStatus() == ApplicationUserStatus.ENABLED ? "Status is already set to ENABLE": null;
+        return target.getStatus() == ApplicationUserStatus.ENABLED ? "Status is already set to ENABLE": null;
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAccountType.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAccountType.java
index 8df97ad..bd4af6a 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAccountType.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAccountType.java
@@ -38,25 +38,25 @@ public class ApplicationUser_updateAccountType {
     
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
             final AccountType accountType) {
-        holder.setAccountType(accountType);
-        return holder;
+        target.setAccountType(accountType);
+        return target;
     }
     
     @Model
     public String disableUpdateAccountType() {
-        return applicationUserRepository.isAdminUser(holder)
+        return applicationUserRepository.isAdminUser(target)
                 ? "Cannot change account type for admin user"
                         : null;
     }
     
     @Model
     public AccountType default0UpdateAccountType() {
-        return holder.getAccountType();
+        return target.getAccountType();
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAtPath.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAtPath.java
index 803d604..74549b0 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAtPath.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateAtPath.java
@@ -36,20 +36,20 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationUser_updateAtPath {
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
             @Parameter(optionality = Optionality.OPTIONAL)
             @ParameterLayout(named = "AtPath")
             final String atPath) {
-        holder.setAtPath(atPath);
-        return holder;
+        target.setAtPath(atPath);
+        return target;
     }
 
     @Model
     public String default0Act() {
-        return holder.getAtPath();
+        return target.getAtPath();
     }
 
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java
index e894048..f7fc83f 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateEmailAddress.java
@@ -35,25 +35,25 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationUser_updateEmailAddress {
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
             @Parameter(maxLength = ApplicationUser.MAX_LENGTH_EMAIL_ADDRESS)
             @ParameterLayout(named="Email")
             final String emailAddress) {
-        holder.setEmailAddress(emailAddress);
-        return holder;
+        target.setEmailAddress(emailAddress);
+        return target;
     }
 
     @Model
     public String default0Act() {
-        return holder.getEmailAddress();
+        return target.getEmailAddress();
     }
 
     @Model
     public String disableAct() {
-        return holder.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
+        return target.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java
index 73e1be6..4a3a8ba 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateName.java
@@ -36,7 +36,7 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationUser_updateName {
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
@@ -50,30 +50,30 @@ public class ApplicationUser_updateName {
             @ParameterLayout(named="Known As")
             final String knownAs
             ) {
-        holder.setFamilyName(familyName);
-        holder.setGivenName(givenName);
-        holder.setKnownAs(knownAs);
-        return holder;
+        target.setFamilyName(familyName);
+        target.setGivenName(givenName);
+        target.setKnownAs(knownAs);
+        return target;
     }
 
     @Model
     public String default0Act() {
-        return holder.getFamilyName();
+        return target.getFamilyName();
     }
 
     @Model
     public String default1Act() {
-        return holder.getGivenName();
+        return target.getGivenName();
     }
 
     @Model
     public String default2Act() {
-        return holder.getKnownAs();
+        return target.getKnownAs();
     }
 
     @Model
     public String disableAct() {
-        return holder.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
+        return target.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
     }
 
     @Model
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePassword.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePassword.java
index 65fd58b..6f94637 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePassword.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePassword.java
@@ -46,7 +46,7 @@ public class ApplicationUser_updatePassword {
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     @Inject private Optional<PasswordEncryptionService> passwordEncryptionService; // empty if no candidate is available
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
@@ -57,22 +57,22 @@ public class ApplicationUser_updatePassword {
             @ParameterLayout(named="Re-enter password")
             final Password newPasswordRepeat) {
         
-        applicationUserRepository.updatePassword(holder, newPassword.getPassword());
-        return holder;
+        applicationUserRepository.updatePassword(target, newPassword.getPassword());
+        return target;
     }
 
     @Model
     public boolean hideAct() {
-        return !applicationUserRepository.isPasswordFeatureEnabled(holder);
+        return !applicationUserRepository.isPasswordFeatureEnabled(target);
     }
 
     @Model
     public String disableAct() {
 
-        if(!holder.isForSelfOrRunAsAdministrator()) {
+        if(!target.isForSelfOrRunAsAdministrator()) {
             return "Can only update password for your own user account.";
         }
-        if (!holder.isHasPassword()) {
+        if (!target.isHasPassword()) {
             return "Password must be reset by administrator.";
         }
         return null;
@@ -84,15 +84,15 @@ public class ApplicationUser_updatePassword {
             final Password newPassword,
             final Password newPasswordRepeat) {
 
-        if(!applicationUserRepository.isPasswordFeatureEnabled(holder)) {
+        if(!applicationUserRepository.isPasswordFeatureEnabled(target)) {
             return "Password feature is not available for this User";
         }
 
         val encrypter = passwordEncryptionService.orElseThrow(_Exceptions::unexpectedCodeReach);
         
-        val encryptedPassword = holder.getEncryptedPassword();
+        val encryptedPassword = target.getEncryptedPassword();
         
-        if(holder.getEncryptedPassword() != null) {
+        if(target.getEncryptedPassword() != null) {
             if (!encrypter.matches(existingPassword.getPassword(), encryptedPassword)) {
                 return "Existing password is incorrect";
             }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java
index 15ec6ba..8c10425 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updatePhoneNumber.java
@@ -36,24 +36,24 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationUser_updatePhoneNumber {
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
             @ParameterLayout(named="Phone")
             @Parameter(maxLength = ApplicationUser.MAX_LENGTH_PHONE_NUMBER, optionality = Optionality.OPTIONAL)
             final String phoneNumber) {
-        holder.setPhoneNumber(phoneNumber);
-        return holder;
+        target.setPhoneNumber(phoneNumber);
+        return target;
     }
 
     @Model
     public String disableAct() {
-        return holder.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
+        return target.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
     }
     
     @Model
     public String default0Act() {
-        return holder.getPhoneNumber();
+        return target.getPhoneNumber();
     }
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java
index aad50c6..afef9be 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_updateUsername.java
@@ -35,20 +35,20 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ApplicationUser_updateUsername {
     
-    private final ApplicationUser holder;
+    private final ApplicationUser target;
 
     @Model
     public ApplicationUser act(
             @Parameter(maxLength = ApplicationUser.MAX_LENGTH_USERNAME)
             @ParameterLayout(named="Username")
             final String username) {
-        holder.setUsername(username);
-        return holder;
+        target.setUsername(username);
+        return target;
     }
 
     @Model
     public String default0Act() {
-        return holder.getUsername();
+        return target.getUsername();
     }
 
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
index cb282c8..0222e45 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/HasUsername_open.java
@@ -40,25 +40,25 @@ public class HasUsername_open {
 
     @Inject private ApplicationUserRepository<? extends ApplicationUser> applicationUserRepository;
     
-    private final HasUsername holder;
+    private final HasUsername target;
 
     public static class ActionDomainEvent extends IsisModuleExtSecmanApi.ActionDomainEvent<HasUsername_open> {}
 
     
     @MemberOrder(name = "User", sequence = "1") // associate with a 'User' property (if any)
     public ApplicationUser act() {
-        if (holder == null || holder.getUsername() == null) {
+        if (target == null || target.getUsername() == null) {
             return null;
         }
-        return applicationUserRepository.findByUsername(holder.getUsername()).orElse(null);
+        return applicationUserRepository.findByUsername(target.getUsername()).orElse(null);
     }
     
     public boolean hideAct() {
-        return holder instanceof ApplicationUser;
+        return target instanceof ApplicationUser;
     }
 
     public TranslatableString disableAct() {
-        if (holder == null || holder.getUsername() == null) {
+        if (target == null || target.getUsername() == null) {
             return TranslatableString.tr("No username");
         }
         return null;
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 b8b6ddf..d622e7f 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
@@ -37,15 +37,15 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
-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.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValue;
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 67b5827..2fb948a 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
@@ -30,6 +30,8 @@ import javax.inject.Named;
 import org.springframework.stereotype.Repository;
 
 import org.apache.isis.applib.query.Query;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.message.MessageService;
@@ -43,9 +45,7 @@ import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.commons.internal.collections._Multimaps.ListMultimap;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
-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.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValue;
@@ -61,7 +61,7 @@ public class ApplicationPermissionRepository
 implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRepository<ApplicationPermission> {
 
     @Inject private RepositoryService repository;
-    @Inject private ApplicationFeatureRepositoryDefault applicationFeatureRepository;
+    @Inject private ApplicationFeatureRepositoryDefault featureRepository;
     @Inject private FactoryService factory;
     @Inject private MessageService messages;
     
@@ -231,7 +231,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
 
         final ApplicationFeatureId featureId = ApplicationFeatureId.newFeature(featureType, featureFqn);
-        final ApplicationFeature feature = applicationFeatureRepository.findFeature(featureId);
+        final ApplicationFeature feature = featureRepository.findFeature(featureId);
         if(feature == null) {
             messages.warnUser("No such " + featureType.name().toLowerCase() + ": " + featureFqn);
             return null;
@@ -270,13 +270,22 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final String featureClassName,
             final String featureMemberName) {
 
-        val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
-
         val featureId = ApplicationFeatureId.newFeature(featurePackage, featureClassName, featureMemberName);
+        return newPermission(genericRole, rule, mode, featureId);
+    }
+
+    @Override
+    public ApplicationPermission newPermission(
+            final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
+            final ApplicationPermissionRule rule, 
+            final ApplicationPermissionMode mode, 
+            final ApplicationFeatureId featureId) {
+
+        val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
         val featureType = featureId.getType();
         val featureFqn = featureId.getFullyQualifiedName();
 
-        val feature = applicationFeatureRepository.findFeature(featureId);
+        val feature = featureRepository.findFeature(featureId);
         if(feature == null) {
             messages.warnUser("No such " + featureType.name().toLowerCase() + ": " + featureFqn);
             return null;
@@ -292,7 +301,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
         return permission;
     }
-
+    
 
     // -- allPermission (programmatic)
     @Override
@@ -307,7 +316,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
     @Override
     public Collection<ApplicationPermission> findOrphaned() {
 
-        final Collection<String> packageNames = applicationFeatureRepository.packageNames();
+        final Collection<String> packageNames = featureRepository.packageNames();
         final Set<String> availableClasses = _Sets.newTreeSet();
         for (String packageName : packageNames) {
             appendClasses(packageName, ApplicationMemberType.PROPERTY, availableClasses);
@@ -317,8 +326,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
         val orphaned = _Lists.<ApplicationPermission>newArrayList();
 
-        val permissions = allPermissions();
-        for (val permission : permissions) {
+        for (val permission : allPermissions()) {
             final ApplicationFeatureType featureType = permission.getFeatureType();
             final String featureFqn = permission.getFeatureFqn();
 
@@ -360,7 +368,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
     private void appendClasses(
             final String packageName, final ApplicationMemberType memberType, final Set<String> availableClasses) {
-        final Collection<String> classNames = applicationFeatureRepository.classNamesContainedIn(packageName, memberType);
+        final Collection<String> classNames = featureRepository.classNamesContainedIn(packageName, memberType);
         for (String className : classNames) {
             availableClasses.add(packageName + "." + className);
         }
@@ -380,7 +388,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final ApplicationMemberType applicationMemberType,
             final List<String> memberNames) {
         final Collection<String> memberNamesOf =
-                applicationFeatureRepository.memberNamesOf(packageName, className, applicationMemberType);
+                featureRepository.memberNamesOf(packageName, className, applicationMemberType);
         memberNames.addAll(memberNamesOf);
     }
 
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
index 1d95fec..2abbe37 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
@@ -40,6 +40,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.user.RoleMemento;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
@@ -47,7 +48,6 @@ import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.extensions.secman.api.SecmanConfiguration;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
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 40ac6e0..3763454 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
@@ -25,8 +25,8 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
index 914f41f..ab64170 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermission.java
@@ -45,15 +45,15 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
-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.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValue;
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
index 8a2665d..52e2e1a 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/permission/ApplicationPermissionRepository.java
@@ -31,6 +31,8 @@ import javax.inject.Named;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.query.Query;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.message.MessageService;
@@ -44,9 +46,7 @@ import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.commons.internal.collections._Multimaps.ListMultimap;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
-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.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValue;
@@ -278,7 +278,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         repository.persist(permission);
         return permission;
     }
-
+    
     @Override
     public ApplicationPermission newPermission(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
@@ -288,9 +288,19 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final String featureClassName,
             final String featureMemberName) {
 
-        val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
-
         val featureId = ApplicationFeatureId.newFeature(featurePackage, featureClassName, featureMemberName);
+        return newPermission(genericRole, rule, mode, featureId);
+    }
+    
+    @Override
+    public ApplicationPermission newPermission(
+            final org.apache.isis.extensions.secman.api.role.ApplicationRole genericRole,
+            final ApplicationPermissionRule rule, 
+            final ApplicationPermissionMode mode, 
+            final ApplicationFeatureId featureId) {
+        
+        val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
+        
         val featureType = featureId.getType();
         val featureFqn = featureId.getFullyQualifiedName();
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
index 2f88229..db9b816 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/dom/user/ApplicationUser.java
@@ -51,6 +51,7 @@ import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.user.RoleMemento;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
@@ -58,7 +59,6 @@ import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.extensions.secman.api.SecmanConfiguration;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
index fb75029..4dbdb43 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
@@ -24,8 +24,8 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureType;
 import org.apache.isis.commons.internal.base._NullSafe;
-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.ApplicationPermissionRule;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
diff --git a/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/PermissionForMember.java b/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/PermissionForMember.java
index 6ca9d74..bb8df0e 100644
--- a/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/PermissionForMember.java
+++ b/extensions/security/secman/shiro-realm/src/main/java/org/apache/isis/extensions/secman/shiro/PermissionForMember.java
@@ -20,8 +20,8 @@ package org.apache.isis.extensions.secman.shiro;
 
 import org.apache.shiro.authz.Permission;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureId;
 
 /**
  * As created by {@link org.apache.isis.extensions.secman.shiro.PermissionResolverForIsisShiroAuthorizor}, interprets the