Use display name to add a user to a group
authorChristos KK Loverdos <loverdos@gmail.com>
Fri, 8 Feb 2013 13:42:02 +0000 (15:42 +0200)
committerChristos KK Loverdos <loverdos@gmail.com>
Fri, 8 Feb 2013 13:59:19 +0000 (15:59 +0200)
13 files changed:
src/gr/grnet/pithos/web/client/AddUserDialog.java
src/gr/grnet/pithos/web/client/FilePropertiesDialog.java
src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java
src/gr/grnet/pithos/web/client/PermissionsAddDialog.java
src/gr/grnet/pithos/web/client/PermissionsList.java
src/gr/grnet/pithos/web/client/Pithos.java
src/gr/grnet/pithos/web/client/catalog/UpdateUserCatalogs.java
src/gr/grnet/pithos/web/client/catalog/UserCatalogs.java
src/gr/grnet/pithos/web/client/commands/RemoveUserCommand.java
src/gr/grnet/pithos/web/client/grouptree/Group.java
src/gr/grnet/pithos/web/client/grouptree/GroupTreeViewModel.java
src/gr/grnet/pithos/web/client/grouptree/User.java
src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java

index 407dfe7..cf3ed6f 100644 (file)
@@ -45,10 +45,14 @@ import com.google.gwt.http.client.Response;
 import com.google.gwt.http.client.URL;\r
 import com.google.gwt.user.client.Event.NativePreviewEvent;\r
 import com.google.gwt.user.client.ui.*;\r
+import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;\r
+import gr.grnet.pithos.web.client.catalog.UserCatalogs;\r
 import gr.grnet.pithos.web.client.grouptree.Group;\r
 import gr.grnet.pithos.web.client.rest.PostRequest;\r
 import gr.grnet.pithos.web.client.rest.RestException;\r
 \r
+import java.util.Arrays;\r
+\r
 /**\r
  * The 'Folder properties' dialog box implementation.\r
  */\r
