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:54 UTC

[64/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/relationship/ReportTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ReportTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ReportTest.java
deleted file mode 100644
index 9c49aae..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ReportTest.java
+++ /dev/null
@@ -1,120 +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 java.util.Date;
-import javax.persistence.EntityExistsException;
-import org.apache.syncope.common.lib.types.ReportExecStatus;
-import org.apache.syncope.core.persistence.api.dao.ReportDAO;
-import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
-import org.apache.syncope.core.persistence.api.entity.Report;
-import org.apache.syncope.core.persistence.api.entity.ReportExec;
-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 ReportTest extends AbstractTest {
-
-    @Autowired
-    private ReportDAO reportDAO;
-
-    @Autowired
-    private ReportExecDAO reportExecDAO;
-
-    @Test
-    public void find() {
-        Report report = reportDAO.find(1L);
-        assertNotNull(report);
-
-        assertNotNull(report.getExecs());
-        assertFalse(report.getExecs().isEmpty());
-        assertEquals(1, report.getExecs().size());
-    }
-
-    @Test(expected = EntityExistsException.class)
-    public void saveWithExistingName() {
-        Report report = reportDAO.find(1L);
-        assertNotNull(report);
-
-        String name = report.getName();
-
-        report = entityFactory.newEntity(Report.class);
-        report.setName(name);
-
-        reportDAO.save(report);
-        reportDAO.flush();
-    }
-
-    @Test
-    public void save() {
-        Report report = reportDAO.find(1L);
-        assertNotNull(report);
-        assertEquals(1, report.getExecs().size());
-
-        ReportExec reportExec = entityFactory.newEntity(ReportExec.class);
-        reportExec.setReport(report);
-        reportExec.setStartDate(new Date());
-        reportExec.setEndDate(new Date());
-        reportExec.setStatus(ReportExecStatus.SUCCESS);
-
-        report.addExec(reportExec);
-
-        reportExec = reportExecDAO.save(reportExec);
-        assertNotNull(reportExec);
-        assertNotNull(reportExec.getKey());
-
-        reportExecDAO.flush();
-
-        report = reportDAO.find(1L);
-        assertNotNull(report);
-        assertEquals(2, report.getExecs().size());
-    }
-
-    @Test
-    public void deleteReport() {
-        reportDAO.delete(1L);
-
-        reportDAO.flush();
-
-        assertNull(reportDAO.find(1L));
-        assertNull(reportExecDAO.find(1L));
-    }
-
-    @Test
-    public void deleteReportExecution() {
-        ReportExec execution = reportExecDAO.find(1L);
-        int executionNumber = execution.getReport().getExecs().size();
-
-        reportExecDAO.delete(1L);
-
-        reportExecDAO.flush();
-
-        assertNull(reportExecDAO.find(1L));
-
-        Report report = reportDAO.find(1L);
-        assertEquals(report.getExecs().size(), executionNumber - 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/ResourceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ResourceTest.java
deleted file mode 100644
index 8e1e554..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/ResourceTest.java
+++ /dev/null
@@ -1,306 +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.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/relationship/RoleTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RoleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RoleTest.java
deleted file mode 100644
index 5fdc803..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/RoleTest.java
+++ /dev/null
@@ -1,167 +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.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/relationship/SecurityQuestionTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/SecurityQuestionTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/SecurityQuestionTest.java
deleted file mode 100644
index a3deb6e..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/SecurityQuestionTest.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.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/relationship/TaskTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/TaskTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/TaskTest.java
deleted file mode 100644
index 76621a1..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/TaskTest.java
+++ /dev/null
@@ -1,295 +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.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/relationship/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/UserTest.java
deleted file mode 100644
index 5a12044..0000000
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/relationship/UserTest.java
+++ /dev/null
@@ -1,126 +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.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.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 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.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/resources/content.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/content.xml b/core/persistence-jpa/src/test/resources/content.xml
index 7b11faa..8b4740a 100644
--- a/core/persistence-jpa/src/test/resources/content.xml
+++ b/core/persistence-jpa/src/test/resources/content.xml
@@ -112,6 +112,9 @@ under the License.
   <Policy DTYPE="SyncPolicy" id="9" description="sync policy for java rule" type="SYNC" 
           specification='{"conflictResolutionAction":"IGNORE","items":[]}'/>
 
+  <RelationshipType name="inclusion" description="Models the act that an object is included in another"/>
+  <RelationshipType name="neighborhood"/>
+  
   <AnyTypeClass name="generic membership"/>
 
   <AnyType name="USER" kind="USER"/>
@@ -141,8 +144,8 @@ under the License.
   <AnyObject id="2" realm_id="1" type_name="PRINTER"
              creator="admin" lastModifier="admin" 
              creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
-
-  <ARelationship id="1" left_anyObject_id="1" right_anyObject_id="2"/>
+  
+  <ARelationship id="1" left_anyObject_id="1" right_anyObject_id="2" type_name="neighborhood"/>
   
   <SyncopeRole id="1" name="User reviewer"/>
   <SyncopeRole_entitlements entitlement="USER_READ" role_id="1"/>
@@ -254,7 +257,7 @@ under the License.
                 creator="admin" lastModifier="admin" 
                 creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
   
-  <URelationship id="1" user_id="4" anyObject_id="1"/>
+  <URelationship id="1" user_id="4" anyObject_id="1" type_name="neighborhood"/>
 
   <UMembership id="1" user_id="1" group_id="1"/>
   <UMembership id="2" user_id="2" group_id="1"/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RelationshipTypeDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RelationshipTypeDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RelationshipTypeDataBinder.java
new file mode 100644
index 0000000..3e940ee
--- /dev/null
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RelationshipTypeDataBinder.java
@@ -0,0 +1,31 @@
+/*
+ * 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.api.data;
+
+import org.apache.syncope.common.lib.to.RelationshipTypeTO;
+import org.apache.syncope.core.persistence.api.entity.RelationshipType;
+
+public interface RelationshipTypeDataBinder {
+
+    RelationshipType create(RelationshipTypeTO relationshipTypeTO);
+
+    void update(RelationshipType relationshipType, RelationshipTypeTO relationshipTypeTO);
+
+    RelationshipTypeTO getRelationshipTypeTO(RelationshipType relationshipType);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RelationshipTypeDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RelationshipTypeDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RelationshipTypeDataBinderImpl.java
new file mode 100644
index 0000000..4d324cf
--- /dev/null
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RelationshipTypeDataBinderImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.provisioning.java.data;
+
+import org.apache.syncope.common.lib.to.RelationshipTypeTO;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
+import org.apache.syncope.core.persistence.api.entity.RelationshipType;
+import org.apache.syncope.core.provisioning.api.data.RelationshipTypeDataBinder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RelationshipTypeDataBinderImpl implements RelationshipTypeDataBinder {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RelationshipTypeDataBinder.class);
+
+    @Autowired
+    private EntityFactory entityFactory;
+
+    @Override
+    public RelationshipType create(final RelationshipTypeTO relationshipTypeTO) {
+        RelationshipType relationshipType = entityFactory.newEntity(RelationshipType.class);
+        update(relationshipType, relationshipTypeTO);
+        return relationshipType;
+    }
+
+    @Override
+    public void update(final RelationshipType relationshipType, final RelationshipTypeTO relationshipTypeTO) {
+        if (relationshipType.getKey() == null) {
+            relationshipType.setKey(relationshipTypeTO.getKey());
+        }
+
+        relationshipType.setDescription(relationshipTypeTO.getDescription());
+    }
+
+    @Override
+    public RelationshipTypeTO getRelationshipTypeTO(final RelationshipType relationshipType) {
+        RelationshipTypeTO relationshipTypeTO = new RelationshipTypeTO();
+
+        relationshipTypeTO.setKey(relationshipType.getKey());
+        relationshipTypeTO.setDescription(relationshipType.getDescription());
+
+        return relationshipTypeTO;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RelationshipTypeServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RelationshipTypeServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RelationshipTypeServiceImpl.java
new file mode 100644
index 0000000..6e1958e
--- /dev/null
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RelationshipTypeServiceImpl.java
@@ -0,0 +1,66 @@
+/*
+ * 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.rest.cxf.service;
+
+import java.net.URI;
+import java.util.List;
+import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.to.RelationshipTypeTO;
+import org.apache.syncope.common.rest.api.RESTHeaders;
+import org.apache.syncope.common.rest.api.service.RelationshipTypeService;
+import org.apache.syncope.core.logic.RelationshipTypeLogic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RelationshipTypeServiceImpl extends AbstractServiceImpl implements RelationshipTypeService {
+
+    @Autowired
+    private RelationshipTypeLogic logic;
+
+    @Override
+    public List<RelationshipTypeTO> list() {
+        return logic.list();
+    }
+
+    @Override
+    public RelationshipTypeTO read(final String key) {
+        return logic.read(key);
+    }
+
+    @Override
+    public Response create(final RelationshipTypeTO anyTypeTO) {
+        RelationshipTypeTO created = logic.create(anyTypeTO);
+        URI location = uriInfo.getAbsolutePathBuilder().path(String.valueOf(created.getKey())).build();
+        return Response.created(location).
+                header(RESTHeaders.RESOURCE_KEY, created.getKey()).
+                build();
+    }
+
+    @Override
+    public void update(final RelationshipTypeTO anyTypeTO) {
+        logic.update(anyTypeTO);
+    }
+
+    @Override
+    public void delete(final String key) {
+        logic.delete(key);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
index 77e4c50..7c36611 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
@@ -63,6 +63,7 @@ import org.apache.syncope.common.rest.api.service.ReportService;
 import org.apache.syncope.common.rest.api.service.ResourceService;
 import org.apache.syncope.common.rest.api.service.GroupService;
 import org.apache.syncope.common.rest.api.service.RealmService;
+import org.apache.syncope.common.rest.api.service.RelationshipTypeService;
 import org.apache.syncope.common.rest.api.service.RoleService;
 import org.apache.syncope.common.rest.api.service.SchemaService;
 import org.apache.syncope.common.rest.api.service.SecurityQuestionService;
@@ -158,6 +159,8 @@ public abstract class AbstractITCase {
 
     protected static AnyTypeService anyTypeService;
 
+    protected static RelationshipTypeService relationshipTypeService;
+
     protected static RealmService realmService;
 
     protected static AnyObjectService anyObjectService;
@@ -232,6 +235,7 @@ public abstract class AbstractITCase {
         syncopeService = adminClient.getService(SyncopeService.class);
         anyTypeClassService = adminClient.getService(AnyTypeClassService.class);
         anyTypeService = adminClient.getService(AnyTypeService.class);
+        relationshipTypeService = adminClient.getService(RelationshipTypeService.class);
         realmService = adminClient.getService(RealmService.class);
         anyObjectService = adminClient.getService(AnyObjectService.class);
         roleService = adminClient.getService(RoleService.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/d8927ef4/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/RelationshipTypeITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/RelationshipTypeITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/RelationshipTypeITCase.java
new file mode 100644
index 0000000..3d8d82f
--- /dev/null
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/RelationshipTypeITCase.java
@@ -0,0 +1,93 @@
+/*
+ * 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.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.fail;
+
+import java.util.List;
+import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.RelationshipTypeTO;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
+import org.apache.syncope.common.rest.api.service.RelationshipTypeService;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.JVM)
+public class RelationshipTypeITCase extends AbstractITCase {
+
+    @Test
+    public void read() {
+        RelationshipTypeTO otherType = relationshipTypeService.read("inclusion");
+        assertNotNull(otherType);
+        assertEquals("inclusion", otherType.getKey());
+    }
+
+    @Test
+    public void list() {
+        List<RelationshipTypeTO> list = relationshipTypeService.list();
+        assertFalse(list.isEmpty());
+    }
+
+    @Test
+    public void crud() {
+        RelationshipTypeTO newType = new RelationshipTypeTO();
+        newType.setKey("new type");
+        newType.setDescription("description");
+
+        Response response = relationshipTypeService.create(newType);
+        assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode());
+
+        newType = getObject(response.getLocation(), RelationshipTypeService.class, RelationshipTypeTO.class);
+        assertNotNull(newType);
+        assertEquals("description", newType.getDescription());
+
+        newType.setDescription("new description");
+        relationshipTypeService.update(newType);
+
+        newType = relationshipTypeService.read(newType.getKey());
+        assertNotNull(newType);
+        assertEquals("new description", newType.getDescription());
+
+        relationshipTypeService.delete(newType.getKey());
+
+        try {
+            relationshipTypeService.read(newType.getKey());
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.NotFound, e.getType());
+        }
+    }
+
+    @Test
+    public void createInvalidName() {
+        RelationshipTypeTO newType = new RelationshipTypeTO();
+        newType.setKey("membership");
+        try {
+            relationshipTypeService.create(newType);
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.InvalidRelationshipType, e.getType());
+        }
+    }
+}