Implemented single and multiple file deletion
authorChristos Stathis <chstath@ebs.gr>
Thu, 7 Jul 2011 15:26:57 +0000 (18:26 +0300)
committerChristos Stathis <chstath@ebs.gr>
Thu, 7 Jul 2011 15:26:57 +0000 (18:26 +0300)
src/gr/grnet/pithos/web/client/DeleteFileDialog.java
src/gr/grnet/pithos/web/client/FileContextMenu.java
src/gr/grnet/pithos/web/client/FileList.java
src/gr/grnet/pithos/web/client/commands/DeleteCommand.java
src/gr/grnet/pithos/web/client/foldertree/File.java
src/gr/grnet/pithos/web/client/foldertree/Folder.java
src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java

index d781b90..48087e3 100644 (file)
  */\r
 package gr.grnet.pithos.web.client;\r
 \r
+import com.google.gwt.core.client.Scheduler;\r
 import gr.grnet.pithos.web.client.MessagePanel.Images;\r
+import gr.grnet.pithos.web.client.foldertree.File;\r
+import gr.grnet.pithos.web.client.foldertree.Resource;\r
 import gr.grnet.pithos.web.client.rest.DeleteCommand;\r
+import gr.grnet.pithos.web.client.rest.DeleteRequest;\r
 import gr.grnet.pithos.web.client.rest.MultipleDeleteCommand;\r
 import gr.grnet.pithos.web.client.rest.RestException;\r
 import gr.grnet.pithos.web.client.rest.resource.FileResource;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Iterator;\r
 import java.util.List;\r
 \r
 import com.google.gwt.core.client.GWT;\r
