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/10/10 08:22:26 UTC
[syncope] 02/02: [SYNCOPE-1502] Adjustments to comply with code
rules, checked with PostgreSQL, MySQL, PostgreSQL JSONB and Elasticsearch
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 68cfc0d44b79539a28e36b5322d444a9b1a7d7cc
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Oct 10 09:36:15 2019 +0200
[SYNCOPE-1502] Adjustments to comply with code rules, checked with PostgreSQL, MySQL, PostgreSQL JSONB and Elasticsearch
---
.../jpa/dao/AbstractJPAJSONAnySearchDAO.java | 5 ----
.../persistence/jpa/dao/MyJPAJSONAnySearchDAO.java | 26 ++++++++++++++++
.../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java | 3 +-
.../core/persistence/jpa/dao/AbstractAnyDAO.java | 6 ++--
.../persistence/jpa/dao/AbstractAnySearchDAO.java | 35 +++++-----------------
.../core/persistence/jpa/dao/JPAAnySearchDAO.java | 29 ++++++++----------
6 files changed, 52 insertions(+), 52 deletions(-)
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java
index 7dbf95d..02f516f 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractJPAJSONAnySearchDAO.java
@@ -18,16 +18,11 @@
*/
package org.apache.syncope.core.persistence.jpa.dao;
-import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
abstract class AbstractJPAJSONAnySearchDAO extends JPAAnySearchDAO {
- protected static final FastDateFormat DATE_FORMAT =
- FastDateFormat.getInstance(SyncopeConstants.DEFAULT_DATE_PATTERN);
-
@Override
SearchSupport buildSearchSupport(final AnyTypeKind kind) {
return new SearchSupport(kind);
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
index a4fa998..8ccba90 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
@@ -38,6 +38,32 @@ import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
public class MyJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
@Override
+ protected String buildAdminRealmsFilter(
+ final Set<String> realmKeys,
+ final SearchSupport svs,
+ final List<Object> parameters) {
+
+ StringBuilder adminRealmsFilter = new StringBuilder("u.any_id IN (").
+ append("SELECT any_id FROM ").append(svs.field().name).
+ append(" WHERE realm_id IN (SELECT id AS realm_id FROM Realm");
+
+ boolean firstRealm = true;
+ for (String realmKey : realmKeys) {
+ if (firstRealm) {
+ adminRealmsFilter.append(" WHERE");
+ firstRealm = false;
+ } else {
+ adminRealmsFilter.append(" OR");
+ }
+ adminRealmsFilter.append(" id=?").append(setParameter(parameters, realmKey));
+ }
+
+ adminRealmsFilter.append("))");
+
+ return adminRealmsFilter.toString();
+ }
+
+ @Override
protected void processOBS(
final SearchSupport svs,
final Set<String> involvedPlainAttrs,
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
index b715bc0..bb774ec 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
@@ -35,6 +35,7 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.PlainSchema;
import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
+import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
public class PGJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
@@ -157,7 +158,7 @@ public class PGJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
String value = cond.getExpression();
if (schema.getType() == AttrSchemaType.Date) {
try {
- value = String.valueOf(DATE_FORMAT.parse(value).getTime());
+ value = String.valueOf(FormatUtils.parseDate(value).getTime());
} catch (ParseException e) {
LOG.error("Could not parse {} as date", value, e);
}
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 90ed53f..32c53ce 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
@@ -155,10 +155,10 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
@Transactional(readOnly = true)
@Override
- public List<A> findByKeys(List<String> keys) {
+ public List<A> findByKeys(final List<String> keys) {
Class<A> entityClass = anyUtils().anyClass();
- TypedQuery<A> query = entityManager()
- .createQuery("SELECT e FROM " + entityClass.getSimpleName() + " e WHERE e.id IN (:keys)", entityClass);
+ TypedQuery<A> query = entityManager().createQuery(
+ "SELECT e FROM " + entityClass.getSimpleName() + " e WHERE e.id IN (:keys)", entityClass);
query.setParameter("keys", keys);
return query.getResultList();
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index 4cebca7..e69ca12 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -20,13 +20,8 @@ package org.apache.syncope.core.persistence.jpa.dao;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
-import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.ValidationException;
@@ -300,32 +295,18 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
return memberKey;
}
+ @SuppressWarnings("unchecked")
protected <T extends Any<?>> List<T> buildResult(final List<Object> raw, final AnyTypeKind kind) {
- List<String> orderedAnyKeys = extractSortedAnyKeys(raw);
- return constructSortedAnyTOsBySortedKeys(findAnyTOs(kind, orderedAnyKeys), orderedAnyKeys, kind);
- }
+ List<String> keys = raw.stream().
+ map(key -> key instanceof Object[] ? (String) ((Object[]) key)[0] : ((String) key)).
+ collect(Collectors.toList());
- private List<String> extractSortedAnyKeys(List<Object> raw) {
- return raw.stream().map(anyKey -> anyKey instanceof Object[]
- ? (String) ((Object[]) anyKey)[0]
- : ((String) anyKey))
- .collect(Collectors.toList());
- }
+ List<Any<?>> anys = anyUtilsFactory.getInstance(kind).dao().findByKeys(keys);
- @SuppressWarnings("unchecked")
- private <T extends Any<?>> List<T> findAnyTOs(AnyTypeKind kind, List<String> orderedAnyKeys) {
- return new ArrayList<>((List<T>)anyUtilsFactory.getInstance(kind).dao().findByKeys(orderedAnyKeys));
- }
+ keys.stream().filter(key -> !anys.stream().anyMatch(any -> key.equals(any.getKey()))).
+ forEach(key -> LOG.error("Could not find {} with id {}, even if returned by native query", kind, key));
- private <T extends Any<?>> List<T> constructSortedAnyTOsBySortedKeys(List<T> anyTOs,
- List<String> sortedAnyKeys, AnyTypeKind kind) {
- Map<String, T> anyMap = anyTOs.stream().collect(Collectors.toMap(T::getKey, anyTO -> anyTO));
- return sortedAnyKeys.stream().map(key -> {
- if (anyMap.get(key) == null) {
- LOG.error("Could not find {} with id {}, even if returned by native query", kind, key);
- }
- return anyMap.get(key);
- }).filter(Objects::nonNull).collect(Collectors.toList());
+ return (List<T>) anys;
}
@Override
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 29fc8e4..f2d8e70 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -65,6 +65,18 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
protected static final String EMPTY_QUERY = "SELECT any_id FROM user_search WHERE 1=2";
+ protected String buildAdminRealmsFilter(
+ final Set<String> realmKeys,
+ final SearchSupport svs,
+ final List<Object> parameters) {
+
+ List<String> realmKeyArgs = realmKeys.stream().
+ map(realmKey -> "?" + setParameter(parameters, realmKey)).
+ collect(Collectors.toList());
+ return "u.any_id IN (SELECT any_id FROM " + svs.field().name
+ + " WHERE realm_id IN (" + StringUtils.join(realmKeyArgs, ", ") + "))";
+ }
+
private Pair<String, Set<String>> getAdminRealmsFilter(
final Set<String> adminRealms,
final SearchSupport svs,
@@ -97,22 +109,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
map(Entity::getKey).collect(Collectors.toSet()));
}
- List<String> realmKeyArgs = getRealmKeySqlArgsAndFillParameters(parameters, realmKeys);
-
- StringBuilder adminRealmFilter = new StringBuilder("u.any_id IN (").
- append("SELECT any_id FROM ").append(svs.field().name)
- .append(" WHERE realm_id IN (")
- .append(StringUtils.join(realmKeyArgs, ", "))
- .append("))");
- return Pair.of(adminRealmFilter.toString(), dynRealmKeys);
- }
-
- private List<String> getRealmKeySqlArgsAndFillParameters(List<Object> parameters, Set<String> realmKeys) {
- List<String> realmKeyArgs = new ArrayList<>();
- for (String realmKey : realmKeys) {
- realmKeyArgs.add("?" + setParameter(parameters, realmKey));
- }
- return realmKeyArgs;
+ return Pair.of(buildAdminRealmsFilter(realmKeys, svs, parameters), dynRealmKeys);
}
SearchSupport buildSearchSupport(final AnyTypeKind kind) {