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
+            }
+        }
+    }
 }

Reply via email to