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/04 10:34:34 UTC

[isis] branch master updated: ISIS-2565: rename featureType->featureSort

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7eafd1e  ISIS-2565: rename featureType->featureSort
7eafd1e is described below

commit 7eafd1e639ec73784d695c28ce638bda55fd784d
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 4 11:34:19 2021 +0100

    ISIS-2565: rename featureType->featureSort
    
    also adding mignotes
---
 .../modules/ROOT/pages/2020/2.0.0-M5/mignotes.adoc | 25 +++++++++++++++
 .../api/permission/ApplicationPermission.java      | 10 +++---
 .../ApplicationPermissionRepository.java           |  2 +-
 .../app/feature/ApplicationPermission_feature.java |  4 +--
 ...OrphanedPermissionManager_relocateSelected.java |  2 +-
 .../dom/role/ApplicationRole_addPermission.java    |  3 ++
 .../jdo/dom/permission/ApplicationPermission.java  | 32 ++++++++++---------
 .../ApplicationPermissionRepository.java           | 36 +++++++++++-----------
 .../AbstractRoleAndPermissionsFixtureScript.java   |  4 +--
 .../jpa/dom/permission/ApplicationPermission.java  | 33 ++++++++++----------
 .../ApplicationPermissionRepository.java           | 36 +++++++++++-----------
 .../AbstractRoleAndPermissionsFixtureScript.java   |  4 +--
 12 files changed, 111 insertions(+), 80 deletions(-)

diff --git a/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M5/mignotes.adoc b/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M5/mignotes.adoc
index 4bb16e6..1955925 100644
--- a/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M5/mignotes.adoc
+++ b/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M5/mignotes.adoc
@@ -381,6 +381,19 @@ WARNING: check menubars.layout.xml for any occurrences
 
 Permission are now matched against logical packages, logical object types or logical object member names and use the former fully qualified names only as fallback.
 
+[WARNING]
+====
+SecMan database schema changed, namely the *ApplicationPermission* table! See table below.
+====
+
+[Source,sql]
+.SecMan database migration // adapt to your schema and db vendor!
+----
+UPDATE ApplicationPermission SET featureType='NAMESPACE' WHERE featureType like 'PACKAGE';
+UPDATE ApplicationPermission SET featureType='TYPE' WHERE featureType like 'CLASS';
+ALTER TABLE ApplicationPermission RENAME COLUMN `featureType` TO `featureSort`;
+----
+
 [cols="3m,3m,3a", options="header"]
 |===
 
@@ -388,6 +401,18 @@ Permission are now matched against logical packages, logical object types or log
 | Old
 | New
 
+| ApplicationPermission table column name
+| featureType
+| `featureSort`
+
+| ApplicationPermission#featureType/Sort entries
+| PACKAGE
+| `NAMESPACE`
+
+| ApplicationPermission#featureType/Sort entries
+| CLASS
+| `TYPE`
+
 | Domain Object namespaces in SecMan scope like eg. objectType = "isissecurity.ApplicationUser"
 | isissecurity
 | isis.ext.secman
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 1516199..be6fd99 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
@@ -124,7 +124,7 @@ public interface ApplicationPermission {
         return buf.toString();
     }
 
-    ApplicationFeatureSort getFeatureType();
+    ApplicationFeatureSort getFeatureSort();
 
     // -- ROLE
 
@@ -156,11 +156,11 @@ public interface ApplicationPermission {
     }
     void setMode(ApplicationPermissionMode changing);
 
-    // -- TYPE
+    // -- SORT
 
     @Property
     @MemberOrder(name="Feature", sequence = "5")
-    default String getType() {
+    default String getSort() {
         throw _Exceptions.unsupportedOperation("please implement me");
     }
 
@@ -177,8 +177,8 @@ public interface ApplicationPermission {
 
     @Programmatic
     default Optional<ApplicationFeatureId> createFeatureId() {
-        return Optional.of(getFeatureType())
-                .map(featureType -> ApplicationFeatureId.newFeature(featureType, getFeatureFqn()));
+        return Optional.of(getFeatureSort())
+                .map(featureSort -> ApplicationFeatureId.newFeature(featureSort, getFeatureFqn()));
     }
 
 
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 9110834..f78213e 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
@@ -65,7 +65,7 @@ public interface ApplicationPermissionRepository<P extends ApplicationPermission
             ApplicationRole role,
             ApplicationPermissionRule rule,
             ApplicationPermissionMode mode,
-            ApplicationFeatureSort featureType,
+            ApplicationFeatureSort featureSort,
             String featureFqn);
 
     P newPermission(
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 21ae587..304c4be 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
@@ -49,7 +49,7 @@ public class ApplicationPermission_feature {
 
     @MemberOrder(name="Feature", sequence = "4")
     public ApplicationFeatureViewModel prop(final ApplicationPermission permission) {
-        if(permission.getFeatureType() == null) {
+        if(permission.getFeatureSort() == null) {
             return null;
         }
         final ApplicationFeatureId featureId = getFeatureId(permission);
@@ -57,7 +57,7 @@ public class ApplicationPermission_feature {
     }
 
     private static ApplicationFeatureId getFeatureId(final ApplicationPermission permission) {
-        return ApplicationFeatureId.newFeature(permission.getFeatureType(), permission.getFeatureFqn());
+        return ApplicationFeatureId.newFeature(permission.getFeatureSort(), permission.getFeatureFqn());
     }
 
     @Inject RepositoryService repository;
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 b168e67..fd48c85 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
@@ -64,7 +64,7 @@ public class ApplicationOrphanedPermissionManager_relocateSelected {
             final String targetNamespace) {
         
         val appFeatureId = ApplicationFeatureId.newFeature(
-                permission.getFeatureType(), 
+                permission.getFeatureSort(), 
                 permission.getFeatureFqn());
         
         val relocatedFqn = appFeatureId
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 27f42f8..c976830 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
@@ -28,6 +28,7 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.MinLength;
@@ -35,6 +36,7 @@ import org.apache.isis.applib.annotation.Nature;
 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.annotation.Property;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
@@ -58,6 +60,7 @@ import lombok.experimental.Accessors;
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")
+@ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL)
 @RequiredArgsConstructor
 public class ApplicationRole_addPermission {
     
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 461a685..0ebab1e 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
@@ -82,7 +82,7 @@ import lombok.experimental.UtilityClass;
             name = "findByFeature", language = "JDOQL",
             value = "SELECT "
                     + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
-                    + "WHERE featureType == :featureType "
+                    + "WHERE featureSort == :featureSort "
                     + "   && featureFqn == :featureFqn"),
     @javax.jdo.annotations.Query(
             name = "findByRoleAndRuleAndFeature", language = "JDOQL",
@@ -90,7 +90,7 @@ import lombok.experimental.UtilityClass;
                     + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
                     + "WHERE role == :role "
                     + "   && rule == :rule "
-                    + "   && featureType == :featureType "
+                    + "   && featureSort == :featureSort "
                     + "   && featureFqn == :featureFqn "),
     @javax.jdo.annotations.Query(
             name = "findByRoleAndRuleAndFeatureType", language = "JDOQL",
@@ -98,11 +98,12 @@ import lombok.experimental.UtilityClass;
                     + "FROM org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission "
                     + "WHERE role == :role "
                     + "   && rule == :rule "
-                    + "   && featureType == :featureType "),
+                    + "   && featureSort == :featureSort "),
 })
 @javax.jdo.annotations.Uniques({
     @javax.jdo.annotations.Unique(
-            name = "ApplicationPermission_role_feature_rule_UNQ", members = { "role", "featureType", "featureFqn", "rule" })
+            name = "ApplicationPermission_role_feature_rule_UNQ", 
+            members = { "role", "featureSort", "featureFqn", "rule" })
 })
 @DomainObject(
         objectType = "isis.ext.secman.ApplicationPermission"
@@ -173,16 +174,17 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
     public static class TypeDomainEvent extends PropertyDomainEvent<String> {}
 
     /**
-     * Combines {@link #getFeatureType() feature type} and member type.
+     * Combines {@link #getFeatureSort() feature type} and member type.
      */
     @Property(
             domainEvent = TypeDomainEvent.class,
             editing = Editing.DISABLED
             )
     @PropertyLayout(typicalLength=ApplicationPermission.TYPICAL_LENGTH_TYPE)
-    public String getType() {
-        final Enum<?> e = getFeatureType() != ApplicationFeatureSort.MEMBER 
-                ? getFeatureType() 
+    @Override
+    public String getSort() {
+        final Enum<?> e = getFeatureSort() != ApplicationFeatureSort.MEMBER 
+                ? getFeatureSort() 
                 : getMemberType().orElse(null);
         return e != null ? e.name(): null;
     }
@@ -194,7 +196,7 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
     }
 
 
-    // -- featureType
+    // -- FEATURE SORT
 
     /**
      * The {@link ApplicationFeatureId#getType() feature type} of the
@@ -209,12 +211,12 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
      */
     @javax.jdo.annotations.Column(allowsNull="false")
     @Setter
-    private ApplicationFeatureSort featureType;
+    private ApplicationFeatureSort featureSort;
 
     @Override
     @Programmatic
-    public ApplicationFeatureSort getFeatureType() {
-        return featureType;
+    public ApplicationFeatureSort getFeatureSort() {
+        return featureSort;
     }
 
 
@@ -228,11 +230,11 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
      * of the feature.
      *
      * <p>
-     *     The combination of the {@link #getFeatureType() feature type} and the fully qualified name is used to build
+     *     The combination of the {@link #getFeatureSort() feature type} and the fully qualified name is used to build
      *     the corresponding {@link #getFeature() feature} (view model).
      * </p>
      *
-     * @see #getFeatureType()
+     * @see #getFeatureSort()
      */
     @javax.jdo.annotations.Column(allowsNull="false")
     @Property(
@@ -248,7 +250,7 @@ public class ApplicationPermission implements org.apache.isis.extensions.secman.
     private static final ObjectContract<ApplicationPermission> contract	= 
             ObjectContracts.contract(ApplicationPermission.class)
             .thenUse("role", ApplicationPermission::getRole)
-            .thenUse("featureType", ApplicationPermission::getFeatureType)
+            .thenUse("featureSort", ApplicationPermission::getFeatureSort)
             .thenUse("featureFqn", ApplicationPermission::getFeatureFqn)
             .thenUse("mode", ApplicationPermission::getMode);
 
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 f988e41..9240a7e 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
@@ -164,7 +164,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
                         ApplicationPermission.class, "findByRoleAndRuleAndFeatureType")
                     .withParameter("role", role)
                     .withParameter("rule", rule)
-                    .withParameter("featureType", type))
+                    .withParameter("featureSort", type))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
     }
@@ -174,19 +174,19 @@ 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 ApplicationFeatureSort type,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
         return queryResultsCacheProvider.get().execute(
                 this::findByRoleAndRuleAndFeature,
                 ApplicationPermissionRepository.class, "findByRoleAndRuleAndFeatureCached",
-                role, rule, type, featureFqn);
+                role, rule, featureSort, featureFqn);
     }
 
     @Override
     public Optional<ApplicationPermission> findByRoleAndRuleAndFeature(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureSort type,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
 
         return repository
@@ -194,7 +194,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
                                 ApplicationPermission.class, "findByRoleAndRuleAndFeature")
                         .withParameter("role", role)
                         .withParameter("rule", rule)
-                        .withParameter("featureType", type)
+                        .withParameter("featureSort", featureSort)
                         .withParameter("featureFqn", featureFqn ));
     }
 
