Empty trash feature (still buggy
authorChristos Stathis <chstath@ebs.gr>
Wed, 14 Sep 2011 14:39:00 +0000 (17:39 +0300)
committerChristos Stathis <chstath@ebs.gr>
Wed, 14 Sep 2011 14:39:00 +0000 (17:39 +0300)
web_client/src/gr/grnet/pithos/web/client/commands/EmptyTrashCommand.java
web_client/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FolderTreeView.java

index 6bf19a9..fcc0ced 100644 (file)
  */
 package gr.grnet.pithos.web.client.commands;
 
+import java.util.Iterator;
+
 import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.foldertree.File;
+import gr.grnet.pithos.web.client.foldertree.Folder;
+import gr.grnet.pithos.web.client.foldertree.Resource;
+import gr.grnet.pithos.web.client.rest.DeleteRequest;
+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.user.client.Command;
 import com.google.gwt.user.client.ui.PopupPanel;
 
@@ -46,7 +55,7 @@ import com.google.gwt.user.client.ui.PopupPanel;
 public class EmptyTrashCommand implements Command{
        private PopupPanel containerPanel;
 
-    private Pithos app;
+    Pithos app;
 
        public EmptyTrashCommand(Pithos _app, PopupPanel _containerPanel){
         app = _app;
@@ -57,5 +66,98 @@ public class EmptyTrashCommand implements Command{
        public void execute() {
                if (containerPanel != null)
                        containerPanel.hide();
+               
+               final Folder trash = app.getAccount().getTrash();
+               if (trash != null) {
+                       Iterator<File> iter = trash.getFiles().iterator();
+                       deleteFile(iter, new Command() {
+                               
+                               @Override
+                               public void execute() {
+                                       Iterator<Folder> iter2 = trash.getSubfolders().iterator();
+                                       deleteSubfolder(iter2, new Command() {
+                                               
+                                               @Override
+                                               public void execute() {
+                                                       app.updateTrash(true, null);
+                                               }
+                                       });
+                               }
+                       });
+               }
+       }
+
+       protected void deleteSubfolder(final Iterator<Folder> iter2, final Command callback) {
+               if (iter2.hasNext()) {
+                       final Folder f = iter2.next();
+                       Iterator<File> iter3 = f.getFiles().iterator();
+                       deleteFile(iter3, new Command() {
+                               
+                               @Override
+                               public void execute() {
+                                       Iterator<Folder> iter4 = f.getSubfolders().iterator();
+                                       deleteSubfolder(iter4, new Command() {
+                                               
+                                               @Override
+                                               public void execute() {
+                                                       String path = f.getUri();
+                                                       DeleteRequest deleteF = new DeleteRequest(app.getApiPath(), f.getOwner(), path) {
+                                                               
+                                                               @Override
+                                                               public void onSuccess(Resource result) {
+                                                                       deleteSubfolder(iter2, callback);
+                                                               }
+                                                               
+                                                               @Override
+                                                               public void onError(Throwable t) {
+                                                                       GWT.log("", t);
+                                                                       if (t instanceof RestException) {
+                                                                               app.displayError("Unable to delete file:" + ((RestException) t).getHttpStatusText());
+                                                                       }
+                                                                       else
+                                                                               app.displayError("System error deleting file:" + t.getMessage());
+                                                               }
+                                                       };
+                                                       deleteF.setHeader("X-Auth-Token", app.getToken());
+                                                       Scheduler.get().scheduleDeferred(deleteF);
+                                               }
+                                       });
+                               }
+                       });
+               }
+               else {
+                       if (callback != null)
+                               callback.execute();
+               }
+       }
+
+       void deleteFile(final Iterator<File> iter, final Command callback) {
+               if (iter.hasNext()) {
+                       File f = iter.next();
+                       String path = f.getUri();
+                       DeleteRequest deleteF = new DeleteRequest(app.getApiPath(), f.getOwner(), path) {
+                               
+                               @Override
+                               public void onSuccess(Resource result) {
+                                       deleteFile(iter, callback);
+                               }
+                               
+                               @Override
+                               public void onError(Throwable t) {
+                                       GWT.log("", t);
+                                       if (t instanceof RestException) {
+                                               app.displayError("Unable to delete file:" + ((RestException) t).getHttpStatusText());
+                                       }
+                                       else
+                                               app.displayError("System error deleting file:" + t.getMessage());
+                               }
+                       };
+                       deleteF.setHeader("X-Auth-Token", app.getToken());
+                       Scheduler.get().scheduleDeferred(deleteF);
+               }
+               else {
+                       if (callback != null)
+                               callback.execute();
+               }
        }
 }
index de26365..18d781c 100644 (file)
@@ -239,4 +239,12 @@ public class AccountResource extends Resource {
        public void removeGroup(Group group) {
                groups.remove(group);
        }
+
+       public Folder getTrash() {
+               for (Folder c : containers) {
+                       if (c.getName().equals(Pithos.TRASH_CONTAINER))
+                               return c;
+               }
+               return null;
+       }
 }
index 76cba0a..733779c 100644 (file)
@@ -57,17 +57,17 @@ public class FolderTreeView extends Composite {
 
     private void updateChildren(TreeNode node, Folder folder) {
         for (int i=0; i<node.getChildCount(); i++) {
-            if (node.isChildOpen(i)) {
-                if (folder.equals(node.getChildValue(i))) {
-                    node.setChildOpen(i, false, true);
-                    node.setChildOpen(i, true, true);
-                }
-                else {
+            if (folder.equals(node.getChildValue(i))) {
+                node.setChildOpen(i, false, true);
+                node.setChildOpen(i, true, true);
+            }
+            else {
+                if (node.isChildOpen(i)) {
                     TreeNode n = node.setChildOpen(i, true);
                     updateChildren(n, folder);
                 }
             }
-        }
+       }
     }
 
     static interface BasicResources extends CellTree.Resources {