+ public void drop(DropTargetEvent event) {
+ String newUserName = (String) event.data;
+ Role role = myUserAdmin.getRole(newUserName);
+ // TODO this check should be done before.
+ if (role.getType() == Role.USER) {
+ // TODO check if the user is already member of this group
+ // we expect here that there is already a begun transaction
+ // TODO implement the dirty state
+ editor.beginTransactionIfNeeded();
+ User user = (User) role;
+ myGroup.addMember(user);
+ } else if (role.getType() == Role.GROUP) {
+ Group newGroup = (Group) role;
+
+ Shell shell = getViewer().getControl().getShell();
+ // Sanity checks
+ if (myGroup == newGroup) { // Equality
+
+ MessageDialog.openError(shell, "Forbidden addition ",
+ "A group cannot be a member of itself.");
+ return;
+ }
+
+ // Cycle
+ String myName = myGroup.getName();
+ List<User> myMemberships = editor.getFlatGroups(myGroup);
+ if (myMemberships.contains(newGroup)) {
+ MessageDialog.openError(shell, "Forbidden addition: cycle",
+ "Cannot add " + newUserName + " to group " + myName
+ + ". This would create a cycle");
+ return;
+ }
+
+ // Already member
+ List<User> newGroupMemberships = editor.getFlatGroups(newGroup);
+ if (newGroupMemberships.contains(myGroup)) {
+ MessageDialog.openError(shell, "Forbidden addition",
+ "Cannot add " + newUserName + " to group " + myName
+ + ", this membership already exists");
+ return;
+ }
+
+ editor.beginTransactionIfNeeded();
+ // TODO implement the dirty state
+ myGroup.addMember(newGroup);
+ }
+ super.drop(event);