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 3adc9bcff0 Rationalize AdminRealmFilter for AnySearchDAO impls
3adc9bcff0 is described below

commit 3adc9bcff088d8fe71f023170350c547c46f8bd6
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Thu Aug 13 10:26:04 2026 +0200

    Rationalize AdminRealmFilter for AnySearchDAO impls
---
 .../jpa/dao/AbstractJPAAnySearchDAO.java           | 43 +++++++-------
 .../persistence/neo4j/dao/Neo4jAnySearchDAO.java   | 45 +++++++--------
 .../dao/ElasticsearchAnySearchDAO.java             | 67 ++++++++++++----------
 .../opensearch/dao/OpenSearchAnySearchDAO.java     | 65 +++++++++++----------
 4 files changed, 112 insertions(+), 108 deletions(-)

diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
index 666e6481bf..f0fcf02405 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAAnySearchDAO.java
@@ -698,34 +698,31 @@ abstract class AbstractJPAAnySearchDAO extends 
AbstractAnySearchDAO {
         Set<String> dynRealmKeys = new HashSet<>();
         Set<String> groupOwners = new HashSet<>();
 
-        if (recursive) {
-            adminRealms.forEach(realmPath -> 
RealmUtils.GroupOwnerRealm.of(realmPath).ifPresentOrElse(
-                    goRealm -> groupOwners.add(goRealm.groupKey()),
-                    () -> {
-                        if (realmPath.startsWith("/")) {
-                            Realm realm = 
realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> {
-                                SyncopeClientException noRealm =
-                                        
SyncopeClientException.build(ClientExceptionType.InvalidRealm);
-                                noRealm.getElements().add("Invalid realm 
specified: " + realmPath);
-                                return noRealm;
-                            });
+        adminRealms.forEach(realmPath -> 
RealmUtils.GroupOwnerRealm.of(realmPath).ifPresentOrElse(
+                realm -> groupOwners.add(realm.groupKey()),
+                () -> {
+                    if (realmPath.startsWith("/")) {
+                        Realm realm = 
realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> {
+                            SyncopeClientException noRealm = 
SyncopeClientException.build(
+                                    ClientExceptionType.InvalidRealm);
+                            noRealm.getElements().add("Invalid realm 
specified: " + realmPath);
+                            return noRealm;
+                        });
 
+                        if (recursive) {
                             
realmKeys.addAll(realmSearchDAO.findDescendants(realm.getFullPath(), 
base.getFullPath()).
                                     stream().map(Realm::getKey).toList());
                         } else {
-                            dynRealmDAO.findById(realmPath).ifPresentOrElse(
-                                    dynRealm -> 
dynRealmKeys.add(dynRealm.getKey()),
-                                    () -> LOG.warn("Ignoring invalid dynamic 
realm {}", realmPath));
+                            if (RealmUtils.subtree(realm.getFullPath(), 
base.getFullPath())) {
+                                realmKeys.add(realm.getKey());
+                            }
                         }
-                    }));
-            if (!dynRealmKeys.isEmpty()) {
-                realmKeys.clear();
-            }
-        } else {
-            if 
(RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) {
-                realmKeys.add(base.getKey());
-            }
-        }
+                    } else {
+                        dynRealmDAO.findById(realmPath).ifPresentOrElse(
+                                dynRealm -> 
dynRealmKeys.add(dynRealm.getKey()),
+                                () -> LOG.warn("Ignoring invalid dynamic realm 
{}", realmPath));
+                    }
+                }));
 
         return new AdminRealmsFilter(buildAdminRealmsFilter(realmKeys, svs, 
parameters), dynRealmKeys, groupOwners);
     }
diff --git 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
index 47271a3347..f2f66bf428 100644
--- 
a/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
+++ 
b/core/persistence-neo4j/src/main/java/org/apache/syncope/core/persistence/neo4j/dao/Neo4jAnySearchDAO.java
@@ -207,34 +207,31 @@ public class Neo4jAnySearchDAO extends 
AbstractAnySearchDAO {
         Set<String> dynRealmKeys = new HashSet<>();
         Set<String> groupOwners = new HashSet<>();
 
-        if (recursive) {
-            adminRealms.forEach(realmPath -> 
RealmUtils.GroupOwnerRealm.of(realmPath).ifPresentOrElse(
-                    goRealm -> groupOwners.add(goRealm.groupKey()),
-                    () -> {
-                        if (realmPath.startsWith("/")) {
-                            Realm realm = 
realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> {
-                                SyncopeClientException noRealm =
-                                        
SyncopeClientException.build(ClientExceptionType.InvalidRealm);
-                                noRealm.getElements().add("Invalid realm 
specified: " + realmPath);
-                                return noRealm;
-                            });
-
+        adminRealms.forEach(realmPath -> 
RealmUtils.GroupOwnerRealm.of(realmPath).ifPresentOrElse(
+                realm -> groupOwners.add(realm.groupKey()),
+                () -> {
+                    if (realmPath.startsWith("/")) {
+                        Realm realm = 
realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> {
+                            SyncopeClientException noRealm = 
SyncopeClientException.build(
+                                    ClientExceptionType.InvalidRealm);
+                            noRealm.getElements().add("Invalid realm 
specified: " + realmPath);
+                            return noRealm;
+                        });
+
+                        if (recursive) {
                             
realmKeys.addAll(realmSearchDAO.findDescendants(realm.getFullPath(), 
base.getFullPath()).
                                     stream().map(Realm::getKey).toList());
                         } else {
-                            dynRealmDAO.findById(realmPath).ifPresentOrElse(
-                                    dynRealm -> 
dynRealmKeys.add(dynRealm.getKey()),
-                                    () -> LOG.warn("Ignoring invalid dynamic 
realm {}", realmPath));
+                            if (RealmUtils.subtree(realm.getFullPath(), 
base.getFullPath())) {
+                                realmKeys.add(realm.getKey());
+                            }
                         }
-                    }));
-            if (!dynRealmKeys.isEmpty()) {
-                realmKeys.clear();
-            }
-        } else {
-            if 
(RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) {
-                realmKeys.add(base.getKey());
-            }
-        }
+                    } else {
+                        dynRealmDAO.findById(realmPath).ifPresentOrElse(
+                                dynRealm -> 
dynRealmKeys.add(dynRealm.getKey()),
+                                () -> LOG.warn("Ignoring invalid dynamic realm 
{}", realmPath));
+                    }
+                }));
 
         return new AdminRealmsFilter(buildAdminRealmsFilter(realmKeys, 
parameters), dynRealmKeys, groupOwners);
     }
diff --git 
a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
 
b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
index f88dbbb5a6..463b7091aa 100644
--- 
a/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
+++ 
b/ext/elasticsearch/persistence/src/main/java/org/apache/syncope/core/persistence/elasticsearch/dao/ElasticsearchAnySearchDAO.java
@@ -42,9 +42,11 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
 import 
org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -134,38 +136,41 @@ public class ElasticsearchAnySearchDAO extends 
AbstractAnySearchDAO {
         Set<String> groupOwners = new HashSet<>();
         List<Query> queries = new ArrayList<>();
 
-        if (recursive) {
-            adminRealms.forEach(realmPath -> {
-                Optional<RealmUtils.GroupOwnerRealm> goRealm = 
RealmUtils.GroupOwnerRealm.of(realmPath);
-                if (goRealm.isPresent()) {
-                    groupOwners.add(goRealm.get().groupKey());
-                } else if (realmPath.startsWith("/")) {
-                    Realm realm = realmSearchDAO.findByFullPath(realmPath).
-                            orElseThrow(() -> new 
IllegalArgumentException("Invalid Realm full path: " + realmPath));
-
-                    realmSearchDAO.findDescendants(realm.getFullPath(), 
base.getFullPath()).
-                            stream().map(Realm::getKey).forEach(descendant -> 
queries.add(
-                            new Query.Builder().term(QueryBuilders.term().
-                                    
field("realm").value(descendant).caseInsensitive(false).build()).
-                                    build()));
-                } else {
-                    dynRealmDAO.findById(realmPath).ifPresentOrElse(
-                            dynRealm -> {
-                                dynRealmKeys.add(dynRealm.getKey());
+        adminRealms.forEach(realmPath -> 
RealmUtils.GroupOwnerRealm.of(realmPath).ifPresentOrElse(
+                realm -> groupOwners.add(realm.groupKey()),
+                () -> {
+                    if (realmPath.startsWith("/")) {
+                        Realm realm = 
realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> {
+                            SyncopeClientException noRealm = 
SyncopeClientException.build(
+                                    ClientExceptionType.InvalidRealm);
+                            noRealm.getElements().add("Invalid realm 
specified: " + realmPath);
+                            return noRealm;
+                        });
+
+                        if (recursive) {
+                            
realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()).
+                                    
stream().map(Realm::getKey).forEach(descendant -> queries.add(
+                                    new 
Query.Builder().term(QueryBuilders.term().
+                                            field("realm").value(descendant).
+                                            
caseInsensitive(false).build()).build()));
+                        } else {
+                            if (RealmUtils.subtree(realm.getFullPath(), 
base.getFullPath())) {
                                 queries.add(new 
Query.Builder().term(QueryBuilders.term().
-                                        
field("dynRealm").value(dynRealm.getKey()).caseInsensitive(false).build()).
-                                        build());
-                            },
-                            () -> LOG.warn("Ignoring invalid dynamic realm 
{}", realmPath));
-                }
-            });
-        } else {
-            if 
(RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) {
-                queries.add(new Query.Builder().term(QueryBuilders.term().
-                        
field("realm").value(base.getKey()).caseInsensitive(false).build()).
-                        build());
-            }
-        }
+                                        field("realm").value(realm.getKey()).
+                                        
caseInsensitive(false).build()).build());
+                            }
+                        }
+                    } else {
+                        dynRealmDAO.findById(realmPath).ifPresentOrElse(
+                                dynRealm -> {
+                                    dynRealmKeys.add(dynRealm.getKey());
+                                    queries.add(new 
Query.Builder().term(QueryBuilders.term().
+                                            
field("dynRealm").value(FieldValue.of(dynRealm.getKey())).
+                                            
caseInsensitive(false).build()).build());
+                                },
+                                () -> LOG.warn("Ignoring invalid dynamic realm 
{}", realmPath));
+                    }
+                }));
 
         return new AdminRealmsFilter(
                 dynRealmKeys.isEmpty() && groupOwners.isEmpty()
diff --git 
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
 
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
index dc9c98e746..d0a41e90ed 100644
--- 
a/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
+++ 
b/ext/opensearch/persistence/src/main/java/org/apache/syncope/core/persistence/opensearch/dao/OpenSearchAnySearchDAO.java
@@ -26,9 +26,11 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
 import 
org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -133,38 +135,41 @@ public class OpenSearchAnySearchDAO extends 
AbstractAnySearchDAO {
         Set<String> groupOwners = new HashSet<>();
         List<Query> queries = new ArrayList<>();
 
-        if (recursive) {
-            adminRealms.forEach(realmPath -> {
-                Optional<RealmUtils.GroupOwnerRealm> goRealm = 
RealmUtils.GroupOwnerRealm.of(realmPath);
-                if (goRealm.isPresent()) {
-                    groupOwners.add(goRealm.get().groupKey());
-                } else if (realmPath.startsWith("/")) {
-                    Realm realm = realmSearchDAO.findByFullPath(realmPath).
-                            orElseThrow(() -> new 
IllegalArgumentException("Invalid Realm full path: " + realmPath));
-
-                    realmSearchDAO.findDescendants(realm.getFullPath(), 
base.getFullPath()).
-                            stream().map(Realm::getKey).forEach(descendant -> 
queries.add(
-                            new Query.Builder().term(QueryBuilders.term().
-                                    
field("realm").value(FieldValue.of(descendant)).caseInsensitive(false).build()).
-                                    build()));
-                } else {
-                    dynRealmDAO.findById(realmPath).ifPresentOrElse(
-                            dynRealm -> {
-                                dynRealmKeys.add(dynRealm.getKey());
+        adminRealms.forEach(realmPath -> 
RealmUtils.GroupOwnerRealm.of(realmPath).ifPresentOrElse(
+                realm -> groupOwners.add(realm.groupKey()),
+                () -> {
+                    if (realmPath.startsWith("/")) {
+                        Realm realm = 
realmSearchDAO.findByFullPath(realmPath).orElseThrow(() -> {
+                            SyncopeClientException noRealm = 
SyncopeClientException.build(
+                                    ClientExceptionType.InvalidRealm);
+                            noRealm.getElements().add("Invalid realm 
specified: " + realmPath);
+                            return noRealm;
+                        });
+
+                        if (recursive) {
+                            
realmSearchDAO.findDescendants(realm.getFullPath(), base.getFullPath()).
+                                    
stream().map(Realm::getKey).forEach(descendant -> queries.add(
+                                    new 
Query.Builder().term(QueryBuilders.term().
+                                            
field("realm").value(FieldValue.of(descendant)).
+                                            
caseInsensitive(false).build()).build()));
+                        } else {
+                            if (RealmUtils.subtree(realm.getFullPath(), 
base.getFullPath())) {
                                 queries.add(new 
Query.Builder().term(QueryBuilders.term().
-                                        
field("dynRealm").value(FieldValue.of(dynRealm.getKey())).
+                                        
field("realm").value(FieldValue.of(realm.getKey())).
                                         
caseInsensitive(false).build()).build());
-                            },
-                            () -> LOG.warn("Ignoring invalid dynamic realm 
{}", realmPath));
-                }
-            });
-        } else {
-            if 
(RealmUtils.SubtreePredicate.of(adminRealms).test(base.getFullPath())) {
-                queries.add(new Query.Builder().term(QueryBuilders.term().
-                        
field("realm").value(FieldValue.of(base.getKey())).caseInsensitive(false).build()).
-                        build());
-            }
-        }
+                            }
+                        }
+                    } else {
+                        dynRealmDAO.findById(realmPath).ifPresentOrElse(
+                                dynRealm -> {
+                                    dynRealmKeys.add(dynRealm.getKey());
+                                    queries.add(new 
Query.Builder().term(QueryBuilders.term().
+                                            
field("dynRealm").value(FieldValue.of(dynRealm.getKey())).
+                                            
caseInsensitive(false).build()).build());
+                                },
+                                () -> LOG.warn("Ignoring invalid dynamic realm 
{}", realmPath));
+                    }
+                }));
 
         return new AdminRealmsFilter(
                 dynRealmKeys.isEmpty() && groupOwners.isEmpty()

Reply via email to