@@ -63,23 +68,24 @@ import com.google.gwt.user.client.ui.VerticalPanel;
  */\r
 public class DeleteFileDialog extends DialogBox {\r
 \r
+    private List<File> files;\r
        /**\r
         * The widget's constructor.\r
         *\r
         * @param images the supplied images\r
         */\r
-       public DeleteFileDialog(Images images) {\r
+       public DeleteFileDialog(Images images, List<File> _files) {\r
+        files = _files;\r
                // Set the dialog's caption.\r
                setText("Confirmation");\r
                setAnimationEnabled(true);\r
-               Object selection = GSS.get().getCurrentSelection();\r
                // Create a VerticalPanel to contain the label and the buttons.\r
                VerticalPanel outer = new VerticalPanel();\r
                HorizontalPanel buttons = new HorizontalPanel();\r
 \r
                HTML text;\r
-               if (selection instanceof FileResource)\r
-                       text = new HTML("<table><tr><td>" + AbstractImagePrototype.create(images.warn()).getHTML() + "</td><td>" + "Are you sure you want to <b>permanently</b> delete file '" + ((FileResource) selection).getName() + "'?</td></tr></table>");\r
+               if (files.size() == 1)\r
+                       text = new HTML("<table><tr><td>" + AbstractImagePrototype.create(images.warn()).getHTML() + "</td><td>" + "Are you sure you want to <b>permanently</b> delete file '" + files.get(0).getName() + "'?</td></tr></table>");\r
                else\r
                        text = new HTML("<table><tr><td>" + AbstractImagePrototype.create(images.warn()).getHTML() + "</td><td>" + "Are you sure you want to <b>permanently</b> delete the selected files?</td></tr></table>");\r
                text.setStyleName("pithos-warnMessage");\r
@@ -90,7 +96,7 @@ public class DeleteFileDialog extends DialogBox {
                Button ok = new Button("Delete", new ClickHandler() {\r
                        @Override\r
                        public void onClick(ClickEvent event) {\r
-                               deleteFile();\r
+                               deleteFiles();\r
                                hide();\r
                        }\r
                });\r
@@ -119,85 +125,39 @@ public class DeleteFileDialog extends DialogBox {
 \r
        /**\r
         * Generate an RPC request to delete a file.\r
-        *\r
-        * @param userId the ID of the current user\r
         */\r
-       private void deleteFile() {\r
-               Object selection = GSS.get().getCurrentSelection();\r
-               if (selection == null) {\r
-                       GSS.get().displayError("No file was selected");\r
-                       return;\r
-               }\r
-               if (selection instanceof FileResource) {\r
-                       FileResource file = (FileResource) selection;\r
-\r
-                       DeleteCommand df = new DeleteCommand(file.getUri()){\r
-\r
-                               @Override\r
-                               public void onComplete() {\r
-                                       GSS.get().getTreeView().updateNode(GSS.get().getTreeView().getSelection());\r
-                                       GSS.get().getStatusPanel().updateStats();\r
-                               }\r
-\r
-                               @Override\r
-                               public void onError(Throwable t) {\r
-                                       GWT.log("", t);\r
-                                       if(t instanceof RestException){\r
-                                               int statusCode = ((RestException)t).getHttpStatusCode();\r
-                                               if(statusCode == 405)\r
-                                                       GSS.get().displayError("You don't have the necessary permissions");\r
-                                               else if(statusCode == 404)\r
-                                                       GSS.get().displayError("File not found");\r
-                                               else\r
-                                                       GSS.get().displayError("Unable to delete file: "+((RestException)t).getHttpStatusText());\r
-                                       }\r
-                                       else\r
-                                               GSS.get().displayError("System error unable to delete file: "+t.getMessage());\r
-                               }\r
-                       };\r
-\r
-                       DeferredCommand.addCommand(df);\r
-               }\r
-               else if(selection instanceof List){\r
-                       List<FileResource> files = (List<FileResource>) selection;\r
-                       List<String> fileIds = new ArrayList<String>();\r
-                       for(FileResource f : files)\r
-                               fileIds.add(f.getUri());\r
-\r
-                       MultipleDeleteCommand ed = new MultipleDeleteCommand(fileIds.toArray(new String[0])){\r
-\r
-                               @Override\r
-                               public void onComplete() {\r
-                                       GSS.get().getTreeView().updateNode(GSS.get().getTreeView().getSelection());\r
-                               }\r
-\r
-                               @Override\r
-                               public void onError(Throwable t) {\r
-                                       GWT.log("", t);\r
-                                       GSS.get().getTreeView().updateNode(GSS.get().getTreeView().getSelection());\r
-                               }\r
-\r
-                               @Override\r
-                               public void onError(String path, Throwable t) {\r
-                                       GWT.log("", t);\r
-                                       if(t instanceof RestException){\r
-                                               int statusCode = ((RestException)t).getHttpStatusCode();\r
-                                               if(statusCode == 405)\r
-                                                       GSS.get().displayError("You don't have the necessary permissions");\r
-                                               else if(statusCode == 404)\r
-                                                       GSS.get().displayError("File not found");\r
-                                               else\r
-                                                       GSS.get().displayError("Unable to delete file:"+((RestException)t).getHttpStatusText());\r
-                                       }\r
-                                       else\r
-                                               GSS.get().displayError("System error unable to delete file:"+t.getMessage());\r
-\r
-                               }\r
-                       };\r
-\r
-                       DeferredCommand.addCommand(ed);\r
-               }\r
-       }\r
+       private void deleteFiles() {\r
+        Iterator<File> iter = files.iterator();\r
+        deleteFile(iter);\r
+    }\r
+\r
+    private void deleteFile(final Iterator<File> iter) {\r
+        if (iter.hasNext()) {\r
+            File f = iter.next();\r
+            String path = GSS.get().getApiPath() + GSS.get().getUsername() + f.getUri();\r
+            DeleteRequest deleteFile = new DeleteRequest(path) {\r
+                @Override\r
+                public void onSuccess(Resource result) {\r
+                    deleteFile(iter);\r
+                }\r
+\r
+                @Override\r
+                public void onError(Throwable t) {\r
+                    GWT.log("", t);\r
+                    if (t instanceof RestException) {\r
+                        GSS.get().displayError("Unable to delete file: " + ((RestException) t).getHttpStatusText());\r
+                    }\r
+                    else\r
+                        GSS.get().displayError("System error unable to delete file: "+t.getMessage());\r
+                }\r
+            };\r
+            deleteFile.setHeader("X-Auth-Token", GSS.get().getToken());\r
+            Scheduler.get().scheduleDeferred(deleteFile);\r
+        }\r
+        else {\r
+            GSS.get().updateFolder(files.get(0).getParent());\r
+        }\r
+    }\r
 \r
        @Override\r
        protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
@@ -210,7 +170,7 @@ public class DeleteFileDialog extends DialogBox {
                        switch (evt.getKeyCode()) {\r
                                case KeyCodes.KEY_ENTER:\r
                                        hide();\r
-                                       deleteFile();\r
+                                       deleteFiles();\r
                                        break;\r
                                case KeyCodes.KEY_ESCAPE:\r
                                        hide();\r
index 2da7fb3..9191f1e 100644 (file)
@@ -43,6 +43,7 @@ import gr.grnet.pithos.web.client.commands.RefreshCommand;
 import gr.grnet.pithos.web.client.commands.RestoreTrashCommand;
 import gr.grnet.pithos.web.client.commands.ToTrashCommand;
 import gr.grnet.pithos.web.client.commands.UploadFileCommand;
+import gr.grnet.pithos.web.client.foldertree.File;
 import gr.grnet.pithos.web.client.foldertree.Folder;
 import gr.grnet.pithos.web.client.rest.resource.FileResource;
 import gr.grnet.pithos.web.client.rest.resource.FolderResource;
@@ -127,7 +128,7 @@ public class FileContextMenu extends PopupPanel {
         *
         * @param newImages the image bundle passed on by the parent object
         */
-       public FileContextMenu(Images newImages, Folder selectedFolder, boolean isTrash) {
+       public FileContextMenu(Images newImages, Folder selectedFolder, List<File> selectedFiles, boolean isTrash) {
                // The popup's constructor's argument is a boolean specifying that it
                // auto-close itself when the user clicks outside of it.
                super(true);
@@ -161,7 +162,7 @@ public class FileContextMenu extends PopupPanel {
                        trashItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.emptyTrash()).getHTML() + "&nbsp;Move to Trash</span>", true, new ToTrashCommand(this));
             contextMenu.addItem(trashItem);
 
-                       deleteItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.delete()).getHTML() + "&nbsp;Delete</span>", true, new DeleteCommand(this, null, images));
+                       deleteItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.delete()).getHTML() + "&nbsp;Delete</span>", true, new DeleteCommand(this, selectedFiles, images));
             contextMenu.addItem(deleteItem);
 
                        sharingItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.sharing()).getHTML() + "&nbsp;Sharing</span>", true, new PropertiesCommand(this, images, 1));
index caca830..87e5b0a 100644 (file)
@@ -447,7 +447,7 @@ public class FileList extends Composite {
         vp.addHandler(new ContextMenuHandler() {
             @Override
             public void onContextMenu(ContextMenuEvent event) {
-                FileContextMenu contextMenu = new FileContextMenu(images, treeView.getSelection(), false);
+                FileContextMenu contextMenu = new FileContextMenu(images, treeView.getSelection(), getSelectedFiles(), false);
                 int x = event.getNativeEvent().getClientX();
                 int y = event.getNativeEvent().getClientY();
                 contextMenu.setPopupPosition(x, y);
index 2c45ddd..a76052c 100644 (file)
@@ -60,13 +60,13 @@ public class DeleteCommand implements Command{
        private PopupPanel containerPanel;
        final Images newImages;
 
-    private Resource resource;
+    private Object resource;
 
        /**
         * @param _containerPanel
         * @param _newImages the images of all the possible delete dialogs
         */
-       public DeleteCommand( PopupPanel _containerPanel, Resource resource, final Images _newImages ){
+       public DeleteCommand( PopupPanel _containerPanel, Object resource, final Images _newImages ){
                containerPanel = _containerPanel;
                newImages = _newImages;
         this.resource = resource;
@@ -86,8 +86,8 @@ public class DeleteCommand implements Command{
                if (resource instanceof Folder) {
                        DeleteFolderDialog dlg = new DeleteFolderDialog(GSS.get(), newImages, (Folder) resource);
                        dlg.center();
-               } else if (resource instanceof File) {
-                       DeleteFileDialog dlg = new DeleteFileDialog(newImages);
+               } else if (resource instanceof List) {
+                       DeleteFileDialog dlg = new DeleteFileDialog(newImages, (List<File>) resource);
                        dlg.center();
                }
     }
index 85974b8..2ba3284 100644 (file)
@@ -105,7 +105,7 @@ public class File extends Resource {
     }
 
     public String getUri() {
-        return path + "/" + name;
+        return "/" + container + "/" + path;
     }
 
     public String getOwner() {
@@ -187,4 +187,8 @@ public class File extends Resource {
         JSONValue json = JSONParser.parseStrict(response.getText());
         JSONObject o = json.isObject();
     }
+
+    public Folder getParent() {
+        return parent;
+    }
 }
index ec38f62..271274b 100644 (file)
@@ -127,6 +127,7 @@ public class Folder extends Resource {
             bytesUsed = Long.valueOf(header);
 
         subfolders.clear(); //This is necessary in case we update a pre-existing Folder so that stale subfolders won't show up
+        files.clear();
         JSONValue json = JSONParser.parseStrict(response.getText());
         JSONArray array = json.isArray();
         if (array != null) {
index 47db362..5225cb0 100644 (file)
@@ -174,7 +174,7 @@ public class FolderTreeViewModel implements TreeViewModel {
                 GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
                     @Override
                     public void onSuccess(Folder result) {
-                        app.showFiles(f);
+                        app.showFiles(result);
                         Iterator<Folder> iter = result.getSubfolders().iterator();
                         fetchFolder(iter, dataProvider, result.getSubfolders());
                     }