Work in progress. Do not rely on this commit
authorChristos KK Loverdos <loverdos@gmail.com>
Thu, 7 Feb 2013 17:47:36 +0000 (19:47 +0200)
committerChristos KK Loverdos <loverdos@gmail.com>
Thu, 7 Feb 2013 17:47:36 +0000 (19:47 +0200)
35 files changed:
src/gr/grnet/pithos/web/client/AddUserDialog.java
src/gr/grnet/pithos/web/client/Const.java
src/gr/grnet/pithos/web/client/DeleteFileDialog.java
src/gr/grnet/pithos/web/client/FeedbackDialog.java
src/gr/grnet/pithos/web/client/FilePermissionsDialog.java
src/gr/grnet/pithos/web/client/FilePropertiesDialog.java
src/gr/grnet/pithos/web/client/FilePublishDialog.java
src/gr/grnet/pithos/web/client/FileVersionsDialog.java
src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java
src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java
src/gr/grnet/pithos/web/client/GroupCreateDialog.java
src/gr/grnet/pithos/web/client/PermissionsList.java
src/gr/grnet/pithos/web/client/Pithos.java
src/gr/grnet/pithos/web/client/Resource.java
src/gr/grnet/pithos/web/client/VersionsList.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/DeleteGroupCommand.java
src/gr/grnet/pithos/web/client/commands/PasteCommand.java
src/gr/grnet/pithos/web/client/commands/RemoveUserCommand.java
src/gr/grnet/pithos/web/client/commands/RestoreTrashCommand.java
src/gr/grnet/pithos/web/client/commands/ToTrashCommand.java
src/gr/grnet/pithos/web/client/foldertree/AccountResource.java
src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.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/mysharedtree/MysharedTreeViewModel.java
src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java
src/gr/grnet/pithos/web/client/rest/DeleteRequest.java
src/gr/grnet/pithos/web/client/rest/GetRequest.java
src/gr/grnet/pithos/web/client/rest/HeadRequest.java
src/gr/grnet/pithos/web/client/rest/PostRequest.java
src/gr/grnet/pithos/web/client/rest/PutRequest.java
src/gr/grnet/pithos/web/client/tagtree/TagTreeViewModel.java

index 407dfe7..9dcffd1 100644 (file)
@@ -45,7 +45,10 @@ 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.grouptree.User;\r
 import gr.grnet.pithos.web.client.rest.PostRequest;\r
 import gr.grnet.pithos.web.client.rest.RestException;\r
 \r
@@ -60,7 +63,7 @@ public class AddUserDialog extends DialogBox {
     /**\r
      * The widget that holds the folderName of the folder.\r
      */\r
-    TextBox userName = new TextBox();\r
+    TextBox userDisplayNameTextBox = new TextBox();\r
 \r
     final VerticalPanel inner;\r
 \r
@@ -101,7 +104,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, userDisplayNameTextBox);\r
 \r
         generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
         generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");\r
