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/05 08:24:26 UTC

[isis] branch master updated: ISIS-2553: promotes ApplicationFeature to applib (new interface)

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 5ab396e  ISIS-2553: promotes ApplicationFeature to applib (new interface)
5ab396e is described below

commit 5ab396e796417d5acba902fe8a1f2627437bfcbb
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Mar 5 09:24:13 2021 +0100

    ISIS-2553: promotes ApplicationFeature to applib (new interface)
---
 .../services/appfeat/ApplicationFeature.java       | 68 ++++++++++++++++++++++
 ...Feature.java => ApplicationFeatureDefault.java} | 21 +++----
 .../appfeat/ApplicationFeatureFactory.java         |  3 +-
 .../ApplicationFeatureRepositoryDefault.java       | 20 ++-----
 .../metamodel/services/appfeat/_Predicates.java    |  1 +
 .../valuetypes/ValueTypeProviderForBuiltin.java    |  4 +-
 .../services/appfeat/ApplicationFeatureIdTest.java |  1 +
 .../ApplicationFeatureRepositoryDefaultTest.java   | 33 +++++++----
 .../services/appfeat/ApplicationFeatureTest.java   | 56 +++++++++++-------
 .../api/permission/ApplicationPermission.java      |  2 +-
 .../api/permission/ApplicationPermissionMode.java  |  2 +-
 .../api/permission/ApplicationPermissionRule.java  |  2 +-
 .../dom/feature/ApplicationFeatureViewModel.java   |  2 +-
 .../dom/feature/ApplicationFeatureViewModels.java  |  4 +-
 .../dom/role/ApplicationRole_addPermission.java    |  2 +-
 .../user/ApplicationUser_filterPermissions.java    |  2 +-
 .../dom/user/ApplicationUser_permissions.java      |  2 +-
 .../model/dom/user/UserPermissionViewModel.java    |  2 +-
 .../jdo/dom/permission/ApplicationPermission.java  |  2 +-
 .../ApplicationPermissionRepository.java           |  2 +-
 .../jpa/dom/permission/ApplicationPermission.java  |  2 +-
 .../ApplicationPermissionRepository.java           |  2 +-
 22 files changed, 157 insertions(+), 78 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java
new file mode 100644
index 0000000..00fb2d4
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java
@@ -0,0 +1,68 @@
+/*
+ *  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.applib.services.appfeat;
+
+import java.util.SortedSet;
+
+import org.apache.isis.applib.annotation.SemanticsOf;
+
+/**
+ * 
+ * @since 1.x revised for 2.0 {@index}
+ */
+public interface ApplicationFeature {
+
+    ApplicationFeatureId getFeatureId();
+    
+    default String getFullyQualifiedName() {
+        return getFeatureId().getFullyQualifiedName();
+    }
+
+    ApplicationMemberSort getMemberSort();
+    
+    SortedSet<ApplicationFeatureId> membersOfSort(ApplicationMemberSort memberSort);
+    
+    SortedSet<ApplicationFeatureId> getContents();
+
+    SortedSet<ApplicationFeatureId> getProperties();
+
+    SortedSet<ApplicationFeatureId> getCollections();
+
+    SortedSet<ApplicationFeatureId> getActions();
+
+    // -- TODO probably non formal API, only used by secman ...
+
+    String getReturnTypeName();
+
+    SemanticsOf getActionSemantics();
+
+    Boolean getDerived();
+
+    Integer getPropertyTypicalLength();
+
+    Integer getPropertyMaxLength();
+    
+    // using same value for all to neaten up rendering
+    public static final int TYPICAL_LENGTH_PKG_FQN = 50;
+    public static final int TYPICAL_LENGTH_CLS_NAME = 50;
+    public static final int TYPICAL_LENGTH_MEMBER_NAME = 50;
+
+    
+    
+}
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/ApplicationFeatureDefault.java
similarity index 92%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeature.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureDefault.java
index d579487..75b430c 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/ApplicationFeatureDefault.java
@@ -23,6 +23,7 @@ import java.util.SortedSet;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
@@ -46,18 +47,14 @@ import lombok.Setter;
  * </p>
  */
 @Value
