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

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


The following commit(s) were added to refs/heads/4_0_X by this push:
     new de89b62fcc [SYNCOPE-1933] Ensure to show all dynamic memberships
de89b62fcc is described below

commit de89b62fccae944e12212f0515fb83134392af3f
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Wed Nov 26 13:15:13 2025 +0100

    [SYNCOPE-1933] Ensure to show all dynamic memberships
---
 .../commons/wizards/any/AbstractGroupsModel.java   |  5 ----
 .../syncope/client/console/wizards/any/Groups.java | 16 ++++++------
 .../syncope/client/enduser/panels/any/Groups.java  |  5 ----
 .../syncope/core/persistence/api/dao/GroupDAO.java | 30 +++++++++++-----------
 .../core/persistence/jpa/PersistenceContext.java   |  2 ++
 .../persistence/jpa/dao/repo/GroupRepoExtImpl.java | 18 ++++++++-----
 .../core/persistence/neo4j/PersistenceContext.java |  2 ++
 .../neo4j/dao/repo/GroupRepoExtImpl.java           | 18 ++++++++-----
 8 files changed, 51 insertions(+), 45 deletions(-)

diff --git 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractGroupsModel.java
 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractGroupsModel.java
index 395db18d56..7264856b08 100644
--- 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractGroupsModel.java
+++ 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/wizards/any/AbstractGroupsModel.java
@@ -56,10 +56,5 @@ public abstract class AbstractGroupsModel extends 
ListModel<GroupTO> {
         return memberships;
     }
 
-    /**
-     * Retrieve dyn group memberships.
-     */
-    protected abstract void reloadDynMemberships();
-
     public abstract List<String> getDynMemberships();
 }
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 bf81f94d22..2304d6dde4 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
@@ -251,24 +251,24 @@ public class Groups extends AbstractGroups {
             memberships.sort(Comparator.comparing(MembershipTO::getGroupName));
         }
 
-        @Override
         protected void reloadDynMemberships() {
             GroupFiqlSearchConditionBuilder builder = 
SyncopeClient.getGroupSearchConditionBuilder();
 
             List<CompleteCondition> conditions = 
GroupableRelatableTO.class.cast(anyTO).getDynMemberships().
                     stream().map(membership -> 
builder.is(Constants.KEY_FIELD_NAME).
-                    equalTo(membership.getGroupKey()).wrap()).
-                    collect(Collectors.toList());
+                    equalTo(membership.getGroupKey()).wrap()).toList();
 
-            dynMemberships = new ArrayList<>();
             if 
(SyncopeConsoleSession.get().owns(IdRepoEntitlement.GROUP_SEARCH) && 
!conditions.isEmpty()) {
-                dynMemberships.addAll(groupRestClient.search(
+                dynMemberships = groupRestClient.search(
                         SyncopeConstants.ROOT_REALM,
                         builder.or(conditions).query(),
-                        -1,
-                        -1,
+                        1,
+                        Constants.MAX_GROUP_LIST_SIZE,
                         new SortParam<>(Constants.NAME_FIELD_NAME, true)).
-                        stream().map(GroupTO::getName).toList());
+                        stream().map(GroupTO::getName).toList();
+            } else {
+                dynMemberships = 
GroupableRelatableTO.class.cast(anyTO).getDynMemberships().
+                        stream().map(MembershipTO::getGroupName).toList();
             }
         }
 
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/any/Groups.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/any/Groups.java
index 547bead8ac..2b1b32100d 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/any/Groups.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/any/Groups.java
@@ -196,11 +196,6 @@ public class Groups extends Panel {
             memberships = 
GroupableRelatableTO.class.cast(anyTO).getMemberships();
         }
 
