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 2022/01/13 17:48:07 UTC

[isis] branch master updated: ISIS-2703: secman: convert ten. menu actions to Ten.Manager VM

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 950de6a  ISIS-2703: secman: convert ten. menu actions to Ten.Manager VM
950de6a is described below

commit 950de6a35a26618c477a4310523e6d6c368f1063
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 13 18:47:58 2022 +0100

    ISIS-2703: secman: convert ten. menu actions to Ten.Manager VM
---
 .../modules/ROOT/pages/2021/2.0.0-M7/mignotes.adoc |   7 ++
 ...etForLogicalTypeNameAnnotationFacetFactory.java |  17 +++--
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   3 +-
 .../secman/applib/IsisModuleExtSecmanApplib.java   |   9 ++-
 .../dom/ApplicationTenancyRepositoryAbstract.java  |   2 +-
 .../tenancy/man/ApplicationTenancyManager.java     |  40 +++++++++++
 .../ApplicationTenancyManager.layout.fallback.xml  |  61 +++++++++++++++++
 .../ApplicationTenancyManager_allTenancies.java    |  46 +++++++++++++
 .../ApplicationTenancyManager_newTenancy.java      |  74 +++++++++++++++++++++
 .../tenancy/menu/ApplicationTenancyMenu.java       |  70 +++++++------------
 .../applib/user/menu/ApplicationUserMenu.java      |  40 +++++------
 .../resources/images/ApplicationTenancyManager.png | Bin 0 -> 1217 bytes
 12 files changed, 290 insertions(+), 79 deletions(-)

diff --git a/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M7/mignotes.adoc b/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M7/mignotes.adoc
index b394d18..6f9e01d 100644
--- a/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M7/mignotes.adoc
+++ b/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M7/mignotes.adoc
@@ -242,6 +242,9 @@ Following menu actions for roles have been removed:
 <!--
 <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="newRole"/>
 <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="allRoles"/>
+
+<mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="newTenancy"/>
+<mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="allTenancies"/>
 -->
 ----
 
@@ -250,5 +253,9 @@ Use the new Role Manager View Model instead:
 [source,xml]
 .menubars.layout.xml
 ----
+<!-- Roles -->
 <mb3:serviceAction objectType="isis.ext.secman.ApplicationRoleMenu" id="roleManager"/>
+
+<!-- Tenancies -->
+<mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="tenancyManager"/>
 ----
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java
index 598c4f1..3f89291 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.LogicalTypeName;
+import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -44,15 +45,17 @@ extends FacetFactoryAbstract {
         val logicalTypeNameIfAny = processClassContext.synthesizeOnType(LogicalTypeName.class);
         val cls = processClassContext.getCls();
 
-        if(!cls.isInterface()) {
-            return;
-        }
+        if(cls.isInterface()
+                || ClassExtensions.isAbstract(cls)) {
+
+            val facetHolder = processClassContext.getFacetHolder();
 
-        val facetHolder = processClassContext.getFacetHolder();
+            FacetUtil.addFacetIfPresent(
+                    LogicalTypeFacetForLogicalTypeNameAnnotation
+                    .create(logicalTypeNameIfAny, cls, facetHolder));
+
+        }
 
-        FacetUtil.addFacetIfPresent(
-                LogicalTypeFacetForLogicalTypeNameAnnotation
-                .create(logicalTypeNameIfAny, cls, facetHolder));
     }
 
 }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
index 5e9494f..8bdc5c8 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
+++ b/examples/demo/domain/src/main/java/demoapp/dom/menubars.layout.xml
@@ -350,9 +350,8 @@ For latest we use: https://raw.githubusercontent.com/apache/isis/master/antora/s
             </mb3:section>
             <mb3:section>
                 <mb3:named>Tenancies</mb3:named>
+                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="tenancyManager"/>
                 <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="findTenancies"/>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="newTenancy"/>
-                <mb3:serviceAction objectType="isis.ext.secman.ApplicationTenancyMenu" id="allTenancies"/>
             </mb3:section>
         </mb3:menu>
         <mb3:menu>
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java
index 50e2426..3ab76dc 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java
@@ -52,6 +52,8 @@ import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTe
 import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTenancy_removeUser;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTenancy_updateName;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.mixins.ApplicationTenancy_users;
