You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2020/04/17 13:30:56 UTC

[syncope] 01/02: White noise: cleanup and small improvements

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

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

commit f2bc720bfc0871396a4fb8592b05a42d5a0a3dfb
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Apr 17 14:26:07 2020 +0200

    White noise: cleanup and small improvements
---
 .../status/ResourceStatusDirectoryPanel.java       |   2 +-
 .../commons/markup/html/form/AjaxPalettePanel.java | 193 ++++++++++++---------
 .../commons/markup/html/form/NonI18nPalette.java   |  13 +-
 .../console/notifications/NotificationWrapper.java |   2 +-
 .../syncope/client/console/panels/BeanPanel.java   |   7 +-
 .../client/console/panels/search/SearchUtils.java  |   7 +-
 .../client/console/reports/ReportletWrapper.java   |   4 +-
 .../client/console/tasks/PushTaskWrapper.java      |   2 +-
 .../client/console/wizards/DynRealmWrapper.java    |   3 +-
 .../syncope/client/console/wizards/any/Groups.java |   8 +-
 .../console/implementations/MyPushActions.groovy   |   2 +-
 11 files changed, 132 insertions(+), 111 deletions(-)

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 c85f488..8872e09 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
@@ -240,7 +240,7 @@ public class ResourceStatusDirectoryPanel
                 fiql = null;
                 restClient = null;
             } else {
-                AbstractFiqlSearchConditionBuilder bld;
+                AbstractFiqlSearchConditionBuilder<?, ?, ?> bld;
                 switch (type) {
                     case "USER":
                         bld = SyncopeClient.getUserSearchConditionBuilder();
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.java
index 1e48f35..339bea7 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/AjaxPalettePanel.java
@@ -21,11 +21,13 @@ package org.apache.syncope.client.ui.commons.markup.html.form;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.ui.commons.Constants;
@@ -52,24 +54,24 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
     protected Palette<T> palette;
 
-    private final Model<String> queryFilter = new Model<>(StringUtils.EMPTY);
+    protected final Model<String> queryFilter = new Model<>(StringUtils.EMPTY);
 
-    private final List<T> availableBefore = new ArrayList<>();
+    protected final List<T> availableBefore = new ArrayList<>();
 
     private final LoadableDetachableModel<List<T>> choicesModel;
 
     public AjaxPalettePanel(
-            final String id, final IModel<List<T>> model, final Builder.Query<T> choices, final Builder<T> builder) {
+            final String id, final IModel<List<T>> model, final Builder.Query<T> query, final Builder<T> builder) {
 
         super(id, builder.name == null ? id : builder.name, model);
 
-        choicesModel = new PaletteLoadableDetachableModel() {
+        choicesModel = new PaletteLoadableDetachableModel(builder) {
 
             private static final long serialVersionUID = -108100712154481840L;
 
             @Override
             protected List<T> getChoices() {
-                return choices.execute(queryFilter.getObject());
+                return query.execute(queryFilter.getObject());
             }
         };
         initialize(model, builder);
@@ -79,7 +81,7 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
             final String id, final IModel<List<T>> model, final IModel<List<T>> choices, final Builder<T> builder) {
         super(id, builder.name == null ? id : builder.name, model);
 
-        choicesModel = new PaletteLoadableDetachableModel() {
+        choicesModel = new PaletteLoadableDetachableModel(builder) {
 
             private static final long serialVersionUID = -108100712154481840L;
 
@@ -93,10 +95,39 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
         initialize(model, builder);
     }
 
-    private void initialize(final IModel<List<T>> model, final Builder<T> builder) {
+    protected void initialize(final IModel<List<T>> model, final Builder<T> builder) {
         setOutputMarkupId(true);
 
-        this.palette = new NonI18nPalette<T>(
+        palette = buildPalette(model, builder);
+        add(palette.setLabel(new ResourceModel(name)).setOutputMarkupId(true));
+
+        Form<?> form = new Form<>("form");
+        add(form.setEnabled(builder.filtered).setVisible(builder.filtered));
+
+        queryFilter.setObject(builder.filter);
+        AjaxTextFieldPanel filter = new AjaxTextFieldPanel("filter", "filter", queryFilter, false);
+        form.add(filter.hideLabel().setOutputMarkupId(true));
+
+        AjaxButton search = new AjaxButton("search") {
+
+            private static final long serialVersionUID = 8390605330558248736L;
+
+            @Override
+            protected void onSubmit(final AjaxRequestTarget target) {
+                if (builder.warnIfEmptyFilter && StringUtils.isEmpty(queryFilter.getObject())) {
+                    Session.get().info(getString("nomatch"));
+                    ((BaseWebPage) getPage()).getNotificationPanel().refresh(target);
+                }
+
+                target.add(palette);
+            }
+        };
+        search.setOutputMarkupId(true);
+        form.add(search);
+    }
+
+    protected Palette<T> buildPalette(final IModel<List<T>> model, final Builder<T> builder) {
+        return new NonI18nPalette<T>(
                 "paletteField", model, choicesModel, builder.renderer, 8, builder.allowOrder, builder.allowMoveAll) {
 
             private static final long serialVersionUID = -3074655279011678437L;
@@ -119,14 +150,13 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
                     @Override
                     public List<T> getUnselectedList() {
-                        final IChoiceRenderer<? super T> renderer = getPalette().getChoiceRenderer();
-                        final Collection<? extends T> choices = getPalette().getChoices();
-                        final List<T> unselected = new ArrayList<>(choices.size());
-                        final List<String> ids = List.of(getValue().split(","));
+                        IChoiceRenderer<? super T> renderer = getChoiceRenderer();
+                        Collection<? extends T> choices = getChoices();
 
+                        List<String> ids = builder.idExtractor.apply(getValue()).collect(Collectors.toList());
+                        List<T> unselected = new ArrayList<>(choices.size());
                         choices.forEach(choice -> {
-                            final String choiceId = renderer.getIdValue(choice, 0);
-                            if (!ids.contains(choiceId)) {
+                            if (!ids.contains(renderer.getIdValue(choice, 0))) {
                                 unselected.add(choice);
                             }
                         });
@@ -136,26 +166,22 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
                     @Override
                     public List<T> getSelectedList() {
-                        final IChoiceRenderer<? super T> renderer = getPalette().getChoiceRenderer();
-                        final Collection<? extends T> choices = getPalette().getChoices();
-                        final List<T> selected = new ArrayList<>(choices.size());
+                        IChoiceRenderer<? super T> renderer = getChoiceRenderer();
+                        Collection<? extends T> choices = getChoices();
 
                         // reduce number of method calls by building a lookup table
-                        final Map<T, String> idForChoice = new HashMap<>(choices.size());
-                        choices.forEach(choice -> idForChoice.put(choice, renderer.getIdValue(choice, 0)));
+                        Map<T, String> idForChoice = choices.stream().collect(Collectors.toMap(
+                                Function.identity(), choice -> renderer.getIdValue(choice, 0), (c1, c2) -> c1));
 
-                        final String value = getValue();
-                        int start = value.indexOf(';') + 1;
-
-                        for (final String id : Strings.split(value.substring(start), ',')) {
-                            for (final T choice : choices) {
-                                final String idValue = idForChoice.get(choice);
-                                if (id.equals(idValue)) {
+                        List<T> selected = new ArrayList<>(choices.size());
+                        builder.idExtractor.apply(getValue()).forEach(id -> {
+                            for (T choice : choices) {
+                                if (id.equals(idForChoice.get(choice))) {
                                     selected.add(choice);
                                     break;
                                 }
                             }
-                        }
+                        });
 
                         return selected;
                     }
@@ -172,33 +198,18 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
                 return recorder;
             }
-        };
-
-        add(palette.setLabel(new ResourceModel(name)).setOutputMarkupId(true));
-
-        Form<?> form = new Form<>("form");
-        add(form.setEnabled(builder.filtered).setVisible(builder.filtered));
-
-        queryFilter.setObject(builder.filter);
-        AjaxTextFieldPanel filter = new AjaxTextFieldPanel("filter", "filter", queryFilter, false);
-        form.add(filter.hideLabel().setOutputMarkupId(true).setRenderBodyOnly(true));
-
-        AjaxButton search = new AjaxButton("search") {
-
-            private static final long serialVersionUID = 8390605330558248736L;
 
             @Override
-            protected void onSubmit(final AjaxRequestTarget target) {
-                if (builder.warnIfEmptyFilter && StringUtils.isEmpty(queryFilter.getObject())) {
-                    Session.get().info(getString("nomatch"));
-                    ((BaseWebPage) getPage()).getNotificationPanel().refresh(target);
-                }
-
-                target.add(palette);
+            protected Map<String, String> getAdditionalAttributes(final Object choice) {
+                return builder.additionalAttributes == null
+                        ? super.getAdditionalAttributes(choice)
+                        : builder.additionalAttributes.apply(choice);
             }
         };
-        search.setOutputMarkupId(true);
-        form.add(search);
+    }
+
+    public Recorder<T> getRecorderComponent() {
+        return palette.getRecorderComponent();
     }
 
     public LoadableDetachableModel<List<T>> getChoicesModel() {
@@ -235,30 +246,28 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
         private static final long serialVersionUID = 991248996001040352L;
 
-        private IChoiceRenderer<T> renderer;
+        protected String name;
 
-        private boolean allowOrder;
+        protected IChoiceRenderer<T> renderer = new SelectChoiceRenderer<>();
 
-        private boolean allowMoveAll;
+        protected boolean allowOrder;
 
-        private String selectedLabel;
+        protected boolean allowMoveAll;
 
-        private String availableLabel;
+        protected String selectedLabel;
 
-        private boolean filtered;
+        protected String availableLabel;
 
-        private String filter = "*";
+        protected boolean filtered;
 
-        private boolean warnIfEmptyFilter = true;
+        protected String filter = "*";
 
-        private String name;
+        protected boolean warnIfEmptyFilter = true;
 
-        public Builder() {
-            this.allowMoveAll = false;
-            this.allowOrder = false;
-            this.filtered = false;
-            this.renderer = new SelectChoiceRenderer<>();
-        }
+        protected Function<String, Stream<String>> idExtractor =
+                (Function<String, Stream<String>> & Serializable) input -> Stream.of(Strings.split(input, ','));
+
+        protected Function<Object, Map<String, String>> additionalAttributes;
 
         public Builder<T> setName(final String name) {
             this.name = name;
@@ -306,6 +315,16 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
             return this;
         }
 
+        public Builder<T> idExtractor(final Function<String, Stream<String>> idExtractor) {
+            this.idExtractor = idExtractor;
+            return this;
+        }
+
+        public Builder<T> additionalAttributes(final Function<Object, Map<String, String>> additionalAttributes) {
+            this.additionalAttributes = additionalAttributes;
+            return this;
+        }
+
         public AjaxPalettePanel<T> build(final String id, final IModel<List<T>> model, final IModel<List<T>> choices) {
             return new AjaxPalettePanel<>(id, model, choices, this);
         }
@@ -322,63 +341,67 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
         }
     }
 
-    private abstract class PaletteLoadableDetachableModel extends LoadableDetachableModel<List<T>> {
+    protected abstract class PaletteLoadableDetachableModel extends LoadableDetachableModel<List<T>> {
 
         private static final long serialVersionUID = -7745220313769774616L;
 
+        protected final Builder<T> builder;
+
+        public PaletteLoadableDetachableModel(final Builder<T> builder) {
+            this.builder = builder;
+        }
+
         protected abstract List<T> getChoices();
 
         @Override
         protected List<T> load() {
-            final List<T> selected = availableBefore.isEmpty()
+            List<T> selected = availableBefore.isEmpty()
                     ? new ArrayList<>(palette.getModelCollection())
-                    : getSelectedList(availableBefore, palette.getRecorderComponent().getValue());
+                    : getSelectedList(availableBefore);
 
             availableBefore.clear();
             availableBefore.addAll(ListUtils.sum(selected, getChoices()));
             return availableBefore;
         }
 
-        private List<T> getSelectedList(final Collection<T> choices, final String selection) {
+        protected List<T> getSelectedList(final Collection<T> choices) {
             IChoiceRenderer<? super T> renderer = palette.getChoiceRenderer();
-            List<T> selected = new ArrayList<>();
 
-            Map<T, String> idForChoice = new HashMap<>();
-            choices.forEach(choice -> idForChoice.put(choice, renderer.getIdValue(choice, 0)));
+            Map<T, String> idForChoice = choices.stream().collect(Collectors.toMap(
+                    Function.identity(), choice -> renderer.getIdValue(choice, 0), (c1, c2) -> c1));
 
-            for (String id : Strings.split(selection, ',')) {
+            List<T> selected = new ArrayList<>();
+            builder.idExtractor.apply(palette.getRecorderComponent().getValue()).forEach(id -> {
                 Iterator<T> iter = choices.iterator();
                 boolean found = false;
                 while (!found && iter.hasNext()) {
-                    final T choice = iter.next();
-                    final String idValue = idForChoice.get(choice);
-                    if (id.equals(idValue)) {
+                    T choice = iter.next();
+                    if (id.equals(idForChoice.get(choice))) {
                         selected.add(choice);
                         found = true;
                     }
                 }
-            }
+            });
 
             return selected;
         }
 
         protected List<T> getFilteredList(final Collection<T> choices, final String filter) {
             IChoiceRenderer<? super T> renderer = palette.getChoiceRenderer();
-            List<T> selected = new ArrayList<>(choices.size());
 
-            Map<T, String> idForChoice = new HashMap<>();
-            choices.forEach(choice -> idForChoice.put(choice, renderer.getIdValue(choice, 0)));
+            Map<T, String> idForChoice = choices.stream().collect(Collectors.toMap(
+                    Function.identity(), choice -> renderer.getIdValue(choice, 0), (c1, c2) -> c1));
 
             Pattern pattern = Pattern.compile(filter, Pattern.CASE_INSENSITIVE);
 
+            List<T> filtered = new ArrayList<>(choices.size());
             choices.forEach(choice -> {
-                String idValue = idForChoice.get(choice);
-                if (pattern.matcher(idValue).matches()) {
-                    selected.add(choice);
+                if (pattern.matcher(idForChoice.get(choice)).matches()) {
+                    filtered.add(choice);
                 }
             });
 
-            return selected;
+            return filtered;
         }
     }
 }
diff --git a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.java b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.java
index 571218f..84dbd8a 100644
--- a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.java
+++ b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/markup/html/form/NonI18nPalette.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.ui.commons.markup.html.form;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import org.apache.wicket.extensions.markup.html.form.palette.Palette;
 import org.apache.wicket.markup.html.form.IChoiceRenderer;
@@ -43,17 +42,17 @@ public class NonI18nPalette<T> extends Palette<T> {
         return false;
     }
 
+    protected Map<String, String> getAdditionalAttributes(final Object choice) {
+        return Map.of("title", choice.toString());
+    }
+
     @Override
     protected Map<String, String> getAdditionalAttributesForChoices(final Object choice) {
-        Map<String, String> map = new LinkedHashMap<>();
-        map.put("title", choice.toString());
-        return map;
+        return getAdditionalAttributes(choice);
     }
 
     @Override
     protected Map<String, String> getAdditionalAttributesForSelection(final Object choice) {
-        Map<String, String> map = new LinkedHashMap<>();
-        map.put("title", choice.toString());
-        return map;
+        return getAdditionalAttributes(choice);
     }
 }
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 0e407c5..148c74b 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
@@ -79,7 +79,7 @@ public class NotificationWrapper implements Serializable {
         } else {
             Map<String, String> res = new HashMap<>();
             for (Pair<String, List<SearchClause>> pair : this.aboutClauses) {
-                AbstractFiqlSearchConditionBuilder builder;
+                AbstractFiqlSearchConditionBuilder<?, ?, ?> builder;
                 switch (pair.getLeft()) {
                     case "USER":
                         builder = SyncopeClient.getUserSearchConditionBuilder();
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
index b4a6fe2..82d1ba2 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
@@ -75,7 +75,7 @@ public class BeanPanel<T extends Serializable> extends Panel {
 
     private final List<String> excluded;
 
-    private final Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> sCondWrapper;
+    private final Map<String, Pair<AbstractFiqlSearchConditionBuilder<?, ?, ?>, List<SearchClause>>> sCondWrapper;
 
     public BeanPanel(final String id, final IModel<T> bean, final String... excluded) {
         this(id, bean, null, excluded);
@@ -84,7 +84,7 @@ public class BeanPanel<T extends Serializable> extends Panel {
     public BeanPanel(
             final String id,
             final IModel<T> bean,
-            final Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> sCondWrapper,
+            final Map<String, Pair<AbstractFiqlSearchConditionBuilder<?, ?, ?>, List<SearchClause>>> sCondWrapper,
             final String... excluded) {
         super(id, bean);
         setOutputMarkupId(true);
@@ -147,8 +147,7 @@ public class BeanPanel<T extends Serializable> extends Panel {
                         clauses = SearchUtils.getSearchClauses(fiql);
                     }
 
-                    final AbstractFiqlSearchConditionBuilder builder;
-
+                    final AbstractFiqlSearchConditionBuilder<?, ?, ?> builder;
                     switch (scondAnnot.type()) {
                         case "USER":
                             panel = new UserSearchPanel.Builder(
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
index d9bdcb1..9c8d755 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchUtils.java
@@ -216,13 +216,16 @@ public final class SearchUtils implements Serializable {
         return clause;
     }
 
-    public static String buildFIQL(final List<SearchClause> clauses, final AbstractFiqlSearchConditionBuilder builder) {
+    public static String buildFIQL(
+            final List<SearchClause> clauses,
+            final AbstractFiqlSearchConditionBuilder<?, ?, ?> builder) {
+
         return buildFIQL(clauses, builder, Map.of(), NO_CUSTOM_CONDITION);
     }
 
     public static String buildFIQL(
             final List<SearchClause> clauses,
-            final AbstractFiqlSearchConditionBuilder builder,
+            final AbstractFiqlSearchConditionBuilder<?, ?, ?> builder,
             final Map<String, PlainSchemaTO> availableSchemaTypes,
             final Function<SearchClause, CompleteCondition> customCondition) {
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWrapper.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWrapper.java
index be628a7..574804a 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWrapper.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWrapper.java
@@ -40,7 +40,7 @@ public class ReportletWrapper implements Serializable {
 
     private ReportletConf conf;
 
-    private final Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> scondWrapper;
+    private final Map<String, Pair<AbstractFiqlSearchConditionBuilder<?, ?, ?>, List<SearchClause>>> scondWrapper;
 
     public ReportletWrapper(final boolean isNew) {
         this.isNew = isNew;
@@ -78,7 +78,7 @@ public class ReportletWrapper implements Serializable {
         return this;
     }
 
-    public Map<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> getSCondWrapper() {
+    public Map<String, Pair<AbstractFiqlSearchConditionBuilder<?, ?, ?>, List<SearchClause>>> getSCondWrapper() {
         return scondWrapper;
     }
 }
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 0bded4b..69e3e17 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
@@ -57,7 +57,7 @@ public class PushTaskWrapper implements Serializable {
 
         for (Map.Entry<String, List<SearchClause>> entry : getFilterClauses().entrySet()) {
             if (!entry.getValue().isEmpty()) {
-                AbstractFiqlSearchConditionBuilder bld;
+                AbstractFiqlSearchConditionBuilder<?, ?, ?> bld;
                 switch (entry.getKey()) {
                     case "USER":
                         bld = SyncopeClient.getUserSearchConditionBuilder();
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 de013a9..13caee2 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
@@ -61,7 +61,8 @@ public class DynRealmWrapper implements Serializable {
             this.dynClauses.entrySet().stream().
                     filter(entry -> (CollectionUtils.isNotEmpty(entry.getValue()))).
                     forEachOrdered(entry -> {
-                        AbstractFiqlSearchConditionBuilder builder = AnyTypeKind.USER.name().equals(entry.getKey())
+                        AbstractFiqlSearchConditionBuilder<?, ?, ?> builder =
+                                AnyTypeKind.USER.name().equals(entry.getKey())
                                 ? SyncopeClient.getUserSearchConditionBuilder()
                                 : AnyTypeKind.GROUP.name().equals(entry.getKey())
                                 ? SyncopeClient.getGroupSearchConditionBuilder()
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index ba6433e..bcd3911 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.console.wizards.any;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -146,7 +145,7 @@ public class Groups extends AbstractGroups {
                 @Override
                 public List<MembershipTO> execute(final String filter) {
                     return StringUtils.isEmpty(filter)
-                            ? Collections.emptyList()
+                            ? List.of()
                             : ("*".equals(filter)
                                     ? groupsModel.getObject()
                                     : groupRestClient.search(
@@ -172,11 +171,8 @@ public class Groups extends AbstractGroups {
                     return Groups.this.groupsModel.getDynMemberships();
                 }
 
-            }, new ListModel<>(groupsModel.getObject().stream()
-                            .map(GroupTO::getName).collect(Collectors.toList()))).
+            }, new ListModel<>(groupsModel.getObject().stream().map(GroupTO::getName).collect(Collectors.toList()))).
                     hideLabel().setEnabled(false).setOutputMarkupId(true));
-
-            // ---------------------------------
         }
     }
 
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
index a73ce99..5eebcdb 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/implementations/MyPushActions.groovy
@@ -19,9 +19,9 @@
  */
 import groovy.transform.CompileStatic
 import java.util.Set
+import org.apache.syncope.common.lib.to.ProvisioningReport
 import org.apache.syncope.core.persistence.api.entity.Entity
 import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningProfile
-import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport
 import org.apache.syncope.core.provisioning.api.pushpull.PushActions
 import org.quartz.JobExecutionException