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 2019/09/10 12:14:47 UTC

[syncope] 02/02: [SYNCOPE-1493] Ensure to call findByPlainAttrValue / findByPlainAttrUniqueValue when it is the case

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 9d79fa626884c4e0c21f70ad0e4459965026abd9
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Sep 10 13:56:50 2019 +0200

    [SYNCOPE-1493] Ensure to call findByPlainAttrValue / findByPlainAttrUniqueValue when it is the case
---
 .../syncope/core/persistence/api/dao/AnyDAO.java   |  5 +++-
 .../core/persistence/api/dao/JPAJSONAnyDAO.java    |  6 +++--
 .../persistence/jpa/dao/AbstractJPAJSONAnyDAO.java | 14 +++++-----
 .../persistence/jpa/dao/JPAJSONAnyObjectDAO.java   |  6 +++--
 .../core/persistence/jpa/dao/JPAJSONGroupDAO.java  |  6 +++--
 .../core/persistence/jpa/dao/JPAJSONUserDAO.java   |  6 +++--
 .../core/persistence/jpa/dao/AbstractAnyDAO.java   | 13 ++++-----
 .../core/persistence/jpa/inner/UserTest.java       | 16 ++++++-----
 .../core/provisioning/java/pushpull/PullUtils.java | 31 ++++++++++++----------
 9 files changed, 62 insertions(+), 41 deletions(-)

diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
index 2300314..787f1cb 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
@@ -21,9 +21,11 @@ package org.apache.syncope.core.persistence.api.dao;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
@@ -43,7 +45,8 @@ public interface AnyDAO<A extends Any<?>> extends DAO<A> {
 
     List<A> findByPlainAttrValue(PlainSchema schema, PlainAttrValue attrValue, boolean ignoreCaseMatch);
 
-    A findByPlainAttrUniqueValue(PlainSchema schema, PlainAttrValue attrUniqueValue, boolean ignoreCaseMatch);
+    Optional<A> findByPlainAttrUniqueValue(
+            PlainSchema schema, PlainAttrUniqueValue attrUniqueValue, boolean ignoreCaseMatch);
 
     /**
      * Find any objects by derived attribute value. This method could fail if one or more string literals contained
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/api/dao/JPAJSONAnyDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/api/dao/JPAJSONAnyDAO.java
index 04be3da..f6fed58 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/api/dao/JPAJSONAnyDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/api/dao/JPAJSONAnyDAO.java
@@ -19,9 +19,11 @@
 package org.apache.syncope.core.persistence.api.dao;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 
@@ -34,11 +36,11 @@ public interface JPAJSONAnyDAO {
             PlainAttrValue attrValue,
             boolean ignoreCaseMatch);
 
-    <A extends Any<?>> A findByPlainAttrUniqueValue(
+    <A extends Any<?>> Optional<A> findByPlainAttrUniqueValue(
             String table,
             AnyUtils anyUtils,
             PlainSchema schema,
-            PlainAttrValue attrUniqueValue,
+            PlainAttrUniqueValue attrUniqueValue,
             boolean ignoreCaseMatch);
 
     <A extends Any<?>> List<A> findByDerAttrValue(
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnyDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnyDAO.java
index 7b38539..9c8263a 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnyDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnyDAO.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.regex.Pattern;
 import javax.persistence.Query;
@@ -42,6 +43,7 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractEntity;
@@ -134,26 +136,26 @@ abstract class AbstractJPAJSONAnyDAO extends AbstractDAO<AbstractEntity> impleme
 
     @Transactional(readOnly = true)
     @Override
-    public <A extends Any<?>> A findByPlainAttrUniqueValue(
+    public <A extends Any<?>> Optional<A> findByPlainAttrUniqueValue(
             final String table,
             final AnyUtils anyUtils,
             final PlainSchema schema,
-            final PlainAttrValue attrUniqueValue,
+            final PlainAttrUniqueValue attrUniqueValue,
             final boolean ignoreCaseMatch) {
 
         if (schema == null) {
             LOG.error("No PlainSchema");
-            return null;
+            return Optional.empty();
         }
         if (!schema.isUniqueConstraint()) {
             LOG.error("This schema has not unique constraint: '{}'", schema.getKey());
-            return null;
+            return Optional.empty();
         }
 
         List<A> result = findByPlainAttrValue(table, anyUtils, schema, attrUniqueValue, ignoreCaseMatch);
         return result.isEmpty()
-                ? null
-                : result.get(0);
+                ? Optional.empty()
+                : Optional.of(result.get(0));
     }
 
     /**
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONAnyObjectDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONAnyObjectDAO.java
index 473d6f1..253f382 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONAnyObjectDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONAnyObjectDAO.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
@@ -27,6 +28,7 @@ import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAJSONAnyObject
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.JPAJSONAnyDAO;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -53,9 +55,9 @@ public class JPAJSONAnyObjectDAO extends JPAAnyObjectDAO {
     }
 
     @Override
-    public AnyObject findByPlainAttrUniqueValue(
+    public Optional<AnyObject> findByPlainAttrUniqueValue(
             final PlainSchema schema,
-            final PlainAttrValue attrUniqueValue,
+            final PlainAttrUniqueValue attrUniqueValue,
             final boolean ignoreCaseMatch) {
 
         return anyDAO().findByPlainAttrUniqueValue(
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONGroupDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONGroupDAO.java
index 2eac134..7066cdd 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONGroupDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONGroupDAO.java
@@ -19,12 +19,14 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.JPAJSONAnyDAO;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 
 public class JPAJSONGroupDAO extends JPAGroupDAO {
@@ -49,9 +51,9 @@ public class JPAJSONGroupDAO extends JPAGroupDAO {
     }
 
     @Override
-    public Group findByPlainAttrUniqueValue(
+    public Optional<Group> findByPlainAttrUniqueValue(
             final PlainSchema schema,
-            final PlainAttrValue attrUniqueValue,
+            final PlainAttrUniqueValue attrUniqueValue,
             final boolean ignoreCaseMatch) {
 
         return anyDAO().findByPlainAttrUniqueValue(
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONUserDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONUserDAO.java
index a995a38..345d1ef 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONUserDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONUserDAO.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
@@ -28,6 +29,7 @@ import org.apache.syncope.core.persistence.jpa.entity.user.JPAJSONUser;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.JPAJSONAnyDAO;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent;
@@ -55,9 +57,9 @@ public class JPAJSONUserDAO extends JPAUserDAO {
     }
 
     @Override
-    public User findByPlainAttrUniqueValue(
+    public Optional<User> findByPlainAttrUniqueValue(
             final PlainSchema schema,
-            final PlainAttrValue attrUniqueValue,
+            final PlainAttrUniqueValue attrUniqueValue,
             final boolean ignoreCaseMatch) {
 
         return anyDAO().findByPlainAttrUniqueValue(
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index b9ee51d..fd537a6 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -51,6 +51,7 @@ import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.DynRealm;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Schema;
@@ -227,24 +228,24 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
     }
 
     @Override
-    public A findByPlainAttrUniqueValue(
+    public Optional<A> findByPlainAttrUniqueValue(
             final PlainSchema schema,
-            final PlainAttrValue attrUniqueValue,
+            final PlainAttrUniqueValue attrUniqueValue,
             final boolean ignoreCaseMatch) {
 
         if (schema == null) {
             LOG.error("No PlainSchema");
-            return null;
+            return Optional.empty();
         }
         if (!schema.isUniqueConstraint()) {
             LOG.error("This schema has not unique constraint: '{}'", schema.getKey());
-            return null;
+            return Optional.empty();
         }
 
         List<A> result = findByPlainAttrValue(schema, attrUniqueValue, ignoreCaseMatch);
         return result.isEmpty()
-                ? null
-                : result.get(0);
+                ? Optional.empty()
+                : Optional.of(result.get(0));
     }
 
     /**
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
index 9302f32..71f72b0 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
@@ -27,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
@@ -39,6 +40,7 @@ import org.apache.syncope.core.persistence.jpa.AbstractTest;
 import org.apache.syncope.core.spring.policy.InvalidPasswordRuleConf;
 import org.apache.syncope.core.spring.security.PasswordGenerator;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
+import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrUniqueValue;
 import org.junit.jupiter.api.Test;
@@ -147,16 +149,18 @@ public class UserTest extends AbstractTest {
         UPlainAttrUniqueValue fullnameValue = entityFactory.newEntity(UPlainAttrUniqueValue.class);
         fullnameValue.setStringValue("Gioacchino Rossini");
 
-        List<User> list = userDAO.findByPlainAttrValue(plainSchemaDAO.find("fullname"), fullnameValue, false);
-        assertEquals(1, list.size());
+        PlainSchema fullname = plainSchemaDAO.find("fullname");
+
+        Optional<User> found = userDAO.findByPlainAttrUniqueValue(fullname, fullnameValue, false);
+        assertTrue(found.isPresent());
 
         fullnameValue.setStringValue("Gioacchino ROSSINI");
 
-        list = userDAO.findByPlainAttrValue(plainSchemaDAO.find("fullname"), fullnameValue, false);
-        assertEquals(0, list.size());
+        found = userDAO.findByPlainAttrUniqueValue(fullname, fullnameValue, false);
+        assertFalse(found.isPresent());
 
-        list = userDAO.findByPlainAttrValue(plainSchemaDAO.find("fullname"), fullnameValue, true);
-        assertEquals(1, list.size());
+        found = userDAO.findByPlainAttrUniqueValue(fullname, fullnameValue, true);
+        assertTrue(found.isPresent());
     }
 
     @Test
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
index 7f2be54..09e8d5f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
@@ -42,6 +41,7 @@ import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
@@ -282,22 +282,25 @@ public class PullUtils {
         } else if (intAttrName.getSchemaType() != null) {
             switch (intAttrName.getSchemaType()) {
                 case PLAIN:
-                    PlainAttrValue value = anyUtils.newPlainAttrValue();
-
-                    if (intAttrName.getSchemaType() == SchemaType.PLAIN) {
+                    PlainAttrValue value = intAttrName.getSchema().isUniqueConstraint()
+                            ? anyUtils.newPlainAttrUniqueValue()
+                            : anyUtils.newPlainAttrValue();
+                    try {
+                        value.parseValue((PlainSchema) intAttrName.getSchema(), connObjectKey);
+                    } catch (ParsingValidationException e) {
+                        LOG.error("While parsing provided __UID__ {}", value, e);
                         value.setStringValue(connObjectKey);
-                    } else {
-                        try {
-                            value.parseValue((PlainSchema) intAttrName.getSchema(), connObjectKey);
-                        } catch (ParsingValidationException e) {
-                            LOG.error("While parsing provided __UID__ {}", value, e);
-                            value.setStringValue(connObjectKey);
-                        }
                     }
 
-                    result.addAll(anyUtils.dao().findByPlainAttrValue(
-                            (PlainSchema) intAttrName.getSchema(), value, provision.isIgnoreCaseMatch()).
-                            stream().map(Entity::getKey).collect(Collectors.toList()));
+                    if (intAttrName.getSchema().isUniqueConstraint()) {
+                        anyUtils.dao().findByPlainAttrUniqueValue((PlainSchema) intAttrName.getSchema(),
+                                (PlainAttrUniqueValue) value, provision.isIgnoreCaseMatch()).
+                                ifPresent(found -> result.add(found.getKey()));
+                    } else {
+                        result.addAll(anyUtils.dao().findByPlainAttrValue((PlainSchema) intAttrName.getSchema(),
+                                value, provision.isIgnoreCaseMatch()).
+                                stream().map(Entity::getKey).collect(Collectors.toList()));
+                    }
                     break;
 
                 case DERIVED: