From 340bf0d65be5cffc3c849ff2a3a653f655bda45b Mon Sep 17 00:00:00 2001 From: Christos Stathis Date: Mon, 26 Sep 2011 14:24:33 +0300 Subject: [PATCH] Fixed bug in restore-from-trash where very deep trees were not restored --- src/gr/grnet/pithos/web/client/Pithos.java | 4 + .../web/client/commands/RestoreTrashCommand.java | 105 +++++++++++++------- .../pithos/web/client/commands/ToTrashCommand.java | 5 +- .../web/client/foldertree/AccountResource.java | 7 ++ 4 files changed, 84 insertions(+), 37 deletions(-) diff --git a/src/gr/grnet/pithos/web/client/Pithos.java b/src/gr/grnet/pithos/web/client/Pithos.java index 5231d63..7ae6ad3 100644 --- a/src/gr/grnet/pithos/web/client/Pithos.java +++ b/src/gr/grnet/pithos/web/client/Pithos.java @@ -1102,4 +1102,8 @@ public class Pithos implements EntryPoint, ResizeHandler { public void sessionExpired() { new SessionExpiredDialog(this).center(); } + + public void updateRootFolder(Command callback) { + updateFolder(account.getPithos(), false, callback); + } } diff --git a/src/gr/grnet/pithos/web/client/commands/RestoreTrashCommand.java b/src/gr/grnet/pithos/web/client/commands/RestoreTrashCommand.java index dd8cbfe..a3f220d 100644 --- a/src/gr/grnet/pithos/web/client/commands/RestoreTrashCommand.java +++ b/src/gr/grnet/pithos/web/client/commands/RestoreTrashCommand.java @@ -42,12 +42,14 @@ 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.GetRequest; import gr.grnet.pithos.web.client.rest.PutRequest; 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; @@ -100,44 +102,69 @@ public class RestoreTrashCommand implements Command { PutRequest createFolder = new PutRequest(app.getApiPath(), app.getUsername(), path) { @Override public void onSuccess(@SuppressWarnings("unused") Resource result) { - Iterator iter = f.getFiles().iterator(); - untrashFiles(iter, new Command() { - @Override - public void execute() { - Iterator iterf = f.getSubfolders().iterator(); - untrashSubfolders(iterf, new Command() { - - @Override - public void execute() { - DeleteRequest deleteFolder = new DeleteRequest(app.getApiPath(), f.getOwner(), f.getUri()) { + GetRequest getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix()), f) { + + @Override + public void onSuccess(final Folder _f) { + Iterator iter = _f.getFiles().iterator(); + untrashFiles(iter, new Command() { + @Override + public void execute() { + Iterator iterf = _f.getSubfolders().iterator(); + untrashSubfolders(iterf, new Command() { @Override - public void onSuccess(@SuppressWarnings("unused") Resource _result) { - if (callback != null) - callback.execute(); + public void execute() { + DeleteRequest deleteFolder = new DeleteRequest(app.getApiPath(), _f.getOwner(), _f.getUri()) { + + @Override + public void onSuccess(@SuppressWarnings("unused") Resource _result) { + app.updateRootFolder(callback); + } + + @Override + public void onError(Throwable t) { + GWT.log("", t); + if (t instanceof RestException) { + if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) + onSuccess(null); + else + app.displayError("Unable to delete folder: " + ((RestException) t).getHttpStatusText()); + } + else + app.displayError("System error unable to delete folder: "+t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; + deleteFolder.setHeader("X-Auth-Token", app.getToken()); + Scheduler.get().scheduleDeferred(deleteFolder); } - - @Override - public void onError(Throwable t) { - GWT.log("", t); - if (t instanceof RestException) { - app.displayError("Unable to delete folder: " + ((RestException) t).getHttpStatusText()); - } - else - app.displayError("System error unable to delete folder: "+t.getMessage()); - } - - @Override - protected void onUnauthorized(Response response) { - app.sessionExpired(); - } - }; - deleteFolder.setHeader("X-Auth-Token", app.getToken()); - Scheduler.get().scheduleDeferred(deleteFolder); - } - }); - } - }); + }); + } + }); + } + + @Override + public void onError(Throwable t) { + GWT.log("", t); + if (t instanceof RestException) { + app.displayError("Unable to get folder: " + ((RestException) t).getHttpStatusText()); + } + else + app.displayError("System error getting folder: " + t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; + getFolder.setHeader("X-Auth-Token", app.getToken()); + Scheduler.get().scheduleDeferred(getFolder); } @Override @@ -199,7 +226,13 @@ public class RestoreTrashCommand implements Command { protected void untrashSubfolders(final Iterator iter, final Command callback) { if (iter.hasNext()) { final Folder f = iter.next(); - untrashFolder(f, callback); + untrashFolder(f, new Command() { + + @Override + public void execute() { + untrashSubfolders(iter, callback); + } + }); } else { if (callback != null) diff --git a/src/gr/grnet/pithos/web/client/commands/ToTrashCommand.java b/src/gr/grnet/pithos/web/client/commands/ToTrashCommand.java index b4677dc..538d48c 100644 --- a/src/gr/grnet/pithos/web/client/commands/ToTrashCommand.java +++ b/src/gr/grnet/pithos/web/client/commands/ToTrashCommand.java @@ -127,7 +127,10 @@ public class ToTrashCommand implements Command{ public void onError(Throwable t) { GWT.log("", t); if (t instanceof RestException) { - app.displayError("Unable to delete folder: " + ((RestException) t).getHttpStatusText()); + if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) + onSuccess(null); + else + app.displayError("Unable to delete folder: " + ((RestException) t).getHttpStatusText()); } else app.displayError("System error unable to delete folder: "+t.getMessage()); diff --git a/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java b/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java index bf4a7bf..6c5e5f8 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java +++ b/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java @@ -259,4 +259,11 @@ public class AccountResource extends Resource { public double getUsedPercentage() { return 100.0 * bytesUsed / (bytesUsed + bytesRemaining); } + + public Folder getPithos() { + for (Folder f : containers) + if (f.getName().equals(Pithos.HOME_CONTAINER)) + return f; + return null; + } } -- 1.7.10.4