Implemented ability to send error data along with user feedback in case of error
[pithos-web-client] / src / gr / grnet / pithos / web / client / FilePropertiesDialog.java
index 9f9e562..1f1a1b0 100644 (file)
@@ -42,8 +42,8 @@ import gr.grnet.pithos.web.client.rest.GetRequest;
 import gr.grnet.pithos.web.client.rest.PostRequest;\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.tagtree.Tag;\r
 \r
+import java.util.HashMap;\r
 import java.util.List;\r
 import java.util.Map;\r
 \r
@@ -60,12 +60,11 @@ import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.Button;\r
 import com.google.gwt.user.client.ui.CheckBox;\r
 import com.google.gwt.user.client.ui.DecoratedTabPanel;\r
-import com.google.gwt.user.client.ui.DisclosurePanel;\r
 import com.google.gwt.user.client.ui.FlexTable;\r
-import com.google.gwt.user.client.ui.FlowPanel;\r
 import com.google.gwt.user.client.ui.FocusPanel;\r
 import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
 import com.google.gwt.user.client.ui.HorizontalPanel;\r
+import com.google.gwt.user.client.ui.Image;\r
 import com.google.gwt.user.client.ui.Label;\r
 import com.google.gwt.user.client.ui.TextBox;\r
 import com.google.gwt.user.client.ui.VerticalPanel;\r
@@ -110,6 +109,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
 \r
     Images images = GWT.create(Images.class);\r
 \r
+    FlexTable metaTable;\r
        /**\r
         * The widget's constructor.\r
         */\r
@@ -122,7 +122,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
                close.addClickHandler(new ClickHandler() {\r
                        \r
                        @Override\r
-                       public void onClick(ClickEvent event) {\r
+                       public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
                                hide();\r
                        }\r
                });\r
@@ -183,6 +183,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
                        @Override\r
                        public void onError(Throwable t) {\r
                                GWT.log("", t);\r
+                               app.setError(t);\r
                 if (t instanceof RestException) {\r
                     app.displayError("Unable to fetch versions: " + ((RestException) t).getHttpStatusText());\r
                 }\r
@@ -191,7 +192,7 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
                        }\r
 \r
                        @Override\r
-                       protected void onUnauthorized(Response response) {\r
+                       protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
                                app.sessionExpired();\r
                        }\r
                };\r
@@ -206,7 +207,6 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
         generalTable.setText(1, 0, "Folder");\r
         generalTable.setText(2, 0, "Owner");\r
         generalTable.setText(3, 0, "Last modified");\r
-        generalTable.setText(4, 0, "Tags");\r
 \r
         name.setWidth("100%");\r
         name.setText(file.getName());\r
@@ -220,16 +220,6 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
         final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");\r
         generalTable.setText(3, 1, file.getLastModified() != null ? formatter.format(file.getLastModified()) : "");\r
 \r
-               StringBuffer tagsBuffer = new StringBuffer();\r
-        for (String t : file.getTags())\r
-                       tagsBuffer.append(t).append(", ");\r
-               if (tagsBuffer.length() > 1)\r
-                       tagsBuffer.delete(tagsBuffer.length() - 2, tagsBuffer.length() - 1);\r
-               initialTagText = tagsBuffer.toString();\r
-               tags.setWidth("100%");\r
-               tags.setText(initialTagText);\r
-               generalTable.setWidget(4, 1, tags);\r
-\r
         generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
         generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");\r
         generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels");\r
@@ -239,42 +229,74 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
         generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values");\r
         generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values");\r
         generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values");\r
-        generalTable.getFlexCellFormatter().setStyleName(4, 1, "props-values");\r
         generalTable.setCellSpacing(4);\r
 \r
         generalPanel.add(generalTable);\r
 \r