@@ -212,7 +212,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         return repository.allMatches(
                 Query.named(
                         ApplicationPermission.class, "findByFeature")
-                .withParameter("featureType", featureId.getSort())
+                .withParameter("featureSort", featureId.getSort())
                 .withParameter("featureFqn", featureId.getFullyQualifiedName()))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
@@ -225,28 +225,28 @@ 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 ApplicationFeatureSort featureType,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
 
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
 
-        final ApplicationFeatureId featureId = ApplicationFeatureId.newFeature(featureType, featureFqn);
+        final ApplicationFeatureId featureId = ApplicationFeatureId.newFeature(featureSort, featureFqn);
         final ApplicationFeature feature = featureRepository.findFeature(featureId);
         if(feature == null) {
-            messages.warnUser("No such " + featureType.name().toLowerCase() + ": " + featureFqn);
+            messages.warnUser("No such " + featureSort.name().toLowerCase() + ": " + featureFqn);
             return null;
         }
-        return newPermissionNoCheck(role, rule, mode, featureType, featureFqn);
+        return newPermissionNoCheck(role, rule, mode, featureSort, featureFqn);
     }
 
     public ApplicationPermission newPermissionNoCheck(
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureSort featureType,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
 
-        ApplicationPermission permission = findByRoleAndRuleAndFeature(role, rule, featureType, featureFqn)
+        ApplicationPermission permission = findByRoleAndRuleAndFeature(role, rule, featureSort, featureFqn)
                 .orElse(null);
         if (permission != null) {
             return permission;
@@ -255,7 +255,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         permission.setRole(role);
         permission.setRule(rule);
         permission.setMode(mode);
-        permission.setFeatureType(featureType);
+        permission.setFeatureSort(featureSort);
         permission.setFeatureFqn(featureFqn);
         repository.persist(permission);
         return permission;
@@ -282,12 +282,12 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
             final ApplicationFeatureId featureId) {
 
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
-        val featureType = featureId.getSort();
+        val featureSort = featureId.getSort();
         val featureFqn = featureId.getFullyQualifiedName();
 
         val feature = featureRepository.findFeature(featureId);
         if(feature == null) {
-            messages.warnUser("No such " + featureType.name().toLowerCase() + ": " + featureFqn);
+            messages.warnUser("No such " + featureSort.name().toLowerCase() + ": " + featureFqn);
             return null;
         }
 
@@ -295,7 +295,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         permission.setRole(role);
         permission.setRule(rule);
         permission.setMode(mode);
-        permission.setFeatureType(featureType);
+        permission.setFeatureSort(featureSort);
         permission.setFeatureFqn(featureFqn);
         repository.persist(permission);
 
@@ -327,10 +327,10 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         val orphaned = _Lists.<ApplicationPermission>newArrayList();
 
         for (val permission : allPermissions()) {
-            final ApplicationFeatureSort featureType = permission.getFeatureType();
+            final ApplicationFeatureSort featureSort = permission.getFeatureSort();
             final String featureFqn = permission.getFeatureFqn();
 
-            switch (featureType) {
+            switch (featureSort) {
 
             case NAMESPACE:
                 if(!packageNames.contains(featureFqn)) {
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 9378d99..6f60896 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
@@ -105,7 +105,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
     private void newPermissions(
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureSort featureType,
+            final ApplicationFeatureSort featureSort,
             final Iterable<String> featureFqns) {
 
         if(featureFqns == null) {
@@ -126,7 +126,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
                     (org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole)securityRole,
                     rule,
                     mode,
-                    featureType, featureFqn);
+                    featureSort, featureFqn);
         }
     }
     
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 88839ed..82302ed 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
@@ -71,7 +71,7 @@ import lombok.experimental.UtilityClass;
         uniqueConstraints=
             @UniqueConstraint(
                     name = "ApplicationPermission_role_feature_rule_UNQ", 
-                    columnNames={"roleId", "featureType", "featureFqn", "rule"})
+                    columnNames={"roleId", "featureSort", "featureFqn", "rule"})
 )
 @NamedQueries({
     @NamedQuery(
@@ -91,7 +91,7 @@ import lombok.experimental.UtilityClass;
             name = NamedQueryNames.PERMISSION_BY_FEATURE, 
             query = "SELECT p "
                     + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission p "
-                    + "WHERE p.featureType = :featureType "
+                    + "WHERE p.featureSort = :featureSort "
                     + "   AND p.featureFqn = :featureFqn"),
     @NamedQuery(
             name = NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE_FQN, 
@@ -99,7 +99,7 @@ import lombok.experimental.UtilityClass;
                   + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission p "
                   + "WHERE p.role = :role "
                   + "   AND p.rule = :rule "
-                  + "   AND p.featureType = :featureType "
+                  + "   AND p.featureSort = :featureSort "
                   + "   AND p.featureFqn = :featureFqn "),
     @NamedQuery(
             name = NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE, 
@@ -107,7 +107,7 @@ import lombok.experimental.UtilityClass;
                   + "FROM org.apache.isis.extensions.secman.jpa.dom.permission.ApplicationPermission p "
                   + "WHERE p.role = :role "
                   + "   AND p.rule = :rule "
-                  + "   AND p.featureType = :featureType "),
+                  + "   AND p.featureSort = :featureSort "),
 })
 @EntityListeners(JpaEntityInjectionPointResolver.class)
 @DomainObject(
@@ -189,17 +189,18 @@ implements
     public static class TypeDomainEvent extends PropertyDomainEvent<String> {}
 
     /**
-     * Combines {@link #getFeatureType() feature type} and member type.
+     * Combines {@link #getFeatureSort() feature type} and member type.
      */
     @Property(
             domainEvent = TypeDomainEvent.class,
             editing = Editing.DISABLED
             )
     @PropertyLayout(typicalLength=ApplicationPermission.TYPICAL_LENGTH_TYPE)
-    public String getType() {
-        final Enum<?> e = getFeatureType() != ApplicationFeatureSort.MEMBER 
-                ? getFeatureType() 
-                        : getMemberType().orElse(null);
+    @Override
+    public String getSort() {
+        final Enum<?> e = getFeatureSort() != ApplicationFeatureSort.MEMBER 
+                ? getFeatureSort() 
+                : getMemberType().orElse(null);
         return e != null ? e.name(): null;
     }
 
@@ -210,7 +211,7 @@ implements
     }
 
 
-    // -- featureType
+    // -- featureSort
 
     /**
      * The {@link ApplicationFeatureId#getType() feature type} of the
@@ -226,12 +227,12 @@ implements
     @Column(nullable=false)
     @Enumerated(EnumType.STRING)
     @Setter
-    private ApplicationFeatureSort featureType;
+    private ApplicationFeatureSort featureSort;
 
     @Override
     @Programmatic
-    public ApplicationFeatureSort getFeatureType() {
-        return featureType;
+    public ApplicationFeatureSort getFeatureSort() {
+        return featureSort;
     }
 
 
@@ -245,11 +246,11 @@ implements
      * of the feature.
      *
      * <p>
-     *     The combination of the {@link #getFeatureType() feature type} and the fully qualified name is used to build
+     *     The combination of the {@link #getFeatureSort() feature type} and the fully qualified name is used to build
      *     the corresponding {@link #getFeature() feature} (view model).
      * </p>
      *
-     * @see #getFeatureType()
+     * @see #getFeatureSort()
      */
     @Column(nullable=false)
     @Property(
@@ -265,7 +266,7 @@ implements
     private static final ObjectContract<ApplicationPermission> contract	= 
             ObjectContracts.contract(ApplicationPermission.class)
             .thenUse("role", ApplicationPermission::getRole)
-            .thenUse("featureType", ApplicationPermission::getFeatureType)
+            .thenUse("featureSort", ApplicationPermission::getFeatureSort)
             .thenUse("featureFqn", ApplicationPermission::getFeatureFqn)
             .thenUse("mode", ApplicationPermission::getMode);
 
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 2033a66..d76dc4c 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
@@ -177,12 +177,12 @@ 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 ApplicationFeatureSort type) {
+            final ApplicationFeatureSort featureSort) {
         return repository.allMatches(Query.named(
                         ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE)
                     .withParameter("role", role)
                     .withParameter("rule", rule)
-                    .withParameter("featureType", type))
+                    .withParameter("featureSort", featureSort))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
     }
@@ -192,19 +192,19 @@ 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 ApplicationFeatureSort type,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
         return queryResultsCacheProvider.get().execute(
                 this::findByRoleAndRuleAndFeature,
                 ApplicationPermissionRepository.class, "findByRoleAndRuleAndFeatureCached",
-                role, rule, type, featureFqn);
+                role, rule, featureSort, featureFqn);
     }
 
     @Override
     public Optional<ApplicationPermission> findByRoleAndRuleAndFeature(
             final org.apache.isis.extensions.secman.api.role.ApplicationRole role,
             final ApplicationPermissionRule rule,
-            final ApplicationFeatureSort type,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
 
         return repository
@@ -212,7 +212,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
                                 ApplicationPermission.class, NamedQueryNames.PERMISSION_BY_ROLE_RULE_FEATURE_FQN)
                         .withParameter("role", role)
                         .withParameter("rule", rule)
