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 2017/10/17 08:34:35 UTC

[2/2] syncope git commit: [SYNCOPE-1138] Replacing left and right with otherEnd

[SYNCOPE-1138] Replacing left and right with otherEnd


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

Branch: refs/heads/master
Commit: 1d74b79c26f38c33675b83e0cd7610c466210207
Parents: fdc991aa
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Oct 17 09:50:02 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Oct 17 10:34:27 2017 +0200

----------------------------------------------------------------------
 .../console/wizards/any/AbstractAttrs.java      |  2 +-
 .../client/console/wizards/any/Groups.java      |  4 +--
 .../console/wizards/any/Relationships.java      | 32 ++++++++---------
 .../any/Relationships$Specification.html        |  2 +-
 .../app/js/controllers/UserController.js        |  4 +--
 .../resources/app/js/directives/groups.js       |  4 +--
 .../resources/app/js/filters/propsFilter.js     | 11 +++---
 .../META-INF/resources/app/views/groups.html    |  2 +-
 .../syncope/common/lib/EntityTOUtils.java       |  5 ++-
 .../syncope/common/lib/to/AnyObjectTO.java      |  4 +--
 .../common/lib/to/GroupableRelatableTO.java     |  2 +-
 .../syncope/common/lib/to/MembershipTO.java     | 35 +++++-------------
 .../syncope/common/lib/to/RelationshipTO.java   | 28 +++++++--------
 .../apache/syncope/common/lib/to/UserTO.java    |  4 +--
 .../core/persistence/api/dao/AnyObjectDAO.java  |  5 +--
 .../persistence/jpa/dao/JPAAnyObjectDAO.java    | 27 ++++++++++----
 .../jpa/entity/AbstractGroupableRelatable.java  |  8 -----
 .../jpa/entity/anyobject/JPAAnyObject.java      | 12 +++++++
 .../persistence/jpa/entity/user/JPAUser.java    | 11 ++++++
 .../test/resources/domains/MasterContent.xml    |  2 +-
 .../java/data/AbstractAnyDataBinder.java        |  7 ++--
 .../java/data/AnyObjectDataBinderImpl.java      | 38 +++++++++++---------
 .../java/data/UserDataBinderImpl.java           | 19 +++++-----
 .../java/job/report/UserReportlet.java          | 10 +++---
 .../provisioning/java/utils/TemplateUtils.java  |  4 +--
 .../client/ElasticsearchUtils.java              |  7 ++--
 .../syncope/fit/core/AnyObjectITCase.java       |  2 +-
 .../apache/syncope/fit/core/PullTaskITCase.java |  2 +-
 .../syncope/fit/core/UserWorkflowITCase.java    |  4 +--
 29 files changed, 153 insertions(+), 144 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
index 49630fe..2e77c8c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
@@ -205,7 +205,7 @@ public abstract class AbstractAttrs<S extends AbstractSchemaTO> extends WizardSt
 
     protected List<String> getMembershipAuxClasses(final MembershipTO membershipTO, final String anyType) {
         try {
-            final GroupTO groupTO = groupRestClient.read(membershipTO.getRightKey());
+            final GroupTO groupTO = groupRestClient.read(membershipTO.getGroupKey());
             return groupTO.getTypeExtension(anyType).get().getAuxClasses();
         } catch (Exception e) {
             return Collections.emptyList();

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index fe9e226..eb99715 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -268,8 +268,8 @@ public class Groups extends WizardStep implements ICondition {
             // set group names in membership TOs and remove membership not assignable
             List<MembershipTO> toBeRemoved = new ArrayList<>();
             GroupableRelatableTO.class.cast(anyTO).getMemberships().forEach(membership -> {
-                if (assignedGroups.containsKey(membership.getRightKey())) {
-                    membership.setGroupName(assignedGroups.get(membership.getRightKey()).getName());
+                if (assignedGroups.containsKey(membership.getGroupKey())) {
+                    membership.setGroupName(assignedGroups.get(membership.getGroupKey()).getName());
                 } else {
                     toBeRemoved.add(membership);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
index 2c333b1..7d64b7d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
@@ -255,15 +255,15 @@ public class Relationships extends WizardStep implements ICondition {
                     filter(anyType -> anyType.getKind() != AnyTypeKind.GROUP
                     && anyType.getKind() != AnyTypeKind.USER).collect(Collectors.toList());
 
-            final AjaxDropDownChoicePanel<AnyTypeTO> rightType = new AjaxDropDownChoicePanel<>(
-                    "rightType", "rightType", new PropertyModel<AnyTypeTO>(rel, "rightType") {
+            final AjaxDropDownChoicePanel<AnyTypeTO> otherType = new AjaxDropDownChoicePanel<>(
+                    "otherType", "otherType", new PropertyModel<AnyTypeTO>(rel, "otherType") {
 
                 private static final long serialVersionUID = -5861057041758169508L;
 
                 @Override
                 public AnyTypeTO getObject() {
                     for (AnyTypeTO obj : availableTypes) {
-                        if (obj.getKey().equals(rel.getRightType())) {
+                        if (obj.getKey().equals(rel.getOtherEndType())) {
                             return obj;
                         }
                     }
@@ -272,11 +272,11 @@ public class Relationships extends WizardStep implements ICondition {
 
                 @Override
                 public void setObject(final AnyTypeTO object) {
-                    rel.setRightType(object == null ? null : object.getKey());
+                    rel.setOtherEndType(object == null ? null : object.getKey());
                 }
             }, false);
-            rightType.setChoices(availableTypes);
-            rightType.setChoiceRenderer(new IChoiceRenderer<AnyTypeTO>() {
+            otherType.setChoices(availableTypes);
+            otherType.setChoiceRenderer(new IChoiceRenderer<AnyTypeTO>() {
 
                 private static final long serialVersionUID = -734743540442190178L;
 
@@ -296,9 +296,9 @@ public class Relationships extends WizardStep implements ICondition {
                             filter(anyTypeTO -> id.equals(anyTypeTO.getKey())).findAny().orElse(null);
                 }
             });
-            // enable "rightType" dropdown only if "type" option is selected - SYNCOPE-1140
-            rightType.setEnabled(false);
-            add(rightType);
+            // enable "otherType" dropdown only if "type" option is selected - SYNCOPE-1140
+            otherType.setEnabled(false);
+            add(otherType);
 
             final WebMarkupContainer container = new WebMarkupContainer("searchPanelContainer");
             container.setOutputMarkupId(true);
@@ -315,21 +315,21 @@ public class Relationships extends WizardStep implements ICondition {
                 protected void onUpdate(final AjaxRequestTarget target) {
                     Fragment emptyFragment = new Fragment("searchPanel", "emptyFragment", Specification.this);
                     container.addOrReplace(emptyFragment.setRenderBodyOnly(true));
-                    rightType.setModelObject(null);
-                    // enable "rightType" dropdown only if "type" option is selected - SYNCOPE-1140
-                    rightType.setEnabled(type.getModelObject() != null && !type.getModelObject().isEmpty());
-                    target.add(rightType);
+                    otherType.setModelObject(null);
+                    // enable "otherType" dropdown only if "type" option is selected - SYNCOPE-1140
+                    otherType.setEnabled(type.getModelObject() != null && !type.getModelObject().isEmpty());
+                    target.add(otherType);
                     target.add(container);
                 }
             });
 
-            rightType.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+            otherType.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
                 private static final long serialVersionUID = -1107858522700306810L;
 
                 @Override
                 protected void onUpdate(final AjaxRequestTarget target) {
-                    final AnyTypeTO anyType = rightType.getModelObject();
+                    final AnyTypeTO anyType = otherType.getModelObject();
                     if (anyType == null) {
                         Fragment emptyFragment = new Fragment("searchPanel", "emptyFragment", Specification.this);
                         container.addOrReplace(emptyFragment.setRenderBodyOnly(true));
@@ -371,7 +371,7 @@ public class Relationships extends WizardStep implements ICondition {
                         getPayload()).getTarget();
 
                 AnyTO right = AnySelectionDirectoryPanel.ItemSelection.class.cast(event.getPayload()).getSelection();
-                rel.setRightKey(right.getKey());
+                rel.setOtherEndKey(right.getKey());
 
                 Relationships.this.addNewRelationships(rel);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
index cce2c7c..83ab31d 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/any/Relationships$Specification.html
@@ -25,7 +25,7 @@ under the License.
       </div>
 
       <div class="form-group">
-        <span wicket:id="rightType"/>
+        <span wicket:id="otherType"/>
       </div>
 
       <div wicket:id="searchPanelContainer">

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/UserController.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/UserController.js b/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/UserController.js
index cfc57ed..acf8a06 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/UserController.js
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/UserController.js
@@ -221,7 +221,7 @@ angular.module("self").controller("UserController", ['$scope', '$rootScope', '$l
         GroupService.getGroups(realm).then(function (response) {
           $scope.dynamicForm.groups = new Array();
           for (var i in response) {
-            $scope.dynamicForm.groups.push({"rightKey": response[i].key, "groupName": response[i].name});
+            $scope.dynamicForm.groups.push({"groupKey": response[i].key, "groupName": response[i].name});
           }
           $scope.dynamicForm.groups.sort(function (a, b) {
             var x = a.groupName;
@@ -284,7 +284,7 @@ angular.module("self").controller("UserController", ['$scope', '$rootScope', '$l
           for (var index in $scope.user.memberships) {
             $scope.dynamicForm.selectedGroups.push(
                     {
-                      "rightKey": $scope.user.memberships[index]["rightKey"].toString(),
+                      "groupKey": $scope.user.memberships[index]["groupKey"].toString(),
                       "groupName": $scope.user.memberships[index]["groupName"]
                     });
           }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/enduser/src/main/resources/META-INF/resources/app/js/directives/groups.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/directives/groups.js b/client/enduser/src/main/resources/META-INF/resources/app/js/directives/groups.js
index 330b1a4..8cb89a9 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/js/directives/groups.js
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/directives/groups.js
@@ -33,10 +33,10 @@ angular.module('self')
                   $scope.user.memberships = new Array();
                 }
               };
-              
+
               $scope.addGroup = function (item, model) {
                 var membership = item;
-                $scope.user.memberships.push({"rightKey": membership.rightKey, "groupName": membership.groupName});
+                $scope.user.memberships.push({"groupKey": membership.groupKey, "groupName": membership.groupName});
                 $scope.$emit("groupAdded", membership.groupName);
               };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/enduser/src/main/resources/META-INF/resources/app/js/filters/propsFilter.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/filters/propsFilter.js b/client/enduser/src/main/resources/META-INF/resources/app/js/filters/propsFilter.js
index fe23dce..51e0159 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/js/filters/propsFilter.js
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/filters/propsFilter.js
@@ -29,23 +29,22 @@
 angular.module("self")
         .filter('propsFilter', function () {
           return function (items, props) {
-            var out = [];            
+            var out = [];
             if (items && items.length && props.selected && props.selected.length) {
-              var selected = props.selected;              
+              var selected = props.selected;
               for (var i = 0; i < items.length; i++) {
                 var item = items[i], itemMisses = true;
                 for (var j = 0; j < selected.length; j++) {
-                  if (item.rightKey == selected[j].rightKey) {
+                  if (item.groupKey == selected[j].groupKey) {
                     itemMisses = false;
                     break;
                   }
                 }
-                if(itemMisses){
+                if (itemMisses) {
                   out.push(item);
                 }
               }
-            }
-            else{
+            } else {
               out = items;
             }
             return out;

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/client/enduser/src/main/resources/META-INF/resources/app/views/groups.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/groups.html b/client/enduser/src/main/resources/META-INF/resources/app/views/groups.html
index ef77ae1..38e6a29 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/groups.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/groups.html
@@ -25,7 +25,7 @@ under the License.
       {{$item.groupName}}
     </ui-select-match>
     <ui-select-choices repeat="group in dynamicForm.groups | propsFilter: {selected: dynamicForm.selectedGroups} 
-                       track by group.rightKey" class="ui-select-choices">
+                       track by group.groupKey" class="ui-select-choices">
       <div id="{{group.groupName}}" ng-bind-html="group.groupName | highlight: $select.search"></div>
     </ui-select-choices>
   </ui-select>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java b/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
index 38f5202..e5b2bee 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
@@ -40,15 +40,14 @@ public final class EntityTOUtils {
             final Collection<RelationshipTO> relationships) {
 
         Map<Pair<String, String>, RelationshipTO> result = new HashMap<>(relationships.size());
-        relationships.forEach(
-                relationship -> result.put(Pair.of(relationship.getType(), relationship.getRightKey()), relationship));
+        relationships.forEach(rel -> result.put(Pair.of(rel.getType(), rel.getOtherEndKey()), rel));
 
         return Collections.unmodifiableMap(result);
     }
 
     public static Map<String, MembershipTO> buildMembershipMap(final Collection<MembershipTO> memberships) {
         Map<String, MembershipTO> result = new HashMap<>(memberships.size());
-        memberships.forEach(membership -> result.put(membership.getRightKey(), membership));
+        memberships.forEach(memb -> result.put(memb.getGroupKey(), memb));
 
         return Collections.unmodifiableMap(result);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
index 7641687..61d8eb1 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
@@ -52,9 +52,9 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public Optional<RelationshipTO> getRelationship(final String type, final String rightKey) {
+    public Optional<RelationshipTO> getRelationship(final String type, final String otherKey) {
         return relationships.stream().filter(
-                relationship -> type.equals(relationship.getType()) && rightKey.equals(relationship.getRightKey())).
+                relationship -> type.equals(relationship.getType()) && otherKey.equals(relationship.getOtherEndKey())).
                 findFirst();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
index 37fcb3a..85ccb18 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
@@ -29,7 +29,7 @@ public interface GroupableRelatableTO {
 
     List<MembershipTO> getDynMemberships();
 
-    Optional<RelationshipTO> getRelationship(String type, String rightKey);
+    Optional<RelationshipTO> getRelationship(String type, String otherKey);
 
     List<RelationshipTO> getRelationships();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
index 9163aba..c606851 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
@@ -27,11 +27,11 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "membership")
 @XmlType
-public class MembershipTO extends RelationshipTO implements AttributableTO {
+public class MembershipTO extends AbstractBaseBean implements AttributableTO {
 
     private static final long serialVersionUID = 5992828670273935861L;
 
@@ -40,12 +40,12 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
         private final MembershipTO instance = new MembershipTO();
 
         public Builder group(final String groupKey) {
-            instance.setRightKey(groupKey);
+            instance.setGroupKey(groupKey);
             return this;
         }
 
         public Builder group(final String groupKey, final String groupName) {
-            instance.setRightKey(groupKey);
+            instance.setGroupKey(groupKey);
             instance.setGroupName(groupName);
             return this;
         }
@@ -55,6 +55,8 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
         }
     }
 
+    private String groupKey;
+
     private String groupName;
 
     private final Set<AttrTO> plainAttrs = new HashSet<>();
@@ -63,33 +65,12 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     private final Set<AttrTO> virAttrs = new HashSet<>();
 
-    @Override
-    public String getType() {
-        return "Membership";
-    }
-
-    @Override
-    public void setType(final String relationshipType) {
-        // ignore
-    }
-
-    @Override
-    public String getRightType() {
-        return AnyTypeKind.GROUP.name();
-    }
-
-    @Override
-    public void setRightType(final String rightType) {
-        // ignore
-    }
-
-    @JsonIgnore
     public String getGroupKey() {
-        return getRightKey();
+        return groupKey;
     }
 
     public void setGroupKey(final String groupKey) {
-        setRightKey(groupKey);
+        this.groupKey = groupKey;
     }
 
     public String getGroupName() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
index fc5de4f..015e18c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/RelationshipTO.java
@@ -2,7 +2,7 @@
  * 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
+ * regarding copyother 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
@@ -37,9 +37,9 @@ public class RelationshipTO extends AbstractBaseBean {
             return this;
         }
 
-        public Builder right(final String rightType, final String rightKey) {
-            instance.setRightType(rightType);
-            instance.setRightKey(rightKey);
+        public Builder otherEnd(final String otherEndType, final String otherEndKey) {
+            instance.setOtherEndType(otherEndType);
+            instance.setOtherEndKey(otherEndKey);
             return this;
         }
 
@@ -50,9 +50,9 @@ public class RelationshipTO extends AbstractBaseBean {
 
     private String type;
 
-    private String rightType;
+    private String otherEndType;
 
-    private String rightKey;
+    private String otherEndKey;
 
     public String getType() {
         return type;
@@ -62,20 +62,20 @@ public class RelationshipTO extends AbstractBaseBean {
         this.type = type;
     }
 
-    public String getRightType() {
-        return rightType;
+    public String getOtherEndType() {
+        return otherEndType;
     }
 
-    public void setRightType(final String rightType) {
-        this.rightType = rightType;
+    public void setOtherEndType(final String otherEndType) {
+        this.otherEndType = otherEndType;
     }
 
-    public String getRightKey() {
-        return rightKey;
+    public String getOtherEndKey() {
+        return otherEndKey;
     }
 
-    public void setRightKey(final String rightKey) {
-        this.rightKey = rightKey;
+    public void setOtherEndKey(final String otherEndKey) {
+        this.otherEndKey = otherEndKey;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
index 877b866..a5add3a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
@@ -195,9 +195,9 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public Optional<RelationshipTO> getRelationship(final String type, final String rightKey) {
+    public Optional<RelationshipTO> getRelationship(final String type, final String otherKey) {
         return relationships.stream().filter(
-                relationship -> type.equals(relationship.getType()) && rightKey.equals(relationship.getRightKey())).
+                relationship -> type.equals(relationship.getType()) && otherKey.equals(relationship.getOtherEndKey())).
                 findFirst();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
index 518575b..f001204 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyObjectDAO.java
@@ -23,8 +23,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
-import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
+import org.apache.syncope.core.persistence.api.entity.Relationship;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -45,7 +46,7 @@ public interface AnyObjectDAO extends AnyDAO<AnyObject> {
 
     List<Group> findDynGroups(String key);
 
-    List<ARelationship> findAllRelationships(AnyObject anyObject);
+    List<Relationship<Any<?>, Any<?>>> findAllRelationships(AnyObject anyObject);
 
     Collection<Group> findAllGroups(AnyObject anyObject);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
index 01c1c29..972a0fb 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
@@ -39,9 +39,11 @@ import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 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.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.Realm;
+import org.apache.syncope.core.persistence.api.entity.Relationship;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
@@ -166,13 +168,26 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
     }
 
     @Override
-    public List<ARelationship> findAllRelationships(final AnyObject anyObject) {
-        TypedQuery<ARelationship> query = entityManager().createQuery(
-                "SELECT e FROM " + JPAARelationship.class.getSimpleName()
-                + " e WHERE e.rightEnd=:anyObject OR e.leftEnd=:anyObject", ARelationship.class);
-        query.setParameter("anyObject", anyObject);
+    public List<Relationship<Any<?>, Any<?>>> findAllRelationships(final AnyObject anyObject) {
+        List<Relationship<Any<?>, Any<?>>> result = new ArrayList<>();
 
-        return query.getResultList();
+        @SuppressWarnings("unchecked")
+        TypedQuery<Relationship<Any<?>, Any<?>>> aquery =
+                (TypedQuery<Relationship<Any<?>, Any<?>>>) entityManager().createQuery(
+                        "SELECT e FROM " + JPAARelationship.class.getSimpleName()
+                        + " e WHERE e.rightEnd=:anyObject OR e.leftEnd=:anyObject");
+        aquery.setParameter("anyObject", anyObject);
+        result.addAll(aquery.getResultList());
+
+        @SuppressWarnings("unchecked")
+        TypedQuery<Relationship<Any<?>, Any<?>>> uquery =
+                (TypedQuery<Relationship<Any<?>, Any<?>>>) entityManager().createQuery(
+                        "SELECT e FROM " + JPAURelationship.class.getSimpleName()
+                        + " e WHERE e.rightEnd=:anyObject");
+        uquery.setParameter("anyObject", anyObject);
+        result.addAll(uquery.getResultList());
+
+        return result;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
index 4fe46e6..160ae07 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
@@ -91,14 +91,6 @@ public abstract class AbstractGroupableRelatable<
     }
 
     @Override
-    public Optional<? extends REL> getRelationship(final RelationshipType relationshipType, final String otherEndKey) {
-        return getRelationships().stream().filter(relationship
-                -> otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey())
-                && ((relationshipType == null && relationship.getType() == null)
-                || (relationshipType != null && relationshipType.equals(relationship.getType())))).findFirst();
-    }
-
-    @Override
     public Collection<? extends REL> getRelationships(final RelationshipType relationshipType) {
         return getRelationships().stream().filter(relationship
                 -> relationshipType != null && relationshipType.equals(relationship.getType())).

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
index 32bd4c0..d72e36a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity.anyobject;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
@@ -35,6 +36,7 @@ import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
+import org.apache.syncope.core.persistence.api.entity.RelationshipType;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
@@ -152,6 +154,16 @@ public class JPAAnyObject
     }
 
     @Override
+    public Optional<? extends ARelationship> getRelationship(
+            final RelationshipType relationshipType, final String otherEndKey) {
+
+        return getRelationships().stream().filter(relationship -> relationshipType.equals(relationship.getType())
+                && otherEndKey != null
+                && (otherEndKey.equals(relationship.getLeftEnd().getKey())
+                || otherEndKey.equals(relationship.getRightEnd().getKey()))).findFirst();
+    }
+
+    @Override
     public List<? extends ARelationship> getRelationships() {
         return relationships;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
index dcf205e..8168f37 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Basic;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
@@ -58,6 +59,7 @@ import org.apache.syncope.core.spring.ApplicationContextProvider;
 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.api.entity.RelationshipType;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -511,6 +513,15 @@ public class JPAUser
     }
 
     @Override
+    public Optional<? extends URelationship> getRelationship(
+            final RelationshipType relationshipType, final String otherEndKey) {
+
+        return getRelationships().stream().filter(relationship -> relationshipType.equals(relationship.getType())
+                && otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey())).
+                findFirst();
+    }
+
+    @Override
     public List<? extends URelationship> getRelationships() {
         return relationships;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 2a84a81..fd3c0c4 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1180,7 +1180,7 @@ under the License.
         jobDelegate_id="PullJobDelegate"/>
   <AnyTemplatePullTask id="3a6173a9-8c34-4e37-b3b1-0c2ea385fac0"
                        pullTask_id="c41b9b71-9bfa-4f90-89f2-84787def4c5c" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"rightType":"GROUP","rightKey":"f779c0d4-633b-4be5-8f57-32eb478a3ca5","groupName":null}],"dynMemberships":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"groupKey":"f779c0d4-633b-4be5-8f57-32eb478a3ca5","groupName":null}],"dynMemberships":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
   <AnyTemplatePullTask id="b3772d66-ec06-4133-bf38-b3273845ac5b"
                        pullTask_id="c41b9b71-9bfa-4f90-89f2-84787def4c5c" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
index 5387a75..0bc577a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
@@ -66,9 +66,7 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.Relationship;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 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.resource.Provision;
@@ -593,10 +591,9 @@ abstract class AbstractAnyDataBinder {
         });
     }
 
-    protected RelationshipTO getRelationshipTO(final Relationship<? extends Any<?>, AnyObject> relationship) {
+    protected RelationshipTO getRelationshipTO(final String relationshipType, final Any<?> otherEnd) {
         return new RelationshipTO.Builder().
-                type(relationship.getType().getKey()).
-                right(relationship.getRightEnd().getType().getKey(), relationship.getRightEnd().getKey()).
+                type(relationshipType).otherEnd(otherEnd.getType().getKey(), otherEnd.getKey()).
                 build();
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index c677063..729cf2c 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -101,7 +101,11 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
 
             // relationships
             anyObjectTO.getRelationships().addAll(
-                    anyObject.getRelationships().stream().map(relationship -> getRelationshipTO(relationship)).
+                    anyObject.getRelationships().stream().map(relationship -> getRelationshipTO(
+                    relationship.getType().getKey(),
+                    relationship.getLeftEnd().getKey().equals(anyObject.getKey())
+                    ? relationship.getRightEnd()
+                    : relationship.getLeftEnd())).
                             collect(Collectors.toList()));
 
             // memberships
@@ -161,19 +165,19 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
         if (anyObject.getRealm() != null) {
             // relationships
             anyObjectTO.getRelationships().forEach(relationshipTO -> {
-                if (StringUtils.isBlank(relationshipTO.getRightType())
-                        || AnyTypeKind.USER.name().equals(relationshipTO.getRightType())
-                        || AnyTypeKind.GROUP.name().equals(relationshipTO.getRightType())) {
+                if (StringUtils.isBlank(relationshipTO.getOtherEndType())
+                        || AnyTypeKind.USER.name().equals(relationshipTO.getOtherEndType())
+                        || AnyTypeKind.GROUP.name().equals(relationshipTO.getOtherEndType())) {
 
                     SyncopeClientException invalidAnyType =
                             SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
                     invalidAnyType.getElements().add(AnyType.class.getSimpleName()
-                            + " not allowed for relationship: " + relationshipTO.getRightType());
+                            + " not allowed for relationship: " + relationshipTO.getOtherEndType());
                     scce.addException(invalidAnyType);
                 } else {
-                    AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getRightKey());
+                    AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getOtherEndKey());
                     if (otherEnd == null) {
-                        LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
+                        LOG.debug("Ignoring invalid anyObject " + relationshipTO.getOtherEndKey());
                     } else if (anyObject.getRealm().getFullPath().startsWith(otherEnd.getRealm().getFullPath())) {
                         RelationshipType relationshipType = relationshipTypeDAO.find(relationshipTO.getType());
                         if (relationshipType == null) {
@@ -199,12 +203,12 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
 
             // memberships
             anyObjectTO.getMemberships().forEach(membershipTO -> {
-                Group group = membershipTO.getRightKey() == null
+                Group group = membershipTO.getGroupKey() == null
                         ? groupDAO.findByName(membershipTO.getGroupName())
-                        : groupDAO.find(membershipTO.getRightKey());
+                        : groupDAO.find(membershipTO.getGroupKey());
                 if (group == null) {
                     LOG.debug("Ignoring invalid group "
-                            + membershipTO.getRightKey() + " / " + membershipTO.getGroupName());
+                            + membershipTO.getGroupKey() + " / " + membershipTO.getGroupName());
                 } else if (anyObject.getRealm().getFullPath().startsWith(group.getRealm().getFullPath())) {
                     AMembership membership = entityFactory.newEntity(AMembership.class);
                     membership.setRightEnd(group);
@@ -271,26 +275,26 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                 LOG.debug("Ignoring invalid relationship type {}", patch.getRelationshipTO().getType());
             } else {
                 Optional<? extends ARelationship> relationship =
-                        anyObject.getRelationship(relationshipType, patch.getRelationshipTO().getRightKey());
+                        anyObject.getRelationship(relationshipType, patch.getRelationshipTO().getOtherEndKey());
                 if (relationship.isPresent()) {
                     anyObject.getRelationships().remove(relationship.get());
                     relationship.get().setLeftEnd(null);
                 }
 
                 if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    if (StringUtils.isBlank(patch.getRelationshipTO().getRightType())
-                            || AnyTypeKind.USER.name().equals(patch.getRelationshipTO().getRightType())
-                            || AnyTypeKind.GROUP.name().equals(patch.getRelationshipTO().getRightType())) {
+                    if (StringUtils.isBlank(patch.getRelationshipTO().getOtherEndType())
+                            || AnyTypeKind.USER.name().equals(patch.getRelationshipTO().getOtherEndType())
+                            || AnyTypeKind.GROUP.name().equals(patch.getRelationshipTO().getOtherEndType())) {
 
                         SyncopeClientException invalidAnyType =
                                 SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
                         invalidAnyType.getElements().add(AnyType.class.getSimpleName()
-                                + " not allowed for relationship: " + patch.getRelationshipTO().getRightType());
+                                + " not allowed for relationship: " + patch.getRelationshipTO().getOtherEndType());
                         scce.addException(invalidAnyType);
                     } else {
-                        AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
+                        AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getOtherEndKey());
                         if (otherEnd == null) {
-                            LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
+                            LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getOtherEndKey());
                         } else if (anyObject.getRealm().getFullPath().startsWith(otherEnd.getRealm().getFullPath())) {
                             ARelationship newRelationship = entityFactory.newEntity(ARelationship.class);
                             newRelationship.setType(relationshipType);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 770e7da..044bc99 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -206,9 +206,9 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
         if (user.getRealm() != null) {
             // relationships
             userTO.getRelationships().forEach(relationshipTO -> {
-                AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getRightKey());
+                AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getOtherEndKey());
                 if (otherEnd == null) {
-                    LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
+                    LOG.debug("Ignoring invalid anyObject " + relationshipTO.getOtherEndKey());
                 } else if (user.getRealm().getFullPath().startsWith(otherEnd.getRealm().getFullPath())) {
                     RelationshipType relationshipType = relationshipTypeDAO.find(relationshipTO.getType());
                     if (relationshipType == null) {
@@ -233,12 +233,12 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
 
             // memberships
             userTO.getMemberships().forEach(membershipTO -> {
-                Group group = membershipTO.getRightKey() == null
+                Group group = membershipTO.getGroupKey() == null
                         ? groupDAO.findByName(membershipTO.getGroupName())
-                        : groupDAO.find(membershipTO.getRightKey());
+                        : groupDAO.find(membershipTO.getGroupKey());
                 if (group == null) {
                     LOG.debug("Ignoring invalid group "
-                            + membershipTO.getRightKey() + " / " + membershipTO.getGroupName());
+                            + membershipTO.getGroupKey() + " / " + membershipTO.getGroupName());
                 } else if (user.getRealm().getFullPath().startsWith(group.getRealm().getFullPath())) {
                     UMembership membership = entityFactory.newEntity(UMembership.class);
                     membership.setRightEnd(group);
@@ -374,16 +374,16 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
                 LOG.debug("Ignoring invalid relationship type {}", patch.getRelationshipTO().getType());
             } else {
                 Optional<? extends URelationship> relationship =
-                        user.getRelationship(relationshipType, patch.getRelationshipTO().getRightKey());
+                        user.getRelationship(relationshipType, patch.getRelationshipTO().getOtherEndKey());
                 if (relationship.isPresent()) {
                     user.getRelationships().remove(relationship.get());
                     relationship.get().setLeftEnd(null);
                 }
 
                 if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
+                    AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getOtherEndKey());
                     if (otherEnd == null) {
-                        LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
+                        LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getOtherEndKey());
                     } else if (user.getRealm().getFullPath().startsWith(otherEnd.getRealm().getFullPath())) {
                         URelationship newRelationship = entityFactory.newEntity(URelationship.class);
                         newRelationship.setType(relationshipType);
@@ -605,7 +605,8 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
 
             // relationships
             userTO.getRelationships().addAll(
-                    user.getRelationships().stream().map(relationship -> getRelationshipTO(relationship)).
+                    user.getRelationships().stream().map(relationship -> getRelationshipTO(
+                    relationship.getType().getKey(), relationship.getRightEnd())).
                             collect(Collectors.toList()));
 
             // memberships

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
index a485672..3f9384b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
@@ -260,11 +260,11 @@ public class UserReportlet extends AbstractReportlet {
                     atts.clear();
 
                     atts.addAttribute("", "", "anyObjectKey",
-                            ReportXMLConst.XSD_STRING, rel.getRightKey());
+                            ReportXMLConst.XSD_STRING, rel.getOtherEndKey());
                     handler.startElement("", "", "relationship", atts);
 
                     if (conf.getFeatures().contains(Feature.resources)) {
-                        for (URelationship actualRel : user.getRelationships(rel.getRightKey())) {
+                        for (URelationship actualRel : user.getRelationships(rel.getOtherEndKey())) {
                             doExtractResources(
                                     handler, anyObjectDataBinder.getAnyObjectTO(actualRel.getRightEnd(), true));
                         }
@@ -282,15 +282,15 @@ public class UserReportlet extends AbstractReportlet {
                     atts.clear();
 
                     atts.addAttribute("", "", "groupKey",
-                            ReportXMLConst.XSD_STRING, memb.getRightKey());
+                            ReportXMLConst.XSD_STRING, memb.getGroupKey());
                     atts.addAttribute("", "", "groupName", ReportXMLConst.XSD_STRING, memb.getGroupName());
                     handler.startElement("", "", "membership", atts);
 
                     if (conf.getFeatures().contains(Feature.resources)) {
-                        UMembership actualMemb = user.getMembership(memb.getRightKey()).orElse(null);
+                        UMembership actualMemb = user.getMembership(memb.getGroupKey()).orElse(null);
                         if (actualMemb == null) {
                             LOG.warn("Unexpected: cannot find membership for group {} for user {}",
-                                    memb.getRightKey(), user);
+                                    memb.getGroupKey(), user);
                         } else {
                             doExtractResources(handler, groupDataBinder.getGroupTO(actualMemb.getRightEnd(), true));
                         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
index 0994252..5c69268 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
@@ -108,8 +108,8 @@ public class TemplateUtils {
 
     private void fillRelationships(final GroupableRelatableTO any, final GroupableRelatableTO template) {
         template.getRelationships().stream().
-                filter(relationship
-                        -> !any.getRelationship(relationship.getRightKey(), relationship.getRightKey()).isPresent()).
+                filter(relationship -> !any.getRelationship(
+                relationship.getOtherEndKey(), relationship.getOtherEndKey()).isPresent()).
                 forEachOrdered(relationship -> {
                     any.getRelationships().add(relationship);
                 });

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
index 3612c5d..e51b53f 100644
--- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -112,11 +112,8 @@ public class ElasticsearchUtils {
 
             List<Object> relationships = new ArrayList<>();
             List<Object> relationshipTypes = new ArrayList<>();
-            anyObjectDAO.findAllRelationships(anyObject).stream().
-                    map(relationship -> {
-                        relationships.add(relationship.getRightEnd().getKey());
-                        return relationship;
-                    }).forEachOrdered(relationship -> {
+            anyObjectDAO.findAllRelationships(anyObject).forEach(relationship -> {
+                relationships.add(relationship.getRightEnd().getKey());
                 relationshipTypes.add(relationship.getType().getKey());
             });
             builder = builder.field("relationships", relationships);

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
index 1829c30..e97ebd8 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
@@ -203,7 +203,7 @@ public class AnyObjectITCase extends AbstractITCase {
     @Test
     public void issueSYNCOPE756() {
         AnyObjectTO anyObjectTO = getSampleTO("issueSYNCOPE756");
-        anyObjectTO.getRelationships().add(new RelationshipTO.Builder().right(
+        anyObjectTO.getRelationships().add(new RelationshipTO.Builder().otherEnd(
                 AnyTypeKind.USER.name(), "1417acbe-cbf6-4277-9372-e75e04f97000").build());
 
         try {

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index 273509a..5bd3e7b 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -258,7 +258,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
             assertEquals(1, userTO.getMemberships().size());
-            assertEquals("f779c0d4-633b-4be5-8f57-32eb478a3ca5", userTO.getMemberships().get(0).getRightKey());
+            assertEquals("f779c0d4-633b-4be5-8f57-32eb478a3ca5", userTO.getMemberships().get(0).getGroupKey());
 
             // Unmatching --> Assign (link) - SYNCOPE-658
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_CSV));

http://git-wip-us.apache.org/repos/asf/syncope/blob/1d74b79c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
index ceffc32..c4a21c4 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
@@ -76,7 +76,7 @@ public class UserWorkflowITCase extends AbstractITCase {
         userTO = createUser(userTO).getEntity();
         assertNotNull(userTO);
         assertEquals(1, userTO.getMemberships().size());
-        assertEquals("0cbcabd2-4410-4b6b-8f05-a052b451d18f", userTO.getMemberships().get(0).getRightKey());
+        assertEquals("0cbcabd2-4410-4b6b-8f05-a052b451d18f", userTO.getMemberships().get(0).getGroupKey());
         assertEquals("createApproval", userTO.getStatus());
 
         // 2. request if there is any pending task for user just created
@@ -156,7 +156,7 @@ public class UserWorkflowITCase extends AbstractITCase {
         assertNotNull(result);
         userTO = result.getEntity();
         assertEquals(1, userTO.getMemberships().size());
-        assertEquals("0cbcabd2-4410-4b6b-8f05-a052b451d18f", userTO.getMemberships().get(0).getRightKey());
+        assertEquals("0cbcabd2-4410-4b6b-8f05-a052b451d18f", userTO.getMemberships().get(0).getGroupKey());
         assertEquals("createApproval", userTO.getStatus());
         assertEquals(Collections.singleton(RESOURCE_NAME_TESTDB), userTO.getResources());