You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2015/08/18 17:48:03 UTC

[1/6] syncope git commit: [SYNCOPE-652] Upgrade Spring to 4.2.0.RELEASE + various cleanup

Repository: syncope
Updated Branches:
  refs/heads/SYNCOPE-156 f0883ca5f -> 5336431db


http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
index a447f29..2924d34 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class DomainTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
index c6a31ef..0b24a25 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
@@ -32,7 +32,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class GroupTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
index a39de84..074c26e 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
@@ -44,11 +44,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.test.context.transaction.TransactionConfiguration;
 import org.springframework.transaction.annotation.Transactional;
 
-@TransactionConfiguration(transactionManager = "TwoTransactionManager")
-@Transactional
+@Transactional("Two")
 public class MultitenancyTest extends AbstractTest {
 
     @Autowired
@@ -85,7 +83,7 @@ public class MultitenancyTest extends AbstractTest {
 
     @Test
     public void readPlainSchemas() {
-        assertEquals(18, plainSchemaDAO.findAll().size());
+        assertEquals(16, plainSchemaDAO.findAll().size());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/NotificationTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/NotificationTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/NotificationTest.java
index 150b924..b97cbd4 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/NotificationTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/NotificationTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class NotificationTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
index 108e622..fe53386 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
@@ -46,7 +46,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.codec.Base64;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class PlainAttrTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
index b7c7ecc..c425460 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java
@@ -38,7 +38,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class PlainSchemaTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
index ed11445..c75a148 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
@@ -38,7 +38,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class PolicyTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
index 3fef2ce..4eb611a 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
@@ -41,7 +41,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class RealmTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RelationshipTypeTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RelationshipTypeTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RelationshipTypeTest.java
index 9aee7f1..9808962 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RelationshipTypeTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RelationshipTypeTest.java
@@ -35,7 +35,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class RelationshipTypeTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ReportTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ReportTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ReportTest.java
index 4318813..1144981 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ReportTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ReportTest.java
@@ -31,7 +31,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ReportTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
index e5cee24..bdfd645 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
@@ -46,7 +46,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ResourceTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
index bf2c012..2368e38 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RoleTest.java
@@ -34,7 +34,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class RoleTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SecurityQuestionTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SecurityQuestionTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SecurityQuestionTest.java
index f17146e..08466b1 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SecurityQuestionTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/SecurityQuestionTest.java
@@ -30,7 +30,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class SecurityQuestionTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
index 5385600..e840a06 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
@@ -35,7 +35,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class TaskExecTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
index a3bfedd..2fa4a8c 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskTest.java
@@ -47,7 +47,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class TaskTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
index a7e0d83..7c62ab2 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
@@ -39,7 +39,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class UserTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirAttrTest.java
index 95111c6..fd13cd6 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirAttrTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirAttrTest.java
@@ -37,7 +37,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class VirAttrTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
index fc56739..10970d1 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
@@ -34,7 +34,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class VirSchemaTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
index 79f96ed..6c59ad0 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
@@ -44,7 +44,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnySearchTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
index c9e00bb..cef688b 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnyTypeClassTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
index b3712d8..0f25f20 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
@@ -31,7 +31,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnyTypeTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
index 0046679..d9f79fc 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConnInstanceTest.java
@@ -35,7 +35,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ConnInstanceTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
index fcbe239..f4529f8 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DerSchemaTest.java
@@ -30,7 +30,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class DerSchemaTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
index 0777854..57e3d1f 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
@@ -28,7 +28,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
-import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
@@ -59,7 +58,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class GroupTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
index 2e46caf..82147a2 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainAttrTest.java
@@ -47,7 +47,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class PlainAttrTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
index 0917d27..ab0b88b 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
@@ -40,7 +40,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class PlainSchemaTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
index d55fa62..5bf1b83 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RealmTest.java
@@ -31,7 +31,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class RealmTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ReportTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ReportTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ReportTest.java
index 713ea64..f143fd8 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ReportTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ReportTest.java
@@ -35,7 +35,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ReportTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
index 0e9c8db..967b719 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
@@ -28,7 +28,6 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import javax.persistence.EntityManager;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.TaskType;
@@ -53,7 +52,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ResourceTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
index 9764e07..2ca08bb 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
@@ -46,7 +46,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class RoleTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/SecurityQuestionTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/SecurityQuestionTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/SecurityQuestionTest.java
index 0a966da..14c463c 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/SecurityQuestionTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/SecurityQuestionTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class SecurityQuestionTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
index f281fb4..03ff4c6 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
@@ -55,7 +55,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class TaskTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
index b921cdc..62bba9c 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
@@ -42,7 +42,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class UserTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 2542a1a..37ff60f 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -30,13 +30,13 @@ under the License.
   <CPlainAttrValue id="1" attribute_id="1" stringValue="SHA1"/>
 
   <!-- notificationjob.cronExpression:
-  + not existing: NotificationJob runs according to Notification.DEFAULT_CRON_EXP
+  + not existing: NotificationJob runs according to NotificationJob.DEFAULT_CRON_EXP
   + provided as empty string: NotificationJob disabled
   + provided as non-empty string: NotificationJob runs according to the given value -->
   <PlainSchema name="notificationjob.cronExpression" type="String"
                mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
   <CPlainAttr id="2" owner_id="1" schema_name="notificationjob.cronExpression"/>
-  <CPlainAttrValue id="2" attribute_id="2" stringValue=""/>
+  <CPlainAttrValue id="2" attribute_id="2" stringValue="0/5 * * * * ?"/>
   
   <PlainSchema name="notification.maxRetries" type="Long"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/TwoContent.xml b/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
index 39cdae2..b4c5d9b 100644
--- a/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
@@ -29,20 +29,6 @@ under the License.
   <CPlainAttr id="1" owner_id="1" schema_name="password.cipher.algorithm"/>
   <CPlainAttrValue id="1" attribute_id="1" stringValue="SHA1"/>
 
-  <!-- notificationjob.cronExpression:
-  + not existing: NotificationJob runs according to Notification.DEFAULT_CRON_EXP
-  + provided as empty string: NotificationJob disabled
-  + provided as non-empty string: NotificationJob runs according to the given value -->
-  <PlainSchema name="notificationjob.cronExpression" type="String"
-               mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="2" owner_id="1" schema_name="notificationjob.cronExpression"/>
-  <CPlainAttrValue id="2" attribute_id="2" stringValue=""/>
-
-  <PlainSchema name="notification.maxRetries" type="Long"
-               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
-  <CPlainAttr id="3" owner_id="1" schema_name="notification.maxRetries"/>
-  <CPlainAttrValue id="3" attribute_id="3" longValue="3"/>
-
   <PlainSchema name="token.length" type="Long"
                mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
   <CPlainAttr id="4" owner_id="1" schema_name="token.length"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
index 38b3f2a..a38ba50 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Set;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
+import org.apache.syncope.core.misc.security.AuthContextUtils;
 import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
@@ -56,7 +57,8 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     private ExternalResourceDAO resourceDAO;
 
     private String getBeanName(final ExternalResource resource) {
-        return String.format("connInstance-%d-%s", resource.getConnector().getKey(), resource.getKey());
+        return String.format("connInstance-%s-%d-%s",
+                AuthContextUtils.getDomain(), resource.getConnector().getKey(), resource.getKey());
     }
 
     @Override
@@ -71,7 +73,7 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
 
     @Override
     public Connector createConnector(final ConnInstance connInstance, final Set<ConnConfProperty> configuration) {
-        final ConnInstance connInstanceClone = SerializationUtils.clone(connInstance);
+        ConnInstance connInstanceClone = SerializationUtils.clone(connInstance);
 
         connInstanceClone.setConfiguration(configuration);
 
@@ -82,10 +84,11 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     }
 
     @Override
-    public ConnInstance getOverriddenConnInstance(final ConnInstance connInstance,
-            final Set<ConnConfProperty> overridden) {
-        final Set<ConnConfProperty> configuration = new HashSet<>();
-        final Map<String, ConnConfProperty> overridable = new HashMap<>();
+    public ConnInstance getOverriddenConnInstance(
+            final ConnInstance connInstance, final Set<ConnConfProperty> overridden) {
+
+        Set<ConnConfProperty> configuration = new HashSet<>();
+        Map<String, ConnConfProperty> overridable = new HashMap<>();
 
         // add not overridable properties
         for (ConnConfProperty prop : connInstance.getConfiguration()) {
@@ -114,12 +117,12 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
 
     @Override
     public void registerConnector(final ExternalResource resource) {
-        final ConnInstance connInstance = getOverriddenConnInstance(
+        ConnInstance connInstance = getOverriddenConnInstance(
                 SerializationUtils.clone(resource.getConnector()), resource.getConnInstanceConfiguration());
-        final Connector connector = createConnector(resource.getConnector(), connInstance.getConfiguration());
+        Connector connector = createConnector(resource.getConnector(), connInstance.getConfiguration());
         LOG.debug("Connector to be registered: {}", connector);
 
-        final String beanName = getBeanName(resource);
+        String beanName = getBeanName(resource);
 
         if (ApplicationContextProvider.getBeanFactory().containsSingleton(beanName)) {
             unregisterConnector(beanName);

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
index 2001e22..dbfeca5 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
@@ -82,17 +82,29 @@ public class TaskJob implements InterruptableJob {
         this.runningThread.set(Thread.currentThread());
         this.interruptMaxRetries = context.getMergedJobDataMap().getLong(INTERRUPT_MAX_RETRIES_KEY);
 
-        AuthContextUtils.setFakeAuth(context.getMergedJobDataMap().getString(JobInstanceLoader.DOMAIN));
         try {
-            Class<?> delegateClass = ClassUtils.getClass(context.getMergedJobDataMap().getString(DELEGATE_CLASS_KEY));
-
-            ((SchedTaskJobDelegate) ApplicationContextProvider.getBeanFactory().
-                    createBean(delegateClass, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false)).
-                    execute(taskKey, context.getMergedJobDataMap().getBoolean(DRY_RUN_JOBDETAIL_KEY));
-        } catch (Exception e) {
-            throw new JobExecutionException(e);
-        } finally {
-            AuthContextUtils.clearFakeAuth();
+            AuthContextUtils.execWithAuthContext(context.getMergedJobDataMap().getString(JobInstanceLoader.DOMAIN),
+                    new AuthContextUtils.Executable<Void>() {
+
+                        @Override
+                        public Void exec() {
+                            try {
+                                Class<?> delegateClass =
+                                ClassUtils.getClass(context.getMergedJobDataMap().getString(DELEGATE_CLASS_KEY));
+
+                                ((SchedTaskJobDelegate) ApplicationContextProvider.getBeanFactory().
+                                createBean(delegateClass, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false)).
+                                execute(taskKey, context.getMergedJobDataMap().getBoolean(DRY_RUN_JOBDETAIL_KEY));
+                            } catch (Exception e) {
+                                throw new RuntimeException(e);
+                            }
+
+                            return null;
+                        }
+                    }
+            );
+        } catch (RuntimeException e) {
+            throw new JobExecutionException(e.getCause());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
index 65b4618..412b978 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
@@ -375,21 +375,21 @@ public class NotificationManagerImpl implements NotificationManager {
         task.addExec(execution);
         task.setExecuted(true);
         taskDAO.save(task);
-        // this flush call is needed to generate a value for the execution id
+        // this flush call is needed to generate a value for the execution key
         taskDAO.flush();
         return execution;
     }
 
     @Override
-    public void setTaskExecuted(final Long taskId, final boolean executed) {
-        NotificationTask task = taskDAO.find(taskId);
+    public void setTaskExecuted(final Long taskKey, final boolean executed) {
+        NotificationTask task = taskDAO.find(taskKey);
         task.setExecuted(executed);
         taskDAO.save(task);
     }
 
     @Override
-    public long countExecutionsWithStatus(final Long taskId, final String status) {
-        NotificationTask task = taskDAO.find(taskId);
+    public long countExecutionsWithStatus(final Long taskKey, final String status) {
+        NotificationTask task = taskDAO.find(taskKey);
         long count = 0;
         for (TaskExec taskExec : task.getExecs()) {
             if (status == null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/AbstractTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/AbstractTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/AbstractTest.java
index 07bda8a..e26f238 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/AbstractTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/AbstractTest.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.provisioning.java;
 import org.junit.runner.RunWith;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.transaction.TransactionConfiguration;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations = {
@@ -30,6 +29,5 @@ import org.springframework.test.context.transaction.TransactionConfiguration;
     "classpath:workflowContext.xml",
     "classpath:provisioningTest.xml"
 })
-@TransactionConfiguration(transactionManager = "MasterTransactionManager")
 public abstract class AbstractTest {
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
index 1a71b89..205aa2f 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
@@ -31,7 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.util.ReflectionTestUtils;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ConnectorManagerTest extends AbstractTest {
 
     private ConnectorManager connManager;

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/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
index eb100f3..8bf191e 100644
--- 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
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class MappingTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/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
index f0a706c..13f1557 100644
--- 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
@@ -43,7 +43,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ResourceDataBinderTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConfigurationServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConfigurationServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConfigurationServiceImpl.java
index 90bb6be..09e0779 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConfigurationServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConfigurationServiceImpl.java
@@ -55,8 +55,8 @@ public class ConfigurationServiceImpl extends AbstractServiceImpl implements Con
     }
 
     @Override
-    public void delete(final String key) {
-        logic.delete(key);
+    public void delete(final String schema) {
+        logic.delete(schema);
     }
 
     @Override
@@ -65,13 +65,12 @@ public class ConfigurationServiceImpl extends AbstractServiceImpl implements Con
     }
 
     @Override
-    public AttrTO read(final String key) {
-        return logic.read(key);
+    public AttrTO get(final String schema) {
+        return logic.get(schema);
     }
 
     @Override
-    public void set(final String key, final AttrTO value) {
-        value.setSchema(key);
+    public void set(final AttrTO value) {
         logic.set(value);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/pom.xml
----------------------------------------------------------------------
diff --git a/fit/core-reference/pom.xml b/fit/core-reference/pom.xml
index d7e27dc..1339153 100644
--- a/fit/core-reference/pom.xml
+++ b/fit/core-reference/pom.xml
@@ -102,6 +102,11 @@ under the License.
     
     <!-- TEST -->
     <dependency>
+      <groupId>com.icegreen</groupId>
+      <artifactId>greenmail</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.syncope.fit</groupId>
       <artifactId>syncope-fit-build-tools</artifactId>
       <version>${project.version}</version>

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/main/resources/mail.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/resources/mail.properties b/fit/core-reference/src/main/resources/mail.properties
new file mode 100644
index 0000000..66f2e90
--- /dev/null
+++ b/fit/core-reference/src/main/resources/mail.properties
@@ -0,0 +1,25 @@
+# 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.
+templates.directory=${conf.directory}
+smtpHost=localhost
+smtpPort=2525
+smtpUser=
+smtpPassword=
+smtpProtocol=smtp
+smtpEncoding=UTF-8
+smtpConnectionTimeout=3000
+mailDebug=false

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
index 7bdd7c5..fe79eda 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
@@ -33,6 +33,8 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.NotificationTaskTO;
@@ -41,6 +43,7 @@ import org.apache.syncope.common.lib.to.TaskExecTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.common.rest.api.service.TaskService;
+import org.apache.syncope.core.logic.notification.NotificationJob;
 
 public abstract class AbstractTaskITCase extends AbstractITCase {
 
@@ -88,8 +91,8 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
         }
     }
 
-    public static TaskExecTO execProvisioningTask(
-            final TaskService taskService, final Long taskKey, final int maxWaitSeconds, final boolean dryRun) {
+    protected static TaskExecTO execTask(final TaskService taskService, final Long taskKey, final String initialStatus,
+            final int maxWaitSeconds, final boolean dryRun) {
 
         AbstractTaskTO taskTO = taskService.read(taskKey);
         assertNotNull(taskTO);
@@ -97,12 +100,12 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
 
         int preSyncSize = taskTO.getExecutions().size();
         TaskExecTO execution = taskService.execute(taskTO.getKey(), dryRun);
-        assertEquals("JOB_FIRED", execution.getStatus());
+        assertEquals(initialStatus, execution.getStatus());
 
         int i = 0;
         int maxit = maxWaitSeconds;
 
-        // wait for sync completion (executions incremented)
+        // wait for completion (executions incremented)
         do {
             try {
                 Thread.sleep(1000);
@@ -122,6 +125,18 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
         return taskTO.getExecutions().get(taskTO.getExecutions().size() - 1);
     }
 
+    public static TaskExecTO execProvisioningTask(
+            final TaskService taskService, final Long taskKey, final int maxWaitSeconds, final boolean dryRun) {
+
+        return execTask(taskService, taskKey, "JOB_FIRED", maxWaitSeconds, dryRun);
+    }
+
+    protected static TaskExecTO execNotificationTask(
+            final TaskService taskService, final Long taskKey, final int maxWaitSeconds) {
+
+        return execTask(taskService, taskKey, NotificationJob.Status.SENT.name(), maxWaitSeconds, false);
+    }
+
     protected Map<Long, TaskExecTO> execProvisioningTasks(final TaskService taskService,
             final Set<Long> taskKeys, final int maxWaitSeconds, final boolean dryRun) throws Exception {
 
@@ -154,13 +169,13 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
                 taskService.list(TaskType.NOTIFICATION, SyncopeClient.getListQueryBuilder().build());
         assertNotNull(tasks);
         assertFalse(tasks.getResult().isEmpty());
-        NotificationTaskTO taskTO = null;
-        for (NotificationTaskTO task : tasks.getResult()) {
-            if (sender.equals(task.getSender())) {
-                taskTO = task;
+
+        return CollectionUtils.find(tasks.getResult(), new Predicate<NotificationTaskTO>() {
+
+            @Override
+            public boolean evaluate(final NotificationTaskTO task) {
+                return sender.equals(task.getSender());
             }
-        }
-        return taskTO;
+        });
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
index e311e41..71317e4 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
@@ -58,9 +58,9 @@ public class ConfigurationITCase extends AbstractITCase {
         conf.setSchema(testKey.getKey());
         conf.getValues().add("testValue");
 
-        configurationService.set(conf.getSchema(), conf);
+        configurationService.set(conf);
 
-        AttrTO actual = configurationService.read(conf.getSchema());
+        AttrTO actual = configurationService.get(conf.getSchema());
         assertEquals(actual, conf);
     }
 
@@ -72,18 +72,18 @@ public class ConfigurationITCase extends AbstractITCase {
             assertEquals(Response.Status.NOT_FOUND, e.getType().getResponseStatus());
         }
 
-        AttrTO tokenLength = configurationService.read("token.length");
+        AttrTO tokenLength = configurationService.get("token.length");
 
         configurationService.delete("token.length");
         try {
-            configurationService.read("token.length");
+            configurationService.get("token.length");
         } catch (SyncopeClientException e) {
             assertEquals(Response.Status.NOT_FOUND, e.getType().getResponseStatus());
         }
 
-        configurationService.set(tokenLength.getSchema(), tokenLength);
+        configurationService.set(tokenLength);
 
-        AttrTO actual = configurationService.read(tokenLength.getSchema());
+        AttrTO actual = configurationService.get(tokenLength.getSchema());
         assertEquals(actual, tokenLength);
     }
 
@@ -98,20 +98,20 @@ public class ConfigurationITCase extends AbstractITCase {
 
     @Test
     public void read() {
-        AttrTO conf = configurationService.read("token.expireTime");
+        AttrTO conf = configurationService.get("token.expireTime");
         assertNotNull(conf);
     }
 
     @Test
     public void update() {
-        AttrTO expireTime = configurationService.read("token.expireTime");
+        AttrTO expireTime = configurationService.get("token.expireTime");
         int value = Integer.parseInt(expireTime.getValues().get(0));
         value++;
         expireTime.getValues().set(0, value + "");
 
-        configurationService.set(expireTime.getSchema(), expireTime);
+        configurationService.set(expireTime);
 
-        AttrTO newConfigurationTO = configurationService.read(expireTime.getSchema());
+        AttrTO newConfigurationTO = configurationService.get(expireTime.getSchema());
         assertEquals(expireTime, newConfigurationTO);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
index dda5f52..9ca7b50 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
@@ -98,7 +98,7 @@ public class MultitenancyITCase extends AbstractITCase {
 
     @Test
     public void readPlainSchemas() {
-        assertEquals(18, adminClient.getService(SchemaService.class).list(SchemaType.PLAIN).size());
+        assertEquals(16, adminClient.getService(SchemaService.class).list(SchemaType.PLAIN).size());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/NotificationTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/NotificationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/NotificationTaskITCase.java
index 3fd0778..02c4299 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/NotificationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/NotificationTaskITCase.java
@@ -21,10 +21,25 @@ package org.apache.syncope.fit.core.reference;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import com.icegreen.greenmail.util.GreenMail;
+import com.icegreen.greenmail.util.ServerSetup;
+import java.io.InputStream;
+import java.util.Properties;
+import javax.mail.Flags;
+import javax.mail.Folder;
+import javax.mail.Message;
+import javax.mail.Session;
+import javax.mail.Store;
 import javax.ws.rs.core.Response;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.NotificationTO;
 import org.apache.syncope.common.lib.to.NotificationTaskTO;
@@ -34,6 +49,9 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.IntMappingType;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.common.rest.api.service.NotificationService;
+import org.apache.syncope.core.logic.notification.NotificationJob;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.runners.MethodSorters;
@@ -41,38 +59,166 @@ import org.junit.runners.MethodSorters;
 @FixMethodOrder(MethodSorters.JVM)
 public class NotificationTaskITCase extends AbstractTaskITCase {
 
+    private static final String MAIL_ADDRESS = "notificationtest@syncope.apache.org";
+
+    private static final String POP3_HOST = "localhost";
+
+    private static final int POP3_PORT = 1110;
+
+    private static String SMTP_HOST;
+
+    private static int SMTP_PORT;
+
+    private static GreenMail greenMail;
+
+    @BeforeClass
+    public static void startGreenMail() {
+        Properties props = new Properties();
+        InputStream propStream = null;
+        try {
+            propStream = ExceptionMapperITCase.class.getResourceAsStream("/mail.properties");
+            props.load(propStream);
+        } catch (Exception e) {
+            LOG.error("Could not load /mail.properties", e);
+        } finally {
+            IOUtils.closeQuietly(propStream);
+        }
+
+        SMTP_HOST = props.getProperty("smtpHost");
+        assertNotNull(SMTP_HOST);
+        SMTP_PORT = Integer.parseInt(props.getProperty("smtpPort"));
+        assertNotNull(SMTP_PORT);
+
+        ServerSetup[] config = new ServerSetup[2];
+        config[0] = new ServerSetup(SMTP_PORT, SMTP_HOST, ServerSetup.PROTOCOL_SMTP);
+        config[1] = new ServerSetup(POP3_PORT, POP3_HOST, ServerSetup.PROTOCOL_POP3);
+        greenMail = new GreenMail(config);
+        greenMail.start();
+    }
+
+    @AfterClass
+    public static void stopGreenMail() {
+        if (greenMail != null) {
+            greenMail.stop();
+        }
+    }
+
+    private boolean verifyMail(final String sender, final String subject, final String mailAddress) throws Exception {
+        LOG.info("Waiting for notification to be sent...");
+        greenMail.waitForIncomingEmail(1);
+
+        boolean found = false;
+        Session session = Session.getDefaultInstance(System.getProperties());
+        session.setDebug(true);
+        Store store = session.getStore("pop3");
+        store.connect(POP3_HOST, POP3_PORT, mailAddress, mailAddress);
+
+        Folder inbox = store.getFolder("INBOX");
+        assertNotNull(inbox);
+        inbox.open(Folder.READ_WRITE);
+
+        Message[] messages = inbox.getMessages();
+        for (Message message : messages) {
+            if (sender.equals(message.getFrom()[0].toString()) && subject.equals(message.getSubject())) {
+                found = true;
+                message.setFlag(Flags.Flag.DELETED, true);
+            }
+        }
+
+        inbox.close(true);
+        store.close();
+        return found;
+    }
+
     @Test
-    public void issueSYNCOPE81() {
-        String sender = "syncope81@syncope.apache.org";
-        createNotificationTask(sender);
+    public void notifyByMail() throws Exception {
+        String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+        String subject = "Test notification " + getUUIDString();
+        String recipient = createNotificationTask(true, true, TraceLevel.ALL, sender, subject);
         NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
         assertNotNull(taskTO);
+        assertTrue(taskTO.getExecutions().isEmpty());
 
+        execNotificationTask(taskService, taskTO.getKey(), 50);
+
+        assertTrue(verifyMail(sender, subject, recipient));
+
+        // verify message body
+        taskTO = taskService.read(taskTO.getKey());
+        assertNotNull(taskTO);
+        assertTrue(taskTO.isExecuted());
+        assertNotNull(taskTO.getTextBody());
+        assertTrue("Notification mail text doesn't contain expected content.",
+                taskTO.getTextBody().contains("Your email address is " + recipient + "."));
+        assertTrue("Notification mail text doesn't contain expected content.",
+                taskTO.getTextBody().contains("Your email address inside a link: "
+                        + "http://localhost/?email=" + recipient.replaceAll("@", "%40") + " ."));
+    }
+
+    @Test
+    public void notifyByMailEmptyAbout() throws Exception {
+        String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+        String subject = "Test notification " + getUUIDString();
+        String recipient = createNotificationTask(true, false, TraceLevel.ALL, sender, subject);
+        NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
+        assertNotNull(taskTO);
         assertTrue(taskTO.getExecutions().isEmpty());
 
-        // generate an execution in order to verify the deletion of a notification task with one or more executions
-        TaskExecTO execution = taskService.execute(taskTO.getKey(), false);
-        assertEquals("NOT_SENT", execution.getStatus());
-
-        int i = 0;
-        int maxit = 50;
-        int executions = 0;
-
-        // wait for task exec completion (executions incremented)
-        do {
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-            }
+        execNotificationTask(taskService, taskTO.getKey(), 50);
 
-            taskTO = taskService.read(taskTO.getKey());
+        assertTrue(verifyMail(sender, subject, recipient));
+    }
+
+    @Test
+    public void notifyByMailWithRetry() throws Exception {
+        // 1. Set higher number of retries
+        AttrTO origMaxRetries = configurationService.get("notification.maxRetries");
+
+        configurationService.set(attrTO(origMaxRetries.getSchema(), "10"));
 
+        // 2. Stop mail server to force errors while sending out e-mails
+        stopGreenMail();
+
+        try {
+            // 3. create notification and user
+            String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+            String subject = "Test notification " + getUUIDString();
+            createNotificationTask(true, true, TraceLevel.ALL, sender, subject);
+            NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
             assertNotNull(taskTO);
-            assertNotNull(taskTO.getExecutions());
+            assertTrue(taskTO.getExecutions().isEmpty());
+
+            // 4. verify notification could not be delivered
+            execTask(taskService, taskTO.getKey(), NotificationJob.Status.NOT_SENT.name(), 5, false);
+
+            taskTO = taskService.read(taskTO.getKey());
+            assertNotNull(taskTO);
+            assertFalse(taskTO.isExecuted());
+            assertFalse(taskTO.getExecutions().isEmpty());
+            for (TaskExecTO exec : taskTO.getExecutions()) {
+                assertEquals(NotificationJob.Status.NOT_SENT.name(), exec.getStatus());
+            }
+        } finally {
+            // start mail server again
+            startGreenMail();
+            // reset number of retries
+            configurationService.set(origMaxRetries);
+        }
+    }
+
+    @Test
+    public void issueSYNCOPE81() {
+        String sender = "syncope81@syncope.apache.org";
+        createNotificationTask(true, true, TraceLevel.ALL, sender, "Test notification");
+        NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
+        assertNotNull(taskTO);
+        assertTrue(taskTO.getExecutions().isEmpty());
 
-            i++;
-        } while (executions == taskTO.getExecutions().size() && i < maxit);
+        // generate an execution in order to verify the deletion of a notification task with one or more executions
+        execNotificationTask(taskService, taskTO.getKey(), 50);
 
+        taskTO = taskService.read(taskTO.getKey());
+        assertTrue(taskTO.isExecuted());
         assertFalse(taskTO.getExecutions().isEmpty());
 
         taskService.delete(taskTO.getKey());
@@ -82,7 +228,7 @@ public class NotificationTaskITCase extends AbstractTaskITCase {
     public void issueSYNCOPE86() {
         // 1. create notification task
         String sender = "syncope86@syncope.apache.org";
-        createNotificationTask(sender);
+        createNotificationTask(true, true, TraceLevel.ALL, sender, "Test notification");
 
         // 2. get NotificationTaskTO for user just created
         NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
@@ -91,12 +237,12 @@ public class NotificationTaskITCase extends AbstractTaskITCase {
 
         try {
             // 3. execute the generated NotificationTask
-            TaskExecTO execution = taskService.execute(taskTO.getKey(), false);
-            assertNotNull(execution);
+            execNotificationTask(taskService, taskTO.getKey(), 50);
 
             // 4. verify
             taskTO = taskService.read(taskTO.getKey());
             assertNotNull(taskTO);
+            assertTrue(taskTO.isExecuted());
             assertEquals(1, taskTO.getExecutions().size());
         } finally {
             // Remove execution to make test re-runnable
@@ -104,39 +250,146 @@ public class NotificationTaskITCase extends AbstractTaskITCase {
         }
     }
 
-    private void createNotificationTask(final String sender) {
+    @Test
+    public void issueSYNCOPE192() throws Exception {
+        String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+        String subject = "Test notification " + getUUIDString();
+        String recipient = createNotificationTask(true, true, TraceLevel.NONE, sender, subject);
+        NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
+        assertNotNull(taskTO);
+        assertTrue(taskTO.getExecutions().isEmpty());
+
+        taskService.execute(taskTO.getKey(), false);
+
+        try {
+            Thread.sleep(5);
+        } catch (InterruptedException e) {
+        }
+
+        assertTrue(verifyMail(sender, subject, recipient));
+
+        // verify that last exec status was updated
+        taskTO = taskService.read(taskTO.getKey());
+        assertNotNull(taskTO);
+        assertTrue(taskTO.isExecuted());
+        assertTrue(taskTO.getExecutions().isEmpty());
+        assertTrue(StringUtils.isNotBlank(taskTO.getLatestExecStatus()));
+    }
+
+    @Test
+    public void issueSYNCOPE445() throws Exception {
+        String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+        String subject = "Test notification " + getUUIDString();
+        String recipient = createNotificationTask(
+                true, true, TraceLevel.ALL, sender, subject, "syncope445@syncope.apache.org");
+        NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
+        assertNotNull(taskTO);
+        assertTrue(taskTO.getExecutions().isEmpty());
+
+        execNotificationTask(taskService, taskTO.getKey(), 50);
+
+        assertTrue(verifyMail(sender, subject, recipient));
+
+        // verify task
+        taskTO = taskService.read(taskTO.getKey());
+        assertTrue(taskTO.isExecuted());
+        assertNotNull(taskTO);
+        assertTrue(taskTO.getRecipients().contains("syncope445@syncope.apache.org"));
+    }
+
+    @Test
+    public void issueSYNCOPE446() throws Exception {
         // 1. Create notification
         NotificationTO notification = new NotificationTO();
-        notification.setTraceLevel(TraceLevel.FAILURES);
+        notification.setTraceLevel(TraceLevel.ALL);
+        notification.getEvents().add("[REST]:[GroupLogic]:[]:[create]:[SUCCESS]");
+
+        String groupName = "group" + getUUIDString();
+        notification.getAbouts().put(AnyTypeKind.GROUP.name(),
+                SyncopeClient.getGroupSearchConditionBuilder().is("name").equalTo(groupName).query());
+
+        notification.setRecipients(SyncopeClient.getUserSearchConditionBuilder().inGroups(8L).query());
+        notification.setSelfAsRecipient(false);
+        notification.setRecipientAttrName("email");
+        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
+        notification.getStaticRecipients().add(MAIL_ADDRESS);
+
+        String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+        notification.setSender(sender);
+        String subject = "Test notification " + getUUIDString();
+        notification.setSubject(subject);
+        notification.setTemplate("optin");
+        notification.setActive(true);
+
+        Response response = notificationService.create(notification);
+        notification = getObject(response.getLocation(), NotificationService.class, NotificationTO.class);
+        assertNotNull(notification);
+
+        // 2. create group
+        GroupTO groupTO = new GroupTO();
+        groupTO.setName(groupName);
+        groupTO.setRealm("/even/two");
+        groupTO = createGroup(groupTO);
+        assertNotNull(groupTO);
+
+        // 3. verify
+        NotificationTaskTO taskTO = findNotificationTaskBySender(sender);
+        assertNotNull(taskTO);
+
+        execNotificationTask(taskService, taskTO.getKey(), 50);
+
+        assertTrue(verifyMail(sender, subject, MAIL_ADDRESS));
+    }
+
+    @Test
+    public void issueSYNCOPE492() throws Exception {
+        String sender = "syncopetest-" + getUUIDString() + "@syncope.apache.org";
+        String subject = "Test notification " + getUUIDString();
+        createNotificationTask(false, true, TraceLevel.NONE, sender, subject, "syncope445@syncope.apache.org");
+
+        // verify that no task was created for disabled notification
+        assertNull(findNotificationTaskBySender(sender));
+    }
+
+    private String createNotificationTask(final boolean active, final boolean includeAbout, final TraceLevel traceLevel,
+            final String sender, final String subject, final String... staticRecipients) {
+
+        // 1. Create notification
+        NotificationTO notification = new NotificationTO();
+        notification.setTraceLevel(traceLevel);
         notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
 
-        notification.getAbouts().put(AnyTypeKind.USER.name(),
-                SyncopeClient.getUserSearchConditionBuilder().inGroups(7L).query());
+        if (includeAbout) {
+            notification.getAbouts().put(AnyTypeKind.USER.name(),
+                    SyncopeClient.getUserSearchConditionBuilder().inGroups(7L).query());
+        }
 
         notification.setRecipients(SyncopeClient.getUserSearchConditionBuilder().inGroups(8L).query());
         notification.setSelfAsRecipient(true);
-
         notification.setRecipientAttrName("email");
         notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
+        if (staticRecipients != null) {
+            CollectionUtils.addAll(notification.getStaticRecipients(), staticRecipients);
+        }
 
         notification.setSender(sender);
-        String subject = "Test notification";
         notification.setSubject(subject);
         notification.setTemplate("optin");
-        notification.setActive(true);
+        notification.setActive(active);
 
         Response response = notificationService.create(notification);
         notification = getObject(response.getLocation(), NotificationService.class, NotificationTO.class);
         assertNotNull(notification);
 
         // 2. create user
-        UserTO userTO = UserITCase.getUniqueSampleTO("syncope@syncope.apache.org");
+        UserTO userTO = UserITCase.getUniqueSampleTO(MAIL_ADDRESS);
         MembershipTO membershipTO = new MembershipTO();
         membershipTO.setRightKey(7);
         userTO.getMemberships().add(membershipTO);
 
         userTO = createUser(userTO);
         assertNotNull(userTO);
+        return userTO.getUsername();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
index 048259d..da438d3 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java
@@ -113,18 +113,17 @@ public class UserITCase extends AbstractITCase {
     }
 
     public static UserTO getSampleTO(final String email) {
-        String uid = email;
         UserTO userTO = new UserTO();
         userTO.setRealm(SyncopeConstants.ROOT_REALM);
         userTO.setPassword("password123");
-        userTO.setUsername(uid);
+        userTO.setUsername(email);
 
-        userTO.getPlainAttrs().add(attrTO("fullname", uid));
-        userTO.getPlainAttrs().add(attrTO("firstname", uid));
+        userTO.getPlainAttrs().add(attrTO("fullname", email));
+        userTO.getPlainAttrs().add(attrTO("firstname", email));
         userTO.getPlainAttrs().add(attrTO("surname", "surname"));
         userTO.getPlainAttrs().add(attrTO("type", "a type"));
-        userTO.getPlainAttrs().add(attrTO("userId", uid));
-        userTO.getPlainAttrs().add(attrTO("email", uid));
+        userTO.getPlainAttrs().add(attrTO("userId", email));
+        userTO.getPlainAttrs().add(attrTO("email", email));
         userTO.getPlainAttrs().add(attrTO("loginDate", DATE_FORMAT.get().format(new Date())));
         userTO.getDerAttrs().add(attrTO("cn", null));
         userTO.getVirAttrs().add(attrTO("virtualdata", "virtualvalue"));
@@ -1274,12 +1273,12 @@ public class UserITCase extends AbstractITCase {
 
     @Test()
     public void issueSYNCOPE51() {
-        AttrTO defaultCA = configurationService.read("password.cipher.algorithm");
+        AttrTO defaultCA = configurationService.get("password.cipher.algorithm");
         final String originalCAValue = defaultCA.getValues().get(0);
         defaultCA.getValues().set(0, "MD5");
-        configurationService.set(defaultCA.getSchema(), defaultCA);
+        configurationService.set(defaultCA);
 
-        AttrTO newCA = configurationService.read(defaultCA.getSchema());
+        AttrTO newCA = configurationService.get(defaultCA.getSchema());
         assertEquals(defaultCA, newCA);
 
         UserTO userTO = getSampleTO("syncope51@syncope.apache.org");
@@ -1294,9 +1293,9 @@ public class UserITCase extends AbstractITCase {
         }
 
         defaultCA.getValues().set(0, originalCAValue);
-        configurationService.set(defaultCA.getSchema(), defaultCA);
+        configurationService.set(defaultCA);
 
-        AttrTO oldCA = configurationService.read(defaultCA.getSchema());
+        AttrTO oldCA = configurationService.get(defaultCA.getSchema());
         assertEquals(defaultCA, oldCA);
     }
 
@@ -1428,12 +1427,12 @@ public class UserITCase extends AbstractITCase {
     @Test
     public void isseSYNCOPE136AES() {
         // 1. read configured cipher algorithm in order to be able to restore it at the end of test
-        AttrTO pwdCipherAlgo = configurationService.read("password.cipher.algorithm");
+        AttrTO pwdCipherAlgo = configurationService.get("password.cipher.algorithm");
         final String origpwdCipherAlgo = pwdCipherAlgo.getValues().get(0);
 
         // 2. set AES password cipher algorithm
         pwdCipherAlgo.getValues().set(0, "AES");
-        configurationService.set(pwdCipherAlgo.getSchema(), pwdCipherAlgo);
+        configurationService.set(pwdCipherAlgo);
 
         // 3. create user with no resources
         UserTO userTO = getUniqueSampleTO("syncope136_AES@apache.org");
@@ -1466,7 +1465,7 @@ public class UserITCase extends AbstractITCase {
 
         // 6. restore initial cipher algorithm
         pwdCipherAlgo.getValues().set(0, origpwdCipherAlgo);
-        configurationService.set(pwdCipherAlgo.getSchema(), pwdCipherAlgo);
+        configurationService.set(pwdCipherAlgo);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserSelfITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserSelfITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserSelfITCase.java
index 2944cdc..34a9349 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserSelfITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserSelfITCase.java
@@ -252,8 +252,7 @@ public class UserSelfITCase extends AbstractITCase {
     @Test
     public void passwordReset() {
         // 0. ensure that password request DOES require security question
-        configurationService.set("passwordReset.securityQuestion",
-                attrTO("passwordReset.securityQuestion", "true"));
+        configurationService.set(attrTO("passwordReset.securityQuestion", "true"));
 
         // 1. create an user with security question and answer
         UserTO user = UserITCase.getUniqueSampleTO("pwdReset@syncope.apache.org");
@@ -313,8 +312,7 @@ public class UserSelfITCase extends AbstractITCase {
     @Test
     public void passwordResetWithoutSecurityQuestion() {
         // 0. disable security question for password reset
-        configurationService.set("passwordReset.securityQuestion",
-                attrTO("passwordReset.securityQuestion", "false"));
+        configurationService.set(attrTO("passwordReset.securityQuestion", "false"));
 
         // 1. create an user with security question and answer
         UserTO user = UserITCase.getUniqueSampleTO("pwdResetNoSecurityQuestion@syncope.apache.org");
@@ -350,8 +348,7 @@ public class UserSelfITCase extends AbstractITCase {
         assertNull(read.getToken());
 
         // 7. re-enable security question for password reset
-        configurationService.set("passwordReset.securityQuestion",
-                attrTO("passwordReset.securityQuestion", "true"));
+        configurationService.set(attrTO("passwordReset.securityQuestion", "true"));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index b58c7e1..6330b9e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -332,7 +332,7 @@ under the License.
 
     <jackson.version>2.6.1</jackson.version>
 
-    <spring.version>4.1.7.RELEASE</spring.version>
+    <spring.version>4.2.0.RELEASE</spring.version>
     <spring-security.version>4.0.2.RELEASE</spring-security.version>
 
     <openjpa.version>2.4.0</openjpa.version>


[3/6] syncope git commit: Travis: removing Maven parallel options

Posted by md...@apache.org.
Travis: removing Maven parallel options


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

Branch: refs/heads/SYNCOPE-156
Commit: e41e5018b25a44c3e1794c665355af813f1df8c4
Parents: 8806176
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Aug 17 13:43:07 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Aug 17 13:43:07 2015 +0200

----------------------------------------------------------------------
 .travis.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/e41e5018/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index b46adc1..fe9b45b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,11 +20,11 @@ language: java
 jdk:
   - openjdk7
 # default install is mvn install --quiet -DskipTests=true
-install: mvn --show-version --quiet -T 1C -P all,skipTests
+install: mvn --show-version --quiet -P all,skipTests
 #invoker.streamLogs: we cannot access to log files through Travis web ui, so display everything in the console
 script:
   - sudo rm /etc/mavenrc
   - export MAVEN_OPTS="-Xmx2469m -XX:MaxPermSize=512m -XX:+TieredCompilation -XX:TieredStopAtLevel=1"
-  - mvn --show-version --quiet -T 1C clean install -Dinvoker.streamLogs=true
+  - mvn --show-version --quiet clean install -Dinvoker.streamLogs=true
 notifications:
   webhooks: http://rovere.tirasa.net/cgi-bin/travis.cgi


[4/6] syncope git commit: Travis: switching back to e-mail notifications, let's see...

Posted by md...@apache.org.
Travis: switching back to e-mail notifications, let's see...


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

Branch: refs/heads/SYNCOPE-156
Commit: dbeb620824677b8eb4cab59d811630a0992a3f42
Parents: e41e501
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Aug 17 14:05:12 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Aug 17 14:05:12 2015 +0200

----------------------------------------------------------------------
 .travis.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/dbeb6208/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index fe9b45b..044d84d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,4 +27,5 @@ script:
   - export MAVEN_OPTS="-Xmx2469m -XX:MaxPermSize=512m -XX:+TieredCompilation -XX:TieredStopAtLevel=1"
   - mvn --show-version --quiet clean install -Dinvoker.streamLogs=true
 notifications:
-  webhooks: http://rovere.tirasa.net/cgi-bin/travis.cgi
+  email:
+    - dev@syncope.apache.org


[2/6] syncope git commit: [SYNCOPE-652] Upgrade Spring to 4.2.0.RELEASE + various cleanup

Posted by md...@apache.org.
[SYNCOPE-652] Upgrade Spring to 4.2.0.RELEASE + various cleanup


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

Branch: refs/heads/SYNCOPE-156
Commit: 88061761ea78bfe822f653c899a4ad9c4f4e3493
Parents: 4b2dc4d
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Aug 17 13:30:27 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Aug 17 13:30:27 2015 +0200

----------------------------------------------------------------------
 .travis.yml                                     |   6 +-
 .../cli/commands/ConfigurationCommand.java      |   8 +-
 .../console/rest/ConfigurationRestClient.java   |  10 +-
 .../syncope/common/lib/mod/StatusMod.java       |   2 +-
 .../apache/syncope/common/lib/to/AttrTO.java    |   2 +
 .../apache/syncope/common/lib/to/LoggerTO.java  |   2 +-
 .../rest/api/service/ConfigurationService.java  |  25 +-
 core/logic/pom.xml                              |  86 +--
 .../syncope/core/logic/ConfigurationLogic.java  |  16 +-
 .../apache/syncope/core/logic/TaskLogic.java    |   4 +-
 .../core/logic/init/JobInstanceLoaderImpl.java  |  85 +--
 .../logic/notification/NotificationJob.java     |  21 +-
 .../notification/NotificationJobDelegate.java   |   5 +-
 .../syncope/core/logic/report/ReportJob.java    |  22 +-
 .../apache/syncope/core/logic/AbstractTest.java |  40 --
 .../syncope/core/logic/NotificationTest.java    | 659 -------------------
 core/logic/src/test/resources/logicTest.xml     |  59 --
 .../core/misc/security/AuthContextUtils.java    |   8 +-
 .../misc/spring/ApplicationContextProvider.java |  11 +
 .../spring/DomainTransactionInterceptor.java    |  70 ++
 .../spring/DomainTransactionInterceptor.java    |  70 --
 .../jpa/spring/SpringComponentReplacer.java     |  42 --
 .../core/persistence/jpa/AbstractTest.java      |   2 -
 .../persistence/jpa/inner/AnyObjectTest.java    |   2 +-
 .../persistence/jpa/inner/AnySearchTest.java    |   2 +-
 .../persistence/jpa/inner/AnyTypeClassTest.java |   2 +-
 .../core/persistence/jpa/inner/AnyTypeTest.java |   2 +-
 .../core/persistence/jpa/inner/ConfTest.java    |   2 +-
 .../persistence/jpa/inner/ConnInstanceTest.java |   2 +-
 .../core/persistence/jpa/inner/DerAttrTest.java |   2 +-
 .../persistence/jpa/inner/DerSchemaTest.java    |   2 +-
 .../core/persistence/jpa/inner/DomainTest.java  |   2 +-
 .../core/persistence/jpa/inner/GroupTest.java   |   2 +-
 .../persistence/jpa/inner/MultitenancyTest.java |   6 +-
 .../persistence/jpa/inner/NotificationTest.java |   2 +-
 .../persistence/jpa/inner/PlainAttrTest.java    |   2 +-
 .../persistence/jpa/inner/PlainSchemaTest.java  |   2 +-
 .../core/persistence/jpa/inner/PolicyTest.java  |   2 +-
 .../core/persistence/jpa/inner/RealmTest.java   |   2 +-
 .../jpa/inner/RelationshipTypeTest.java         |   2 +-
 .../core/persistence/jpa/inner/ReportTest.java  |   2 +-
 .../persistence/jpa/inner/ResourceTest.java     |   2 +-
 .../core/persistence/jpa/inner/RoleTest.java    |   2 +-
 .../jpa/inner/SecurityQuestionTest.java         |   2 +-
 .../persistence/jpa/inner/TaskExecTest.java     |   2 +-
 .../core/persistence/jpa/inner/TaskTest.java    |   2 +-
 .../core/persistence/jpa/inner/UserTest.java    |   2 +-
 .../core/persistence/jpa/inner/VirAttrTest.java |   2 +-
 .../persistence/jpa/inner/VirSchemaTest.java    |   2 +-
 .../persistence/jpa/outer/AnySearchTest.java    |   2 +-
 .../persistence/jpa/outer/AnyTypeClassTest.java |   2 +-
 .../core/persistence/jpa/outer/AnyTypeTest.java |   2 +-
 .../persistence/jpa/outer/ConnInstanceTest.java |   2 +-
 .../persistence/jpa/outer/DerSchemaTest.java    |   2 +-
 .../core/persistence/jpa/outer/GroupTest.java   |   3 +-
 .../persistence/jpa/outer/PlainAttrTest.java    |   2 +-
 .../persistence/jpa/outer/PlainSchemaTest.java  |   2 +-
 .../core/persistence/jpa/outer/RealmTest.java   |   2 +-
 .../core/persistence/jpa/outer/ReportTest.java  |   2 +-
 .../persistence/jpa/outer/ResourceTest.java     |   3 +-
 .../core/persistence/jpa/outer/RoleTest.java    |   2 +-
 .../jpa/outer/SecurityQuestionTest.java         |   2 +-
 .../core/persistence/jpa/outer/TaskTest.java    |   2 +-
 .../core/persistence/jpa/outer/UserTest.java    |   2 +-
 .../test/resources/domains/MasterContent.xml    |   4 +-
 .../src/test/resources/domains/TwoContent.xml   |  14 -
 .../provisioning/java/ConnectorManager.java     |  21 +-
 .../core/provisioning/java/job/TaskJob.java     |  32 +-
 .../notification/NotificationManagerImpl.java   |  10 +-
 .../core/provisioning/java/AbstractTest.java    |   2 -
 .../provisioning/java/ConnectorManagerTest.java |   2 +-
 .../core/provisioning/java/MappingTest.java     |   2 +-
 .../java/ResourceDataBinderTest.java            |   2 +-
 .../cxf/service/ConfigurationServiceImpl.java   |  11 +-
 fit/core-reference/pom.xml                      |   5 +
 .../src/main/resources/mail.properties          |  25 +
 .../fit/core/reference/AbstractTaskITCase.java  |  37 +-
 .../fit/core/reference/ConfigurationITCase.java |  20 +-
 .../fit/core/reference/MultitenancyITCase.java  |   2 +-
 .../core/reference/NotificationTaskITCase.java  | 317 ++++++++-
 .../syncope/fit/core/reference/UserITCase.java  |  27 +-
 .../fit/core/reference/UserSelfITCase.java      |   9 +-
 pom.xml                                         |   2 +-
 83 files changed, 663 insertions(+), 1224 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 4ec5ae7..b46adc1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,11 +20,11 @@ language: java
 jdk:
   - openjdk7
 # default install is mvn install --quiet -DskipTests=true
-install: mvn --show-version --quiet -P all,skipTests
+install: mvn --show-version --quiet -T 1C -P all,skipTests
 #invoker.streamLogs: we cannot access to log files through Travis web ui, so display everything in the console
 script:
   - sudo rm /etc/mavenrc
-  - export MAVEN_OPTS="-Xmx2469m -XX:MaxPermSize=512m"
-  - mvn --show-version --quiet clean install -Dinvoker.streamLogs=true
+  - export MAVEN_OPTS="-Xmx2469m -XX:MaxPermSize=512m -XX:+TieredCompilation -XX:TieredStopAtLevel=1"
+  - mvn --show-version --quiet -T 1C clean install -Dinvoker.streamLogs=true
 notifications:
   webhooks: http://rovere.tirasa.net/cgi-bin/travis.cgi

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
index 54eea17..70c532d 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/ConfigurationCommand.java
@@ -113,7 +113,7 @@ public class ConfigurationCommand extends AbstractCommand {
         } else if (StringUtils.isNotBlank(confNameToRead)) {
             LOG.debug("- configuration read {} command", confNameToRead);
             try {
-                final AttrTO attrTO = configurationService.read(confNameToRead);
+                final AttrTO attrTO = configurationService.get(confNameToRead);
                 System.out.println(" - Conf " + attrTO.getSchema() + " has value(s) " + attrTO.getValues()
                         + " - readonly: " + attrTO.isReadonly());
             } catch (final SyncopeClientException ex) {
@@ -123,10 +123,10 @@ public class ConfigurationCommand extends AbstractCommand {
             LOG.debug("- configuration update command with params {}", updateConf);
             try {
                 for (final Map.Entry<String, String> entrySet : updateConf.entrySet()) {
-                    final AttrTO attrTO = configurationService.read(entrySet.getKey());
+                    final AttrTO attrTO = configurationService.get(entrySet.getKey());
                     attrTO.getValues().clear();
                     attrTO.getValues().add(entrySet.getValue());
-                    configurationService.set(entrySet.getKey(), attrTO);
+                    configurationService.set(attrTO);
                     System.out.println(" - Conf " + attrTO.getSchema() + " has value(s) " + attrTO.getValues()
                             + " - readonly: " + attrTO.isReadonly());
                 }
@@ -140,7 +140,7 @@ public class ConfigurationCommand extends AbstractCommand {
                     final AttrTO attrTO = new AttrTO();
                     attrTO.setSchema(entrySet.getKey());
                     attrTO.getValues().add(entrySet.getValue());
-                    configurationService.set(entrySet.getKey(), attrTO);
+                    configurationService.set(attrTO);
                     System.out.println(" - Conf " + attrTO.getSchema() + " created with value(s) " + attrTO.getValues()
                             + " - readonly: " + attrTO.isReadonly());
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/client/console/src/main/java/org/apache/syncope/client/console/rest/ConfigurationRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConfigurationRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConfigurationRestClient.java
index 36b0d1c..ade9408 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConfigurationRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConfigurationRestClient.java
@@ -53,9 +53,9 @@ public class ConfigurationRestClient extends BaseRestClient {
         return conf;
     }
 
-    public AttrTO read(final String key) {
+    public AttrTO get(final String key) {
         try {
-            return getService(ConfigurationService.class).read(key);
+            return getService(ConfigurationService.class).get(key);
         } catch (SyncopeClientException e) {
             LOG.error("While reading a configuration schema", e);
         }
@@ -67,7 +67,7 @@ public class ConfigurationRestClient extends BaseRestClient {
             return null;
         }
 
-        AttrTO attrLayout = read(type.getConfKey());
+        AttrTO attrLayout = get(type.getConfKey());
         if (attrLayout == null) {
             attrLayout = new AttrTO();
             attrLayout.setSchema(type.getConfKey());
@@ -79,8 +79,8 @@ public class ConfigurationRestClient extends BaseRestClient {
         return attrLayout;
     }
 
-    public void set(final AttrTO attributeTO) {
-        getService(ConfigurationService.class).set(attributeTO.getSchema(), attributeTO);
+    public void set(final AttrTO attrTO) {
+        getService(ConfigurationService.class).set(attrTO);
     }
 
     public void delete(final String key) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/common/lib/src/main/java/org/apache/syncope/common/lib/mod/StatusMod.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/mod/StatusMod.java b/common/lib/src/main/java/org/apache/syncope/common/lib/mod/StatusMod.java
index f989ecf..e3fc901 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/mod/StatusMod.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/mod/StatusMod.java
@@ -67,11 +67,11 @@ public class StatusMod extends AbstractBaseBean {
      */
     private final List<String> resourceNames = new ArrayList<>();
 
-    @PathParam("key")
     public long getKey() {
         return key;
     }
 
+    @PathParam("key")
     public void setKey(final long key) {
         this.key = key;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
index cf385b4..c3b468c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
@@ -22,6 +22,7 @@ import org.apache.syncope.common.lib.AbstractBaseBean;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.List;
+import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
@@ -58,6 +59,7 @@ public class AttrTO extends AbstractBaseBean {
     /**
      * @param schema name to be set
      */
+    @PathParam("schema")
     public void setSchema(final String schema) {
         this.schema = schema;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/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 6e1ce1d..0dfa8b5 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
@@ -42,11 +42,11 @@ public class LoggerTO extends AbstractBaseBean {
         this.level = level;
     }
 
-    @PathParam("key")
     public String getKey() {
         return key;
     }
 
+    @PathParam("key")
     public void setKey(final String key) {
         this.key = key;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
----------------------------------------------------------------------
diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
index 3fa5f8a..875ebc5 100644
--- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
+++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
@@ -56,34 +56,33 @@ public interface ConfigurationService extends JAXRSService {
     ConfTO list();
 
     /**
-     * Returns configuration parameter with matching key.
+     * Returns configuration parameter with matching schema.
      *
-     * @param key identifier of configuration to be read
-     * @return configuration parameter with matching key
+     * @param schema identifier of configuration to be read
+     * @return configuration parameter with matching schema
      */
     @GET
-    @Path("{key}")
+    @Path("{schema}")
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    AttrTO read(@NotNull @PathParam("key") String key);
+    AttrTO get(@NotNull @PathParam("schema") String schema);
 
     /**
-     * Creates / updates the configuration parameter with the given key.
+     * Creates / updates the configuration parameter with the given schema.
      *
-     * @param key parameter key
      * @param value parameter value
      */
     @PUT
-    @Path("{key}")
+    @Path("{schema}")
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    void set(@NotNull @PathParam("key") String key, @NotNull AttrTO value);
+    void set(@NotNull AttrTO value);
 
     /**
-     * Deletes the configuration parameter with matching key.
+     * Deletes the configuration parameter with matching schema.
      *
-     * @param key configuration parameter key
+     * @param schema configuration parameter schema
      */
     @DELETE
-    @Path("{key}")
+    @Path("{schema}")
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    void delete(@NotNull @PathParam("key") String key);
+    void delete(@NotNull @PathParam("schema") String schema);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/pom.xml
----------------------------------------------------------------------
diff --git a/core/logic/pom.xml b/core/logic/pom.xml
index d652f3e..7b25e9b 100644
--- a/core/logic/pom.xml
+++ b/core/logic/pom.xml
@@ -93,51 +93,6 @@ under the License.
       <artifactId>syncope-core-provisioning-java</artifactId>
       <version>${project.version}</version>
     </dependency>
-    
-    <!-- TEST -->
-    <dependency>
-      <groupId>com.icegreen</groupId>
-      <artifactId>greenmail</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.syncope.core</groupId>
-      <artifactId>syncope-core-workflow-java</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.el</groupId>
-      <artifactId>javax.el-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.syncope.core</groupId>
-      <artifactId>syncope-core-persistence-jpa</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>${slf4j.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.h2database</groupId>
-      <artifactId>h2</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 
   <build>
@@ -147,49 +102,10 @@ under the License.
         <filtering>true</filtering>
       </resource>
     </resources>
-    <testResources>
-      <testResource>
-        <directory>${basedir}/src/test/resources</directory>
-        <filtering>true</filtering>
-      </testResource>
-      <testResource>
-        <directory>${basedir}/../persistence-jpa/src/main/resources</directory>
-        <includes>
-          <include>persistence.properties</include>
-        </includes>
-        <filtering>true</filtering>
-      </testResource>
-      <testResource>
-        <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>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <inherited>true</inherited>
-        <executions>
-          <execution>
-            <id>set-bundles</id>
-            <phase>process-test-resources</phase>
-            <goals>
-              <goal>copy</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-checkstyle-plugin</artifactId>
       </plugin>
     </plugins>

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
index 1598498..b36c4ea 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
@@ -60,8 +60,8 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<ConfTO> {
     private GroupWorkflowAdapter gwfAdapter;
 
     @PreAuthorize("hasRole('" + Entitlement.CONFIGURATION_DELETE + "')")
-    public void delete(final String key) {
-        confDAO.delete(key);
+    public void delete(final String schema) {
+        confDAO.delete(schema);
     }
 
     @PreAuthorize("hasRole('" + Entitlement.CONFIGURATION_LIST + "')")
@@ -70,18 +70,18 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<ConfTO> {
     }
 
     @PreAuthorize("isAuthenticated()")
-    public AttrTO read(final String key) {
+    public AttrTO get(final String schema) {
         AttrTO result;
 
-        CPlainAttr conf = confDAO.find(key);
+        CPlainAttr conf = confDAO.find(schema);
         if (conf == null) {
-            PlainSchema schema = plainSchemaDAO.find(key);
-            if (schema == null) {
-                throw new NotFoundException("Configuration key " + key);
+            PlainSchema plainSchema = plainSchemaDAO.find(schema);
+            if (plainSchema == null) {
+                throw new NotFoundException("Configuration schema " + schema);
             }
 
             result = new AttrTO();
-            result.setSchema(key);
+            result.setSchema(schema);
         } else {
             result = binder.getAttrTO(conf);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
index 9c119f3..9c436ac 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
@@ -196,12 +196,12 @@ public class TaskLogic extends AbstractJobLogic<AbstractTaskTO> {
         TaskExecTO result = null;
         switch (taskUtils.getType()) {
             case PROPAGATION:
-                final TaskExec propExec = taskExecutor.execute((PropagationTask) task);
+                TaskExec propExec = taskExecutor.execute((PropagationTask) task);
                 result = binder.getTaskExecTO(propExec);
                 break;
 
             case NOTIFICATION:
-                final TaskExec notExec = notificationJobDelegate.executeSingle((NotificationTask) task);
+                TaskExec notExec = notificationJobDelegate.executeSingle((NotificationTask) task);
                 result = binder.getTaskExecTO(notExec);
                 break;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
index 3e7e90f..33cb920 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
@@ -25,6 +25,8 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
@@ -229,59 +231,66 @@ public class JobInstanceLoaderImpl implements JobInstanceLoader, SyncopeLoader {
     @Transactional
     @Override
     public void load() {
-        AuthContextUtils.setFakeAuth(SyncopeConstants.MASTER_DOMAIN);
-        String notificationJobCronExpression = StringUtils.EMPTY;
-        long interruptMaxRetries = 1;
-        try {
-            CPlainAttr notificationJobCronExp =
-                    confDAO.find("notificationjob.cronExpression", NotificationJob.DEFAULT_CRON_EXP);
-            if (!notificationJobCronExp.getValuesAsStrings().isEmpty()) {
-                notificationJobCronExpression = notificationJobCronExp.getValuesAsStrings().get(0);
-            }
+        final Pair<String, Long> notificationConf = AuthContextUtils.execWithAuthContext(SyncopeConstants.MASTER_DOMAIN,
+                new AuthContextUtils.Executable<Pair<String, Long>>() {
 
-            interruptMaxRetries = confDAO.find("tasks.interruptMaxRetries", "1").getValues().get(0).getLongValue();
-        } finally {
-            AuthContextUtils.clearFakeAuth();
-        }
+                    @Override
+                    public Pair<String, Long> exec() {
+                        String notificationJobCronExpression = StringUtils.EMPTY;
 
-        for (String domain : domainsHolder.getDomains().keySet()) {
-            AuthContextUtils.setFakeAuth(domain);
+                        CPlainAttr notificationJobCronExp =
+                        confDAO.find("notificationjob.cronExpression", NotificationJob.DEFAULT_CRON_EXP);
+                        if (!notificationJobCronExp.getValuesAsStrings().isEmpty()) {
+                            notificationJobCronExpression = notificationJobCronExp.getValuesAsStrings().get(0);
+                        }
 
-            try {
-                // 1. jobs for SchedTasks
-                Set<SchedTask> tasks = new HashSet<>(taskDAO.<SchedTask>findAll(TaskType.SCHEDULED));
-                tasks.addAll(taskDAO.<SyncTask>findAll(TaskType.SYNCHRONIZATION));
-                tasks.addAll(taskDAO.<PushTask>findAll(TaskType.PUSH));
-                for (SchedTask task : tasks) {
-                    try {
-                        registerJob(task, interruptMaxRetries);
-                    } catch (Exception e) {
-                        LOG.error("While loading job instance for task " + task.getKey(), e);
+                        long interruptMaxRetries = confDAO.find("tasks.interruptMaxRetries", "1").getValues().get(0).
+                        getLongValue();
+
+                        return ImmutablePair.of(notificationJobCronExpression, interruptMaxRetries);
+                    }
+                });
+
+        for (String domain : domainsHolder.getDomains().keySet()) {
+            AuthContextUtils.execWithAuthContext(domain, new AuthContextUtils.Executable<Void>() {
+
+                @Override
+                public Void exec() {
+                    // 1. jobs for SchedTasks
+                    Set<SchedTask> tasks = new HashSet<>(taskDAO.<SchedTask>findAll(TaskType.SCHEDULED));
+                    tasks.addAll(taskDAO.<SyncTask>findAll(TaskType.SYNCHRONIZATION));
+                    tasks.addAll(taskDAO.<PushTask>findAll(TaskType.PUSH));
+                    for (SchedTask task : tasks) {
+                        try {
+                            registerJob(task, notificationConf.getRight());
+                        } catch (Exception e) {
+                            LOG.error("While loading job instance for task " + task.getKey(), e);
+                        }
                     }
-                }
 
-                // 2. ReportJobs
-                for (Report report : reportDAO.findAll()) {
-                    try {
-                        registerJob(report);
-                    } catch (Exception e) {
-                        LOG.error("While loading job instance for report " + report.getName(), e);
+                    // 2. ReportJobs
+                    for (Report report : reportDAO.findAll()) {
+                        try {
+                            registerJob(report);
+                        } catch (Exception e) {
+                            LOG.error("While loading job instance for report " + report.getName(), e);
+                        }
                     }
+
+                    return null;
                 }
-            } finally {
-                AuthContextUtils.clearFakeAuth();
-            }
+            });
         }
 
         // 3. NotificationJob
-        if (StringUtils.isBlank(notificationJobCronExpression)) {
+        if (StringUtils.isBlank(notificationConf.getLeft())) {
             LOG.debug("Empty value provided for NotificationJob's cron, not registering anything on Quartz");
         } else {
             LOG.debug("NotificationJob's cron expression: {} - registering Quartz job and trigger",
-                    notificationJobCronExpression);
+                    notificationConf.getLeft());
 
             try {
-                registerNotificationJob(notificationJobCronExpression);
+                registerNotificationJob(notificationConf.getLeft());
             } catch (Exception e) {
                 LOG.error("While loading NotificationJob instance", e);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJob.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJob.java b/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJob.java
index a0f21f3..adba78d 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJob.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJob.java
@@ -60,13 +60,22 @@ public class NotificationJob implements Job {
         LOG.debug("Waking up...");
 
         for (String domain : domainsHolder.getDomains().keySet()) {
-            AuthContextUtils.setFakeAuth(domain);
             try {
-                delegate.execute();
-            } catch (Exception e) {
-                throw new JobExecutionException(e);
-            } finally {
-                AuthContextUtils.clearFakeAuth();
+                AuthContextUtils.execWithAuthContext(domain, new AuthContextUtils.Executable<Void>() {
+
+                    @Override
+                    public Void exec() {
+                        try {
+                            delegate.execute();
+                        } catch (Exception e) {
+                            throw new RuntimeException(e);
+                        }
+
+                        return null;
+                    }
+                });
+            } catch (RuntimeException e) {
+                throw new JobExecutionException(e.getCause());
             }
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJobDelegate.java b/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJobDelegate.java
index aaebe77..763bab5 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJobDelegate.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/notification/NotificationJobDelegate.java
@@ -187,8 +187,9 @@ public class NotificationJobDelegate {
 
         if (hasToBeRegistered(execution)) {
             execution = notificationManager.storeExec(execution);
-            if (retryPossible && (NotificationJob.Status.valueOf(execution.getStatus())
-                    == NotificationJob.Status.NOT_SENT)) {
+            if (retryPossible
+                    && (NotificationJob.Status.valueOf(execution.getStatus()) == NotificationJob.Status.NOT_SENT)) {
+
                 handleRetries(execution);
             }
         } else {

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
index 8e5af91..686953c 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/report/ReportJob.java
@@ -51,13 +51,23 @@ public class ReportJob implements Job {
 
     @Override
     public void execute(final JobExecutionContext context) throws JobExecutionException {
-        AuthContextUtils.setFakeAuth(context.getMergedJobDataMap().getString(JobInstanceLoader.DOMAIN));
         try {
-            delegate.execute(reportKey);
-        } catch (Exception e) {
-            throw new JobExecutionException(e);
-        } finally {
-            AuthContextUtils.clearFakeAuth();
+            AuthContextUtils.execWithAuthContext(context.getMergedJobDataMap().getString(JobInstanceLoader.DOMAIN),
+                    new AuthContextUtils.Executable<Void>() {
+
+                        @Override
+                        public Void exec() {
+                            try {
+                                delegate.execute(reportKey);
+                            } catch (Exception e) {
+                                throw new RuntimeException(e);
+                            }
+
+                            return null;
+                        }
+                    });
+        } catch (RuntimeException e) {
+            throw new JobExecutionException(e.getCause());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/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
deleted file mode 100644
index 32ae367..0000000
--- a/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java
+++ /dev/null
@@ -1,40 +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 org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.transaction.TransactionConfiguration;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = {
-    "classpath:provisioningContext.xml",
-    "classpath:logicContext.xml",
-    "classpath:workflowContext.xml",
-    "classpath:logicTest.xml"
-})
-@TransactionConfiguration(transactionManager = "MasterTransactionManager")
-public abstract class AbstractTest {
-
-    protected static final Logger LOG = LoggerFactory.getLogger(AbstractTest.class);
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java
----------------------------------------------------------------------
diff --git a/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java b/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java
deleted file mode 100644
index 6c208a2..0000000
--- a/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java
+++ /dev/null
@@ -1,659 +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 static org.junit.Assert.assertTrue;
-
-import com.icegreen.greenmail.util.GreenMail;
-import com.icegreen.greenmail.util.ServerSetup;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-import java.util.UUID;
-import javax.annotation.Resource;
-import javax.mail.Flags.Flag;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.Session;
-import javax.mail.Store;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder;
-import org.apache.syncope.common.lib.search.UserFiqlSearchConditionBuilder;
-import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.common.lib.to.MembershipTO;
-import org.apache.syncope.common.lib.to.NotificationTaskTO;
-import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.Entitlement;
-import org.apache.syncope.common.lib.types.IntMappingType;
-import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.common.lib.types.TraceLevel;
-import org.apache.syncope.core.persistence.api.dao.ConfDAO;
-import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.TaskDAO;
-import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.Notification;
-import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.task.NotificationTask;
-import org.apache.syncope.core.logic.notification.NotificationJob;
-import org.apache.syncope.core.misc.security.SyncopeGrantedAuthority;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyAbout;
-import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttrValue;
-import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.mail.javamail.JavaMailSenderImpl;
-import org.springframework.security.authentication.TestingAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class NotificationTest extends AbstractTest {
-
-    private static final String SMTP_HOST = "localhost";
-
-    private static final int SMTP_PORT = 2525;
-
-    private static final String POP3_HOST = "localhost";
-
-    private static final int POP3_PORT = 1110;
-
-    private static final String MAIL_ADDRESS = "notificationtest@syncope.apache.org";
-
-    private static final String MAIL_PASSWORD = "password";
-
-    private static GreenMail greenMail;
-
-    @Resource(name = "adminUser")
-    private String adminUser;
-
-    @Autowired
-    private NotificationDAO notificationDAO;
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private TaskDAO taskDAO;
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private ConfDAO confDAO;
-
-    @Autowired
-    private UserLogic userLogic;
-
-    @Autowired
-    private GroupLogic groupLogic;
-
-    @Autowired
-    private TaskLogic taskLogic;
-
-    @Autowired
-    private NotificationJob notificationJob;
-
-    @Autowired
-    private NotificationManager notificationManager;
-
-    @Autowired
-    private JavaMailSender mailSender;
-
-    @Autowired
-    private EntityFactory entityFactory;
-
-    @BeforeClass
-    public static void startGreenMail() {
-        ServerSetup[] config = new ServerSetup[2];
-        config[0] = new ServerSetup(SMTP_PORT, SMTP_HOST, ServerSetup.PROTOCOL_SMTP);
-        config[1] = new ServerSetup(POP3_PORT, POP3_HOST, ServerSetup.PROTOCOL_POP3);
-        greenMail = new GreenMail(config);
-        greenMail.setUser(MAIL_ADDRESS, MAIL_PASSWORD);
-        greenMail.start();
-    }
-
-    @AfterClass
-    public static void stopGreenMail() {
-        if (greenMail != null) {
-            greenMail.stop();
-        }
-    }
-
-    private static UserTO getUniqueSampleTO(final String email) {
-        return getSampleTO(UUID.randomUUID().toString().substring(0, 8) + email);
-    }
-
-    private static AttrTO attributeTO(final String schema, final String value) {
-        AttrTO attr = new AttrTO();
-        attr.setSchema(schema);
-        attr.getValues().add(value);
-        return attr;
-    }
-
-    private static UserTO getSampleTO(final String email) {
-        String uid = UUID.randomUUID().toString().substring(0, 8) + email;
-        UserTO userTO = new UserTO();
-        userTO.setPassword("password123");
-        userTO.setUsername(uid);
-        userTO.setRealm("/even/two");
-
-        userTO.getPlainAttrs().add(attributeTO("fullname", uid));
-        userTO.getPlainAttrs().add(attributeTO("firstname", uid));
-        userTO.getPlainAttrs().add(attributeTO("surname", "surname"));
-        userTO.getPlainAttrs().add(attributeTO("type", "a type"));
-        userTO.getPlainAttrs().add(attributeTO("userId", uid));
-        userTO.getPlainAttrs().add(attributeTO("email", email));
-        userTO.getPlainAttrs().add(attributeTO("loginDate", new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
-        userTO.getDerAttrs().add(attributeTO("cn", null));
-        userTO.getVirAttrs().add(attributeTO("virtualdata", "virtualvalue"));
-        return userTO;
-    }
-
-    @Before
-    public void setupSecurity() {
-        List<GrantedAuthority> authorities = CollectionUtils.collect(Entitlement.values(),
-                new Transformer<String, GrantedAuthority>() {
-
-                    @Override
-                    public GrantedAuthority transform(final String entitlement) {
-                        return new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM);
-                    }
-                }, new ArrayList<GrantedAuthority>());
-
-        UserDetails userDetails = new User(adminUser, "FAKE_PASSWORD", authorities);
-        Authentication authentication = new TestingAuthenticationToken(userDetails, "FAKE_PASSWORD", authorities);
-        SecurityContextHolder.getContext().setAuthentication(authentication);
-    }
-
-    @Before
-    public void setupSMTP() throws Exception {
-        JavaMailSenderImpl sender = (JavaMailSenderImpl) mailSender;
-        sender.setDefaultEncoding(SyncopeConstants.DEFAULT_ENCODING);
-        sender.setHost(SMTP_HOST);
-        sender.setPort(SMTP_PORT);
-    }
-
-    private boolean verifyMail(final String sender, final String subject) throws Exception {
-        LOG.info("Waiting for notification to be sent...");
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-        }
-
-        boolean found = false;
-        Session session = Session.getDefaultInstance(System.getProperties());
-        Store store = session.getStore("pop3");
-        store.connect(POP3_HOST, POP3_PORT, MAIL_ADDRESS, MAIL_PASSWORD);
-
-        Folder inbox = store.getFolder("INBOX");
-        assertNotNull(inbox);
-        inbox.open(Folder.READ_WRITE);
-
-        Message[] messages = inbox.getMessages();
-        for (Message message : messages) {
-            if (sender.equals(message.getFrom()[0].toString()) && subject.equals(message.getSubject())) {
-                found = true;
-                message.setFlag(Flag.DELETED, true);
-            }
-        }
-
-        inbox.close(true);
-        store.close();
-        return found;
-    }
-
-    @Test
-    public void notifyByMail() throws Exception {
-        // 1. create suitable notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
-
-        AnyAbout about = entityFactory.newEntity(AnyAbout.class);
-        about.setNotification(notification);
-        notification.add(about);
-        about.setAnyType(anyTypeDAO.findUser());
-        about.set(new UserFiqlSearchConditionBuilder().inGroups(7L).query());
-
-        notification.setRecipients(new UserFiqlSearchConditionBuilder().inGroups(8L).query());
-        notification.setSelfAsRecipient(true);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncopetest-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        notificationDAO.flush();
-
-        // 2. create user
-        UserTO userTO = getSampleTO(MAIL_ADDRESS);
-        MembershipTO membershipTO = new MembershipTO();
-        membershipTO.setRightKey(7);
-        userTO.getMemberships().add(membershipTO);
-
-        userLogic.create(userTO, true);
-
-        // 3. force Quartz job execution and verify e-mail
-        notificationJob.execute(null);
-        assertTrue(verifyMail(sender, subject));
-
-        // 4. get NotificationTask id and text body
-        Long taskId = null;
-        String textBody = null;
-        for (NotificationTask task : taskDAO.<NotificationTask>findAll(TaskType.NOTIFICATION)) {
-            if (sender.equals(task.getSender())) {
-                taskId = task.getKey();
-                textBody = task.getTextBody();
-            }
-        }
-        assertNotNull(taskId);
-        assertNotNull(textBody);
-        assertTrue("Notification mail text doesn't contain expected content.",
-                textBody.contains("Your email address is notificationtest@syncope.apache.org."));
-        assertTrue("Notification mail text doesn't contain expected content.",
-                textBody.contains("Your email address inside a link: "
-                        + "http://localhost/?email=notificationtest%40syncope.apache.org ."));
-
-        // 5. execute Notification task and verify e-mail
-        taskLogic.execute(taskId, false);
-        assertTrue(verifyMail(sender, subject));
-    }
-
-    @Test
-    public void issueSYNCOPE192() throws Exception {
-        // 1. create suitable notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
-
-        AnyAbout about = entityFactory.newEntity(AnyAbout.class);
-        about.setNotification(notification);
-        notification.add(about);
-        about.setAnyType(anyTypeDAO.findUser());
-        about.set(new UserFiqlSearchConditionBuilder().inGroups(7L).query());
-
-        notification.setRecipients(new UserFiqlSearchConditionBuilder().inGroups(8L).query());
-        notification.setSelfAsRecipient(true);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncope192-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-        notification.setTraceLevel(TraceLevel.NONE);
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        // 2. create user
-        UserTO userTO = getSampleTO(MAIL_ADDRESS);
-        MembershipTO membershipTO = new MembershipTO();
-        membershipTO.setRightKey(7);
-        userTO.getMemberships().add(membershipTO);
-
-        userLogic.create(userTO, true);
-
-        // 3. force Quartz job execution and verify e-mail
-        notificationJob.execute(null);
-        assertTrue(verifyMail(sender, subject));
-
-        // 4. get NotificationTask id
-        Long taskId = null;
-        for (NotificationTask task : taskDAO.<NotificationTask>findAll(TaskType.NOTIFICATION)) {
-            if (sender.equals(task.getSender())) {
-                taskId = task.getKey();
-            }
-        }
-        assertNotNull(taskId);
-
-        // 5. verify that last exec status was updated
-        NotificationTaskTO task = (NotificationTaskTO) taskLogic.read(taskId);
-        assertNotNull(task);
-        assertTrue(task.getExecutions().isEmpty());
-        assertTrue(task.isExecuted());
-        assertTrue(StringUtils.isNotBlank(task.getLatestExecStatus()));
-    }
-
-    @Test
-    public void notifyByMailEmptyAbout() throws Exception {
-        // 1. create suitable notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
-        notification.setRecipients(new UserFiqlSearchConditionBuilder().inGroups(8L).query());
-        notification.setSelfAsRecipient(true);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncopetest-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        notificationDAO.flush();
-
-        // 2. create user
-        UserTO userTO = getSampleTO(MAIL_ADDRESS);
-        MembershipTO membershipTO = new MembershipTO();
-        membershipTO.setRightKey(7);
-        userTO.getMemberships().add(membershipTO);
-
-        userLogic.create(userTO, true);
-
-        // 3. force Quartz job execution and verify e-mail
-        notificationJob.execute(null);
-        assertTrue(verifyMail(sender, subject));
-
-        // 4. get NotificationTask id
-        Long taskId = null;
-        for (NotificationTask task : taskDAO.<NotificationTask>findAll(TaskType.NOTIFICATION)) {
-            if (sender.equals(task.getSender())) {
-                taskId = task.getKey();
-            }
-        }
-        assertNotNull(taskId);
-
-        // 5. execute Notification task and verify e-mail
-        taskLogic.execute(taskId, false);
-        assertTrue(verifyMail(sender, subject));
-    }
-
-    @Test
-    public void notifyByMailWithRetry() throws Exception {
-        // 1. create suitable notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
-        notification.setRecipients(new UserFiqlSearchConditionBuilder().inGroups(8L).query());
-        notification.setSelfAsRecipient(true);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncopetest-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        notificationDAO.flush();
-
-        // 2. create user
-        UserTO userTO = getSampleTO(MAIL_ADDRESS);
-        MembershipTO membershipTO = new MembershipTO();
-        membershipTO.setRightKey(7);
-        userTO.getMemberships().add(membershipTO);
-
-        userLogic.create(userTO, true);
-
-        // 3. Set number of retries
-        CPlainAttr maxRetries = entityFactory.newEntity(CPlainAttr.class);
-        maxRetries.setSchema(plainSchemaDAO.find("notification.maxRetries"));
-        CPlainAttrValue maxRetriesValue = entityFactory.newEntity(CPlainAttrValue.class);
-        maxRetries.add("5", maxRetriesValue);
-        confDAO.save(maxRetries);
-        confDAO.flush();
-
-        // 4. Stop mail server to force error sending mail
-        stopGreenMail();
-
-        // 5. force Quartz job execution multiple times
-        for (int i = 0; i < 10; i++) {
-            notificationJob.execute(null);
-        }
-
-        // 6. get NotificationTask, count number of executions
-        NotificationTask foundTask = null;
-        for (NotificationTask task : taskDAO.<NotificationTask>findAll(TaskType.NOTIFICATION)) {
-            if (sender.equals(task.getSender())) {
-                foundTask = task;
-            }
-        }
-        assertNotNull(foundTask);
-        assertEquals(6, notificationManager.countExecutionsWithStatus(foundTask.getKey(),
-                NotificationJob.Status.NOT_SENT.name()));
-
-        // 7. start mail server again
-        startGreenMail();
-
-        // 8. reset number of retries
-        maxRetries = entityFactory.newEntity(CPlainAttr.class);
-        maxRetries.setSchema(plainSchemaDAO.find("notification.maxRetries"));
-        maxRetriesValue = entityFactory.newEntity(CPlainAttrValue.class);
-        maxRetries.add("0", maxRetriesValue);
-        confDAO.save(maxRetries);
-        confDAO.flush();
-    }
-
-    @Test
-    public void issueSYNCOPE445() throws Exception {
-        // 1. create suitable notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
-
-        AnyAbout about = entityFactory.newEntity(AnyAbout.class);
-        about.setNotification(notification);
-        notification.add(about);
-        about.setAnyType(anyTypeDAO.findUser());
-        about.set(new UserFiqlSearchConditionBuilder().inGroups(7L).query());
-
-        notification.setRecipients(new UserFiqlSearchConditionBuilder().inGroups(8L).query());
-        notification.setSelfAsRecipient(true);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        notification.getStaticRecipients().add("syncope445@syncope.apache.org");
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncopetest-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        notificationDAO.flush();
-
-        // 2. create user
-        UserTO userTO = getSampleTO(MAIL_ADDRESS);
-        MembershipTO membershipTO = new MembershipTO();
-        membershipTO.setRightKey(7);
-        userTO.getMemberships().add(membershipTO);
-
-        userLogic.create(userTO, true);
-
-        // 3. force Quartz job execution and verify e-mail
-        notificationJob.execute(null);
-        assertTrue(verifyMail(sender, subject));
-
-        // 4. get NotificationTask id and text body
-        Long taskId = null;
-        String textBody = null;
-        Set<String> recipients = null;
-        for (NotificationTask task : taskDAO.<NotificationTask>findAll(TaskType.NOTIFICATION)) {
-            if (sender.equals(task.getSender())) {
-                taskId = task.getKey();
-                textBody = task.getTextBody();
-                recipients = task.getRecipients();
-            }
-        }
-
-        assertNotNull(taskId);
-        assertNotNull(textBody);
-        assertNotNull(recipients);
-        assertTrue(recipients.contains("syncope445@syncope.apache.org"));
-
-        // 5. execute Notification task and verify e-mail
-        taskLogic.execute(taskId, false);
-        assertTrue(verifyMail(sender, subject));
-    }
-
-    @Test
-    public void issueSYNCOPE492() throws Exception {
-        // 1. create suitable disabled notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[UserLogic]:[]:[create]:[SUCCESS]");
-
-        AnyAbout about = entityFactory.newEntity(AnyAbout.class);
-        about.setNotification(notification);
-        notification.add(about);
-        about.setAnyType(anyTypeDAO.findUser());
-        about.set(new UserFiqlSearchConditionBuilder().inGroups(7L).query());
-
-        notification.setSelfAsRecipient(true);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        notification.getStaticRecipients().add("syncope492@syncope.apache.org");
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncopetest-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-        notification.setActive(false);
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        notificationDAO.flush();
-
-        final int tasksNumberBefore = taskDAO.findAll(TaskType.NOTIFICATION).size();
-
-        // 2. create user
-        UserTO userTO = getUniqueSampleTO(MAIL_ADDRESS);
-        MembershipTO membershipTO = new MembershipTO();
-        membershipTO.setRightKey(7);
-        userTO.getMemberships().add(membershipTO);
-
-        userLogic.create(userTO, true);
-
-        // 3. force Quartz job execution
-        notificationJob.execute(null);
-
-        // 4. check if number of tasks is not incremented
-        assertEquals(tasksNumberBefore, taskDAO.findAll(TaskType.NOTIFICATION).size());
-    }
-
-    @Test
-    public void issueSYNCOPE446() throws Exception {
-        // 1. create suitable notification for subsequent tests
-        Notification notification = entityFactory.newEntity(Notification.class);
-        notification.getEvents().add("[REST]:[GroupLogic]:[]:[create]:[SUCCESS]");
-
-        AnyAbout about = entityFactory.newEntity(AnyAbout.class);
-        about.setNotification(notification);
-        notification.add(about);
-        about.setAnyType(anyTypeDAO.findGroup());
-        about.set(new GroupFiqlSearchConditionBuilder().is("name").equalTo("group446").query());
-
-        notification.setSelfAsRecipient(false);
-
-        notification.setRecipientAttrName("email");
-        notification.setRecipientAttrType(IntMappingType.UserPlainSchema);
-
-        notification.getStaticRecipients().add(MAIL_ADDRESS);
-
-        Random random = new Random(System.currentTimeMillis());
-        String sender = "syncopetest-" + random.nextLong() + "@syncope.apache.org";
-        notification.setSender(sender);
-        String subject = "Test notification " + random.nextLong();
-        notification.setSubject(subject);
-        notification.setTemplate("optin");
-
-        Notification actual = notificationDAO.save(notification);
-        assertNotNull(actual);
-
-        notificationDAO.flush();
-
-        // 2. create group
-        GroupTO groupTO = new GroupTO();
-        groupTO.setName("group446");
-        groupTO.setRealm("/even/two");
-
-        GroupTO createdGroup = groupLogic.create(groupTO);
-        assertNotNull(createdGroup);
-
-        // 3. force Quartz job execution and verify e-mail
-        notificationJob.execute(null);
-        assertTrue(verifyMail(sender, subject));
-
-        // 4. get NotificationTask id and text body
-        Long taskId = null;
-        String textBody = null;
-        Set<String> recipients = null;
-        for (NotificationTask task : taskDAO.<NotificationTask>findAll(TaskType.NOTIFICATION)) {
-            if (sender.equals(task.getSender())) {
-                taskId = task.getKey();
-                textBody = task.getTextBody();
-                recipients = task.getRecipients();
-            }
-        }
-
-        assertNotNull(taskId);
-        assertNotNull(textBody);
-        assertTrue(recipients != null && recipients.contains(MAIL_ADDRESS));
-
-        // 5. execute Notification task and verify e-mail
-        taskLogic.execute(taskId, false);
-        assertTrue(verifyMail(sender, subject));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/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
deleted file mode 100644
index fd6edd6..0000000
--- a/core/logic/src/test/resources/logicTest.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<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/context
-                           http://www.springframework.org/schema/context/spring-context.xsd">
-    
-  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-    <property name="locations">
-      <list>
-        <value>classpath:persistence.properties</value>
-        <value>classpath:domains/*.properties</value>
-        <value>classpath:security.properties</value>
-        <value>classpath:connid.properties</value>
-        <value>classpath:mail.properties</value>
-        <value>classpath:logic.properties</value>
-        <value>classpath:workflow.properties</value>
-        <value>classpath:provisioning.properties</value>
-      </list>
-    </property>
-    <property name="ignoreResourceNotFound" value="true"/>
-    <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/88061761/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 4586ee3..595dda3 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
@@ -90,7 +90,7 @@ public final class AuthContextUtils {
         return domainKey;
     }
 
-    public static void setFakeAuth(final String domain) {
+    private static void setFakeAuth(final String domain) {
         List<GrantedAuthority> authorities = CollectionUtils.collect(Entitlement.values(),
                 new Transformer<String, GrantedAuthority>() {
 
@@ -107,17 +107,13 @@ public final class AuthContextUtils {
         SecurityContextHolder.getContext().setAuthentication(auth);
     }
 
-    public static void clearFakeAuth() {
-        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.clearContext();
             SecurityContextHolder.setContext(ctx);
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/misc/src/main/java/org/apache/syncope/core/misc/spring/ApplicationContextProvider.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/spring/ApplicationContextProvider.java b/core/misc/src/main/java/org/apache/syncope/core/misc/spring/ApplicationContextProvider.java
index e67dcd6..2a21281 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/spring/ApplicationContextProvider.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/spring/ApplicationContextProvider.java
@@ -18,10 +18,12 @@
  */
 package org.apache.syncope.core.misc.spring;
 
+import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.transaction.interceptor.TransactionInterceptor;
 
 public class ApplicationContextProvider implements ApplicationContextAware {
 
@@ -41,8 +43,16 @@ public class ApplicationContextProvider implements ApplicationContextAware {
                 : BEAN_FACTORY;
     }
 
+    private static void enableDomainTransactionInterceptor() {
+        for (String name : getBeanFactory().getBeanNamesForType(TransactionInterceptor.class)) {
+            BeanDefinition bd = getBeanFactory().getBeanDefinition(name);
+            bd.setBeanClassName(DomainTransactionInterceptor.class.getName());
+        }
+    }
+
     public static void setBeanFactory(final DefaultListableBeanFactory beanFactory) {
         BEAN_FACTORY = beanFactory;
+        enableDomainTransactionInterceptor();
     }
 
     /**
@@ -53,5 +63,6 @@ public class ApplicationContextProvider implements ApplicationContextAware {
     @Override
     public void setApplicationContext(final ApplicationContext ctx) {
         CTX = (ConfigurableApplicationContext) ctx;
+        enableDomainTransactionInterceptor();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/misc/src/main/java/org/apache/syncope/core/misc/spring/DomainTransactionInterceptor.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/spring/DomainTransactionInterceptor.java b/core/misc/src/main/java/org/apache/syncope/core/misc/spring/DomainTransactionInterceptor.java
new file mode 100644
index 0000000..e239002
--- /dev/null
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/spring/DomainTransactionInterceptor.java
@@ -0,0 +1,70 @@
+/*
+ * 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.misc.spring;
+
+import java.lang.reflect.Method;
+import org.aopalliance.intercept.MethodInvocation;
+import org.apache.syncope.core.misc.security.AuthContextUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
+import org.springframework.transaction.interceptor.TransactionAttribute;
+import org.springframework.transaction.interceptor.TransactionAttributeSource;
+import org.springframework.transaction.interceptor.TransactionInterceptor;
+
+/**
+ * Extends the standard {@link TransactionInterceptor} by dynamically setting the appropriate
+ * {@link TransactionAttribute} qualifier according to the authentication domain of the caller - retrieved via
+ * {@link AuthContextUtils#getDomain()}.
+ */
+public class DomainTransactionInterceptor extends TransactionInterceptor {
+
+    private static final long serialVersionUID = 5113728988680448551L;
+
+    private static final Logger LOG = LoggerFactory.getLogger(DomainTransactionInterceptor.class);
+
+    @Override
+    public TransactionAttributeSource getTransactionAttributeSource() {
+        final TransactionAttributeSource origTxAttrSource = super.getTransactionAttributeSource();
+
+        return new TransactionAttributeSource() {
+
+            @Override
+            public TransactionAttribute getTransactionAttribute(final Method method, final Class<?> targetClass) {
+                TransactionAttribute txAttr = origTxAttrSource.getTransactionAttribute(method, targetClass);
+
+                if (txAttr instanceof DefaultTransactionAttribute) {
+                    ((DefaultTransactionAttribute) txAttr).setQualifier(AuthContextUtils.getDomain());
+                }
+
+                return txAttr;
+            }
+        };
+    }
+
+    @Override
+    public Object invoke(final MethodInvocation invocation) throws Throwable {
+        try {
+            return super.invoke(invocation);
+        } catch (Throwable e) {
+            LOG.debug("Error during {} invocation", invocation.getMethod(), e);
+            throw e;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
deleted file mode 100644
index 42779ed..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
+++ /dev/null
@@ -1,70 +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.persistence.jpa.spring;
-
-import java.lang.reflect.Method;
-import org.aopalliance.intercept.MethodInvocation;
-import org.apache.syncope.core.misc.security.AuthContextUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
-import org.springframework.transaction.interceptor.TransactionAttribute;
-import org.springframework.transaction.interceptor.TransactionAttributeSource;
-import org.springframework.transaction.interceptor.TransactionInterceptor;
-
-/**
- * Extends the standard {@link TransactionInterceptor} by dynamically setting the appropriate
- * {@link TransactionAttribute} qualifier according to the authentication domain of the caller - retrieved via
- * {@link AuthContextUtils#getDomain()}.
- */
-public class DomainTransactionInterceptor extends TransactionInterceptor {
-
-    private static final long serialVersionUID = 5113728988680448551L;
-
-    private static final Logger LOG = LoggerFactory.getLogger(DomainTransactionInterceptor.class);
-
-    @Override
-    public TransactionAttributeSource getTransactionAttributeSource() {
-        final TransactionAttributeSource origTxAttrSource = super.getTransactionAttributeSource();
-
-        return new TransactionAttributeSource() {
-
-            @Override
-            public TransactionAttribute getTransactionAttribute(final Method method, final Class<?> targetClass) {
-                TransactionAttribute txAttr = origTxAttrSource.getTransactionAttribute(method, targetClass);
-
-                if (txAttr instanceof DefaultTransactionAttribute) {
-                    ((DefaultTransactionAttribute) txAttr).setQualifier(AuthContextUtils.getDomain());
-                }
-
-                return txAttr;
-            }
-        };
-    }
-
-    @Override
-    public Object invoke(final MethodInvocation invocation) throws Throwable {
-        try {
-            return super.invoke(invocation);
-        } catch (Throwable e) {
-            LOG.debug("Error during {} invocation", invocation.getMethod(), e);
-            throw e;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/SpringComponentReplacer.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/SpringComponentReplacer.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/SpringComponentReplacer.java
deleted file mode 100644
index e983426..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/SpringComponentReplacer.java
+++ /dev/null
@@ -1,42 +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.persistence.jpa.spring;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.interceptor.TransactionInterceptor;
-
-/**
- * Hack for dynamically replacing standard {@link TransactionInterceptor} with
- * {@link DomainTransactionInterceptor} in Spring context.
- */
-@Component
-public class SpringComponentReplacer implements BeanFactoryPostProcessor {
-
-    @Override
-    public void postProcessBeanFactory(final ConfigurableListableBeanFactory factory) throws BeansException {
-        for (String name : factory.getBeanNamesForType(TransactionInterceptor.class)) {
-            BeanDefinition bd = factory.getBeanDefinition(name);
-            bd.setBeanClassName(DomainTransactionInterceptor.class.getName());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/AbstractTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/AbstractTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/AbstractTest.java
index 201708f..bffe55f 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/AbstractTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/AbstractTest.java
@@ -28,11 +28,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.orm.jpa.EntityManagerFactoryUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.transaction.TransactionConfiguration;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations = { "classpath:persistenceTest.xml" })
-@TransactionConfiguration(transactionManager = "MasterTransactionManager")
 public abstract class AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
index 5130c28..cd6b535 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnyObjectTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
index 37aef3c..b5f99ce 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
@@ -53,7 +53,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnySearchTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeClassTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeClassTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeClassTest.java
index ed83f65..1bdae2d 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeClassTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeClassTest.java
@@ -32,7 +32,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnyTypeClassTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
index be60f46..05026a2 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
@@ -34,7 +34,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class AnyTypeTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
index 1e90e5c..38332b6 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
@@ -38,7 +38,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ConfTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
index 70665ed..f3ade5e 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
@@ -37,7 +37,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class ConnInstanceTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
index cd336ae..3fb15b7 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerAttrTest.java
@@ -43,7 +43,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class DerAttrTest extends AbstractTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/88061761/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
index c62ab6e..abe3de3 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java
@@ -34,7 +34,7 @@ import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
-@Transactional
+@Transactional("Master")
 public class DerSchemaTest extends AbstractTest {
 
     @Autowired


[5/6] syncope git commit: [SYNCOPE-685] Pre: re-organize SyncPoliySpec

Posted by md...@apache.org.
[SYNCOPE-685] Pre: re-organize SyncPoliySpec


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

Branch: refs/heads/SYNCOPE-156
Commit: 8fe3c7c20105df6112a1ee7b0206cb00e9c1a054
Parents: dbeb620
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Aug 17 16:54:18 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Aug 17 16:54:18 2015 +0200

----------------------------------------------------------------------
 .../console/panels/BeanReflectionModal.java     |  36 --
 .../console/panels/BeanReflectionPanel.java     | 339 -------------------
 .../common/lib/annotation/ClassList.java        |  26 --
 .../common/lib/annotation/SchemaList.java       |  28 --
 .../common/lib/types/AbstractPolicySpec.java    |   2 -
 .../common/lib/types/SyncPolicySpec.java        |  42 +--
 .../common/lib/types/SyncPolicySpecItem.java    |  67 ----
 .../apache/syncope/core/logic/SyncopeLogic.java |  26 +-
 .../init/ImplementationClassNamesLoader.java    |   7 +-
 .../core/persistence/jpa/inner/PolicyTest.java  |  39 ++-
 .../test/resources/domains/MasterContent.xml    |   8 +-
 .../java/data/PolicyDataBinderImpl.java         |   3 -
 .../sync/PlainAttrsSyncCorrelationRule.java     | 110 ++++++
 .../core/provisioning/java/sync/SyncUtils.java  | 126 ++-----
 .../fit/core/reference/PolicyITCase.java        |  11 +-
 .../fit/core/reference/SyncTaskITCase.java      |  12 +-
 16 files changed, 193 insertions(+), 689 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
deleted file mode 100644
index a6859e8..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
+++ /dev/null
@@ -1,36 +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.client.console.panels;
-
-import java.io.Serializable;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-
-/**
- * Modal window with Resource form.
- */
-public abstract class BeanReflectionModal extends ModalContent {
-
-    private static final long serialVersionUID = 1734415311027284222L;
-
-    public BeanReflectionModal(final Serializable bean, final ModalWindow window, final PageReference pageRef) {
-        super(window, pageRef);
-        add(new BeanReflectionPanel("bean", bean));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
deleted file mode 100644
index 4f3f1d5..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
+++ /dev/null
@@ -1,339 +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.client.console.panels;
-
-import java.beans.PropertyDescriptor;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.rest.PolicyRestClient;
-import org.apache.syncope.client.console.rest.SchemaRestClient;
-import org.apache.syncope.client.console.wicket.markup.html.form.AbstractFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
-import org.apache.syncope.client.console.wicket.markup.html.list.AltListView;
-import org.apache.syncope.common.lib.annotation.ClassList;
-import org.apache.syncope.common.lib.annotation.SchemaList;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.model.util.ListModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.util.ClassUtils;
-import org.springframework.util.ReflectionUtils;
-import org.springframework.util.ReflectionUtils.FieldCallback;
-import org.springframework.util.ReflectionUtils.FieldFilter;
-
-public class BeanReflectionPanel extends Panel {
-
-    private static final long serialVersionUID = -3035998190456928143L;
-
-    /**
-     * Logger.
-     */
-    private static final Logger LOG = LoggerFactory.getLogger(BeanReflectionPanel.class);
-
-    @SpringBean
-    private SchemaRestClient schemaRestClient;
-
-    @SpringBean
-    private PolicyRestClient policyRestClient;
-
-    private final IModel<List<String>> userSchemas = new LoadableDetachableModel<List<String>>() {
-
-        private static final long serialVersionUID = -2012833443695917883L;
-
-        @Override
-        protected List<String> load() {
-            return schemaRestClient.getPlainSchemaNames();
-        }
-    };
-
-    private final IModel<List<String>> groupSchemas = new LoadableDetachableModel<List<String>>() {
-
-        private static final long serialVersionUID = 5275935387613157437L;
-
-        @Override
-        protected List<String> load() {
-            return schemaRestClient.getPlainSchemaNames();
-        }
-    };
-
-    private final IModel<List<String>> correlationRules = new LoadableDetachableModel<List<String>>() {
-
-        private static final long serialVersionUID = 5275935387613157437L;
-
-        @Override
-        protected List<String> load() {
-            return policyRestClient.getCorrelationRuleClasses();
-        }
-    };
-
-    public BeanReflectionPanel(final String id, final Serializable bean) {
-        super(id);
-
-        final List<FieldWrapper> items = new ArrayList<>();
-        ReflectionUtils.doWithFields(bean.getClass(),
-                new FieldCallback() {
-
-                    @Override
-                    public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
-                        FieldWrapper fieldWrapper = new FieldWrapper();
-                        fieldWrapper.setName(field.getName());
-                        fieldWrapper.setType(field.getType());
-
-                        final SchemaList schemaList = field.getAnnotation(SchemaList.class);
-                        fieldWrapper.setSchemaList(schemaList);
-
-                        final ClassList classList = field.getAnnotation(ClassList.class);
-                        fieldWrapper.setClassList(classList);
-
-                        items.add(fieldWrapper);
-                    }
-                },
-                new FieldFilter() {
-
-                    @Override
-                    public boolean matches(final Field field) {
-                        return !Modifier.isStatic(field.getModifiers()) && !"serialVersionUID".equals(field.getName());
-                    }
-                });
-
-        final ListView<FieldWrapper> policies = new AltListView<FieldWrapper>("fields", items) {
-
-            private static final long serialVersionUID = 9101744072914090143L;
-
-            @Override
-            @SuppressWarnings({ "unchecked", "rawtypes" })
-            protected void populateItem(final ListItem<FieldWrapper> item) {
-                final FieldWrapper field = item.getModelObject();
-
-                final PropertyDescriptor propDesc = BeanUtils.getPropertyDescriptor(bean.getClass(), field.getName());
-
-                item.add(new Label("label", new ResourceModel(field.getName())));
-
-                AbstractFieldPanel component;
-                try {
-                    if (field.getClassList() != null) {
-                        component = new AjaxDropDownChoicePanel("field", field.getName(), new PropertyModel(bean,
-                                field.getName()));
-
-                        final List<String> rules = correlationRules.getObject();
-
-                        if (rules != null && !rules.isEmpty()) {
-                            ((AjaxDropDownChoicePanel) component).setChoices(correlationRules.getObject());
-                        }
-
-                        item.add(component);
-
-                        item.add(getActivationControl(
-                                component,
-                                propDesc.getReadMethod().invoke(bean, new Object[] {}) != null,
-                                null,
-                                null));
-
-                    } else if (field.getType().isEnum()) {
-                        component = new AjaxDropDownChoicePanel("field", field.getName(), new PropertyModel(bean,
-                                field.getName()));
-
-                        final Serializable[] values = (Serializable[]) field.getType().getEnumConstants();
-
-                        if (values != null && values.length > 0) {
-                            ((AjaxDropDownChoicePanel) component).setChoices(Arrays.asList(values));
-                        }
-
-                        item.add(component);
-
-                        item.add(getActivationControl(
-                                component,
-                                (Enum<?>) propDesc.getReadMethod().invoke(bean, new Object[] {}) != null,
-                                values[0],
-                                values[0]));
-
-                    } else if (ClassUtils.isAssignable(Boolean.class, field.getType())) {
-                        item.add(new AjaxCheckBoxPanel("check", field.getName(),
-                                new PropertyModel<Boolean>(bean, field.getName())));
-
-                        item.add(new Label("field", new Model(null)));
-                    } else if (Collection.class.isAssignableFrom(field.getType())) {
-                        if (field.getSchemaList() != null) {
-                            final List<String> values = new ArrayList<>();
-                            if (field.getName().charAt(0) == 'r') {
-                                values.addAll(groupSchemas.getObject());
-
-                                if (field.getSchemaList().extended()) {
-                                    values.add("name");
-                                }
-                            } else {
-                                values.addAll(userSchemas.getObject());
-
-                                if (field.getSchemaList().extended()) {
-                                    values.add("key");
-                                    values.add("username");
-                                }
-                            }
-
-                            component = new AjaxPalettePanel("field", new PropertyModel(bean, field.getName()),
-                                    new ListModel<>(values));
-                            item.add(component);
-
-                            Collection<?> collection = (Collection) propDesc.getReadMethod().invoke(bean);
-                            item.add(getActivationControl(component,
-                                    !collection.isEmpty(), new ArrayList<String>(), new ArrayList<String>()));
-                        } else {
-                            final FieldPanel panel = new AjaxTextFieldPanel("panel", field.getName(),
-                                    new Model<String>(null));
-                            panel.setRequired(true);
-
-                            component = new MultiFieldPanel<String>("field",
-                                    new PropertyModel(bean, field.getName()), panel);
-
-                            item.add(component);
-
-                            final List<String> reinitializedValue = new ArrayList<String>();
-
-                            reinitializedValue.add("");
-
-                            item.add(getActivationControl(component,
-                                    !((Collection) propDesc.getReadMethod().invoke(bean, new Object[] {})).isEmpty(),
-                                    new ArrayList<String>(), (Serializable) reinitializedValue));
-                        }
-                    } else if (ClassUtils.isAssignable(Number.class, field.getType())) {
-                        component = new SpinnerFieldPanel<Number>("field", field.getName(),
-                                (Class<Number>) field.getType(), new PropertyModel<Number>(bean, field.getName()),
-                                null, null);
-                        item.add(component);
-
-                        item.add(getActivationControl(component,
-                                (Integer) propDesc.getReadMethod().invoke(bean, new Object[] {}) > 0, 0, 0));
-                    } else if (field.getType().equals(String.class)) {
-                        component = new AjaxTextFieldPanel("field", field.getName(),
-                                new PropertyModel(bean, field.getName()));
-
-                        item.add(component);
-
-                        item.add(getActivationControl(component,
-                                propDesc.getReadMethod().invoke(bean, new Object[] {}) != null, null, null));
-                    } else {
-                        item.add(new AjaxCheckBoxPanel("check", field.getName(), new Model()));
-                        item.add(new Label("field", new Model(null)));
-                    }
-                } catch (Exception e) {
-                    LOG.error("Error retrieving bean fields", e);
-                }
-            }
-        };
-
-        add(policies);
-    }
-
-    private <T extends Serializable> AjaxCheckBoxPanel getActivationControl(final AbstractFieldPanel<T> panel,
-            final Boolean checked, final T defaultModelObject, final T reinitializedValue) {
-
-        final AjaxCheckBoxPanel check = new AjaxCheckBoxPanel("check", "check", new Model<Boolean>(checked));
-
-        panel.setEnabled(checked);
-
-        check.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
-
-            private static final long serialVersionUID = -1107858522700306810L;
-
-            @Override
-            protected void onUpdate(final AjaxRequestTarget target) {
-                if (check.getModelObject()) {
-                    panel.setEnabled(true);
-                    panel.setModelObject(reinitializedValue);
-                } else {
-                    panel.setModelObject(defaultModelObject);
-                    panel.setEnabled(false);
-                }
-
-                target.add(panel);
-            }
-        });
-
-        return check;
-    }
-
-    private static class FieldWrapper implements Serializable {
-
-        private static final long serialVersionUID = -6770429509752964215L;
-
-        private Class<?> type;
-
-        private String name;
-
-        private transient SchemaList schemaList;
-
-        private transient ClassList classList;
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(final String name) {
-            this.name = name;
-        }
-
-        public Class<?> getType() {
-            return type;
-        }
-
-        public void setType(final Class<?> type) {
-            this.type = type;
-        }
-
-        public SchemaList getSchemaList() {
-            return schemaList;
-        }
-
-        public void setSchemaList(final SchemaList schemaList) {
-            this.schemaList = schemaList;
-        }
-
-        public ClassList getClassList() {
-            return classList;
-        }
-
-        public void setClassList(final ClassList classList) {
-            this.classList = classList;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/ClassList.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/ClassList.java b/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/ClassList.java
deleted file mode 100644
index 07528ea..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/ClassList.java
+++ /dev/null
@@ -1,26 +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.common.lib.annotation;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-@Retention(RUNTIME)
-public @interface ClassList {
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/SchemaList.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/SchemaList.java b/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/SchemaList.java
deleted file mode 100644
index 7469731..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/annotation/SchemaList.java
+++ /dev/null
@@ -1,28 +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.common.lib.annotation;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-@Retention(RUNTIME)
-public @interface SchemaList {
-
-    boolean extended() default false;
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/common/lib/src/main/java/org/apache/syncope/common/lib/types/AbstractPolicySpec.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/AbstractPolicySpec.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/AbstractPolicySpec.java
index e1e7333..33a0c62 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/AbstractPolicySpec.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/AbstractPolicySpec.java
@@ -28,7 +28,6 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.syncope.common.lib.annotation.SchemaList;
 
 @XmlType
 public abstract class AbstractPolicySpec implements PolicySpec {
@@ -43,7 +42,6 @@ public abstract class AbstractPolicySpec implements PolicySpec {
     /**
      * User attribute values not permitted.
      */
-    @SchemaList
     protected final List<String> schemasNotPermitted = new ArrayList<>();
 
     /**

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpec.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpec.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpec.java
index 34f95dd..5a3d309 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpec.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpec.java
@@ -18,26 +18,32 @@
  */
 package org.apache.syncope.common.lib.types;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
+import java.util.HashMap;
+import java.util.Map;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 
 @XmlType
 public class SyncPolicySpec implements PolicySpec {
 
     private static final long serialVersionUID = -3144027171719498127L;
 
-    private final List<SyncPolicySpecItem> items = new ArrayList<>();
+    private ConflictResolutionAction conflictResolutionAction;
 
     /**
-     * Conflict resolution action.
+     * Associates anyTypeKey to either:
+     * <ol>
+     * <li>Java class name, implementing {@code SyncCorrelationRule}</li>
+     * <li>JSON array containing plain schema names - this will be used to feed
+     * {@code PlainAttrsSyncCorrelationRule}</li>
+     * </ol>
      */
-    private ConflictResolutionAction conflictResolutionAction;
+    @XmlJavaTypeAdapter(XmlGenericMapAdapter.class)
+    @JsonIgnore
+    private final Map<String, String> correlationRules = new HashMap<>();
 
     public ConflictResolutionAction getConflictResolutionAction() {
         return conflictResolutionAction == null
@@ -49,20 +55,8 @@ public class SyncPolicySpec implements PolicySpec {
         this.conflictResolutionAction = conflictResolutionAction;
     }
 
-    public SyncPolicySpecItem getItem(final String anyTypeKey) {
-        return CollectionUtils.find(items, new Predicate<SyncPolicySpecItem>() {
-
-            @Override
-            public boolean evaluate(final SyncPolicySpecItem item) {
-                return anyTypeKey != null && anyTypeKey.equals(item.getAnyTypeKey());
-            }
-        });
-    }
-
-    @XmlElementWrapper(name = "items")
-    @XmlElement(name = "item")
-    @JsonProperty("items")
-    public List<SyncPolicySpecItem> getItems() {
-        return items;
+    @JsonProperty
+    public Map<String, String> getCorrelationRules() {
+        return correlationRules;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpecItem.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpecItem.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpecItem.java
deleted file mode 100644
index 4acb61b..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/SyncPolicySpecItem.java
+++ /dev/null
@@ -1,67 +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.common.lib.types;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.ArrayList;
-import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.AbstractBaseBean;
-import org.apache.syncope.common.lib.annotation.ClassList;
-import org.apache.syncope.common.lib.annotation.SchemaList;
-
-@XmlType
-public class SyncPolicySpecItem extends AbstractBaseBean {
-
-    private static final long serialVersionUID = 692466729711976485L;
-
-    private String anyTypeKey;
-
-    @SchemaList(extended = true)
-    private final List<String> altSearchSchemas = new ArrayList<>();
-
-    @ClassList
-    private String javaRule;
-
-    public String getAnyTypeKey() {
-        return anyTypeKey;
-    }
-
-    public void setAnyTypeKey(final String anyTypeKey) {
-        this.anyTypeKey = anyTypeKey;
-    }
-
-    public String getJavaRule() {
-        return javaRule;
-    }
-
-    public void setJavaRule(final String javaRule) {
-        this.javaRule = javaRule;
-    }
-
-    @XmlElementWrapper(name = "altSearchSchemas")
-    @XmlElement(name = "altSearchSchema")
-    @JsonProperty("altSearchSchemas")
-    public List<String> getAltSearchSchemas() {
-        return altSearchSchemas;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index 8dd20a8..d6432e2 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -18,6 +18,8 @@
  */
 package org.apache.syncope.core.logic;
 
+import static org.apache.syncope.core.logic.init.ImplementationClassNamesLoader.Type;
+
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.URI;
@@ -128,22 +130,14 @@ public class SyncopeLogic extends AbstractLogic<SyncopeTO> {
         syncopeTO.setGroupProvisioningManager(gProvisioningManager.getClass().getName());
         syncopeTO.setVirAttrCache(virAttrCache.getClass().getName());
 
-        syncopeTO.getReportlets().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.REPORTLET));
-        syncopeTO.getTaskJobs().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.TASKJOBDELEGATE));
-        syncopeTO.getPropagationActions().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.PROPAGATION_ACTIONS));
-        syncopeTO.getSyncActions().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.SYNC_ACTIONS));
-        syncopeTO.getPushActions().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.PUSH_ACTIONS));
-        syncopeTO.getSyncCorrelationRules().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.SYNC_CORRELATION_RULE));
-        syncopeTO.getPushCorrelationRules().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.PUSH_CORRELATION_RULE));
-        syncopeTO.getValidators().addAll(
-                classNamesLoader.getClassNames(ImplementationClassNamesLoader.Type.VALIDATOR));
+        syncopeTO.getReportlets().addAll(classNamesLoader.getClassNames(Type.REPORTLET));
+        syncopeTO.getTaskJobs().addAll(classNamesLoader.getClassNames(Type.TASKJOBDELEGATE));
+        syncopeTO.getPropagationActions().addAll(classNamesLoader.getClassNames(Type.PROPAGATION_ACTIONS));
+        syncopeTO.getSyncActions().addAll(classNamesLoader.getClassNames(Type.SYNC_ACTIONS));
+        syncopeTO.getPushActions().addAll(classNamesLoader.getClassNames(Type.PUSH_ACTIONS));
+        syncopeTO.getSyncCorrelationRules().addAll(classNamesLoader.getClassNames(Type.SYNC_CORRELATION_RULE));
+        syncopeTO.getPushCorrelationRules().addAll(classNamesLoader.getClassNames(Type.PUSH_CORRELATION_RULE));
+        syncopeTO.getValidators().addAll(classNamesLoader.getClassNames(Type.VALIDATOR));
 
         Set<String> htmlTemplates = new HashSet<>();
         Set<String> textTemplates = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/logic/src/main/java/org/apache/syncope/core/logic/init/ImplementationClassNamesLoader.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/ImplementationClassNamesLoader.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/ImplementationClassNamesLoader.java
index 2bcd78f..1b53e5c 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/ImplementationClassNamesLoader.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/ImplementationClassNamesLoader.java
@@ -62,9 +62,6 @@ public class ImplementationClassNamesLoader implements SyncopeLoader {
 
     }
 
-    /**
-     * Logger.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(ImplementationClassNamesLoader.class);
 
     private Map<Type, Set<String>> classNames;
@@ -87,7 +84,7 @@ public class ImplementationClassNamesLoader implements SyncopeLoader {
         scanner.addIncludeFilter(new AssignableTypeFilter(SyncActions.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(PushActions.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(SyncCorrelationRule.class));
-        // Remove once SYNCOPE-631 is done
+        // Remove once SYNCOPE-470 is done
         //scanner.addIncludeFilter(new AssignableTypeFilter(PushCorrelationRule.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(PropagationActions.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(Validator.class));
@@ -121,7 +118,7 @@ public class ImplementationClassNamesLoader implements SyncopeLoader {
                     classNames.get(Type.SYNC_CORRELATION_RULE).add(bd.getBeanClassName());
                 }
 
-                // Uncomment when SYNCOPE-631 is done
+                // Uncomment when SYNCOPE-470 is done
                 /* if (PushCorrelationRule.class.isAssignableFrom(clazz) && !isAbsractClazz) {
                  * classNames.get(Type.PUSH_CORRELATION_RULES).add(metadata.getClassName());
                  * } */

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
index c75a148..603cd01 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
@@ -22,12 +22,15 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import java.util.List;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.PasswordPolicySpec;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.SyncPolicySpec;
-import org.apache.syncope.common.lib.types.SyncPolicySpecItem;
+import org.apache.syncope.core.misc.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
@@ -55,9 +58,20 @@ public class PolicyTest extends AbstractTest {
     }
 
     @Test
-    public void findById() {
-        Policy policy = policyDAO.find(1L);
+    public void findByKey() {
+        SyncPolicy policy = policyDAO.find(3L);
         assertNotNull("findById did not work", policy);
+
+        SyncPolicySpec spec = policy.getSpecification(SyncPolicySpec.class);
+        assertNotNull(spec);
+
+        String rule = spec.getCorrelationRules().get(AnyTypeKind.USER.name());
+        assertNotNull(rule);
+        String[] plainSchemas = POJOHelper.deserialize(rule, String[].class);
+        assertNotNull(plainSchemas);
+        assertEquals(2, plainSchemas.length);
+        assertTrue(ArrayUtils.contains(plainSchemas, "username"));
+        assertTrue(ArrayUtils.contains(plainSchemas, "firstname"));
     }
 
     @Test
@@ -89,15 +103,8 @@ public class PolicyTest extends AbstractTest {
 
         SyncPolicySpec syncPolicySpec = new SyncPolicySpec();
 
-        SyncPolicySpecItem item = new SyncPolicySpecItem();
-        item.setAnyTypeKey(anyTypeDAO.findUser().getKey());
-        item.setJavaRule(syncURuleName);
-        syncPolicySpec.getItems().add(item);
-
-        item = new SyncPolicySpecItem();
-        item.setAnyTypeKey(anyTypeDAO.findGroup().getKey());
-        item.setJavaRule(syncGRuleName);
-        syncPolicySpec.getItems().add(item);
+        syncPolicySpec.getCorrelationRules().put(anyTypeDAO.findUser().getKey(), syncURuleName);
+        syncPolicySpec.getCorrelationRules().put(anyTypeDAO.findGroup().getKey(), syncGRuleName);
 
         policy.setSpecification(syncPolicySpec);
         policy.setDescription("Sync policy");
@@ -106,10 +113,10 @@ public class PolicyTest extends AbstractTest {
 
         assertNotNull(policy);
         assertEquals(PolicyType.SYNC, policy.getType());
-        assertEquals(syncURuleName,
-                (policy.getSpecification(SyncPolicySpec.class)).getItem(anyTypeDAO.findUser().getKey()).getJavaRule());
-        assertEquals(syncGRuleName,
-                (policy.getSpecification(SyncPolicySpec.class)).getItem(anyTypeDAO.findGroup().getKey()).getJavaRule());
+        assertEquals(syncURuleName, (policy.getSpecification(SyncPolicySpec.class)).
+                getCorrelationRules().get(anyTypeDAO.findUser().getKey()));
+        assertEquals(syncGRuleName, (policy.getSpecification(SyncPolicySpec.class)).
+                getCorrelationRules().get(anyTypeDAO.findGroup().getKey()));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 37ff60f..5977c9a 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -101,11 +101,11 @@ under the License.
   
   <!-- sample policies -->
   <Policy DTYPE="SyncPolicy" id="1" description="a sync policy" type="SYNC" 
-          specification='{"conflictResolutionAction":"IGNORE","items":[]}'/>
+          specification='{"conflictResolutionAction":"IGNORE"'/>
   <Policy DTYPE="PasswordPolicy" id="2" description="a password policy" type="PASSWORD" 
           specification='{"historyLength":1,"maxLength":0,"minLength":8,"nonAlphanumericRequired":false,"alphanumericRequired":false,"digitRequired":false,"lowercaseRequired":false,"uppercaseRequired":false,"mustStartWithDigit":false,"mustntStartWithDigit":false,"mustEndWithDigit":false,"mustntEndWithDigit":false,"mustStartWithNonAlpha":false,"mustStartWithAlpha":false,"mustntStartWithNonAlpha":false,"mustntStartWithAlpha":false,"mustEndWithNonAlpha":false,"mustEndWithAlpha":false,"mustntEndWithNonAlpha":false,"mustntEndWithAlpha":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[],"allowNullPassword":true}'/>
   <Policy DTYPE="SyncPolicy" id="3" description="sync policy 2" type="SYNC" 
-          specification='{"conflictResolutionAction":"ALL","items":[{"anyTypeKey":"USER","javaRule":null,"altSearchSchemas":["username","firstname"]}]}'/>
+          specification='{"conflictResolutionAction":"ALL","correlationRules":{"USER":"[\"username\",\"firstname\"]"}}'/>
   <Policy DTYPE="PasswordPolicy" id="4" description="sample password policy" type="PASSWORD" 
           specification='{"historyLength":0,"maxLength":0,"minLength":10,"nonAlphanumericRequired":false,"alphanumericRequired":false,"digitRequired":true,"lowercaseRequired":false,"uppercaseRequired":false,"mustStartWithDigit":false,"mustntStartWithDigit":false,"mustEndWithDigit":false,"mustntEndWithDigit":false,"mustStartWithNonAlpha":false,"mustStartWithAlpha":false,"mustntStartWithNonAlpha":false,"mustntStartWithAlpha":false,"mustEndWithNonAlpha":false,"mustEndWithAlpha":false,"mustntEndWithNonAlpha":false,"mustntEndWithAlpha":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[], "allowNullPassword":true}'/>
   <Policy DTYPE="AccountPolicy" id="5" description="an account policy" type="ACCOUNT" 
@@ -113,11 +113,11 @@ under the License.
   <Policy DTYPE="AccountPolicy" id="6" description="sample account policy" type="ACCOUNT" 
           specification='{"maxLength":0,"minLength":4,"pattern":null,"allUpperCase":false,"allLowerCase":false,"propagateSuspension":false,"maxAuthenticationAttempts":3,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[]}'/>
   <Policy DTYPE="SyncPolicy" id="7" description="sync policy 1" type="SYNC" 
-          specification='{"conflictResolutionAction":"IGNORE","items":[]}'/>
+          specification='{"conflictResolutionAction":"IGNORE"}'/>
   <Policy DTYPE="PasswordPolicy" id="8" description="sample password policy" type="PASSWORD" 
           specification='{"historyLength":0,"maxLength":0,"minLength":10,"nonAlphanumericRequired":true,"alphanumericRequired":false,"digitRequired":true,"lowercaseRequired":true,"uppercaseRequired":true,"mustStartWithDigit":true,"mustntStartWithDigit":false,"mustEndWithDigit":true,"mustntEndWithDigit":false,"mustStartWithNonAlpha":false,"mustStartWithAlpha":false,"mustntStartWithNonAlpha":false,"mustntStartWithAlpha":false,"mustEndWithNonAlpha":false,"mustEndWithAlpha":false,"mustntEndWithNonAlpha":false,"mustntEndWithAlpha":false,"wordsNotPermitted":[],"schemasNotPermitted":[],"prefixesNotPermitted":["notpermitted1","notpermitted2"],"suffixesNotPermitted":[],"allowNullPassword":false}'/>
   <Policy DTYPE="SyncPolicy" id="9" description="sync policy for java rule" type="SYNC" 
-          specification='{"conflictResolutionAction":"IGNORE","items":[]}'/>
+          specification='{"conflictResolutionAction":"IGNORE"}'/>
 
   <RelationshipType name="inclusion" description="Models the act that an object is included in another"/>
   <RelationshipType name="neighborhood"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
index fde025d..fa53bbd 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
@@ -45,9 +45,6 @@ import org.springframework.stereotype.Component;
 @Component
 public class PolicyDataBinderImpl implements PolicyDataBinder {
 
-    /**
-     * Logger.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(PolicyDataBinder.class);
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PlainAttrsSyncCorrelationRule.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PlainAttrsSyncCorrelationRule.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PlainAttrsSyncCorrelationRule.java
new file mode 100644
index 0000000..1af195e
--- /dev/null
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/PlainAttrsSyncCorrelationRule.java
@@ -0,0 +1,110 @@
+/*
+ * 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.sync;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.syncope.common.lib.types.MappingPurpose;
+import org.apache.syncope.core.misc.MappingUtils;
+import org.apache.syncope.core.persistence.api.dao.search.AnyCond;
+import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
+import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
+import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
+import org.apache.syncope.core.persistence.api.entity.resource.Provision;
+import org.apache.syncope.core.provisioning.api.sync.SyncCorrelationRule;
+import org.identityconnectors.framework.common.objects.Attribute;
+import org.identityconnectors.framework.common.objects.ConnectorObject;
+
+public class PlainAttrsSyncCorrelationRule implements SyncCorrelationRule {
+
+    private final List<String> plainSchemaNames;
+
+    private final Provision provision;
+
+    public PlainAttrsSyncCorrelationRule(final String[] plainSchemaNames, final Provision provision) {
+        this.plainSchemaNames = Arrays.asList(plainSchemaNames);
+        this.provision = provision;
+    }
+
+    @Override
+    public SearchCond getSearchCond(final ConnectorObject connObj) {
+        // search for external attribute's name/value of each specified name
+        Map<String, Attribute> extValues = new HashMap<>();
+
+        for (MappingItem item : MappingUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) {
+            extValues.put(item.getIntAttrName(), connObj.getAttributeByName(item.getExtAttrName()));
+        }
+
+        // search for user/group by attribute(s) specified in the policy
+        SearchCond searchCond = null;
+
+        for (String schema : plainSchemaNames) {
+            Attribute value = extValues.get(schema);
+
+            if (value == null) {
+                throw new IllegalArgumentException(
+                        "Connector object does not contains the attributes to perform the search: " + schema);
+            }
+
+            AttributeCond.Type type;
+            String expression = null;
+
+            if (value.getValue() == null || value.getValue().isEmpty()
+                    || (value.getValue().size() == 1 && value.getValue().get(0) == null)) {
+
+                type = AttributeCond.Type.ISNULL;
+            } else {
+                type = AttributeCond.Type.EQ;
+                expression = value.getValue().size() > 1
+                        ? value.getValue().toString()
+                        : value.getValue().get(0).toString();
+            }
+
+            SearchCond nodeCond;
+            // users: just id or username can be selected to be used
+            // groups: just id or name can be selected to be used
+            if ("key".equalsIgnoreCase(schema)
+                    || "username".equalsIgnoreCase(schema) || "name".equalsIgnoreCase(schema)) {
+
+                AnyCond cond = new AnyCond();
+                cond.setSchema(schema);
+                cond.setType(type);
+                cond.setExpression(expression);
+
+                nodeCond = SearchCond.getLeafCond(cond);
+            } else {
+                AttributeCond cond = new AttributeCond();
+                cond.setSchema(schema);
+                cond.setType(type);
+                cond.setExpression(expression);
+
+                nodeCond = SearchCond.getLeafCond(cond);
+            }
+
+            searchCond = searchCond == null
+                    ? nodeCond
+                    : SearchCond.getAndCond(searchCond, nodeCond);
+        }
+
+        return searchCond;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
index dc5cdf0..7fd244b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java
@@ -20,15 +20,14 @@ package org.apache.syncope.core.provisioning.java.sync;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.SyncPolicySpec;
 import org.apache.syncope.core.misc.MappingUtils;
+import org.apache.syncope.core.misc.serialization.POJOHelper;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
 import org.apache.syncope.core.persistence.api.dao.AnyDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -36,10 +35,7 @@ import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.dao.search.AnyCond;
-import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
-import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
@@ -230,11 +226,15 @@ public class SyncUtils {
         return result;
     }
 
-    private List<Long> search(final SearchCond searchCond, final AnyTypeKind type) {
-        final List<Long> result = new ArrayList<>();
+    private List<Long> findByCorrelationRule(
+            final ConnectorObject connObj, final SyncCorrelationRule rule, final AnyTypeKind type) {
+
+        List<Long> result = new ArrayList<>();
 
         List<Any<?, ?, ?>> anys = searchDAO.search(
-                SyncopeConstants.FULL_ADMIN_REALMS, searchCond, Collections.<OrderByClause>emptyList(), type);
+                SyncopeConstants.FULL_ADMIN_REALMS,
+                rule.getSearchCond(connObj),
+                Collections.<OrderByClause>emptyList(), type);
         for (Any<?, ?, ?> any : anys) {
             result.add(any.getKey());
         }
@@ -242,101 +242,24 @@ public class SyncUtils {
         return result;
     }
 
-    private List<Long> findByCorrelationRule(
-            final ConnectorObject connObj, final SyncCorrelationRule rule, final AnyTypeKind type) {
-
-        return search(rule.getSearchCond(connObj), type);
-    }
-
-    private List<Long> findByAnySearch(
-            final ConnectorObject connObj,
-            final List<String> altSearchSchemas,
-            final Provision provision,
-            final AnyTypeKind anyTypeKind) {
-
-        // search for external attribute's name/value of each specified name
-        Map<String, Attribute> extValues = new HashMap<>();
-
-        for (MappingItem item : MappingUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) {
-            extValues.put(item.getIntAttrName(), connObj.getAttributeByName(item.getExtAttrName()));
-        }
-
-        // search for user/group by attribute(s) specified in the policy
-        SearchCond searchCond = null;
-
-        for (String schema : altSearchSchemas) {
-            Attribute value = extValues.get(schema);
-
-            if (value == null) {
-                throw new IllegalArgumentException(
-                        "Connector object does not contains the attributes to perform the search: " + schema);
-            }
-
-            AttributeCond.Type type;
-            String expression = null;
-
-            if (value.getValue() == null || value.getValue().isEmpty()
-                    || (value.getValue().size() == 1 && value.getValue().get(0) == null)) {
-
-                type = AttributeCond.Type.ISNULL;
-            } else {
-                type = AttributeCond.Type.EQ;
-                expression = value.getValue().size() > 1
-                        ? value.getValue().toString()
-                        : value.getValue().get(0).toString();
-            }
-
-            SearchCond nodeCond;
-            // users: just id or username can be selected to be used
-            // groups: just id or name can be selected to be used
-            if ("key".equalsIgnoreCase(schema)
-                    || "username".equalsIgnoreCase(schema) || "name".equalsIgnoreCase(schema)) {
-
-                AnyCond cond = new AnyCond();
-                cond.setSchema(schema);
-                cond.setType(type);
-                cond.setExpression(expression);
-
-                nodeCond = SearchCond.getLeafCond(cond);
-            } else {
-                AttributeCond cond = new AttributeCond();
-                cond.setSchema(schema);
-                cond.setType(type);
-                cond.setExpression(expression);
-
-                nodeCond = SearchCond.getLeafCond(cond);
-            }
-
-            searchCond = searchCond == null
-                    ? nodeCond
-                    : SearchCond.getAndCond(searchCond, nodeCond);
-        }
-
-        return search(searchCond, anyTypeKind);
-    }
-
     private SyncCorrelationRule getCorrelationRule(final Provision provision, final SyncPolicySpec policySpec) {
-        String clazz = policySpec.getItem(provision.getAnyType().getKey()) == null
-                ? null
-                : policySpec.getItem(provision.getAnyType().getKey()).getJavaRule();
-
-        SyncCorrelationRule res = null;
+        SyncCorrelationRule result = null;
 
-        if (StringUtils.isNotBlank(clazz)) {
-            try {
-                res = (SyncCorrelationRule) Class.forName(clazz).newInstance();
-            } catch (Exception e) {
-                LOG.error("Failure instantiating correlation rule class '{}'", clazz, e);
+        String syncCorrelationRule = policySpec.getCorrelationRules().get(provision.getAnyType().getKey());
+        if (StringUtils.isNotBlank(syncCorrelationRule)) {
+            if (syncCorrelationRule.charAt(0) == '[') {
+                result = new PlainAttrsSyncCorrelationRule(
+                        POJOHelper.deserialize(syncCorrelationRule, String[].class), provision);
+            } else {
+                try {
+                    result = (SyncCorrelationRule) Class.forName(syncCorrelationRule).newInstance();
+                } catch (Exception e) {
+                    LOG.error("Failure instantiating correlation rule class '{}'", syncCorrelationRule, e);
+                }
             }
         }
 
-        return res;
-    }
-
-    private List<String> getAltSearchSchemas(final Provision provision, final SyncPolicySpec policySpec) {
-        return policySpec.getItem(provision.getAnyType().getKey()) == null
-                ? Collections.<String>emptyList()
-                : policySpec.getItem(provision.getAnyType().getKey()).getAltSearchSchemas();
+        return result;
     }
 
     /**
@@ -360,17 +283,12 @@ public class SyncUtils {
         }
 
         SyncCorrelationRule syncRule = null;
-        List<String> altSearchSchemas = null;
-
         if (syncPolicySpec != null) {
             syncRule = getCorrelationRule(provision, syncPolicySpec);
-            altSearchSchemas = getAltSearchSchemas(provision, syncPolicySpec);
         }
 
         return syncRule == null
-                ? altSearchSchemas == null || altSearchSchemas.isEmpty()
-                        ? findByConnObjectKeyItem(uid, provision, anyUtils)
-                        : findByAnySearch(connObj, altSearchSchemas, provision, anyUtils.getAnyTypeKind())
+                ? findByConnObjectKeyItem(uid, provision, anyUtils)
                 : findByCorrelationRule(connObj, syncRule, anyUtils.getAnyTypeKind());
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PolicyITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PolicyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PolicyITCase.java
index 0098821..95701ae 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PolicyITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PolicyITCase.java
@@ -36,7 +36,6 @@ import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.PasswordPolicySpec;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.syncope.common.lib.types.SyncPolicySpec;
-import org.apache.syncope.common.lib.types.SyncPolicySpecItem;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.runners.MethodSorters;
@@ -47,12 +46,8 @@ public class PolicyITCase extends AbstractITCase {
     private SyncPolicyTO buildSyncPolicyTO() {
         SyncPolicyTO policy = new SyncPolicyTO();
 
-        SyncPolicySpecItem item = new SyncPolicySpecItem();
-        item.setAnyTypeKey(AnyTypeKind.USER.name());
-        item.setJavaRule(TestSyncRule.class.getName());
-
         SyncPolicySpec spec = new SyncPolicySpec();
-        spec.getItems().add(item);
+        spec.getCorrelationRules().put(AnyTypeKind.USER.name(), TestSyncRule.class.getName());
 
         policy.setSpecification(spec);
         policy.setDescription("Sync policy");
@@ -116,7 +111,7 @@ public class PolicyITCase extends AbstractITCase {
         assertNotNull(policyTO);
         assertEquals(PolicyType.SYNC, policyTO.getType());
         assertEquals(TestSyncRule.class.getName(),
-                policyTO.getSpecification().getItem(AnyTypeKind.USER.name()).getJavaRule());
+                policyTO.getSpecification().getCorrelationRules().get(AnyTypeKind.USER.name()));
     }
 
     @Test
@@ -169,7 +164,7 @@ public class PolicyITCase extends AbstractITCase {
 
     @Test
     public void getCorrelationRules() {
-        assertEquals(1, syncopeService.info().getSyncCorrelationRules().size());
+        assertEquals(2, syncopeService.info().getSyncCorrelationRules().size());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/8fe3c7c2/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
index 4313c00..d97eaed 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
@@ -55,7 +55,6 @@ import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
 import org.apache.syncope.common.lib.types.ResourceDeassociationActionType;
-import org.apache.syncope.common.lib.types.SyncPolicySpecItem;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.common.lib.wrap.ResourceKey;
 import org.apache.syncope.common.rest.api.CollectionWrapper;
@@ -505,16 +504,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         // Add a custom correlation rule
         // -----------------------------
         SyncPolicyTO policyTO = policyService.read(9L);
-
-        SyncPolicySpecItem item = policyTO.getSpecification().getItem(AnyTypeKind.USER.name());
-        if (item == null) {
-            item = new SyncPolicySpecItem();
-            item.setAnyTypeKey(AnyTypeKind.USER.name());
-
-            policyTO.getSpecification().getItems().add(item);
-        }
-        item.setJavaRule(TestSyncRule.class.getName());
-
+        policyTO.getSpecification().getCorrelationRules().put(AnyTypeKind.USER.name(), TestSyncRule.class.getName());
         policyService.update(policyTO);
         // -----------------------------
 


[6/6] syncope git commit: Merge branch 'master' into SYNCOPE-156

Posted by md...@apache.org.
Merge branch 'master' into SYNCOPE-156


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

Branch: refs/heads/SYNCOPE-156
Commit: 5336431db1bfdcd1f51847f2ee65a536f9e21275
Parents: f0883ca 8fe3c7c
Author: Marco Di Sabatino Di Diodoro <md...@apache.org>
Authored: Tue Aug 18 17:44:55 2015 +0200
Committer: Marco Di Sabatino Di Diodoro <md...@apache.org>
Committed: Tue Aug 18 17:44:55 2015 +0200

----------------------------------------------------------------------
 .travis.yml                                     |   5 +-
 .../cli/commands/ConfigurationCommand.java      |   8 +-
 .../console/panels/BeanReflectionModal.java     |  36 -
 .../console/panels/BeanReflectionPanel.java     | 339 ----------
 .../console/rest/ConfigurationRestClient.java   |  10 +-
 .../common/lib/annotation/ClassList.java        |  26 -
 .../common/lib/annotation/SchemaList.java       |  28 -
 .../syncope/common/lib/mod/StatusMod.java       |   2 +-
 .../apache/syncope/common/lib/to/AttrTO.java    |   2 +
 .../apache/syncope/common/lib/to/LoggerTO.java  |   2 +-
 .../common/lib/types/AbstractPolicySpec.java    |   2 -
 .../common/lib/types/SyncPolicySpec.java        |  42 +-
 .../common/lib/types/SyncPolicySpecItem.java    |  67 --
 .../rest/api/service/ConfigurationService.java  |  25 +-
 core/logic/pom.xml                              |  86 +--
 .../syncope/core/logic/ConfigurationLogic.java  |  16 +-
 .../apache/syncope/core/logic/SyncopeLogic.java |  26 +-
 .../apache/syncope/core/logic/TaskLogic.java    |   4 +-
 .../init/ImplementationClassNamesLoader.java    |   7 +-
 .../core/logic/init/JobInstanceLoaderImpl.java  |  85 +--
 .../logic/notification/NotificationJob.java     |  21 +-
 .../notification/NotificationJobDelegate.java   |   5 +-
 .../syncope/core/logic/report/ReportJob.java    |  22 +-
 .../apache/syncope/core/logic/AbstractTest.java |  40 --
 .../syncope/core/logic/NotificationTest.java    | 659 -------------------
 core/logic/src/test/resources/logicTest.xml     |  59 --
 .../core/misc/security/AuthContextUtils.java    |   8 +-
 .../misc/spring/ApplicationContextProvider.java |  11 +
 .../spring/DomainTransactionInterceptor.java    |  70 ++
 .../spring/DomainTransactionInterceptor.java    |  70 --
 .../jpa/spring/SpringComponentReplacer.java     |  42 --
 .../core/persistence/jpa/AbstractTest.java      |   2 -
 .../persistence/jpa/inner/AnyObjectTest.java    |   2 +-
 .../persistence/jpa/inner/AnySearchTest.java    |   2 +-
 .../persistence/jpa/inner/AnyTypeClassTest.java |   2 +-
 .../core/persistence/jpa/inner/AnyTypeTest.java |   2 +-
 .../core/persistence/jpa/inner/ConfTest.java    |   2 +-
 .../persistence/jpa/inner/ConnInstanceTest.java |   2 +-
 .../core/persistence/jpa/inner/DerAttrTest.java |   2 +-
 .../persistence/jpa/inner/DerSchemaTest.java    |   2 +-
 .../core/persistence/jpa/inner/DomainTest.java  |   2 +-
 .../core/persistence/jpa/inner/GroupTest.java   |   2 +-
 .../persistence/jpa/inner/MultitenancyTest.java |   6 +-
 .../persistence/jpa/inner/NotificationTest.java |   2 +-
 .../persistence/jpa/inner/PlainAttrTest.java    |   2 +-
 .../persistence/jpa/inner/PlainSchemaTest.java  |   2 +-
 .../core/persistence/jpa/inner/PolicyTest.java  |  41 +-
 .../core/persistence/jpa/inner/RealmTest.java   |   2 +-
 .../jpa/inner/RelationshipTypeTest.java         |   2 +-
 .../core/persistence/jpa/inner/ReportTest.java  |   2 +-
 .../persistence/jpa/inner/ResourceTest.java     |   2 +-
 .../core/persistence/jpa/inner/RoleTest.java    |   2 +-
 .../jpa/inner/SecurityQuestionTest.java         |   2 +-
 .../persistence/jpa/inner/TaskExecTest.java     |   2 +-
 .../core/persistence/jpa/inner/TaskTest.java    |   2 +-
 .../core/persistence/jpa/inner/UserTest.java    |   2 +-
 .../core/persistence/jpa/inner/VirAttrTest.java |   2 +-
 .../persistence/jpa/inner/VirSchemaTest.java    |   2 +-
 .../persistence/jpa/outer/AnySearchTest.java    |   2 +-
 .../persistence/jpa/outer/AnyTypeClassTest.java |   2 +-
 .../core/persistence/jpa/outer/AnyTypeTest.java |   2 +-
 .../persistence/jpa/outer/ConnInstanceTest.java |   2 +-
 .../persistence/jpa/outer/DerSchemaTest.java    |   2 +-
 .../core/persistence/jpa/outer/GroupTest.java   |   3 +-
 .../persistence/jpa/outer/PlainAttrTest.java    |   2 +-
 .../persistence/jpa/outer/PlainSchemaTest.java  |   2 +-
 .../core/persistence/jpa/outer/RealmTest.java   |   2 +-
 .../core/persistence/jpa/outer/ReportTest.java  |   2 +-
 .../persistence/jpa/outer/ResourceTest.java     |   3 +-
 .../core/persistence/jpa/outer/RoleTest.java    |   2 +-
 .../jpa/outer/SecurityQuestionTest.java         |   2 +-
 .../core/persistence/jpa/outer/TaskTest.java    |   2 +-
 .../core/persistence/jpa/outer/UserTest.java    |   2 +-
 .../test/resources/domains/MasterContent.xml    |  12 +-
 .../src/test/resources/domains/TwoContent.xml   |  14 -
 .../provisioning/java/ConnectorManager.java     |  21 +-
 .../java/data/PolicyDataBinderImpl.java         |   3 -
 .../core/provisioning/java/job/TaskJob.java     |  32 +-
 .../notification/NotificationManagerImpl.java   |  10 +-
 .../sync/PlainAttrsSyncCorrelationRule.java     | 110 ++++
 .../core/provisioning/java/sync/SyncUtils.java  | 126 +---
 .../core/provisioning/java/AbstractTest.java    |   2 -
 .../provisioning/java/ConnectorManagerTest.java |   2 +-
 .../core/provisioning/java/MappingTest.java     |   2 +-
 .../java/ResourceDataBinderTest.java            |   2 +-
 .../cxf/service/ConfigurationServiceImpl.java   |  11 +-
 fit/core-reference/pom.xml                      |   5 +
 .../src/main/resources/mail.properties          |  25 +
 .../fit/core/reference/AbstractTaskITCase.java  |  37 +-
 .../fit/core/reference/ConfigurationITCase.java |  20 +-
 .../fit/core/reference/MultitenancyITCase.java  |   2 +-
 .../core/reference/NotificationTaskITCase.java  | 317 ++++++++-
 .../fit/core/reference/PolicyITCase.java        |  11 +-
 .../fit/core/reference/SyncTaskITCase.java      |  12 +-
 .../syncope/fit/core/reference/UserITCase.java  |  27 +-
 .../fit/core/reference/UserSelfITCase.java      |   9 +-
 pom.xml                                         |   2 +-
 97 files changed, 856 insertions(+), 1912 deletions(-)
----------------------------------------------------------------------