Permissions are requested just before showing the contect and tools menu (issue ...
authorChristos Stathis <chstath@ebs.gr>
Mon, 20 Feb 2012 17:08:41 +0000 (19:08 +0200)
committerChristos Stathis <chstath@ebs.gr>
Mon, 20 Feb 2012 17:08:41 +0000 (19:08 +0200)
src/gr/grnet/pithos/web/client/FileList.java
src/gr/grnet/pithos/web/client/Pithos.java
src/gr/grnet/pithos/web/client/Toolbar.java
src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java
src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java
src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java
src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java

index ed4fd2a..b725943 100644 (file)
@@ -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<File> selectedFiles = getSelectedFiles();
+                                                       Iterator<File> 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<File> 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();
+       }
 }
index 56194c1..d91302f 100644 (file)
@@ -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<Folder> headFolder = new HeadRequest<Folder>(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<File> headFile = new HeadRequest<File>(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);
+       }
 }
index 73cb1e0..2c9f8cc 100644 (file)
@@ -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);
index aca0326..c4bdf83 100644 (file)
@@ -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<File> headFile = new HeadRequest<File>(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<Folder> headFolder = new HeadRequest<Folder>(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);
-       }
 }
index ab90d93..5035473 100644 (file)
@@ -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<Folder> 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<Folder> 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();
+                                       }
+                               });
             }
         }
     };
index 1c834d1..ba1d60c 100644 (file)
@@ -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<Folder> valueUpdater) {
+        public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater<Folder> 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();
+                                       }
+                               });
             }
         }
     };
index fad3c86..aca6c64 100644 (file)
@@ -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<Folder> valueUpdater) {
+        public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater<Folder> 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();
+                                       }
+                               });
             }
         }
     };