-        DisclosurePanel allTags = new DisclosurePanel("All tags");\r
-        allTagsContent = new FlowPanel();\r
-        allTagsContent.setWidth("100%");\r
-        for (Tag t : app.getAllTags()) {\r
-            final Anchor tagAnchor = new Anchor(t.getName(), false);\r
-            tagAnchor.addStyleName("pithos-tag");\r
-            allTagsContent.add(tagAnchor);\r
-            Label separator = new Label(", ");\r
-            separator.addStyleName("pithos-tag");\r
-            allTagsContent.add(separator);\r
-            tagAnchor.addClickHandler(new ClickHandler() {\r
+        HorizontalPanel metaTitlePanel = new HorizontalPanel();\r
+        metaTitlePanel.setSpacing(5);\r
+        Label meta = new Label("Meta data");\r
+        meta.addStyleName("pithos-metaTitle");\r
+        metaTitlePanel.add(meta);\r
+        \r
+               Image plus = new Image("images/plus.png");\r
+               plus.addStyleName("pithos-addMetaImg");\r
+               metaTitlePanel.add(plus);\r
+               \r
+               generalPanel.add(metaTitlePanel);\r
+               \r
+               metaTable = new FlexTable();\r
+               metaTable.setCellSpacing(0);\r
+               metaTable.setHTML(0, 0, "Name");\r
+               metaTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
+               metaTable.setText(0, 1, "Value");\r
+               metaTable.getFlexCellFormatter().setStyleName(0, 1, "props-labels");\r
+               int rows = 1;\r
+               for (String metaKey : file.getMeta().keySet()) {\r
+                       addFormLine(metaTable, rows++, metaKey, file.getMeta().get(metaKey));\r
+               }\r
+               if (rows == 1) //If no meta add an empty line\r
+                       addFormLine(metaTable, rows++, "", "");\r
+               \r
+               plus.addClickHandler(new ClickHandler() {\r
+                       \r
+                       @Override\r
+                       public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
+                               addFormLine(metaTable, metaTable.getRowCount(), "", "");\r
+                       }\r
+               });\r
 \r
-                @Override\r
-                public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
-                    String existing = tags.getText().trim();\r
-                    if (MULTIPLE_VALUES_TEXT.equals(existing))\r
-                        existing = "";\r
-                    String newTag = tagAnchor.getText().trim();\r
-                    // insert the new tag only if it is not in the list\r
-                    // already\r
-                    if (existing.indexOf(newTag) == -1)\r
-                        tags.setText(existing + (existing.length() > 0 ? ", " : "") + newTag);\r
-                }\r
-            });\r
-        }\r
-        allTags.setContent(allTagsContent);\r
-        generalPanel.add(allTags);\r
+               generalPanel.add(metaTable);\r
         generalPanel.setSpacing(4);\r
         return generalPanel;\r
     }\r
 \r