@@ -131,7 +134,7 @@ public class AddUserDialog extends DialogBox {
     @Override\r
     public void center() {\r
         super.center();\r
-        userName.setFocus(true);\r
+        userDisplayNameTextBox.setFocus(true);\r
     }\r
 \r
     @Override\r
@@ -169,19 +172,43 @@ public class AddUserDialog extends DialogBox {
      * 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
+        final String userDisplayName = userDisplayNameTextBox.getText().trim();\r
+        if(userDisplayName.length() == 0) {\r
             return;\r
         }\r
-        if(!Const.EMAIL_REGEX.test(name)) {\r
+        if(!Const.EMAIL_REGEX.test(userDisplayName)) {\r
             app.displayWarning("Username must be a valid email address");\r
             return;\r
         }\r
 \r
-        group.addMember(name);\r
-        String path = "?update=";\r
-        PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {\r
+        // Now get the userID\r
+        final String userID = app.getUserIDForDisplayName(userDisplayName);\r
+        if(userID != null) {\r
+            doAddUser(userID, userDisplayName);\r
+        }\r
+        else {\r
+            // Must call server to obtain userID\r
+            new UpdateUserCatalogs(app, null, Helpers.toList(userDisplayName)) {\r
+                @Override\r
+                public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {\r
+                    final String userID = updatedUserCatalogs.getUserID(userDisplayName);\r
+                    if(userID != null) {\r
+                        doAddUser(userID, userDisplayName);\r
+                    }\r
+                    else {\r
+                        app.displayError("Unknown user " + userDisplayName);\r
+                    }\r
+                }\r
+            }.scheduleDeferred();\r
+        }\r
+    }\r
 \r
+    private void doAddUser(String userID, String userDisplayName) {\r
+        final User newUser = new User(userID, userDisplayName, group.getName());\r
+        app.LOG("doAddUser() ", newUser);\r
+        group.addUser(newUser);\r
+        final String path = "?update=";\r
+        PostRequest updateGroup = new PostRequest(app, app.getApiPath(), app.getUserID(), path) {\r
             @Override\r
             public void onSuccess(Resource result) {\r
                 app.updateGroupNode(group);\r
@@ -205,10 +232,7 @@ public class AddUserDialog extends DialogBox {
             }\r
         };\r
         updateGroup.setHeader(Const.X_AUTH_TOKEN, app.getUserToken());\r
-        String groupMembers = "";\r
-        for(String u : group.getMembers()) {\r
-            groupMembers += (URL.encodePathSegment(u) + ",");\r
-        }\r
+        final String groupMembers = group.encodeUserIDsForXAccountGroup();\r
         updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), groupMembers);\r
         Scheduler.get().scheduleDeferred(updateGroup);\r
     }\r
index f87dd3c..11589cc 100644 (file)
@@ -23,6 +23,13 @@ public class Const {
     public static final String TRASH_CONTAINER = "trash";
     public static final RegExp EMAIL_REGEX = RegExp.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+[.][A-Z]{2,4}$", "i");
     public static final String X_ACCOUNT_GROUP_ = "X-Account-Group-";
+    public static final String X_ACCOUNT_CONTAINER_COUNT = "X-Account-Container-Count";
+    public static final String X_ACCOUNT_OBJECT_COUNT = "X-Account-Object-Count";
+    public static final String X_ACCOUNT_BYTES_USED = "X-Account-Bytes-Used";
+    public static final String X_ACCOUNT_POLICY_QUOTA = "X-Account-Policy-Quota";
+    public static final String X_ACCOUNT_LAST_LOGIN = "X-Account-Last-Login";
+    public static final String LAST_MODIFIED = "Last-Modified";
+    public static final String NUMBER_FORMAT_1 = "######.#";
 
     private Const() {}
 
index ffbacdd..dfecfab 100644 (file)
@@ -135,7 +135,7 @@ public class DeleteFileDialog extends DialogBox {
         if (iter.hasNext()) {\r
             File f = iter.next();\r
             String path = f.getUri();\r
-            DeleteRequest deleteFile = new DeleteRequest(app.getApiPath(), f.getOwnerID(), URL.encode(path)) {\r
+            DeleteRequest deleteFile = new DeleteRequest(app, app.getApiPath(), f.getOwnerID(), URL.encode(path)) {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
                     deleteFile(iter);\r
index 0461def..5c85235 100644 (file)
@@ -140,7 +140,7 @@ public class FeedbackDialog extends DialogBox {
      */
     void sendFeedback() {
         final String feedbackURL = otherProperties.get("feedbackUrl");
-        PostRequest sendFeedback = new PostRequest("", "", feedbackURL, "feedback_msg=" + msg.getText() + "&feedback_data=" + appData + "&auth=" + app.getUserToken()) {
+        PostRequest sendFeedback = new PostRequest(app, "", "", feedbackURL, "feedback_msg=" + msg.getText() + "&feedback_data=" + appData + "&auth=" + app.getUserToken()) {
 
             @Override
             protected void onUnauthorized(Response response) {
index 49a9a9a..dac21b9 100644 (file)
@@ -262,10 +262,10 @@ public class FilePermissionsDialog extends AbstractPropertiesDialog {
 \r
        protected void updateMetaData(String api, String owner, final String path, final Map<String, Boolean[]> newPermissions) {\r
         if (newPermissions != null) {\r
-            PostRequest updateFile = new PostRequest(api, owner, path) {\r
+            PostRequest updateFile = new PostRequest(app, api, owner, path) {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
-                       HeadRequest<File> headFile = new HeadRequest<File>(File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
+                       HeadRequest<File> headFile = new HeadRequest<File>(app, File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
 \r
                                                @Override\r
                                                public void onSuccess(File _result) {\r
index 4161b90..6bb542f 100644 (file)
@@ -261,7 +261,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
 \r
         if (newFilename != null) {\r
             final String path = file.getParent().getUri() + "/" + newFilename;\r
-            PutRequest updateFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {\r
+            PutRequest updateFile = new PutRequest(app, app.getApiPath(), app.getUserID(), path) {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
                     updateMetaData(app.getApiPath(), file.getOwnerID(), path, newMeta);\r
@@ -319,7 +319,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
 \r
        protected void updateMetaData(final String api, final String owner, final String path, Map<String, String> newMeta) {\r
         if (newMeta != null) {\r
-            PostRequest updateFile = new PostRequest(api, owner, path + "?update=") {\r
+            PostRequest updateFile = new PostRequest(app, api, owner, path + "?update=") {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
                        if (!app.isMySharedSelected())\r
index b074f01..eca3581 100644 (file)
@@ -230,10 +230,10 @@ public class FilePublishDialog extends AbstractPropertiesDialog {
 \r
        protected void updateMetaData(String api, String owner, final String path, final Boolean published) {\r
         if (published != null) {\r
-            PostRequest updateFile = new PostRequest(api, owner, path) {\r
+            PostRequest updateFile = new PostRequest(app, api, owner, path) {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
-                       HeadRequest<File> headFile = new HeadRequest<File>(File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
+                       HeadRequest<File> headFile = new HeadRequest<File>(app, File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
 \r
                                                @Override\r
                                                public void onSuccess(File _result) {\r
index 2a2fa79..ea5569f 100644 (file)
@@ -146,7 +146,7 @@ public class FileVersionsDialog extends AbstractPropertiesDialog {
 \r
     protected void fetchVersions() {\r
        String path = file.getUri() + "?format=json&version=list";\r
-       GetRequest<FileVersions> getVersions = new GetRequest<FileVersions>(FileVersions.class, app.getApiPath(), file.getOwnerID(), path) {\r
+       GetRequest<FileVersions> getVersions = new GetRequest<FileVersions>(app, FileVersions.class, app.getApiPath(), file.getOwnerID(), path) {\r
 \r
                        @Override\r
                        public void onSuccess(FileVersions _result) {\r
index 77389e7..18dfb24 100644 (file)
@@ -215,7 +215,7 @@ public class FolderPermissionsDialog extends DialogBox {
 \r
        protected void updateMetadata(final String path, final Map<String, Boolean[]> newPermissions) {\r
         if (newPermissions != null) {\r
-            PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwnerID(), path) {\r
+            PostRequest updateFolder = new PostRequest(app, app.getApiPath(), folder.getOwnerID(), path) {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
                     app.updateFolder(folder.getParent(), false, new Command() {\r
@@ -234,7 +234,7 @@ public class FolderPermissionsDialog extends DialogBox {
                     if (t instanceof RestException) {\r
                        if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { //Probably a virtual folder\r
                             final String path1 = folder.getUri();\r
-                            PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path1) {\r
+                            PutRequest newFolder = new PutRequest(app, app.getApiPath(), folder.getOwnerID(), path1) {\r
                                 @Override\r
                                 public void onSuccess(Resource result) {\r
                                        updateMetadata(path, newPermissions);\r
index e2f1def..9847b46 100644 (file)
@@ -249,7 +249,7 @@ public class FolderPropertiesDialog extends DialogBox {
             return;\r
         }\r
         String path = folder.getUri() + "/" + name;\r
-        PutRequest createFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path) {\r
+        PutRequest createFolder = new PutRequest(app, app.getApiPath(), folder.getOwnerID(), path) {\r
             @Override\r
             public void onSuccess(Resource result) {\r
                 app.updateFolder(folder, true, new Command() {\r
index 799cee0..b598679 100644 (file)
  */\r
 package gr.grnet.pithos.web.client;\r
 \r
-import gr.grnet.pithos.web.client.commands.AddUserCommand;\r
-import gr.grnet.pithos.web.client.foldertree.Folder;\r
-import gr.grnet.pithos.web.client.grouptree.Group;\r
-\r
 import com.google.gwt.dom.client.NativeEvent;\r
 import com.google.gwt.event.dom.client.ClickEvent;\r
 import com.google.gwt.event.dom.client.ClickHandler;\r
@@ -45,13 +41,9 @@ import com.google.gwt.event.dom.client.KeyCodes;
 import com.google.gwt.event.dom.client.KeyDownEvent;\r
 import com.google.gwt.user.client.Command;\r
 import com.google.gwt.user.client.Event.NativePreviewEvent;\r
-import com.google.gwt.user.client.ui.Anchor;\r
-import com.google.gwt.user.client.ui.Button;\r
-import com.google.gwt.user.client.ui.DialogBox;\r
-import com.google.gwt.user.client.ui.FlexTable;\r
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
-import com.google.gwt.user.client.ui.TextBox;\r
-import com.google.gwt.user.client.ui.VerticalPanel;\r
+import com.google.gwt.user.client.ui.*;\r
+import gr.grnet.pithos.web.client.commands.AddUserCommand;\r
+import gr.grnet.pithos.web.client.grouptree.Group;\r
 \r
 /**\r
  * The 'Folder properties' dialog box implementation.\r
@@ -61,56 +53,56 @@ public class GroupCreateDialog extends DialogBox {
     protected Pithos app;\r
 \r
     private Command callback;\r
-    \r
-       /**\r
-        * The widget that holds the folderName of the folder.\r
-        */\r
-       TextBox groupName = new TextBox();\r
-\r
-       final VerticalPanel inner;\r
-\r
-       public GroupCreateDialog(final Pithos app) {\r
-               this(app, null);\r
-       }\r
-       \r
-       /**\r
-        * The widget's constructor.\r
-        */\r
-       public GroupCreateDialog(final Pithos app, Command callback) {\r
+\r
+    /**\r
+     * The widget that holds the folderName of the folder.\r
+     */\r
+    TextBox groupNameTextBox = new TextBox();\r
+\r
+    final VerticalPanel inner;\r
+\r
+    public GroupCreateDialog(final Pithos app) {\r
+        this(app, null);\r
+    }\r
+\r
+    /**\r
+     * The widget's constructor.\r
+     */\r
+    public GroupCreateDialog(final Pithos app, Command callback) {\r
         this.app = app;\r
         this.callback = callback;\r
-        \r
-               Anchor close = new Anchor("close");\r
-               close.addStyleName("close");\r
-               close.addClickHandler(new ClickHandler() {\r
-                       \r
-                       @Override\r
-                       public void onClick(ClickEvent event) {\r
-                               hide();\r
-                       }\r
-               });\r
-\r
-               setGlassEnabled(true);\r
-               setStyleName("pithos-DialogBox");\r
-\r
-               // Enable IE selection for the dialog (must disable it upon closing it)\r
-               Pithos.enableIESelection();\r
-\r
-               // Use this opportunity to set the dialog's caption.\r
-               setText("Create group");\r
-\r
-               // Outer contains inner and buttons\r
-               VerticalPanel outer = new VerticalPanel();\r
-               outer.add(close);\r
-               // Inner contains generalPanel and permPanel\r
-               inner = new VerticalPanel();\r
-               inner.addStyleName("inner");\r
-\r
-               VerticalPanel generalPanel = new VerticalPanel();\r
+\r
+        Anchor close = new Anchor("close");\r
+        close.addStyleName("close");\r
+        close.addClickHandler(new ClickHandler() {\r
+\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                hide();\r
+            }\r
+        });\r
+\r
+        setGlassEnabled(true);\r
+        setStyleName("pithos-DialogBox");\r
+\r
+        // Enable IE selection for the dialog (must disable it upon closing it)\r
+        Pithos.enableIESelection();\r
+\r
+        // Use this opportunity to set the dialog's caption.\r
+        setText("Create group");\r
+\r
+        // Outer contains inner and buttons\r
+        VerticalPanel outer = new VerticalPanel();\r
+        outer.add(close);\r
+        // Inner contains generalPanel and permPanel\r
+        inner = new VerticalPanel();\r
+        inner.addStyleName("inner");\r
+\r
+        VerticalPanel generalPanel = new VerticalPanel();\r
         FlexTable generalTable = new FlexTable();\r
         generalTable.setText(0, 0, "Name");\r
 \r
-        generalTable.setWidget(0, 1, groupName);\r
+        generalTable.setWidget(0, 1, groupNameTextBox);\r
 \r
         generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
         generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");\r
@@ -120,69 +112,73 @@ public class GroupCreateDialog extends DialogBox {
 \r
         outer.add(inner);\r
 \r
-               // Create the 'Create/Update' button, along with a listener that hides the dialog\r
-               // when the button is clicked and quits the application.\r
-               String okLabel = "Create";\r
-               final Button ok = new Button(okLabel, new ClickHandler() {\r
-                       @Override\r
-                       public void onClick(ClickEvent event) {\r
-                               createGroup();\r
-                               closeDialog();\r
-                       }\r
-               });\r
-               ok.addStyleName("button");\r
-               outer.add(ok);\r
+        // Create the 'Create/Update' button, along with a listener that hides the dialog\r
+        // when the button is clicked and quits the application.\r
+        String okLabel = "Create";\r
+        final Button ok = new Button(okLabel, new ClickHandler() {\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                createGroup();\r
+                closeDialog();\r
+            }\r
+        });\r
+        ok.addStyleName("button");\r
+        outer.add(ok);\r
         outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);\r
 \r
         setWidget(outer);\r
-       }\r
-\r
-       @Override\r
-       public void center() {\r
-               super.center();\r
-               groupName.setFocus(true);\r
-       }\r
-\r
-       @Override\r
-       protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
-               super.onPreviewNativeEvent(preview);\r
-\r
-               NativeEvent evt = preview.getNativeEvent();\r
-               if (evt.getType().equals(KeyDownEvent.getType().getName()))\r
-                       // Use the popup's key preview hooks to close the dialog when either\r
-                       // enter or escape is pressed.\r
-                       switch (evt.getKeyCode()) {\r
-                               case KeyCodes.KEY_ENTER:\r
-                                       createGroup();\r
+    }\r
+\r
+    @Override\r
+    public void center() {\r
+        super.center();\r
+        groupNameTextBox.setFocus(true);\r
+    }\r
+\r
+    @Override\r
+    protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
+        super.onPreviewNativeEvent(preview);\r
+\r
+        NativeEvent evt = preview.getNativeEvent();\r
+        if(evt.getType().equals(KeyDownEvent.getType().getName()))\r
+        // Use the popup's key preview hooks to close the dialog when either\r
+        // enter or escape is pressed.\r
+        {\r
+            switch(evt.getKeyCode()) {\r
+                case KeyCodes.KEY_ENTER:\r
+                    createGroup();\r
+                    closeDialog();\r
+                    break;\r
+                case KeyCodes.KEY_ESCAPE:\r
                     closeDialog();\r
-                                       break;\r
-                               case KeyCodes.KEY_ESCAPE:\r
-                                       closeDialog();\r
-                                       break;\r
-                       }\r
-       }\r
-\r
-\r
-       /**\r
-        * Enables IE selection prevention and hides the dialog\r
-        * (we disable the prevention on creation of the dialog)\r
-        */\r
-       public void closeDialog() {\r
-               Pithos.preventIESelection();\r
-               hide();\r
-               if (callback != null)\r
-                       callback.execute();\r
-       }\r
-\r
-       /**\r
-        * Generate an RPC request to create a new folder.\r
-        */\r
-       void createGroup() {\r
-               String name = groupName.getText().trim();\r
-               if (name.length() == 0)\r
-                       return;\r
-               Group group = app.addGroup(name);\r
-               \r
-               new AddUserCommand(app, null, group).execute();\r
-       }\r
+                    break;\r
+            }\r
+        }\r
+    }\r
+\r
+\r
+    /**\r
+     * Enables IE selection prevention and hides the dialog\r
+     * (we disable the prevention on creation of the dialog)\r
+     */\r
+    public void closeDialog() {\r
+        Pithos.preventIESelection();\r
+        hide();\r
+        if(callback != null) {\r
+            callback.execute();\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Generate an RPC request to create a new folder.\r
+     */\r
+    void createGroup() {\r
+        final String groupName = groupNameTextBox.getText().trim();\r
+        if(groupName.length() == 0) {\r
+            return;\r
+        }\r
+        Group group = app.addGroup(groupName);\r
+\r
+        new AddUserCommand(app, null, group).execute();\r
+    }\r
 }\r
index 2c8c40c..4f3a26f 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;
 
@@ -146,7 +140,7 @@ public class PermissionsList extends Composite {
                     new UpdateUserCatalogs(app, userID) {
                         @Override
                         public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
-                            final String displayName = updatedUserCatalogs.getDisplayName(userID);
+                            final String displayName = updatedUserCatalogs.getUserDisplayName(userID);
                             permTable.setHTML(
                                 ii,
                                 0,
index 16eef94..bec05d5 100644 (file)
@@ -125,16 +125,20 @@ public class Pithos implements EntryPoint, ResizeHandler {
     }
 
     public String getCurrentUserDisplayNameOrID() {
-        final String displayName = userCatalogs.getDisplayName(getUserID());
+        final String displayName = userCatalogs.getUserDisplayName(getUserID());
         return displayName == null ? getUserID() : displayName;
     }
 
     public boolean hasUserDisplayNameForID(String userID) {
-        return userCatalogs.getDisplayName(userID) != null;
+        return userCatalogs.getUserDisplayName(userID) != null;
+    }
+
+    public boolean hasUserIDForDisplayName(String displayName) {
+        return userCatalogs.getUserID(displayName) != null;
     }
 
     public String getUserDisplayNameForID(String userID) {
-        return userCatalogs.getDisplayName(userID);
+        return userCatalogs.getUserDisplayName(userID);
     }
 
     public String getUserIDForDisplayName(String displayName) {
@@ -160,7 +164,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
         }
         final List<String> filtered = new ArrayList<String>();
         for(String userID : userIDs) {
-            if(!this.userCatalogs.hasID(userID)) {
+            if(!this.userCatalogs.hasUserID(userID)) {
                 filtered.add(userID);
             }
         }
@@ -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) {
@@ -549,7 +553,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
                     return true;
                 }
 
-                HeadRequest<Folder> head = new HeadRequest<Folder>(Folder.class, getApiPath(), f.getOwnerID(), "/" + f.getContainer()) {
+                HeadRequest<Folder> head = new HeadRequest<Folder>(Pithos.this, Folder.class, getApiPath(), f.getOwnerID(), "/" + f.getContainer()) {
 
                     @Override
                     public void onSuccess(Folder _result) {
@@ -706,9 +710,10 @@ public class Pithos implements EntryPoint, ResizeHandler {
     }
 
     public void fetchAccount(final Command callback) {
+        LOG("Pithos::fetchAccount(), callback = ", callback);
         String path = "?format=json";
 
-        GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, getApiPath(), userID, path) {
+        GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(this, AccountResource.class, getApiPath(), userID, path) {
             @Override
             public void onSuccess(AccountResource _result) {
                 account = _result;
@@ -741,7 +746,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
     }
 
     public void updateStatistics() {
-        HeadRequest<AccountResource> headAccount = new HeadRequest<AccountResource>(AccountResource.class, getApiPath(), userID, "", account) {
+        HeadRequest<AccountResource> headAccount = new HeadRequest<AccountResource>(this, AccountResource.class, getApiPath(), userID, "", account) {
 
             @Override
             public void onSuccess(AccountResource _result) {
@@ -771,7 +776,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
     protected void createHomeContainer(final AccountResource _account, final Command callback) {
         String path = "/" + Const.HOME_CONTAINER;
-        PutRequest createPithos = new PutRequest(getApiPath(), getUserID(), path) {
+        PutRequest createPithos = new PutRequest(this, getApiPath(), getUserID(), path) {
             @Override
             public void onSuccess(Resource result) {
                 if(!_account.hasTrashContainer()) {
@@ -805,7 +810,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
     protected void createTrashContainer(final Command callback) {
         String path = "/" + Const.TRASH_CONTAINER;
-        PutRequest createPithos = new PutRequest(getApiPath(), getUserID(), path) {
+        PutRequest createPithos = new PutRequest(this, getApiPath(), getUserID(), path) {
             @Override
             public void onSuccess(Resource result) {
                 fetchAccount(callback);
@@ -972,7 +977,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
         final PleaseWaitPopup pwp = new PleaseWaitPopup();
         pwp.center();
         String path = "/" + folder.getContainer() + "/" + folder.getPrefix() + "?delimiter=/" + "&t=" + System.currentTimeMillis();
-        DeleteRequest deleteFolder = new DeleteRequest(getApiPath(), folder.getOwnerID(), path) {
+        DeleteRequest deleteFolder = new DeleteRequest(this, getApiPath(), folder.getOwnerID(), path) {
 
             @Override
             protected void onUnauthorized(Response response) {
@@ -1026,7 +1031,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
         if(iter.hasNext()) {
             File file = iter.next();
             String path = targetUri + "/" + file.getName();
-            PutRequest copyFile = new PutRequest(getApiPath(), targetUsername, path) {
+            PutRequest copyFile = new PutRequest(this, getApiPath(), targetUsername, path) {
                 @Override
                 public void onSuccess(Resource result) {
                     copyFiles(iter, targetUsername, targetUri, callback);
@@ -1064,7 +1069,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
     public void copyFolder(final Folder f, final String targetUsername, final String targetUri, boolean move, final Command callback) {
         String path = targetUri + "?delimiter=/";
-        PutRequest copyFolder = new PutRequest(getApiPath(), targetUsername, path) {
+        PutRequest copyFolder = new PutRequest(this, getApiPath(), targetUsername, path) {
             @Override
             public void onSuccess(Resource result) {
                 if(callback != null) {
@@ -1121,11 +1126,11 @@ public class Pithos implements EntryPoint, ResizeHandler {
         groupTreeView.updateGroupNode(null);
     }
 
-    public Group addGroup(String groupname) {
-        Group newGroup = new Group(groupname);
-        account.addGroup(newGroup);
+    public Group addGroup(String groupName) {
+        final Group group = new Group(groupName);
+        account.addGroup(group);
         groupTreeView.updateGroupNode(null);
-        return newGroup;
+        return group;
     }
 
     public void removeGroup(Group group) {
@@ -1278,7 +1283,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
             }
         }
         else {
-            HeadRequest<Folder> headFolder = new HeadRequest<Folder>(Folder.class, getApiPath(), folder.getOwnerID(), folder.getUri(), folder) {
+            HeadRequest<Folder> headFolder = new HeadRequest<Folder>(this, Folder.class, getApiPath(), folder.getOwnerID(), folder.getUri(), folder) {
 
                 @Override
                 public void onSuccess(Folder _result) {
@@ -1292,7 +1297,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
                     if(t instanceof RestException) {
                         if(((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) {
                             final String path = folder.getUri();
-                            PutRequest newFolder = new PutRequest(getApiPath(), folder.getOwnerID(), path) {
+                            PutRequest newFolder = new PutRequest(Pithos.this, getApiPath(), folder.getOwnerID(), path) {
                                 @Override
                                 public void onSuccess(Resource _result) {
                                     scheduleFolderHeadCommand(folder, callback);
@@ -1347,7 +1352,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
     }
 
     public void scheduleFileHeadCommand(File f, final Command callback) {
-        HeadRequest<File> headFile = new HeadRequest<File>(File.class, getApiPath(), f.getOwnerID(), f.getUri(), f) {
+        HeadRequest<File> headFile = new HeadRequest<File>(this, File.class, getApiPath(), f.getOwnerID(), f.getUri(), f) {
 
             @Override
             public void onSuccess(File _result) {
@@ -1461,7 +1466,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
     public void emptyContainer(final Folder container) {
         String path = "/" + container.getName() + "?delimiter=/";
-        DeleteRequest delete = new DeleteRequest(getApiPath(), getUserID(), path) {
+        DeleteRequest delete = new DeleteRequest(this, getApiPath(), getUserID(), path) {
 
             @Override
             protected void onUnauthorized(Response response) {
index 150f3a2..fd013eb 100644 (file)
@@ -116,10 +116,10 @@ public abstract class Resource {
     }-*/;
 
     @SuppressWarnings("unchecked")
-    public static <T> T createFromResponse(Class<T> aClass, String owner, Response response, T result) {
+    public static <T> T createFromResponse(Pithos app, Class<T> aClass, String owner, Response response, T result) {
         T result1 = null;
         if(aClass.equals(AccountResource.class)) {
-            result1 = (T) AccountResource.createFromResponse(owner, response, (AccountResource) result);
+            result1 = (T) AccountResource.createFromResponse(app, owner, response, (AccountResource) result);
         }
         else if(aClass.equals(Folder.class)) {
             result1 = (T) Folder.createFromResponse(owner, response, (Folder) result);
index 88f8aa2..66d4e6b 100644 (file)
@@ -132,7 +132,7 @@ public class VersionsList extends Composite {
 
        void restoreVersion(int version) {
                String path = file.getUri() + "?update=";
-               PostRequest restoreVersion = new PostRequest(app.getApiPath(), file.getOwnerID(), path) {
+               PostRequest restoreVersion = new PostRequest(app, app.getApiPath(), file.getOwnerID(), path) {
                        
                        @Override
                        public void onSuccess(Resource result) {
index 8640ae2..645905e 100644 (file)
@@ -60,4 +60,8 @@ public class UpdateUserCatalogs implements Scheduler.ScheduledCommand {
     public void scheduleDeferred() {
         Scheduler.get().scheduleDeferred(this);
     }
+
+    public void scheduleEntry() {
+        Scheduler.get().scheduleEntry(this);
+    }
 }
index 7a58247..4fb2a6a 100644 (file)
@@ -45,20 +45,20 @@ public class UserCatalogs implements Iterable<Map.Entry<String, String>>{
         );
     }
 
-    public boolean hasID(String id) {
+    public boolean hasUserID(String id) {
         return id2name.containsKey(id);
     }
 
-    public boolean hasName(String name) {
-        return name2id.containsKey(name);
+    public boolean hasUserDisplayName(String displayName) {
+        return name2id.containsKey(displayName);
     }
 
-    public String getDisplayName(String id) {
-        return id2name.get(id);
+    public String getUserDisplayName(String userID) {
+        return id2name.get(userID);
     }
 
-    public String getUserID(String name) {
-        return name2id.get(name);
+    public String getUserID(String displayName) {
+        return name2id.get(displayName);
     }
 
     @Override
index d23cbba..456cc06 100644 (file)
@@ -34,6 +34,7 @@
  */
 package gr.grnet.pithos.web.client.commands;
 
+import gr.grnet.pithos.web.client.Const;
 import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.Resource;
 import gr.grnet.pithos.web.client.grouptree.Group;
@@ -75,7 +76,7 @@ public class DeleteGroupCommand implements Command {
                containerPanel.hide();
         if (Window.confirm("Are you sure you want to delete group " + group.getName())) {
                String path = "?update=";
-               PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {
+               PostRequest updateGroup = new PostRequest(app, app.getApiPath(), app.getUserID(), path) {
                                
                                @Override
                                public void onSuccess(Resource result) {
@@ -98,8 +99,8 @@ public class DeleteGroupCommand implements Command {
                                        app.sessionExpired();
                                }
                        };
-                       updateGroup.setHeader("X-Auth-Token", app.getUserToken());
-                       updateGroup.setHeader("X-Account-Group-" + URL.encodePathSegment(group.getName()), "~");
+                       updateGroup.setHeader(Const.X_AUTH_TOKEN, app.getUserToken());
+                       updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), "~");
                        Scheduler.get().scheduleDeferred(updateGroup);
         }
        }
index 1f1c486..ccbcda8 100644 (file)
@@ -137,7 +137,7 @@ public class PasteCommand implements Command {
         if (iter.hasNext()) {
             File file = iter.next();
             String path = folder.getUri() + "/" + file.getName();
-            PutRequest copyFile = new PutRequest(app.getApiPath(), folder.getOwnerID(), path) {
+            PutRequest copyFile = new PutRequest(app, app.getApiPath(), folder.getOwnerID(), path) {
                 @Override
                 public void onSuccess(Resource result) {
                     moveFiles(iter, callback);
index 0edfb9c..d39a3ab 100644 (file)
  */
 package gr.grnet.pithos.web.client.commands;
 
-import gr.grnet.pithos.web.client.Pithos;
-import gr.grnet.pithos.web.client.Resource;
-import gr.grnet.pithos.web.client.grouptree.Group;
-import gr.grnet.pithos.web.client.grouptree.User;
-import gr.grnet.pithos.web.client.rest.PostRequest;
-import gr.grnet.pithos.web.client.rest.RestException;
-
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.http.client.Response;
 import com.google.gwt.http.client.URL;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.PopupPanel;
+import gr.grnet.pithos.web.client.Const;
+import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.Resource;
+import gr.grnet.pithos.web.client.grouptree.Group;
+import gr.grnet.pithos.web.client.grouptree.User;
+import gr.grnet.pithos.web.client.rest.PostRequest;
+import gr.grnet.pithos.web.client.rest.RestException;
 
 /**
  * Display the 'new folder' dialog for creating a new folder.
- *
  */
 public class RemoveUserCommand implements Command {
-       private PopupPanel containerPanel;
+    private PopupPanel containerPanel;
 
     User user;
 
     Pithos app;
 
-       /**
-        * @param aContainerPanel
-        */
-       public RemoveUserCommand(Pithos _app, PopupPanel aContainerPanel, User _user){
+    /**
+     * @param aContainerPanel
+     */
+    public RemoveUserCommand(Pithos _app, PopupPanel aContainerPanel, User _user) {
         app = _app;
-               containerPanel = aContainerPanel;
-           user = _user;
-       }
+        containerPanel = aContainerPanel;
+        user = _user;
+    }
+
+    @Override
+    public void execute() {
+        if(containerPanel != null) {
+            containerPanel.hide();
+        }
+        final String groupName = user.getGroup();
+        final Group group = app.getAccount().getGroup(groupName);
+        if(group == null) {
+            return;
+        }
+        group.removeUser(user);
+        String path = "?update=";
+        PostRequest updateGroup = new PostRequest(app, app.getApiPath(), app.getUserID(), path) {
+
+            @Override
+            public void onSuccess(Resource result) {
+                app.fetchAccount(new Command() {
+
+                    @Override
+                    public void execute() {
+                        Group updatedGroup2 = app.getAccount().getGroup(groupName);
+                        if(updatedGroup2 != null) {
+                            app.updateGroupNode(updatedGroup2);
+                        }
+                        else {
+                            app.updateGroupNode(null);
+                        }
+                    }
+                });
+            }
 
-       @Override
-       public void execute() {
-        if (containerPanel != null)
-                   containerPanel.hide();
-       final String groupName = user.getGroup();
-       final Group group = app.getAccount().getGroup(groupName);
-       if (group == null)
-               return;
-       group.removeMember(user.getName());
-       String path = "?update=";
-       PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {
-                       
-                       @Override
-                       public void onSuccess(Resource result) {
-                               app.fetchAccount(new Command() {
-                                       
-                                       @Override
-                                       public void execute() {
-                                               Group updatedGroup2 = app.getAccount().getGroup(groupName);
-                                               if (updatedGroup2 != null)
-                                                       app.updateGroupNode(updatedGroup2);
-                                               else {
-                                                       app.updateGroupNode(null);
-                                               }
-                                       }
-                               });
-                       }
-                       
-                       @Override
-                       public void onError(Throwable t) {
-                               GWT.log("", t);
-                               app.setError(t);
-                               if (t instanceof RestException) {
-                                       app.displayError("Unable to update group:" + ((RestException) t).getHttpStatusText());
-                               }
-                               else
-                                       app.displayError("System error updating group:" + t.getMessage());
-                       }
+            @Override
+            public void onError(Throwable t) {
+                GWT.log("", t);
+                app.setError(t);
+                if(t instanceof RestException) {
+                    app.displayError("Unable to update group:" + ((RestException) t).getHttpStatusText());
+                }
+                else {
+                    app.displayError("System error updating group:" + t.getMessage());
+                }
+            }
 
-                       @Override
-                       protected void onUnauthorized(Response response) {
-                               app.sessionExpired();
-                       }
-               };
-               updateGroup.setHeader("X-Auth-Token", app.getUserToken());
-               String groupMembers = "";
-               if (!group.getMembers().isEmpty()) {
-                       for (String u : group.getMembers())
-                               groupMembers += (URL.encodePathSegment(u) + ",");
-               }
-               else
-                       groupMembers = "~";
-               updateGroup.setHeader("X-Account-Group-" + URL.encodePathSegment(group.getName()), groupMembers);
-               Scheduler.get().scheduleDeferred(updateGroup);
-       }
+            @Override
+            protected void onUnauthorized(Response response) {
+                app.sessionExpired();
+            }
+        };
+        updateGroup.setHeader(Const.X_AUTH_TOKEN, app.getUserToken());
+        final String groupMembers;
+        if(!group.getUsers().isEmpty()) {
+            groupMembers = group.encodeUserIDsForXAccountGroup();
+        }
+        else {
+            groupMembers = "~";
+        }
+        updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), groupMembers);
+        Scheduler.get().scheduleDeferred(updateGroup);
+    }
 }
index 9f19835..ff8d56a 100644 (file)
@@ -117,7 +117,7 @@ public class RestoreTrashCommand implements Command {
         if (iter.hasNext()) {
             File file = iter.next();
             String path = "/" + Const.HOME_CONTAINER + "/" + file.getPath();
-            PutRequest untrashFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {
+            PutRequest untrashFile = new PutRequest(app, app.getApiPath(), app.getUserID(), path) {
                 @Override
                 public void onSuccess(Resource result) {
                     untrashFiles(iter, callback);
index f08bc52..b5ece80 100644 (file)
@@ -127,7 +127,7 @@ public class ToTrashCommand implements Command{
         if (iter.hasNext()) {
             File file = iter.next();
             String path = "/" + Const.TRASH_CONTAINER + "/" + file.getPath();
-            PutRequest trashFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {
+            PutRequest trashFile = new PutRequest(app, app.getApiPath(), app.getUserID(), path) {
                 @Override
                 public void onSuccess(Resource result) {
                     trashFiles(iter, callback);
index 8f835bf..e4011a0 100644 (file)
 
 package gr.grnet.pithos.web.client.foldertree;
 
-import gr.grnet.pithos.web.client.Const;
-import gr.grnet.pithos.web.client.Resource;
-import gr.grnet.pithos.web.client.grouptree.Group;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
 import com.google.gwt.http.client.Header;
 import com.google.gwt.http.client.Response;
 import com.google.gwt.http.client.URL;
@@ -53,12 +45,22 @@ import com.google.gwt.json.client.JSONArray;
 import com.google.gwt.json.client.JSONObject;
 import com.google.gwt.json.client.JSONParser;
 import com.google.gwt.json.client.JSONValue;
+import gr.grnet.pithos.web.client.Const;
+import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.Resource;
+import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
+import gr.grnet.pithos.web.client.catalog.UserCatalogs;
+import gr.grnet.pithos.web.client.grouptree.Group;
+import gr.grnet.pithos.web.client.grouptree.User;
+
+import java.util.*;
 
 /**
  * Created by IntelliJ IDEA. User: chstath Date: 5/19/11 Time: 2:55 PM To change this template use File | Settings |
  * File Templates.
  */
 public class AccountResource extends Resource {
+    private final Pithos app;
 
     private long numberOfContainers = 0;
 
@@ -71,13 +73,17 @@ public class AccountResource extends Resource {
     private Date lastLogin = null;
 
     private Date lastModified = null;
-    
+
     private List<Folder> containers = new ArrayList<Folder>();
 
     private Date currentLogin = null;
 
     private List<Group> groups = new ArrayList<Group>();
 
+    public AccountResource(Pithos app) {
+        this.app = app;
+    }
+
     public long getQuota() {
         return quota;
     }
@@ -103,7 +109,7 @@ public class AccountResource extends Resource {
     }
 
     @Override
-       public Date getLastModified() {
+    public Date getLastModified() {
         return lastModified;
     }
 
@@ -139,145 +145,208 @@ public class AccountResource extends Resource {
         this.currentLogin = currentLogin;
     }
 
+    private void doAddUsersByIDs(final List<String> userIDs, final String groupName) {
+        app.LOG("AccountResource::doAddUsersByIDs(), group = ", groupName);
+        final Group group = new Group(groupName);
+        for(String userID : userIDs) {
+            final String userDisplayName = app.getUserDisplayNameForID(userID);
+            final User user = new User(userID, userDisplayName, groupName);
+            group.addUser(user);
+            app.LOG("AccountResource::doAddUsersByIDs(),   user = (", userID, ", ", userDisplayName, ")");
+
+        }
+        groups.add(group);
+
+    }
+
     public void populate(String owner, Response response) {
         DateTimeFormat df = DateTimeFormat.getFormat(PredefinedFormat.RFC_2822);
         groups.clear();
-        for (Header h : response.getHeaders()) {
-               if (h != null) {
-                       String name = h.getName();
-                       if (name.startsWith("X-Account-Group-")) {
-                           String groupName = URL.decodePathSegment(name.substring("X-Account-Group-".length()));
-                           Group g = new Group(groupName);
-                           String[] members = h.getValue().split(",");
-                           for (String s : members)
-                               g.addMember(URL.decodePathSegment(s).trim());
-                           groups.add(g);
-                       }
-                       else if (name.equals("X-Account-Container-Count")) {
-                           numberOfContainers = Long.valueOf(h.getValue());
-                       }
-                       else if (name.equals("X-Account-Object-Count")) {
-                           numberOfObjects = Long.valueOf(h.getValue());
-                       }
-                       else if (name.equals("X-Account-Bytes-Used")) {
-                           bytesUsed = Long.valueOf(h.getValue());
-                       }
-                       else if (name.equals("X-Account-Policy-Quota")) {
-                           quota = Long.valueOf(h.getValue());
-                       }
-                       else if (name.equals("X-Account-Last-Login")) {
-                           lastLogin = df.parse(h.getValue());
-                       }
-                       else if (name.equals("Last-Modified")) {
-                           lastModified = df.parse(h.getValue());
-                       }
-               }
+
+        final Map<String, List<String>> parsedGroups = new HashMap<String, List<String>>();
+
+        for(Header h : response.getHeaders()) {
+            if(h != null) {
+                String name = h.getName();
+                if(name.startsWith(Const.X_ACCOUNT_GROUP_)) {
+                    final String groupName = URL.decodePathSegment(name.substring(Const.X_ACCOUNT_GROUP_.length()));
+                    final String[] users = h.getValue().split(",");
+                    final List<String> userIDs = new ArrayList<String>();
+                    for(String user : users) {
+                        final String userID = URL.decodePathSegment(user).trim();
+                        userIDs.add(userID);
+                    }
+                    parsedGroups.put(groupName, userIDs);
+                }
+                else if(name.equals(Const.X_ACCOUNT_CONTAINER_COUNT)) {
+                    numberOfContainers = Long.valueOf(h.getValue());
+                }
+                else if(name.equals(Const.X_ACCOUNT_OBJECT_COUNT)) {
+                    numberOfObjects = Long.valueOf(h.getValue());
+                }
+                else if(name.equals(Const.X_ACCOUNT_BYTES_USED)) {
+                    bytesUsed = Long.valueOf(h.getValue());
+                }
+                else if(name.equals(Const.X_ACCOUNT_POLICY_QUOTA)) {
+                    quota = Long.valueOf(h.getValue());
+                }
+                else if(name.equals(Const.X_ACCOUNT_LAST_LOGIN)) {
+                    lastLogin = df.parse(h.getValue());
+                }
+                else if(name.equals(Const.LAST_MODIFIED)) {
+                    lastModified = df.parse(h.getValue());
+                }
+            }
+        }
+        
+        // Gather all unknown users for the groups
+        final List<String> userIDsWithUnknownDisplayName = new ArrayList<String>();
+        for(Map.Entry<String, List<String>> parsedGroupEntry : parsedGroups.entrySet()) {
+            final List<String> groupUserIDs = parsedGroupEntry.getValue();
+            userIDsWithUnknownDisplayName.addAll(app.filterUserIDsWithUnknownDisplayName(groupUserIDs));
+        }
+        if(userIDsWithUnknownDisplayName.size() == 0) {
+            for(Map.Entry<String, List<String>> parsedGroupEntry : parsedGroups.entrySet()) {
+                final String groupName = parsedGroupEntry.getKey();
+                final List<String> groupUserIDs = parsedGroupEntry.getValue();
+                doAddUsersByIDs(groupUserIDs, groupName);
+            }
+        }
+        else {
+            new UpdateUserCatalogs(app, userIDsWithUnknownDisplayName) {
+                @Override
+                public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
+                    for(Map.Entry<String, List<String>> parsedGroupEntry : parsedGroups.entrySet()) {
+                        final String groupName = parsedGroupEntry.getKey();
+                        final List<String> groupUserIDs = parsedGroupEntry.getValue();
+                        doAddUsersByIDs(groupUserIDs, groupName);
+                    }
+                }
+            }.scheduleEntry();
         }
 
-        if (response.getText() != null && response.getText().length() > 0) {
-               containers.clear();
-               JSONValue json = JSONParser.parseStrict(response.getText());
-               JSONArray array = json.isArray();
-               if (array != null) {
-                   for (int i=0; i<array.size(); i++) {
-                       JSONObject o = array.get(i).isObject();
-                       if (o != null) {
-                           Folder f = new Folder();
-                           f.populate(null, o, owner, null);
-                           containers.add(f);
-                       }
-                   }
-               }
+        if(response.getText() != null && response.getText().length() > 0) {
+            containers.clear();
+            JSONValue json = JSONParser.parseStrict(response.getText());
+            JSONArray array = json.isArray();
+            if(array != null) {
+                for(int i = 0; i < array.size(); i++) {
+                    JSONObject o = array.get(i).isObject();
+                    if(o != null) {
+                        Folder f = new Folder();
+                        f.populate(null, o, owner, null);
+                        containers.add(f);
+                    }
+                }
+            }
         }
     }
 
-    public static AccountResource createFromResponse(String owner, Response response, AccountResource result) {
-       AccountResource a;
-       if (result == null)
-               a = new AccountResource();
-       else
-               a = result;
+    public static AccountResource createFromResponse(Pithos app, String owner, Response response, AccountResource result) {
+        AccountResource a;
+        if(result == null) {
+            a = new AccountResource(app);
+        }
+        else {
+            a = result;
+        }
         a.populate(owner, response);
         return a;
     }
 
-    private String getSize(Long size, Double division){
-        Double res = Double.valueOf(size.toString())/division;
-        NumberFormat nf = NumberFormat.getFormat("######.#");
+    private String getSize(Long size, Double division) {
+        Double res = Double.valueOf(size.toString()) / division;
+        NumberFormat nf = NumberFormat.getFormat(Const.NUMBER_FORMAT_1);
         return nf.format(res);
     }
 
     public String getFileSizeAsString() {
-        if (bytesUsed < 1024)
+        if(bytesUsed < 1024) {
             return String.valueOf(bytesUsed) + "B";
-        else if (bytesUsed < 1024*1024)
+        }
+        else if(bytesUsed < 1024 * 1024) {
             return getSize(bytesUsed, 1024D) + "KB";
-        else if (bytesUsed < 1024*1024*1024)
-            return getSize(bytesUsed,(1024D*1024D)) + "MB";
-        return getSize(bytesUsed , (1024D*1024D*1024D)) + "GB";
+        }
+        else if(bytesUsed < 1024 * 1024 * 1024) {
+            return getSize(bytesUsed, (1024D * 1024D)) + "MB";
+        }
+        return getSize(bytesUsed, (1024D * 1024D * 1024D)) + "GB";
     }
 
     public String getQuotaAsString() {
-        if (quota < 1024)
+        if(quota < 1024) {
             return String.valueOf(quota) + "B";
-        else if (quota < 1024 * 1024)
+        }
+        else if(quota < 1024 * 1024) {
             return getSize(quota, 1024D) + "KB";
-        else if (quota < 1024 * 1024 * 1024)
-            return getSize(quota,(1024D * 1024D)) + "MB";
-        return getSize(quota , (1024D * 1024D * 1024D)) + "GB";
+        }
+        else if(quota < 1024 * 1024 * 1024) {
+            return getSize(quota, (1024D * 1024D)) + "MB";
+        }
+        return getSize(quota, (1024D * 1024D * 1024D)) + "GB";
     }
 
     public List<Group> getGroups() {
         return groups;
     }
-    
+
     public boolean hasHomeContainer() {
-       for (Folder f : containers)
-               if (f.getName().equals(Const.HOME_CONTAINER))
-                       return true;
-       return false;
+        for(Folder f : containers) {
+            if(f.getName().equals(Const.HOME_CONTAINER)) {
+                return true;
+            }
+        }
+        return false;
     }
 
     public boolean hasTrashContainer() {
-       for (Folder f : containers)
-               if (f.getName().equals(Const.TRASH_CONTAINER))
-                       return true;
-       return false;
+        for(Folder f : containers) {
+            if(f.getName().equals(Const.TRASH_CONTAINER)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void addGroup(Group group) {
+        groups.add(group);
+    }
+
+    public void removeGroup(Group group) {
+        groups.remove(group);
     }
 
-       public void addGroup(Group newGroup) {
-               groups.add(newGroup);
-       }
-
-       public void removeGroup(Group group) {
-               groups.remove(group);
-       }
-
-       public Folder getTrash() {
-               for (Folder c : containers) {
-                       if (c.getName().equals(Const.TRASH_CONTAINER))
-                               return c;
-               }
-               return null;
-       }
-
-       public double getUsedPercentage() {
-               if (quota == 0)
-                       return 0;
-               return ((double) bytesUsed) / quota;
-       }
-
-       public Folder getPithos() {
-               for (Folder f : containers)
-                       if (f.getName().equals(Const.HOME_CONTAINER))
-                               return f;
-               return null;
-       }
-
-       public Group getGroup(String groupName) {
-               for (Group g : groups)
-                       if (g.getName().equalsIgnoreCase(groupName))
-                               return g;
-               return null;
-       }
+    public Folder getTrash() {
+        for(Folder c : containers) {
+            if(c.getName().equals(Const.TRASH_CONTAINER)) {
+                return c;
+            }
+        }
+        return null;
+    }
+
+    public double getUsedPercentage() {
+        if(quota == 0) {
+            return 0;
+        }
+        return ((double) bytesUsed) / quota;
+    }
+
+    public Folder getPithos() {
+        for(Folder f : containers) {
+            if(f.getName().equals(Const.HOME_CONTAINER)) {
+                return f;
+            }
+        }
+        return null;
+    }
+
+    public Group getGroup(String groupName) {
+        for(Group g : groups) {
+            if(g.getName().equalsIgnoreCase(groupName)) {
+                return g;
+            }
+        }
+        return null;
+    }
 }
index 5e3f56b..fb4d31f 100644 (file)
@@ -152,7 +152,7 @@ public class FolderTreeViewModel implements TreeViewModel {
             final Folder f = iter.next();
 
             String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
-            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+            GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
                 @Override
                 public void onSuccess(Folder _result) {
                     fetchFolder(iter, callback);
@@ -236,7 +236,7 @@ public class FolderTreeViewModel implements TreeViewModel {
 
     public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles, final Command callback) {
         String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
-        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+        GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
             @Override
             public void onSuccess(final Folder _result) {
                 if (showfiles)
index d367048..aef15f5 100644 (file)
 package gr.grnet.pithos.web.client.grouptree;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
-public class Group {
-    private String name;
+public final class Group {
+    private final String name;
 
-    private List<String> members = new ArrayList<String>();
+    private final List<User> users = new ArrayList<User>();
 
-    public Group(String _name) {
-        name = _name;
+    public Group(String name) {
+        this.name = name;
     }
 
-    public List<String> getMembers() {
-        return members;
+    public List<User> getUsers() {
+        return Collections.unmodifiableList(users);
     }
 
     public String getName() {
         return name;
     }
 
-    public void addMember(String user) {
-        members.add(user);
+    public void addUser(User user) {
+        this.users.add(user);
     }
 
-       public void removeMember(String username) {
-               members.remove(username);
+       public void removeUser(User user) {
+               this.users.remove(user);
        }
+
+    public String encodeUserIDsForXAccountGroup() {
+        final StringBuilder sb = new StringBuilder();
+        for(int i=0; i<users.size(); i++) {
+            final User user = users.get(i);
+            sb.append(user.getUserID());
+            if(i < users.size() - 1) {
+                sb.append(",");
+            }
+        }
+
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        return "Group(" + name + ", " + users.size()+ " users)";
+    }
+
 }
index ea3f05c..379c21f 100644 (file)
 
 package gr.grnet.pithos.web.client.grouptree;
 
-import gr.grnet.pithos.web.client.Pithos;
-import gr.grnet.pithos.web.client.commands.CreateGroupCommand;
-import gr.grnet.pithos.web.client.foldertree.File;
-import gr.grnet.pithos.web.client.grouptree.GroupTreeView.Templates;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-
 import com.google.gwt.cell.client.AbstractCell;
 import com.google.gwt.cell.client.Cell;
 import com.google.gwt.event.dom.client.ContextMenuEvent;
@@ -53,46 +44,57 @@ import com.google.gwt.view.client.ListDataProvider;
 import com.google.gwt.view.client.SelectionChangeEvent;
 import com.google.gwt.view.client.SingleSelectionModel;
 import com.google.gwt.view.client.TreeViewModel;
+import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.commands.CreateGroupCommand;
+import gr.grnet.pithos.web.client.foldertree.File;
+import gr.grnet.pithos.web.client.grouptree.GroupTreeView.Templates;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 
 public class GroupTreeViewModel implements TreeViewModel {
+    final Group CreateGroupPlaceholder = new Group("Create new group...");
 
     protected Pithos app;
 
-       private Cell<Group> groupCell = new AbstractCell<Group>(ContextMenuEvent.getType().getName()) {
+    private Cell<Group> groupCell = new AbstractCell<Group>(ContextMenuEvent.getType().getName()) {
 
-               @Override
-               public void render(Context context,     Group value, SafeHtmlBuilder sb) {
+        @Override
+        public void render(Context context, Group group, SafeHtmlBuilder sb) {
             String html = AbstractImagePrototype.create(GroupTreeView.images.group()).getHTML();
             sb.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
-            sb.append(Templates.INSTANCE.nameSpan(value.getName()));
-               }
-               
+            sb.append(Templates.INSTANCE.nameSpan(group.getName()));
+        }
+
         @Override
         public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, Group group, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<Group> valueUpdater) {
-               if (!group.equals(createGroup)) {
-                   GroupTreeViewModel.this.groupSelectionModel.setSelected(group, true);
-                   if (event.getType().equals(ContextMenuEvent.getType().getName())) {
-                       GroupContextMenu menu = new GroupContextMenu(app, GroupTreeView.images, group);
-                       menu.setPopupPosition(event.getClientX(), event.getClientY());
-                       menu.show();
-                   }
-               }
+            if(!group.equals(CreateGroupPlaceholder)) {
+                GroupTreeViewModel.this.groupSelectionModel.setSelected(group, true);
+                if(event.getType().equals(ContextMenuEvent.getType().getName())) {
+                    GroupContextMenu menu = new GroupContextMenu(app, GroupTreeView.images, group);
+                    menu.setPopupPosition(event.getClientX(), event.getClientY());
+                    menu.show();
+                }
+            }
         }
-       };
+    };
 
     private Cell<User> userCell = new AbstractCell<User>(ContextMenuEvent.getType().getName()) {
 
-               @Override
-               public void render(Context context,     User value, SafeHtmlBuilder sb) {
+        @Override
+        public void render(Context context, User user, final SafeHtmlBuilder sb) {
             String html = AbstractImagePrototype.create(GroupTreeView.images.user()).getHTML();
             sb.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
-            sb.append(Templates.INSTANCE.nameSpan(value.getName()));
-               }
+            final String userDisplayName = user.getUserDisplayName();
+            sb.append(Templates.INSTANCE.nameSpan(userDisplayName));
+        }
 
         @Override
         public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, User user, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<User> valueUpdater) {
             GroupTreeViewModel.this.userSelectionModel.setSelected(user, true);
-            if (event.getType().equals(ContextMenuEvent.getType().getName())) {
+            if(event.getType().equals(ContextMenuEvent.getType().getName())) {
                 UserContextMenu menu = new UserContextMenu(app, GroupTreeView.images, user);
                 menu.setPopupPosition(event.getClientX(), event.getClientY());
                 menu.show();
@@ -103,114 +105,127 @@ public class GroupTreeViewModel implements TreeViewModel {
     protected ListDataProvider<Group> groupsDataProvider = new ListDataProvider<Group>();
 
     protected Map<Group, ListDataProvider<User>> userDataProviderMap = new HashMap<Group, ListDataProvider<User>>();
-    
+
     SingleSelectionModel<Group> groupSelectionModel;
     SingleSelectionModel<User> userSelectionModel;
-    
-    final Group createGroup = new Group("Create new group...");
 
     public GroupTreeViewModel(Pithos _app) {
         app = _app;
 
-       groupSelectionModel = new SingleSelectionModel<Group>();
-       app.addSelectionModel(groupSelectionModel);
-       groupSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-                       
-                       @Override
-                       public void onSelectionChange(SelectionChangeEvent event) {
-                               Group selected = groupSelectionModel.getSelectedObject();
-                               if (selected != null) {
-                                       app.deselectOthers(app.getGroupTreeView(), groupSelectionModel);
-                                       app.showFiles(new HashSet<File>());
-                                       app.disableUploadArea();
-                                       app.upload.setEnabled(false);
-                                       app.showRelevantToolbarButtons();
-                                       if (selected.equals(createGroup)) {
-                                               new CreateGroupCommand(app, null).execute();
-                                               groupSelectionModel.setSelected(createGroup, false);
-                                       }
-                               }
-                               else {
-                                       if (app.getSelectedTree().equals(app.getGroupTreeView()))
-                                               app.setSelectedTree(null);
-                                       if (app.getSelectedTree() == null)
-                                               app.showRelevantToolbarButtons();
-                               }
-                       }
-               });
-
-       userSelectionModel = new SingleSelectionModel<User>();
-       app.addSelectionModel(userSelectionModel);
-       userSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-                       
-                       @Override
-                       public void onSelectionChange(SelectionChangeEvent event) {
-                               if (userSelectionModel.getSelectedObject() != null) {
-                                       app.deselectOthers(app.getGroupTreeView(), userSelectionModel);
-                                       app.showFiles(new HashSet<File>());
-                                       app.showRelevantToolbarButtons();
-                               }
-                               else {
-                                       if (app.getSelectedTree().equals(app.getGroupTreeView()))
-                                               app.setSelectedTree(null);
-                                       if (app.getSelectedTree() == null)
-                                               app.showRelevantToolbarButtons();
-                               }
-                       }
-               });
-}
+        groupSelectionModel = new SingleSelectionModel<Group>();
+        app.addSelectionModel(groupSelectionModel);
+        groupSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
+
+            @Override
+            public void onSelectionChange(SelectionChangeEvent event) {
+                Group selected = groupSelectionModel.getSelectedObject();
+                if(selected != null) {
+                    app.deselectOthers(app.getGroupTreeView(), groupSelectionModel);
+                    app.showFiles(new HashSet<File>());
+                    app.disableUploadArea();
+                    app.upload.setEnabled(false);
+                    app.showRelevantToolbarButtons();
+                    if(selected.equals(CreateGroupPlaceholder)) {
+                        new CreateGroupCommand(app, null).execute();
+                        groupSelectionModel.setSelected(CreateGroupPlaceholder, false);
+                    }
+                }
+                else {
+                    if(app.getSelectedTree().equals(app.getGroupTreeView())) {
+                        app.setSelectedTree(null);
+                    }
+                    if(app.getSelectedTree() == null) {
+                        app.showRelevantToolbarButtons();
+                    }
+                }
+            }
+        });
+
+        userSelectionModel = new SingleSelectionModel<User>();
+        app.addSelectionModel(userSelectionModel);
+        userSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
+
+            @Override
+            public void onSelectionChange(SelectionChangeEvent event) {
+                if(userSelectionModel.getSelectedObject() != null) {
+                    app.deselectOthers(app.getGroupTreeView(), userSelectionModel);
+                    app.showFiles(new HashSet<File>());
+                    app.showRelevantToolbarButtons();
+                }
+                else {
+                    if(app.getSelectedTree().equals(app.getGroupTreeView())) {
+                        app.setSelectedTree(null);
+                    }
+                    if(app.getSelectedTree() == null) {
+                        app.showRelevantToolbarButtons();
+                    }
+                }
+            }
+        });
+    }
 
     @Override
     public <T> NodeInfo<?> getNodeInfo(T value) {
-        if (value == null) {
-               groupsDataProvider.getList().clear();
-                       groupsDataProvider.getList().addAll(app.getAccount().getGroups());
-                       groupsDataProvider.getList().add(createGroup);
+        app.LOG("GroupTreeViewModel::getNodeInfo(), value = ", value);
+        if(value == null) {
+            groupsDataProvider.getList().clear();
+            groupsDataProvider.getList().addAll(app.getAccount().getGroups());
+            groupsDataProvider.getList().add(CreateGroupPlaceholder);
             return new DefaultNodeInfo<Group>(groupsDataProvider, groupCell, groupSelectionModel, null);
         }
-       Group g = (Group) value;
-               if (userDataProviderMap.get(g) == null) {
-                       userDataProviderMap.put(g, new ListDataProvider<User>());
-               }
-               final ListDataProvider<User> dataProvider = userDataProviderMap.get(g);
-               dataProvider.getList().clear();
-               for (String u : g.getMembers())
-                       dataProvider.getList().add(new User(u, g.getName()));
-       return new DefaultNodeInfo<User>(dataProvider, userCell, userSelectionModel, null);
+        final Group group = (Group) value;
+        if(userDataProviderMap.get(group) == null) {
+            userDataProviderMap.put(group, new ListDataProvider<User>());
+        }
+        final ListDataProvider<User> dataProvider = userDataProviderMap.get(group);
+        dataProvider.getList().clear();
+        final List<User> users = group.getUsers();
+        for(User user : users) {
+            app.LOG("GroupTreeViewModel::getNodeInfo(), Add ", user);
+            dataProvider.getList().add(user);
+        }
+
+
+        return new DefaultNodeInfo<User>(dataProvider, userCell, userSelectionModel, null);
     }
 
-       @Override
+    @Override
     public boolean isLeaf(Object o) {
-        if (o instanceof User) {
-                       return true;
+        if(o instanceof User) {
+            return true;
+        }
+        else if(o instanceof Group) {
+            return ((Group) o).getUsers().isEmpty();
         }
-        else if (o instanceof Group)
-               return ((Group) o).getMembers().isEmpty();
         return false;
     }
-       
-       public void updateGroupNode(Group group) {
-               if (group == null) {
-                       groupsDataProvider.getList().clear();
-                       groupsDataProvider.getList().addAll(app.getAccount().getGroups());
-                       groupsDataProvider.getList().add(createGroup);
-               }
-               else {
-                       if (userDataProviderMap.get(group) == null) {
-                               userDataProviderMap.put(group, new ListDataProvider<User>());
-                       }
-                       final ListDataProvider<User> dataProvider = userDataProviderMap.get(group);
-                       dataProvider.getList().clear();
-                       for (String u : group.getMembers())
-                               dataProvider.getList().add(new User(u, group.getName()));
-               }
-       }
-
-       public Object getSelectedObject() {
-               if (groupSelectionModel.getSelectedObject() != null)
-                       return groupSelectionModel.getSelectedObject();
-               if (userSelectionModel.getSelectedObject() != null)
-                       return userSelectionModel.getSelectedObject();
-               return null;
-       }
+
+    public void updateGroupNode(Group group) {
+        if(group == null) {
+            groupsDataProvider.getList().clear();
+            groupsDataProvider.getList().addAll(app.getAccount().getGroups());
+            groupsDataProvider.getList().add(CreateGroupPlaceholder);
+        }
+        else {
+            if(userDataProviderMap.get(group) == null) {
+                userDataProviderMap.put(group, new ListDataProvider<User>());
+            }
+            final ListDataProvider<User> dataProvider = userDataProviderMap.get(group);
+            dataProvider.getList().clear();
+            for(User user : group.getUsers()) {
+                app.LOG("GroupTreeViewModel::updateGroupNode(), group = ", group, ". Add ", user);
+                dataProvider.getList().add(user);
+            }
+        }
+    }
+
+    public Object getSelectedObject() {
+        if(groupSelectionModel.getSelectedObject() != null) {
+            return groupSelectionModel.getSelectedObject();
+        }
+        if(userSelectionModel.getSelectedObject() != null) {
+            return userSelectionModel.getSelectedObject();
+        }
+        return null;
+    }
 }
index 067fbd2..f6798ae 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 userDisplayName;
+    private final String group;
+
+    public User(String userID, String userDisplayName, String group) {
+        this.userID = userID;
+        this.userDisplayName = userDisplayName;
+        this.group = group;
+    }
+
+    public String getUserID() {
+        return userID;
     }
 
-    public String getName() {
-        return name;
+    public String getUserDisplayName() {
+        return userDisplayName;
     }
 
-       public String getGroup() {
+    public String getGroup() {
                return group;
        }
+
+    @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;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = userID != null ? userID.hashCode() : 0;
+        result = 31 * result + (group != null ? group.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "User(" + userID + ", " + userDisplayName + ", " + group + ")";
+    }
 }
index 87aca52..cfa6dea 100644 (file)
@@ -119,7 +119,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
 
        private void fetchSharedContainers(final Command callback) {
         String path = "?format=json&shared=&public=";
-        GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), app.getUserID(), path) {
+        GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(app, AccountResource.class, app.getApiPath(), app.getUserID(), path) {
             @Override
             public void onSuccess(final AccountResource _result) {
                                firstLevelDataProvider.getList().clear();
@@ -170,7 +170,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
             final Folder f = iter.next();
 
             String path = "/" + f.getContainer() + "?format=json&shared=&public=&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
-            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+            GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
                 @Override
                 public void onSuccess(Folder _result) {
                     fetchFolder(iter, callback);
@@ -208,7 +208,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
 
     public void fetchFolder(final Folder f, final boolean showfiles, final Command callback) {
         String path = "/" + f.getContainer() + "?format=json&shared=&public=" + URL.encodeQueryString(f.getPrefix());
-        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+        GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
             @Override
             public void onSuccess(final Folder _result) {
                for (File file : _result.getFiles()) {
index 1879b89..1c1a244 100644 (file)
@@ -175,7 +175,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
 //    }-*/;
 
     private void fetchSharingUsers(final Command callback) {
-        GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(SharingUsers.class, app.getApiPath(), "", "?format=json") {
+        GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(app, SharingUsers.class, app.getApiPath(), "", "?format=json") {
             @Override
             public void onSuccess(final SharingUsers _result) {
                 userLevelDataProviderForIDs.getList().clear();
@@ -285,7 +285,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
     }
 
     private void fetchSharedContainers(final String userID, final ListDataProvider<Folder> dataProvider, final Command callback) {
-        GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), userID, "?format=json") {
+        GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(app, AccountResource.class, app.getApiPath(), userID, "?format=json") {
 
             @Override
             public void onSuccess(AccountResource _result) {
@@ -330,7 +330,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
             final Folder f = folderIterator.next();
 
             String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
-            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), userID, path, f) {
+            GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), userID, path, f) {
                 @Override
                 public void onSuccess(Folder _result) {
                     dataProvider.getList().add(_result);
@@ -376,7 +376,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
 
     public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles, final Command callback) {
         String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
-        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+        GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
             @Override
             public void onSuccess(final Folder _result) {
                 if(showfiles) {
index 0194db0..bea8c44 100644 (file)
@@ -35,6 +35,7 @@
 
 package gr.grnet.pithos.web.client.rest;
 
+import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.Resource;
 
 import java.util.HashMap;
@@ -55,6 +56,8 @@ public abstract class DeleteRequest implements ScheduledCommand {
        
        protected static final int MAX_RETRIES = 3; 
 
+    private final Pithos app;
+
        protected int retries = 0; 
 
        private String api;
@@ -69,7 +72,8 @@ public abstract class DeleteRequest implements ScheduledCommand {
 
     public abstract void onError(Throwable t);
 
-    public DeleteRequest(String api, String owner, String path) {
+    public DeleteRequest(Pithos app, String api, String owner, String path) {
+        this.app = app;
         this.api = api;
         this.owner = owner;
         this.path = path;
@@ -90,7 +94,7 @@ public abstract class DeleteRequest implements ScheduledCommand {
 
                 @Override
                 public Resource deserialize(Response response) {
-                    return Resource.createFromResponse(Resource.class, owner, response, null);
+                    return Resource.createFromResponse(app, Resource.class, owner, response, null);
                 }
 
                 @Override
index e087800..ab5d519 100644 (file)
@@ -35,6 +35,7 @@
 
 package gr.grnet.pithos.web.client.rest;
 
+import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.Resource;
 
 import java.util.HashMap;
@@ -51,7 +52,9 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
        
        protected static final int MAX_RETRIES = 3; 
 
-       protected int retries = 0; 
+       protected int retries = 0;
+
+    private final Pithos app;
 
        protected Class<T> resourceClass;
 
@@ -71,7 +74,8 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
 
     public abstract void onError(Throwable t);
 
-    public GetRequest(Class<T> resourceClass, String api, String owner, String path, int okCode, T result) {
+    public GetRequest(Pithos app, Class<T> resourceClass, String api, String owner, String path, int okCode, T result) {
+        this.app = app;
         this.resourceClass = resourceClass;
         this.api = api;
         this.owner = owner;
@@ -80,12 +84,12 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
         this.result = result;
     }
 
-    public GetRequest(Class<T> resourceClass, String api, String owner, String path) {
-        this(resourceClass, api, owner, path, -1, null);
+    public GetRequest(Pithos app, Class<T> resourceClass, String api, String owner, String path) {
+        this(app, resourceClass, api, owner, path, -1, null);
     }
 
-    public GetRequest(Class<T> resourceClass, String api, String owner, String path, T result) {
-        this(resourceClass, api, owner, path, -1, result);
+    public GetRequest(Pithos app, Class<T> resourceClass, String api, String owner, String path, T result) {
+        this(app, resourceClass, api, owner, path, -1, result);
     }
 
     @Override
@@ -108,7 +112,7 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
 
                 @Override
                 public T deserialize(Response response) {
-                    return Resource.createFromResponse(resourceClass, owner, response, result);
+                    return Resource.createFromResponse(app, resourceClass, owner, response, result);
                 }
 
                 @Override
index 5b0f0fc..1148554 100644 (file)
@@ -35,6 +35,7 @@
 
 package gr.grnet.pithos.web.client.rest;
 
+import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.Resource;
 
 import java.util.HashMap;
@@ -51,6 +52,8 @@ public abstract class HeadRequest<T extends Resource> implements ScheduledComman
 
        protected static final int MAX_RETRIES = 3; 
 
+    private final Pithos app;
+
        protected int retries = 0; 
 
        protected Class<T> aClass;
@@ -73,7 +76,8 @@ public abstract class HeadRequest<T extends Resource> implements ScheduledComman
 
     public abstract void onError(Throwable t);
 
-    public HeadRequest(Class<T> aClass, String api, String owner, String path, int okCode, T result) {
+    public HeadRequest(Pithos app, Class<T> aClass, String api, String owner, String path, int okCode, T result) {
+        this.app = app;
         this.aClass = aClass;
         this.api = api;
         this.owner = owner;
@@ -82,12 +86,12 @@ public abstract class HeadRequest<T extends Resource> implements ScheduledComman
         this.result = result;
     }
 
-    public HeadRequest(Class<T> aClass, String api, String owner, String path) {
-        this(aClass, api, owner, path, Response.SC_NO_CONTENT, null);
+    public HeadRequest(Pithos app, Class<T> aClass, String api, String owner, String path) {
+        this(app, aClass, api, owner, path, Response.SC_NO_CONTENT, null);
     }
 
-    public HeadRequest(Class<T> aClass, String api, String owner, String path, T result) {
-        this(aClass, api, owner, path, Response.SC_NO_CONTENT, result);
+    public HeadRequest(Pithos app, Class<T> aClass, String api, String owner, String path, T result) {
+        this(app, aClass, api, owner, path, Response.SC_NO_CONTENT, result);
     }
 
     @Override
@@ -109,7 +113,7 @@ public abstract class HeadRequest<T extends Resource> implements ScheduledComman
 
                 @Override
                 public T deserialize(Response response) {
-                    return Resource.createFromResponse(aClass, owner, response, result);
+                    return Resource.createFromResponse(app, aClass, owner, response, result);
                 }
 
                 @Override
index 2bc7454..a5437a5 100644 (file)
@@ -35,6 +35,7 @@
 
 package gr.grnet.pithos.web.client.rest;
 
+import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.Resource;
 
 import java.util.HashMap;
@@ -49,6 +50,8 @@ import com.google.gwt.http.client.Response;
 
 public abstract class PostRequest implements ScheduledCommand {
 
+    private final Pithos app;
+
     private String api;
 
     protected String owner;
@@ -63,13 +66,15 @@ public abstract class PostRequest implements ScheduledCommand {
 
     public abstract void onError(Throwable t);
 
-    public PostRequest(String api, String owner, String path) {
+    public PostRequest(Pithos app, String api, String owner, String path) {
+        this.app = app;
         this.api = api;
         this.owner = owner;
         this.path = path;
     }
 
-    public PostRequest(String api, String owner, String path, String data) {
+    public PostRequest(Pithos app, String api, String owner, String path, String data) {
+        this.app = app;
         this.api = api;
         this.owner = owner;
         this.path = path;
@@ -91,7 +96,7 @@ public abstract class PostRequest implements ScheduledCommand {
 
                 @Override
                 public Resource deserialize(Response response) {
-                    return Resource.createFromResponse(Resource.class, owner, response, null);
+                    return Resource.createFromResponse(app, Resource.class, owner, response, null);
                 }
 
                 @Override
index 1b8d734..73ee55d 100644 (file)
@@ -70,6 +70,7 @@
 
 package gr.grnet.pithos.web.client.rest;
 
+import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.Resource;
 
 import java.util.HashMap;
@@ -83,6 +84,8 @@ import com.google.gwt.http.client.Response;
 
 public abstract class PutRequest implements ScheduledCommand {
 
+    private final Pithos app;
+
     private String api;
 
     protected String owner;
@@ -95,7 +98,8 @@ public abstract class PutRequest implements ScheduledCommand {
 
     public abstract void onError(Throwable t);
 
-    public PutRequest(String api, String owner, String path) {
+    public PutRequest(Pithos app, String api, String owner, String path) {
+        this.app = app;
         this.api = api;
         this.owner = owner;
         this.path = path;
@@ -116,7 +120,7 @@ public abstract class PutRequest implements ScheduledCommand {
 
                 @Override
                 public Resource deserialize(Response response) {
-                    return Resource.createFromResponse(Resource.class, owner, response, null);
+                    return Resource.createFromResponse(app, Resource.class, owner, response, null);
                 }
 
                 @Override
index ceab232..96e71e8 100644 (file)
@@ -147,7 +147,7 @@ public class TagTreeViewModel implements TreeViewModel {
         if (iter.hasNext()) {
             Folder f = iter.next();
             String path = f.getUri() + "?format=json&meta=" + t.getName();
-            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), app.getUserID(), path) {
+            GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), app.getUserID(), path) {
                 @Override
                 public void onSuccess(Folder _result) {
                     files.addAll(_result.getFiles());