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

ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 8fef9b7c2ffcc916a83a90f933bc249d5e71c109
Author: Francesco Chicchiriccò <ilgro...@apache.org>
AuthorDate: Mon Jun 26 17:12:34 2023 +0200

    Fixing a few Console glitches
---
 ...irectoryPanelAdditionalActionLinksProvider.java | 13 +++++---
 .../status/ResourceStatusDirectoryPanel.java       |  4 +++
 .../ui/commons/status/ConnObjectWrapper.java       |  1 -
 .../client/ui/commons/wizards/any/AnyWrapper.java  |  2 +-
 .../ui/commons/wizards/any/EntityWrapper.java      |  6 ++--
 .../notifications/NotificationDirectoryPanel.java  | 28 +++++++----------
 .../console/notifications/NotificationWrapper.java | 30 ++++++++----------
 .../syncope/client/console/pages/Engagements.java  |  2 +-
 .../client/console/pages/Notifications.java        |  5 +--
 .../console/panels/AnyObjectDirectoryPanel.java    |  7 +++--
 .../client/console/panels/DirectoryPanel.java      |  6 +++-
 .../client/console/panels/GroupDirectoryPanel.java | 32 ++++++++++---------
 .../client/console/panels/RoleDirectoryPanel.java  |  7 ++---
 .../client/console/panels/UserDirectoryPanel.java  |  8 ++---
 .../client/console/tasks/PushTaskWrapper.java      | 16 +++++-----
 .../console/tasks/SchedTaskDirectoryPanel.java     |  1 -
 .../markup/html/form/ActionLinksTogglePanel.java   | 15 ++++-----
 .../wicket/markup/html/form/ActionPanel.java       | 36 ++++++++--------------
 .../client/console/wizards/DynRealmWrapper.java    | 20 +++++-------
 .../any/AnyObjectTemplateWizardBuilder.java        |  4 +--
 .../console/wizards/any/AnyWizardBuilder.java      | 13 +++++++-
 .../client/console/wizards/role/RoleWrapper.java   | 22 +++++--------
 .../panels/AccessTokenDirectoryPanel_it.properties |  2 +-
 .../AccessTokenDirectoryPanel_pt_BR.properties     |  2 +-
 .../panels/AccessTokenDirectoryPanel_ru.properties |  2 +-
 .../console/panels/RoleDirectoryPanel.properties   |  2 +-
 .../panels/RoleDirectoryPanel_fr_CA.properties     |  6 ++--
 .../panels/RoleDirectoryPanel_it.properties        |  2 +-
 .../panels/RoleDirectoryPanel_ja.properties        |  2 +-
 .../panels/RoleDirectoryPanel_pt_BR.properties     |  2 +-
 .../panels/RoleDirectoryPanel_ru.properties        |  2 +-
 31 files changed, 143 insertions(+), 157 deletions(-)

diff --git 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
index b3ce8a9d3c..8de1443759 100644
--- 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
+++ 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/commons/IdMAnyDirectoryPanelAdditionalActionLinksProvider.java
@@ -30,9 +30,12 @@ import 
org.apache.syncope.client.console.status.AnyStatusModal;
 import 
org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.Action;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wizards.any.AnyObjectWrapper;
+import org.apache.syncope.client.console.wizards.any.GroupWrapper;
 import 
org.apache.syncope.client.console.wizards.any.MergeLinkedAccountsWizardBuilder;
 import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
 import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
