From b3832e4556774db113025f119fda99d711b0a6a3 Mon Sep 17 00:00:00 2001 From: Christos Stathis Date: Fri, 17 Feb 2012 16:46:45 +0200 Subject: [PATCH] Permissions are requested just before the permissions dialog is displayed --- .../web/client/commands/PropertiesCommand.java | 128 +++++++++++++++----- .../grnet/pithos/web/client/foldertree/Folder.java | 11 +- 2 files changed, 106 insertions(+), 33 deletions(-) diff --git a/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java b/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java index 4cf6938..d331ed5 100644 --- a/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java +++ b/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java @@ -45,6 +45,7 @@ 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.HeadRequest; +import gr.grnet.pithos.web.client.rest.PutRequest; import gr.grnet.pithos.web.client.rest.RestException; import java.util.List; @@ -91,15 +92,15 @@ public class PropertiesCommand implements Command { containerPanel.hide(); if (resource instanceof Folder) { - Folder folder = (Folder) resource; + final Folder folder = (Folder) resource; switch (tabToShow) { case PROPERTIES: FolderPropertiesDialog dlg = new FolderPropertiesDialog(app, false, folder); dlg.center(); break; case PERMISSIONS: - FolderPermissionsDialog dlg1 = new FolderPermissionsDialog(app, folder); - dlg1.center(); + final FolderPermissionsDialog dlg1 = new FolderPermissionsDialog(app, folder); + scheduleFolderHeadCommand(folder, dlg1); break; default: break; @@ -113,38 +114,16 @@ public class PropertiesCommand implements Command { dlg.center(); } else { + File f = files.get(0); + PopupPanel dlg = null; switch (tabToShow) { case PROPERTIES: - File f = files.get(0); - final FilePropertiesDialog dlg = new FilePropertiesDialog(app, f); - HeadRequest headFile = new HeadRequest(File.class, app.getApiPath(), f.getOwner(), f.getUri(), f) { - - @Override - public void onSuccess(File _result) { - dlg.center(); - } - - @Override - public void onError(Throwable t) { - GWT.log("Error heading file", t); - app.setError(t); - if (t instanceof RestException) - app.displayError("Error heading file: " + ((RestException) t).getHttpStatusText()); - else - app.displayError("System error heading folder: " + t.getMessage()); - } - - @Override - protected void onUnauthorized(Response response) { - app.sessionExpired(); - } - }; - headFile.setHeader("X-Auth-Token", app.getToken()); - Scheduler.get().scheduleDeferred(headFile); + dlg = new FilePropertiesDialog(app, f); + scheduleFileHeadCommand(f, dlg); break; case PERMISSIONS: - FilePermissionsDialog dlg1 = new FilePermissionsDialog(app, files.get(0)); - dlg1.center(); + dlg = new FilePermissionsDialog(app, f); + scheduleFileHeadCommand(f, dlg); break; case VERSIONS: FileVersionsDialog dlg2 = new FileVersionsDialog(app, files.get(0)); @@ -156,4 +135,91 @@ public class PropertiesCommand implements Command { } } } + + private void scheduleFileHeadCommand(File f, final PopupPanel dlg) { + HeadRequest headFile = new HeadRequest(File.class, app.getApiPath(), f.getOwner(), f.getUri(), f) { + + @Override + public void onSuccess(File _result) { + dlg.center(); + } + + @Override + public void onError(Throwable t) { + GWT.log("Error heading file", t); + app.setError(t); + if (t instanceof RestException) + app.displayError("Error heading file: " + ((RestException) t).getHttpStatusText()); + else + app.displayError("System error heading file: " + t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; + headFile.setHeader("X-Auth-Token", app.getToken()); + Scheduler.get().scheduleDeferred(headFile); + } + + void scheduleFolderHeadCommand(final Folder folder, final FolderPermissionsDialog dlg) { + HeadRequest headFolder = new HeadRequest(Folder.class, app.getApiPath(), folder.getOwner(), folder.getUri(), folder) { + + @Override + public void onSuccess(Folder _result) { + dlg.center(); + } + + @Override + public void onError(Throwable t) { + if (t instanceof RestException) { + if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { + final String path = folder.getUri(); + PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwner(), path) { + @Override + public void onSuccess(Resource _result) { + scheduleFolderHeadCommand(folder, dlg); + } + + @Override + public void onError(Throwable _t) { + GWT.log("", _t); + app.setError(_t); + if(_t instanceof RestException){ + app.displayError("Unable to create folder: " + ((RestException) _t).getHttpStatusText()); + } + else + app.displayError("System error creating folder: " + _t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; + newFolder.setHeader("X-Auth-Token", app.getToken()); + newFolder.setHeader("Content-Type", "application/folder"); + newFolder.setHeader("Accept", "*/*"); + newFolder.setHeader("Content-Length", "0"); + Scheduler.get().scheduleDeferred(newFolder); + } + else + app.displayError("Error heading folder: " + ((RestException) t).getHttpStatusText()); + } + else + app.displayError("System error heading folder: " + t.getMessage()); + + GWT.log("Error heading folder", t); + app.setError(t); + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; + headFolder.setHeader("X-Auth-Token", app.getToken()); + Scheduler.get().scheduleDeferred(headFolder); + } } diff --git a/src/gr/grnet/pithos/web/client/foldertree/Folder.java b/src/gr/grnet/pithos/web/client/foldertree/Folder.java index 3881525..267ec75 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/Folder.java +++ b/src/gr/grnet/pithos/web/client/foldertree/Folder.java @@ -159,11 +159,18 @@ public class Folder extends Resource { if (header != null && header.length() > 0) 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(); + String rawPermissions = response.getHeader("X-Object-Sharing"); + if (rawPermissions != null && rawPermissions.length() > 0) { + parsePermissions(URL.decodePathSegment(rawPermissions)); + } + + if (response.getText() == null || response.getText().isEmpty()) + return; JSONValue json = JSONParser.parseStrict(response.getText()); JSONArray array = json.isArray(); if (array != null) { + subfolders.clear(); //This is necessary in case we update a pre-existing Folder so that stale subfolders won't show up + files.clear(); for (int i=0; i