Implemented virtual folder creation
authorChristos Stathis <chstath@ebs.gr>
Tue, 5 Jul 2011 14:13:12 +0000 (17:13 +0300)
committerChristos Stathis <chstath@ebs.gr>
Tue, 5 Jul 2011 14:13:12 +0000 (17:13 +0300)
web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java
web_client/src/gr/grnet/pithos/web/client/GSS.java
web_client/src/gr/grnet/pithos/web/client/commands/NewFolderCommand.java
web_client/src/gr/grnet/pithos/web/client/foldertree/Folder.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FolderTreeView.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java
web_client/src/gr/grnet/pithos/web/client/rest/GetRequest.java
web_client/src/gr/grnet/pithos/web/client/rest/PutRequest.java [new file with mode: 0644]

index c1112f6..63d24d2 100644 (file)
  */\r
 package gr.grnet.pithos.web.client;\r
 \r
+import com.google.gwt.core.client.Scheduler;\r
 import com.google.gwt.event.dom.client.KeyDownEvent;\r
 import com.google.gwt.user.client.Event;\r
 import gr.grnet.pithos.web.client.foldertree.Folder;\r
+import gr.grnet.pithos.web.client.foldertree.Resource;\r
 import gr.grnet.pithos.web.client.rest.PostCommand;\r
+import gr.grnet.pithos.web.client.rest.PutRequest;\r
 import gr.grnet.pithos.web.client.rest.RestException;\r
 import gr.grnet.pithos.web.client.rest.resource.RestResourceWrapper;\r
 \r
