X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/b3c3954bc4fe72695164df18152f316765828838..c963be61420007d2177be3feb9fa6b9d568e40ca:/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java diff --git a/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java b/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java index 007f865..ecb5765 100644 --- a/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java +++ b/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2012 GRNET S.A. All rights reserved. + * Copyright 2011-2013 GRNET S.A. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following @@ -34,16 +34,6 @@ */ package gr.grnet.pithos.web.client; -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.PostRequest; -import gr.grnet.pithos.web.client.rest.PutRequest; -import gr.grnet.pithos.web.client.rest.RestException; - -import java.util.Iterator; -import java.util.Map; - import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.NativeEvent; @@ -55,13 +45,13 @@ 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.Event.NativePreviewEvent; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.HasHorizontalAlignment; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.*; +import gr.grnet.pithos.web.client.foldertree.Folder; +import gr.grnet.pithos.web.client.rest.PostRequest; +import gr.grnet.pithos.web.client.rest.PutRequest; +import gr.grnet.pithos.web.client.rest.RestException; + +import java.util.Map; /** * The 'Folder properties' dialog box implementation. @@ -70,80 +60,99 @@ public class FolderPermissionsDialog extends DialogBox { protected Pithos app; - /** - * The widget that holds the folderName of the folder. - */ - Label folderName = new Label(); + /** + * The widget that holds the folderName of the folder. + */ + Label folderName = new Label(); - protected PermissionsList permList; + protected PermissionsList permList; - final Folder folder; + final Folder folder; - final VerticalPanel inner; + final VerticalPanel inner; - /** - * The widget's constructor. - */ - public FolderPermissionsDialog(final Pithos app, Folder selected) { + /** + * The widget's constructor. + */ + public FolderPermissionsDialog(final Pithos app, Folder selected) { this.app = app; - Anchor close = new Anchor(); - close.addStyleName("close"); - close.addClickHandler(new ClickHandler() { - - @Override - public void onClick(ClickEvent event) { - hide(); - } - }); + Anchor close = new Anchor("close"); + close.addStyleName("close"); + close.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + hide(); + } + }); - setAnimationEnabled(true); - setGlassEnabled(true); - setStyleName("pithos-DialogBox"); + setGlassEnabled(true); + setStyleName("pithos-DialogBox"); - // Enable IE selection for the dialog (must disable it upon closing it) - Pithos.enableIESelection(); + // Enable IE selection for the dialog (must disable it upon closing it) + Pithos.enableIESelection(); - folder = selected; + folder = selected; - setText("Folder permissions"); + setText(Const.TXT_SHARE_FOLDER); - // Outer contains inner and buttons - VerticalPanel outer = new VerticalPanel(); - outer.add(close); - // Inner contains generalPanel and permPanel - inner = new VerticalPanel(); - inner.addStyleName("inner"); + // Outer contains inner and buttons + VerticalPanel outer = new VerticalPanel(); + outer.add(close); + // Inner contains generalPanel and permPanel + inner = new VerticalPanel(); + inner.addStyleName("inner"); + folderName.setText(folder.getName()); - folderName.setText(folder.getName()); + final HorizontalPanel privateInfoPanel = new HorizontalPanel(); + privateInfoPanel.setSpacing(8); + final Label privateInfoTitle = new InlineHTML("Private sharing"); + final Label privateInfoText = new Label("Only people explicitly granted permission can access. Sign-in required.", true); + privateInfoPanel.add(privateInfoTitle); + privateInfoPanel.add(privateInfoText); + inner.add(privateInfoPanel); VerticalPanel permPanel = new VerticalPanel(); - FilePermissionsDialog.Images images = GWT.create(FilePermissionsDialog.Images.class); - permList = new PermissionsList(images, folder.getPermissions(), folder.getOwner(), false); - permPanel.add(permList); + FileShareDialog.PrivateSharingImages images = GWT.create(FileShareDialog.PrivateSharingImages.class); - HorizontalPanel permButtons = new HorizontalPanel(); - Button add = new Button("Add Group", new ClickHandler() { + permList = new PermissionsList(app, images, folder.getPermissions(), folder.getOwnerID(), false, new Command() { @Override - public void onClick(ClickEvent event) { - PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false); - dlg.center(); + public void execute() { + updateMetadataForPrivateSharing(); } }); - add.addStyleName("button"); - permButtons.add(add); - permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER); + permPanel.add(permList); + + HorizontalPanel permButtons = new HorizontalPanel(); Button addUser = new Button("Add User", new ClickHandler() { @Override public void onClick(ClickEvent event) { PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, true); dlg.center(); + permList.updatePermissionTable(); } }); addUser.addStyleName("button"); permButtons.add(addUser); permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER); + + final boolean haveGroups = app.getAccount().getGroups().size() > 0; + if(haveGroups) { + Button addGroup = new Button("Add Group", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false); + dlg.center(); + permList.updatePermissionTable(); + } + }); + addGroup.addStyleName("button"); + permButtons.add(addGroup); + permButtons.setCellHorizontalAlignment(addGroup, HasHorizontalAlignment.ALIGN_CENTER); + } + permButtons.setSpacing(8); permPanel.add(permButtons); @@ -151,199 +160,163 @@ public class FolderPermissionsDialog extends DialogBox { outer.add(inner); - // Create the 'Create/Update' button, along with a listener that hides the dialog - // when the button is clicked and quits the application. - String okLabel = "Update"; - final Button ok = new Button(okLabel, new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - updateFolder(); - closeDialog(); - } - }); - ok.addStyleName("button"); - outer.add(ok); + final Button ok = new Button("OK", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + closeDialog(); + } + }); + ok.addStyleName("button"); + + outer.add(ok); outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER); setWidget(outer); - } - - @Override - protected void onPreviewNativeEvent(NativePreviewEvent preview) { - super.onPreviewNativeEvent(preview); - - NativeEvent evt = preview.getNativeEvent(); - if (evt.getType().equals(KeyDownEvent.getType().getName())) - // Use the popup's key preview hooks to close the dialog when either - // enter or escape is pressed. - switch (evt.getKeyCode()) { - case KeyCodes.KEY_ENTER: - updateFolder(); + } + + @Override + protected void onPreviewNativeEvent(NativePreviewEvent preview) { + super.onPreviewNativeEvent(preview); + + NativeEvent evt = preview.getNativeEvent(); + if(evt.getType().equals(KeyDownEvent.getType().getName())) + // Use the popup's key preview hooks to close the dialog when either + // enter or escape is pressed. + { + switch(evt.getKeyCode()) { + case KeyCodes.KEY_ENTER: + updateMetadataForPrivateSharing(); closeDialog(); - break; - case KeyCodes.KEY_ESCAPE: - closeDialog(); - break; - } - } - - - /** - * Enables IE selection prevention and hides the dialog - * (we disable the prevention on creation of the dialog) - */ - public void closeDialog() { - Pithos.preventIESelection(); - hide(); - } - - void updateFolder() { - final Map perms = (permList.hasChanges() ? permList.getPermissions() : null); - final String newName = folderName.getText().trim(); - if (!folder.isContainer() && !folder.getName().equals(newName)) { - final String path = folder.getParent().getUri() + "/" + newName; - PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getParent().getOwner(), path) { - @Override - public void onSuccess(Resource result) { - Iterator iter = folder.getFiles().iterator(); - app.copyFiles(iter, folder.getParent().getOwner(), folder.getParent().getUri() + "/" + newName, new Command() { - @Override - public void execute() { - Iterator iterf = folder.getSubfolders().iterator(); - app.copySubfolders(iterf, folder.getParent().getOwner(), folder.getParent().getUri() + "/" + newName, new Command() { - @Override - public void execute() { - app.deleteFolder(folder); - updateMetadata(path + "?update=", perms); - } - }); - } - }); - } + break; + case KeyCodes.KEY_ESCAPE: + closeDialog(); + break; + } + } + } - @Override - public void onError(Throwable t) { - GWT.log("", t); - app.setError(t); - if(t instanceof RestException){ - app.displayError("Unable to update folder: " + ((RestException) t).getHttpStatusText()); - } - else - app.displayError("System error modifying folder: " + t.getMessage()); - } + /** + * Enables IE selection prevention and hides the dialog + * (we disable the prevention on creation of the dialog) + */ + public void closeDialog() { + Pithos.preventIESelection(); + hide(); + } - @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 - updateMetadata(folder.getUri() + "?update=", perms); - } + private void updateMetadataForPrivateSharing() { + final Map perms = (permList.hasChanges() ? permList.getPermissions() : null); + updateMetadataForPrivateSharing( + folder.getUri() + Const.QUESTION_MARK_UPDATE_EQ, + perms + ); + } - protected void updateMetadata(final String path, final Map newPermissions) { - if (newPermissions != null) { - PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwner(), path) { + private void updateMetadataForPrivateSharing(final String path, final Map newPermissions) { + if(newPermissions != null) { + PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwnerID(), path) { @Override public void onSuccess(Resource result) { app.updateFolder(folder.getParent(), false, new Command() { - - @Override - public void execute() { - app.updateMySharedRoot(); - } - }); + @Override + public void execute() { + app.updateMySharedRoot(); + } + }, true); } @Override public void onError(Throwable t) { - GWT.log("", t); - app.setError(t); - if (t instanceof RestException) { - if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { //Probably a virtual folder + app.setError(t); + if(t instanceof RestException) { + if(((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { //Probably a virtual folder final String path1 = folder.getUri(); - PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwner(), path1) { + PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path1) { @Override public void onSuccess(Resource result) { - updateMetadata(path, newPermissions); + updateMetadataForPrivateSharing(path, newPermissions); } @Override public void onError(Throwable _t) { - GWT.log("", _t); - app.setError(_t); - if(_t instanceof RestException){ + app.setError(_t); + if(_t instanceof RestException) { app.displayError("Unable to update folder: " + ((RestException) _t).getHttpStatusText()); } - else + else { app.displayError("System error modifying folder: " + _t.getMessage()); + } } - @Override - protected void onUnauthorized(Response response) { - app.sessionExpired(); - } + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } }; - newFolder.setHeader("X-Auth-Token", app.getToken()); + newFolder.setHeader("X-Auth-Token", app.getUserToken()); newFolder.setHeader("Content-Type", "application/folder"); newFolder.setHeader("Accept", "*/*"); newFolder.setHeader("Content-Length", "0"); Scheduler.get().scheduleDeferred(newFolder); - } - else if (((RestException) t).getHttpStatusCode() == Response.SC_CONFLICT) { - app.displayError("Cannot set permissions. Probably subfolders or files already have permissions set"); - } - else - app.displayError("Εrror modifying folder: " + t.getMessage()); + } + else if(((RestException) t).getHttpStatusCode() == Response.SC_CONFLICT) { + app.displayError("Cannot set permissions. Probably subfolders or files already have permissions set"); + } + else { + app.displayError("Εrror modifying folder: " + t.getMessage()); + } + } + else { + app.displayError("System error modifying folder: " + t.getMessage()); } - else - app.displayError("System error modifying folder: " + t.getMessage()); } - @Override - protected void onUnauthorized(Response response) { - app.sessionExpired(); - } + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } }; - updateFolder.setHeader("X-Auth-Token", app.getToken()); + updateFolder.setHeader("X-Auth-Token", app.getUserToken()); String readPermHeader = "read="; String writePermHeader = "write="; - for (String u : newPermissions.keySet()) { + for(String u : newPermissions.keySet()) { Boolean[] p = newPermissions.get(u); - if (p[0] != null && p[0]) + if(p[0] != null && p[0]) { readPermHeader += u + ","; - if (p[1] != null && p[1]) + } + if(p[1] != null && p[1]) { writePermHeader += u + ","; + } } - if (readPermHeader.endsWith("=")) + if(readPermHeader.endsWith("=")) { readPermHeader = ""; - else if (readPermHeader.endsWith(",")) + } + else if(readPermHeader.endsWith(",")) { readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1); - if (writePermHeader.endsWith("=")) + } + if(writePermHeader.endsWith("=")) { writePermHeader = ""; - else if (writePermHeader.endsWith(",")) + } + else if(writePermHeader.endsWith(",")) { writePermHeader = writePermHeader.substring(0, writePermHeader.length() - 1); - String permHeader = readPermHeader + ((readPermHeader.length() > 0 && writePermHeader.length() > 0) ? ";" : "") + writePermHeader; - if (permHeader.length() == 0) + } + String permHeader = readPermHeader + ((readPermHeader.length() > 0 && writePermHeader.length() > 0) ? ";" : "") + writePermHeader; + if(permHeader.length() == 0) { permHeader = "~"; - else - permHeader = URL.encodePathSegment(permHeader); + } + else { + permHeader = URL.encodePathSegment(permHeader); + } updateFolder.setHeader("X-Object-Sharing", permHeader); Scheduler.get().scheduleDeferred(updateFolder); } - else + else { app.updateFolder(folder.getParent(), false, new Command() { - - @Override - public void execute() { - app.updateMySharedRoot(); - } - }); + @Override + public void execute() { + app.updateMySharedRoot(); + } + }, true); + } } }