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

ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/3_0_X by this push:
     new add271b48e [SYNCOPE-1720] Switching to time-based epoch generator
add271b48e is described below

commit add271b48e2ea6fd5b3b29961fe877e554d38419
Author: Francesco Chicchiriccò <ilgro...@apache.org>
AuthorDate: Tue Jan 10 11:25:30 2023 +0100

    [SYNCOPE-1720] Switching to time-based epoch generator
---
 .../syncope/core/persistence/api/dao/GroupDAO.java | 12 ++++-
 .../core/persistence/jpa/dao/JPAGroupDAO.java      | 62 ++++++++++++++++++++--
 .../core/persistence/jpa/dao/JPATaskDAO.java       |  8 +--
 .../java/data/GroupDataBinderImpl.java             |  4 +-
 .../core/spring/security/SecureRandomUtils.java    |  4 +-
 .../org/apache/syncope/fit/core/UserITCase.java    | 47 ++++++++++------
 pom.xml                                            |  6 +--
 7 files changed, 110 insertions(+), 33 deletions(-)

diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index fa50c00e0b..0ebb47b175 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -59,11 +59,19 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass);
 
+    boolean existsAMembership(String anyObjectKey, String groupKey);
+
+    boolean existsUMembership(String userKey, String groupKey);
+
+    List<String> findAMembers(String groupKey);
+
+    List<String> findUMembers(String groupKey);
+
     List<String> findADynMembers(Group group);
 
-    int countAMembers(Group group);
+    int countAMembers(String groupKey);
 
-    int countUMembers(Group group);
+    int countUMembers(String groupKey);
 
     int countADynMembers(Group group);
 
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index adb6a76745..c0dd75f70a 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -402,6 +402,60 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
         return query.getResultList();
     }
 
+    @Transactional(readOnly = true)
+    @Override
+    public boolean existsAMembership(final String anyObjectKey, final String 
groupKey) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT COUNT(*) FROM " + JPAAMembership.TABLE + " WHERE 
group_id=? AND anyobject_it=?");
+        query.setParameter(1, groupKey);
+        query.setParameter(2, anyObjectKey);
+
+        return ((Number) query.getSingleResult()).intValue() > 0;
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public boolean existsUMembership(final String userKey, final String 
groupKey) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT COUNT(*) FROM " + JPAUMembership.TABLE + " WHERE 
group_id=? AND user_id=?");
+        query.setParameter(1, groupKey);
+        query.setParameter(2, userKey);
+
+        return ((Number) query.getSingleResult()).intValue() > 0;
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<String> findAMembers(final String groupKey) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT anyObject_id FROM " + JPAAMembership.TABLE + " WHERE 
group_id=?");
+        query.setParameter(1, groupKey);
+
+        List<String> result = new ArrayList<>();
+        query.getResultList().stream().map(key -> key instanceof Object[]
+                ? (String) ((Object[]) key)[0]
+                : ((String) key)).
+                forEach(item -> result.add((String) item));
+        return result;
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<String> findUMembers(final String groupKey) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT user_id FROM " + JPAUMembership.TABLE + " WHERE 
group_id=?");
+        query.setParameter(1, groupKey);
+
+        List<String> result = new ArrayList<>();
+        query.getResultList().stream().map(key -> key instanceof Object[]
+                ? (String) ((Object[]) key)[0]
+                : ((String) key)).
+                forEach(item -> result.add((String) item));
+        return result;
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public List<String> findADynMembers(final Group group) {
@@ -424,19 +478,19 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
     }
 
     @Override
-    public int countAMembers(final Group group) {
+    public int countAMembers(final String groupKey) {
         Query query = entityManager().createNativeQuery(
                 "SELECT COUNT(anyObject_id) FROM " + JPAAMembership.TABLE + " 
WHERE group_id=?");
-        query.setParameter(1, group.getKey());
+        query.setParameter(1, groupKey);
 
         return ((Number) query.getSingleResult()).intValue();
     }
 
     @Override
-    public int countUMembers(final Group group) {
+    public int countUMembers(final String groupKey) {
         Query query = entityManager().createNativeQuery(
                 "SELECT COUNT(user_id) FROM " + JPAUMembership.TABLE + " WHERE 
group_id=?");
-        query.setParameter(1, group.getKey());
+        query.setParameter(1, groupKey);
 
         return ((Number) query.getSingleResult()).intValue();
     }
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
index 84aaef1901..af42b2ab3b 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
@@ -289,10 +289,12 @@ public class JPATaskDAO extends AbstractDAO<Task<?>> 
implements TaskDAO {
                     append(taskTable).
                     
append(".notification_id=?").append(setParameter(parameters, 
notification.getKey()));
         }
-        if (anyTypeKind != null && entityKey != null) {
+        if (anyTypeKind != null) {
+            queryString.append(" AND ").
+                    
append(taskTable).append(".anyTypeKind=?").append(setParameter(parameters, 
anyTypeKind.name()));
+        }
+        if (entityKey != null) {
             queryString.append(" AND ").
-                    
append(taskTable).append(".anyTypeKind=?").append(setParameter(parameters, 
anyTypeKind.name())).
-                    append(" AND ").
                     
append(taskTable).append(".entityKey=?").append(setParameter(parameters, 
entityKey));
         }
         if (type == TaskType.MACRO
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index b49e90a43b..ef72c7baaf 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -435,8 +435,8 @@ public class GroupDataBinderImpl extends 
AbstractAnyDataBinder implements GroupD
         groupTO.getDynRealms().addAll(groupDAO.findDynRealms(group.getKey()));
 
         // Static user and AnyType membership counts
-        groupTO.setStaticUserMembershipCount(groupDAO.countUMembers(group));
-        
groupTO.setStaticAnyObjectMembershipCount(groupDAO.countAMembers(group));
+        
groupTO.setStaticUserMembershipCount(groupDAO.countUMembers(group.getKey()));
+        
groupTO.setStaticAnyObjectMembershipCount(groupDAO.countAMembers(group.getKey()));
 
         // Dynamic user and AnyType membership counts
         
groupTO.setDynamicUserMembershipCount(groupDAO.countUDynMembers(group));
diff --git 
a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecureRandomUtils.java
 
b/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecureRandomUtils.java
index d27e37240a..ceb4fbcaa3 100644
--- 
a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecureRandomUtils.java
+++ 
b/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecureRandomUtils.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.core.spring.security;
 
 import com.fasterxml.uuid.Generators;
-import com.fasterxml.uuid.impl.RandomBasedGenerator;
+import com.fasterxml.uuid.NoArgGenerator;
 import java.security.SecureRandom;
 import java.util.UUID;
 import org.apache.commons.text.RandomStringGenerator;
@@ -47,7 +47,7 @@ public final class SecureRandomUtils {
             withinRange('0', '9').
             build();
 
-    private static final RandomBasedGenerator UUID_GENERATOR = 
Generators.randomBasedGenerator(RANDOM);
+    private static final NoArgGenerator UUID_GENERATOR = 
Generators.timeBasedEpochGenerator(RANDOM);
 
     public static String generateRandomPassword(final int tokenLength) {
         return FOR_PASSWORD.generate(tokenLength);
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
index 3d563da894..f9411e51bd 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
@@ -32,6 +32,7 @@ import java.security.AccessControlException;
 import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -629,12 +630,14 @@ public class UserITCase extends AbstractITCase {
     @Test
     public void verifyTaskRegistration() {
         // get task list
-        PagedResult<PropagationTaskTO> tasks = TASK_SERVICE.search(
-                new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1).build());
-        assertNotNull(tasks);
-        assertFalse(tasks.getResult().isEmpty());
+        List<PropagationTaskTO> tasks = TASK_SERVICE.<PropagationTaskTO>search(
+                new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1000).build()).getResult();
+        assertFalse(tasks.isEmpty());
 
-        String maxKey = tasks.getResult().iterator().next().getKey();
+        String maxKey = tasks.stream().
+                max(Comparator.comparing(PropagationTaskTO::getStart, 
Comparator.nullsLast(Comparator.naturalOrder()))).
+                map(PropagationTaskTO::getKey).orElse(null);
+        assertNotNull(maxKey);
 
         // --------------------------------------
         // Create operation
@@ -649,11 +652,14 @@ public class UserITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         // get the new task list
-        tasks = TASK_SERVICE.search(new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1).build());
-        assertNotNull(tasks);
-        assertFalse(tasks.getResult().isEmpty());
+        tasks = TASK_SERVICE.<PropagationTaskTO>search(
+                new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1000).build()).getResult();
+        assertFalse(tasks.isEmpty());
 
-        String newMaxKey = tasks.getResult().iterator().next().getKey();
+        String newMaxKey = tasks.stream().
+                max(Comparator.comparing(PropagationTaskTO::getStart, 
Comparator.nullsLast(Comparator.naturalOrder()))).
+                map(PropagationTaskTO::getKey).orElse(null);
+        assertNotNull(newMaxKey);
 
         // default configuration for ws-target-resource2 during create:
         // only failed executions have to be registered
@@ -673,16 +679,18 @@ public class UserITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         // get the new task list
-        tasks = TASK_SERVICE.search(new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1).build());
+        tasks = TASK_SERVICE.<PropagationTaskTO>search(
+                new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1000).build()).getResult();
+        assertFalse(tasks.isEmpty());
 
         // default configuration for ws-target-resource2 during update:
         // all update executions have to be registered
-        newMaxKey = tasks.getResult().iterator().next().getKey();
+        newMaxKey = tasks.stream().
+                max(Comparator.comparing(PropagationTaskTO::getStart, 
Comparator.nullsLast(Comparator.naturalOrder()))).
+                map(PropagationTaskTO::getKey).orElse(null);
+        assertNotNull(newMaxKey);
 
-        PropagationTaskTO taskTO = TASK_SERVICE.read(TaskType.PROPAGATION, 
newMaxKey, true);
-
-        assertNotNull(taskTO);
-        assertEquals(1, taskTO.getExecutions().size());
+        assertNotNull(TASK_SERVICE.read(TaskType.PROPAGATION, newMaxKey, 
false));
 
         // --------------------------------------
         // Delete operation
@@ -690,10 +698,15 @@ public class UserITCase extends AbstractITCase {
         USER_SERVICE.delete(userTO.getKey());
 
         // get the new task list
-        tasks = TASK_SERVICE.search(new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1).build());
+        tasks = TASK_SERVICE.<PropagationTaskTO>search(
+                new 
TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(1000).build()).getResult();
+        assertFalse(tasks.isEmpty());
 
         maxKey = newMaxKey;
-        newMaxKey = tasks.getResult().iterator().next().getKey();
+        newMaxKey = tasks.stream().
+                max(Comparator.comparing(PropagationTaskTO::getStart, 
Comparator.nullsLast(Comparator.naturalOrder()))).
+                map(PropagationTaskTO::getKey).orElse(null);
+        assertNotNull(newMaxKey);
 
         // default configuration for ws-target-resource2: no delete executions 
have to be registered
         // --> no more tasks/executions should be added
diff --git a/pom.xml b/pom.xml
index 7f6ce4e940..a923afac4c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,7 @@ under the License.
   <parent>
     <groupId>org.apache</groupId>
     <artifactId>apache</artifactId>
-    <version>28</version>
+    <version>29</version>
     <relativePath />
   </parent>
 
@@ -448,7 +448,7 @@ under the License.
 
     <h2.version>2.1.214</h2.version>
 
-    <swagger-core.version>2.2.7</swagger-core.version>
+    <swagger-core.version>2.2.8</swagger-core.version>
     <swagger-ui.version>4.15.5</swagger-ui.version>
 
     <jquery-slimscroll.version>1.3.8</jquery-slimscroll.version>
@@ -671,7 +671,7 @@ under the License.
       <dependency>
         <groupId>com.fasterxml.uuid</groupId>
         <artifactId>java-uuid-generator</artifactId>
-        <version>4.0.1</version>
+        <version>4.1.0</version>
       </dependency>
 
       <dependency>

Reply via email to