Repository: syncope
Updated Branches:
  refs/heads/2_0_X c9354a517 -> 6c9018fff
  refs/heads/master fdc991aa6 -> 1d74b79c2


[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/6c9018ff
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/6c9018ff
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/6c9018ff

Branch: refs/heads/2_0_X
Commit: 6c9018fff5c6353a9a7eab3338ba7d691685209c
Parents: c9354a5
Author: Francesco Chicchiriccò <ilgro...@apache.org>
Authored: Tue Oct 17 09:50:02 2017 +0200
Committer: Francesco Chicchiriccò <ilgro...@apache.org>
Committed: Tue Oct 17 09:50:02 2017 +0200

----------------------------------------------------------------------
 .../console/wizards/any/AbstractAttrs.java      |  2 +-
 .../client/console/wizards/any/Groups.java      |  8 ++--
 .../console/wizards/any/Relationships.java      | 37 ++++++++-------
 .../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       |  4 +-
 .../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    |  6 +--
 .../core/persistence/api/dao/AnyObjectDAO.java  |  5 ++-
 .../persistence/jpa/dao/JPAAnyObjectDAO.java    | 27 ++++++++---
 .../jpa/entity/AbstractGroupableRelatable.java  | 13 ------
 .../jpa/entity/anyobject/JPAAnyObject.java      | 17 +++++++
 .../persistence/jpa/entity/user/JPAUser.java    | 15 +++++++
 .../test/resources/domains/MasterContent.xml    |  2 +-
 .../java/data/AbstractAnyDataBinder.java        |  7 +--
 .../java/data/AnyObjectDataBinderImpl.java      | 47 +++++++++++---------
 .../java/data/UserDataBinderImpl.java           | 19 ++++----
 .../java/job/report/UserReportlet.java          | 10 ++---
 .../provisioning/java/utils/TemplateUtils.java  |  2 +-
 .../client/ElasticsearchUtils.java              |  4 +-
 .../syncope/fit/core/AnyObjectITCase.java       |  2 +-
 .../apache/syncope/fit/core/PullTaskITCase.java |  2 +-
 .../syncope/fit/core/UserWorkflowITCase.java    |  4 +-
 29 files changed, 171 insertions(+), 154 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 334a97f..75ca867 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
@@ -215,7 +215,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).getAuxClasses();
         } catch (Exception e) {
             return Collections.emptyList();

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 499bc26..2c28a23 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
@@ -155,7 +155,7 @@ public class Groups extends WizardStep implements 
ICondition {
                             : groupRestClient.search(
                                     anyTO.getRealm(),
                                     
SyncopeClient.getGroupSearchConditionBuilder().
-                                    
isAssignable().and().is("name").equalTo(filter).query(),
+                                            
isAssignable().and().is("name").equalTo(filter).query(),
                                     1, MAX_GROUP_LIST_CARDINALITY,
                                     new SortParam<>("name", true),
                                     null),
@@ -223,7 +223,7 @@ public class Groups extends WizardStep implements 
ICondition {
                 ? CollectionUtils.isNotEmpty(allDynRealms)
                 : CollectionUtils.isNotEmpty(allDynRealms) || 
CollectionUtils.isNotEmpty(groupsModel.getObject()))
                 && 
SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                isActionAuthorized(this, RENDER);
+                        isActionAuthorized(this, RENDER);
     }
 
     private class GroupsModel extends ListModel<GroupTO> {
@@ -290,8 +290,8 @@ public class Groups extends WizardStep implements 
ICondition {
             // set group names in membership TOs and remove membership not 
assignable
             List<MembershipTO> toBeRemoved = new ArrayList<>();
             for (MembershipTO membership : 
GroupableRelatableTO.class.cast(anyTO).getMemberships()) {
-                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/6c9018ff/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 115da51..5fd4726 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
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.client.console.wizards.any;
 
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -95,7 +94,7 @@ public class Relationships extends WizardStep implements 
WizardModel.ICondition
     private final AnyTypeClassRestClient anyTypeClassRestClient = new 
AnyTypeClassRestClient();
 
     private final AnyTO anyTO;
-    
+
     private final RelationshipTypeRestClient relationshipTypeRestClient = new 
RelationshipTypeRestClient();
 
     public Relationships(final AnyWrapper<?> modelObject, final PageReference 
pageRef) {
@@ -149,7 +148,7 @@ public class Relationships extends WizardStep implements 
WizardModel.ICondition
                             public Panel getPanel(final String panelId) {
                                 return new 
ListViewPanel.Builder<>(RelationshipTO.class, pageRef).
                                         setItems(relationships.get(input)).
-                                        includes("rightType", "rightKey").
+                                        includes("otherEndType", 
"otherEndKey").
                                         addAction(new 
ActionLink<RelationshipTO>() {
 
                                             private static final long 
serialVersionUID = -6847033126124401556L;
@@ -275,15 +274,15 @@ public class Relationships extends WizardStep implements 
WizardModel.ICondition
                 }
             });
 
-            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;
                         }
                     }
@@ -292,11 +291,11 @@ public class Relationships extends WizardStep implements 
WizardModel.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;
 
@@ -321,9 +320,9 @@ public class Relationships extends WizardStep implements 
WizardModel.ICondition
                     });
                 }
             });
