From a2f617f89274e5bd069ee9e7cb99d37c80b8212c Mon Sep 17 00:00:00 2001 From: Christos Stathis Date: Mon, 20 Feb 2012 19:08:41 +0200 Subject: [PATCH] Permissions are requested just before showing the contect and tools menu (issue #2050) --- src/gr/grnet/pithos/web/client/FileList.java | 46 +++++++-- src/gr/grnet/pithos/web/client/Pithos.java | 89 +++++++++++++++++ src/gr/grnet/pithos/web/client/Toolbar.java | 58 ++++++----- .../web/client/commands/PropertiesCommand.java | 102 +------------------- .../web/client/foldertree/FolderTreeViewModel.java | 16 ++- .../client/mysharedtree/MysharedTreeViewModel.java | 17 +++- .../othersharedtree/OtherSharedTreeViewModel.java | 17 +++- 7 files changed, 200 insertions(+), 145 deletions(-) diff --git a/src/gr/grnet/pithos/web/client/FileList.java b/src/gr/grnet/pithos/web/client/FileList.java index ed4fd2a..b725943 100644 --- a/src/gr/grnet/pithos/web/client/FileList.java +++ b/src/gr/grnet/pithos/web/client/FileList.java @@ -60,6 +60,7 @@ import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; @@ -318,15 +319,29 @@ public class FileList extends Composite { vp.setCellWidth(celltable, "100%"); vp.addHandler(new ContextMenuHandler() { @Override - public void onContextMenu(ContextMenuEvent event) { - TreeView tree = app.getSelectedTree(); + public void onContextMenu(final ContextMenuEvent event) { + final TreeView tree = app.getSelectedTree(); if (tree != null && (tree.equals(app.getFolderTreeView()) || tree.equals(app.getOtherSharedTreeView()))) { - Folder selectedFolder = app.getSelection(); - FileContextMenu contextMenu = new FileContextMenu(app, images, tree, selectedFolder, getSelectedFiles()); - int x = event.getNativeEvent().getClientX(); - int y = event.getNativeEvent().getClientY(); - contextMenu.setPopupPosition(x, y); - contextMenu.show(); + final int x = event.getNativeEvent().getClientX(); + final int y = event.getNativeEvent().getClientY(); + final Folder selectedFolder = app.getSelection(); + app.scheduleFolderHeadCommand(selectedFolder, new Command() { + + @Override + public void execute() { + final List selectedFiles = getSelectedFiles(); + Iterator iter = selectedFiles.iterator(); + iterateFilesHeadCommand(iter, new Command() { + + @Override + public void execute() { + FileContextMenu contextMenu = new FileContextMenu(app, images, tree, selectedFolder, selectedFiles); + contextMenu.setPopupPosition(x, y); + contextMenu.show(); + } + }); + } + }); } } }, ContextMenuEvent.getType()); @@ -589,4 +604,19 @@ public class FileList extends Composite { //celltable.redraw(); celltable.redrawHeaders(); } + + void iterateFilesHeadCommand(final Iterator iter, final Command callback) { + if (iter.hasNext()) { + File f = iter.next(); + app.scheduleFileHeadCommand(f, new Command() { + + @Override + public void execute() { + iterateFilesHeadCommand(iter, callback); + } + }); + } + else if (callback != null) + callback.execute(); + } } diff --git a/src/gr/grnet/pithos/web/client/Pithos.java b/src/gr/grnet/pithos/web/client/Pithos.java index 56194c1..d91302f 100644 --- a/src/gr/grnet/pithos/web/client/Pithos.java +++ b/src/gr/grnet/pithos/web/client/Pithos.java @@ -1188,4 +1188,93 @@ public class Pithos implements EntryPoint, ResizeHandler { upload.addStyleName("pithos-uploadButton-loading"); upload.setTitle("Upload in progress. Click for details."); } + + public void scheduleFolderHeadCommand(final Folder folder, final Command callback) { + HeadRequest headFolder = new HeadRequest(Folder.class, getApiPath(), folder.getOwner(), folder.getUri(), folder) { + + @Override + public void onSuccess(Folder _result) { + if (callback != null) + callback.execute(); + } + + @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(getApiPath(), folder.getOwner(), path) { + @Override + public void onSuccess(Resource _result) { + scheduleFolderHeadCommand(folder, callback); + } + + @Override + public void onError(Throwable _t) { + GWT.log("", _t); + setError(_t); + if(_t instanceof RestException){ + displayError("Unable to create folder: " + ((RestException) _t).getHttpStatusText()); + } + else + displayError("System error creating folder: " + _t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + sessionExpired(); + } + }; + newFolder.setHeader("X-Auth-Token", getToken()); + newFolder.setHeader("Content-Type", "application/folder"); + newFolder.setHeader("Accept", "*/*"); + newFolder.setHeader("Content-Length", "0"); + Scheduler.get().scheduleDeferred(newFolder); + } + else + displayError("Error heading folder: " + ((RestException) t).getHttpStatusText()); + } + else + displayError("System error heading folder: " + t.getMessage()); + + GWT.log("Error heading folder", t); + setError(t); + } + + @Override + protected void onUnauthorized(Response response) { + sessionExpired(); + } + }; + headFolder.setHeader("X-Auth-Token", getToken()); + Scheduler.get().scheduleDeferred(headFolder); + } + + public void scheduleFileHeadCommand(File f, final Command callback) { + HeadRequest headFile = new HeadRequest(File.class, getApiPath(), f.getOwner(), f.getUri(), f) { + + @Override + public void onSuccess(File _result) { + if (callback != null) + callback.execute(); + } + + @Override + public void onError(Throwable t) { + GWT.log("Error heading file", t); + setError(t); + if (t instanceof RestException) + displayError("Error heading file: " + ((RestException) t).getHttpStatusText()); + else + displayError("System error heading file: " + t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + sessionExpired(); + } + }; + headFile.setHeader("X-Auth-Token", getToken()); + Scheduler.get().scheduleDeferred(headFile); + } } diff --git a/src/gr/grnet/pithos/web/client/Toolbar.java b/src/gr/grnet/pithos/web/client/Toolbar.java index 73cb1e0..2c9f8cc 100644 --- a/src/gr/grnet/pithos/web/client/Toolbar.java +++ b/src/gr/grnet/pithos/web/client/Toolbar.java @@ -51,11 +51,11 @@ public class Toolbar extends Composite { Pithos app; - private Anchor newFolderButton; + Anchor newFolderButton; - private Anchor shareFolderButton; + Anchor shareFolderButton; - private Anchor refreshButton; + Anchor refreshButton; private Anchor toolsButton; @@ -153,30 +153,36 @@ public class Toolbar extends Composite { } public void showRelevantButtons() { - Folder folder = app.getSelectedTree().getSelection(); + final Folder folder = app.getSelectedTree().getSelection(); if (folder != null) { - Boolean[] permissions = folder.getPermissions().get(app.getUsername()); - boolean canWrite = folder.getOwner().equals(app.getUsername()) || (permissions!= null && permissions[1] != null && permissions[1]); - boolean isFolderTreeSelected = app.getSelectedTree().equals(app.getFolderTreeView()); - boolean otherSharedTreeSelected = app.getSelectedTree().equals(app.getOtherSharedTreeView()); - - if (isFolderTreeSelected || otherSharedTreeSelected) - refreshButton.setVisible(true); - else - refreshButton.setVisible(true); - - if (!folder.isInTrash() && canWrite) { - if (isFolderTreeSelected || otherSharedTreeSelected) - newFolderButton.setVisible(true); - if (isFolderTreeSelected && !folder.isContainer()) - shareFolderButton.setVisible(true); - else - shareFolderButton.setVisible(false); - } - else { - newFolderButton.setVisible(false); - shareFolderButton.setVisible(false); - } + app.scheduleFolderHeadCommand(folder, new Command() { + + @Override + public void execute() { + Boolean[] permissions = folder.getPermissions().get(app.getUsername()); + boolean canWrite = folder.getOwner().equals(app.getUsername()) || (permissions!= null && permissions[1] != null && permissions[1]); + boolean isFolderTreeSelected = app.getSelectedTree().equals(app.getFolderTreeView()); + boolean otherSharedTreeSelected = app.getSelectedTree().equals(app.getOtherSharedTreeView()); + + if (isFolderTreeSelected || otherSharedTreeSelected) + refreshButton.setVisible(true); + else + refreshButton.setVisible(true); + + if (!folder.isInTrash() && canWrite) { + if (isFolderTreeSelected || otherSharedTreeSelected) + newFolderButton.setVisible(true); + if (isFolderTreeSelected && !folder.isContainer()) + shareFolderButton.setVisible(true); + else + shareFolderButton.setVisible(false); + } + else { + newFolderButton.setVisible(false); + shareFolderButton.setVisible(false); + } + } + }); } else { newFolderButton.setVisible(false); diff --git a/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java b/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java index aca0326..c4bdf83 100644 --- a/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java +++ b/src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java @@ -43,16 +43,9 @@ import gr.grnet.pithos.web.client.FolderPropertiesDialog; 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.HeadRequest; -import gr.grnet.pithos.web.client.rest.PutRequest; -import gr.grnet.pithos.web.client.rest.RestException; import java.util.List; -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.user.client.Command; import com.google.gwt.user.client.ui.PopupPanel; @@ -99,7 +92,7 @@ public class PropertiesCommand implements Command { dlg.center(); break; case PERMISSIONS: - scheduleFolderHeadCommand(folder, new Command() { + app.scheduleFolderHeadCommand(folder, new Command() { @Override public void execute() { @@ -123,7 +116,7 @@ public class PropertiesCommand implements Command { final File f = files.get(0); switch (tabToShow) { case PROPERTIES: - scheduleFileHeadCommand(f, new Command() { + app.scheduleFileHeadCommand(f, new Command() { @Override public void execute() { @@ -133,7 +126,7 @@ public class PropertiesCommand implements Command { }); break; case PERMISSIONS: - scheduleFileHeadCommand(f, new Command() { + app.scheduleFileHeadCommand(f, new Command() { @Override public void execute() { @@ -152,93 +145,4 @@ public class PropertiesCommand implements Command { } } } - - private void scheduleFileHeadCommand(File f, final Command callback) { - HeadRequest headFile = new HeadRequest(File.class, app.getApiPath(), f.getOwner(), f.getUri(), f) { - - @Override - public void onSuccess(File _result) { - if (callback != null) - callback.execute(); - } - - @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 Command callback) { - HeadRequest headFolder = new HeadRequest(Folder.class, app.getApiPath(), folder.getOwner(), folder.getUri(), folder) { - - @Override - public void onSuccess(Folder _result) { - if (callback != null) - callback.execute(); - } - - @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, callback); - } - - @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/FolderTreeViewModel.java b/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java index ab90d93..5035473 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java @@ -88,12 +88,20 @@ public class FolderTreeViewModel implements TreeViewModel { } @Override - public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater valueUpdater) { + public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater valueUpdater) { if (event.getType().equals(ContextMenuEvent.getType().getName())) { + final int x = event.getClientX(); + final int y = event.getClientY(); FolderTreeViewModel.this.selectionModel.setSelected(folder, true); - FolderContextMenu menu = new FolderContextMenu(app, FolderTreeView.images, app.getSelectedTree(), folder); - menu.setPopupPosition(event.getClientX(), event.getClientY()); - menu.show(); + app.scheduleFolderHeadCommand(folder, new Command() { + + @Override + public void execute() { + FolderContextMenu menu = new FolderContextMenu(app, FolderTreeView.images, app.getSelectedTree(), folder); + menu.setPopupPosition(x, y); + menu.show(); + } + }); } } }; diff --git a/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java b/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java index 1c834d1..ba1d60c 100644 --- a/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java @@ -39,6 +39,7 @@ import gr.grnet.pithos.web.client.FolderContextMenu; 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.FolderTreeView; import gr.grnet.pithos.web.client.mysharedtree.MysharedTreeView.Templates; import gr.grnet.pithos.web.client.rest.GetRequest; import gr.grnet.pithos.web.client.rest.RestException; @@ -85,12 +86,20 @@ public class MysharedTreeViewModel implements TreeViewModel { } @Override - public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater valueUpdater) { + public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater valueUpdater) { if (event.getType().equals(ContextMenuEvent.getType().getName())) { + final int x = event.getClientX(); + final int y = event.getClientY(); MysharedTreeViewModel.this.selectionModel.setSelected(folder, true); - FolderContextMenu menu = new FolderContextMenu(app, MysharedTreeView.images, app.getSelectedTree(), folder); - menu.setPopupPosition(event.getClientX(), event.getClientY()); - menu.show(); + app.scheduleFolderHeadCommand(folder, new Command() { + + @Override + public void execute() { + FolderContextMenu menu = new FolderContextMenu(app, MysharedTreeView.images, app.getSelectedTree(), folder); + menu.setPopupPosition(x, y); + menu.show(); + } + }); } } }; diff --git a/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java b/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java index fad3c86..aca6c64 100644 --- a/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java @@ -41,6 +41,7 @@ import gr.grnet.pithos.web.client.SharingUsers; import gr.grnet.pithos.web.client.foldertree.AccountResource; import gr.grnet.pithos.web.client.foldertree.File; import gr.grnet.pithos.web.client.foldertree.Folder; +import gr.grnet.pithos.web.client.mysharedtree.MysharedTreeView; import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeView.Templates; import gr.grnet.pithos.web.client.rest.GetRequest; import gr.grnet.pithos.web.client.rest.RestException; @@ -86,12 +87,20 @@ public class OtherSharedTreeViewModel implements TreeViewModel { } @Override - public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater valueUpdater) { + public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater valueUpdater) { if (event.getType().equals(ContextMenuEvent.getType().getName())) { + final int x = event.getClientX(); + final int y = event.getClientY(); OtherSharedTreeViewModel.this.selectionModel.setSelected(folder, true); - FolderContextMenu menu = new FolderContextMenu(app, OtherSharedTreeView.images, app.getSelectedTree(), folder); - menu.setPopupPosition(event.getClientX(), event.getClientY()); - menu.show(); + app.scheduleFolderHeadCommand(folder, new Command() { + + @Override + public void execute() { + FolderContextMenu menu = new FolderContextMenu(app, OtherSharedTreeView.images, app.getSelectedTree(), folder); + menu.setPopupPosition(x, y); + menu.show(); + } + }); } } }; -- 1.7.10.4