+       void addFormLine(final FlexTable table, int row, String _name, String _value) {\r
+               TextBox nameBox = new TextBox();\r
+               nameBox.setText(_name);\r
+               nameBox.addStyleName("pithos-metaName");\r
+               table.setWidget(row, 0, nameBox);\r
+               table.getFlexCellFormatter().setStyleName(1, 0, "props-values");\r
+\r
+               TextBox valueBox = new TextBox();\r
+               valueBox.setText(_value);\r
+               valueBox.addStyleName("pithos-metaValue");\r
+               table.setWidget(row, 1, valueBox);\r
+               table.getFlexCellFormatter().setStyleName(1, 1, "props-values");\r
+               \r
+               Image delete = new Image("images/delete.png");\r
+               delete.addStyleName("pithos-metaDeleteImg");\r
+               delete.addClickHandler(new ClickHandler() {\r
+                       \r
+                       @Override\r
+                       public void onClick(ClickEvent event) {\r
+                               int rowIndex = table.getCellForEvent(event).getRowIndex();\r
+                               table.removeRow(rowIndex);\r
+                       }\r
+               });\r
+               table.setWidget(row, 2, delete);\r
+       }\r
+\r
     private VerticalPanel createSharingPanel() {\r
         VerticalPanel permPanel = new VerticalPanel();\r
 \r
@@ -395,27 +417,31 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
                 published = readForAll.getValue();\r
         final Boolean finalPublished = published;\r
 \r
-        String[] tagset = null;\r
-               if (!tags.getText().equals(initialTagText))\r
-                       tagset = tags.getText().trim().split(",");\r
-        final String[] newTags = tagset;\r
+        final Map<String, String> newMeta = new HashMap<String, String>();\r
+        for (int row = 1; row < metaTable.getRowCount(); row++) {\r
+               String key = ((TextBox) metaTable.getWidget(row, 0)).getText().trim();\r
+               String value = ((TextBox) metaTable.getWidget(row, 1)).getText().trim();\r
+               if (key.length() > 0 && value.length() > 0)\r
+                       newMeta.put(key, value);\r
+        }\r
 \r
         if (newFilename != null) {\r
             final String path = file.getParent().getUri() + "/" + newFilename;\r
             PutRequest updateFile = new PutRequest(app.getApiPath(), app.getUsername(), path) {\r
                 @Override\r
                 public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
-                    updateMetaData(app.getApiPath(), file.getOwner(), path + "?update=", newTags, finalPublished, perms);\r
+                    updateMetaData(app.getApiPath(), file.getOwner(), path + "?update=", newMeta, finalPublished, perms);\r
                 }\r
 \r
                 @Override\r
                 public void onError(Throwable t) {\r
                     GWT.log("", t);\r
+                                       app.setError(t);\r
                     app.displayError("System error modifying file:" + t.getMessage());\r
                 }\r
 \r
                                @Override\r
-                               protected void onUnauthorized(Response response) {\r
+                               protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
                                        app.sessionExpired();\r
                                }\r
             };\r
@@ -425,11 +451,11 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
             Scheduler.get().scheduleDeferred(updateFile);\r
         }\r
         else\r
-            updateMetaData(app.getApiPath(), app.getUsername(), file.getUri() + "?update=", newTags, finalPublished, perms);\r
+            updateMetaData(app.getApiPath(), app.getUsername(), file.getUri() + "?update=", newMeta, finalPublished, perms);\r
        }\r
 \r
-       protected void updateMetaData(String api, String owner, String path, String[] newTags, Boolean published, Map<String, Boolean[]> newPermissions) {\r
-        if (newTags != null || published != null || newPermissions != null) {\r
+       protected void updateMetaData(String api, String owner, String path, Map<String, String> newMeta, Boolean published, Map<String, Boolean[]> newPermissions) {\r
+        if (newMeta != null || published != null || newPermissions != null) {\r
             PostRequest updateFile = new PostRequest(api, owner, path) {\r
                 @Override\r
                 public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
@@ -439,22 +465,26 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
                 @Override\r
                 public void onError(Throwable t) {\r
                     GWT.log("", t);\r
+                                       app.setError(t);\r
                     app.displayError("System error modifying file:" + t.getMessage());\r
                 }\r
 \r
                                @Override\r
-                               protected void onUnauthorized(Response response) {\r
+                               protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
                                        app.sessionExpired();\r
                                }\r
             };\r
             updateFile.setHeader("X-Auth-Token", app.getToken());\r
-            for (String t : file.getTags()) {\r
-                       updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(t.trim()), "~");\r
+            \r
+            if (newMeta != null) {\r
+                   for (String t : file.getMeta().keySet()) {\r
+                               updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(t.trim()), "~");\r
+                   }\r
+                   \r
+                   for (String key : newMeta.keySet())\r
+                       updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(key.trim()), URL.encodePathSegment(newMeta.get(key)));\r
             }\r
-            if (newTags != null)\r
-                for (String t : newTags)\r
-                       if (t.length() > 0)\r
-                               updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(t.trim()), "true");\r
+            \r
             if (published != null)\r
                 updateFile.setHeader("X-Object-Public", published.toString());\r
             if (newPermissions != null) {\r