@@ -67,6 +70,8 @@ import com.google.gwt.user.client.ui.VerticalPanel;
  */\r
 public class FolderPropertiesDialog extends DialogBox {\r
 \r
+    private GSS app;\r
+\r
        private CheckBox readForAll;\r
 \r
        /**\r
@@ -86,16 +91,13 @@ public class FolderPropertiesDialog extends DialogBox {
 \r
        /**\r
         * The widget's constructor.\r
-        *\r
-        * @param _create true if the dialog is displayed for creating a new\r
-        *            sub-folder of the selected folder, false if it is displayed\r
-        *            for modifying the selected folder\r
         */\r
-       public FolderPropertiesDialog(boolean _create,  Folder selected) {\r
+       public FolderPropertiesDialog(GSS app, boolean _create,  Folder selected) {\r
+        this.app = app;\r
                setAnimationEnabled(true);\r
 \r
                // Enable IE selection for the dialog (must disable it upon closing it)\r
-               GSS.enableIESelection();\r
+               app.enableIESelection();\r
 \r
                create = _create;\r
                \r
@@ -227,7 +229,7 @@ public class FolderPropertiesDialog extends DialogBox {
         * (we disable the prevention on creation of the dialog)\r
         */\r
        public void closeDialog() {\r
-               GSS.preventIESelection();\r
+               app.preventIESelection();\r
                hide();\r
        }\r
 \r
@@ -236,43 +238,29 @@ public class FolderPropertiesDialog extends DialogBox {
         */\r
        private void createFolder() {\r
                String name = folderName.getText();\r
-\r
-//             PostCommand ep = new PostCommand(folder.getUri() + "?new=" +\r
-//                             URL.encodeComponent(name), "", 201) {\r
-//\r
-//                     @Override\r
-//                     public void onComplete() {\r
-//                             //TODO:CELLTREE\r
-//                             if(folder.getUri().equals(GSS.get().getTreeView().getMyFolders().getUri())){\r
-//                                     GSS.get().getTreeView().updateRootNode();\r
-//                             }\r
-//                             else\r
-//                                     GSS.get().getTreeView().updateNodeChildren((RestResourceWrapper) GSS.get().getTreeView().getSelection());\r
-//                             //GSS.get().getFolders().updateFolder((DnDTreeItem) GSS.get().getFolders().getCurrent());\r
-//                     }\r
-//\r
-//                     @Override\r
-//                     public void onError(Throwable t) {\r
-//                             GWT.log("", t);\r
-//                             if(t instanceof RestException){\r
-//                                     int statusCode = ((RestException)t).getHttpStatusCode();\r
-//                                     if(statusCode == 405)\r
-//                                             GSS.get().displayError("You don't have the necessary" +\r
-//                                                             " permissions or a folder with same name " +\r
-//                                                             "already exists");\r
-//                                     else if(statusCode == 404)\r
-//                                             GSS.get().displayError("Resource not found");\r
-//                                     else\r
-//                                             GSS.get().displayError("Unable to create folder:" +\r
-//                                                             ((RestException)t).getHttpStatusText());\r
-//                             }\r
-//                             else\r
-//                                     GSS.get().displayError("System error creating folder:" +\r
-//                                                     t.getMessage());\r
-//                     }\r
-//             };\r
-//             DeferredCommand.addCommand(ep);\r
-\r
+        String prefix = folder.getPrefix();\r
+        String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + "/" + (prefix.length() == 0 ? "" : prefix +  "/") + name;\r
+        PutRequest createFolder = new PutRequest(path) {\r
+            @Override\r
+            public void onSuccess(Resource result) {\r
+                app.updateFolder(folder);\r
+            }\r
+\r
+            @Override\r
+            public void onError(Throwable t) {\r
+                               GWT.log("", t);\r
+                               if (t instanceof RestException) {\r
+                                       app.displayError("Unable to create folder:" + ((RestException) t).getHttpStatusText());\r
+                               }\r
+                               else\r
+                                       app.displayError("System error creating folder:" + t.getMessage());\r
+            }\r
+        };\r
+        createFolder.setHeader("X-Auth-Token", "0000");\r
+        createFolder.setHeader("Accept", "*/*");\r
+        createFolder.setHeader("Content-Length", "0");\r
+        createFolder.setHeader("Content-Type", "application/folder");\r
+        Scheduler.get().scheduleDeferred(createFolder);\r
        }\r
 \r
        /**\r
@@ -296,7 +284,7 @@ public class FolderPropertiesDialog extends DialogBox {
 //                     json.put("name", new JSONString(folderName.getText()));\r
 //             //only update the read for all perm if the user is the owner\r
 //             if (readForAll.getValue() != folder.isReadForAll())\r
-//                     if (folder.getOwner().equals(GSS.get().getCurrentUserResource().getUsername()))\r
+//                     if (folder.getOwner().equals(app.getCurrentUserResource().getUsername()))\r
 //                             json.put("readForAll", JSONBoolean.getInstance(readForAll.getValue()));\r
 //             if (permList.hasChanges()) {\r
 //                     JSONArray perma = new JSONArray();\r
@@ -325,15 +313,15 @@ public class FolderPropertiesDialog extends DialogBox {
 //                             if(getPostBody() != null && !"".equals(getPostBody().trim())){\r
 //\r
 //\r
-//                                     FolderResource fres = ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource();\r
+//                                     FolderResource fres = ((RestResourceWrapper) app.getTreeView().getSelection()).getResource();\r
 //                                     String initialPath = fres.getUri();\r
 //                                     String newPath =  getPostBody().trim();\r
 //                                     fres.setUri(newPath);\r
-//                                     ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource().setUri(newPath);\r
-//                                     ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).setUri(newPath);\r
-//                                     GSS.get().getTreeView().updateNodeChildren(fres.getParentURI());\r
+//                                     ((RestResourceWrapper) app.getTreeView().getSelection()).getResource().setUri(newPath);\r
+//                                     ((RestResourceWrapper) app.getTreeView().getSelection()).setUri(newPath);\r
+//                                     app.getTreeView().updateNodeChildren(fres.getParentURI());\r
 //                                     if (permList.hasChanges()) {\r
-//                                             GSS.get().getTreeView().updateMySharedNode();\r
+//                                             app.getTreeView().updateMySharedNode();\r
 //                                     }\r
 //                                     /*\r
 //                                     if(folderItem.getParentItem() != null && ((DnDTreeItem)folderItem.getParentItem()).getFolderResource() != null){\r
@@ -341,9 +329,9 @@ public class FolderPropertiesDialog extends DialogBox {
 //                                             ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().getSubfolderPaths().add(newPath);\r
 //                                     }*/\r
 //                             }\r
-//                             //GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent());\r
+//                             //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent());\r
 //\r
-//                             GSS.get().showFileList(true);\r
+//                             app.get().showFileList(true);\r
 //                     }\r
 //\r
 //                     @Override\r
@@ -352,17 +340,17 @@ public class FolderPropertiesDialog extends DialogBox {
 //                             if(t instanceof RestException){\r
 //                                     int statusCode = ((RestException)t).getHttpStatusCode();\r
 //                                     if(statusCode == 405)\r
-//                                             GSS.get().displayError("You don't have the necessary permissions or" +\r
+//                                             app.displayError("You don't have the necessary permissions or" +\r
 //                                                             " a folder with same name already exists");\r
 //                                     else if(statusCode == 404)\r
-//                                             GSS.get().displayError("Resource not found, or user specified in sharing does not exist");\r
+//                                             app.displayError("Resource not found, or user specified in sharing does not exist");\r
 //                                     else\r
-//                                             GSS.get().displayError("Unable to update folder: "+((RestException)t).getHttpStatusText());\r
+//                                             app.displayError("Unable to update folder: "+((RestException)t).getHttpStatusText());\r
 //                             }\r
 //                             else\r
-//                                     GSS.get().displayError("System error moifying file: "+t.getMessage());\r
+//                                     app.displayError("System error moifying file: "+t.getMessage());\r
 //                             //TODO:CELLTREE\r
-//                             //GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent());\r
+//                             //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent());\r
 //                     }\r
 //             };\r
 //             DeferredCommand.addCommand(ep);\r
@@ -371,5 +359,4 @@ public class FolderPropertiesDialog extends DialogBox {
        public void selectTab(int _tab) {\r
                inner.selectTab(_tab);\r
        }\r
-\r
 }\r
index 762d99f..f8781da 100644 (file)
@@ -120,6 +120,10 @@ public class GSS implements EntryPoint, ResizeHandler {
         return account;
     }
 
+    public void updateFolder(Folder f) {
+        folderTreeView.updateFolder(f);
+    }
+
     /**
         * An aggregate image bundle that pulls together all the images for this
         * application into a single bundle.
index be21779..0a8a7c3 100644 (file)
@@ -86,7 +86,7 @@ public class NewFolderCommand implements Command{
 
        void displayNewFolderDialog() {
         if (folder != null) {
-            FolderPropertiesDialog dlg = new FolderPropertiesDialog(true, folder);
+            FolderPropertiesDialog dlg = new FolderPropertiesDialog(GSS.get(), true, folder);
             dlg.center();
         }
        }
index 25c38d0..ec6f0e0 100644 (file)
@@ -191,17 +191,14 @@ public class Folder extends Resource {
     public boolean equals(Object other) {
         if (other instanceof Folder) {
             Folder o = (Folder) other;
-            if (container != null)
-                return prefix.equals(o.getPrefix()) && container.equals(o.getContainer());
-            else
-                return o.getContainer() == null && name.equals(o.getName());
+            return (container + prefix).equals(o.getContainer() + o.getPrefix());
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        return prefix.hashCode() + name.hashCode();
+        return (container + prefix).hashCode();
     }
 
     public Set<File> getFiles() {
index a70a4a1..099fa3e 100644 (file)
@@ -106,4 +106,8 @@ public class FolderTreeView extends Composite {
     public Folder getSelection() {
        return model.getSelection();
     }
+
+    public void updateFolder(Folder folder) {
+        model.updateFolder(folder);
+    }
 }
index 53320f3..faffec7 100644 (file)
@@ -51,7 +51,9 @@ import gr.grnet.pithos.web.client.GSS;
 import gr.grnet.pithos.web.client.foldertree.FolderTreeView.Templates;
 import gr.grnet.pithos.web.client.rest.GetRequest;
 import gr.grnet.pithos.web.client.rest.RestException;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
 public class FolderTreeViewModel implements TreeViewModel {
@@ -68,9 +70,8 @@ public class FolderTreeViewModel implements TreeViewModel {
         @Override
         public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<Folder> valueUpdater) {
             if (event.getType().equals(ContextMenuEvent.getType().getName())) {
-                Folder target = (Folder) context.getKey();
-                FolderTreeViewModel.this.selectionModel.setSelected(target, true);
-                FolderContextMenu menu = new FolderContextMenu(FolderTreeView.images, target);
+                FolderTreeViewModel.this.selectionModel.setSelected(folder, true);
+                FolderContextMenu menu = new FolderContextMenu(FolderTreeView.images, folder);
                 menu.setPopupPosition(event.getClientX(), event.getClientY());
                 menu.show();
             }
@@ -79,6 +80,8 @@ public class FolderTreeViewModel implements TreeViewModel {
 
     private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
 
+    private Map<Folder, ListDataProvider<Folder>> dataProviderMap = new HashMap<Folder, ListDataProvider<Folder>>();
+
     private SingleSelectionModel<Folder> selectionModel;
 
     public FolderTreeViewModel(SingleSelectionModel<Folder> selectionModel) {
@@ -94,33 +97,11 @@ public class FolderTreeViewModel implements TreeViewModel {
         }
         else {
             final Folder f = (Folder) value;
-            final ListDataProvider<Folder> dataProvider = new ListDataProvider<Folder>();
-            dataProvider.flush();
-            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
-                @Override
-                public void execute() {
-                    final GSS app = GSS.get();
-                    String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
-                    GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
-                        @Override
-                        public void onSuccess(Folder result) {
-                            Iterator<Folder> iter = result.getSubfolders().iterator();
-                            fetchFolder(iter, dataProvider, result.getSubfolders());
-                        }
-
-                        @Override
-                        public void onError(Throwable t) {
-                            GWT.log("Error getting folder", t);
-                            if (t instanceof RestException)
-                                GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
-                            else
-                                GSS.get().displayError("System error fetching folder: " + t.getMessage());
-                        }
-                    };
-                    getFolder.setHeader("X-Auth-Token", app.getToken());
-                    Scheduler.get().scheduleDeferred(getFolder);
-                }
-            });
+            if (dataProviderMap.get(f) == null) {
+                dataProviderMap.put(f, new ListDataProvider<Folder>());
+            }
+            final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
+            fetchFolder(f, dataProvider);
             return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
         }
     }
@@ -174,4 +155,41 @@ public class FolderTreeViewModel implements TreeViewModel {
     public Folder getSelection() {
         return selectionModel.getSelectedObject();
     }
+
+    public void updateFolder(Folder folder) {
+        if (dataProviderMap.get(folder) == null) {
+            dataProviderMap.put(folder, new ListDataProvider<Folder>());
+        }
+        final ListDataProvider<Folder> dataProvider = dataProviderMap.get(folder);
+        fetchFolder(folder, dataProvider);
+    }
+
+    public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider) {
+        dataProvider.flush();
+        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+            @Override
+            public void execute() {
+                final GSS app = GSS.get();
+                String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+                GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
+                    @Override
+                    public void onSuccess(Folder result) {
+                        Iterator<Folder> iter = result.getSubfolders().iterator();
+                        fetchFolder(iter, dataProvider, result.getSubfolders());
+                    }
+
+                    @Override
+                    public void onError(Throwable t) {
+                        GWT.log("Error getting folder", t);
+                        if (t instanceof RestException)
+                            GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
+                        else
+                            GSS.get().displayError("System error fetching folder: " + t.getMessage());
+                    }
+                };
+                getFolder.setHeader("X-Auth-Token", app.getToken());
+                Scheduler.get().scheduleDeferred(getFolder);
+            }
+        });
+    }
 }
index d1cac74..7a3c077 100644 (file)
@@ -53,8 +53,6 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
 
     private int okCode;
     
-    private String username;
-
     private T cached;
 
     private T result;
@@ -83,8 +81,8 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
     @Override
     public void execute() {
         RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, path);
+        builder.setHeader("If-Modified-Since", "0");
         for (String header : headers.keySet()) {
-            builder.setHeader("If-Modified-Since", "0");
             builder.setHeader(header, headers.get(header));
         }
         try {
diff --git a/web_client/src/gr/grnet/pithos/web/client/rest/PutRequest.java b/web_client/src/gr/grnet/pithos/web/client/rest/PutRequest.java
new file mode 100644 (file)
index 0000000..b7ceb3a
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * 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.
+ */
+
+/*
+ * 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.rest;
+
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import gr.grnet.pithos.web.client.foldertree.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class PutRequest implements ScheduledCommand {
+
+    private String path;
+
+    private String username;
+
+    private Map<String, String> headers = new HashMap<String, String>();
+
+    public abstract void onSuccess(Resource result);
+
+    public abstract void onError(Throwable t);
+
+    public PutRequest(String path) {
+        this.path = path;
+    }
+
+    @Override
+    public void execute() {
+        RequestBuilder builder = new RequestBuilder(RequestBuilder.PUT, path);
+        for (String header : headers.keySet()) {
+            builder.setHeader(header, headers.get(header));
+        }
+        try {
+            builder.sendRequest("", new RestRequestCallback(path, Response.SC_CREATED) {
+                @Override
+                public void onSuccess(Resource object) {
+                    PutRequest.this.onSuccess(object);
+                }
+
+                @Override
+                public Resource deserialize(Response response) {
+                    return Resource.createFromResponse(Resource.class, response, null);
+                }
+
+                @Override
+                public void onError(Request request, Throwable throwable) {
+                    PutRequest.this.onError(throwable);
+                }
+            });
+        }
+        catch (RequestException e) {
+        }
+    }
+
+    public void setHeader(String header, String value) {
+        headers.put(header, value);
+    }
+}