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 2019/03/12 11:58:24 UTC
[syncope] branch 2_1_X updated: [SYNCOPE-1446] Do not apply
transactions to audit table
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
The following commit(s) were added to refs/heads/2_1_X by this push:
new 7992d73 [SYNCOPE-1446] Do not apply transactions to audit table
7992d73 is described below
commit 7992d7391d7015e5678694fc900c69a928d071a5
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Mar 12 11:23:07 2019 +0100
[SYNCOPE-1446] Do not apply transactions to audit table
---
.../syncope/core/logic/init/LoggerLoader.java | 20 +++---
.../provisioning/java/DefaultAuditManager.java | 3 +
.../org/apache/syncope/fit/core/LoggerITCase.java | 81 +++++++++++++++++++++-
3 files changed, 93 insertions(+), 11 deletions(-)
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
index c530e49..f599ce0 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
@@ -93,13 +93,13 @@ public class LoggerLoader implements SyncopeLoader {
};
ColumnMapping[] columnMappings = new ColumnMapping[0];
- for (Map.Entry<String, DataSource> entry : domainsHolder.getDomains().entrySet()) {
- Appender appender = ctx.getConfiguration().getAppender("audit_for_" + entry.getKey());
+ domainsHolder.getDomains().forEach((key, value) -> {
+ Appender appender = ctx.getConfiguration().getAppender("audit_for_" + key);
if (appender == null) {
appender = JdbcAppender.newBuilder().
- withName("audit_for_" + entry.getKey()).
- withIgnoreExceptions(false).
- setConnectionSource(new DataSourceConnectionSource(entry.getKey(), entry.getValue())).
+ setName("audit_for_" + key).
+ setIgnoreExceptions(false).
+ setConnectionSource(new DataSourceConnectionSource(key, value)).
setBufferSize(0).
setTableName("SYNCOPEAUDIT").
setColumnConfigs(columnConfigs).
@@ -109,15 +109,15 @@ public class LoggerLoader implements SyncopeLoader {
ctx.getConfiguration().addAppender(appender);
}
- LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(entry.getKey()), null, false);
+ LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(key), null, false);
logConf.addAppender(appender, Level.DEBUG, null);
logConf.setLevel(Level.DEBUG);
ctx.getConfiguration().addLogger(logConf.getName(), logConf);
// SYNCOPE-1144 For each custom audit appender class add related appenders to log4j logger
- auditAppenders(entry.getKey()).forEach(auditAppender -> {
+ auditAppenders(key).forEach(auditAppender -> {
auditAppender.getEvents().stream().
- map(event -> AuditLoggerName.getAuditEventLoggerName(entry.getKey(), event.toLoggerName())).
+ map(event -> AuditLoggerName.getAuditEventLoggerName(key, event.toLoggerName())).
forEachOrdered(domainAuditLoggerName -> {
LoggerConfig eventLogConf = ctx.getConfiguration().getLoggerConfig(domainAuditLoggerName);
boolean isRootLogConf = LogManager.ROOT_LOGGER_NAME.equals(eventLogConf.getName());
@@ -132,11 +132,11 @@ public class LoggerLoader implements SyncopeLoader {
});
});
- AuthContextUtils.execWithAuthContext(entry.getKey(), () -> {
+ AuthContextUtils.execWithAuthContext(key, () -> {
loggerAccessor.synchronizeLog4J(ctx);
return null;
});
- }
+ });
ctx.updateLoggers();
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
index 8a309d0..3d44e35 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
@@ -30,6 +30,7 @@ import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(readOnly = true)
@@ -72,6 +73,7 @@ public class DefaultAuditManager implements AuditManager {
return auditRequested;
}
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public void audit(final AfterHandlingEvent event) {
audit(
@@ -86,6 +88,7 @@ public class DefaultAuditManager implements AuditManager {
event.getInput());
}
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public void audit(
final String who,
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
index 52e181a..c76e5c3 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
@@ -38,7 +38,6 @@ import java.util.Properties;
import javax.ws.rs.core.Response;
import javax.xml.ws.WebServiceException;
import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.log.EventCategory;
import org.apache.syncope.common.lib.log.LogAppender;
@@ -46,6 +45,7 @@ import org.apache.syncope.common.lib.log.LogStatement;
import org.apache.syncope.common.lib.log.LoggerTO;
import org.apache.syncope.common.lib.to.ConnInstanceTO;
import org.apache.syncope.common.lib.to.ConnPoolConfTO;
+import org.apache.syncope.common.lib.to.PushTaskTO;
import org.apache.syncope.common.lib.to.ResourceTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.AuditElements;
@@ -53,7 +53,9 @@ import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
import org.apache.syncope.common.lib.types.AuditLoggerName;
import org.apache.syncope.common.lib.types.LoggerLevel;
import org.apache.syncope.common.lib.types.LoggerType;
+import org.apache.syncope.common.lib.types.MatchingRule;
import org.apache.syncope.common.lib.types.ResourceOperation;
+import org.apache.syncope.common.lib.types.UnmatchingRule;
import org.apache.syncope.common.rest.api.LoggerWrapper;
import org.apache.syncope.core.logic.ConnectorLogic;
import org.apache.syncope.core.logic.ReportLogic;
@@ -371,4 +373,81 @@ public class LoggerITCase extends AbstractITCase {
assertNotNull(userLogic);
assertEquals(1, userLogic.getEvents().stream().filter(event -> "create".equals(event)).count());
}
+
+ @Test
+ public void issueSYNCOPE1446() {
+ AuditLoggerName createSuccess = new AuditLoggerName(
+ AuditElements.EventCategoryType.PROPAGATION,
+ AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+ RESOURCE_NAME_DBSCRIPTED,
+ "create",
+ AuditElements.Result.SUCCESS);
+ AuditLoggerName createFailure = new AuditLoggerName(
+ AuditElements.EventCategoryType.PROPAGATION,
+ AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+ RESOURCE_NAME_DBSCRIPTED,
+ "create",
+ AuditElements.Result.FAILURE);
+ AuditLoggerName updateSuccess = new AuditLoggerName(
+ AuditElements.EventCategoryType.PROPAGATION,
+ AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+ RESOURCE_NAME_DBSCRIPTED,
+ "update",
+ AuditElements.Result.SUCCESS);
+ AuditLoggerName updateFailure = new AuditLoggerName(
+ AuditElements.EventCategoryType.PROPAGATION,
+ AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+ RESOURCE_NAME_DBSCRIPTED,
+ "update",
+ AuditElements.Result.FAILURE);
+ try {
+ // 1. setup audit for propagation
+ LoggerTO loggerTO = new LoggerTO();
+ loggerTO.setKey(createSuccess.toLoggerName());
+ loggerTO.setLevel(LoggerLevel.DEBUG);
+ loggerService.update(LoggerType.AUDIT, loggerTO);
+
+ loggerTO.setKey(createFailure.toLoggerName());
+ loggerService.update(LoggerType.AUDIT, loggerTO);
+
+ loggerTO.setKey(updateSuccess.toLoggerName());
+ loggerService.update(LoggerType.AUDIT, loggerTO);
+
+ loggerTO.setKey(updateFailure.toLoggerName());
+ loggerService.update(LoggerType.AUDIT, loggerTO);
+
+ // 2. push on resource
+ PushTaskTO pushTask = new PushTaskTO();
+ pushTask.setPerformCreate(true);
+ pushTask.setPerformUpdate(true);
+ pushTask.setUnmatchingRule(UnmatchingRule.PROVISION);
+ pushTask.setMatchingRule(MatchingRule.UPDATE);
+ reconciliationService.push(
+ AnyTypeKind.ANY_OBJECT, "fc6dbc3a-6c07-4965-8781-921e7401a4a5", RESOURCE_NAME_DBSCRIPTED, pushTask);
+ } catch (Exception e) {
+ LOG.error("Unexpected exception", e);
+ fail(e.getMessage());
+ } finally {
+ try {
+ loggerService.delete(LoggerType.AUDIT, createSuccess.toLoggerName());
+ } catch (Exception e) {
+ // ignore
+ }
+ try {
+ loggerService.delete(LoggerType.AUDIT, createFailure.toLoggerName());
+ } catch (Exception e) {
+ // ignore
+ }
+ try {
+ loggerService.delete(LoggerType.AUDIT, updateSuccess.toLoggerName());
+ } catch (Exception e) {
+ // ignore
+ }
+ try {
+ loggerService.delete(LoggerType.AUDIT, updateFailure.toLoggerName());
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
}