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ò <ilgro...@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 + } + } + } }