From 60426d513d6479595e5522ce627a1bb366654022 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Fri, 14 Feb 2014 14:29:04 +0000 Subject: [PATCH] enhancements on changing permissions git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace@91620 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../user/workspace/client/AppController.java | 33 +++ .../workspace/client/ConstantsPortlet.java | 1 + .../client/event/SettingPermissionEvent.java | 49 +++++ .../event/SettingPermissionEventHandler.java | 12 ++ .../client/view/dialog/DialogPermission.java | 188 ++++++++++++++++++ .../toolbars/GxtToolBarItemFunctionality.java | 31 +++ 6 files changed, 314 insertions(+) create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEventHandler.java create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/view/dialog/DialogPermission.java diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/AppController.java b/src/main/java/org/gcube/portlets/user/workspace/client/AppController.java index 56ca3b9..4770601 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/AppController.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/AppController.java @@ -71,6 +71,8 @@ import org.gcube.portlets.user.workspace.client.event.SearchTextEvent; import org.gcube.portlets.user.workspace.client.event.SearchTextEventHandler; import org.gcube.portlets.user.workspace.client.event.SendMessageEvent; import org.gcube.portlets.user.workspace.client.event.SendMessageEventHandler; +import org.gcube.portlets.user.workspace.client.event.SettingPermissionEvent; +import org.gcube.portlets.user.workspace.client.event.SettingPermissionEventHandler; import org.gcube.portlets.user.workspace.client.event.TrashEvent; import org.gcube.portlets.user.workspace.client.event.TrashEvent.TRASHOPERATION; import org.gcube.portlets.user.workspace.client.event.TrashEventHandler; @@ -83,6 +85,7 @@ import org.gcube.portlets.user.workspace.client.model.FileModel; import org.gcube.portlets.user.workspace.client.model.FolderModel; import org.gcube.portlets.user.workspace.client.model.ScopeModel; import org.gcube.portlets.user.workspace.client.view.WorskpacePortlet; +import org.gcube.portlets.user.workspace.client.view.dialog.DialogPermission; import org.gcube.portlets.user.workspace.client.view.panels.GxtBorderLayoutPanel; import org.gcube.portlets.user.workspace.client.view.panels.GxtItemsPanel; import org.gcube.portlets.user.workspace.client.view.trash.WindowTrash; @@ -920,6 +923,36 @@ public class AppController implements SubscriberInterface { loadBreadcrumbByFileModel(loadBreadcrumbEvent.getFileModel(), true); } }); + + eventBus.addHandler(SettingPermissionEvent.TYPE, new SettingPermissionEventHandler() { + + @Override + public void onPermissionSetting(SettingPermissionEvent settingPermissionEvent) { + + final DialogPermission dialog = settingPermissionEvent.getDialogPermission(); + FileModel folder = settingPermissionEvent.getSourceFile(); + dialog.mask("Changing permissions"); + if(dialog!=null && folder!=null && dialog.getSelectedACL().getId()!=null){ + + AppControllerExplorer.rpcWorkspaceService.setACLForVRE(folder.getIdentifier(), dialog.getSelectedACL().getId(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + dialog.hide(); + new MessageBoxAlert("Error", "Sorry, an error occurred on setting permission",null); + } + + @Override + public void onSuccess(Void result) { + dialog.unmask(); + dialog.hide(); + new InfoDisplay("Permission updated", "The permissions have been changed correctly"); + } + }); + } + + } + }); } private void accountingSetItemAsRead(boolean read) { diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsPortlet.java b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsPortlet.java index 3faead1..b33d919 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsPortlet.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/ConstantsPortlet.java @@ -17,6 +17,7 @@ public class ConstantsPortlet { public static final String UPLOADFILE = "Upload"; public static final String DOWNLOADITEM = "Download"; public static final String UPLOADARCHIVE = "Upload Archive"; + public static final String CHANGEPERMISSION = "Change Permission"; //USED IN HTTP GET AS PARAMETERS public static final String GET_SEARCH_PARAMETER ="search"; diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEvent.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEvent.java new file mode 100644 index 0000000..b6ebf94 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEvent.java @@ -0,0 +1,49 @@ +package org.gcube.portlets.user.workspace.client.event; + +import org.gcube.portlets.user.workspace.client.model.FileGridModel; +import org.gcube.portlets.user.workspace.client.model.FileModel; +import org.gcube.portlets.user.workspace.client.view.dialog.DialogPermission; + +import com.google.gwt.event.shared.GwtEvent; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class SettingPermissionEvent extends GwtEvent { + public static Type TYPE = new Type(); + + private FileModel targetFile = null; + + private DialogPermission dialogPermission; + + + public SettingPermissionEvent(FileModel target, DialogPermission dialog) { + this.targetFile = (FileGridModel) target; + this.dialogPermission = dialog; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(SettingPermissionEventHandler handler) { + handler.onPermissionSetting(this); + + } + + public FileModel getSourceFile() { + return targetFile; + } + + public DialogPermission getDialogPermission() { + return dialogPermission; + } + + public void setDialogPermission(DialogPermission dialogPermission) { + this.dialogPermission = dialogPermission; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEventHandler.java b/src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEventHandler.java new file mode 100644 index 0000000..3574d39 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/event/SettingPermissionEventHandler.java @@ -0,0 +1,12 @@ +package org.gcube.portlets.user.workspace.client.event; + +import com.google.gwt.event.shared.EventHandler; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public interface SettingPermissionEventHandler extends EventHandler { + void onPermissionSetting(SettingPermissionEvent settingPermissionEvent); +} diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/dialog/DialogPermission.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/dialog/DialogPermission.java new file mode 100644 index 0000000..67e2dee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/dialog/DialogPermission.java @@ -0,0 +1,188 @@ +package org.gcube.portlets.user.workspace.client.view.dialog; + +import java.util.List; + +import org.gcube.portlets.user.workspace.client.AppController; +import org.gcube.portlets.user.workspace.client.AppControllerExplorer; +import org.gcube.portlets.user.workspace.client.event.SettingPermissionEvent; +import org.gcube.portlets.user.workspace.client.model.FileModel; +import org.gcube.portlets.user.workspace.client.model.InfoContactModel; +import org.gcube.portlets.user.workspace.client.resources.Resources; +import org.gcube.portlets.user.workspace.client.view.sharing.PanelTogglePermission; +import org.gcube.portlets.user.workspace.client.view.windows.MessageBoxAlert; +import org.gcube.portlets.user.workspace.shared.WorkspaceACL; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.layout.FormLayout; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Label; + +/** + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * + */ +public class DialogPermission extends Dialog { + + private int widthDialog = 530; + private FileModel parentFolder = null; + + private PanelTogglePermission permission; + private HorizontalPanel hpPermission = null; + private FileModel folder; + + private DialogPermission INSTANCE = this; + + public FileModel getParentFolder() { + return parentFolder; + } + + public void initLayout(String folderParentName) { + FormLayout layout = new FormLayout(); + layout.setLabelWidth(90); + layout.setDefaultWidth(380); + setLayout(layout); + setModal(true); + setScrollMode(Scroll.AUTOY); + setBodyStyle("padding: 9px; background: none"); + setWidth(widthDialog); + setHeight(200); + setResizable(true); + setButtonAlign(HorizontalAlignment.CENTER); + setWidth(widthDialog); + setButtons(Dialog.OKCANCEL); + } + + /** + * Use to set permission to VRE Folder + */ + public DialogPermission(FileModel folder) { + + this.folder = folder; + + Label labelProperty = new Label("Permissions"); + + hpPermission.add(labelProperty); + + hpPermission.mask("Permission Control"); + + + AsyncCallback callcack = new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + new MessageBoxAlert("Alert", "Sorry, an error occurred on recovering ACLs",null); + hpPermission.unmask(); + } + + @Override + public void onSuccess(InfoContactModel result) { + permissionControl(result.getLogin(), true); + hpPermission.unmask(); + } + }; + + getOwner(folder.getIdentifier(), callcack); + + AppControllerExplorer.rpcWorkspaceService.getACLs(new AsyncCallback>() { + + @Override + public void onSuccess(List result) { + permission = new PanelTogglePermission(result); + hpPermission.add(permission); + hpPermission.layout(); + layout(); + } + + @Override + public void onFailure(Throwable caught) { + new MessageBoxAlert("Alert", "Sorry, an error occurred on recovering ACLs",null); + } + }); + + initLayout(folder.getName()); + this.setIcon(Resources.getIconSharedFolder()); + setHeading("Set permissions to folder: " + folder.getName()); + + setWidth(widthDialog); + setButtons(Dialog.OKCANCEL); + + add(hpPermission); + addListners(); + } + + public void addListners() { + + this.getButtonById(Dialog.CANCEL).addSelectionListener( + new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + hide(); + } + }); + + this.getButtonById(Dialog.OK).addSelectionListener( + new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + AppController.getEventBus().fireEvent(new SettingPermissionEvent(folder, INSTANCE)); +// hide(); + } + }); + + } + + + private void permissionControl(String owner, boolean showAlert){ + GWT.log("DialogPermission control compare between owner: "+owner +" and my login: "+AppControllerExplorer.myLogin); + + if(AppControllerExplorer.myLogin.compareToIgnoreCase(owner)!=0){ + enableFormDialog(false); + if(showAlert) + new MessageBoxAlert("Permission denied", "You have no permissions to change sharing. You are not owner of \""+folder.getName()+"\"", null); + }else{ + enableFormDialog(true); + } + } + + private void enableFormDialog(boolean bool){ + getButtonById(Dialog.OK).setEnabled(bool); + + if(permission!=null) + permission.setEnabled(bool); + } + + public void getOwner(final String sharedFolderId,final AsyncCallback callback) { + + AppControllerExplorer.rpcWorkspaceService.getOwnerByItemId(sharedFolderId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + GWT.log("an error occured in get Owner by Id "+sharedFolderId + " "+caught.getMessage()); + new MessageBoxAlert("Alert", "Sorry, an error occurred on owner property",null); + + } + + @Override + public void onSuccess(InfoContactModel result) { + callback.onSuccess(result); + + } + }); + } + + public WorkspaceACL getSelectedACL(){ + if(permission!=null) + return permission.getSelectedACL(); + + return null; + } +} diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/toolbars/GxtToolBarItemFunctionality.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/toolbars/GxtToolBarItemFunctionality.java index 11e5f86..9bee17e 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/toolbars/GxtToolBarItemFunctionality.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/toolbars/GxtToolBarItemFunctionality.java @@ -25,6 +25,7 @@ import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum import org.gcube.portlets.user.workspace.client.model.FileGridModel; import org.gcube.portlets.user.workspace.client.model.FileModel; import org.gcube.portlets.user.workspace.client.resources.Resources; +import org.gcube.portlets.user.workspace.client.view.dialog.DialogPermission; import org.gcube.portlets.user.workspace.client.view.grids.GxtGridFilterGroupPanel; import org.gcube.portlets.user.workspace.client.view.tree.CutCopyAndPaste; import org.gcube.portlets.user.workspace.client.view.tree.CutCopyAndPaste.OperationType; @@ -68,6 +69,7 @@ public class GxtToolBarItemFunctionality { private Button btnCopyItem; private Button btnPasteItem; private Button btnCutItem; + private Button btnSetPermission; public GxtToolBarItemFunctionality() { initToolBar(); @@ -220,6 +222,14 @@ public class GxtToolBarItemFunctionality { // toolBar.add(new SeparatorToolItem()); // toolBar.add(new SeparatorToolItem()); + btnSetPermission= new Button(ConstantsPortlet.CHANGEPERMISSION, + Resources.getIconWriteAll()); + btnSetPermission.setScale(ButtonScale.SMALL); + btnSetPermission.setIconAlign(IconAlign.TOP); + btnSetPermission.setArrowAlign(ButtonArrowAlign.BOTTOM); + + toolBar.add(btnSetPermission); + //TODO OLD CODE toggleGroup = new ToggleButton(); @@ -447,6 +457,22 @@ public class GxtToolBarItemFunctionality { AppController.getEventBus().fireEvent(new FileUploadEvent(null, UploadType.ARCHIVE)); } }); + + btnSetPermission.addSelectionListener(new SelectionListener() { + + @Override + public void componentSelected(ButtonEvent ce) { + + final FileGridModel fileGridModel = gridGroupViewContainer.getSelectedItem(); + + if(fileGridModel!=null && fileGridModel.isVreFolder()){ + DialogPermission dialog = new DialogPermission(fileGridModel); + dialog.show(); + } + + } + }); + btnDownloadFile.addSelectionListener(new SelectionListener() { @@ -578,6 +604,7 @@ public class GxtToolBarItemFunctionality { this.btnPublicLink.disable(); this.btnGetSharedLink.disable(); this.btnOpen.enable(); + this.btnSetPermission.disable(); if(target!=null){ @@ -642,6 +669,7 @@ public class GxtToolBarItemFunctionality { if(target!=null && target.isVreFolder()){ this.btnRemoveItem.disable(); this.btnRenameItem.disable(); + this.btnSetPermission.enable(); } } @@ -656,6 +684,7 @@ public class GxtToolBarItemFunctionality { this.btnOpen.disable(); this.btnCopyItem.disable(); this.btnCutItem.disable(); + this.btnSetPermission.disable(); // this.btnGetInfo.disable(); // this.btnGetSharedLink.disable(); } else { @@ -665,6 +694,7 @@ public class GxtToolBarItemFunctionality { this.btnOpen.enable(); this.btnCopyItem.enable(); this.btnCutItem.enable(); + this.btnSetPermission.enable(); // this.btnGetInfo.enable(); } @@ -693,6 +723,7 @@ public class GxtToolBarItemFunctionality { this.btnOpen.setEnabled(!active); this.btnGetSharedLink.setEnabled(!active); this.btnPublicLink.setEnabled(!active); + this.btnSetPermission.setEnabled(!active); //ONLY ENABLED this.btnRemoveItem.setEnabled(active);