Initial support of permissions and dummy UI
authorChristos Stathis <chstath@ebs.gr>
Fri, 5 Aug 2011 15:21:25 +0000 (18:21 +0300)
committerChristos Stathis <chstath@ebs.gr>
Fri, 5 Aug 2011 15:21:25 +0000 (18:21 +0300)
src/gr/grnet/pithos/web/client/FilePropertiesDialog.java
src/gr/grnet/pithos/web/client/PermissionsAddDialog.java
src/gr/grnet/pithos/web/client/PermissionsList.java
src/gr/grnet/pithos/web/client/foldertree/AccountResource.java
src/gr/grnet/pithos/web/client/foldertree/File.java
src/gr/grnet/pithos/web/client/foldertree/Folder.java
src/gr/grnet/pithos/web/client/foldertree/Group.java [new file with mode: 0644]

index 359c0bc..a1ae971 100644 (file)
@@ -113,6 +113,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
 \r
        private String userFullName;\r
 \r
+    Images images = GWT.create(Images.class);\r
 \r
        /**\r
         * The widget's constructor.\r
@@ -124,9 +125,6 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
                // Set the dialog's caption.\r
                setText("File properties");\r
 \r
-\r
-//             permList = new PermissionsList(images, file.getPermissions(), file.getOwner());\r
-\r
                // Outer contains inner and buttons.\r
                final VerticalPanel outer = new VerticalPanel();\r
                final FocusPanel focusPanel = new FocusPanel(outer);\r
@@ -257,35 +255,37 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
 \r
     private VerticalPanel createSharingPanel() {\r
         VerticalPanel permPanel = new VerticalPanel();\r
-//\r
-//        permList = new PermissionsList(images, file.getPermissions(), file.getOwner());\r
-//        permPanel.add(permList);\r
-//\r
-//        HorizontalPanel permButtons = new HorizontalPanel();\r
-//        Button add = new Button("Add Group", new ClickHandler() {\r
-//            @Override\r
-//            public void onClick(ClickEvent event) {\r
-//                PermissionsAddDialog dlg = new PermissionsAddDialog(groups, permList, false);\r
-//                dlg.center();\r
-//            }\r
-//        });\r
-//        permButtons.add(add);\r
-//        permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER);\r
-//\r
-//        final Button addUser = new Button("Add User", new ClickHandler() {\r
-//            @Override\r
-//            public void onClick(ClickEvent event) {\r
-//                PermissionsAddDialog dlg = new PermissionsAddDialog(groups, permList, true);\r
-//                dlg.center();\r
-//            }\r
-//        });\r
-//        permButtons.add(addUser);\r
-//        permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER);\r
-//\r
-//        permButtons.setSpacing(8);\r
-//        permButtons.addStyleName("pithos-TabPanelBottom");\r
-//        permPanel.add(permButtons);\r
-//\r
+\r
+        permList = new PermissionsList(app, images, file.getPermissions(), file.getOwner());\r
+        permPanel.add(permList);\r
+\r
+        HorizontalPanel permButtons = new HorizontalPanel();\r
+        Button add = new Button("Add Group", new ClickHandler() {\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false);\r
+                dlg.center();\r
+                permList.updatePermissionTable();\r
+            }\r
+        });\r
+        permButtons.add(add);\r
+        permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER);\r
+\r
+        final Button addUser = new Button("Add User", new ClickHandler() {\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, true);\r
+                dlg.center();\r
+                permList.updatePermissionTable();\r
+            }\r
+        });\r
+        permButtons.add(addUser);\r
+        permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER);\r
+\r
+        permButtons.setSpacing(8);\r
+        permButtons.addStyleName("pithos-TabPanelBottom");\r
+        permPanel.add(permButtons);\r
+\r
         final Label readForAllNote = new Label("When this option is enabled, the file will be readable" +\r
                     " by everyone. By checking this option, you are certifying that you have the right to " +\r
                     "distribute this file and that it does not violate the Terms of Use.", true);\r
index 1e53619..8b28f62 100644 (file)
  */
 package gr.grnet.pithos.web.client;
 
-import gr.grnet.pithos.web.client.rest.GetCommand;
-import gr.grnet.pithos.web.client.rest.RestException;
-import gr.grnet.pithos.web.client.rest.resource.GroupResource;
-import gr.grnet.pithos.web.client.rest.resource.PermissionHolder;
-import gr.grnet.pithos.web.client.rest.resource.UserResource;
-import gr.grnet.pithos.web.client.rest.resource.UserSearchResource;
+import com.google.gwt.user.client.ui.TextBox;
+import gr.grnet.pithos.web.client.foldertree.Group;
 
 import java.util.List;
 
-import com.google.gwt.core.client.GWT;
 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.FocusEvent;
-import com.google.gwt.event.dom.client.FocusHandler;
 import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyUpEvent;
-import com.google.gwt.event.dom.client.KeyUpHandler;
-import com.google.gwt.http.client.URL;
-import com.google.gwt.user.client.DeferredCommand;
 import com.google.gwt.user.client.Event.NativePreviewEvent;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.CheckBox;
@@ -62,18 +51,11 @@ import com.google.gwt.user.client.ui.FlexTable;
 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
-import com.google.gwt.user.client.ui.SuggestBox;
 import com.google.gwt.user.client.ui.VerticalPanel;
 
 public class PermissionsAddDialog extends DialogBox {
 
-       private MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
-       private SuggestBox suggestBox = new SuggestBox(oracle);
-
-       private String selectedUser = null;
-
-       private List<GroupResource> groups;
+       private TextBox userBox = new TextBox();
 
        private ListBox groupBox = new ListBox();
 
@@ -81,156 +63,90 @@ public class PermissionsAddDialog extends DialogBox {
 
        private CheckBox write = new CheckBox();
 
-       private CheckBox modifyACL = new CheckBox();
-
-       private final PermissionsList permList;
+       private PermissionsList permList;
 
        boolean userAdd;
 
     private Pithos app;
 
-       public PermissionsAddDialog(Pithos _app, List<GroupResource> _groups, PermissionsList _permList, boolean _userAdd) {
+       public PermissionsAddDialog(Pithos _app, List<Group> _groups, PermissionsList _permList, boolean _userAdd) {
         app = _app;
-               groups = _groups;
                userAdd = _userAdd;
                permList = _permList;
-               
-               groupBox.getElement().setId("addPermission.dropDown");
-               
-               suggestBox.getElement().setId("addPermission.textBox");
-               
-               read.getElement().setId("addPermission.read");
-               
-               write.getElement().setId("addPermission.write");
-               
-               modifyACL.getElement().setId("addpermission.modify");
-               
-               for (GroupResource group : _groups)
-                       groupBox.addItem(group.getName(), group.getName());
-               final VerticalPanel panel = new VerticalPanel();
-               final HorizontalPanel buttons = new HorizontalPanel();
-               setWidget(panel);
-               final FlexTable permTable = new FlexTable();
-               permTable.setText(0, 0, "Users/Groups");
-               permTable.setText(0, 1, "Read");
-               permTable.setText(0, 2, "Write");
-               permTable.setText(0, 3, "Modify Access");
-               permTable.getFlexCellFormatter().setStyleName(0, 0, "props-toplabels");
-               permTable.getFlexCellFormatter().setStyleName(0, 1, "props-toplabels");
-               permTable.getFlexCellFormatter().setStyleName(0, 2, "props-toplabels");
-               permTable.getFlexCellFormatter().setStyleName(0, 3, "props-toplabels");
-               if (userAdd) {
-                       suggestBox.getTextBox().addFocusHandler(new FocusHandler() {
-
-                               @Override
-                               public void onFocus(FocusEvent event) {
-                                       if (selectedUser != null && selectedUser.endsWith("@"))
-                                               updateSuggestions();
 
-                               }
-                       });
-
-                       suggestBox.addKeyUpHandler(new KeyUpHandler() {
-
-                               @Override
-                               public void onKeyUp(KeyUpEvent event) {
-                                       // Ignore the arrow keys.
-                                       int keyCode = event.getNativeKeyCode();
-                                       if (keyCode == KeyCodes.KEY_UP ||
-                                                       keyCode == KeyCodes.KEY_DOWN ||
-                                                       keyCode == KeyCodes.KEY_LEFT ||
-                                                       keyCode == KeyCodes.KEY_RIGHT)
-                                               return;
-                                       if (keyCode==KeyCodes.KEY_ESCAPE) {
-                                               suggestBox.hideSuggestionList();
-                                               return;
-                                       }
-                                       String text = suggestBox.getText().trim();
-                                       // Avoid useless queries for keystrokes that do not modify
-                                       // the text.
-                                       if (text.equals(selectedUser))
-                                               return;
-                                       selectedUser = text;
-                                       // Go to the server only if the user typed the @ character.
-                                       if (selectedUser.endsWith("@"))
-                                               updateSuggestions();
-                               }
-                       });
-                       permTable.setWidget(1, 0, suggestBox);
-               } else
-                       permTable.setWidget(1, 0, groupBox);
-               permTable.setWidget(1, 1, read);
-               permTable.setWidget(1, 2, write);
-               permTable.setWidget(1, 3, modifyACL);
-
-               permTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");
-               permTable.getFlexCellFormatter().setHorizontalAlignment(1, 1, HasHorizontalAlignment.ALIGN_CENTER);
-               permTable.getFlexCellFormatter().setHorizontalAlignment(1, 2, HasHorizontalAlignment.ALIGN_CENTER);
-               permTable.getFlexCellFormatter().setHorizontalAlignment(1, 3, HasHorizontalAlignment.ALIGN_CENTER);
-               panel.add(permTable);
-
-               final Button ok = new Button("OK", new ClickHandler() {
-                       @Override
-                       public void onClick(ClickEvent event) {
-                               addPermission();
-                               hide();
-                       }
-               });
-               ok.getElement().setId("addPermission.button.ok");
-               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.
-               final Button cancel = new Button("Cancel", new ClickHandler() {
-                       @Override
-                       public void onClick(ClickEvent event) {
-                               hide();
-                       }
-               });
-               cancel.getElement().setId("addPermission.button.cancel");
-               buttons.add(cancel);
-               buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER);
-               buttons.setSpacing(8);
-               buttons.addStyleName("pithos-TabPanelBottom");
-               panel.add(buttons);
-               panel.addStyleName("pithos-TabPanelBottom");
+        final VerticalPanel panel = new VerticalPanel();
+
+        final FlexTable permTable = new FlexTable();
+        permTable.setText(0, 0, "Users/Groups");
+        permTable.setText(0, 1, "Read");
+        permTable.setText(0, 2, "Write");
+        permTable.getFlexCellFormatter().setStyleName(0, 0, "props-toplabels");
+        permTable.getFlexCellFormatter().setStyleName(0, 1, "props-toplabels");
+        permTable.getFlexCellFormatter().setStyleName(0, 2, "props-toplabels");
+
+        if (userAdd) {
+            permTable.setWidget(1, 0, userBox);
+        }
+        else {
+            for (Group group : _groups)
+                groupBox.addItem(group.getName(), group.getName());
+            permTable.setWidget(1, 0, groupBox);
+        }
+
+        permTable.setWidget(1, 1, read);
+        permTable.setWidget(1, 2, write);
+
+        permTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");
+        permTable.getFlexCellFormatter().setHorizontalAlignment(1, 1, HasHorizontalAlignment.ALIGN_CENTER);
+        permTable.getFlexCellFormatter().setHorizontalAlignment(1, 2, HasHorizontalAlignment.ALIGN_CENTER);
+        panel.add(permTable);
+
+        final HorizontalPanel buttons = new HorizontalPanel();
+        final Button ok = new Button("OK", new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+                addPermission();
+                hide();
+            }
+        });
+        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.
+        final Button cancel = new Button("Cancel", new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+                hide();
+            }
+        });
+        buttons.add(cancel);
+        buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER);
+        buttons.setSpacing(8);
+        buttons.addStyleName("pithos-TabPanelBottom");
+
+        panel.add(buttons);
+        panel.addStyleName("pithos-TabPanelBottom");
+
+        setWidget(panel);
        }
 
        private void addPermission() {
-               PermissionHolder perm = new PermissionHolder();
+        String selected = null;
                if (userAdd) {
-                       selectedUser = suggestBox.getText();
-                       for(PermissionHolder p : permList.permissions)
-                               if (selectedUser.equals(p.getUser())){
-                                       app.displayError("User already has access to the resource");
-                                       return;
-                               }
-                       perm.setUser(selectedUser);
+                       selected = userBox.getText();
                } else {
-                       String groupId = groupBox.getValue(groupBox.getSelectedIndex());
-                       GroupResource selected = null;
-                       for (GroupResource g : groups)
-                               if (g.getName().equals(groupId))
-                                       selected = g;
-                       if (selected == null)
-                               return;
-                       for(PermissionHolder p : permList.permissions)
-                               if (selected.getName().equals(p.getGroup())){
-                                       app.displayError("Group already has access to the resource");
-                                       return;
-                               }
-                       perm.setGroup(selected.getName());
+                       String groupName = groupBox.getValue(groupBox.getSelectedIndex());
+            selected = app.getUsername() + ":" + groupName;
                }
+        if (permList.getPermissions().get(selected) != null) {
+                app.displayError((userAdd ? "User " : "Group ") + "already has access to the resource");
+                return;
+        }
                boolean readValue = read.getValue();
                boolean writeValue = write.getValue();
-               boolean modifyValue = modifyACL.getValue();
 
-               perm.setRead(readValue);
-               perm.setWrite(writeValue);
-               perm.setModifyACL(modifyValue);
-               permList.addPermission(perm);
-               permList.updateTable();
+               permList.addPermission(selected, readValue, writeValue);
        }
 
        @Override
@@ -257,42 +173,6 @@ public class PermissionsAddDialog extends DialogBox {
        public void center() {
                super.center();
                if (userAdd)
-                       suggestBox.setFocus(true);
-       }
-
-       /**
-        * Update the list of suggestions.
-        */
-       protected void updateSuggestions() {
-               String query = selectedUser.substring(0, selectedUser.length()-1);
-               GWT.log("Searching for " + query, null);
-
-               GetCommand<UserSearchResource> eg = new GetCommand<UserSearchResource>(app, UserSearchResource.class,
-                                       app.getApiPath() + "users/" + URL.encodeComponent(query), false, null) {
-
-                       @Override
-                       public void onComplete() {
-                               suggestBox.hideSuggestionList();
-                               oracle.clear();
-                               UserSearchResource s = getResult();
-                               for (UserResource user : s.getUsers()) {
-                                       GWT.log("Found " + user.getUsername(), null);
-                                       oracle.add(user.getUsername());
-                               }
-                               suggestBox.showSuggestionList();
-                       }
-
-                       @Override
-                       public void onError(Throwable t) {
-                               if(t instanceof RestException)
-                                       app.displayError("Unable to perform search: "+((RestException)t).getHttpStatusText());
-                               else
-                                       app.displayError("System error while searching for users: "+t.getMessage());
-                               GWT.log("", t);
-                               DisplayHelper.log(t.getMessage());
-                       }
-
-               };
-               DeferredCommand.addCommand(eg);
+                       userBox.setFocus(true);
        }
 }
index 745321c..4b5faf2 100644 (file)
@@ -40,7 +40,9 @@ import gr.grnet.pithos.web.client.rest.resource.PermissionHolder;
 import gr.grnet.pithos.web.client.rest.resource.UserResource;
 import gr.grnet.pithos.web.client.rest.resource.UserSearchResource;
 
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import com.google.gwt.event.dom.client.ClickEvent;
@@ -61,7 +63,7 @@ public class PermissionsList extends Composite {
        
        int permissionCount = -1;
        
-       Set<PermissionHolder> permissions = null;
+       Map<String, Boolean[]> permissions = null;
        
        final Images images;
        
@@ -71,25 +73,21 @@ public class PermissionsList extends Composite {
        
        final String owner;
        
-       PermissionHolder toRemove = null;
-       
        private boolean hasChanges = false;
        
        private boolean hasAddition = false;
 
     private Pithos app;
        
-       public PermissionsList(Pithos _app, final Images theImages, Set<PermissionHolder> thePermissions, String anOwner){
+       public PermissionsList(Pithos _app, final Images theImages, Map<String, Boolean[]> thePermissions, String anOwner){
         app = _app;
                images = theImages;
                owner = anOwner;
-               permissions =  new HashSet<PermissionHolder>();
-               permissions.addAll(thePermissions);
+               permissions =  new HashMap<String, Boolean[]>(thePermissions);
                permTable.setText(0, 0, "Users/Groups");
                permTable.setText(0, 1, "Read");
                permTable.setText(0, 2, "Write");
-               permTable.setText(0, 3, "Modify Access");
-               permTable.setText(0, 4, "");
+               permTable.setText(0, 3, "");
                permTable.getFlexCellFormatter().setStyleName(0, 0, "props-toplabels");
                permTable.getFlexCellFormatter().setStyleName(0, 1, "props-toplabels");
                permTable.getFlexCellFormatter().setStyleName(0, 2, "props-toplabels");
@@ -97,38 +95,29 @@ public class PermissionsList extends Composite {
                permPanel.add(permTable);
                permPanel.addStyleName("pithos-TabPanelBottom");
                initWidget(permPanel);
-               updateTable();
+               updatePermissionTable();
        }
 
        public boolean hasChanges(){
                return hasChanges || hasAddition;
        }
 
-
-       public void updateTable(){
-               copySetAndContinue(permissions);
-       }
-
        public void updatePermissionsAccordingToInput(){
-               int i=1;
-               for(PermissionHolder dto : permissions){
-                       /*if(dto.getId() == null)
-                               hasChanges =true;*/
-                       CheckBox r = (CheckBox) permTable.getWidget(i, 1);
-                       CheckBox w = (CheckBox) permTable.getWidget(i, 2);
-                       CheckBox m = (CheckBox) permTable.getWidget(i, 3);
-                       
-                       r.getElement().setId("permissionList.read");
-                       w.getElement().setId("permissionList.write");
-                       m.getElement().setId("permissionList.modify");
-                       
-                       if(dto.isRead() != r.getValue() || dto.isWrite() != w.getValue() || dto.isModifyACL() != m.getValue())
-                               hasChanges = true;
-                       dto.setRead(r.getValue());
-                       dto.setWrite(w.getValue());
-                       dto.setModifyACL(m.getValue());
-                       i++;
-               }               
+//             int i=1;
+//             for(PermissionHolder dto : permissions){
+//                     /*if(dto.getId() == null)
+//                             hasChanges =true;*/
+//                     CheckBox r = (CheckBox) permTable.getWidget(i, 1);
+//                     CheckBox w = (CheckBox) permTable.getWidget(i, 2);
+//
+//
+//                     if(dto.isRead() != r.getValue() || dto.isWrite() != w.getValue() || dto.isModifyACL() != m.getValue())
+//                             hasChanges = true;
+//                     dto.setRead(r.getValue());
+//                     dto.setWrite(w.getValue());
+//                     dto.setModifyACL(m.getValue());
+//                     i++;
+//             }
        }
 
        /**
@@ -136,162 +125,61 @@ public class PermissionsList extends Composite {
         *
         * @return the permissions
         */
-       public Set<PermissionHolder> getPermissions() {
+       public Map<String, Boolean[]> getPermissions() {
                return permissions;
        }
 
-       public void addPermission(PermissionHolder permission){
-               permissions.add(permission);
+       public void addPermission(String user, boolean read, boolean write){
+               permissions.put(user, new Boolean[] {Boolean.valueOf(read), Boolean.valueOf(write)});
                hasAddition = true;
+        updatePermissionTable();
        }
-       /**
-        * Copies the input Set to a new Set
-        * @param input
-        */
-       private void copySetAndContinue(Set<PermissionHolder> input){
-               Set<PermissionHolder> copiedInput = new HashSet<PermissionHolder>();            
-               for(PermissionHolder dto : input) {
-                       copiedInput.add(dto);
-               }
-               handleFullNames(copiedInput);
-       }
-       
-       /**
-        * Examines whether or not the user's full name exists in the 
-        * userFullNameMap in the Pithos.java for every element of the input list.
-        * If the user's full name does not exist in the map then a request is being made
-        * for the specific username.  
-        * 
-        */
-       private void handleFullNames(Set<PermissionHolder> aPermissions){               
-               if(aPermissions.isEmpty()){
-                       showPermissionTable();
-                       return;
-               }
-               
-               final PermissionHolder dto = aPermissions.iterator().next();
-               if(dto.getGroup() != null){
-                       if(aPermissions.size() >= 1){
-                               aPermissions.remove(dto);                               
-                               handleFullNames(aPermissions);                          
-                       }
-               }else if(app.findUserFullName(dto.getUser()) != null){
-                       if(aPermissions.size() >= 1){
-                               aPermissions.remove(dto);                               
-                               handleFullNames(aPermissions);                          
-                       }
-               }else{
-                       findFullNameAndUpdate(aPermissions);
-               }
-       }
-       
+
        /**
         * Shows the permission table 
         * 
         */
-       private void showPermissionTable(){
+       void updatePermissionTable(){
                int i = 1;
-               if(toRemove != null){
-                       permissions.remove(toRemove);
-                       toRemove = null;
-               }
-               for(final PermissionHolder dto : permissions){
+        for (int j=1; j<permTable.getRowCount(); j++)
+            permTable.removeRow(j);
+               for(final String user : permissions.keySet()) {
                        PushButton removeButton = new PushButton(AbstractImagePrototype.create(images.delete()).createImage(), new ClickHandler() {
                                @Override
                                public void onClick(ClickEvent event) {
-                                       toRemove = dto;
-                                       updateTable();
+                    permissions.remove(user);
+                                       updatePermissionTable();
                                        hasChanges = true;
                                }
                        });
-                                               
-                       if(dto.getUser() != null){
-                               if(dto.getUser() != null && dto.getUser().equals(owner)){
-                                       permTable.setHTML(i, 0, "<span id=permissionList.Owner>" + AbstractImagePrototype.create(images.permUser()).getHTML() + "&nbsp;Owner</span>");
-                                       removeButton.setVisible(false);
-                               }else{
-                                       permTable.setHTML(i, 0, "<span id=permissionList."+ app.findUserFullName(dto.getUser())+">"+ AbstractImagePrototype.create(images.permUser()).getHTML() + "&nbsp;"+ app.findUserFullName(dto.getUser()) + "</span>");
-                               }
-                       }else if(dto.getGroup() != null){
-                               permTable.setHTML(i, 0, "<span id=permissionList."+dto.getGroup()+">" + AbstractImagePrototype.create(images.permGroup()).getHTML() + "&nbsp;"+ dto.getGroup() + "</span>");
-                       }
-                       
+            if (user.equals(owner)) {
+                permTable.setHTML(i, 0, "<span>" + AbstractImagePrototype.create(images.permUser()).getHTML() + "&nbsp;Owner</span>");
+                removeButton.setVisible(false);
+            }
+            else if (!user.contains(":")) //not a group
+                permTable.setHTML(i, 0, "<span>" + AbstractImagePrototype.create(images.permUser()).getHTML() + "&nbsp;" + user + "</span>");
+            else
+                permTable.setHTML(i, 0, "<span>" + AbstractImagePrototype.create(images.permGroup()).getHTML() + "&nbsp;" + user.split(":")[1].trim() + "</span>");
+
+            Boolean[] userPerms = permissions.get(user);
+            Boolean readP = userPerms[0];
+            Boolean writeP = userPerms[1];
+
                        CheckBox read = new CheckBox();
-                       read.setValue(dto.isRead());
-                       read.getElement().setId("permissionList.read");
-                       
+                       read.setValue(readP != null ? readP : false);
+
                        CheckBox write = new CheckBox();
-                       write.setValue(dto.isWrite());
-                       write.getElement().setId("permissionList.write");
-                       
-                       CheckBox modify = new CheckBox();
-                       modify.setValue(dto.isModifyACL());
-                       modify.getElement().setId("permissionList.modify");
-                       
-                       if (dto.getUser()!=null && dto.getUser().equals(owner)) {
-                               read.setEnabled(false);
-                               write.setEnabled(false);
-                               modify.setEnabled(false);
-                       }
-                       
+                       write.setValue(writeP != null ? writeP : false);
+
                        permTable.setWidget(i, 1, read);
                        permTable.setWidget(i, 2, write);
-                       permTable.setWidget(i, 3, modify);
-                       permTable.setWidget(i, 4, removeButton);
+                       permTable.setWidget(i, 3, removeButton);
                        permTable.getFlexCellFormatter().setStyleName(i, 0, "props-labels");
                        permTable.getFlexCellFormatter().setHorizontalAlignment(i, 1, HasHorizontalAlignment.ALIGN_CENTER);
                        permTable.getFlexCellFormatter().setHorizontalAlignment(i, 2, HasHorizontalAlignment.ALIGN_CENTER);
                        permTable.getFlexCellFormatter().setHorizontalAlignment(i, 3, HasHorizontalAlignment.ALIGN_CENTER);
-                       i++;            
+                       i++;
                }
-               for(; i<permTable.getRowCount(); i++)
-                       permTable.removeRow(i);
                hasChanges = false;
        }
-       
-       /**
-        * Makes a request to search for full name from a given username
-        * and continues checking the next element of the Set.
-        *  
-        */
-
-       private void findFullNameAndUpdate(final Set<PermissionHolder> aPermissions){                           
-               final PermissionHolder dto = aPermissions.iterator().next();
-               String path = app.getApiPath() + "users/" + dto.getUser();
-
-               GetCommand<UserSearchResource> gg = new GetCommand<UserSearchResource>(app, UserSearchResource.class, path, false,null) {
-                       @Override
-                       public void onComplete() {
-                               final UserSearchResource result = getResult();
-                               for (UserResource user : result.getUsers()){
-                                       String username = user.getUsername();
-                                       String userFullName = user.getName();
-                                       app.putUserToMap(username, userFullName);
-                                       if(aPermissions.size() >= 1){
-                                               aPermissions.remove(dto);                                               
-                                               if(aPermissions.isEmpty()){
-                                                       showPermissionTable();
-                                                       return;
-                                               }
-                                               handleFullNames(aPermissions);                                                                          
-                                       }                                                                       
-                               }
-                       }
-                       @Override
-                       public void onError(Throwable t) {                              
-                               app.displayError("Unable to fetch user's full name from the given username " + dto.getUser());
-                               if(aPermissions.size() >= 1){
-                                       aPermissions.remove(dto);
-                                       if(aPermissions.isEmpty()){
-                                               showPermissionTable();
-                                               return;
-                                       }
-                                       handleFullNames(aPermissions);
-                               }
-                       }
-               };
-               DeferredCommand.addCommand(gg);
-       
-       }
-
 }
index 97d77ec..20c976c 100644 (file)
@@ -73,6 +73,8 @@ public class AccountResource extends Resource {
 
     private Date currentLogin = null;
 
+    private List<Group> groups = new ArrayList<Group>();
+
     public long getBytesRemaining() {
         return bytesRemaining;
     }
@@ -134,30 +136,36 @@ public class AccountResource extends Resource {
     }
 
     public void populate(String owner, Response response) {
-        String header = response.getHeader("X-Account-Container-Count");
-        if (header != null)
-            numberOfContainers = Long.valueOf(header);
-
-        header = response.getHeader("X-Account-Object-Count");
-        if (header != null)
-            numberOfObjects = Long.valueOf(header);
-
-        header = response.getHeader("X-Account-Bytes-Used");
-        if (header != null)
-            bytesUsed = Long.valueOf(header);
-
-        header = response.getHeader("X-Account-Bytes-Remaining");
-        if (header != null)
-            bytesRemaining = Long.valueOf(header);
-
         DateTimeFormat df = DateTimeFormat.getFormat(PredefinedFormat.RFC_2822);
-        header = response.getHeader("X-Account-Last-Login");
-        if (header != null)
-            lastLogin = df.parse(header);
-
-        header = response.getHeader("Last-Modified");
-        if (header != null)
-            lastModified = df.parse(header);
+        for (Header h : response.getHeaders()) {
+            String name = h.getName();
+            if (name.startsWith("X-Account-Group-")) {
+                String groupName = name.substring("X-Account-Group-".length()).trim().toLowerCase();
+                Group g = new Group(groupName);
+                String[] members = h.getValue().split(",");
+                for (String s : members)
+                    g.addMember(s.trim());
+                groups.add(g);
+            }
+            else if (name.equals("X-Account-Container-Count")) {
+                numberOfContainers = Long.valueOf(h.getValue());
+            }
+            else if (name.equals("X-Account-Object-Count")) {
+                numberOfObjects = Long.valueOf(h.getValue());
+            }
+            else if (name.equals("X-Account-Bytes-Used")) {
+                bytesUsed = Long.valueOf(h.getValue());
+            }
+            else if (name.equals("X-Account-Bytes-Remaining")) {
+                bytesRemaining = Long.valueOf(h.getValue());
+            }
+            else if (name.equals("X-Account-Last-Login")) {
+                lastLogin = df.parse(h.getValue());
+            }
+            else if (name.equals("Last-Modified")) {
+                lastModified = df.parse(h.getValue());
+            }
+        }
 
         JSONValue json = JSONParser.parseStrict(response.getText());
         JSONArray array = json.isArray();
@@ -204,4 +212,8 @@ public class AccountResource extends Resource {
             return getSize(bytesRemaining,(1024D * 1024D)) + " MB";
         return getSize(bytesRemaining , (1024D * 1024D * 1024D)) + " GB";
     }
+
+    public List<Group> getGroups() {
+        return groups;
+    }
 }
index 1d3f062..cd970f8 100644 (file)
@@ -37,16 +37,12 @@ package gr.grnet.pithos.web.client.foldertree;
 
 import com.google.gwt.http.client.Header;
 import com.google.gwt.http.client.Response;
-import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
 import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.json.client.JSONObject;
-import com.google.gwt.json.client.JSONParser;
-import com.google.gwt.json.client.JSONValue;
-import java.io.StringWriter;
-import java.security.Key;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 public class File extends Resource {
@@ -82,6 +78,10 @@ public class File extends Resource {
 
     private String publicUri;
 
+    private Map<String, Boolean[]> permissions = new HashMap<String, Boolean[]>();
+
+    private String inheritedPermissionsFrom;
+
     public String getContentType() {
         return contentType;
     }
@@ -164,6 +164,11 @@ public class File extends Resource {
         publicUri = unmarshallString(o, "x_object_public");
         this.container = container;
 
+        inheritedPermissionsFrom = unmarshallString(o, "x_object_shared_by");
+        String rawPermissions = unmarshallString(o, "x_object_sharing");
+        if (rawPermissions != null)
+            parsePermissions(rawPermissions);
+
         for (String key : o.keySet())
             if (key.startsWith("x_object_meta_") && !key.equals("x_object_meta_trash"))
                 tags.add(key.substring("x_object_meta_".length()).trim().toLowerCase());
@@ -171,6 +176,29 @@ public class File extends Resource {
         
     }
 
+    private void parsePermissions(String rawPermissions) {
+        String[] readwrite = rawPermissions.split(";");
+        for (String s : readwrite) {
+            String[] part = s.split("=");
+            String perm = part[0].trim();
+            String[] users = part[1].split(",");
+            for (String u : users) {
+                String user = u.trim();
+                Boolean[] userPerm = permissions.get(u);
+                if (userPerm == null) {
+                    userPerm = new Boolean[2];
+                    permissions.put(user, userPerm);
+                }
+                if (perm.equals("read")) {
+                    userPerm[0] = Boolean.TRUE;
+                }
+                else if (perm.equals("write")) {
+                    userPerm[1] = Boolean.TRUE;
+                }
+            }
+        }
+    }
+
     public boolean equals(Object other) {
         if (other instanceof File) {
             File o = (File) other;
@@ -198,7 +226,13 @@ public class File extends Resource {
             String header = h.getName();
             if (header.startsWith("X-Object-Meta-") && !header.equals("X-Object-Meta-Trash"))
                 tags.add(header.substring("X-Object-Meta-".length()).trim().toLowerCase());
-
+            else if (header.equals("X-Object-Sharing")) {
+                String rawPermissions = h.getValue();
+                parsePermissions(rawPermissions);
+            }
+            else if (header.equals("X-Object-Shared-By")) {
+                inheritedPermissionsFrom = h.getValue().trim();
+            }
         }
         String header = response.getHeader("X-Object-Meta-Trash");
         if (header != null)
@@ -222,4 +256,8 @@ public class File extends Resource {
     public String getPublicUri() {
         return publicUri;
     }
+
+    public Map<String, Boolean[]> getPermissions() {
+        return permissions;
+    }
 }
index f0f31cf..46aaf84 100644 (file)
@@ -44,9 +44,11 @@ import com.google.gwt.json.client.JSONParser;
 import com.google.gwt.json.client.JSONValue;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
 
@@ -88,6 +90,10 @@ public class Folder extends Resource {
 
     private String owner;
 
+    private Map<String, Boolean[]> permissions = new HashMap<String, Boolean[]>();
+
+    private String inheritedPermissionsFrom;
+
     public Folder() {};
 
     public Folder(String name) {
@@ -130,6 +136,29 @@ public class Folder extends Resource {
         this.prefix = prefix;
     }
 
+    private void parsePermissions(String rawPermissions) {
+        String[] readwrite = rawPermissions.split(";");
+        for (String s : readwrite) {
+            String[] part = s.split("=");
+            String perm = part[0].trim();
+            String[] users = part[1].split(",");
+            for (String u : users) {
+                String user = u.trim();
+                Boolean[] userPerm = permissions.get(u);
+                if (userPerm == null) {
+                    userPerm = new Boolean[2];
+                    permissions.put(user, userPerm);
+                }
+                if (perm.equals("read")) {
+                    userPerm[0] = Boolean.TRUE;
+                }
+                else if (perm.equals("write")) {
+                    userPerm[1] = Boolean.TRUE;
+                }
+            }
+        }
+    }
+
     public void populate(String owner, Response response) {
         this.owner = owner;
         String header = response.getHeader("Last-Modified");
@@ -151,6 +180,11 @@ public class Folder extends Resource {
             }
         }
 
+        inheritedPermissionsFrom = response.getHeader("X-Object-Shared-By");
+        String rawPermissions = response.getHeader("X-Object-Sharing");
+        if (rawPermissions != null)
+            parsePermissions(rawPermissions);
+
         subfolders.clear(); //This is necessary in case we update a pre-existing Folder so that stale subfolders won't show up
         files.clear();
         JSONValue json = JSONParser.parseStrict(response.getText());
@@ -210,6 +244,11 @@ public class Folder extends Resource {
         this.owner = owner;
         if (o.containsKey("x_object_meta_trash") && o.get("x_object_meta_trash").isString().stringValue().equals("true"))
             inTrash = true;
+
+        inheritedPermissionsFrom = unmarshallString(o, "x_object_shared_by");
+        String rawPermissions = unmarshallString(o, "x_object_sharing");
+        if (rawPermissions != null)
+            parsePermissions(rawPermissions);
     }
 
     public static Folder createFromResponse(String owner, Response response, Folder result) {
diff --git a/src/gr/grnet/pithos/web/client/foldertree/Group.java b/src/gr/grnet/pithos/web/client/foldertree/Group.java
new file mode 100644 (file)
index 0000000..918a157
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2011 GRNET S.A. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer in the documentation and/or other materials
+ *      provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and
+ * documentation are those of the authors and should not be
+ * interpreted as representing official policies, either expressed
+ * or implied, of GRNET S.A.
+ */
+
+package gr.grnet.pithos.web.client.foldertree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Group {
+    private String name;
+
+    private List<String> members = new ArrayList<String>();
+
+    public Group(String _name) {
+        name = _name;
+    }
+
+    public List<String> getMembers() {
+        return members;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void addMember(String user) {
+        members.add(user);
+    }
+}