-            // 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);
@@ -340,21 +339,21 @@ public class Relationships extends WizardStep implements 
WizardModel.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));
@@ -396,7 +395,7 @@ public class Relationships extends WizardStep implements 
WizardModel.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/6c9018ff/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/6c9018ff/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/6c9018ff/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/6c9018ff/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/6c9018ff/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/6c9018ff/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 dfc0a1e..d42a625 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
@@ -55,7 +55,7 @@ public final class EntityTOUtils {
 
         Map<Pair<String, String>, RelationshipTO> result = new 
HashMap<>(relationships.size());
         for (RelationshipTO relationship : relationships) {
-            result.put(Pair.of(relationship.getType(), 
relationship.getRightKey()), relationship);
+            result.put(Pair.of(relationship.getType(), 
relationship.getOtherEndKey()), relationship);
         }
 
         return Collections.unmodifiableMap(result);
@@ -64,7 +64,7 @@ public final class EntityTOUtils {
     public static Map<String, MembershipTO> buildMembershipMap(final 
Collection<MembershipTO> memberships) {
         Map<String, MembershipTO> result = new HashMap<>(memberships.size());
         for (MembershipTO membership : memberships) {
-            result.put(membership.getRightKey(), membership);
+            result.put(membership.getGroupKey(), membership);
         }
 
         return Collections.unmodifiableMap(result);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 af8b0ea..9581cd9 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
@@ -53,12 +53,12 @@ public class AnyObjectTO extends AnyTO implements 
GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public RelationshipTO getRelationship(final String type, final String 
rightKey) {
+    public RelationshipTO getRelationship(final String type, final String 
otherKey) {
         return IterableUtils.find(relationships, new 
Predicate<RelationshipTO>() {
 
             @Override
             public boolean evaluate(final RelationshipTO object) {
-                return type.equals(object.getType()) && 
rightKey.equals(object.getRightKey());
+                return type.equals(object.getType()) && 
otherKey.equals(object.getOtherEndKey());
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 f2b8dbc..ee0ed63 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
@@ -28,7 +28,7 @@ public interface GroupableRelatableTO {
 
     List<MembershipTO> getDynMemberships();
 
-    RelationshipTO getRelationship(String type, String rightKey);
+    RelationshipTO getRelationship(String type, String otherKey);
 
     List<RelationshipTO> getRelationships();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 5737c7f..1003a50 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
@@ -28,11 +28,11 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
-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;
 
@@ -41,12 +41,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;
         }
@@ -56,6 +56,8 @@ public class MembershipTO extends RelationshipTO implements 
AttributableTO {
         }
     }
 
+    private String groupKey;
+
     private String groupName;
 
     private final Set<AttrTO> plainAttrs = new HashSet<>();
@@ -64,33 +66,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/6c9018ff/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/6c9018ff/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 8acca6f..061f06e 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
@@ -196,12 +196,12 @@ public class UserTO extends AnyTO implements 
GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public RelationshipTO getRelationship(final String type, final String 
rightKey) {
+    public RelationshipTO getRelationship(final String type, final String 
otherKey) {
         return IterableUtils.find(relationships, new 
Predicate<RelationshipTO>() {
 
             @Override
-            public boolean evaluate(final RelationshipTO object) {
-                return type.equals(object.getType()) && 
rightKey.equals(object.getRightKey());
+            public boolean evaluate(final RelationshipTO relationship) {
+                return type.equals(relationship.getType()) && 
otherKey.equals(relationship.getOtherEndKey());
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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/6c9018ff/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 1c2aaf4..cab4a22 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
@@ -45,9 +45,11 @@ import 
org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 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.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
@@ -177,13 +179,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/6c9018ff/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 a2a41fa..1612db4 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
@@ -122,19 +122,6 @@ public abstract class AbstractGroupableRelatable<
     }
 
     @Override
-    public REL getRelationship(final RelationshipType relationshipType, final 
String otherEndKey) {
-        return IterableUtils.find(getRelationships(), new Predicate<REL>() {
-
-            @Override
-            public boolean evaluate(final REL relationship) {
-                return otherEndKey != null && 
otherEndKey.equals(relationship.getRightEnd().getKey())
-                        && ((relationshipType == null && 
relationship.getType() == null)
-                        || (relationshipType != null && 
relationshipType.equals(relationship.getType())));
-            }
-        });
-    }
-
-    @Override
     public Collection<? extends REL> getRelationships(final RelationshipType 
relationshipType) {
         return CollectionUtils.select(getRelationships(), new Predicate<REL>() 
{
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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..16f94e5 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
@@ -33,8 +33,11 @@ import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
 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 +155,20 @@ public class JPAAnyObject
     }
 
     @Override
+    public ARelationship getRelationship(final RelationshipType 
relationshipType, final String otherEndKey) {
+        return IterableUtils.find(getRelationships(), new 
Predicate<ARelationship>() {
+
+            @Override
+            public boolean evaluate(final ARelationship relationship) {
+                return relationshipType.equals(relationship.getType())
+                        && otherEndKey != null
+                        && 
(otherEndKey.equals(relationship.getLeftEnd().getKey())
+                        || 
otherEndKey.equals(relationship.getRightEnd().getKey()));
+            }
+        });
+    }
+
+    @Override
     public List<? extends ARelationship> getRelationships() {
         return relationships;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 0dddb77..15407d9 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
@@ -46,6 +46,8 @@ import javax.validation.Valid;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
@@ -58,6 +60,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 +514,18 @@ public class JPAUser
     }
 
     @Override
+    public URelationship getRelationship(final RelationshipType 
relationshipType, final String otherEndKey) {
+        return IterableUtils.find(getRelationships(), new 
Predicate<URelationship>() {
+
+            @Override
+            public boolean evaluate(final URelationship relationship) {
+                return relationshipType.equals(relationship.getType())
+                        && otherEndKey != null && 
otherEndKey.equals(relationship.getRightEnd().getKey());
+            }
+        });
+    }
+
+    @Override
     public List<? extends URelationship> getRelationships() {
         return relationships;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 59bef19..3463de3 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1167,7 +1167,7 @@ under the License.
         pullMode="INCREMENTAL" unmatchingRule="ASSIGN" matchingRule="UPDATE" 
active="1"/>
   <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;te...@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;te...@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/6c9018ff/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 5b8d693..8e2b83c 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
@@ -65,9 +65,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.group.Group;
 import 
org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.Item;
@@ -588,10 +586,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/6c9018ff/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 0173d5b..f5cca66 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
@@ -47,10 +47,12 @@ import 
org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+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.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.RelationshipType;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
@@ -105,13 +107,17 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
             
anyObjectTO.getDynRealms().addAll(userDAO.findDynRealms(anyObject.getKey()));
 
             // relationships
-            CollectionUtils.collect(anyObject.getRelationships(), new 
Transformer<ARelationship, RelationshipTO>() {
+            
CollectionUtils.collect(anyObjectDAO.findAllRelationships(anyObject), 
+                    new Transformer<Relationship<Any<?>, Any<?>>, 
RelationshipTO>() {
 
                 @Override
-                public RelationshipTO transform(final ARelationship 
relationship) {
-                    return 
AnyObjectDataBinderImpl.this.getRelationshipTO(relationship);
+                public RelationshipTO transform(final Relationship<Any<?>, 
Any<?>> relationship) {
+                    return getRelationshipTO(
+                            relationship.getType().getKey(),
+                            
relationship.getLeftEnd().getKey().equals(anyObject.getKey())
+                            ? relationship.getRightEnd()
+                            : relationship.getLeftEnd());
                 }
-
             }, anyObjectTO.getRelationships());
 
             // memberships
@@ -180,19 +186,19 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
         if (anyObject.getRealm() != null) {
             // relationships
             for (RelationshipTO relationshipTO : 
anyObjectTO.getRelationships()) {
-                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) {
@@ -218,12 +224,12 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
 
             // memberships
             for (MembershipTO membershipTO : anyObjectTO.getMemberships()) {
-                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);
@@ -290,26 +296,27 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
                     LOG.debug("Ignoring invalid relationship type {}", 
patch.getRelationshipTO().getType());
                 } else {
                     ARelationship relationship =
-                            anyObject.getRelationship(relationshipType, 
patch.getRelationshipTO().getRightKey());
+                            anyObject.getRelationship(relationshipType, 
patch.getRelationshipTO().getOtherEndKey());
                     if (relationship != null) {
                         anyObject.getRelationships().remove(relationship);
                         relationship.setLeftEnd(null);
+                        relationship.setRightEnd(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())) {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 0f47f70..4b3c517 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
@@ -214,9 +214,9 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
         if (user.getRealm() != null) {
             // relationships
             for (RelationshipTO relationshipTO : userTO.getRelationships()) {
-                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) {
@@ -241,12 +241,12 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
 
             // memberships
             for (MembershipTO membershipTO : userTO.getMemberships()) {
-                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);
@@ -388,16 +388,16 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
                     LOG.debug("Ignoring invalid relationship type {}", 
patch.getRelationshipTO().getType());
                 } else {
                     URelationship relationship =
-                            user.getRelationship(relationshipType, 
patch.getRelationshipTO().getRightKey());
+                            user.getRelationship(relationshipType, 
patch.getRelationshipTO().getOtherEndKey());
                     if (relationship != null) {
                         user.getRelationships().remove(relationship);
                         relationship.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())) {
                             relationship = 
entityFactory.newEntity(URelationship.class);
                             relationship.setType(relationshipType);
@@ -623,9 +623,8 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
 
                 @Override
                 public RelationshipTO transform(final URelationship 
relationship) {
-                    return 
UserDataBinderImpl.this.getRelationshipTO(relationship);
+                    return getRelationshipTO(relationship.getType().getKey(), 
relationship.getRightEnd());
                 }
-
             }, userTO.getRelationships());
 
             // memberships

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 2e4314d..5ab0e78 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());
+                        UMembership actualMemb = 
user.getMembership(memb.getGroupKey());
                         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/6c9018ff/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 ef47ef1..2b342af 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
@@ -109,7 +109,7 @@ public class TemplateUtils {
 
     private void fillRelationships(final GroupableRelatableTO any, final 
GroupableRelatableTO template) {
         for (RelationshipTO relationship : template.getRelationships()) {
-            if (any.getRelationship(relationship.getRightKey(), 
relationship.getRightKey()) == null) {
+            if (any.getRelationship(relationship.getType(), 
relationship.getOtherEndKey()) == null) {
                 any.getRelationships().add(relationship);
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 9bcea18..09c7638 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
@@ -31,9 +31,9 @@ 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.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
+import org.apache.syncope.core.persistence.api.entity.Relationship;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
-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;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
@@ -120,7 +120,7 @@ public class ElasticsearchUtils {
 
             List<Object> relationships = new ArrayList<>();
             List<Object> relationshipTypes = new ArrayList<>();
-            for (ARelationship relationship : 
anyObjectDAO.findAllRelationships(anyObject)) {
+            for (Relationship<Any<?>, Any<?>> relationship : 
anyObjectDAO.findAllRelationships(anyObject)) {
                 relationships.add(relationship.getRightEnd().getKey());
                 relationshipTypes.add(relationship.getType().getKey());
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6c9018ff/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 0a46f15..9736940 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/6c9018ff/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 40bebc4..6436f54 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
@@ -245,7 +245,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/6c9018ff/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 8de8265..f6cb707 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
@@ -79,7 +79,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
@@ -159,7 +159,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());
 

Reply via email to