+import org.apache.syncope.client.ui.commons.wizards.any.UserWrapper;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -81,7 +84,7 @@ public class IdMAnyDirectoryPanelAdditionalActionLinksProvider
             @Override
             public void onClick(final AjaxRequestTarget target, final UserTO 
ignore) {
                 IModel<AnyWrapper<UserTO>> formModel = new 
CompoundPropertyModel<>(
-                        new AnyWrapper<>(model.getObject()));
+                        new UserWrapper(model.getObject()));
                 modal.setFormModel(formModel);
 
                 target.add(modal.setContent(new AnyStatusModal<>(
@@ -108,7 +111,7 @@ public class 
IdMAnyDirectoryPanelAdditionalActionLinksProvider
             public void onClick(final AjaxRequestTarget target, final UserTO 
ignore) {
                 
model.setObject(userRestClient.read(model.getObject().getKey()));
                 IModel<AnyWrapper<UserTO>> formModel = new 
CompoundPropertyModel<>(
-                        new AnyWrapper<>(model.getObject()));
+                        new UserWrapper(model.getObject()));
                 modal.setFormModel(formModel);
 
                 target.add(modal.setContent(new AnyStatusModal<>(
@@ -190,7 +193,7 @@ public class 
IdMAnyDirectoryPanelAdditionalActionLinksProvider
             @Override
             public void onClick(final AjaxRequestTarget target, final GroupTO 
ignore) {
                 IModel<AnyWrapper<GroupTO>> formModel = new 
CompoundPropertyModel<>(
-                        new AnyWrapper<>(modelObject));
+                        new GroupWrapper(modelObject));
                 modal.setFormModel(formModel);
 
                 target.add(modal.setContent(new AnyStatusModal<>(
@@ -231,8 +234,8 @@ public class 
IdMAnyDirectoryPanelAdditionalActionLinksProvider
 
             @Override
             public void onClick(final AjaxRequestTarget target, final 
AnyObjectTO ignore) {
-                final IModel<AnyWrapper<AnyObjectTO>> formModel = new 
CompoundPropertyModel<>(
-                        new AnyWrapper<>(modelObject));
+                IModel<AnyWrapper<AnyObjectTO>> formModel = new 
CompoundPropertyModel<>(
+                        new AnyObjectWrapper(modelObject));
                 modal.setFormModel(formModel);
 
                 target.add(modal.setContent(new AnyStatusModal<>(
diff --git 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
index 21854ead05..70da0537fe 100644
--- 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
+++ 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
@@ -206,6 +206,10 @@ public class ResourceStatusDirectoryPanel
             }
         }
 
+        synchronized (this) {
+            dataProvider = dataProvider();
+        }
+
         super.updateResultTable(target);
     }
 
diff --git 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/status/ConnObjectWrapper.java
 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/status/ConnObjectWrapper.java
index c5b8be70b3..3098b0fc27 100644
--- 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/status/ConnObjectWrapper.java
+++ 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/status/ConnObjectWrapper.java
@@ -49,5 +49,4 @@ public class ConnObjectWrapper implements Serializable {
     public ConnObject getConnObjectTO() {
         return connObjectTO;
     }
-
 }
diff --git 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AnyWrapper.java
 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AnyWrapper.java
index 482b4975e1..6fec895f0a 100644
--- 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AnyWrapper.java
+++ 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AnyWrapper.java
@@ -21,7 +21,7 @@ package org.apache.syncope.client.ui.commons.wizards.any;
 import java.io.Serializable;
 import org.apache.syncope.common.lib.to.AnyTO;
 
-public class AnyWrapper<T extends AnyTO> implements Serializable {
+public abstract class AnyWrapper<T extends AnyTO> implements Serializable {
 
     private static final long serialVersionUID = 8058288034211558375L;
 
diff --git 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/EntityWrapper.java
 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/EntityWrapper.java
index 6764049844..95bcd6523b 100644
--- 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/EntityWrapper.java
+++ 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/EntityWrapper.java
@@ -18,9 +18,12 @@
  */
 package org.apache.syncope.client.ui.commons.wizards.any;
 
+import java.io.Serializable;
 import org.apache.syncope.common.lib.to.EntityTO;
 
-public class EntityWrapper<T extends EntityTO> {
+public class EntityWrapper<T extends EntityTO> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
 
     protected final T entityTO;
 
@@ -31,5 +34,4 @@ public class EntityWrapper<T extends EntityTO> {
     public T getInnerObject() {
         return entityTO;
     }
-
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
index 5333be5137..b8d4758e81 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationDirectoryPanel.java
@@ -54,6 +54,7 @@ import 
org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import 
org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
@@ -80,7 +81,9 @@ public class NotificationDirectoryPanel
     protected final BaseModal<String> utilityModal = new 
BaseModal<>(Constants.OUTER);
 
     public NotificationDirectoryPanel(
-            final String id, final NotificationRestClient restClient, final 
PageReference pageRef) {
+            final String id,
+            final NotificationRestClient restClient,
+            final PageReference pageRef) {
 
         super(id, restClient, pageRef, true);
         disableCheckBoxes();
@@ -126,9 +129,9 @@ public class NotificationDirectoryPanel
 
     @Override
     public ActionsPanel<NotificationTO> getActions(final 
IModel<NotificationTO> model) {
-        final ActionsPanel<NotificationTO> panel = super.getActions(model);
+        ActionsPanel<NotificationTO> actions = super.getActions(model);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770645L;
 
@@ -140,21 +143,20 @@ public class NotificationDirectoryPanel
             }
         }, ActionLink.ActionType.EDIT, IdRepoEntitlement.NOTIFICATION_UPDATE);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770645L;
 
             @Override
             public void onClick(final AjaxRequestTarget target, final 
NotificationTO ignore) {
-                target.add(utilityModal.setContent(
-                        new NotificationTasks(model.getObject().getKey(), 
pageRef)));
+                target.add(utilityModal.setContent(new 
NotificationTasks(model.getObject().getKey(), pageRef)));
                 utilityModal.header(new 
StringResourceModel("notification.tasks", model));
                 utilityModal.show(true);
                 target.add(utilityModal);
             }
         }, ActionLink.ActionType.NOTIFICATION_TASKS, 
IdRepoEntitlement.TASK_LIST);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
 
@@ -172,7 +174,7 @@ public class NotificationDirectoryPanel
             }
         }, ActionLink.ActionType.DELETE, 
IdRepoEntitlement.NOTIFICATION_DELETE, true);
 
-        return panel;
+        return actions;
     }
 
     @Override
@@ -217,15 +219,7 @@ public class NotificationDirectoryPanel
 
         @Override
         public IModel<NotificationTO> model(final NotificationTO notification) 
{
-            return new IModel<>() {
-
-                private static final long serialVersionUID = 
774694801558497248L;
-
-                @Override
-                public NotificationTO getObject() {
-                    return notification;
-                }
-            };
+            return Model.of(notification);
         }
     }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
index 148c74b824..d2dcc47574 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.notifications;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -28,30 +27,29 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.ui.commons.wizards.any.EntityWrapper;
 import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.NotificationTO;
 
-public class NotificationWrapper implements Serializable {
+public class NotificationWrapper extends EntityWrapper<NotificationTO> {
 
     private static final long serialVersionUID = 8058288034211558376L;
 
-    private final NotificationTO notificationTO;
-
     private List<Pair<String, List<SearchClause>>> aboutClauses;
 
     private List<SearchClause> recipientClauses;
 
     public NotificationWrapper(final NotificationTO notificationTO) {
-        this.notificationTO = notificationTO;
+        super(notificationTO);
     }
 
     public final String getKey() {
-        return this.notificationTO.getKey();
+        return getInnerObject().getKey();
     }
 
     public List<Pair<String, List<SearchClause>>> getAboutClauses() {
         if (this.aboutClauses == null) {
-            this.aboutClauses = 
SearchUtils.getSearchClauses(this.notificationTO.getAbouts()).entrySet().stream().
+            this.aboutClauses = 
SearchUtils.getSearchClauses(getInnerObject().getAbouts()).entrySet().stream().
                     map(entry -> Pair.of(entry.getKey(), 
entry.getValue())).collect(Collectors.toList());
         }
 
@@ -64,7 +62,7 @@ public class NotificationWrapper implements Serializable {
 
     public List<SearchClause> getRecipientClauses() {
         if (this.recipientClauses == null) {
-            this.recipientClauses = 
SearchUtils.getSearchClauses(this.notificationTO.getRecipientsFIQL());
+            this.recipientClauses = 
SearchUtils.getSearchClauses(getInnerObject().getRecipientsFIQL());
         }
         return this.recipientClauses;
     }
@@ -75,7 +73,7 @@ public class NotificationWrapper implements Serializable {
 
     public Map<String, String> getAboutFIQLs() {
         if (CollectionUtils.isEmpty(this.aboutClauses) || 
this.aboutClauses.get(0).getValue().isEmpty()) {
-            return this.notificationTO.getAbouts();
+            return getInnerObject().getAbouts();
         } else {
             Map<String, String> res = new HashMap<>();
             for (Pair<String, List<SearchClause>> pair : this.aboutClauses) {
@@ -107,17 +105,13 @@ public class NotificationWrapper implements Serializable {
     }
 
     public NotificationTO fillAboutConditions() {
-        this.notificationTO.getAbouts().clear();
-        this.notificationTO.getAbouts().putAll(this.getAboutFIQLs());
-        return this.notificationTO;
+        getInnerObject().getAbouts().clear();
+        getInnerObject().getAbouts().putAll(this.getAboutFIQLs());
+        return getInnerObject();
     }
 
     public NotificationTO fillRecipientConditions() {
-        this.notificationTO.setRecipientsFIQL(this.getRecipientsFIQL());
-        return this.notificationTO;
-    }
-
-    public NotificationTO getInnerObject() {
-        return this.notificationTO;
+        getInnerObject().setRecipientsFIQL(this.getRecipientsFIQL());
+        return getInnerObject();
     }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Engagements.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Engagements.java
index 8be2495e98..5931f98915 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Engagements.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Engagements.java
@@ -61,7 +61,7 @@ public class Engagements extends BasePage {
         body.add(content);
     }
 
-    private List<ITab> buildTabList() {
+    protected List<ITab> buildTabList() {
         List<ITab> tabs = new ArrayList<>();
 
         tabs.add(new AbstractTab(new ResourceModel("schedTasks")) {
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Notifications.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Notifications.java
index 0eed8de5b0..72fc7eaf3c 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Notifications.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Notifications.java
@@ -52,8 +52,8 @@ public class Notifications extends BasePage {
         body.add(content);
     }
 
-    private List<ITab> buildTabList() {
-        final List<ITab> tabs = new ArrayList<>();
+    protected List<ITab> buildTabList() {
+        List<ITab> tabs = new ArrayList<>();
 
         tabs.add(new AbstractTab(new ResourceModel("notifications")) {
 
@@ -74,6 +74,7 @@ public class Notifications extends BasePage {
                 return new MailTemplateDirectoryPanel(panelId, 
notificationRestClient, getPageReference());
             }
         });
+
         return tabs;
     }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
index 91edad3a98..7586875332 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyObjectDirectoryPanel.java
@@ -34,6 +34,7 @@ import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
+import org.apache.syncope.client.console.wizards.any.AnyObjectWrapper;
 import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
 import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
@@ -117,7 +118,7 @@ public class AnyObjectDirectoryPanel extends 
AnyDirectoryPanel<AnyObjectTO, AnyO
             public void onClick(final AjaxRequestTarget target, final 
AnyObjectTO ignore) {
                 send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
                         new AjaxWizard.EditItemActionEvent<>(
-                                new 
AnyWrapper<>(restClient.read(model.getObject().getKey())), target));
+                                new 
AnyObjectWrapper(restClient.read(model.getObject().getKey())), target));
             }
         }, ActionType.EDIT,
                 String.format("%s,%s", AnyEntitlement.READ.getFor(type), 
AnyEntitlement.UPDATE.getFor(type))).
@@ -129,7 +130,7 @@ public class AnyObjectDirectoryPanel extends 
AnyDirectoryPanel<AnyObjectTO, AnyO
                     model.getObject(),
                     realm,
                     altDefaultModal,
-                    getString("any.edit", new Model<>(new 
AnyWrapper<>(model.getObject()))),
+                    getString("any.edit", new Model<>(new 
AnyObjectWrapper(model.getObject()))),
                     this,
                     pageRef).forEach(panel::add);
 
@@ -214,7 +215,7 @@ public class AnyObjectDirectoryPanel extends 
AnyDirectoryPanel<AnyObjectTO, AnyO
                 final AnyObjectTO clone = 
SerializationUtils.clone(model.getObject());
                 clone.setKey(null);
                 send(AnyObjectDirectoryPanel.this, Broadcast.EXACT,
-                        new AjaxWizard.NewItemActionEvent<>(new 
AnyWrapper<>(clone), target));
+                        new AjaxWizard.NewItemActionEvent<>(new 
AnyObjectWrapper(clone), target));
             }
 
             @Override
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
index 5bf64e8397..252c2b398f 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/DirectoryPanel.java
@@ -282,7 +282,11 @@ public abstract class DirectoryPanel<
     }
 
     protected void updateResultTable(final boolean create, final int rows) {
-        dataProvider = dataProvider();
+        synchronized (this) {
+            if (dataProvider == null) {
+                dataProvider = dataProvider();
+            }
+        }
 
         int currentPage = Optional.ofNullable(resultTable).
                 map(table -> (create ? (int) table.getPageCount() - 1 : (int) 
table.getCurrentPage())).orElse(0);
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
index 0b1627b4e4..8f6ebaa3b8 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/GroupDirectoryPanel.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import static 
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5IconTypeBuilder.FontAwesome5Brand.java;
+
 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 import java.io.Serializable;
 import java.util.List;
@@ -237,9 +239,9 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
 
     @Override
     public ActionsPanel<GroupTO> getActions(final IModel<GroupTO> model) {
-        final ActionsPanel<GroupTO> panel = super.getActions(model);
+        ActionsPanel<GroupTO> actions = super.getActions(model);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
@@ -253,7 +255,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 String.format("%s,%s", IdRepoEntitlement.GROUP_READ, 
IdRepoEntitlement.GROUP_UPDATE)).
                 setRealms(realm, model.getObject().getDynRealms());
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = 6242834621660352855L;
 
@@ -267,7 +269,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
         }, ActionType.TYPE_EXTENSIONS, IdRepoEntitlement.GROUP_UPDATE).
                 setRealms(realm, model.getObject().getDynRealms());
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770645L;
 
@@ -302,7 +304,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(target);
             }
         }.confirmMessage("confirmProvisionMembers");
-        panel.add(
+        actions.add(
                 provisionMembers,
                 ActionType.PROVISION_MEMBERS,
                 String.format("%s,%s", IdRepoEntitlement.TASK_CREATE, 
IdRepoEntitlement.TASK_EXECUTE),
@@ -325,7 +327,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 ((BasePage) 
pageRef.getPage()).getNotificationPanel().refresh(target);
             }
         }.confirmMessage("confirmDeprovisionMembers");
-        panel.add(
+        actions.add(
                 deprovisionMembers,
                 ActionType.DEPROVISION_MEMBERS,
                 String.format("%s,%s", IdRepoEntitlement.TASK_CREATE, 
IdRepoEntitlement.TASK_EXECUTE),
@@ -335,11 +337,11 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 model.getObject(),
                 realm,
                 altDefaultModal,
-                getString("any.edit", new Model<>(new 
AnyWrapper<>(model.getObject()))),
+                getString("any.edit", new Model<>(new 
GroupWrapper(model.getObject()))),
                 this,
-                pageRef).forEach(panel::add);
+                pageRef).forEach(actions::add);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
@@ -352,7 +354,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
             }
         }, ActionType.PROPAGATION_TASKS, IdRepoEntitlement.TASK_LIST);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
@@ -365,7 +367,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
             }
         }, ActionType.NOTIFICATION_TASKS, IdRepoEntitlement.TASK_LIST);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -2878723352517770644L;
 
@@ -402,7 +404,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 }));
 
                 altDefaultModal.header(new Model<>(
-                        getString("auditHistory.title", new Model<>(new 
AnyWrapper<>(model.getObject())))));
+                        getString("auditHistory.title", new Model<>(new 
GroupWrapper(model.getObject())))));
 
                 altDefaultModal.show(true);
             }
