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 {