Fixed folder deletion with all subfolders and files
authorChristos Stathis <chstath@ebs.gr>
Fri, 8 Jul 2011 10:54:26 +0000 (13:54 +0300)
committerChristos Stathis <chstath@ebs.gr>
Fri, 8 Jul 2011 10:54:26 +0000 (13:54 +0300)
web_client/src/gr/grnet/pithos/web/client/DeleteFolderDialog.java
web_client/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java
web_client/src/gr/grnet/pithos/web/client/foldertree/File.java
web_client/src/gr/grnet/pithos/web/client/foldertree/Folder.java
web_client/src/gr/grnet/pithos/web/client/foldertree/Resource.java

index 4e1cbf1..a3b3eac 100644 (file)
@@ -36,13 +36,26 @@ package gr.grnet.pithos.web.client;
 \r
 import com.google.gwt.core.client.Scheduler;\r
 import com.google.gwt.event.dom.client.KeyDownEvent;\r
+import com.google.gwt.http.client.Request;\r
+import com.google.gwt.http.client.RequestBuilder;\r
+import com.google.gwt.http.client.RequestCallback;\r
+import com.google.gwt.http.client.RequestException;\r
+import com.google.gwt.http.client.Response;\r
+import com.google.gwt.json.client.JSONArray;\r
+import com.google.gwt.json.client.JSONObject;\r
+import com.google.gwt.json.client.JSONParser;\r
+import com.google.gwt.json.client.JSONString;\r
+import com.google.gwt.json.client.JSONValue;\r
 import com.google.gwt.user.client.Event;\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.Folder;\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.GetRequest;\r
 import gr.grnet.pithos.web.client.rest.RestException;\r
+import gr.grnet.pithos.web.client.rest.RestRequestCallback;\r
 import gr.grnet.pithos.web.client.rest.resource.FolderResource;\r
 import gr.grnet.pithos.web.client.rest.resource.RestResource;\r
 import gr.grnet.pithos.web.client.rest.resource.RestResourceWrapper;\r
@@ -62,6 +75,8 @@ import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
 import com.google.gwt.user.client.ui.HorizontalPanel;\r
 import com.google.gwt.user.client.ui.VerticalPanel;\r