@@ -60,7 +64,7 @@ public class AddUserDialog extends DialogBox {
     /**\r
      * The widget that holds the folderName of the folder.\r
      */\r
-    TextBox userName = new TextBox();\r
+    TextBox userNameInput = new TextBox();\r
 \r
     final VerticalPanel inner;\r
 \r
@@ -101,7 +105,7 @@ public class AddUserDialog extends DialogBox {
         FlexTable generalTable = new FlexTable();\r
         generalTable.setText(0, 0, "Username");\r
 \r
-        generalTable.setWidget(0, 1, userName);\r
+        generalTable.setWidget(0, 1, userNameInput);\r
 \r
         generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
         generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");\r
@@ -131,7 +135,7 @@ public class AddUserDialog extends DialogBox {
     @Override\r
     public void center() {\r
         super.center();\r
-        userName.setFocus(true);\r
+        userNameInput.setFocus(true);\r
     }\r
 \r
     @Override\r
@@ -165,20 +169,8 @@ public class AddUserDialog extends DialogBox {
         hide();\r
     }\r
 \r
-    /**\r
-     * Generate an RPC request to create a new folder.\r
-     */\r
-    void addUser() {\r
-        String name = userName.getText().trim();\r
-        if(name.length() == 0) {\r
-            return;\r
-        }\r
-        if(!Const.EMAIL_REGEX.test(name)) {\r
-            app.displayWarning("Username must be a valid email address");\r
-            return;\r
-        }\r
-\r
-        group.addMember(name);\r
+    private void doAddUser(final String userID) {\r
+        group.addMember(userID);\r
         String path = "?update=";\r
         PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {\r
 \r
@@ -212,4 +204,33 @@ public class AddUserDialog extends DialogBox {
         updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), groupMembers);\r
         Scheduler.get().scheduleDeferred(updateGroup);\r
     }\r
+    /**\r
+     * Generate an RPC request to create a new folder.\r
+     */\r
+    void addUser() {\r
+        final String userDisplayName = userNameInput.getText().trim();\r
+        if(userDisplayName.length() == 0) {\r
+            return;\r
+        }\r
+        if(!Const.EMAIL_REGEX.test(userDisplayName)) {\r
+            app.displayWarning("Username must be a valid email address");\r
+            return;\r
+        }\r
+\r
+        if(app.hasIDForUserDisplayName(userDisplayName)) {\r
+            final String userID = app.getIDForUserDisplayName(userDisplayName);\r
+            doAddUser(userID);\r
+        }\r
+        else {\r
+            new UpdateUserCatalogs(app, null, Arrays.asList(userDisplayName)) {\r
+                @Override\r
+                public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {\r
+                    final String userID = app.getIDForUserDisplayName(userDisplayName);\r
+                    doAddUser(userID);\r
+                }\r
+            }.scheduleDeferred();\r
+        }\r
+\r
+\r
+    }\r
 }\r
index 4161b90..7f324db 100644 (file)
@@ -141,7 +141,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
         }\r
 \r
         final String ownerID = file.getOwnerID();\r
-        final String displayName = app.getUserDisplayNameForID(ownerID);\r
+        final String displayName = app.getDisplayNameForUserID(ownerID);\r
         final String ownerDisplayName;\r
         if(displayName == null) {\r
             // FIXME: Get the actual display name and do not use the id\r
index e2f1def..ff1dabf 100644 (file)
@@ -136,7 +136,7 @@ public class FolderPropertiesDialog extends DialogBox {
         }\r
         else {\r
             final String ownerID = folder.getOwnerID();\r
-            final String displayName = app.getUserDisplayNameForID(ownerID);\r
+            final String displayName = app.getDisplayNameForUserID(ownerID);\r
             final String ownerDisplayName;\r
             if(displayName == null) {\r
                 // FIXME: Get the actual display name and do not use the id\r
index ffd3701..c69c739 100644 (file)
  */
 package gr.grnet.pithos.web.client;
 
-import com.google.gwt.http.client.Request;
-import com.google.gwt.http.client.Response;
-import com.google.gwt.json.client.JSONObject;
-import gr.grnet.pithos.web.client.catalog.GetUserCatalogs;
 import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
 import gr.grnet.pithos.web.client.catalog.UserCatalogs;
 import gr.grnet.pithos.web.client.grouptree.Group;
@@ -179,7 +175,7 @@ public class PermissionsAddDialog extends DialogBox {
         }
 
         // Now get the userID
-        final String userID = app.getUserIDForDisplayName(userDisplayName);
+        final String userID = app.getIDForUserDisplayName(userDisplayName);
         if(userID != null) {
             // Check if already have the permission
             if(!alreadyHasPermission(userID)) {
@@ -191,7 +187,7 @@ public class PermissionsAddDialog extends DialogBox {
             new UpdateUserCatalogs(app, null, Helpers.toList(userDisplayName)) {
                 @Override
                 public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
-                    final String userID = updatedUserCatalogs.getUserID(userDisplayName);
+                    final String userID = updatedUserCatalogs.getID(userDisplayName);
                     if(userID == null) {
                         app.displayWarning("Unknown user " + userDisplayName);
                     }
index 2c8c40c..b1461d8 100644 (file)
@@ -34,9 +34,6 @@
  */
 package gr.grnet.pithos.web.client;
 
-import com.google.gwt.http.client.Request;
-import com.google.gwt.http.client.Response;
-import com.google.gwt.json.client.JSONObject;
 import gr.grnet.pithos.web.client.FilePermissionsDialog.Images;
 
 import java.util.HashMap;
@@ -49,14 +46,11 @@ import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.AbstractImagePrototype;
 import com.google.gwt.user.client.ui.Anchor;
-import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.FlexTable;
 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.PushButton;
 import com.google.gwt.user.client.ui.RadioButton;
 import com.google.gwt.user.client.ui.VerticalPanel;
-import gr.grnet.pithos.web.client.catalog.GetUserCatalogs;
 import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
 import gr.grnet.pithos.web.client.catalog.UserCatalogs;
 
@@ -134,7 +128,7 @@ public class PermissionsList extends Composite {
                for(final String userID : permissions.keySet()) {
             if (!userID.contains(":")) {
                  //not a group
-                final String displayName = app.getUserDisplayNameForID(userID);
+                final String displayName = app.getDisplayNameForUserID(userID);
                 if(displayName != null) {
                     permTable.setHTML(
                         i,
index 16eef94..40b0d05 100644 (file)
@@ -129,25 +129,29 @@ public class Pithos implements EntryPoint, ResizeHandler {
         return displayName == null ? getUserID() : displayName;
     }
 
-    public boolean hasUserDisplayNameForID(String userID) {
+    public boolean hasDisplayNameForUserID(String userID) {
         return userCatalogs.getDisplayName(userID) != null;
     }
 
-    public String getUserDisplayNameForID(String userID) {
+    public boolean hasIDForUserDisplayName(String userDisplayName) {
+        return userCatalogs.getID(userDisplayName) != null;
+    }
+
+    public String getDisplayNameForUserID(String userID) {
         return userCatalogs.getDisplayName(userID);
     }
 
-    public String getUserIDForDisplayName(String displayName) {
-        return userCatalogs.getUserID(displayName);
+    public String getIDForUserDisplayName(String userDisplayName) {
+        return userCatalogs.getID(userDisplayName);
     }
 
-    public List<String> getUserDisplayNamesForIDs(List<String> userIDs) {
+    public List<String> getDisplayNamesForUserIDs(List<String> userIDs) {
         if(userIDs == null) {
             userIDs = new ArrayList<String>();
         }
         final List<String> userDisplayNames = new ArrayList<String>();
         for(String userID : userIDs) {
-            final String displayName = getUserDisplayNameForID(userID);
+            final String displayName = getDisplayNameForUserID(userID);
             userDisplayNames.add(displayName);
         }
 
@@ -332,9 +336,9 @@ public class Pithos implements EntryPoint, ResizeHandler {
       }
     }-*/;
 
-    public static void LOG(String ...args) {
+    public static void LOG(Object ...args) {
         final StringBuilder sb = new StringBuilder();
-        for(String arg : args) {
+        for(Object arg : args) {
             sb.append(arg);
         }
         if(sb.length() > 0) {
@@ -710,13 +714,26 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
         GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, getApiPath(), userID, path) {
             @Override
-            public void onSuccess(AccountResource _result) {
-                account = _result;
+            public void onSuccess(AccountResource accountResource) {
+                account = accountResource;
                 if(callback != null) {
                     callback.execute();
                 }
+
+                final List<String> memberIDs = new ArrayList<String>();
+                final List<Group> groups = account.getGroups();
+                for(Group group : groups) {
+                    LOG("Group ", group);
+                    for(String member: group.getMembers()) {
+                        LOG("      ", member);
+                        memberIDs.add(member);
+                    }
+                }
+
+                final List<String> theUnknown = Pithos.this.filterUserIDsWithUnknownDisplayName(memberIDs);
                 // Initialize the user catalog
-                new UpdateUserCatalogs(Pithos.this, Pithos.this.getUserID()).scheduleDeferred();
+                new UpdateUserCatalogs(Pithos.this, theUnknown).scheduleEntry();
+                LOG("Called new UpdateUserCatalogs(Pithos.this, theUnknown).scheduleDeferred();");
             }
 
             @Override
index 8640ae2..5e46d61 100644 (file)
@@ -7,7 +7,9 @@ import com.google.gwt.json.client.JSONObject;
 import gr.grnet.pithos.web.client.Helpers;
 import gr.grnet.pithos.web.client.Pithos;
 
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This is a wrapper around GetUserCatalogs that takes care of updating
@@ -30,6 +32,9 @@ public class UpdateUserCatalogs implements Scheduler.ScheduledCommand {
     }
 
     public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
+        for(Map.Entry<String, String> uc : requestedUserCatalogs) {
+            app.LOG("New displayName ", uc.getValue());
+        }
     }
 
     public void onError(Request request, Throwable t) {
@@ -60,4 +65,8 @@ public class UpdateUserCatalogs implements Scheduler.ScheduledCommand {
     public void scheduleDeferred() {
         Scheduler.get().scheduleDeferred(this);
     }
+
+    public void scheduleEntry() {
+        Scheduler.get().scheduleEntry(this);
+    }
 }
index 7a58247..b29aaef 100644 (file)
@@ -45,22 +45,25 @@ public class UserCatalogs implements Iterable<Map.Entry<String, String>>{
         );
     }
 
-    public boolean hasID(String id) {
-        return id2name.containsKey(id);
+    public boolean hasID(String userID) {
+        return id2name.containsKey(userID);
     }
 
-    public boolean hasName(String name) {
-        return name2id.containsKey(name);
+    public boolean hasDisplayName(String displayName) {
+        return name2id.containsKey(displayName);
     }
 
-    public String getDisplayName(String id) {
-        return id2name.get(id);
+    public String getDisplayName(String userID) {
+        return id2name.get(userID);
     }
 
-    public String getUserID(String name) {
-        return name2id.get(name);
+    public String getID(String displayName) {
+        return name2id.get(displayName);
     }
 
+    /**
+     * Returns an iterator of <code>(UUID, DisplayName)</code> pairs.
+     */
     @Override
     public Iterator<Map.Entry<String, String>> iterator() {
         return id2name.entrySet().iterator();
index 0edfb9c..62f84b8 100644 (file)
@@ -76,7 +76,7 @@ public class RemoveUserCommand implements Command {
        final Group group = app.getAccount().getGroup(groupName);
        if (group == null)
                return;
-       group.removeMember(user.getName());
+       group.removeMember(user.getUserID());
        String path = "?update=";
        PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {
                        
index d367048..5717604 100644 (file)
@@ -62,4 +62,9 @@ public class Group {
        public void removeMember(String username) {
                members.remove(username);
        }
+
+    @Override
+    public String toString() {
+        return "Group(" + name + ", " + members.size() + " members)";
+    }
 }
index ea3f05c..e2cda8f 100644 (file)
@@ -86,7 +86,7 @@ public class GroupTreeViewModel implements TreeViewModel {
                public void render(Context context,     User value, SafeHtmlBuilder sb) {
             String html = AbstractImagePrototype.create(GroupTreeView.images.user()).getHTML();
             sb.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
-            sb.append(Templates.INSTANCE.nameSpan(value.getName()));
+            sb.append(Templates.INSTANCE.nameSpan(value.getUserID()));
                }
 
         @Override
index 067fbd2..fe5e35c 100644 (file)
 package gr.grnet.pithos.web.client.grouptree;
 
 
-public class User {
-    private String name;
-    
-    private String group;
-
-    public User(String _name, String _group) {
-        name = _name;
-        group = _group;
+public final class User {
+    private final String userID;
+
+    private final String group;
+
+    public User(String name, String group) {
+        this.userID = name;
+        this.group = group;
+    }
+
+    public String getUserID() {
+        return this.userID;
+    }
+
+    public String getGroup() {
+        return this.group;
     }
 
-    public String getName() {
-        return name;
+    @Override
+    public boolean equals(Object o) {
+        if(this == o) {
+            return true;
+        }
+        if(o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        User user = (User) o;
+
+        if(group != null ? !group.equals(user.group) : user.group != null) {
+            return false;
+        }
+        if(userID != null ? !userID.equals(user.userID) : user.userID != null) {
+            return false;
+        }
+
+        return true;
     }
 
-       public String getGroup() {
-               return group;
-       }
+    @Override
+    public int hashCode() {
+        int result = userID != null ? userID.hashCode() : 0;
+        result = 31 * result + (group != null ? group.hashCode() : 0);
+        return result;
+    }
 }
index 1879b89..f66e75c 100644 (file)
@@ -45,7 +45,6 @@ import com.google.gwt.event.dom.client.ContextMenuEvent;
 import com.google.gwt.http.client.Request;
 import com.google.gwt.http.client.Response;
 import com.google.gwt.http.client.URL;
-import com.google.gwt.json.client.JSONObject;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.text.shared.SafeHtmlRenderer;
@@ -57,7 +56,6 @@ import com.google.gwt.view.client.TreeViewModel;
 import gr.grnet.pithos.web.client.FolderContextMenu;
 import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.SharingUsers;
-import gr.grnet.pithos.web.client.catalog.GetUserCatalogs;
 import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
 import gr.grnet.pithos.web.client.catalog.UserCatalogs;
 import gr.grnet.pithos.web.client.foldertree.AccountResource;
@@ -127,7 +125,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
             return new DefaultNodeInfo<String>(userLevelDataProviderForIDs, new TextCell(new SafeHtmlRenderer<String>() {
                 @Override
                 public SafeHtml render(String object) {
-                    final String displayName = app.getUserDisplayNameForID(object);
+                    final String displayName = app.getDisplayNameForUserID(object);
 //                    LOG("render(userID = "+object+"), displayName = " + displayName);
                     SafeHtmlBuilder builder = new SafeHtmlBuilder();
                     render(displayName, builder);
@@ -141,7 +139,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
                         String html = AbstractImagePrototype.create(OtherSharedTreeView.images.myShared()).getHTML();
                         builder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
                     }
-                    final String displayName = app.getUserDisplayNameForID(object);
+                    final String displayName = app.getDisplayNameForUserID(object);
                     builder.append(OtherSharedTreeView.Templates.INSTANCE.nameSpan(object));
                 }
             }), null, null);