@@ -410,7 +412,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
                 String.format("%s,%s", IdRepoEntitlement.GROUP_READ, 
IdRepoEntitlement.AUDIT_LIST)).
                 setRealms(realm, model.getObject().getDynRealms());
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = 6242834621660352855L;
 
@@ -428,7 +430,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
             }
         }, ActionType.CLONE, IdRepoEntitlement.GROUP_CREATE).setRealm(realm);
 
-        panel.add(new ActionLink<>() {
+        actions.add(new ActionLink<>() {
 
             private static final long serialVersionUID = -7978723352517770644L;
 
@@ -451,7 +453,7 @@ public class GroupDirectoryPanel extends 
AnyDirectoryPanel<GroupTO, GroupRestCli
             }
         }, ActionType.DELETE, IdRepoEntitlement.GROUP_DELETE, 
true).setRealm(realm);
 
-        return panel;
+        return actions;
     }
 
     public static class Builder extends AnyDirectoryPanel.Builder<GroupTO, 
GroupRestClient> {
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
index 9214e2931f..c2eb5aefb2 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RoleDirectoryPanel.java
@@ -178,11 +178,8 @@ public class RoleDirectoryPanel extends 
DirectoryPanel<RoleTO, RoleWrapper, Role
                         layout.getAnyPanelClass(), BaseModal.CONTENT_ID, 
userType, null, layout, false, pageRef).
                         build((id, anyTypeTO, realmTO, anyLayout, pageRef) -> {
 
-                            String query = 
SyncopeClient.getUserSearchConditionBuilder().and(
-                                    
SyncopeClient.getUserSearchConditionBuilder().inRoles(model.getObject().getKey()),
-                                    
SyncopeClient.getUserSearchConditionBuilder().
-                                            
is(Constants.KEY_FIELD_NAME).notNullValue()).
-                                    query();
+                            String query = 
SyncopeClient.getUserSearchConditionBuilder().
+                                    
inRoles(model.getObject().getKey()).query();
 
                             Panel panel = new UserDirectoryPanel.Builder(
                                     
anyTypeClassRestClient.list(anyTypeTO.getClasses()),
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
index 8d3988d388..25fdfc1303 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/UserDirectoryPanel.java
@@ -180,7 +180,7 @@ public class UserDirectoryPanel extends 
AnyDirectoryPanel<UserTO, UserRestClient
                 public void onClick(final AjaxRequestTarget target, final 
UserTO ignore) {
                     
model.setObject(restClient.read(model.getObject().getKey()));
                     IModel<AnyWrapper<UserTO>> formModel = new 
CompoundPropertyModel<>(
-                            new AnyWrapper<>(model.getObject()));
+                            new UserWrapper(model.getObject()));
                     displayAttributeModal.setFormModel(formModel);
 
                     target.add(displayAttributeModal.setContent(new 
ChangePasswordModal(
@@ -189,7 +189,7 @@ public class UserDirectoryPanel extends 
AnyDirectoryPanel<UserTO, UserRestClient
                             pageRef)));
 
                     displayAttributeModal.header(new Model<>(
-                            getString("any.edit", new Model<>(new 
AnyWrapper<>(model.getObject())))));
+                            getString("any.edit", new Model<>(new 
UserWrapper(model.getObject())))));
 
                     displayAttributeModal.size(Modal.Size.Large);
                     displayAttributeModal.show(true);
@@ -225,7 +225,7 @@ public class UserDirectoryPanel extends 
AnyDirectoryPanel<UserTO, UserRestClient
                     model,
                     realm,
                     altDefaultModal,
-                    getString("any.edit", new Model<>(new 
AnyWrapper<>(model.getObject()))),
+                    getString("any.edit", new Model<>(new 
UserWrapper(model.getObject()))),
                     this,
                     pageRef).forEach(panel::add);
 
@@ -306,7 +306,7 @@ public class UserDirectoryPanel extends 
AnyDirectoryPanel<UserTO, UserRestClient
                     }));
 
                     altDefaultModal.header(new Model<>(
-                            getString("auditHistory.title", new Model<>(new 
AnyWrapper<>(model.getObject())))));
+                            getString("auditHistory.title", new Model<>(new 
UserWrapper(model.getObject())))));
 
                     altDefaultModal.show(true);
                 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
index 69e3e170fa..f4bc94a670 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
@@ -18,32 +18,30 @@
  */
 package org.apache.syncope.client.console.tasks;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.ui.commons.wizards.any.EntityWrapper;
 import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.PushTaskTO;
 
-public class PushTaskWrapper implements Serializable {
+public class PushTaskWrapper extends EntityWrapper<PushTaskTO> {
 
     private static final long serialVersionUID = 8058288034211558377L;
 
-    private final PushTaskTO pushTaskTO;
-
     private Map<String, List<SearchClause>> filterClauses;
 
     public PushTaskWrapper(final PushTaskTO pushTaskTO) {
-        this.pushTaskTO = pushTaskTO;
+        super(pushTaskTO);
         getFilterClauses();
     }
 
     public final Map<String, List<SearchClause>> getFilterClauses() {
         if (this.filterClauses == null) {
-            this.filterClauses = 
SearchUtils.getSearchClauses(this.pushTaskTO.getFilters());
+            this.filterClauses = 
SearchUtils.getSearchClauses(getInnerObject().getFilters());
         }
         return this.filterClauses;
     }
@@ -79,8 +77,8 @@ public class PushTaskWrapper implements Serializable {
     }
 
     public PushTaskTO fillFilterConditions() {
-        this.pushTaskTO.getFilters().clear();
-        this.pushTaskTO.getFilters().putAll(this.getFilters());
-        return this.pushTaskTO;
+        getInnerObject().getFilters().clear();
+        getInnerObject().getFilters().putAll(this.getFilters());
+        return getInnerObject();
     }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
index dfba0a364a..1f052d495a 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskDirectoryPanel.java
@@ -277,7 +277,6 @@ public abstract class SchedTaskDirectoryPanel<T extends 
SchedTaskTO>
 
             @Override
             public void onClick(final AjaxRequestTarget target, final T 
ignore) {
-                SchedTaskDirectoryPanel.this.getTogglePanel().close(target);
                 send(SchedTaskDirectoryPanel.this, Broadcast.EXACT,
                         new AjaxWizard.EditItemActionEvent<>(
                                 restClient.readTask(taskType, 
model.getObject().getKey()),
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
index 68e3f86f36..2935f55f5a 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksTogglePanel.java
@@ -27,9 +27,10 @@ import org.apache.syncope.client.console.panels.TogglePanel;
 import org.apache.syncope.client.console.panels.ToggleableTarget;
 import org.apache.syncope.client.console.policies.PolicyRuleWrapper;
 import org.apache.syncope.client.console.tasks.CommandWrapper;
+import org.apache.syncope.client.console.wizards.any.AnyObjectWrapper;
 import org.apache.syncope.client.console.wizards.any.GroupWrapper;
 import org.apache.syncope.client.ui.commons.status.StatusBean;
-import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
+import org.apache.syncope.client.ui.commons.wizards.any.EntityWrapper;
 import org.apache.syncope.client.ui.commons.wizards.any.UserWrapper;
 import org.apache.syncope.common.keymaster.client.api.model.Domain;
 import org.apache.syncope.common.lib.Attr;
@@ -72,9 +73,7 @@ public class ActionLinksTogglePanel<T extends Serializable> 
extends TogglePanel<
 
     public void updateHeader(final AjaxRequestTarget target, final 
Serializable modelObject) {
         final String header;
-        if (modelObject == null) {
-            header = new ResourceModel("actions", 
StringUtils.EMPTY).getObject();
-        } else if (modelObject instanceof UserTO) {
+        if (modelObject instanceof UserTO) {
             header = ((UserTO) modelObject).getUsername();
         } else if (modelObject instanceof UserWrapper) {
             header = ((UserWrapper) 
modelObject).getInnerObject().getUsername();
@@ -84,9 +83,8 @@ public class ActionLinksTogglePanel<T extends Serializable> 
extends TogglePanel<
             header = ((GroupWrapper) modelObject).getInnerObject().getName();
         } else if (modelObject instanceof AnyObjectTO) {
             header = ((AnyObjectTO) modelObject).getName();
-        } else if (modelObject instanceof AnyWrapper
-                && AnyWrapper.class.cast(modelObject).getInnerObject() 
instanceof AnyObjectTO) {
-            header = ((AnyObjectTO) ((AnyWrapper) 
modelObject).getInnerObject()).getName();
+        } else if (modelObject instanceof AnyObjectWrapper) {
+            header = ((AnyObjectWrapper) 
modelObject).getInnerObject().getName();
         } else if (modelObject instanceof Attr) {
             header = ((Attr) modelObject).getSchema();
         } else if (modelObject instanceof ConfParam) {
@@ -118,6 +116,9 @@ public class ActionLinksTogglePanel<T extends Serializable> 
extends TogglePanel<
             header = ((NamedEntityTO) modelObject).getName();
         } else if (modelObject instanceof EntityTO) {
             header = ((EntityTO) modelObject).getKey();
+        } else if (modelObject instanceof EntityWrapper) {
+            EntityTO inner = ((EntityWrapper) modelObject).getInnerObject();
+            header = inner instanceof NamedEntityTO ? ((NamedEntityTO) 
inner).getName() : inner.getKey();
         } else {
             header = new ResourceModel("actions", 
StringUtils.EMPTY).getObject();
         }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
index 5cce59c6ab..3a33c3bafa 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionPanel.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.client.console.wicket.markup.html.form;
 
 import java.io.Serializable;
+import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import 
org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
@@ -62,15 +63,10 @@ public final class ActionPanel<T extends Serializable> 
extends Panel {
         setOutputMarkupId(true);
         this.action = action;
 
-        final T obj;
-        if (model == null) {
-            obj = null;
-        } else {
-            obj = model.getObject();
-        }
+        T obj = Optional.ofNullable(model).map(IModel::getObject).orElse(null);
 
-        final boolean enabled;
-        final AbstractLink actionLink;
+        boolean enabled;
+        AbstractLink actionLink;
 
         if (action.getLink() == null || action.getType() == 
ActionType.NOT_FOUND) {
             enabled = true;
@@ -145,14 +141,14 @@ public final class ActionPanel<T extends Serializable> 
extends Panel {
         actionIcon = new Label("actionIcon", "");
         actionLink.add(actionIcon);
 
-        final String clazz = action.getType().name().toLowerCase() + ".class";
+        String clazz = action.getType().name().toLowerCase() + ".class";
         actionIcon.add(new AttributeModifier("class", new ResourceModel(clazz, 
clazz)));
 
-        final String title = action.getType().name().toLowerCase() + ".title";
-        final IModel<String> titleModel = new ResourceModel(title, title);
+        String title = action.getType().name().toLowerCase() + ".title";
+        IModel<String> titleModel = new ResourceModel(title, title);
         actionIcon.add(new AttributeModifier("title", titleModel));
 
-        final String alt = action.getType().name().toLowerCase() + ".alt";
+        String alt = action.getType().name().toLowerCase() + ".alt";
         actionIcon.add(new AttributeModifier("alt", new ResourceModel(alt, 
alt)));
 
         actionLabel = new Label("label", titleModel);
@@ -164,21 +160,13 @@ public final class ActionPanel<T extends Serializable> 
extends Panel {
         // ---------------------------
         actionLabel.setVisible(action.isVisibleLabel());
 
-        if (action.getLabel() != null) {
-            actionLabel.setDefaultModel(action.getLabel());
-        }
+        
Optional.ofNullable(action.getLabel()).ifPresent(actionLabel::setDefaultModel);
 
-        if (action.getTitle() != null) {
-            actionIcon.add(new AttributeModifier("title", action.getTitle()));
-        }
+        Optional.ofNullable(action.getTitle()).ifPresent(t -> 
actionIcon.add(new AttributeModifier("title", t)));
 
-        if (action.getAlt() != null) {
-            actionIcon.add(new AttributeModifier("alt", action.getAlt()));
-        }
+        Optional.ofNullable(action.getAlt()).ifPresent(a -> actionIcon.add(new 
AttributeModifier("alt", a)));
 
-        if (action.getIcon() != null) {
-            actionIcon.add(new AttributeModifier("class", action.getIcon()));
-        }
+        Optional.ofNullable(action.getIcon()).ifPresent(i -> 
actionIcon.add(new AttributeModifier("class", i)));
 
         this.disableIndicator = !action.hasIndicator();
         // ---------------------------
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
index 13caee27d6..ce16a7f8f7 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/DynRealmWrapper.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.wizards;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,26 +25,25 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.ui.commons.wizards.any.EntityWrapper;
 import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.DynRealmTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
-public class DynRealmWrapper implements Serializable {
+public class DynRealmWrapper extends EntityWrapper<DynRealmTO> {
 
     private static final long serialVersionUID = 7226128615964284614L;
 
-    private final DynRealmTO dynRealmTO;
-
     private Map<String, List<SearchClause>> dynClauses;
 
     public DynRealmWrapper(final DynRealmTO dynRealmTO) {
-        this.dynRealmTO = dynRealmTO;
+        super(dynRealmTO);
         getDynClauses();
     }
 
     public final Map<String, List<SearchClause>> getDynClauses() {
         if (this.dynClauses == null) {
-            this.dynClauses = 
SearchUtils.getSearchClauses(this.dynRealmTO.getDynMembershipConds());
+            this.dynClauses = 
SearchUtils.getSearchClauses(getInnerObject().getDynMembershipConds());
         }
         return this.dynClauses;
     }
@@ -78,12 +76,8 @@ public class DynRealmWrapper implements Serializable {
     }
 
     public DynRealmTO fillDynamicConditions() {
-        this.dynRealmTO.getDynMembershipConds().clear();
-        
this.dynRealmTO.getDynMembershipConds().putAll(this.getDynMembershipConds());
-        return this.dynRealmTO;
-    }
-
-    public DynRealmTO getInnerObject() {
-        return this.dynRealmTO;
+        getInnerObject().getDynMembershipConds().clear();
+        
getInnerObject().getDynMembershipConds().putAll(this.getDynMembershipConds());
+        return getInnerObject();
     }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
index b19abc06a9..709626917a 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectTemplateWizardBuilder.java
@@ -50,7 +50,7 @@ public class AnyObjectTemplateWizardBuilder extends 
AnyObjectWizardBuilder
         this.templatable = templatable;
 
         if (templatable.getTemplates().containsKey(anyType)) {
-            setItem(new 
AnyWrapper<>(AnyObjectTO.class.cast(templatable.getTemplates().get(anyType))));
+            setItem(new 
AnyObjectWrapper(AnyObjectTO.class.cast(templatable.getTemplates().get(anyType))));
         } else {
             AnyObjectTO anyObjectTO = new AnyObjectTO();
             anyObjectTO.setType(anyType);
@@ -58,7 +58,7 @@ public class AnyObjectTemplateWizardBuilder extends 
AnyObjectWizardBuilder
                 anyObjectTO.setRealm(
                         String.format("'%s'", 
RealmsUtils.getFullPath(RealmTO.class.cast(templatable).getFullPath())));
             }
-            setItem(new AnyWrapper<>(anyObjectTO));
+            setItem(new AnyObjectWrapper(anyObjectTO));
         }
     }
 
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index a394edf827..b02247bc98 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -36,9 +36,11 @@ import 
org.apache.syncope.client.ui.commons.wizards.any.AnyForm;
 import org.apache.syncope.client.ui.commons.wizards.any.AnyWrapper;
 import org.apache.syncope.client.ui.commons.wizards.any.UserWrapper;
 import org.apache.syncope.common.lib.Attr;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
+import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
 
@@ -46,6 +48,15 @@ public abstract class AnyWizardBuilder<A extends AnyTO> 
extends AbstractAnyWizar
 
     private static final long serialVersionUID = -2480279868319546243L;
 
+    @SuppressWarnings("unchecked")
+    protected static <T extends AnyTO> AnyWrapper<T> wrapper(final T anyTO) {
+        return (AnyWrapper<T>) (anyTO instanceof UserTO
+                ? new UserWrapper((UserTO) anyTO)
+                : anyTO instanceof GroupTO
+                        ? new GroupWrapper((GroupTO) anyTO)
+                        : new AnyObjectWrapper((AnyObjectTO) anyTO));
+    }
+
     protected final List<String> anyTypeClasses;
 
     protected AbstractAnyFormLayout<A, ? extends AnyForm<A>> formLayoutInfo;
@@ -64,7 +75,7 @@ public abstract class AnyWizardBuilder<A extends AnyTO> 
extends AbstractAnyWizar
             final AbstractAnyFormLayout<A, ? extends AnyForm<A>> 
formLayoutInfo,
             final PageReference pageRef) {
 
-        super(new AnyWrapper<>(anyTO), pageRef);
+        super(wrapper(anyTO), pageRef);
         this.anyTypeClasses = anyTypeClasses;
         this.formLayoutInfo = formLayoutInfo;
     }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
index 70cfb999ff..03ba628f51 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWrapper.java
@@ -18,30 +18,28 @@
  */
 package org.apache.syncope.client.console.wizards.role;
 
-import java.io.Serializable;
 import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.ui.commons.wizards.any.EntityWrapper;
 import org.apache.syncope.common.lib.to.RoleTO;
 
-public class RoleWrapper implements Serializable {
+public class RoleWrapper extends EntityWrapper<RoleTO> {
 
     private static final long serialVersionUID = 8058288034211558376L;
 
-    private final RoleTO roleTO;
-
     private List<SearchClause> dynClauses;
 
     public RoleWrapper(final RoleTO roleTO) {
-        this.roleTO = roleTO;
+        super(roleTO);
         getDynClauses();
     }
 
     public final List<SearchClause> getDynClauses() {
         if (this.dynClauses == null) {
-            this.dynClauses = 
SearchUtils.getSearchClauses(this.roleTO.getDynMembershipCond());
+            this.dynClauses = 
SearchUtils.getSearchClauses(getInnerObject().getDynMembershipCond());
         }
         return this.dynClauses;
     }
@@ -53,17 +51,13 @@ public class RoleWrapper implements Serializable {
     public String getDynMembershipCond() {
         if (CollectionUtils.isEmpty(this.dynClauses)) {
             return null;
-        } else {
-            return SearchUtils.buildFIQL(this.dynClauses, 
SyncopeClient.getUserSearchConditionBuilder());
         }
-    }
 
-    public RoleTO fillDynamicConditions() {
-        this.roleTO.setDynMembershipCond(this.getDynMembershipCond());
-        return this.roleTO;
+        return SearchUtils.buildFIQL(this.dynClauses, 
SyncopeClient.getUserSearchConditionBuilder());
     }
 
-    public RoleTO getInnerObject() {
-        return this.roleTO;
+    public RoleTO fillDynamicConditions() {
+        getInnerObject().setDynMembershipCond(this.getDynMembershipCond());
+        return getInnerObject();
     }
 }
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_it.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_it.properties
index abd2ed82e6..c59b128e78 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_it.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_it.properties
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=Modifica ruolo ${roleTO.key}
+any.edit=Modifica token di accesso ${accessTokenTO.owner}
 any.new=Nuovo token di accesso
 owner=Proprietario
 expirationTime=Termine
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_pt_BR.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_pt_BR.properties
index 34245133fa..34ea148f6e 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_pt_BR.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_pt_BR.properties
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=Alterar fun\u00e7\u00e3o ${roleTO.key}
+any.edit=Edit access token ${accessTokenTO.owner}
 any.new=Novo token de acesso
 owner=Propriet\u00e1rio
 expirationTime=Termo
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_ru.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_ru.properties
index d6ff9be932..63fc14bcc7 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_ru.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/AccessTokenDirectoryPanel_ru.properties
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c 
\u0440\u043e\u043b\u044c ${roleTO.key}
+any.edit=Edit access token ${accessTokenTO.owner}
 any.new=\u041d\u043e\u0432\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 
\u0434\u043e\u0441\u0442\u0443\u043f\u0430
 owner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446
 expirationTime=\u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0435 
\u0441\u0440\u043e\u043a\u0430
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel.properties
index 3a27730cea..44b2c2716b 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=Edit role ${roleTO.key}
+any.edit=Edit role ${innerObject.key}
 any.new=New role
 role.members=Role '${key}' members
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_fr_CA.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_fr_CA.properties
index 8f6a85dae3..52f3caa57f 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_fr_CA.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_fr_CA.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=Modifier r�le ${roleTO.key}
-any.new=Nouveau r�le
-role.members=Membres r�le '${key}'
+any.edit=Modifier r\u00f4le ${innerObject.key}
+any.new=Nouveau r\u00f4le
+role.members=Membres r\u00f4le '${key}'
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_it.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_it.properties
index 04a466ee5a..3d76a1ca77 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_it.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_it.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=Modifica ruolo ${roleTO.key}
+any.edit=Modifica ruolo ${innerObject.key}
 any.new=Nuovo ruolo
 role.members=Utenti membri del rulo '${key}'
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ja.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ja.properties
index 12cabbc484..6cbef33f88 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ja.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ja.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=\u30ed\u30fc\u30eb ${roleTO.key} \u3092\u7de8\u96c6
+any.edit=\u30ed\u30fc\u30eb ${innerObject.key} \u3092\u7de8\u96c6
 any.new=\u65b0\u3057\u3044\u30ed\u30fc\u30eb
 role.members=\u30ed\u30fc\u30eb '${key}' \u30e1\u30f3\u30d0\u30fc
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_pt_BR.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_pt_BR.properties
index 1de6e43c02..110128e430 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_pt_BR.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_pt_BR.properties
@@ -14,6 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-any.edit=Alterar fun\u00e7\u00e3o ${roleTO.key}
+any.edit=Alterar fun\u00e7\u00e3o ${innerObject.key}
 any.new=Novo fun\u00e7\u00e3o
 role.members=Role '${key}' members
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ru.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ru.properties
index b292ea7ecb..d2b37cdc28 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ru.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RoleDirectoryPanel_ru.properties
@@ -15,6 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c 
\u0440\u043e\u043b\u044c ${roleTO.key}
+any.edit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c 
\u0440\u043e\u043b\u044c ${innerObject.key}
 any.new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u043b\u044c
 role.members=\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 
\u0440\u043e\u043b\u0438 '${key}'

Reply via email to