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 2021/07/02 10:01:13 UTC

[syncope] 03/03: Clearing up interactions across Remediation, Audit and Delegation

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 746c3f3ad595a473345c2f488e572d0e62c0090b
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Jul 2 10:00:10 2021 +0200

    Clearing up interactions across Remediation, Audit and Delegation
---
 .../syncope/core/logic/LogicInvocationHandler.java | 22 +++----
 .../syncope/core/logic/RemediationLogic.java       | 76 +++++++---------------
 .../persistence/jpa/dao/JPARemediationDAO.java     |  4 +-
 .../provisioning/java/job/AfterHandlingJob.java    |  9 ++-
 .../provisioning/java/job/SetUMembershipsJob.java  |  3 +
 .../java/pushpull/SchedulingPullActions.java       |  7 +-
 6 files changed, 50 insertions(+), 71 deletions(-)

diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
index f1d4fd0..809a333 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
@@ -20,14 +20,11 @@ package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
 import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.core.provisioning.api.AuditManager;
 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
 import org.apache.syncope.core.provisioning.api.event.AfterHandlingEvent;
-import org.apache.syncope.core.provisioning.java.job.AfterHandlingJob;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
@@ -36,7 +33,6 @@ import org.aspectj.lang.reflect.MethodSignature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
 @Aspect
 public class LogicInvocationHandler {
@@ -49,9 +45,6 @@ public class LogicInvocationHandler {
     @Autowired
     private AuditManager auditManager;
 
-    @Autowired
-    private SchedulerFactoryBean scheduler;
-
     @Around("execution(* org.apache.syncope.core.logic.AbstractLogic+.*(..))")
     public Object around(final ProceedingJoinPoint joinPoint) throws Throwable {
         Class<?> clazz = joinPoint.getTarget().getClass();
@@ -99,8 +92,7 @@ public class LogicInvocationHandler {
             throw t;
         } finally {
             if (notificationsAvailable || auditRequested) {
-                Map<String, Object> jobMap = new HashMap<>();
-                jobMap.put(AfterHandlingEvent.JOBMAP_KEY, new AfterHandlingEvent(
+                AfterHandlingEvent afterHandlingEvent = new AfterHandlingEvent(
                         AuthContextUtils.getWho(),
                         AuditElements.EventCategoryType.LOGIC,
                         category,
@@ -109,8 +101,16 @@ public class LogicInvocationHandler {
                         condition,
                         before,
                         output,
-                        input));
-                AfterHandlingJob.schedule(scheduler, jobMap);
+                        input);
+                AuthContextUtils.execWithAuthContext(AuthContextUtils.getDomain(), () -> {
+                    try {
+                        notificationManager.createTasks(afterHandlingEvent);
+                        auditManager.audit(afterHandlingEvent);
+                    } catch (Throwable t) {
+                        LOG.error("While managing Audit and Notifications", t);
+                    }
+                    return null;
+                });
             }
         }
     }
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
index 986da0d..9b593e4 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -46,7 +47,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 @Component
-public class RemediationLogic extends AbstractTransactionalLogic<RemediationTO> {
+public class RemediationLogic extends AbstractLogic<RemediationTO> {
 
     @Autowired
     private UserLogic userLogic;
@@ -81,111 +82,80 @@ public class RemediationLogic extends AbstractTransactionalLogic<RemediationTO>
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_READ + "')")
     @Transactional(readOnly = true)
     public RemediationTO read(final String key) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
+        Remediation remediation = Optional.ofNullable(remediationDAO.find(key)).
+                orElseThrow(() -> new NotFoundException(key));
 
         return binder.getRemediationTO(remediation);
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_DELETE + "')")
+    @Transactional
     public void delete(final String key) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
+        Optional.ofNullable(remediationDAO.find(key)).
+                orElseThrow(() -> new NotFoundException(key));
 
-            throw new NotFoundException(key);
-        }
-
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_REMEDY + "')")
     public ProvisioningResult<?> remedy(final String key, final AnyTO anyTO, final boolean nullPriorityAsync) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
-
         ProvisioningResult<?> result;
-        switch (remediation.getAnyType().getKind()) {
-            case USER:
-            default:
+        switch (read(key).getAnyType()) {
+            case "USER":
                 result = userLogic.create((UserTO) anyTO, true, nullPriorityAsync);
                 break;
 
-            case GROUP:
+            case "GROUP":
                 result = groupLogic.create((GroupTO) anyTO, nullPriorityAsync);
                 break;
 
-            case ANY_OBJECT:
+            default:
                 result = anyObjectLogic.create((AnyObjectTO) anyTO, nullPriorityAsync);
         }
 
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
 
         return result;
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_REMEDY + "')")
     public ProvisioningResult<?> remedy(final String key, final AnyPatch anyPatch, final boolean nullPriorityAsync) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
-
         ProvisioningResult<?> result;
-        switch (remediation.getAnyType().getKind()) {
-            case USER:
-            default:
+        switch (read(key).getAnyType()) {
+            case "USER":
                 result = userLogic.update((UserPatch) anyPatch, nullPriorityAsync);
                 break;
 
-            case GROUP:
+            case "GROUP":
                 result = groupLogic.update((GroupPatch) anyPatch, nullPriorityAsync);
                 break;
 
-            case ANY_OBJECT:
+            default:
                 result = anyObjectLogic.update((AnyObjectPatch) anyPatch, nullPriorityAsync);
         }
 
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
 
         return result;
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_REMEDY + "')")
     public ProvisioningResult<?> remedy(final String key, final String anyKey, final boolean nullPriorityAsync) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
-
         ProvisioningResult<?> result;
-        switch (remediation.getAnyType().getKind()) {
-            case USER:
-            default:
+        switch (read(key).getAnyType()) {
+            case "USER":
                 result = userLogic.delete(anyKey, nullPriorityAsync);
                 break;
 
-            case GROUP:
+            case "GROUP":
                 result = groupLogic.delete(anyKey, nullPriorityAsync);
                 break;
 
-            case ANY_OBJECT:
+            default:
                 result = anyObjectLogic.delete(anyKey, nullPriorityAsync);
         }
 
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
 
         return result;
     }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
index c0309b3..f8aefa1 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
@@ -29,11 +29,13 @@ import org.apache.syncope.core.persistence.api.entity.Remediation;
 import org.apache.syncope.core.persistence.api.entity.task.PullTask;
 import org.apache.syncope.core.persistence.jpa.entity.JPARemediation;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ReflectionUtils;
 
 @Repository
 public class JPARemediationDAO extends AbstractDAO<Remediation> implements RemediationDAO {
 
+    @Transactional(readOnly = true)
     @Override
     public Remediation find(final String key) {
         return entityManager().find(JPARemediation.class, key);
@@ -122,6 +124,7 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
         entityManager().remove(remediation);
     }
 
+    @Transactional
     @Override
     public void delete(final String key) {
         Remediation remediation = find(key);
@@ -131,5 +134,4 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
 
         delete(remediation);
     }
-
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java
index 82f6d42..8bc0180 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java
@@ -31,6 +31,7 @@ import org.quartz.JobBuilder;
 import org.quartz.JobDataMap;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
+import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
@@ -53,18 +54,18 @@ public class AfterHandlingJob extends AbstractInterruptableJob {
         @SuppressWarnings("unchecked")
         AfterHandlingJob jobInstance = (AfterHandlingJob) ApplicationContextProvider.getBeanFactory().
                 createBean(AfterHandlingJob.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
-        String jobName = AfterHandlingJob.class.getName() + SecureRandomUtils.generateRandomUUID();
+        String jobName = AfterHandlingJob.class.getSimpleName() + SecureRandomUtils.generateRandomUUID();
 
         jobMap.put(JobManager.DOMAIN_KEY, AuthContextUtils.getDomain());
 
         ApplicationContextProvider.getBeanFactory().registerSingleton(jobName, jobInstance);
 
         JobBuilder jobDetailBuilder = JobBuilder.newJob(AfterHandlingJob.class).
-                withIdentity(jobName).
+                withIdentity(jobName, Scheduler.DEFAULT_GROUP).
                 usingJobData(new JobDataMap(jobMap));
 
         TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().
-                withIdentity(JobNamer.getTriggerName(jobName)).
+                withIdentity(JobNamer.getTriggerName(jobName), Scheduler.DEFAULT_GROUP).
                 startNow();
 
         try {
@@ -93,6 +94,8 @@ public class AfterHandlingJob extends AbstractInterruptableJob {
                     });
         } catch (RuntimeException e) {
             throw new JobExecutionException("While handling notification / audit events", e);
+        } finally {
+            ApplicationContextProvider.getBeanFactory().destroySingleton(context.getJobDetail().getKey().getName());
         }
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java
index 993c999..b8efd00 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java
@@ -27,6 +27,7 @@ import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.job.JobManager;
+import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -115,6 +116,8 @@ public class SetUMembershipsJob extends AbstractInterruptableJob {
         } catch (RuntimeException e) {
             LOG.error("While setting memberships", e);
             throw new JobExecutionException("While executing memberships", e);
+        } finally {
+            ApplicationContextProvider.getBeanFactory().destroySingleton(context.getJobDetail().getKey().getName());
         }
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java
index c7b0bea..cdf4483 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java
@@ -29,6 +29,7 @@ import org.quartz.Job;
 import org.quartz.JobBuilder;
 import org.quartz.JobDataMap;
 import org.quartz.JobExecutionException;
+import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
@@ -52,18 +53,18 @@ public abstract class SchedulingPullActions implements PullActions {
         @SuppressWarnings("unchecked")
         T jobInstance = (T) ApplicationContextProvider.getBeanFactory().
                 createBean(reference, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
-        String jobName = getClass().getName() + SecureRandomUtils.generateRandomUUID();
+        String jobName = getClass().getSimpleName() + SecureRandomUtils.generateRandomUUID();
 
         jobMap.put(JobManager.DOMAIN_KEY, AuthContextUtils.getDomain());
 
         ApplicationContextProvider.getBeanFactory().registerSingleton(jobName, jobInstance);
 
         JobBuilder jobDetailBuilder = JobBuilder.newJob(reference).
-                withIdentity(jobName).
+                withIdentity(jobName, Scheduler.DEFAULT_GROUP).
                 usingJobData(new JobDataMap(jobMap));
 
         TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().
-                withIdentity(JobNamer.getTriggerName(jobName)).
+                withIdentity(JobNamer.getTriggerName(jobName), Scheduler.DEFAULT_GROUP).
                 startNow();
 
         try {