-public class ApplicationFeature implements Comparable<ApplicationFeature> {
-
-    // -- CONSTANTS
-
-    // using same value for all to neaten up rendering
-    public static final int TYPICAL_LENGTH_PKG_FQN = 50;
-    public static final int TYPICAL_LENGTH_CLS_NAME = 50;
-    public static final int TYPICAL_LENGTH_MEMBER_NAME = 50;
+public class ApplicationFeatureDefault 
+implements 
+    ApplicationFeature,
+    Comparable<ApplicationFeature> {
 
     // -- CONSTRUCTORS
     
-    public ApplicationFeature(final ApplicationFeatureId featureId) {
+    public ApplicationFeatureDefault(final ApplicationFeatureId featureId) {
         this.featureId = featureId;
     }
 
@@ -103,6 +100,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
     // -- packages: Contents
     private final SortedSet<ApplicationFeatureId> contents = _Sets.newTreeSet();
 
+    @Override
     public SortedSet<ApplicationFeatureId> getContents() {
         _Asserts.ensureNamespace(this.getFeatureId());
         return contents;
@@ -146,6 +144,7 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
         membersOfSort(memberSort).add(memberId);
     }
     
+    @Override
     public SortedSet<ApplicationFeatureId> membersOfSort(final ApplicationMemberSort memberSort) {
         _Asserts.ensureType(this.getFeatureId());
         switch (memberSort) {
@@ -158,10 +157,6 @@ public class ApplicationFeature implements Comparable<ApplicationFeature> {
         }
     }
 
-    public String getFullyQualifiedName() {
-        return getFeatureId().getFullyQualifiedName();
-    }
-
     // -- OBJECT CONTRACT
 
     private static final Comparator<ApplicationFeature> comparator =
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureFactory.java
index 8827e61..5502d77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureFactory.java
@@ -26,6 +26,7 @@ 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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 
 @Service
@@ -36,7 +37,7 @@ import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 public class ApplicationFeatureFactory {
 
     public ApplicationFeature newApplicationFeature(ApplicationFeatureId featId) {
-        return new ApplicationFeature(featId); // value type
+        return new ApplicationFeatureDefault(featId); // value type
     }
 
 }
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 c87b3a1..8b9810f 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
@@ -37,6 +37,7 @@ 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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
@@ -213,7 +214,7 @@ implements ApplicationFeatureRepository {
 
     ApplicationFeatureId addClassParent(final ApplicationFeatureId classFeatureId) {
         final ApplicationFeatureId parentPackageId = classFeatureId.getParentNamespaceFeatureId();
-        final ApplicationFeature parentPackage = findPackageElseCreate(parentPackageId);
+        final ApplicationFeatureDefault parentPackage = (ApplicationFeatureDefault)findPackageElseCreate(parentPackageId);
 
         parentPackage.addToContents(classFeatureId);
         return parentPackageId;
@@ -225,7 +226,7 @@ implements ApplicationFeatureRepository {
             return;
         }
 
-        final ApplicationFeature parentPackage = findPackageElseCreate(parentPackageId);
+        final ApplicationFeatureDefault parentPackage = (ApplicationFeatureDefault)findPackageElseCreate(parentPackageId);
 
         // add this feature as part of the contents of its parent
         parentPackage.addToContents(classOrPackageId);
@@ -300,7 +301,7 @@ implements ApplicationFeatureRepository {
             final SemanticsOf actionSemantics) {
         final ApplicationFeatureId featureId = ApplicationFeatureId.newMember(classFeatureId.getFullyQualifiedName(), memberId);
 
-        final ApplicationFeature memberFeature = newFeature(featureId);
+        final ApplicationFeatureDefault memberFeature = (ApplicationFeatureDefault)newFeature(featureId);
         memberFeature.setMemberSort(memberSort);
 
         memberFeature.setReturnTypeName(returnType != null ? returnType.getSimpleName() : null);
@@ -314,7 +315,7 @@ implements ApplicationFeatureRepository {
         // also cache per memberSort
         featuresMapFor(memberSort).put(featureId, memberFeature);
 
-        final ApplicationFeature classFeature = findLogicalType(classFeatureId);
+        final ApplicationFeatureDefault classFeature = (ApplicationFeatureDefault)findLogicalType(classFeatureId);
         classFeature.addToMembers(featureId, memberSort);
     }
 
@@ -471,17 +472,6 @@ implements ApplicationFeatureRepository {
                 .collect(_Sets.toUnmodifiableSorted());
     }
 
-//    @Override
-//    public SortedSet<String> namespaceNamesContainingSort(final ApplicationMemberSort memberSort) {
-//        initializeIfRequired();
-//        final Collection<ApplicationFeature> packages = allFeatures(ApplicationFeatureSort.NAMESPACE);
-//
-//        return stream(packages)
-//                .filter(ApplicationFeature.Predicates.packageContainingClasses(memberSort, this))
-//                .map(ApplicationFeature.Functions.GET_FQN)
-//                .collect(_Sets.toUnmodifiableSorted());
-//    }
-
     @Override
     public SortedSet<String> classNamesContainedIn(
             final String namespace, 
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 2480222..8d5ff1b 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,6 +21,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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForBuiltin.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForBuiltin.java
index d16e264..d359bfd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForBuiltin.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForBuiltin.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.graph.SimpleEdge;
 import org.apache.isis.applib.graph.tree.LazyTreeNode;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 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.ApplicationFeatureDefault;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -48,7 +48,7 @@ public class ValueTypeProviderForBuiltin implements ValueTypeProvider {
                     ValueTypeDefinition.of(SimpleEdge.class, ValueType.STRING),
                     ValueTypeDefinition.of(LazyTreeNode.class, ValueType.STRING),
 
-                    ValueTypeDefinition.of(ApplicationFeature.class, ValueType.STRING)
+                    ValueTypeDefinition.of(ApplicationFeatureDefault.class, ValueType.STRING)
 
                 );
     }
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 f77477d..13767cd 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,7 @@ 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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
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 6febbdf..650f240 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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -77,7 +78,7 @@ public class ApplicationFeatureRepositoryDefaultTest {
     @Mock SpecificationLoader mockSpecificationLoader;
 
     protected ApplicationFeatureRepositoryDefault applicationFeatureRepository;
-
+    
     @Before
     public void setUp() throws Exception {
 
@@ -94,6 +95,10 @@ public class ApplicationFeatureRepositoryDefaultTest {
     public static class Load extends ApplicationFeatureRepositoryDefaultTest {
 
         public static class Bar {}
+        
+        private static ApplicationFeature newApplicationFeature(ApplicationFeatureId featId) {
+            return new ApplicationFeatureDefault(featId);
+        }
 
         @Ignore // considering deleting this test, it's too long and too fragile.  integ tests ought to suffice.
         @Test
@@ -178,43 +183,43 @@ public class ApplicationFeatureRepositoryDefaultTest {
             context.checking(new Expectations() {{
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newType(Bar.class.getName()))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newType(Bar.class.getName()))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newMember(Bar.class.getName(), "someProperty"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newMember(Bar.class.getName(), "someProperty"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newMember(Bar.class.getName(), "someCollection"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newMember(Bar.class.getName(), "someCollection"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newMember(Bar.class.getName(), "someAction"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newMember(Bar.class.getName(), "someAction"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom.feature"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom.feature"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security.dom"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module.security"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons.module"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newNamespace("org.isisaddons"))));
 
                 oneOf(mockFactoryService).create(ApplicationFeature.class);
                 inSequence(sequence);
-                will(returnValue(new ApplicationFeature(ApplicationFeatureId.newNamespace("org"))));
+                will(returnValue(newApplicationFeature(ApplicationFeatureId.newNamespace("org"))));
             }});
 
             // when
@@ -256,6 +261,10 @@ public class ApplicationFeatureRepositoryDefaultTest {
 
     public static class AddClassParent extends ApplicationFeatureRepositoryDefaultTest {
 
+        private static ApplicationFeature newApplicationFeature(ApplicationFeatureId featId) {
+            return new ApplicationFeatureDefault(featId);
+        }
+        
         @Override
         @Before
         public void setUp() throws Exception {
@@ -276,7 +285,7 @@ public class ApplicationFeatureRepositoryDefaultTest {
 
             // given
             final ApplicationFeatureId packageId = ApplicationFeatureId.newNamespace("com.mycompany");
-            final ApplicationFeature pkg = new ApplicationFeature(packageId);
+            final ApplicationFeature pkg = newApplicationFeature(packageId);
             applicationFeatureRepository.packageFeatures.put(packageId, pkg);
 
             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 cd848c8..65abb37 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
@@ -30,18 +30,24 @@ import static org.hamcrest.Matchers.containsInAnyOrder;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
 
+import lombok.val;
+
 public class ApplicationFeatureTest {
 
     public static class GetContents_and_AddToContents extends ApplicationFeatureTest {
 
+        private static ApplicationFeatureDefault newApplicationFeature(ApplicationFeatureId featId) {
+            return new ApplicationFeatureDefault(featId);
+        }
+        
         @Rule
         public ExpectedException expectedException = ExpectedException.none();
 
         @Test
         public void givenPackage_whenAddPackageAndClass() throws Exception {
-            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");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
+            val packageFeatureId = ApplicationFeatureId.newNamespace("com.mycompany.flob");
+            val classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bar");
 
             applicationFeature.addToContents(packageFeatureId);
             applicationFeature.addToContents(classFeatureId);
@@ -55,8 +61,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
-            final ApplicationFeatureId memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
+            val memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             applicationFeature.addToContents(memberFeatureId);
         }
@@ -66,8 +72,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            val classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
 
             applicationFeature.addToContents(classFeatureId);
         }
@@ -77,8 +83,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Bar", "foo"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Bar", "foo"));
+            val classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
 
             applicationFeature.addToContents(classFeatureId);
         }
@@ -87,6 +93,10 @@ public class ApplicationFeatureTest {
 
     public static class GetMembers_and_AddToMembers extends ApplicationFeatureTest {
 
+        private static ApplicationFeatureDefault newApplicationFeature(ApplicationFeatureId featId) {
+            return new ApplicationFeatureDefault(featId);
+        }
+        
         @Rule
         public ExpectedException expectedException = ExpectedException.none();
 
@@ -95,8 +105,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
-            final ApplicationFeatureId memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newNamespace("com.mycompany"));
+            val memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
 
             applicationFeature.addToMembers(memberFeatureId, ApplicationMemberSort.PROPERTY);
         }
@@ -104,9 +114,9 @@ public class ApplicationFeatureTest {
         @Test
         public void givenClass_whenAddMember() throws Exception {
 
-            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");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            val memberFeatureId = ApplicationFeatureId.newMember("com.mycompany.Bar", "foo");
+            val memberFeatureId2 = ApplicationFeatureId.newMember("com.mycompany.Bar", "boz");
 
             applicationFeature.addToMembers(memberFeatureId, ApplicationMemberSort.PROPERTY);
             applicationFeature.addToMembers(memberFeatureId2, ApplicationMemberSort.PROPERTY);
@@ -120,8 +130,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
-            final ApplicationFeatureId packageFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            val packageFeatureId = ApplicationFeatureId.newNamespace("com.mycompany");
 
             applicationFeature.addToMembers(packageFeatureId, ApplicationMemberSort.PROPERTY);
         }
@@ -131,8 +141,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bop");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newType("com.mycompany.Bar"));
+            val classFeatureId = ApplicationFeatureId.newType("com.mycompany.Bop");
 
             applicationFeature.addToMembers(classFeatureId, ApplicationMemberSort.PROPERTY);
         }
@@ -142,8 +152,8 @@ public class ApplicationFeatureTest {
 
             expectedException.expect(IllegalStateException.class);
 
-            final ApplicationFeature applicationFeature = new ApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Bar", "foo"));
-            final ApplicationFeatureId classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
+            val applicationFeature = newApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Bar", "foo"));
+            val classFeatureId = ApplicationFeatureId.newType("com.mycompany.flob.Bar");
 
             applicationFeature.addToMembers(classFeatureId, ApplicationMemberSort.PROPERTY);
         }
@@ -152,9 +162,13 @@ public class ApplicationFeatureTest {
 
     public static class MethodsTest extends ApplicationFeatureTest {
 
+        private static ApplicationFeatureDefault newApplicationFeature(ApplicationFeatureId featId) {
+            return new ApplicationFeatureDefault(featId);
+        }
+        
         @Test
         public void getFullyQualifiedName() throws Exception {
-            final ApplicationFeature input = new ApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
+            val input = newApplicationFeature(ApplicationFeatureId.newMember("com.mycompany.Foo#bar"));
             assertThat(input.getFullyQualifiedName(), is("com.mycompany.Foo#bar"));
         }
     }
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 be6fd99..6794e46 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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 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;
 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/ApplicationPermissionMode.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionMode.java
index bb699e5..943df34 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionMode.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionMode.java
@@ -18,8 +18,8 @@
  */
 package org.apache.isis.extensions.secman.api.permission;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 
 /**
  * Named after UNIX modes (<code>chmod</code> etc), determines that nature of access (of denial of access if vetoed)
diff --git a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRule.java b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRule.java
index 25ac6f0..79cd9e1 100644
--- a/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRule.java
+++ b/extensions/security/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionRule.java
@@ -18,8 +18,8 @@
  */
 package org.apache.isis.extensions.secman.api.permission;
 
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 
 /**
  * Whether the permission {@link #ALLOW grants} or {@link #VETO denies} access to an
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java
index baab548..bb07d45 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModel.java
@@ -33,6 +33,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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.factory.FactoryService;
@@ -42,7 +43,6 @@ import org.apache.isis.applib.util.ObjectContracts;
 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.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/dom/feature/ApplicationFeatureViewModels.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModels.java
index 522c2d3..154f06d 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModels.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/feature/ApplicationFeatureViewModels.java
@@ -31,12 +31,12 @@ import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
-import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
+import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 
 @DomainService(
         nature = NatureOfService.VIEW,
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 defeff5..90a0d53 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
@@ -38,10 +38,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.Property;
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
 import org.apache.isis.commons.internal.functions._Predicates;
-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;
 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/dom/user/ApplicationUser_filterPermissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_filterPermissions.java
index d9fe4af..e964cf9 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_filterPermissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/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.ApplicationFeature;
 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
 
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_permissions.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_permissions.java
index e8e326d..0e0e238 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_permissions.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/ApplicationUser_permissions.java
@@ -26,9 +26,9 @@ import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.user.ApplicationUser;
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/UserPermissionViewModel.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/UserPermissionViewModel.java
index 13e1c9c..537813d 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/UserPermissionViewModel.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/user/UserPermissionViewModel.java
@@ -37,6 +37,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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.factory.FactoryService;
@@ -44,7 +45,6 @@ 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.IsisModuleExtSecmanApi;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermission;
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 08ac90e..285b02e 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,6 +37,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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
@@ -44,7 +45,6 @@ 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
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 e8a5a87..8660445 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,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Repository;
 
 import org.apache.isis.applib.query.Query;
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
@@ -44,7 +45,6 @@ import org.apache.isis.commons.internal.collections._Lists;
 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
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 cbbc2ec..15ecf28 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,6 +45,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.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
@@ -52,7 +53,6 @@ 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
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 76cd812..6af3c65 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,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.query.Query;
+import org.apache.isis.applib.services.appfeat.ApplicationFeature;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberSort;
@@ -45,7 +46,6 @@ import org.apache.isis.commons.internal.collections._Lists;
 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.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;