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: