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 2015/08/11 16:20:38 UTC

syncope git commit: [SYNCOPE-652] Adjusting log management

Repository: syncope
Updated Branches:
  refs/heads/SYNCOPE-652 c853f742f -> f098a832e


[SYNCOPE-652] Adjusting log management


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/f098a832
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/f098a832
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/f098a832

Branch: refs/heads/SYNCOPE-652
Commit: f098a832e7d00b33f0f590d81e18ce6f4bc77a71
Parents: c853f74
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Aug 11 16:19:14 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Aug 11 16:20:24 2015 +0200

----------------------------------------------------------------------
 .../client/cli/commands/LoggerCommand.java      |   6 +-
 .../client/console/rest/LoggerRestClient.java   |  11 +-
 .../apache/syncope/common/lib/to/LoggerTO.java  |   2 +
 .../common/rest/api/service/LoggerService.java  |   6 +-
 core/logic/pom.xml                              |   7 +
 .../syncope/core/logic/init/LoggerAccessor.java |  95 +++++++++++++
 .../syncope/core/logic/init/LoggerLoader.java   |  65 ++-------
 .../apache/syncope/core/logic/AbstractTest.java |   1 -
 .../apache/syncope/core/logic/MappingTest.java  |  69 ----------
 core/logic/src/test/resources/logicTest.xml     |  19 ++-
 .../core/misc/security/AuthContextUtils.java    |  16 +++
 .../core/misc/security/AuthDataAccessor.java    |   6 +
 .../security/SyncopeAuthenticationProvider.java |  99 ++++++--------
 .../core/provisioning/java/MappingTest.java     |  69 ++++++++++
 .../java/ResourceDataBinderTest.java            | 130 ++++++++++++++++++
 .../java/data/ResourceDataBinderTest.java       | 132 -------------------
 .../rest/cxf/service/LoggerServiceImpl.java     |  10 +-
 .../src/main/resources/log4j2.xml               |   6 +
 .../fit/core/reference/LoggerITCase.java        |   7 +-
 19 files changed, 419 insertions(+), 337 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
index bbb826a..469e68a 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/LoggerCommand.java
@@ -105,7 +105,7 @@ public class LoggerCommand extends AbstractCommand {
                 final LoggerTO loggerTO = loggerService.read(LoggerType.LOG, log.getKey());
                 try {
                     loggerTO.setLevel(LoggerLevel.valueOf(log.getValue()));
-                    loggerService.update(LoggerType.LOG, loggerTO.getKey(), loggerTO);
+                    loggerService.update(LoggerType.LOG, loggerTO);
                     System.out.println(" - Logger " + loggerTO.getKey() + " new level -> " + loggerTO.getLevel());
                 } catch (final SyncopeClientException ex) {
                     System.out.println(" - Error: " + ex.getMessage());
@@ -121,7 +121,7 @@ public class LoggerCommand extends AbstractCommand {
             for (final LoggerTO loggerTO : loggerService.list(LoggerType.LOG)) {
                 try {
                     loggerTO.setLevel(LoggerLevel.valueOf(logLevel));
-                    loggerService.update(LoggerType.LOG, loggerTO.getKey(), loggerTO);
+                    loggerService.update(LoggerType.LOG, loggerTO);
                     System.out.println(" - Logger " + loggerTO.getKey() + " new level -> " + loggerTO.getLevel());
                 } catch (final SyncopeClientException ex) {
                     System.out.println(" - Error: " + ex.getMessage());
@@ -140,7 +140,7 @@ public class LoggerCommand extends AbstractCommand {
                 try {
                     loggerTO.setKey(entrySet.getKey());
                     loggerTO.setLevel(LoggerLevel.valueOf(entrySet.getValue()));
-                    loggerService.update(LoggerType.LOG, loggerTO.getKey(), loggerTO);
+                    loggerService.update(LoggerType.LOG, loggerTO);
                     System.out.println(" - Logger " + loggerTO.getKey() + " created with level -> " + loggerTO.
                             getLevel());
                 } catch (final SyncopeClientException ex) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
index 318edcb..627e828 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
@@ -59,19 +59,18 @@ public class LoggerRestClient extends BaseRestClient {
         return result;
     }
 
-    public void setLogLevel(final String name, final LoggerLevel level) {
+    public void setLogLevel(final String key, final LoggerLevel level) {
         LoggerTO loggerTO = new LoggerTO();
-        loggerTO.setKey(name);
+        loggerTO.setKey(key);
         loggerTO.setLevel(level);
-        getService(LoggerService.class).update(LoggerType.LOG, name, loggerTO);
+        getService(LoggerService.class).update(LoggerType.LOG, loggerTO);
     }
 
     public void enableAudit(final AuditLoggerName auditLoggerName) {
-        String name = auditLoggerName.toLoggerName();
         LoggerTO loggerTO = new LoggerTO();
-        loggerTO.setKey(name);
+        loggerTO.setKey(auditLoggerName.toLoggerName());
         loggerTO.setLevel(LoggerLevel.DEBUG);
-        getService(LoggerService.class).update(LoggerType.AUDIT, name, loggerTO);
+        getService(LoggerService.class).update(LoggerType.AUDIT, loggerTO);
     }
 
     public void deleteLog(final String name) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/common/lib/src/main/java/org/apache/syncope/common/lib/to/LoggerTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/LoggerTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/LoggerTO.java
index 810a143..6e1ce1d 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/LoggerTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/LoggerTO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.syncope.common.lib.AbstractBaseBean;
@@ -41,6 +42,7 @@ public class LoggerTO extends AbstractBaseBean {
         this.level = level;
     }
 
+    @PathParam("key")
     public String getKey() {
         return key;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
index 6ab40e7..3b89b7c 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
@@ -76,14 +76,12 @@ public interface LoggerService extends JAXRSService {
      * Creates or updates (if existing) the logger with matching name.
      *
      * @param type LoggerType to be selected
-     * @param name Logger name to be updated
      * @param logger Logger to be created or updated
      */
     @PUT
-    @Path("{type}/{name}")
+    @Path("{type}/{key}")
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    void update(@NotNull @PathParam("type") LoggerType type, @NotNull @PathParam("name") String name,
-            @NotNull LoggerTO logger);
+    void update(@NotNull @PathParam("type") LoggerType type, @NotNull LoggerTO logger);
 
     /**
      * Deletes the logger with matching name.

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/logic/pom.xml
----------------------------------------------------------------------
diff --git a/core/logic/pom.xml b/core/logic/pom.xml
index 7ce109f..d652f3e 100644
--- a/core/logic/pom.xml
+++ b/core/logic/pom.xml
@@ -163,6 +163,13 @@ under the License.
         <directory>${basedir}/../persistence-jpa/src/test/resources</directory>
         <filtering>true</filtering>
       </testResource>
+      <testResource>
+        <directory>${basedir}/../provisioning-java/src/main/resources</directory>
+        <includes>
+          <include>connid.properties</include>
+        </includes>
+        <filtering>true</filtering>
+      </testResource>
     </testResources>
     
     <plugins>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
new file mode 100644
index 0000000..e83a768
--- /dev/null
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerAccessor.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.logic.init;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.types.LoggerLevel;
+import org.apache.syncope.common.lib.types.LoggerType;
+import org.apache.syncope.core.misc.security.AuthContextUtils;
+import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
+import org.apache.syncope.core.persistence.api.entity.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Domain-sensible (via {@code @Transactional} access to logger / audit data.
+ *
+ * @see LoggerLoader
+ */
+@Component
+public class LoggerAccessor {
+
+    @Autowired
+    private LoggerDAO loggerDAO;
+
+    @Autowired
+    private EntityFactory entityFactory;
+
+    @Transactional
+    public void synchronizeLog4J(final LoggerContext ctx) {
+        Map<String, Logger> syncopeLoggers = new HashMap<>();
+        if (SyncopeConstants.MASTER_DOMAIN.equals(AuthContextUtils.getDomain())) {
+            for (Logger syncopeLogger : loggerDAO.findAll(LoggerType.LOG)) {
+                syncopeLoggers.put(syncopeLogger.getKey(), syncopeLogger);
+            }
+        }
+        for (Logger syncopeLogger : loggerDAO.findAll(LoggerType.AUDIT)) {
+            syncopeLoggers.put(syncopeLogger.getKey(), syncopeLogger);
+        }
+
+        /*
+         * Traverse all defined log4j loggers: if there is a matching SyncopeLogger, set log4j level accordingly,
+         * otherwise create a SyncopeLogger instance with given name and level.
+         */
+        for (LoggerConfig logConf : ctx.getConfiguration().getLoggers().values()) {
+            if (!LogManager.ROOT_LOGGER_NAME.equals(logConf.getName()) && logConf.getLevel() != null) {
+                String loggerName = logConf.getName();
+                if (syncopeLoggers.containsKey(loggerName)) {
+                    logConf.setLevel(syncopeLoggers.get(loggerName).getLevel().getLevel());
+                    syncopeLoggers.remove(loggerName);
+                } else if (!loggerName.equals(LoggerType.AUDIT.getPrefix())) {
+                    Logger syncopeLogger = entityFactory.newEntity(Logger.class);
+                    syncopeLogger.setKey(loggerName);
+                    syncopeLogger.setLevel(LoggerLevel.fromLevel(logConf.getLevel()));
+                    syncopeLogger.setType(loggerName.startsWith(LoggerType.AUDIT.getPrefix())
+                            ? LoggerType.AUDIT
+                            : LoggerType.LOG);
+                    loggerDAO.save(syncopeLogger);
+                }
+            }
+        }
+
+        /*
+         * Foreach SyncopeLogger not found in log4j create a new log4j logger with given name and level.
+         */
+        for (Logger syncopeLogger : syncopeLoggers.values()) {
+            LoggerConfig logConf = ctx.getConfiguration().getLoggerConfig(syncopeLogger.getKey());
+            if (!LogManager.ROOT_LOGGER_NAME.equals(logConf.getName()) && logConf.getLevel() != null) {
+                logConf.setLevel(syncopeLogger.getLevel().getLevel());
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
----------------------------------------------------------------------
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 e86b46a..6187959 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
@@ -20,7 +20,6 @@ package org.apache.syncope.core.logic.init;
 
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.HashMap;
 import java.util.Map;
 import javax.sql.DataSource;
 import org.apache.logging.log4j.Level;
@@ -31,15 +30,10 @@ import org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig;
 import org.apache.logging.log4j.core.appender.db.jdbc.ConnectionSource;
 import org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender;
 import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.types.LoggerLevel;
-import org.apache.syncope.common.lib.types.LoggerType;
 import org.apache.syncope.core.misc.AuditManager;
+import org.apache.syncope.core.misc.security.AuthContextUtils;
 import org.apache.syncope.core.persistence.api.DomainsHolder;
 import org.apache.syncope.core.persistence.api.SyncopeLoader;
-import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
-import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.datasource.DataSourceUtils;
 import org.springframework.stereotype.Component;
@@ -52,10 +46,7 @@ public class LoggerLoader implements SyncopeLoader {
     private DomainsHolder domainsHolder;
 
     @Autowired
-    private LoggerDAO loggerDAO;
-
-    @Autowired
-    private EntityFactory entityFactory;
+    private LoggerAccessor loggerAccessor;
 
     @Override
     public Integer getPriority() {
@@ -65,9 +56,9 @@ public class LoggerLoader implements SyncopeLoader {
     @Transactional
     @Override
     public void load() {
-        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
+        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
 
-        // 1. Audit table and DataSource for each configured domain
+        // Audit table and DataSource for each configured domain
         ColumnConfig[] columns = {
             ColumnConfig.createColumnConfig(ctx.getConfiguration(), "EVENT_DATE", null, null, "true", null, null),
             ColumnConfig.createColumnConfig(ctx.getConfiguration(), "LOGGER_LEVEL", "%level", null, null, null, null),
@@ -90,52 +81,18 @@ public class LoggerLoader implements SyncopeLoader {
                 ctx.getConfiguration().addAppender(appender);
             }
 
-            LoggerConfig logConf = new LoggerConfig(
-                    AuditManager.getDomainAuditLoggerName(entry.getKey()), null, false);
+            LoggerConfig logConf = new LoggerConfig(AuditManager.getDomainAuditLoggerName(entry.getKey()), null, false);
             logConf.addAppender(appender, Level.DEBUG, null);
             ctx.getConfiguration().addLogger(AuditManager.getDomainAuditLoggerName(entry.getKey()), logConf);
-        }
-        ctx.updateLoggers();
-
-        // 2. Aligning log4j conf with database content
-        Map<String, Logger> syncopeLoggers = new HashMap<>();
-        for (Logger syncopeLogger : loggerDAO.findAll(LoggerType.LOG)) {
-            syncopeLoggers.put(syncopeLogger.getKey(), syncopeLogger);
-        }
 
-        for (Logger syncopeLogger : loggerDAO.findAll(LoggerType.AUDIT)) {
-            syncopeLoggers.put(syncopeLogger.getKey(), syncopeLogger);
-        }
+            AuthContextUtils.execWithAuthContext(entry.getKey(), new AuthContextUtils.Executable<Void>() {
 
-        /*
-         * Traverse all defined log4j loggers: if there is a matching SyncopeLogger, set log4j level accordingly,
-         * otherwise create a SyncopeLogger instance with given name and level.
-         */
-        for (LoggerConfig logConf : ctx.getConfiguration().getLoggers().values()) {
-            final String loggerName = LogManager.ROOT_LOGGER_NAME.equals(logConf.getName())
-                    ? SyncopeConstants.ROOT_LOGGER : logConf.getName();
-            if (logConf.getLevel() != null) {
-                if (syncopeLoggers.containsKey(loggerName)) {
-                    logConf.setLevel(syncopeLoggers.get(loggerName).getLevel().getLevel());
-                    syncopeLoggers.remove(loggerName);
-                } else if (!loggerName.equals(LoggerType.AUDIT.getPrefix())) {
-                    Logger syncopeLogger = entityFactory.newEntity(Logger.class);
-                    syncopeLogger.setKey(loggerName);
-                    syncopeLogger.setLevel(LoggerLevel.fromLevel(logConf.getLevel()));
-                    syncopeLogger.setType(loggerName.startsWith(LoggerType.AUDIT.getPrefix())
-                            ? LoggerType.AUDIT
-                            : LoggerType.LOG);
-                    loggerDAO.save(syncopeLogger);
+                @Override
+                public Void exec() {
+                    loggerAccessor.synchronizeLog4J(ctx);
+                    return null;
                 }
-            }
-        }
-
-        /*
-         * Foreach SyncopeLogger not found in log4j create a new log4j logger with given name and level.
-         */
-        for (Logger syncopeLogger : syncopeLoggers.values()) {
-            LoggerConfig logConf = ctx.getConfiguration().getLoggerConfig(syncopeLogger.getKey());
-            logConf.setLevel(syncopeLogger.getLevel().getLevel());
+            });
         }
 
         ctx.updateLoggers();

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java
----------------------------------------------------------------------
diff --git a/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java b/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java
index d4b0fa4..32ae367 100644
--- a/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java
+++ b/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java
@@ -30,7 +30,6 @@ import org.springframework.test.context.transaction.TransactionConfiguration;
     "classpath:provisioningContext.xml",
     "classpath:logicContext.xml",
     "classpath:workflowContext.xml",
-    "classpath:persistenceTest.xml",
     "classpath:logicTest.xml"
 })
 @TransactionConfiguration(transactionManager = "MasterTransactionManager")

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java
----------------------------------------------------------------------
diff --git a/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java b/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java
deleted file mode 100644
index 770bac9..0000000
--- a/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.logic;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.syncope.core.misc.MappingUtils;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.Provision;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.identityconnectors.framework.common.objects.Name;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class MappingTest extends AbstractTest {
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Test
-    public void connObjectLink() {
-        ExternalResource ldap = resourceDAO.find("resource-ldap");
-        assertNotNull(ldap);
-
-        Provision provision = ldap.getProvision(anyTypeDAO.findUser());
-        assertNotNull(provision);
-        assertNotNull(provision.getMapping());
-        assertNotNull(provision.getMapping().getConnObjectLink());
-
-        User user = userDAO.find("rossini");
-        assertNotNull(user);
-
-        Name name = MappingUtils.evaluateNAME(user, provision, user.getUsername());
-        assertEquals("uid=rossini,ou=people,o=isp", name.getNameValue());
-
-        provision.getMapping().setConnObjectLink("'uid=' + username + ',o=' + realm + ',ou=people,o=isp'");
-
-        name = MappingUtils.evaluateNAME(user, provision, user.getUsername());
-        assertEquals("uid=rossini,o=even,ou=people,o=isp", name.getNameValue());
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/logic/src/test/resources/logicTest.xml
----------------------------------------------------------------------
diff --git a/core/logic/src/test/resources/logicTest.xml b/core/logic/src/test/resources/logicTest.xml
index 2dca918..fd6edd6 100644
--- a/core/logic/src/test/resources/logicTest.xml
+++ b/core/logic/src/test/resources/logicTest.xml
@@ -19,8 +19,11 @@ under the License.
 -->
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
-                           http://www.springframework.org/schema/beans/spring-beans.xsd">
+                           http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context
+                           http://www.springframework.org/schema/context/spring-context.xsd">
     
   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="locations">
@@ -39,4 +42,18 @@ under the License.
     <property name="ignoreUnresolvablePlaceholders" value="true"/>
   </bean>
 
+  <bean class="org.apache.syncope.core.misc.spring.ApplicationContextProvider"/>
+
+  <bean id="adminUser" class="java.lang.String">
+    <constructor-arg value="${adminUser}"/>
+  </bean>
+  <bean id="anonymousUser" class="java.lang.String">
+    <constructor-arg value="${anonymousUser}"/>
+  </bean>
+  
+  <context:component-scan base-package="org.apache.syncope.core.misc.policy"/>
+  <context:component-scan base-package="org.apache.syncope.core.misc.security"/>
+
+  <import resource="persistenceContext.xml"/>
+  
 </beans>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
index 38240d9..4586ee3 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthContextUtils.java
@@ -39,6 +39,11 @@ import org.springframework.security.core.userdetails.User;
 
 public final class AuthContextUtils {
 
+    public interface Executable<T> {
+
+        T exec();
+    }
+
     public static String getUsername() {
         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
         return authentication == null ? SyncopeConstants.UNAUTHENTICATED : authentication.getName();
@@ -106,6 +111,17 @@ public final class AuthContextUtils {
         SecurityContextHolder.clearContext();
     }
 
+    public static <T> T execWithAuthContext(final String domainKey, final Executable<T> executable) {
+        SecurityContext ctx = SecurityContextHolder.getContext();
+        setFakeAuth(domainKey);
+        try {
+            return executable.exec();
+        } finally {
+            clearFakeAuth();
+            SecurityContextHolder.setContext(ctx);
+        }
+    }
+
     /**
      * Private default constructor, for static-only classes.
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
index 7643f9d..052cc30 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
@@ -64,6 +64,12 @@ import org.springframework.security.core.Authentication;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.transaction.annotation.Transactional;
 
+/**
+ * Domain-sensible (via {@code @Transactional} access to authentication / authorization data.
+ *
+ * @see SyncopeAuthenticationProvider
+ * @see SyncopeAuthenticationDetails
+ */
 public class AuthDataAccessor {
 
     protected static final Logger LOG = LoggerFactory.getLogger(AuthDataAccessor.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeAuthenticationProvider.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeAuthenticationProvider.java b/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeAuthenticationProvider.java
index c8fa53d..ff7e453 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeAuthenticationProvider.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/security/SyncopeAuthenticationProvider.java
@@ -25,6 +25,7 @@ import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
+import org.apache.syncope.core.misc.security.AuthContextUtils.Executable;
 import org.apache.syncope.core.persistence.api.entity.Domain;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.slf4j.Logger;
@@ -35,8 +36,6 @@ import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetailsService;
 
 @Configurable
@@ -91,17 +90,6 @@ public class SyncopeAuthenticationProvider implements AuthenticationProvider {
         this.userDetailsService = syncopeUserDetailsService;
     }
 
-    protected <T> T execWithAuthContext(final String domainKey, final Executable<T> executable) {
-        SecurityContext ctx = SecurityContextHolder.getContext();
-        AuthContextUtils.setFakeAuth(domainKey);
-        try {
-            return executable.exec();
-        } finally {
-            AuthContextUtils.clearFakeAuth();
-            SecurityContextHolder.setContext(ctx);
-        }
-    }
-
     @Override
     public Authentication authenticate(final Authentication authentication) {
         String domainKey = SyncopeAuthenticationDetails.class.cast(authentication.getDetails()).getDomain();
@@ -121,22 +109,23 @@ public class SyncopeAuthenticationProvider implements AuthenticationProvider {
                         adminPassword);
             } else {
                 final String domainToFind = domainKey;
-                authenticated = execWithAuthContext(SyncopeConstants.MASTER_DOMAIN, new Executable<Boolean>() {
-
-                    @Override
-                    public Boolean exec() {
-                        Domain domain = dataAccessor.findDomain(domainToFind);
-
-                        return encryptor.verify(
-                                authentication.getCredentials().toString(),
-                                domain.getAdminCipherAlgorithm(),
-                                domain.getAdminPwd());
-                    }
-                });
+                authenticated = AuthContextUtils.execWithAuthContext(
+                        SyncopeConstants.MASTER_DOMAIN, new Executable<Boolean>() {
+
+                            @Override
+                            public Boolean exec() {
+                                Domain domain = dataAccessor.findDomain(domainToFind);
+
+                                return encryptor.verify(
+                                        authentication.getCredentials().toString(),
+                                        domain.getAdminCipherAlgorithm(),
+                                        domain.getAdminPwd());
+                            }
+                        });
             }
         } else {
             final Pair<Long, Boolean> authResult =
-                    execWithAuthContext(domainKey, new Executable<Pair<Long, Boolean>>() {
+                    AuthContextUtils.execWithAuthContext(domainKey, new Executable<Pair<Long, Boolean>>() {
 
                         @Override
                         public Pair<Long, Boolean> exec() {
@@ -145,7 +134,7 @@ public class SyncopeAuthenticationProvider implements AuthenticationProvider {
                     });
             authenticated = authResult.getValue();
             if (!authenticated) {
-                execWithAuthContext(domainKey, new Executable<Void>() {
+                AuthContextUtils.execWithAuthContext(domainKey, new Executable<Void>() {
 
                     @Override
                     public Void exec() {
@@ -159,35 +148,36 @@ public class SyncopeAuthenticationProvider implements AuthenticationProvider {
         final boolean isAuthenticated = authenticated;
         UsernamePasswordAuthenticationToken token;
         if (isAuthenticated) {
-            token = execWithAuthContext(domainKey, new Executable<UsernamePasswordAuthenticationToken>() {
-
-                @Override
-                public UsernamePasswordAuthenticationToken exec() {
-                    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
-                            authentication.getPrincipal(),
-                            null,
-                            userDetailsService.loadUserByUsername(authentication.getPrincipal().toString()).
-                            getAuthorities());
-                    token.setDetails(authentication.getDetails());
+            token = AuthContextUtils.execWithAuthContext(
+                    domainKey, new Executable<UsernamePasswordAuthenticationToken>() {
 
-                    dataAccessor.audit(
-                            AuditElements.EventCategoryType.REST,
-                            AuditElements.AUTHENTICATION_CATEGORY,
-                            null,
-                            AuditElements.LOGIN_EVENT,
-                            Result.SUCCESS,
-                            null,
-                            isAuthenticated,
-                            authentication,
-                            "Successfully authenticated, with entitlements: " + token.getAuthorities());
-                    return token;
-                }
-            });
+                        @Override
+                        public UsernamePasswordAuthenticationToken exec() {
+                            UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
+                                    authentication.getPrincipal(),
+                                    null,
+                                    userDetailsService.loadUserByUsername(authentication.getPrincipal().toString()).
+                                    getAuthorities());
+                            token.setDetails(authentication.getDetails());
+
+                            dataAccessor.audit(
+                                    AuditElements.EventCategoryType.REST,
+                                    AuditElements.AUTHENTICATION_CATEGORY,
+                                    null,
+                                    AuditElements.LOGIN_EVENT,
+                                    Result.SUCCESS,
+                                    null,
+                                    isAuthenticated,
+                                    authentication,
+                                    "Successfully authenticated, with entitlements: " + token.getAuthorities());
+                            return token;
+                        }
+                    });
 
-            LOG.debug("User {} successfully authenticated, with groups {}",
+            LOG.debug("User {} successfully authenticated, with entitlements {}",
                     authentication.getPrincipal(), token.getAuthorities());
         } else {
-            execWithAuthContext(domainKey, new Executable<Void>() {
+            AuthContextUtils.execWithAuthContext(domainKey, new Executable<Void>() {
 
                 @Override
                 public Void exec() {
@@ -217,9 +207,4 @@ public class SyncopeAuthenticationProvider implements AuthenticationProvider {
     public boolean supports(final Class<? extends Object> type) {
         return type.equals(UsernamePasswordAuthenticationToken.class);
     }
-
-    protected interface Executable<T> {
-
-        T exec();
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
new file mode 100644
index 0000000..eb100f3
--- /dev/null
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.provisioning.java;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.syncope.core.misc.MappingUtils;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.identityconnectors.framework.common.objects.Name;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class MappingTest extends AbstractTest {
+
+    @Autowired
+    private ExternalResourceDAO resourceDAO;
+
+    @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Test
+    public void connObjectLink() {
+        ExternalResource ldap = resourceDAO.find("resource-ldap");
+        assertNotNull(ldap);
+
+        Provision provision = ldap.getProvision(anyTypeDAO.findUser());
+        assertNotNull(provision);
+        assertNotNull(provision.getMapping());
+        assertNotNull(provision.getMapping().getConnObjectLink());
+
+        User user = userDAO.find("rossini");
+        assertNotNull(user);
+
+        Name name = MappingUtils.evaluateNAME(user, provision, user.getUsername());
+        assertEquals("uid=rossini,ou=people,o=isp", name.getNameValue());
+
+        provision.getMapping().setConnObjectLink("'uid=' + username + ',o=' + realm + ',ou=people,o=isp'");
+
+        name = MappingUtils.evaluateNAME(user, provision, user.getUsername());
+        assertEquals("uid=rossini,o=even,ou=people,o=isp", name.getNameValue());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
new file mode 100644
index 0000000..f0a706c
--- /dev/null
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.provisioning.java;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.syncope.common.lib.to.MappingTO;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.common.lib.types.MappingPurpose;
+import org.apache.syncope.common.lib.types.PropagationMode;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
+import org.apache.syncope.core.persistence.api.entity.PlainSchema;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
+import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
+import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class ResourceDataBinderTest extends AbstractTest {
+
+    @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
+    private ExternalResourceDAO resourceDAO;
+
+    @Autowired
+    private ResourceDataBinder resourceDataBinder;
+
+    @Autowired
+    private PlainSchemaDAO plainSchemaDAO;
+
+    @Test
+    public void issue42() {
+        PlainSchema userId = plainSchemaDAO.find("userId");
+
+        Set<MappingItem> beforeUserIdMappings = new HashSet<>();
+        for (ExternalResource res : resourceDAO.findAll()) {
+            if (res.getProvision(anyTypeDAO.findUser()) != null
+                    && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+
+                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                    if (userId.getKey().equals(mapItem.getIntAttrName())) {
+                        beforeUserIdMappings.add(mapItem);
+                    }
+                }
+            }
+        }
+
+        ResourceTO resourceTO = new ResourceTO();
+        resourceTO.setKey("resource-issue42");
+        resourceTO.setConnector(100L);
+        resourceTO.setPropagationMode(PropagationMode.ONE_PHASE);
+        resourceTO.setEnforceMandatoryCondition(true);
+
+        ProvisionTO provisionTO = new ProvisionTO();
+        provisionTO.setAnyType(AnyTypeKind.USER.name());
+        provisionTO.setObjectClass(ObjectClass.ACCOUNT_NAME);
+        resourceTO.getProvisions().add(provisionTO);
+
+        MappingTO mapping = new MappingTO();
+        provisionTO.setMapping(mapping);
+
+        MappingItemTO item = new MappingItemTO();
+        item.setIntAttrName("userId");
+        item.setIntMappingType(IntMappingType.UserPlainSchema);
+        item.setExtAttrName("campo1");
+        item.setConnObjectKey(true);
+        item.setMandatoryCondition("false");
+        item.setPurpose(MappingPurpose.BOTH);
+        mapping.setConnObjectKeyItem(item);
+
+        ExternalResource resource = resourceDataBinder.create(resourceTO);
+        resource = resourceDAO.save(resource);
+        assertNotNull(resource);
+        assertNotNull(resource.getProvision(anyTypeDAO.findUser()).getMapping());
+        assertEquals(1, resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+
+        resourceDAO.flush();
+
+        ExternalResource actual = resourceDAO.find("resource-issue42");
+        assertNotNull(actual);
+        assertEquals(resource, actual);
+
+        userId = plainSchemaDAO.find("userId");
+
+        Set<MappingItem> afterUserIdMappings = new HashSet<>();
+        for (ExternalResource res : resourceDAO.findAll()) {
+            if (res.getProvision(anyTypeDAO.findUser()) != null
+                    && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+
+                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                    if (userId.getKey().equals(mapItem.getIntAttrName())) {
+                        afterUserIdMappings.add(mapItem);
+                    }
+                }
+            }
+        }
+
+        assertEquals(beforeUserIdMappings.size(), afterUserIdMappings.size() - 1);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java
deleted file mode 100644
index f2eb839..0000000
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.java.data;
-
-import org.apache.syncope.core.provisioning.java.AbstractTest;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.util.HashSet;
-import java.util.Set;
-import org.apache.syncope.common.lib.to.MappingItemTO;
-import org.apache.syncope.common.lib.to.MappingTO;
-import org.apache.syncope.common.lib.to.ProvisionTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.IntMappingType;
-import org.apache.syncope.common.lib.types.MappingPurpose;
-import org.apache.syncope.common.lib.types.PropagationMode;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
-import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
-import org.identityconnectors.framework.common.objects.ObjectClass;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class ResourceDataBinderTest extends AbstractTest {
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    private ResourceDataBinder resourceDataBinder;
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Test
-    public void issue42() {
-        PlainSchema userId = plainSchemaDAO.find("userId");
-
-        Set<MappingItem> beforeUserIdMappings = new HashSet<>();
-        for (ExternalResource res : resourceDAO.findAll()) {
-            if (res.getProvision(anyTypeDAO.findUser()) != null
-                    && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
-
-                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
-                    if (userId.getKey().equals(mapItem.getIntAttrName())) {
-                        beforeUserIdMappings.add(mapItem);
-                    }
-                }
-            }
-        }
-
-        ResourceTO resourceTO = new ResourceTO();
-        resourceTO.setKey("resource-issue42");
-        resourceTO.setConnector(100L);
-        resourceTO.setPropagationMode(PropagationMode.ONE_PHASE);
-        resourceTO.setEnforceMandatoryCondition(true);
-
-        ProvisionTO provisionTO = new ProvisionTO();
-        provisionTO.setAnyType(AnyTypeKind.USER.name());
-        provisionTO.setObjectClass(ObjectClass.ACCOUNT_NAME);
-        resourceTO.getProvisions().add(provisionTO);
-
-        MappingTO mapping = new MappingTO();
-        provisionTO.setMapping(mapping);
-
-        MappingItemTO item = new MappingItemTO();
-        item.setIntAttrName("userId");
-        item.setIntMappingType(IntMappingType.UserPlainSchema);
-        item.setExtAttrName("campo1");
-        item.setConnObjectKey(true);
-        item.setMandatoryCondition("false");
-        item.setPurpose(MappingPurpose.BOTH);
-        mapping.setConnObjectKeyItem(item);
-
-        ExternalResource resource = resourceDataBinder.create(resourceTO);
-        resource = resourceDAO.save(resource);
-        assertNotNull(resource);
-        assertNotNull(resource.getProvision(anyTypeDAO.findUser()).getMapping());
-        assertEquals(1, resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
-
-        resourceDAO.flush();
-
-        ExternalResource actual = resourceDAO.find("resource-issue42");
-        assertNotNull(actual);
-        assertEquals(resource, actual);
-
-        userId = plainSchemaDAO.find("userId");
-
-        Set<MappingItem> afterUserIdMappings = new HashSet<>();
-        for (ExternalResource res : resourceDAO.findAll()) {
-            if (res.getProvision(anyTypeDAO.findUser()) != null
-                    && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
-
-                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
-                    if (userId.getKey().equals(mapItem.getIntAttrName())) {
-                        afterUserIdMappings.add(mapItem);
-                    }
-                }
-            }
-        }
-
-        assertEquals(beforeUserIdMappings.size(), afterUserIdMappings.size() - 1);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
index 2ae9136..4379754 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
@@ -48,9 +48,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
             case AUDIT:
                 try {
                     logic.disableAudit(AuditLoggerName.fromLoggerName(name));
-                } catch (IllegalArgumentException e) {
-                    throw new BadRequestException(e);
-                } catch (ParseException e) {
+                } catch (IllegalArgumentException | ParseException e) {
                     throw new BadRequestException(e);
                 }
                 break;
@@ -88,15 +86,15 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
     }
 
     @Override
-    public void update(final LoggerType type, final String name, final LoggerTO logger) {
+    public void update(final LoggerType type, final LoggerTO logger) {
         switch (type) {
             case LOG:
-                logic.setLogLevel(name, logger.getLevel().getLevel());
+                logic.setLogLevel(logger.getKey(), logger.getLevel().getLevel());
                 break;
 
             case AUDIT:
                 try {
-                    logic.enableAudit(AuditLoggerName.fromLoggerName(name));
+                    logic.enableAudit(AuditLoggerName.fromLoggerName(logger.getKey()));
                 } catch (Exception e) {
                     throw new BadRequestException(e);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/fit/core-reference/src/main/resources/log4j2.xml
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/log4j2.xml b/fit/core-reference/src/main/resources/log4j2.xml
index b50d9cb..df1de40 100644
--- a/fit/core-reference/src/main/resources/log4j2.xml
+++ b/fit/core-reference/src/main/resources/log4j2.xml
@@ -103,6 +103,9 @@ under the License.
       <appender-ref ref="connid"/>
     </asyncLogger>
     
+    <asyncLogger name="org.apache.syncope" additivity="false" level="ERROR">
+      <appender-ref ref="main"/>
+    </asyncLogger>
     <asyncLogger name="org.apache.syncope.core.provisioning" additivity="false" level="INFO">
       <appender-ref ref="main"/>
     </asyncLogger>
@@ -115,6 +118,9 @@ under the License.
     <asyncLogger name="org.quartz" additivity="false" level="INFO">
       <appender-ref ref="main"/>
     </asyncLogger>
+    <asyncLogger name="org.activiti" additivity="false" level="ERROR">
+      <appender-ref ref="main"/>
+    </asyncLogger>
     <asyncLogger name="org.apache.camel" additivity="false" level="ERROR">
       <appender-ref ref="main"/>
     </asyncLogger>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f098a832/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
index 40fe8a1..fb93618 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/LoggerITCase.java
@@ -76,7 +76,7 @@ public class LoggerITCase extends AbstractITCase {
         LoggerTO logger = new LoggerTO();
         logger.setKey("TEST");
         logger.setLevel(LoggerLevel.INFO);
-        loggerService.update(LoggerType.LOG, logger.getKey(), logger);
+        loggerService.update(LoggerType.LOG, logger);
         logger = loggerService.read(LoggerType.LOG, logger.getKey());
         assertNotNull(logger);
         assertEquals(LoggerLevel.INFO, logger.getLevel());
@@ -106,10 +106,9 @@ public class LoggerITCase extends AbstractITCase {
         assertFalse(audits.contains(auditLoggerName));
 
         LoggerTO loggerTO = new LoggerTO();
-        String name = auditLoggerName.toLoggerName();
-        loggerTO.setKey(name);
+        loggerTO.setKey(auditLoggerName.toLoggerName());
         loggerTO.setLevel(LoggerLevel.DEBUG);
-        loggerService.update(LoggerType.AUDIT, name, loggerTO);
+        loggerService.update(LoggerType.AUDIT, loggerTO);
 
         audits = CollectionWrapper.wrapLogger(loggerService.list(LoggerType.AUDIT));
         assertNotNull(audits);