+import org.apache.isis.extensions.secman.applib.tenancy.man.mixins.ApplicationTenancyManager_allTenancies;
+import org.apache.isis.extensions.secman.applib.tenancy.man.mixins.ApplicationTenancyManager_newTenancy;
 import org.apache.isis.extensions.secman.applib.tenancy.menu.ApplicationTenancyMenu;
 import org.apache.isis.extensions.secman.applib.user.contributions.HasUsername_open;
 import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_addRole;
@@ -103,14 +105,11 @@ import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
 
 
         // -- ViewModels
-        // TODO: not sure we need to register view models?
         ApplicationUserManager.class,
         UserPermissionViewModel.class,
         ApplicationOrphanedPermissionManager.class,
 
         // -- Mixins
-        // TODO: not sure we need to register mixins?
-
         ApplicationOrphanedPermissionManager_relocateSelected.class,
 
         //ApplicationPermission
@@ -176,6 +175,10 @@ import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
         ApplicationRoleManager_newRole.class,
         ApplicationRoleManager_exportAsYaml.class,
 
+        // ApplicationRoleManager
+        ApplicationTenancyManager_allTenancies.class,
+        ApplicationTenancyManager_newTenancy.class,
+
         // other @Services
         SeedSecurityModuleService.class,
 
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java
index 24c9193..b180790 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java
@@ -144,7 +144,7 @@ implements ApplicationTenancyRepository {
     // --
 
     @Override
-    public Collection<ApplicationTenancy> allTenancies() {
+    public final Collection<ApplicationTenancy> allTenancies() {
         return queryResultsCacheProvider.get().execute(
                 () -> allTenanciesNoCache(),
                 ApplicationTenancyRepositoryAbstract.class, "allTenancies");
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java
new file mode 100644
index 0000000..7c5eb46
--- /dev/null
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java
@@ -0,0 +1,40 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.secman.applib.tenancy.man;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.ObjectSupport;
+import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
+
+@DomainObject(
+        nature = Nature.VIEW_MODEL,
+        logicalTypeName = ApplicationTenancyManager.LOGICAL_TYPE_NAME
+)
+public class ApplicationTenancyManager {
+
+    public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationTenancyManager";
+
+    @ObjectSupport public String title() {
+        return "Application Tenancy Manager";
+    }
+
+    // behaviour provided by mixins
+
+}
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.layout.fallback.xml b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.layout.fallback.xml
new file mode 100644
index 0000000..ea398cd
--- /dev/null
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.layout.fallback.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!-- 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. -->
+<bs3:grid
+	xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd   http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd"
+	xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3"
+	xmlns:cpt="http://isis.apache.org/applib/layout/component"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<bs3:row>
+		<bs3:col span="12" unreferencedActions="true">
+			<cpt:domainObject />
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="12">
+			<bs3:tabGroup unreferencedCollections="true">
+				<bs3:tab name="All Tenancies">
+					<bs3:row>
+						<bs3:col span="12" size="MD" />
+					</bs3:row>
+				</bs3:tab>
+			</bs3:tabGroup>
+		</bs3:col>
+	</bs3:row>
+	<bs3:row>
+		<bs3:col span="0">
+			<bs3:tabGroup>
+				<bs3:tab name="Identity">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Identity" id="identity" />
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Other">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Other" id="other"
+								unreferencedProperties="true" />
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+				<bs3:tab name="Metadata">
+					<bs3:row>
+						<bs3:col span="12">
+							<cpt:fieldSet name="Metadata" id="metadata" />
+						</bs3:col>
+					</bs3:row>
+				</bs3:tab>
+			</bs3:tabGroup>
+		</bs3:col>
+	</bs3:row>
+</bs3:grid>
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/mixins/ApplicationTenancyManager_allTenancies.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/mixins/ApplicationTenancyManager_allTenancies.java
new file mode 100644
index 0000000..93f99e5
--- /dev/null
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/mixins/ApplicationTenancyManager_allTenancies.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.secman.applib.tenancy.man.mixins;
+
+import java.util.Collection;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.MemberSupport;
+import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy;
+import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancyRepository;
+import org.apache.isis.extensions.secman.applib.tenancy.man.ApplicationTenancyManager;
+
+import lombok.RequiredArgsConstructor;
+
+@org.apache.isis.applib.annotation.Collection
+@RequiredArgsConstructor
+public class ApplicationTenancyManager_allTenancies {
+
+    @SuppressWarnings("unused")
+    private final ApplicationTenancyManager target;
+
+    @Inject
+    private ApplicationTenancyRepository applicationTenancyRepository;
+
+    @MemberSupport public Collection<ApplicationTenancy> coll() {
+        return applicationTenancyRepository.allTenancies();
+    }
+
+}
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/mixins/ApplicationTenancyManager_newTenancy.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/mixins/ApplicationTenancyManager_newTenancy.java
new file mode 100644
index 0000000..c5a23ff
--- /dev/null
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/mixins/ApplicationTenancyManager_newTenancy.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.secman.applib.tenancy.man.mixins;
+
+import java.util.Collection;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.MemberSupport;
+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.extensions.secman.applib.tenancy.dom.ApplicationTenancy;
+import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancyRepository;
+import org.apache.isis.extensions.secman.applib.tenancy.man.ApplicationTenancyManager;
+import org.apache.isis.extensions.secman.applib.user.man.mixins.ApplicationUserManager_newLocalUser.DomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+
+@Action(
+        domainEvent = DomainEvent.class,
+        semantics = SemanticsOf.IDEMPOTENT
+)
+@ActionLayout(
+        associateWith = "allTenancies",
+        sequence = "1"
+)
+@RequiredArgsConstructor
+public class ApplicationTenancyManager_newTenancy {
+
+    private final ApplicationTenancyManager target;
+
+    @Inject
+    private ApplicationTenancyRepository applicationTenancyRepository;
+
+    @MemberSupport public ApplicationTenancyManager act(
+            @Parameter(maxLength = ApplicationTenancy.Name.MAX_LENGTH)
+            @ParameterLayout(named = "Name", typicalLength = ApplicationTenancy.Name.TYPICAL_LENGTH)
+            final String name,
+            @Parameter(maxLength = ApplicationTenancy.Path.MAX_LENGTH)
+            @ParameterLayout(named = "Path")
+            final String path,
+            @Parameter(optionality = Optionality.OPTIONAL)
+            @ParameterLayout(named = "Parent")
+            final ApplicationTenancy parent) {
+        applicationTenancyRepository.newTenancy(name, path, parent);
+        return target;
+    }
+
+    @MemberSupport public Collection<ApplicationTenancy> choicesParent() {
+        return applicationTenancyRepository.allTenancies();
+    }
+
+}
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
index 9b68ce2..81bf932 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/menu/ApplicationTenancyMenu.java
@@ -35,9 +35,11 @@ import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy;
 import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancyRepository;
+import org.apache.isis.extensions.secman.applib.tenancy.man.ApplicationTenancyManager;
 
 @DomainService(
         nature = NatureOfService.VIEW,
@@ -55,6 +57,7 @@ public class ApplicationTenancyMenu {
     public static abstract class ActionDomainEvent<T> extends IsisModuleExtSecmanApplib.ActionDomainEvent<T> {}
 
     @Inject private ApplicationTenancyRepository applicationTenancyRepository;
+    @Inject private FactoryService factory;
 
 
     @ObjectSupport
@@ -62,13 +65,33 @@ public class ApplicationTenancyMenu {
         return "applicationTenancy";
     }
 
+    // -- TENANCY MANAGER
 
+    @Action(
+            domainEvent = tenancyManager.ActionEvent.class,
+            semantics = SemanticsOf.IDEMPOTENT
+    )
+    @ActionLayout(
+            sequence = "100.30.1",
+            cssClassFa = "globe"
+    )
+    public class tenancyManager{
+
+        public class ActionEvent extends ActionDomainEvent<tenancyManager> { }
+
+        @MemberSupport public ApplicationTenancyManager act(){
+            return factory.viewModel(new ApplicationTenancyManager());
+        }
+
+    }
+
+    // -- FIND TENANCIES
 
     @Action(
             domainEvent = findTenancies.ActionEvent.class,
             semantics = SemanticsOf.SAFE
             )
-    @ActionLayout(sequence = "100.30.1")
+    @ActionLayout(sequence = "100.30.2")
     public class findTenancies{
 
         public class ActionEvent extends ActionDomainEvent<findTenancies> {}
@@ -82,49 +105,4 @@ public class ApplicationTenancyMenu {
         }
     }
 
-
-
-    @Action(
-            domainEvent = newTenancy.ActionEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT
-            )
-    @ActionLayout(sequence = "100.30.3")
-    public class newTenancy{
-
-        public class ActionEvent extends ActionDomainEvent<newTenancy> {}
-
-        @MemberSupport public ApplicationTenancy act(
-                @Parameter(maxLength = ApplicationTenancy.Name.MAX_LENGTH)
-                @ParameterLayout(named = "Name", typicalLength = ApplicationTenancy.Name.TYPICAL_LENGTH)
-                final String name,
-                @Parameter(maxLength = ApplicationTenancy.Path.MAX_LENGTH)
-                @ParameterLayout(named = "Path")
-                final String path,
-                @Parameter(optionality = Optionality.OPTIONAL)
-                @ParameterLayout(named = "Parent")
-                final ApplicationTenancy parent) {
-            return applicationTenancyRepository.newTenancy(name, path, parent);
-        }
-
-        //FIXME[ISIS-2703] when not provided, MM validation should fail, but yet does not
-        @MemberSupport public Collection<ApplicationTenancy> choicesParent() {
-            return applicationTenancyRepository.allTenancies();
-        }
-
-    }
-
-
-    @Action(
-            domainEvent = allTenancies.ActionEvent.class,
-            semantics = SemanticsOf.SAFE)
-    @ActionLayout(sequence = "100.30.4")
-    public class allTenancies{
-
-        public class ActionEvent extends ActionDomainEvent<allTenancies> {}
-
-        @MemberSupport public Collection<? extends ApplicationTenancy> act() {
-            return applicationTenancyRepository.allTenancies();
-        }
-    }
-
 }
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
index b444dd9..c008fd4 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/menu/ApplicationUserMenu.java
@@ -65,25 +65,6 @@ public class ApplicationUserMenu {
         return "applicationUser";
     }
 
-    // -- FIND USERS
-
-    @Action(
-            domainEvent = findUsers.ActionEvent.class,
-            semantics = SemanticsOf.SAFE
-    )
-    @ActionLayout(sequence = "100.10.2")
-    public class findUsers{
-
-        public class ActionEvent
-                extends ActionDomainEvent<findUsers> { }
-
-        @MemberSupport public Collection<? extends ApplicationUser> act(
-                final @ParameterLayout(named = "Search") String search) {
-            return applicationUserRepository.find(search);
-        }
-
-    }
-
     // -- USER MANAGER
 
     @Action(
@@ -91,7 +72,7 @@ public class ApplicationUserMenu {
             semantics = SemanticsOf.IDEMPOTENT
     )
     @ActionLayout(
-            sequence = "100.10.3",
+            sequence = "100.10.1",
             cssClassFa = "user-plus"
     )
     public class userManager{
@@ -104,4 +85,23 @@ public class ApplicationUserMenu {
 
     }
 
+    // -- FIND USERS
+
+    @Action(
+            domainEvent = findUsers.ActionEvent.class,
+            semantics = SemanticsOf.SAFE
+    )
+    @ActionLayout(sequence = "100.10.2")
+    public class findUsers{
+
+        public class ActionEvent
+                extends ActionDomainEvent<findUsers> { }
+
+        @MemberSupport public Collection<? extends ApplicationUser> act(
+                final @ParameterLayout(named = "Search") String search) {
+            return applicationUserRepository.find(search);
+        }
+
+    }
+
 }
diff --git a/extensions/security/secman/integration/src/main/resources/images/ApplicationTenancyManager.png b/extensions/security/secman/integration/src/main/resources/images/ApplicationTenancyManager.png
new file mode 100644
index 0000000..eda74bf
Binary files /dev/null and b/extensions/security/secman/integration/src/main/resources/images/ApplicationTenancyManager.png differ