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:45 UTC

[syncope] branch master updated (dfbc79f -> 9d79fa6)

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

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


    from dfbc79f  Upgrading JUnit
     new e0ba6fe  Removing stale annotations
     new 9d79fa6  [SYNCOPE-1493] Ensure to call findByPlainAttrValue / findByPlainAttrUniqueValue when it is the case

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../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 +++--
 .../persistence/jpa/entity/group/JPAJSONGroup.java |  2 --
 .../persistence/jpa/entity/user/JPAJSONUser.java   |  2 --
 .../core/persistence/jpa/dao/AbstractAnyDAO.java   | 13 ++++-----
 .../core/persistence/jpa/inner/UserTest.java       | 16 ++++++-----
 .../core/provisioning/java/pushpull/PullUtils.java | 31 ++++++++++++----------
 11 files changed, 62 insertions(+), 45 deletions(-)


[syncope] 01/02: Removing stale annotations

Posted by il...@apache.org.
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 e0ba6fe2b5def8168672a86fd91d77d662ca58d1
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Sep 10 12:09:41 2019 +0200

    Removing stale annotations
---
 .../apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroup.java  | 2 --
 .../apache/syncope/core/persistence/jpa/entity/user/JPAJSONUser.java    | 2 --
 2 files changed, 4 deletions(-)

diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroup.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroup.java
index 3fca4af..e70e37e 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroup.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAJSONGroup.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.jpa.entity.group;
 
 import java.util.ArrayList;
 import java.util.List;
-import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.EntityListeners;
 import javax.persistence.Lob;
@@ -41,7 +40,6 @@ public class JPAJSONGroup extends JPAGroup implements JSONAny<Group>, Group {
     private static final long serialVersionUID = -8543654943709531885L;
 
     @Lob
-    @Column(columnDefinition = "jsonb")
     private String plainAttrs;
 
     @Transient
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAJSONUser.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAJSONUser.java
index dc18c17..7db9a10 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAJSONUser.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAJSONUser.java
@@ -23,7 +23,6 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
-import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.EntityListeners;
 import javax.persistence.Lob;
@@ -46,7 +45,6 @@ public class JPAJSONUser extends JPAUser implements JSONAny<User>, User {
     private static final long serialVersionUID = -8543654943709531885L;
 
     @Lob
-    @Column(columnDefinition = "jsonb")
     private String plainAttrs;
 
     @Transient


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

Posted by il...@apache.org.
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: