X-Git-Url: https://code.grnet.gr/git/pithos/blobdiff_plain/12190a0c53d217e7fb963dbe8382f2c881790287..de637c72f5edc1ee097d5bcd74c007cdabd5b14c:/web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java diff --git a/web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java b/web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java index 57f3291..f03390c 100644 --- a/web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java +++ b/web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java @@ -40,6 +40,7 @@ import com.google.gwt.user.client.Command; 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; @@ -48,10 +49,11 @@ import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.http.client.Response; import com.google.gwt.i18n.client.DateTimeFormat; 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.CheckBox; import com.google.gwt.user.client.ui.DecoratedTabPanel; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.FlexTable; @@ -61,15 +63,14 @@ import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import java.util.Iterator; +import java.util.Map; /** * The 'Folder properties' dialog box implementation. */ public class FolderPropertiesDialog extends DialogBox { - private Pithos app; - - private CheckBox readForAll; + protected Pithos app; /** * The widget that holds the folderName of the folder. @@ -82,6 +83,8 @@ public class FolderPropertiesDialog extends DialogBox { */ private final boolean create; + protected PermissionsList permList; + final Folder folder; final TabPanel inner; @@ -89,12 +92,24 @@ public class FolderPropertiesDialog extends DialogBox { /** * The widget's constructor. */ - public FolderPropertiesDialog(Pithos app, boolean _create, Folder selected) { + public FolderPropertiesDialog(final Pithos app, boolean _create, Folder selected) { this.app = app; + Anchor close = new Anchor(); + close.addStyleName("close"); + close.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + hide(); + } + }); + setAnimationEnabled(true); + setGlassEnabled(true); + setStyleName("pithos-DialogBox"); // Enable IE selection for the dialog (must disable it upon closing it) - app.enableIESelection(); + Pithos.enableIESelection(); create = _create; @@ -108,47 +123,81 @@ public class FolderPropertiesDialog extends DialogBox { // Outer contains inner and buttons VerticalPanel outer = new VerticalPanel(); + outer.add(close); // Inner contains generalPanel and permPanel inner = new DecoratedTabPanel(); inner.setAnimationEnabled(true); + inner.addStyleName("inner"); + inner.getDeckPanel().addStyleName("pithos-TabPanelBottom"); + VerticalPanel generalPanel = new VerticalPanel(); - VerticalPanel permPanel = new VerticalPanel(); - final HorizontalPanel permForAll = new HorizontalPanel(); - final HorizontalPanel pathPanel = new HorizontalPanel(); - HorizontalPanel buttons = new HorizontalPanel(); - HorizontalPanel permButtons = new HorizontalPanel(); - - inner.add(generalPanel, "General"); - if (!create) - inner.add(permPanel, "Sharing"); - inner.selectTab(0); - - FlexTable generalTable = new FlexTable(); - generalTable.setText(0, 0, "Name"); - generalTable.setText(1, 0, "Parent"); - generalTable.setText(2, 0, "Creator"); - generalTable.setText(3, 0, "Last modified"); - folderName.setText(create ? "" : folder.getName()); + FlexTable generalTable = new FlexTable(); + generalTable.setText(0, 0, "Name"); + generalTable.setText(1, 0, "Parent"); + generalTable.setText(2, 0, "Creator"); + generalTable.setText(3, 0, "Last modified"); + folderName.setText(create ? "" : folder.getName()); folderName.setReadOnly(folder.isContainer() && !create); - generalTable.setWidget(0, 1, folderName); + generalTable.setWidget(0, 1, folderName); + + if (create) + generalTable.setText(1, 1, folder.getName()); + else + generalTable.setText(1, 1, folder.getPrefix()); + generalTable.setText(2, 1, ""); + DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a"); + if(folder.getLastModified() != null) + generalTable.setText(3, 1, formatter.format(folder.getLastModified())); + generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(3, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values"); + generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values"); + generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values"); + generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values"); + generalTable.setCellSpacing(4); + generalPanel.add(generalTable); + inner.add(generalPanel, "General"); + + VerticalPanel permPanel = new VerticalPanel(); + FilePropertiesDialog.Images images = GWT.create(FilePropertiesDialog.Images.class); + boolean permsReadonly = folder.getInheritedPermissionsFrom() != null || folder.existChildrenPermissions(); + permList = new PermissionsList(images, folder.getPermissions(), folder.getOwner(), permsReadonly); + permPanel.add(permList); + + if (!permsReadonly) { + HorizontalPanel permButtons = new HorizontalPanel(); + Button add = new Button("Add Group", new ClickHandler() { + @Override + public void onClick(@SuppressWarnings("unused") ClickEvent event) { + PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false); + dlg.center(); + } + }); + add.addStyleName("button"); + permButtons.add(add); + permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER); - if (create) - generalTable.setText(1, 1, folder.getName()); - else - generalTable.setText(1, 1, folder.getPrefix()); - generalTable.setText(2, 1, ""); - DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a"); - if(folder.getLastModified() != null) - generalTable.setText(3, 1, formatter.format(folder.getLastModified())); - generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(3, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values"); - generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values"); - generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values"); - generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values"); - generalTable.setCellSpacing(4); + Button addUser = new Button("Add User", new ClickHandler() { + @Override + public void onClick(@SuppressWarnings("unused") ClickEvent event) { + PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, true); + dlg.center(); + } + }); + addUser.addStyleName("button"); + permButtons.add(addUser); + permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER); + permButtons.setSpacing(8); + permPanel.add(permButtons); + } + + if (!create) + inner.add(permPanel, "Sharing"); + inner.selectTab(0); + + 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. @@ -159,41 +208,16 @@ public class FolderPropertiesDialog extends DialogBox { okLabel = "Update"; Button ok = new Button(okLabel, new ClickHandler() { @Override - public void onClick(ClickEvent event) { + public void onClick(@SuppressWarnings("unused") ClickEvent event) { createOrUpdateFolder(); closeDialog(); } }); - buttons.add(ok); - buttons.setCellHorizontalAlignment(ok, HasHorizontalAlignment.ALIGN_CENTER); - // Create the 'Cancel' button, along with a listener that hides the - // dialog - // when the button is clicked. - Button cancel = new Button("Cancel", new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - closeDialog(); - } - }); - buttons.add(cancel); - buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER); - buttons.setSpacing(8); - buttons.addStyleName("pithos-TabPanelBottom"); - - generalPanel.add(generalTable); - + ok.addStyleName("button"); + outer.add(ok); + outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER); - outer.add(inner); - outer.add(buttons); - outer.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER); - outer.addStyleName("pithos-TabPanelBottom"); - - setWidget(outer); - - /*if (create) - folderName.setFocus(true); - else - ok.setFocus(true);*/ + setWidget(outer); } @Override @@ -212,8 +236,8 @@ public class FolderPropertiesDialog extends DialogBox { // enter or escape is pressed. switch (evt.getKeyCode()) { case KeyCodes.KEY_ENTER: - closeDialog(); createOrUpdateFolder(); + closeDialog(); break; case KeyCodes.KEY_ESCAPE: closeDialog(); @@ -227,7 +251,7 @@ public class FolderPropertiesDialog extends DialogBox { * (we disable the prevention on creation of the dialog) */ public void closeDialog() { - app.preventIESelection(); + Pithos.preventIESelection(); hide(); } @@ -237,10 +261,16 @@ public class FolderPropertiesDialog extends DialogBox { private void createFolder() { String name = folderName.getText(); String path = folder.getUri() + "/" + name; - PutRequest createFolder = new PutRequest(app.getApiPath(), app.getUsername(), path) { + PutRequest createFolder = new PutRequest(app.getApiPath(), folder.getOwner(), path) { @Override - public void onSuccess(Resource result) { - app.updateFolder(folder); + public void onSuccess(@SuppressWarnings("unused") Resource result) { + app.updateFolder(folder, true, new Command() { + + @Override + public void execute() { + app.updateStatistics(); + } + }); } @Override @@ -252,11 +282,16 @@ public class FolderPropertiesDialog extends DialogBox { else app.displayError("System error creating folder:" + t.getMessage()); } - }; + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; createFolder.setHeader("X-Auth-Token", app.getToken()); createFolder.setHeader("Accept", "*/*"); createFolder.setHeader("Content-Length", "0"); - createFolder.setHeader("Content-Type", "application/folder"); + createFolder.setHeader("Content-Type", "application/directory"); Scheduler.get().scheduleDeferred(createFolder); } @@ -265,7 +300,7 @@ public class FolderPropertiesDialog extends DialogBox { * the actual work of modifying folder properties or creating a new Folder * depending on the value of the create field */ - private void createOrUpdateFolder() { + protected void createOrUpdateFolder() { if (create) createFolder(); else @@ -274,99 +309,23 @@ public class FolderPropertiesDialog extends DialogBox { } private void updateFolder() { -// permList.updatePermissionsAccordingToInput(); -// Set perms = permList.getPermissions(); -// JSONObject json = new JSONObject(); -// if(!folder.getName().equals(folderName.getText())) -// json.put("name", new JSONString(folderName.getText())); -// //only update the read for all perm if the user is the owner -// if (readForAll.getValue() != folder.isReadForAll()) -// if (folder.getOwner().equals(app.getCurrentUserResource().getUsername())) -// json.put("readForAll", JSONBoolean.getInstance(readForAll.getValue())); -// if (permList.hasChanges()) { -// JSONArray perma = new JSONArray(); -// int i=0; -// for(PermissionHolder p : perms){ -// JSONObject po = new JSONObject(); -// if(p.getUser() != null) -// po.put("user", new JSONString(p.getUser())); -// if(p.getGroup() != null) -// po.put("group", new JSONString(p.getGroup())); -// po.put("read", JSONBoolean.getInstance(p.isRead())); -// po.put("write", JSONBoolean.getInstance(p.isWrite())); -// po.put("modifyACL", JSONBoolean.getInstance(p.isModifyACL())); -// perma.set(i,po); -// i++; -// } -// json.put("permissions", perma); -// GWT.log(json.toString(), null); -// } -// PostCommand ep = new PostCommand(folder.getUri()+"?update=", json.toString(), 200){ -// -// @Override -// public void onComplete() { -// //TODO:CELLTREE -// -// if(getPostBody() != null && !"".equals(getPostBody().trim())){ -// -// -// FolderResource fres = ((RestResourceWrapper) app.getTreeView().getSelection()).getResource(); -// String initialPath = fres.getUri(); -// String newPath = getPostBody().trim(); -// fres.setUri(newPath); -// ((RestResourceWrapper) app.getTreeView().getSelection()).getResource().setUri(newPath); -// ((RestResourceWrapper) app.getTreeView().getSelection()).setUri(newPath); -// app.getTreeView().updateNodeChildren(fres.getParentURI()); -// if (permList.hasChanges()) { -// app.getTreeView().updateMySharedNode(); -// } -// /* -// if(folderItem.getParentItem() != null && ((DnDTreeItem)folderItem.getParentItem()).getFolderResource() != null){ -// ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().removeSubfolderPath(initialPath); -// ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().getSubfolderPaths().add(newPath); -// }*/ -// } -// //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent()); -// -// app.get().showFileList(true); -// } -// -// @Override -// public void onError(Throwable t) { -// GWT.log("", t); -// if(t instanceof RestException){ -// int statusCode = ((RestException)t).getHttpStatusCode(); -// if(statusCode == 405) -// app.displayError("You don't have the necessary permissions or" + -// " a folder with same name already exists"); -// else if(statusCode == 404) -// app.displayError("Resource not found, or user specified in sharing does not exist"); -// else -// app.displayError("Unable to update folder: "+((RestException)t).getHttpStatusText()); -// } -// else -// app.displayError("System error moifying file: "+t.getMessage()); -// //TODO:CELLTREE -// //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent()); -// } -// }; -// DeferredCommand.addCommand(ep); - final String newName = folderName.getText(); + 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(), app.getUsername(), path) { + PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getParent().getOwner(), path) { @Override - public void onSuccess(Resource result) { + public void onSuccess(@SuppressWarnings("unused") Resource result) { Iterator iter = folder.getFiles().iterator(); - app.copyFiles(iter, folder.getParent().getUri() + "/" + newName, new Command() { + 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().getUri() + "/" + newName, new Command() { + app.copySubfolders(iterf, folder.getParent().getOwner(), folder.getParent().getUri() + "/" + newName, new Command() { @Override public void execute() { app.deleteFolder(folder); - app.updateFolder(folder.getParent()); + updateMetadata(path + "?update=", perms); } }); } @@ -382,6 +341,11 @@ public class FolderPropertiesDialog extends DialogBox { else app.displayError("System error modifying folder: " + t.getMessage()); } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } }; newFolder.setHeader("X-Auth-Token", app.getToken()); newFolder.setHeader("Content-Type", "application/folder"); @@ -389,8 +353,94 @@ public class FolderPropertiesDialog extends DialogBox { newFolder.setHeader("Content-Length", "0"); Scheduler.get().scheduleDeferred(newFolder); } + else + updateMetadata(folder.getUri() + "?update=", perms); } + protected void updateMetadata(final String path, final Map newPermissions) { + if (newPermissions != null) { + PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwner(), path) { + @Override + public void onSuccess(@SuppressWarnings("unused") Resource result) { + app.updateFolder(folder.getParent(), false, null); + } + + @Override + public void onError(Throwable t) { + GWT.log("", 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) { + @Override + public void onSuccess(@SuppressWarnings("unused") Resource result) { + updateMetadata(path, newPermissions); + } + + @Override + public void onError(Throwable _t) { + GWT.log("", _t); + if(_t instanceof RestException){ + app.displayError("Unable to update folder: " + ((RestException) _t).getHttpStatusText()); + } + else + app.displayError("System error modifying 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 if (((RestException) t).getHttpStatusCode() == Response.SC_CONFLICT) { + app.displayError("Cannot set permissions. Probably subfolders or files already have permissions set"); + } + else + app.displayError("Wrror modifying folder: " + t.getMessage()); + } + else + app.displayError("System error modifying folder: " + t.getMessage()); + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } + }; + updateFolder.setHeader("X-Auth-Token", app.getToken()); + String readPermHeader = "read="; + String writePermHeader = "write="; + for (String u : newPermissions.keySet()) { + Boolean[] p = newPermissions.get(u); + if (p[0] != null && p[0]) + readPermHeader += u + ","; + if (p[1] != null && p[1]) + writePermHeader += u + ","; + } + if (readPermHeader.endsWith("=")) + readPermHeader = ""; + else if (readPermHeader.endsWith(",")) + readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1); + if (writePermHeader.endsWith("=")) + writePermHeader = ""; + 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) + permHeader="~"; + updateFolder.setHeader("X-Object-Sharing", permHeader); + Scheduler.get().scheduleDeferred(updateFolder); + } + else + app.updateFolder(folder.getParent(), false, null); + } + public void selectTab(int _tab) { inner.selectTab(_tab); }