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ò <ilgro...@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) {