You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/06/11 16:17:55 UTC

[65/70] syncope git commit: [SYNCOPE-666] All done now

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/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
new file mode 100644
index 0000000..d092f3d
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
@@ -0,0 +1,306 @@
+/*
+ * 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.outer;
+
+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.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;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
+import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
+import org.apache.syncope.core.persistence.api.dao.TaskDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.ConnInstance;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.PasswordPolicy;
+import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
+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.persistence.api.entity.task.PropagationTask;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMappingItem;
+import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class ResourceTest extends AbstractTest {
+
+    @Autowired
+    private EntityManager entityManager;
+
+    @Autowired
+    private ExternalResourceDAO resourceDAO;
+
+    @Autowired
+    private ConnInstanceDAO connInstanceDAO;
+
+    @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Autowired
+    private TaskDAO taskDAO;
+
+    @Autowired
+    private PolicyDAO policyDAO;
+
+    @Test
+    public void createWithPasswordPolicy() {
+        final String resourceName = "resourceWithPasswordPolicy";
+
+        PasswordPolicy policy = (PasswordPolicy) policyDAO.find(4L);
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
+        resource.setKey(resourceName);
+        resource.setPasswordPolicy(policy);
+
+        ConnInstance connector = connInstanceDAO.find(100L);
+        assertNotNull("connector not found", connector);
+        resource.setConnector(connector);
+
+        ExternalResource actual = resourceDAO.save(resource);
+        assertNotNull(actual);
+
+        actual = resourceDAO.find(actual.getKey());
+        assertNotNull(actual);
+        assertNotNull(actual.getPasswordPolicy());
+
+        resourceDAO.delete(resourceName);
+        assertNull(resourceDAO.find(resourceName));
+
+        assertNotNull(policyDAO.find(4L));
+    }
+
+    @Test
+    public void save() {
+        ExternalResource resource = entityFactory.newEntity(ExternalResource.class);
+        resource.setKey("ws-target-resource-save");
+
+        // specify the connector
+        ConnInstance connector = connInstanceDAO.find(100L);
+        assertNotNull("connector not found", connector);
+
+        resource.setConnector(connector);
+
+        Provision provision = entityFactory.newEntity(Provision.class);
+        provision.setAnyType(anyTypeDAO.findUser());
+        provision.setObjectClass(ObjectClass.ACCOUNT);
+        provision.setResource(resource);
+        resource.add(provision);
+
+        Mapping mapping = entityFactory.newEntity(Mapping.class);
+        mapping.setProvision(provision);
+        provision.setMapping(mapping);
+
+        // specify mappings
+        for (int i = 0; i < 3; i++) {
+            MappingItem item = entityFactory.newEntity(MappingItem.class);
+            item.setExtAttrName("test" + i);
+            item.setIntAttrName("nonexistent" + i);
+            item.setIntMappingType(IntMappingType.UserPlainSchema);
+            item.setMandatoryCondition("false");
+            item.setPurpose(MappingPurpose.SYNCHRONIZATION);
+            mapping.add(item);
+            item.setMapping(mapping);
+        }
+        MappingItem connObjectKey = entityFactory.newEntity(MappingItem.class);
+        connObjectKey.setExtAttrName("username");
+        connObjectKey.setIntAttrName("username");
+        connObjectKey.setIntMappingType(IntMappingType.UserKey);
+        connObjectKey.setPurpose(MappingPurpose.PROPAGATION);
+        mapping.setConnObjectKeyItem(connObjectKey);
+        connObjectKey.setMapping(mapping);
+
+        // map a derived attribute
+        MappingItem derived = entityFactory.newEntity(MappingItem.class);
+        derived.setConnObjectKey(false);
+        derived.setExtAttrName("fullname");
+        derived.setIntAttrName("cn");
+        derived.setIntMappingType(IntMappingType.UserDerivedSchema);
+        derived.setPurpose(MappingPurpose.PROPAGATION);
+        mapping.add(derived);
+        derived.setMapping(mapping);
+
+        // save the resource
+        ExternalResource actual = resourceDAO.save(resource);
+        assertNotNull(actual);
+        assertNotNull(actual.getProvision(anyTypeDAO.findUser()).getMapping());
+
+        resourceDAO.flush();
+        resourceDAO.detach(actual);
+        connInstanceDAO.detach(connector);
+
+        // assign the new resource to an user
+        User user = userDAO.find(1L);
+        assertNotNull("user not found", user);
+
+        user.add(actual);
+
+        resourceDAO.flush();
+
+        // retrieve resource
+        resource = resourceDAO.find(actual.getKey());
+        assertNotNull(resource);
+        resourceDAO.refresh(resource);
+
+        // check connector
+        connector = connInstanceDAO.find(100L);
+        assertNotNull(connector);
+        assertNotNull(connector.getResources());
+
+        assertNotNull(resource.getConnector());
+        assertTrue(resource.getConnector().equals(connector));
+
+        // check mappings
+        List<? extends MappingItem> items = resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems();
+        assertNotNull(items);
+        assertEquals(5, items.size());
+
+        // check user
+        user = userDAO.find(1L);
+        assertNotNull(user);
+        assertNotNull(user.getResources());
+        assertTrue(user.getResources().contains(actual));
+    }
+
+    @Test
+    public void delete() {
+        ExternalResource resource = resourceDAO.find("resource-testdb");
+        assertNotNull("find to delete did not work", resource);
+
+        // -------------------------------------
+        // Get originally associated connector
+        // -------------------------------------
+        ConnInstance connector = resource.getConnector();
+        assertNotNull(connector);
+        // -------------------------------------
+
+        // -------------------------------------
+        // Get originally associated users
+        // -------------------------------------
+        List<User> users = userDAO.findByResource(resource);
+        assertNotNull(users);
+
+        Set<Long> userIds = new HashSet<>();
+        for (User user : users) {
+            userIds.add(user.getKey());
+        }
+        // -------------------------------------
+
+        // Get tasks
+        List<PropagationTask> propagationTasks = taskDAO.findAll(resource, TaskType.PROPAGATION);
+        assertFalse(propagationTasks.isEmpty());
+
+        // delete resource
+        resourceDAO.delete(resource.getKey());
+
+        // close the transaction
+        resourceDAO.flush();
+
+        // resource must be removed
+        ExternalResource actual = resourceDAO.find("resource-testdb");
+        assertNull("delete did not work", actual);
+
+        // resource must be not referenced any more from users
+        for (Long id : userIds) {
+            User actualUser = userDAO.find(id);
+            assertNotNull(actualUser);
+            for (ExternalResource res : userDAO.findAllResources(actualUser)) {
+                assertFalse(res.getKey().equalsIgnoreCase(resource.getKey()));
+            }
+        }
+
+        // resource must be not referenced any more from the connector
+        ConnInstance actualConnector = connInstanceDAO.find(connector.getKey());
+        assertNotNull(actualConnector);
+        for (ExternalResource res : actualConnector.getResources()) {
+            assertFalse(res.getKey().equalsIgnoreCase(resource.getKey()));
+        }
+
+        // there must be no tasks
+        for (PropagationTask task : propagationTasks) {
+            assertNull(taskDAO.find(task.getKey()));
+        }
+    }
+
+    @Test
+    public void emptyMapping() {
+        ExternalResource ldap = resourceDAO.find("resource-ldap");
+        assertNotNull(ldap);
+        assertNotNull(ldap.getProvision(anyTypeDAO.findUser()).getMapping());
+        assertNotNull(ldap.getProvision(anyTypeDAO.findGroup()).getMapping());
+
+        List<? extends MappingItem> items = ldap.getProvision(anyTypeDAO.findGroup()).getMapping().getItems();
+        assertNotNull(items);
+        assertFalse(items.isEmpty());
+        List<Long> itemKeys = new ArrayList<>(items.size());
+        for (MappingItem item : items) {
+            itemKeys.add(item.getKey());
+        }
+
+        ldap.remove(ldap.getProvision(anyTypeDAO.findGroup()));
+
+        // need to avoid any class not defined in this Maven module
+        ldap.getPropagationActionsClassNames().clear();
+
+        resourceDAO.save(ldap);
+        resourceDAO.flush();
+
+        for (Long itemId : itemKeys) {
+            assertNull(entityManager.find(JPAMappingItem.class, itemId));
+        }
+    }
+
+    @Test
+    public void issue243() {
+        ExternalResource csv = resourceDAO.find("resource-csv");
+        assertNotNull(csv);
+
+        int origMapItems = csv.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size();
+
+        MappingItem newMapItem = entityFactory.newEntity(MappingItem.class);
+        newMapItem.setIntMappingType(IntMappingType.Username);
+        newMapItem.setExtAttrName("TEST");
+        newMapItem.setPurpose(MappingPurpose.PROPAGATION);
+        csv.getProvision(anyTypeDAO.findUser()).getMapping().add(newMapItem);
+
+        resourceDAO.save(csv);
+        resourceDAO.flush();
+
+        csv = resourceDAO.find("resource-csv");
+        assertNotNull(csv);
+        assertEquals(origMapItems + 1, csv.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/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
new file mode 100644
index 0000000..11b572c
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
@@ -0,0 +1,167 @@
+/*
+ * 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.outer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.Entitlement;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.RealmDAO;
+import org.apache.syncope.core.persistence.api.dao.RoleDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
+import org.apache.syncope.core.persistence.api.entity.Role;
+import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class RoleTest extends AbstractTest {
+
+    @Autowired
+    private EntityManager entityManager;
+
+    @Autowired
+    private RoleDAO roleDAO;
+
+    @Autowired
+    private RealmDAO realmDAO;
+
+    @Autowired
+    private PlainSchemaDAO plainSchemaDAO;
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Autowired
+    private AnyTypeClassDAO anyTypeClassDAO;
+
+    /**
+     * Static copy of {@link org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO} method with same signature:
+     * required for avoiding creating new transaction - good for general use case but bad for the way how
+     * this test class is architected.
+     */
+    private Collection<Role> findDynRoleMemberships(final User user) {
+        TypedQuery<Role> query = entityManager.createQuery(
+                "SELECT e.role FROM " + JPADynRoleMembership.class.getSimpleName()
+                + " e WHERE :user MEMBER OF e.users", Role.class);
+        query.setParameter("user", user);
+
+        return query.getResultList();
+    }
+
+    @Test
+    public void dynMembership() {
+        // 0. create user matching the condition below
+        User user = entityFactory.newEntity(User.class);
+        user.setUsername("username");
+        user.setRealm(realmDAO.find("/even/two"));
+        user.add(anyTypeClassDAO.find("other"));
+
+        UPlainAttr attr = entityFactory.newEntity(UPlainAttr.class);
+        attr.setOwner(user);
+        attr.setSchema(plainSchemaDAO.find("cool"));
+        attr.add("true", anyUtilsFactory.getInstance(AnyTypeKind.USER));
+        user.add(attr);
+
+        user = userDAO.save(user);
+        Long newUserKey = user.getKey();
+        assertNotNull(newUserKey);
+
+        // 1. create role with dynamic membership
+        Role role = entityFactory.newEntity(Role.class);
+        role.setName("new");
+        role.addRealm(realmDAO.getRoot());
+        role.addRealm(realmDAO.find("/even/two"));
+        role.getEntitlements().add(Entitlement.LOG_LIST);
+        role.getEntitlements().add(Entitlement.LOG_SET_LEVEL);
+
+        DynRoleMembership dynMembership = entityFactory.newEntity(DynRoleMembership.class);
+        dynMembership.setFIQLCond("cool==true");
+        dynMembership.setRole(role);
+
+        role.setDynMembership(dynMembership);
+
+        Role actual = roleDAO.save(role);
+        assertNotNull(actual);
+
+        roleDAO.flush();
+
+        // 2. verify that dynamic membership is there
+        actual = roleDAO.find(actual.getKey());
+        assertNotNull(actual);
+        assertNotNull(actual.getDynMembership());
+        assertNotNull(actual.getDynMembership().getKey());
+        assertEquals(actual, actual.getDynMembership().getRole());
+
+        // 3. verify that expected users have the created role dynamically assigned
+        assertEquals(2, actual.getDynMembership().getMembers().size());
+        assertEquals(new HashSet<>(Arrays.asList(4L, newUserKey)),
+                CollectionUtils.collect(actual.getDynMembership().getMembers(), new Transformer<User, Long>() {
+
+                    @Override
+                    public Long transform(final User input) {
+                        return input.getKey();
+                    }
+                }, new HashSet<Long>()));
+
+        user = userDAO.find(4L);
+        assertNotNull(user);
+        Collection<Role> dynRoleMemberships = findDynRoleMemberships(user);
+        assertEquals(1, dynRoleMemberships.size());
+        assertTrue(dynRoleMemberships.contains(actual.getDynMembership().getRole()));
+
+        // 4. delete the new user and verify that dynamic membership was updated
+        userDAO.delete(newUserKey);
+
+        userDAO.flush();
+
+        actual = roleDAO.find(actual.getKey());
+        assertEquals(1, actual.getDynMembership().getMembers().size());
+        assertEquals(4L, actual.getDynMembership().getMembers().get(0).getKey(), 0);
+
+        // 5. delete role and verify that dynamic membership was also removed
+        Long dynMembershipKey = actual.getDynMembership().getKey();
+
+        roleDAO.delete(actual);
+
+        roleDAO.flush();
+
+        assertNull(entityManager.find(JPADynRoleMembership.class, dynMembershipKey));
+
+        dynRoleMemberships = findDynRoleMemberships(user);
+        assertTrue(dynRoleMemberships.isEmpty());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/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
new file mode 100644
index 0000000..0a966da
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/SecurityQuestionTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.outer;
+
+import static org.junit.Assert.assertNull;
+
+import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class SecurityQuestionTest extends AbstractTest {
+
+    @Autowired
+    private SecurityQuestionDAO securityQuestionDAO;
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Test
+    public void test() {
+        User user = userDAO.find(4L);
+        assertNull(user.getSecurityQuestion());
+        assertNull(user.getSecurityAnswer());
+
+        user.setSecurityQuestion(securityQuestionDAO.find(1L));
+        user.setSecurityAnswer("Rossi");
+        userDAO.save(user);
+
+        userDAO.flush();
+
+        securityQuestionDAO.delete(1L);
+
+        userDAO.flush();
+
+        user = userDAO.find(4L);
+
+        assertNull(user.getSecurityQuestion());
+        assertNull(user.getSecurityAnswer());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/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
new file mode 100644
index 0000000..f281fb4
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/TaskTest.java
@@ -0,0 +1,295 @@
+/*
+ * 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.outer;
+
+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.Date;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.MatchingRule;
+import org.apache.syncope.common.lib.types.PropagationMode;
+import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
+import org.apache.syncope.common.lib.types.ResourceOperation;
+import org.apache.syncope.common.lib.types.TaskType;
+import org.apache.syncope.common.lib.types.UnmatchingRule;
+import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
+import org.apache.syncope.core.persistence.api.dao.TaskDAO;
+import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
+import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
+import org.apache.syncope.core.persistence.api.entity.task.PushTask;
+import org.apache.syncope.core.persistence.api.entity.task.SyncTask;
+import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
+import org.apache.syncope.core.persistence.api.entity.task.AnyTemplate;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.apache.syncope.core.provisioning.api.sync.SyncActions;
+import org.identityconnectors.framework.common.objects.Attribute;
+import org.identityconnectors.framework.common.objects.AttributeBuilder;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class TaskTest extends AbstractTest {
+
+    @Autowired
+    private TaskDAO taskDAO;
+
+    @Autowired
+    private TaskExecDAO taskExecDAO;
+
+    @Autowired
+    private ExternalResourceDAO resourceDAO;
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Test
+    public void read() {
+        PropagationTask task = taskDAO.find(1L);
+        assertNotNull(task);
+
+        assertNotNull(task.getExecs());
+        assertFalse(task.getExecs().isEmpty());
+        assertEquals(1, task.getExecs().size());
+    }
+
+    @Test
+    public void save() {
+        ExternalResource resource = resourceDAO.find("ws-target-resource-1");
+        assertNotNull(resource);
+
+        User user = userDAO.find(2L);
+        assertNotNull(user);
+
+        PropagationTask task = entityFactory.newEntity(PropagationTask.class);
+        task.setResource(resource);
+        task.setAnyTypeKind(AnyTypeKind.USER);
+        task.setPropagationMode(PropagationMode.TWO_PHASES);
+        task.setPropagationOperation(ResourceOperation.CREATE);
+        task.setConnObjectKey("one@two.com");
+
+        Set<Attribute> attributes = new HashSet<>();
+        attributes.add(AttributeBuilder.build("testAttribute", "testValue1", "testValue2"));
+        attributes.add(AttributeBuilder.buildPassword("password".toCharArray()));
+        task.setAttributes(attributes);
+
+        task = taskDAO.save(task);
+        assertNotNull(task);
+
+        PropagationTask actual = taskDAO.find(task.getKey());
+        assertEquals(task, actual);
+
+        taskDAO.flush();
+
+        resource = resourceDAO.find("ws-target-resource-1");
+        assertTrue(taskDAO.findAll(resource, TaskType.PROPAGATION).contains(task));
+    }
+
+    @Test
+    public void addPropagationTaskExecution() {
+        PropagationTask task = taskDAO.find(1L);
+        assertNotNull(task);
+
+        int executionNumber = task.getExecs().size();
+
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
+        execution.setTask(task);
+        execution.setStatus(PropagationTaskExecStatus.CREATED.name());
+        task.addExec(execution);
+        execution.setStartDate(new Date());
+
+        taskDAO.save(task);
+        taskDAO.flush();
+
+        task = taskDAO.find(1L);
+        assertNotNull(task);
+
+        assertEquals(executionNumber + 1, task.getExecs().size());
+    }
+
+    @Test
+    public void addSyncTaskExecution() {
+        SyncTask task = taskDAO.find(4L);
+        assertNotNull(task);
+
+        int executionNumber = task.getExecs().size();
+
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
+        execution.setStatus("Text-free status");
+        execution.setTask(task);
+        task.addExec(execution);
+        execution.setMessage("A message");
+
+        taskDAO.save(task);
+        taskDAO.flush();
+
+        task = taskDAO.find(4L);
+        assertNotNull(task);
+
+        assertEquals(executionNumber + 1, task.getExecs().size());
+    }
+
+    @Test
+    public void addPushTaskExecution() {
+        PushTask task = taskDAO.find(13L);
+        assertNotNull(task);
+
+        int executionNumber = task.getExecs().size();
+
+        TaskExec execution = entityFactory.newEntity(TaskExec.class);
+        execution.setStatus("Text-free status");
+        execution.setTask(task);
+        task.addExec(execution);
+        execution.setMessage("A message");
+
+        taskDAO.save(task);
+        taskDAO.flush();
+
+        task = taskDAO.find(13L);
+        assertNotNull(task);
+
+        assertEquals(executionNumber + 1, task.getExecs().size());
+    }
+
+    @Test
+    public void deleteTask() {
+        taskDAO.delete(1L);
+
+        taskDAO.flush();
+
+        assertNull(taskDAO.find(1L));
+        assertNull(taskExecDAO.find(1L));
+    }
+
+    @Test
+    public void deleteTaskExecution() {
+        TaskExec execution = taskExecDAO.find(1L);
+        int executionNumber = execution.getTask().getExecs().size();
+
+        taskExecDAO.delete(1L);
+
+        taskExecDAO.flush();
+
+        assertNull(taskExecDAO.find(1L));
+
+        PropagationTask task = taskDAO.find(1L);
+        assertEquals(task.getExecs().size(), executionNumber - 1);
+    }
+
+    @Test
+    public void saveSyncTask() {
+        ExternalResource resource = resourceDAO.find("ws-target-resource-1");
+        assertNotNull(resource);
+
+        AnyTemplate template = entityFactory.newEntity(AnyTemplate.class);
+        template.set(new UserTO());
+
+        SyncTask task = entityFactory.newEntity(SyncTask.class);
+        task.setName("saveSyncTask");
+        task.setDescription("SyncTask description");
+        task.add(template);
+        task.setCronExpression("BLA BLA");
+        task.setMatchingRule(MatchingRule.UPDATE);
+        task.setUnmatchingRule(UnmatchingRule.PROVISION);
+
+        // this save() fails because of an invalid Cron Expression
+        InvalidEntityException exception = null;
+        try {
+            taskDAO.save(task);
+        } catch (InvalidEntityException e) {
+            exception = e;
+        }
+        assertNotNull(exception);
+
+        task.setCronExpression(null);
+        // this save() fails because a SyncTask requires a target resource
+        exception = null;
+        try {
+            taskDAO.save(task);
+        } catch (InvalidEntityException e) {
+            exception = e;
+        }
+        assertNotNull(exception);
+
+        task.setResource(resource);
+        task.getActionsClassNames().add(getClass().getName());
+
+        // this save() fails because jobActionsClassName does not implement 
+        // the right interface
+        exception = null;
+        try {
+            taskDAO.save(task);
+        } catch (InvalidEntityException e) {
+            exception = e;
+        }
+        assertNotNull(exception);
+
+        task.getActionsClassNames().clear();
+        task.getActionsClassNames().add(SyncActions.class.getName());
+        // this save() finally works
+        task = taskDAO.save(task);
+        assertNotNull(task);
+
+        SyncTask actual = taskDAO.find(task.getKey());
+        assertEquals(task, actual);
+    }
+
+    @Test
+    public void issueSYNCOPE144() {
+        ExternalResource resource = resourceDAO.find("ws-target-resource-1");
+        assertNotNull(resource);
+
+        SyncTask task = entityFactory.newEntity(SyncTask.class);
+
+        task.setResource(resource);
+        task.setName("issueSYNCOPE144");
+        task.setDescription("issueSYNCOPE144 Description");
+        task.getActionsClassNames().add(SyncActions.class.getName());
+        task.setMatchingRule(MatchingRule.UPDATE);
+        task.setUnmatchingRule(UnmatchingRule.PROVISION);
+
+        task = taskDAO.save(task);
+        assertNotNull(task);
+
+        SyncTask actual = taskDAO.find(task.getKey());
+        assertEquals(task, actual);
+        assertEquals("issueSYNCOPE144", actual.getName());
+        assertEquals("issueSYNCOPE144 Description", actual.getDescription());
+
+        actual.setName("issueSYNCOPE144_2");
+        actual.setDescription("issueSYNCOPE144 Description_2");
+
+        actual = taskDAO.save(actual);
+        assertNotNull(actual);
+        assertEquals("issueSYNCOPE144_2", actual.getName());
+        assertEquals("issueSYNCOPE144 Description_2", actual.getDescription());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/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
new file mode 100644
index 0000000..b921cdc
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.outer;
+
+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.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
+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.RelationshipTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.UMembership;
+import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
+import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
+import org.apache.syncope.core.persistence.api.entity.user.URelationship;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class UserTest extends AbstractTest {
+
+    @Autowired
+    private RelationshipTypeDAO relationshipTypeDAO;
+
+    @Autowired
+    private AnyObjectDAO anyObjectDAO;
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Autowired
+    private GroupDAO groupDAO;
+
+    @Autowired
+    private PlainSchemaDAO plainSchemaDAO;
+
+    @Autowired
+    private PlainAttrDAO plainAttrDAO;
+
+    @Autowired
+    private PlainAttrValueDAO plainAttrValueDAO;
+
+    @Test
+    public void delete() {
+        List<UMembership> memberships = groupDAO.findUMemberships(groupDAO.find(7L));
+        assertFalse(memberships.isEmpty());
+        List<URelationship> relationships = anyObjectDAO.findURelationships(anyObjectDAO.find(1L));
+        assertFalse(relationships.isEmpty());
+
+        userDAO.delete(4L);
+
+        userDAO.flush();
+
+        assertNull(userDAO.find(4L));
+        assertNull(plainAttrDAO.find(550L, UPlainAttr.class));
+        assertNull(plainAttrValueDAO.find(22L, UPlainAttrValue.class));
+        assertNotNull(plainSchemaDAO.find("loginDate"));
+
+        memberships = groupDAO.findUMemberships(groupDAO.find(7L));
+        assertTrue(memberships.isEmpty());
+        relationships = anyObjectDAO.findURelationships(anyObjectDAO.find(1L));
+        assertTrue(relationships.isEmpty());
+    }
+
+    @Test
+    public void ships() {
+        User user = userDAO.find(4L);
+        assertNotNull(user);
+        assertEquals(1, user.getMemberships().size());
+        assertEquals(7L, user.getMemberships().get(0).getRightEnd().getKey(), 0);
+
+        user.remove(user.getMemberships().get(0));
+
+        UMembership newM = entityFactory.newEntity(UMembership.class);
+        newM.setLeftEnd(user);
+        newM.setRightEnd(groupDAO.find(13L));
+        user.add(newM);
+
+        userDAO.save(user);
+
+        userDAO.flush();
+
+        user = userDAO.find(4L);
+        assertEquals(1, user.getMemberships().size());
+        assertEquals(13L, user.getMemberships().get(0).getRightEnd().getKey(), 0);
+        assertEquals(1, user.getRelationships().size());
+        assertEquals(1L, user.getRelationships().get(0).getRightEnd().getKey(), 0);
+
+        user.remove(user.getRelationships().get(0));
+
+        URelationship newR = entityFactory.newEntity(URelationship.class);
+        newR.setType(relationshipTypeDAO.find("neighborhood"));
+        newR.setLeftEnd(user);
+        newR.setRightEnd(anyObjectDAO.find(2L));
+        user.add(newR);
+
+        userDAO.save(user);
+
+        userDAO.flush();
+
+        user = userDAO.find(4L);
+        assertEquals(1, user.getRelationships().size());
+        assertEquals(2L, user.getRelationships().get(0).getRightEnd().getKey(), 0);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnySearchTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnySearchTest.java
deleted file mode 100644
index b038222..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnySearchTest.java
+++ /dev/null
@@ -1,115 +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.relationship;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.Entitlement;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.RealmDAO;
-import org.apache.syncope.core.persistence.api.dao.RoleDAO;
-import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
-import org.apache.syncope.core.persistence.api.dao.search.RoleCond;
-import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
-import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
-import org.apache.syncope.core.persistence.api.entity.Role;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class AnySearchTest extends AbstractTest {
-
-    @Autowired
-    private GroupDAO groupDAO;
-
-    @Autowired
-    private AnySearchDAO searchDAO;
-
-    @Autowired
-    private RealmDAO realmDAO;
-
-    @Autowired
-    private RoleDAO roleDAO;
-
-    @Test
-    public void issueSYNCOPE95() {
-        Set<Group> groups = new HashSet<>(groupDAO.findAll(SyncopeConstants.FULL_ADMIN_REALMS, 1, 100));
-        for (Group group : groups) {
-            groupDAO.delete(group.getKey());
-        }
-        groupDAO.flush();
-
-        AttributeCond coolLeafCond = new AttributeCond(AttributeCond.Type.EQ);
-        coolLeafCond.setSchema("cool");
-        coolLeafCond.setExpression("true");
-
-        SearchCond cond = SearchCond.getLeafCond(coolLeafCond);
-        assertTrue(cond.isValid());
-
-        List<User> users = searchDAO.search(SyncopeConstants.FULL_ADMIN_REALMS, cond, AnyTypeKind.USER);
-        assertNotNull(users);
-        assertEquals(1, users.size());
-
-        assertEquals(4L, users.get(0).getKey(), 0);
-    }
-
-    @Test
-    public void searchByDynMembership() {
-        // 1. create role with dynamic membership
-        Role role = entityFactory.newEntity(Role.class);
-        role.setName("new");
-        role.addRealm(realmDAO.getRoot());
-        role.addRealm(realmDAO.find("/even/two"));
-        role.getEntitlements().add(Entitlement.LOG_LIST);
-        role.getEntitlements().add(Entitlement.LOG_SET_LEVEL);
-
-        DynRoleMembership dynMembership = entityFactory.newEntity(DynRoleMembership.class);
-        dynMembership.setFIQLCond("cool==true");
-        dynMembership.setRole(role);
-
-        role.setDynMembership(dynMembership);
-
-        role = roleDAO.save(role);
-        assertNotNull(role);
-
-        roleDAO.flush();
-
-        // 2. search user by this dynamic role
-        RoleCond roleCond = new RoleCond();
-        roleCond.setRoleKey(role.getKey());
-
-        List<User> users = searchDAO.search(SyncopeConstants.FULL_ADMIN_REALMS,
-                SearchCond.getLeafCond(roleCond), AnyTypeKind.USER);
-        assertNotNull(users);
-        assertEquals(1, users.size());
-        assertEquals(4L, users.get(0).getKey(), 0);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeClassTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeClassTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeClassTest.java
deleted file mode 100644
index 4b5f2f5..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeClassTest.java
+++ /dev/null
@@ -1,62 +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.relationship;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import static org.junit.Assert.assertTrue;
-
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class AnyTypeClassTest extends AbstractTest {
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
-    @Test
-    public void delete() {
-        AnyTypeClass minimalUser = anyTypeClassDAO.find("minimal user");
-        assertNotNull(minimalUser);
-
-        PlainSchema surname = plainSchemaDAO.find("surname");
-        assertNotNull(surname);
-        assertTrue(minimalUser.getPlainSchemas().contains(surname));
-        int before = minimalUser.getPlainSchemas().size();
-
-        plainSchemaDAO.delete("surname");
-
-        anyTypeClassDAO.flush();
-
-        minimalUser = anyTypeClassDAO.find("minimal user");
-        assertNotNull(minimalUser);
-        assertEquals(before, minimalUser.getPlainSchemas().size() + 1);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeTest.java
deleted file mode 100644
index 60ff041..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/AnyTypeTest.java
+++ /dev/null
@@ -1,61 +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.relationship;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyType;
-import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class AnyTypeTest extends AbstractTest {
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
-    @Test
-    public void delete() {
-        AnyType userType = anyTypeDAO.findUser();
-        assertNotNull(userType);
-
-        AnyTypeClass other = anyTypeClassDAO.find("other");
-        assertNotNull(other);
-        assertTrue(userType.getClasses().contains(other));
-        int before = userType.getClasses().size();
-
-        anyTypeClassDAO.delete("other");
-
-        anyTypeDAO.flush();
-
-        userType = anyTypeDAO.findUser();
-        assertNotNull(userType);
-        assertEquals(before, userType.getClasses().size() + 1);
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ConnInstanceTest.java
deleted file mode 100644
index 34aaef5..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ConnInstanceTest.java
+++ /dev/null
@@ -1,103 +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.relationship;
-
-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.syncope.common.lib.types.ConnectorCapability;
-import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class ConnInstanceTest extends AbstractTest {
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    private ConnInstanceDAO connInstanceDAO;
-
-    @Test
-    public void deleteCascade() {
-        ConnInstance connInstance = connInstanceDAO.find(103L);
-        assertNotNull(connInstance);
-
-        List<? extends ExternalResource> resources = connInstance.getResources();
-        assertNotNull(resources);
-        assertFalse(resources.isEmpty());
-
-        connInstanceDAO.delete(connInstance.getKey());
-
-        connInstanceDAO.flush();
-
-        ConnInstance actual = connInstanceDAO.find(103L);
-        assertNull(actual);
-
-        for (ExternalResource resource : resources) {
-            assertNull(resourceDAO.find(resource.getKey()));
-        }
-    }
-
-    /**
-     * Connector change used to miss connector bean registration.
-     *
-     * http://code.google.com/p/syncope/issues/detail?id=176
-     */
-    @Test
-    public void issue176() {
-        ConnInstance connInstance = connInstanceDAO.find(103L);
-        assertNotNull(connInstance);
-        assertTrue(connInstance.getCapabilities().isEmpty());
-
-        List<? extends ExternalResource> resources = connInstance.getResources();
-        assertNotNull(resources);
-        assertEquals(4, resources.size());
-        assertTrue(
-                "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(0).getKey())
-                || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(1).getKey())
-                || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(2).getKey())
-                || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(3).getKey()));
-
-        connInstance.addCapability(ConnectorCapability.SEARCH);
-
-        connInstance = connInstanceDAO.save(connInstance);
-        assertNotNull(connInstance);
-        assertFalse(connInstance.getCapabilities().isEmpty());
-
-        resources = connInstance.getResources();
-        assertNotNull(resources);
-        assertEquals(4, resources.size());
-        assertTrue(
-                "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(0).getKey())
-                || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(1).getKey())
-                || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(2).getKey())
-                || "ws-target-resource-nopropagation".equalsIgnoreCase(resources.get(3).getKey()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/DerSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/DerSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/DerSchemaTest.java
deleted file mode 100644
index 9448886..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/DerSchemaTest.java
+++ /dev/null
@@ -1,57 +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.relationship;
-
-import static org.junit.Assert.assertNull;
-
-import org.apache.syncope.core.persistence.api.dao.DerAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class DerSchemaTest extends AbstractTest {
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private DerSchemaDAO derSchemaDAO;
-
-    @Autowired
-    private DerAttrDAO derAttrDAO;
-
-    @Test
-    public void test() {
-        DerSchema schema = derSchemaDAO.find("cn");
-
-        derSchemaDAO.delete(schema.getKey());
-
-        derSchemaDAO.flush();
-
-        assertNull(derSchemaDAO.find(schema.getKey()));
-        assertNull(derAttrDAO.find(100L, UDerAttr.class));
-        assertNull(userDAO.find(3L).getDerAttr(schema.getKey()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/GroupTest.java
deleted file mode 100644
index 50b4c56..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/GroupTest.java
+++ /dev/null
@@ -1,328 +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.relationship;
-
-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.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;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
-import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
-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.RealmDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
-import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.GPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADynGroupMembership;
-import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class GroupTest extends AbstractTest {
-
-    @Autowired
-    private EntityManager entityManager;
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private AnyObjectDAO anyObjectDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private GroupDAO groupDAO;
-
-    @Autowired
-    private RealmDAO realmDAO;
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private PlainAttrDAO plainAttrDAO;
-
-    @Autowired
-    private PlainAttrValueDAO plainAttrValueDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
-    @Test(expected = InvalidEntityException.class)
-    public void saveWithTwoOwners() {
-        Group root = groupDAO.find("root");
-        assertNotNull("did not find expected group", root);
-
-        User user = userDAO.find(1L);
-        assertNotNull("did not find expected user", user);
-
-        Group group = entityFactory.newEntity(Group.class);
-        group.setRealm(realmDAO.getRoot());
-        group.setName("error");
-        group.setUserOwner(user);
-        group.setGroupOwner(root);
-
-        groupDAO.save(group);
-    }
-
-    @Test
-    public void findByOwner() {
-        Group group = groupDAO.find(6L);
-        assertNotNull("did not find expected group", group);
-
-        User user = userDAO.find(5L);
-        assertNotNull("did not find expected user", user);
-
-        assertEquals(user, group.getUserOwner());
-
-        List<Group> ownedGroups = groupDAO.findOwnedByUser(user.getKey());
-        assertFalse(ownedGroups.isEmpty());
-        assertEquals(1, ownedGroups.size());
-        assertTrue(ownedGroups.contains(group));
-    }
-
-    @Test
-    public void delete() {
-        groupDAO.delete(2L);
-
-        groupDAO.flush();
-
-        assertNull(groupDAO.find(2L));
-        assertEquals(userDAO.findAllGroups(userDAO.find(2L)).size(), 2);
-        assertNull(plainAttrDAO.find(700L, GPlainAttr.class));
-        assertNull(plainAttrValueDAO.find(41L, GPlainAttrValue.class));
-        assertNotNull(plainSchemaDAO.find("icon"));
-    }
-
-    /**
-     * Static copy of {@link org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO} method with same signature:
-     * required for avoiding creating of a new transaction - good for general use case but bad for the way how
-     * this test class is architected.
-     */
-    private Collection<Group> findDynGroupMemberships(final User user) {
-        TypedQuery<Group> query = entityManager.createQuery(
-                "SELECT e.group FROM " + JPAUDynGroupMembership.class.getSimpleName()
-                + " e WHERE :user MEMBER OF e.users", Group.class);
-        query.setParameter("user", user);
-
-        return query.getResultList();
-    }
-
-    @Test
-    public void udynMembership() {
-        // 0. create user matching the condition below
-        User user = entityFactory.newEntity(User.class);
-        user.setUsername("username");
-        user.setRealm(realmDAO.find("/even/two"));
-        user.add(anyTypeClassDAO.find("other"));
-
-        UPlainAttr attr = entityFactory.newEntity(UPlainAttr.class);
-        attr.setOwner(user);
-        attr.setSchema(plainSchemaDAO.find("cool"));
-        attr.add("true", anyUtilsFactory.getInstance(AnyTypeKind.USER));
-        user.add(attr);
-
-        user = userDAO.save(user);
-        Long newUserKey = user.getKey();
-        assertNotNull(newUserKey);
-
-        // 1. create group with dynamic membership
-        Group group = entityFactory.newEntity(Group.class);
-        group.setRealm(realmDAO.getRoot());
-        group.setName("new");
-
-        UDynGroupMembership dynMembership = entityFactory.newEntity(UDynGroupMembership.class);
-        dynMembership.setFIQLCond("cool==true");
-        dynMembership.setGroup(group);
-
-        group.setUDynMembership(dynMembership);
-
-        Group actual = groupDAO.save(group);
-        assertNotNull(actual);
-
-        groupDAO.flush();
-
-        // 2. verify that dynamic membership is there
-        actual = groupDAO.find(actual.getKey());
-        assertNotNull(actual);
-        assertNotNull(actual.getUDynMembership());
-        assertNotNull(actual.getUDynMembership().getKey());
-        assertEquals(actual, actual.getUDynMembership().getGroup());
-
-        // 3. verify that expected users have the created group dynamically assigned
-        assertEquals(2, actual.getUDynMembership().getMembers().size());
-        assertEquals(new HashSet<>(Arrays.asList(4L, newUserKey)),
-                CollectionUtils.collect(actual.getUDynMembership().getMembers(), new Transformer<User, Long>() {
-
-                    @Override
-                    public Long transform(final User input) {
-                        return input.getKey();
-                    }
-                }, new HashSet<Long>()));
-
-        user = userDAO.find(4L);
-        assertNotNull(user);
-        Collection<Group> dynGroupMemberships = findDynGroupMemberships(user);
-        assertEquals(1, dynGroupMemberships.size());
-        assertTrue(dynGroupMemberships.contains(actual.getUDynMembership().getGroup()));
-
-        // 4. delete the new user and verify that dynamic membership was updated
-        userDAO.delete(newUserKey);
-
-        userDAO.flush();
-
-        actual = groupDAO.find(actual.getKey());
-        assertEquals(1, actual.getUDynMembership().getMembers().size());
-        assertEquals(4L, actual.getUDynMembership().getMembers().get(0).getKey(), 0);
-
-        // 5. delete group and verify that dynamic membership was also removed
-        Long dynMembershipKey = actual.getUDynMembership().getKey();
-
-        groupDAO.delete(actual);
-
-        groupDAO.flush();
-
-        assertNull(entityManager.find(JPAUDynGroupMembership.class, dynMembershipKey));
-
-        dynGroupMemberships = findDynGroupMemberships(user);
-        assertTrue(dynGroupMemberships.isEmpty());
-    }
-
-    /**
-     * Static copy of {@link org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO} method with same signature:
-     * required for avoiding creating of a new transaction - good for general use case but bad for the way how
-     * this test class is architected.
-     */
-    private List<Group> findDynGroupMemberships(final AnyObject anyObject) {
-        TypedQuery<Group> query = entityManager.createQuery(
-                "SELECT e.group FROM " + JPAADynGroupMembership.class.getSimpleName()
-                + " e WHERE :anyObject MEMBER OF e.anyObjects", Group.class);
-        query.setParameter("anyObject", anyObject);
-
-        return query.getResultList();
-    }
-
-    @Test
-    public void adynMembership() {
-        // 0. create any object matching the condition below
-        AnyObject anyObject = entityFactory.newEntity(AnyObject.class);
-        anyObject.setType(anyTypeDAO.find("PRINTER"));
-        anyObject.setRealm(realmDAO.find("/even/two"));
-
-        APlainAttr attr = entityFactory.newEntity(APlainAttr.class);
-        attr.setOwner(anyObject);
-        attr.setSchema(plainSchemaDAO.find("model"));
-        attr.add("Canon MFC8030", anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT));
-        anyObject.add(attr);
-
-        anyObject = anyObjectDAO.save(anyObject);
-        Long newAnyObjectKey = anyObject.getKey();
-        assertNotNull(newAnyObjectKey);
-
-        // 1. create group with dynamic membership
-        Group group = entityFactory.newEntity(Group.class);
-        group.setRealm(realmDAO.getRoot());
-        group.setName("new");
-
-        ADynGroupMembership dynMembership = entityFactory.newEntity(ADynGroupMembership.class);
-        dynMembership.setFIQLCond("model==Canon MFC8030");
-        dynMembership.setGroup(group);
-
-        group.setADynMembership(dynMembership);
-
-        Group actual = groupDAO.save(group);
-        assertNotNull(actual);
-
-        groupDAO.flush();
-
-        // 2. verify that dynamic membership is there
-        actual = groupDAO.find(actual.getKey());
-        assertNotNull(actual);
-        assertNotNull(actual.getADynMembership());
-        assertNotNull(actual.getADynMembership().getKey());
-        assertEquals(actual, actual.getADynMembership().getGroup());
-
-        // 3. verify that expected any objects have the created group dynamically assigned
-        assertEquals(2, actual.getADynMembership().getMembers().size());
-        assertEquals(new HashSet<>(Arrays.asList(1L, newAnyObjectKey)),
-                CollectionUtils.collect(actual.getADynMembership().getMembers(), new Transformer<AnyObject, Long>() {
-
-                    @Override
-                    public Long transform(final AnyObject input) {
-                        return input.getKey();
-                    }
-                }, new HashSet<Long>()));
-
-        anyObject = anyObjectDAO.find(1L);
-        assertNotNull(anyObject);
-        Collection<Group> dynGroupMemberships = findDynGroupMemberships(anyObject);
-        assertEquals(1, dynGroupMemberships.size());
-        assertTrue(dynGroupMemberships.contains(actual.getADynMembership().getGroup()));
-
-        // 4. delete the new any object and verify that dynamic membership was updated
-        anyObjectDAO.delete(newAnyObjectKey);
-
-        anyObjectDAO.flush();
-
-        actual = groupDAO.find(actual.getKey());
-        assertEquals(1, actual.getADynMembership().getMembers().size());
-        assertEquals(1L, actual.getADynMembership().getMembers().get(0).getKey(), 0);
-
-        // 5. delete group and verify that dynamic membership was also removed
-        Long dynMembershipKey = actual.getADynMembership().getKey();
-
-        groupDAO.delete(actual);
-
-        groupDAO.flush();
-
-        assertNull(entityManager.find(JPAADynGroupMembership.class, dynMembershipKey));
-
-        dynGroupMemberships = findDynGroupMemberships(anyObject);
-        assertTrue(dynGroupMemberships.isEmpty());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainAttrTest.java
deleted file mode 100644
index ae4220c..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainAttrTest.java
+++ /dev/null
@@ -1,179 +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.relationship;
-
-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 org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.AttrSchemaType;
-import org.apache.syncope.common.lib.types.CipherAlgorithm;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.DerAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class PlainAttrTest extends AbstractTest {
-
-    @Autowired
-    private PlainAttrDAO plainAttrDAO;
-
-    @Autowired
-    private DerAttrDAO derAttrDAO;
-
-    @Autowired
-    private PlainAttrValueDAO plainAttrValueDAO;
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private DerSchemaDAO derSchemaDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
-    @Test
-    public void deleteAttribute() {
-        plainAttrDAO.delete(117L, UPlainAttr.class);
-
-        plainAttrDAO.flush();
-
-        assertNull(plainAttrDAO.find(117L, UPlainAttr.class));
-        assertNull(plainAttrValueDAO.find(28L, UPlainAttrValue.class));
-    }
-
-    @Test
-    public void deleteAttributeValue() {
-        UPlainAttrValue value = plainAttrValueDAO.find(14L, UPlainAttrValue.class);
-        int attributeValueNumber = value.getAttr().getValues().size();
-
-        plainAttrValueDAO.delete(value.getKey(), UPlainAttrValue.class);
-
-        plainAttrValueDAO.flush();
-
-        assertNull(plainAttrValueDAO.find(value.getKey(), UPlainAttrValue.class));
-
-        UPlainAttr attribute = plainAttrDAO.find(104L, UPlainAttr.class);
-        assertEquals(attribute.getValues().size(), attributeValueNumber - 1);
-    }
-
-    @Test
-    public void checkForEnumType() {
-        User user = userDAO.find(1L);
-        user.setPassword("password123", CipherAlgorithm.SHA);
-        assertNotNull(user);
-
-        AnyTypeClass other = anyTypeClassDAO.find("other");
-
-        PlainSchema color = entityFactory.newEntity(PlainSchema.class);
-        color.setType(AttrSchemaType.Enum);
-        color.setKey("color");
-        color.setEnumerationValues("red" + SyncopeConstants.ENUM_VALUES_SEPARATOR + "yellow");
-
-        color = plainSchemaDAO.save(color);
-
-        other.add(color);
-        color.setAnyTypeClass(other);
-
-        plainSchemaDAO.flush();
-
-        color = plainSchemaDAO.find("color");
-        assertNotNull("expected save to work", color);
-        assertEquals(other, color.getAnyTypeClass());
-
-        UPlainAttr attr = entityFactory.newEntity(UPlainAttr.class);
-        attr.setOwner(user);
-        attr.setSchema(color);
-        attr.add("yellow", anyUtilsFactory.getInstance(AnyTypeKind.USER));
-        user.add(attr);
-
-        userDAO.save(user);
-        userDAO.flush();
-
-        user = userDAO.find(1L);
-        assertNotNull(user);
-        assertNotNull(user.getPlainAttr(color.getKey()));
-        assertNotNull(user.getPlainAttr(color.getKey()).getValues());
-        assertEquals(user.getPlainAttr(color.getKey()).getValues().size(), 1);
-    }
-
-    @Test
-    public void derAttrFromSpecialAttrs() {
-        AnyTypeClass other = anyTypeClassDAO.find("other");
-
-        DerSchema sderived = entityFactory.newEntity(DerSchema.class);
-        sderived.setKey("sderived");
-        sderived.setExpression("username + ' - ' + creationDate + '[' + failedLogins + ']'");
-
-        sderived = derSchemaDAO.save(sderived);
-
-        derSchemaDAO.flush();
-
-        other.add(sderived);
-        sderived.setAnyTypeClass(other);
-
-        derSchemaDAO.flush();
-
-        sderived = derSchemaDAO.find("sderived");
-        assertNotNull("expected save to work", sderived);
-        assertEquals(other, sderived.getAnyTypeClass());
-
-        User owner = userDAO.find(3L);
-        assertNotNull("did not get expected user", owner);
-
-        UDerAttr derAttr = entityFactory.newEntity(UDerAttr.class);
-        derAttr.setOwner(owner);
-        derAttr.setSchema(sderived);
-
-        derAttr = derAttrDAO.save(derAttr);
-        derAttrDAO.flush();
-
-        derAttr = derAttrDAO.find(derAttr.getKey(), UDerAttr.class);
-        assertNotNull("expected save to work", derAttr);
-
-        String value = derAttr.getValue(owner.getPlainAttrs());
-        assertNotNull(value);
-        assertFalse(value.isEmpty());
-        assertTrue(value.startsWith("vivaldi - 2010-10-20"));
-        assertTrue(value.endsWith("[0]"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainSchemaTest.java
deleted file mode 100644
index 7d363c2..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/PlainSchemaTest.java
+++ /dev/null
@@ -1,170 +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.relationship;
-
-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.HashSet;
-import java.util.Set;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class PlainSchemaTest extends AbstractTest {
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private PlainAttrDAO plainAttrDAO;
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Test
-    public void deleteFullname() {
-        // fullname is mapped as ConnObjectKey for ws-target-resource-2, need to swap it otherwise validation errors 
-        // will be raised
-        for (MappingItem item : resourceDAO.find("ws-target-resource-2").
-                getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
-
-            if ("fullname".equals(item.getIntAttrName())) {
-                item.setConnObjectKey(false);
-            } else if ("surname".equals(item.getIntAttrName())) {
-                item.setConnObjectKey(true);
-            }
-        }
-
-        // search for user schema fullname
-        PlainSchema schema = plainSchemaDAO.find("fullname");
-        assertNotNull(schema);
-
-        // check for associated mappings
-        Set<MappingItem> mapItems = new HashSet<>();
-        for (ExternalResource resource : resourceDAO.findAll()) {
-            if (resource.getProvision(anyTypeDAO.findUser()) != null
-                    && resource.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
-
-                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
-                    if (schema.getKey().equals(mapItem.getIntAttrName())) {
-                        mapItems.add(mapItem);
-                    }
-                }
-            }
-        }
-        assertFalse(mapItems.isEmpty());
-
-        // delete user schema fullname
-        plainSchemaDAO.delete("fullname");
-
-        plainSchemaDAO.flush();
-
-        // check for schema deletion
-        schema = plainSchemaDAO.find("fullname");
-        assertNull(schema);
-
-        plainSchemaDAO.clear();
-
-        // check for mappings deletion
-        mapItems = new HashSet<>();
-        for (ExternalResource resource : resourceDAO.findAll()) {
-            if (resource.getProvision(anyTypeDAO.findUser()) != null
-                    && resource.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
-
-                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
-                    if ("fullname".equals(mapItem.getIntAttrName())) {
-                        mapItems.add(mapItem);
-                    }
-                }
-            }
-        }
-        assertTrue(mapItems.isEmpty());
-
-        assertNull(plainAttrDAO.find(100L, UPlainAttr.class));
-        assertNull(plainAttrDAO.find(300L, UPlainAttr.class));
-        assertNull(userDAO.find(1L).getPlainAttr("fullname"));
-        assertNull(userDAO.find(3L).getPlainAttr("fullname"));
-    }
-
-    @Test
-    public void deleteSurname() {
-        // search for user schema fullname
-        PlainSchema schema = plainSchemaDAO.find("surname");
-        assertNotNull(schema);
-
-        // check for associated mappings
-        Set<MappingItem> mappings = new HashSet<>();
-        for (ExternalResource resource : resourceDAO.findAll()) {
-            if (resource.getProvision(anyTypeDAO.findUser()) != null
-                    && resource.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
-
-                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
-                    if (schema.getKey().equals(mapItem.getIntAttrName())) {
-                        mappings.add(mapItem);
-                    }
-                }
-            }
-        }
-        assertFalse(mappings.isEmpty());
-
-        // delete user schema fullname
-        plainSchemaDAO.delete("surname");
-
-        plainSchemaDAO.flush();
-
-        // check for schema deletion
-        schema = plainSchemaDAO.find("surname");
-        assertNull(schema);
-    }
-
-    @Test
-    public void deleteALong() {
-        assertEquals(6, resourceDAO.find("resource-db-sync").
-                getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
-
-        plainSchemaDAO.delete("aLong");
-        assertNull(plainSchemaDAO.find("aLong"));
-
-        plainSchemaDAO.flush();
-
-        assertEquals(5, resourceDAO.find("resource-db-sync").
-                getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RealmTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RealmTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RealmTest.java
deleted file mode 100644
index e652e62..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RealmTest.java
+++ /dev/null
@@ -1,60 +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.relationship;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.syncope.core.persistence.api.dao.RealmDAO;
-import org.apache.syncope.core.persistence.api.dao.RoleDAO;
-import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.Role;
-import org.apache.syncope.core.persistence.jpa.AbstractTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-@Transactional
-public class RealmTest extends AbstractTest {
-
-    @Autowired
-    private RealmDAO realmDAO;
-
-    @Autowired
-    private RoleDAO roleDAO;
-
-    @Test
-    public void test() {
-        Realm realm = realmDAO.find("/odd");
-        assertNotNull(realm);
-
-        Role role = roleDAO.find(1L);
-        assertTrue(role.getRealms().contains(realm));
-
-        int beforeSize = role.getRealms().size();
-
-        realmDAO.delete(realm);
-
-        realmDAO.flush();
-
-        role = roleDAO.find(1L);
-        assertEquals(beforeSize - 1, role.getRealms().size());
-    }
-}