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
The following commit(s) were added to refs/heads/master by this push: new 39d5371b37 [SYNCOPE-1720] Switching to time-based epoch generator 39d5371b37 is described below commit 39d5371b37884e910e5a14653076be9aed597f61 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 3373faac06..8cf6dda354 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> @@ -452,7 +452,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> @@ -675,7 +675,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>