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) {