-        @Override
-        protected void reloadDynMemberships() {
-            // DO NOTHING
-        }
-
         @Override
         public List<String> getDynMemberships() {
             return List.of();
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index 68939522bd..54e9316196 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -42,6 +42,9 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     Optional<? extends Group> findByName(String name);
 
+    @Override
+    Collection<String> findAllResourceKeys(String key);
+
     /**
      * Checks if the calling user is authorized to access the Group matching 
the provided key, under the given
      * realm.
@@ -74,6 +77,8 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     List<String> findADynMembers(Group group);
 
+    List<String> findUDynMembers(Group group);
+
     long countAMembers(String groupKey);
 
     long countUMembers(String groupKey);
@@ -84,6 +89,8 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     void clearADynMembers(Group group);
 
+    void clearUDynMembers(Group group);
+
     /**
      * Evaluates all the dynamic group membership conditions against the given 
anyObject (invoked during save).
      *
@@ -92,18 +99,6 @@ public interface GroupDAO extends AnyDAO<Group> {
      */
     DynMembershipInfo refreshDynMemberships(AnyObject anyObject);
 
-    /**
-     * Removes the dynamic group memberships of the given anyObject (invoked 
during delete).
-     *
-     * @param anyObject anyObject being deleted
-     * @return groups dynamically assigned before refresh
-     */
-    Set<String> removeDynMemberships(AnyObject anyObject);
-
-    List<String> findUDynMembers(Group group);
-
-    void clearUDynMembers(Group group);
-
     /**
      * Evaluates all the dynamic group membership conditions against the given 
user (invoked during save).
      *
@@ -115,6 +110,14 @@ public interface GroupDAO extends AnyDAO<Group> {
     /**
      * Removes the dynamic group memberships of the given anyObject (invoked 
during delete).
      *
+     * @param anyObject anyObject being deleted
+     * @return groups dynamically assigned before refresh
+     */
+    Set<String> removeDynMemberships(AnyObject anyObject);
+
+    /**
+     * Removes the dynamic group memberships of the given user (invoked during 
delete).
+     *
      * @param user user being deleted
      * @return groups dynamically assigned before refresh
      */
@@ -129,7 +132,4 @@ public interface GroupDAO extends AnyDAO<Group> {
     Group saveAndRefreshDynMemberships(Group group);
 
     List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass);
-
-    @Override
-    Collection<String> findAllResourceKeys(String key);
 }
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
index 4d31d9e4f0..3545e6aaca 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
@@ -644,6 +644,7 @@ public class PersistenceContext {
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy DynRealmDAO dynRealmDAO,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
+            final @Lazy RealmDAO realmDAO,
             final AnyMatchDAO anyMatchDAO,
             final @Lazy UserDAO userDAO,
             final @Lazy AnyObjectDAO anyObjectDAO,
@@ -657,6 +658,7 @@ public class PersistenceContext {
                 publisher,
                 dynRealmDAO,
                 plainSchemaDAO,
+                realmDAO,
                 anyMatchDAO,
                 userDAO,
                 anyObjectDAO,
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/GroupRepoExtImpl.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/GroupRepoExtImpl.java
index a7bad384c4..bb561b151f 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/GroupRepoExtImpl.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/repo/GroupRepoExtImpl.java
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
 import org.apache.syncope.core.persistence.api.dao.AnyDAO;
@@ -37,6 +38,7 @@ import 
org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Any;
@@ -76,6 +78,8 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group> implements Group
 
     protected final ApplicationEventPublisher publisher;
 
+    protected final RealmDAO realmDAO;
+
     protected final AnyMatchDAO anyMatchDAO;
 
     protected final UserDAO userDAO;
@@ -91,6 +95,7 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group> implements Group
             final ApplicationEventPublisher publisher,
             final DynRealmDAO dynRealmDAO,
             final PlainSchemaDAO plainSchemaDAO,
+            final RealmDAO realmDAO,
             final AnyMatchDAO anyMatchDAO,
             final UserDAO userDAO,
             final AnyObjectDAO anyObjectDAO,
@@ -106,6 +111,7 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group> implements Group
                 anyFinder,
                 anyUtilsFactory.getInstance(AnyTypeKind.GROUP));
         this.publisher = publisher;
+        this.realmDAO = realmDAO;
         this.anyMatchDAO = anyMatchDAO;
         this.userDAO = userDAO;
         this.anyObjectDAO = anyObjectDAO;
@@ -244,12 +250,12 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group> implements Group
         if (merged.getUDynMembership() != null) {
             SearchCond cond = SearchCondConverter.convert(searchCondVisitor, 
merged.getUDynMembership().getFIQLCond());
             long count = anySearchDAO.count(
-                    merged.getRealm(), true, 
Set.of(merged.getRealm().getFullPath()), cond, AnyTypeKind.USER);
+                    realmDAO.getRoot(), true, 
Set.of(SyncopeConstants.ROOT_REALM), cond, AnyTypeKind.USER);
             for (int page = 0; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE); 
page++) {
                 List<User> matching = anySearchDAO.search(
-                        merged.getRealm(),
+                        realmDAO.getRoot(),
                         true,
-                        Set.of(merged.getRealm().getFullPath()),
+                        Set.of(SyncopeConstants.ROOT_REALM),
                         cond,
                         PageRequest.of(page, AnyDAO.DEFAULT_PAGE_SIZE),
                         AnyTypeKind.USER);
@@ -270,12 +276,12 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group> implements Group
         merged.getADynMemberships().forEach(memb -> {
             SearchCond cond = SearchCondConverter.convert(searchCondVisitor, 
memb.getFIQLCond());
             long count = anySearchDAO.count(
-                    merged.getRealm(), true, 
Set.of(merged.getRealm().getFullPath()), cond, AnyTypeKind.ANY_OBJECT);
+                    realmDAO.getRoot(), true, 
Set.of(SyncopeConstants.ROOT_REALM), cond, AnyTypeKind.ANY_OBJECT);
             for (int page = 0; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE); 
page++) {
                 List<AnyObject> matching = anySearchDAO.search(
-                        merged.getRealm(),
+                        realmDAO.getRoot(),
                         true,
-                        Set.of(merged.getRealm().getFullPath()),
+                        Set.of(SyncopeConstants.ROOT_REALM),
                         cond,
                         PageRequest.of(page, AnyDAO.DEFAULT_PAGE_SIZE),
                         AnyTypeKind.ANY_OBJECT);
diff --git 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
index 9544c68fcd..922218b000 100644
--- 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
+++ 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/PersistenceContext.java
@@ -907,6 +907,7 @@ public class PersistenceContext {
             final @Lazy PlainSchemaDAO plainSchemaDAO,
             final @Lazy DerSchemaDAO derSchemaDAO,
             final @Lazy DynRealmDAO dynRealmDAO,
+            final @Lazy RealmDAO realmDAO,
             final AnyMatchDAO anyMatchDAO,
             final @Lazy UserDAO userDAO,
             final @Lazy AnyObjectDAO anyObjectDAO,
@@ -926,6 +927,7 @@ public class PersistenceContext {
                 plainSchemaDAO,
                 derSchemaDAO,
                 dynRealmDAO,
+                realmDAO,
                 anyMatchDAO,
                 userDAO,
                 anyObjectDAO,
diff --git 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java
 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java
index e54f7e76db..52e4cc2850 100644
--- 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java
+++ 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/repo/GroupRepoExtImpl.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import javax.cache.Cache;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
 import org.apache.syncope.core.persistence.api.dao.AnyDAO;
@@ -41,6 +42,7 @@ import 
org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Any;
@@ -89,6 +91,8 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group, Neo4jGroup> impl
 
     protected final ApplicationEventPublisher publisher;
 
+    protected final RealmDAO realmDAO;
+
     protected final AnyMatchDAO anyMatchDAO;
 
     protected final UserDAO userDAO;
@@ -111,6 +115,7 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group, Neo4jGroup> impl
             final PlainSchemaDAO plainSchemaDAO,
             final DerSchemaDAO derSchemaDAO,
             final DynRealmDAO dynRealmDAO,
+            final RealmDAO realmDAO,
             final AnyMatchDAO anyMatchDAO,
             final UserDAO userDAO,
             final AnyObjectDAO anyObjectDAO,
@@ -133,6 +138,7 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group, Neo4jGroup> impl
                 neo4jTemplate,
                 neo4jClient);
         this.publisher = publisher;
+        this.realmDAO = realmDAO;
         this.anyMatchDAO = anyMatchDAO;
         this.userDAO = userDAO;
         this.anyObjectDAO = anyObjectDAO;
@@ -345,12 +351,12 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group, Neo4jGroup> impl
         if (merged.getUDynMembership() != null) {
             SearchCond cond = SearchCondConverter.convert(searchCondVisitor, 
merged.getUDynMembership().getFIQLCond());
             long count = anySearchDAO.count(
-                    merged.getRealm(), true, 
Set.of(merged.getRealm().getFullPath()), cond, AnyTypeKind.USER);
+                    realmDAO.getRoot(), true, 
Set.of(SyncopeConstants.ROOT_REALM), cond, AnyTypeKind.USER);
             for (int page = 0; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE); 
page++) {
                 List<User> matching = anySearchDAO.search(
-                        merged.getRealm(),
+                        realmDAO.getRoot(),
                         true,
-                        Set.of(merged.getRealm().getFullPath()),
+                        Set.of(SyncopeConstants.ROOT_REALM),
                         cond,
                         PageRequest.of(page, AnyDAO.DEFAULT_PAGE_SIZE),
                         AnyTypeKind.USER);
@@ -370,12 +376,12 @@ public class GroupRepoExtImpl extends 
AbstractAnyRepoExt<Group, Neo4jGroup> impl
         merged.getADynMemberships().forEach(memb -> {
             SearchCond cond = SearchCondConverter.convert(searchCondVisitor, 
memb.getFIQLCond());
             long count = anySearchDAO.count(
-                    merged.getRealm(), true, 
Set.of(merged.getRealm().getFullPath()), cond, AnyTypeKind.ANY_OBJECT);
+                    realmDAO.getRoot(), true, 
Set.of(SyncopeConstants.ROOT_REALM), cond, AnyTypeKind.ANY_OBJECT);
             for (int page = 0; page <= (count / AnyDAO.DEFAULT_PAGE_SIZE); 
page++) {
                 List<AnyObject> matching = anySearchDAO.search(
-                        merged.getRealm(),
+                        realmDAO.getRoot(),
                         true,
-                        Set.of(merged.getRealm().getFullPath()),
+                        Set.of(SyncopeConstants.ROOT_REALM),
                         cond,
                         PageRequest.of(page, AnyDAO.DEFAULT_PAGE_SIZE),
                         AnyTypeKind.ANY_OBJECT);

Reply via email to