+import java.util.Iterator;\r
+import java.util.List;\r
 \r
 /**\r
  * The 'delete folder' dialog box.\r
@@ -126,27 +141,112 @@ public class DeleteFolderDialog extends DialogBox {
         *\r
         */\r
        private void deleteFolder() {\r
-        String prefix = folder.getPrefix();\r
-        String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + (prefix.length() == 0 ? "" : "/" + prefix);\r
-        DeleteRequest deleteFolder = new DeleteRequest(path) {\r
-            @Override\r
-            public void onSuccess(Resource result) {\r
-                app.updateFolder(folder.getParent());\r
+        String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + "?format=json&delimiter=/&prefix=" + folder.getPrefix();\r
+        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, path);\r
+        builder.setHeader("If-Modified-Since", "0");\r
+        builder.setHeader("X-Auth-Token", app.getToken());\r
+        try {\r
+            builder.sendRequest("", new RequestCallback() {\r
+                @Override\r
+                public void onResponseReceived(Request request, Response response) {\r
+                    if (response.getStatusCode() == Response.SC_OK) {\r
+                        JSONValue json = JSONParser.parseStrict(response.getText());\r
+                        JSONArray array = json.isArray();\r
+                        int i = 0;\r
+                        if (array != null) {\r
+                            deleteObject(i, array);\r
+                        }\r
+                    }\r
+                }\r
+\r
+                @Override\r
+                public void onError(Request request, Throwable exception) {\r
+                    GSS.get().displayError("System error unable to delete folder: " + exception.getMessage());\r
+                }\r
+            });\r
+        }\r
+        catch (RequestException e) {\r
+        }\r
+       }\r
+\r
+    private void deleteObject(final int i, final JSONArray array) {\r
+        if (i < array.size()) {\r
+            JSONObject o = array.get(i).isObject();\r
+            if (o != null && !o.containsKey("subdir")) {\r
+                JSONString name = o.get("name").isString();\r
+                String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + "/" + name.stringValue();\r
+                DeleteRequest delete = new DeleteRequest(path) {\r
+                    @Override\r
+                    public void onSuccess(Resource result) {\r
+                        deleteObject(i + 1, array);\r
+                    }\r
+\r
+                    @Override\r
+                    public void onError(Throwable t) {\r
+                        GWT.log("", t);\r
+                        GSS.get().displayError("System error unable to delete folder: " + t.getMessage());\r
+                    }\r
+                };\r
+                delete.setHeader("X-Auth-Token", app.getToken());\r
+                Scheduler.get().scheduleDeferred(delete);\r
             }\r
+            else {\r
+                String subdir = o.get("subdir").isString().stringValue();\r
+                subdir = subdir.substring(0, subdir.length() - 1);\r
+                String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + "?format=json&delimiter=/&prefix=" + subdir;\r
+                RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, path);\r
+                builder.setHeader("If-Modified-Since", "0");\r
+                builder.setHeader("X-Auth-Token", app.getToken());\r
+                try {\r
+                    builder.sendRequest("", new RequestCallback() {\r
+                        @Override\r
+                        public void onResponseReceived(Request request, Response response) {\r
+                            if (response.getStatusCode() == Response.SC_OK) {\r
+                                JSONValue json = JSONParser.parseStrict(response.getText());\r
+                                JSONArray array2 = json.isArray();\r
+                                if (array2 != null) {\r
+                                    int l = array.size();\r
+                                    for (int j=0; j<array2.size(); j++) {\r
+                                        array.set(l++, array2.get(j));\r
+                                    }\r
+                                }\r
+                                deleteObject(i + 1, array);\r
+                            }\r
+                        }\r
 \r
-            @Override\r
-            public void onError(Throwable t) {\r
-                GWT.log("", t);\r
-                if (t instanceof RestException) {\r
-                    app.displayError("Unable to delete folder: "+((RestException) t).getHttpStatusText());\r
+                        @Override\r
+                        public void onError(Request request, Throwable exception) {\r
+                            GSS.get().displayError("System error unable to delete folder: " + exception.getMessage());\r
+                        }\r
+                    });\r
+                }\r
+                catch (RequestException e) {\r
                 }\r
-                else\r
-                    GSS.get().displayError("System error unable to delete folder: " + t.getMessage());\r
             }\r
-        };\r
-        deleteFolder.setHeader("X-Auth-Token", app.getToken());\r
-        Scheduler.get().scheduleDeferred(deleteFolder);\r
-       }\r
+        }\r
+        else {\r
+            String prefix = folder.getPrefix();\r
+            String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + (prefix.length() == 0 ? "" : "/" + prefix);\r
+            DeleteRequest deleteFolder = new DeleteRequest(path) {\r
+                @Override\r
+                public void onSuccess(Resource result) {\r
+                    app.updateFolder(folder.getParent());\r
+                }\r
+\r
+                @Override\r
+                public void onError(Throwable t) {\r
+                    GWT.log("", t);\r
+                    if (t instanceof RestException) {\r
+                        app.displayError("Unable to delete folder: "+((RestException) t).getHttpStatusText());\r
+                    }\r
+                    else\r
+                        GSS.get().displayError("System error unable to delete folder: " + t.getMessage());\r
+                }\r
+            };\r
+            deleteFolder.setHeader("X-Auth-Token", app.getToken());\r
+            Scheduler.get().scheduleDeferred(deleteFolder);\r
+        }\r
+    }\r
 \r
        @Override\r
        protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
index 9c879fb..9f2c1b5 100644 (file)
@@ -121,11 +121,6 @@ public class AccountResource extends Resource {
         this.numberOfObjects = numberOfObjects;
     }
 
-    @Override
-    public String getLastModifiedSince() {
-        return null;
-    }
-
     public Set<Folder> getContainers() {
         return containers;
     }
index 2ba3284..9a17ba8 100644 (file)
@@ -99,11 +99,6 @@ public class File extends Resource {
         return versionTimestamp;
     }
 
-    @Override
-    public String getLastModifiedSince() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
     public String getUri() {
         return "/" + container + "/" + path;
     }
index 271274b..d7175cf 100644 (file)
@@ -176,11 +176,6 @@ public class Folder extends Resource {
         }
     }
 
-    @Override
-    public String getLastModifiedSince() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
     public static Folder createFromResponse(Response response, Folder result) {
         Folder f = null;
         if (result == null)
index 5ed637a..418daae 100644 (file)
@@ -46,7 +46,7 @@ import com.google.gwt.json.client.JSONValue;
 import gr.grnet.pithos.web.client.rest.resource.FolderResource;
 import java.util.Date;
 
-public abstract class Resource {
+public class Resource {
 
     protected static String unmarshallString(JSONObject obj, String key){
         if(obj.get(key) != null) {
@@ -93,8 +93,6 @@ public abstract class Resource {
         return (new Date(ms)).toUTCString();
     }-*/;
 
-    public abstract String getLastModifiedSince();
-
     public static <T> T createFromResponse(Class<T> aClass, Response response, T result) {
         if (aClass.equals(AccountResource.class)) {
             result = (T) AccountResource.createFromResponse(response);