-                        .withParameter("featureType", type)
+                        .withParameter("featureSort", featureSort)
                         .withParameter("featureFqn", featureFqn ));
     }
 
@@ -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.getSort())
+                .withParameter("featureSort", featureId.getSort())
                 .withParameter("featureFqn", featureId.getFullyQualifiedName()))
                 .stream()
                 .collect(_Sets.toUnmodifiableSorted());
@@ -243,28 +243,28 @@ 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 ApplicationFeatureSort featureType,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
 
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
 
-        final ApplicationFeatureId featureId = ApplicationFeatureId.newFeature(featureType, featureFqn);
+        final ApplicationFeatureId featureId = ApplicationFeatureId.newFeature(featureSort, featureFqn);
         final ApplicationFeature feature = applicationFeatureRepository.findFeature(featureId);
         if(feature == null) {
-            messages.warnUser("No such " + featureType.name().toLowerCase() + ": " + featureFqn);
+            messages.warnUser("No such " + featureSort.name().toLowerCase() + ": " + featureFqn);
             return null;
         }
-        return newPermissionNoCheck(role, rule, mode, featureType, featureFqn);
+        return newPermissionNoCheck(role, rule, mode, featureSort, featureFqn);
     }
 
     public ApplicationPermission newPermissionNoCheck(
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureSort featureType,
+            final ApplicationFeatureSort featureSort,
             final String featureFqn) {
 
-        ApplicationPermission permission = findByRoleAndRuleAndFeature(role, rule, featureType, featureFqn)
+        ApplicationPermission permission = findByRoleAndRuleAndFeature(role, rule, featureSort, featureFqn)
                 .orElse(null);
         if (permission != null) {
             return permission;
@@ -273,7 +273,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         permission.setRole(role);
         permission.setRule(rule);
         permission.setMode(mode);
-        permission.setFeatureType(featureType);
+        permission.setFeatureSort(featureSort);
         permission.setFeatureFqn(featureFqn);
         repository.persist(permission);
         return permission;
@@ -301,12 +301,12 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         
         val role = _Casts.<ApplicationRole>uncheckedCast(genericRole);
         
-        val featureType = featureId.getSort();
+        val featureSort = featureId.getSort();
         val featureFqn = featureId.getFullyQualifiedName();
 
         val feature = applicationFeatureRepository.findFeature(featureId);
         if(feature == null) {
-            messages.warnUser("No such " + featureType.name().toLowerCase() + ": " + featureFqn);
+            messages.warnUser("No such " + featureSort.name().toLowerCase() + ": " + featureFqn);
             return null;
         }
 
@@ -314,7 +314,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
         permission.setRole(role);
         permission.setRule(rule);
         permission.setMode(mode);
-        permission.setFeatureType(featureType);
+        permission.setFeatureSort(featureSort);
         permission.setFeatureFqn(featureFqn);
         repository.persist(permission);
 
@@ -347,7 +347,7 @@ implements org.apache.isis.extensions.secman.api.permission.ApplicationPermissio
 
         val permissions = allPermissions();
         for (val permission : permissions) {
-            final ApplicationFeatureSort featureType = permission.getFeatureType();
+            final ApplicationFeatureSort featureType = permission.getFeatureSort();
             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 e12c342..19c3bf1 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
@@ -103,7 +103,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
     private void newPermissions(
             final ApplicationPermissionRule rule,
             final ApplicationPermissionMode mode,
-            final ApplicationFeatureSort featureType,
+            final ApplicationFeatureSort featureSort,
             final Iterable<String> featureFqns) {
 
         if(featureFqns == null) {
@@ -124,7 +124,7 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
                     (org.apache.isis.extensions.secman.jpa.dom.role.ApplicationRole)securityRole,
                     rule,
                     mode,
-                    featureType, featureFqn);
+                    featureSort, featureFqn);
         }
     }