Finished file versions
authorChristos Stathis <chstath@ebs.gr>
Mon, 12 Sep 2011 16:52:25 +0000 (19:52 +0300)
committerChristos Stathis <chstath@ebs.gr>
Mon, 12 Sep 2011 16:52:25 +0000 (19:52 +0300)
web_client/src/gr/grnet/pithos/web/client/FileContextMenu.java
web_client/src/gr/grnet/pithos/web/client/FilePropertiesDialog.java
web_client/src/gr/grnet/pithos/web/client/FilesPropertiesDialog.java
web_client/src/gr/grnet/pithos/web/client/VersionsList.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java [new file with mode: 0644]
web_client/src/gr/grnet/pithos/web/client/foldertree/Resource.java
web_client/src/gr/grnet/pithos/web/client/foldertree/Version.java [new file with mode: 0644]

index 58c2dd3..675410b 100644 (file)
@@ -218,7 +218,8 @@ public class FileContextMenu extends PopupPanel {
 //                     sharingItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.sharing()).getHTML() + "&nbsp;Sharing</span>", true, new PropertiesCommand(this, images, 1));
 //            contextMenu.addItem(sharingItem);
         if (!selectedFolder.isInTrash()) {
-               contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Properties</span>", true, new PropertiesCommand(app, this, selectedFiles, images, 0)));
+               if (selectedFiles.size() == 1)
+                       contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Properties</span>", true, new PropertiesCommand(app, this, selectedFiles, images, 0)));
 
             if (!selectedFiles.isEmpty())
                            contextMenu.addItem(new MenuItem("<span><a class='hidden-link' href='" + app.getApiPath() + app.getUsername() + selectedFiles.get(0).getUri() + "?X-Auth-Token=" + app.getToken() + "' target='_blank'>" + AbstractImagePrototype.create(newImages.download()).getHTML() + " Download</a></span>", true, (Command) null));
index f9ad816..95c5edd 100644 (file)
 package gr.grnet.pithos.web.client;\r
 \r
 import gr.grnet.pithos.web.client.foldertree.File;\r
+import gr.grnet.pithos.web.client.foldertree.FileVersions;\r
 import gr.grnet.pithos.web.client.foldertree.Resource;\r
+import gr.grnet.pithos.web.client.foldertree.Version;\r
+import gr.grnet.pithos.web.client.rest.GetRequest;\r
 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.List;\r
 import java.util.Map;\r
 \r
 import com.google.gwt.core.client.GWT;\r
 import com.google.gwt.core.client.Scheduler;\r
 import com.google.gwt.event.dom.client.ClickEvent;\r
 import com.google.gwt.event.dom.client.ClickHandler;\r
+import com.google.gwt.event.logical.shared.SelectionEvent;\r
+import com.google.gwt.event.logical.shared.SelectionHandler;\r
 import com.google.gwt.i18n.client.DateTimeFormat;\r
 import com.google.gwt.resources.client.ImageResource;\r
 import com.google.gwt.user.client.Window;\r
@@ -125,8 +132,8 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
 \r
         inner.add(createSharingPanel(), "Sharing");\r
 \r
-        inner.add(createVersionPanel(), "Versions");\r
-\r
+               fetchVersions();\r
+                       \r
         inner.selectTab(0);\r
 \r
         outer.add(inner);\r
@@ -165,7 +172,29 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
         setWidget(outer);\r
        }\r
 \r
-    private VerticalPanel createGeneralPanel() {\r
+    protected void fetchVersions() {\r
+       String path = file.getUri() + "?format=json&version=list";\r
+       GetRequest<FileVersions> getVersions = new GetRequest<FileVersions>(FileVersions.class, app.getApiPath(), file.getOwner(), path) {\r
+\r
+                       @Override\r
+                       public void onSuccess(FileVersions _result) {\r
+                       inner.add(createVersionPanel(_result.getVersions()), "Versions");\r
+                       }\r
+\r
+                       @Override\r
+                       public void onError(Throwable t) {\r
+                if (t instanceof RestException) {\r
+                    app.displayError("Unable to fetch versions: " + ((RestException) t).getHttpStatusText());\r
+                }\r
+                else\r
+                    app.displayError("System error unable to fetch versions: "+t.getMessage());\r
+                       }\r
+               };\r
+               getVersions.setHeader("X-Auth-Token", app.getToken());\r
+               Scheduler.get().scheduleDeferred(getVersions);\r
+       }\r
+\r
+       private VerticalPanel createGeneralPanel() {\r
         final VerticalPanel generalPanel = new VerticalPanel();\r
         final FlexTable generalTable = new FlexTable();\r
         generalTable.setText(0, 0, "Name");\r
@@ -331,56 +360,10 @@ public class FilePropertiesDialog extends AbstractPropertiesDialog {
         return permPanel;\r
     }\r
 \r
-    private VerticalPanel createVersionPanel() {\r
+    private VerticalPanel createVersionPanel(List<Version> versions) {\r
         VerticalPanel versionPanel = new VerticalPanel();\r
-\r
-//        VersionsList verList = new VersionsList(this, images, bodies);\r
-//        versionPanel.add(verList);\r
-//\r
-//        HorizontalPanel vPanel = new HorizontalPanel();\r
-//\r
-//             vPanel.setSpacing(8);\r
-//             vPanel.addStyleName("pithos-TabPanelBottom");\r
-//             vPanel.add(new Label("Versioned"));\r
-//\r
-//             versioned.setValue(file.isVersioned());\r
-//             vPanel.add(versioned);\r
-//             versionPanel.add(vPanel);\r
-//\r
-//        HorizontalPanel vPanel2 = new HorizontalPanel();\r
-//             vPanel2.setSpacing(8);\r
-//             vPanel2.addStyleName("pithos-TabPanelBottom");\r
-//\r
-//        HTML removeAllVersion = new HTML("<span>Remove all previous versions?</span>");\r
-//        vPanel2.add(removeAllVersion);\r
-//\r
-//             Button removeVersionsButton = new Button(AbstractImagePrototype.create(images.delete()).getHTML(), new ClickHandler() {\r
-//                     @Override\r
-//                     public void onClick(ClickEvent event) {\r
-//                             ConfirmationDialog confirm = new ConfirmationDialog("Really " +\r
-//                                             "remove all previous versions?", "Remove") {\r
-//\r
-//                                     @Override\r
-//                                     public void cancel() {\r
-//                                     }\r
-//\r
-//                                     @Override\r
-//                                     public void confirm() {\r
-//                                             FilePropertiesDialog.this.closeDialog();\r
-//                                             removeAllOldVersions();\r
-//                                     }\r
-//\r
-//                             };\r
-//                             confirm.center();\r
-//                     }\r
-//\r
-//             });\r
-//             vPanel2.add(removeVersionsButton);\r
-//        if(!file.isVersioned())\r
-//            vPanel2.setVisible(false);\r
-//\r
-//        versionPanel.add(vPanel2);\r
-\r
+        VersionsList verList = new VersionsList(app, this, images, file, versions);\r
+        versionPanel.add(verList);\r
         return versionPanel;\r
     }\r
 \r
index efda620..00001fd 100644 (file)
@@ -70,17 +70,6 @@ public class FilesPropertiesDialog extends AbstractPropertiesDialog {
                super(_app);\r
 \r
                files = _files;\r
-//             int versionedNum = 0;\r
-//             for (File fr : files)\r
-//                     if (fr.isVersioned()) versionedNum++;\r
-//             Boolean versioned = null;\r
-//             if (versionedNum == 0)\r
-//            versioned = false;\r
-//             if (versionedNum == files.size())\r
-//            versioned = true;\r
-\r
-//             initialVersioned = versioned;\r
-//             versionedCheck = new TristateCheckBox(versioned);\r
 \r
                // Set the dialog's caption.\r
                setText("Files properties");\r
@@ -94,17 +83,6 @@ public class FilesPropertiesDialog extends AbstractPropertiesDialog {
 \r
                inner.add(createGeneralPanel(), "General");\r
 \r
-        final VerticalPanel verPanel = new VerticalPanel();\r
-\r
-//        final HorizontalPanel vPanel = new HorizontalPanel();\r
-//        vPanel.setSpacing(8);\r
-//        vPanel.addStyleName("pithos-TabPanelBottom");\r
-//        vPanel.add(new Label("Versioned"));\r
-//        vPanel.add(versionedCheck);\r
-//\r
-//        verPanel.add(vPanel);\r
-\r
-               inner.add(verPanel, "Versions");\r
                inner.selectTab(0);\r
         outer.add(inner);\r
 \r
@@ -153,41 +131,6 @@ public class FilesPropertiesDialog extends AbstractPropertiesDialog {
         else\r
             generalTable.setText(1, 1, "-");\r
 \r
-               // Find if tags are identical\r
-//             List<String> tagsList = files.get(0).getTags();\r
-//             List<String> tagss;\r
-//             for (int i=1; i<files.size(); i++) {\r
-//                     tagss = files.get(i).getTags();\r
-//                     if (tagsList.size() != tagss.size() || !tagsList.containsAll(tagss)) {\r
-//                             tagsList = null;\r
-//                             break;\r
-//                     }\r
-//             }\r
-//             // Get the tags.\r
-//             StringBuffer tagsBuffer = new StringBuffer();\r
-//             if (tagsList==null)\r
-//                     tagsBuffer.append(MULTIPLE_VALUES_TEXT);\r
-//             else {\r
-//                     Iterator i = tagsList.iterator();\r
-//                     while (i.hasNext()) {\r
-//                             String tag = (String) i.next();\r
-//                             tagsBuffer.append(tag).append(", ");\r
-//                     }\r
-//                     if (tagsBuffer.length() > 1)\r
-//                             tagsBuffer.delete(tagsBuffer.length() - 2, tagsBuffer.length() - 1);\r
-//             }\r
-//             initialTagText = tagsBuffer.toString();\r
-//             tags.setText(initialTagText);\r
-//             tags.addFocusHandler(new FocusHandler() {\r
-//                     @Override\r
-//                     public void onFocus(FocusEvent event) {\r
-//                             if (MULTIPLE_VALUES_TEXT.equals(tags.getText()))\r
-//                                     tags.setText("");\r
-//                     }\r
-//             }\r
-//             );\r
-//\r
-//             generalTable.setWidget(2, 1, tags);\r
                generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
                generalTable.getFlexCellFormatter().setColSpan(0, 0, 2);\r
                generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");\r
@@ -199,15 +142,6 @@ public class FilesPropertiesDialog extends AbstractPropertiesDialog {
 \r
         generalPanel.add(generalTable);\r
 \r
-               // Asynchronously retrieve the tags defined by this user.\r
-//             DeferredCommand.addCommand(new Command() {\r
-//\r
-//                     @Override\r
-//                     public void execute() {\r
-//                             updateTags();\r
-//                     }\r
-//             });\r
-\r
                DisclosurePanel allTags = new DisclosurePanel("All tags");\r
                allTagsContent = new FlowPanel();\r
                allTags.setContent(allTagsContent);\r
@@ -223,57 +157,5 @@ public class FilesPropertiesDialog extends AbstractPropertiesDialog {
         */\r
        @Override\r
        protected void accept() {\r
-//             JSONObject json = new JSONObject();\r
-//             if ( versionedCheck.getState()!=null && !versionedCheck.getState().equals(initialVersioned) )\r
-//                             json.put("versioned", JSONBoolean.getInstance(versionedCheck.getState()));\r
-//\r
-//             JSONArray taga = new JSONArray();\r
-//             int i = 0;\r
-//             String tagText = tags.getText();\r
-//             if (!MULTIPLE_VALUES_TEXT.equals(tagText) && !initialTagText.equals(tagText)) {\r
-//                     String[] tagset = tagText.split(",");\r
-//                     for (String t : tagset) {\r
-//                             JSONString to = new JSONString(t);\r
-//                             taga.set(i, to);\r
-//                             i++;\r
-//                     }\r
-//                     json.put("tags", taga);\r
-//             }\r
-//             String jsonString = json.toString();\r
-//             if(jsonString.equals("{}")){\r
-//                     GWT.log("NO CHANGES", null);\r
-//                     return;\r
-//             }\r
-//             final List<String> fileIds = new ArrayList<String>();\r
-//             for(FileResource f : files)\r
-//                     fileIds.add(f.getUri()+"?update=");\r
-//             MultiplePostCommand rt = new MultiplePostCommand(fileIds.toArray(new String[0]), jsonString, 200){\r
-//\r
-//                     @Override\r
-//                     public void onComplete() {\r
-//                             app.getTreeView().refreshCurrentNode(false);\r
-//                     }\r
-//\r
-//                     @Override\r
-//                     public void onError(String p, Throwable t) {\r
-//                             GWT.log("", t);\r
-//                             if(t instanceof RestException){\r
-//                                     int statusCode = ((RestException)t).getHttpStatusCode();\r
-//                                     if(statusCode == 405)\r
-//                                             app.displayError("You don't have the necessary permissions");\r
-//                                     else if(statusCode == 404)\r
-//                                             app.displayError("File does not exist");\r
-//                                     else if(statusCode == 409)\r
-//                                             app.displayError("A file with the same name already exists");\r
-//                                     else if(statusCode == 413)\r
-//                                             app.displayError("Your quota has been exceeded");\r
-//                                     else\r
-//                                             app.displayError("Unable to modify file::"+((RestException)t).getHttpStatusText());\r
-//                             }\r
-//                             else\r
-//                                     app.displayError("System error modifying file:"+t.getMessage());\r
-//                     }\r
-//             };\r
-//             DeferredCommand.addCommand(rt);\r
        }\r
 }\r
index 30a4168..3e596f6 100644 (file)
  */
 package gr.grnet.pithos.web.client;
 
+import gr.grnet.pithos.web.client.FilePropertiesDialog.Images;
+import gr.grnet.pithos.web.client.foldertree.File;
+import gr.grnet.pithos.web.client.foldertree.Resource;
+import gr.grnet.pithos.web.client.foldertree.Version;
+import gr.grnet.pithos.web.client.rest.PostRequest;
+import gr.grnet.pithos.web.client.rest.RestException;
+
+import java.util.List;
+
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.i18n.client.DateTimeFormat;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
 import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.VerticalPanel;
 
 public class VersionsList extends Composite {
 
-//    private Pithos app;
-//
-//     int selectedRow = -1;
-//
-//     int permissionCount = -1;
-//
-//     List<FileResource> versions = null;
-//
-//     final Images images;
-//
-//     final VerticalPanel permPanel = new VerticalPanel();
-//
-//     final FlexTable permTable = new FlexTable();
-//
-//     FileResource toRemove = null;
-//
-//     FilePropertiesDialog container;
-//
-//     public VersionsList(Pithos _app, FilePropertiesDialog aContainer, final Images theImages, List<FileResource> theVersions) {
-//        app = _app;
-//             images = theImages;
-//             container = aContainer;
-//             versions = theVersions;
-//             Collections.sort(theVersions, new Comparator<FileResource>(){
-//
-//                     @Override
-//                     public int compare(FileResource o1, FileResource o2) {
-//                             return o1.getVersion().compareTo(o2.getVersion());
-//                     }
-//
-//             });
-//             permTable.setText(0, 0, "Version");
-//             permTable.setText(0, 1, "Created");
-//             permTable.setText(0, 2, "Modified");
-//             permTable.setText(0, 3, "Size");
-//             permTable.setText(0, 4, "");
-//             permTable.setText(0, 5, "");
-//             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");
-//             permTable.getFlexCellFormatter().setColSpan(0, 1, 2);
-//             permTable.getFlexCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER);
-//             permTable.getFlexCellFormatter().setHorizontalAlignment(0, 1, HasHorizontalAlignment.ALIGN_CENTER);
-//             permTable.getFlexCellFormatter().setHorizontalAlignment(0, 2, HasHorizontalAlignment.ALIGN_CENTER);
-//             permTable.getFlexCellFormatter().setHorizontalAlignment(0, 3, HasHorizontalAlignment.ALIGN_CENTER);
-//             permPanel.add(permTable);
-//             permPanel.addStyleName("pithos-TabPanelBottom");
-//             permTable.addStyleName("pithos-permList");
-//             initWidget(permPanel);
-//             updateTable();
-//     }
-//
-//     public void updateTable() {
-//             copyListAndContinue(versions);
-//     }
-//
-//     public void showVersionsTable(){
-//             int i = 1;
-//             if (toRemove != null) {
-//                     versions.remove(toRemove);
-//                     toRemove = null;
-//             }
-//             for (final FileResource dto : versions) {
-//                     HTML restoreVersion = new HTML("<a href='#' class='hidden-link info'><span>"+AbstractImagePrototype.create(images.restore()).getHTML()+"</span><div>Restore this Version</div></a>");
-//                     restoreVersion.addClickHandler(new ClickHandler() {
-//                             @Override
-//                             public void onClick(ClickEvent event) {
-//                                     restoreVersion(dto);
-//                             }
-//                     });
-//
-//                     permTable.setHTML(i, 0, "<span>" + dto.getVersion() + "</span>");
-//                     permTable.setHTML(i, 1, "<span>" + formatDate(dto.getCreationDate()) + " by " + app.findUserFullName(dto.getCreatedBy()) + "</span>");
-//                     permTable.setHTML(i, 2, "<span>" + formatDate(dto.getModificationDate()) + " by " + app.findUserFullName(dto.getModifiedBy()) + "</span>");
-//                     permTable.setHTML(i, 3, "<span>" + dto.getFileSizeAsString() + "</span>");
-//                     HTML downloadHtml = new HTML("<a class='hidden-link info' href='#'><span>"+AbstractImagePrototype.create(images.download()).getHTML()+"</span><div>View this Version</div></a>");
-//                     downloadHtml.addClickHandler(new ClickHandler() {
-//                             @Override
-//                             public void onClick(ClickEvent event) {
-//                                     String fileUrl = dto.getUri() + "?version=" + dto.getVersion();
-//                                     Window.open(fileUrl, "_BLANK", "");
-//                             }
-//                     });
-//                     permTable.setWidget(i, 4, downloadHtml);
-//                     permTable.setWidget(i, 5, restoreVersion);
-//                     permTable.getFlexCellFormatter().setStyleName(i, 0, "props-labels");
-//                     permTable.getFlexCellFormatter().setHorizontalAlignment(i, 0, HasHorizontalAlignment.ALIGN_CENTER);
-//                     permTable.getFlexCellFormatter().setHorizontalAlignment(i, 1, HasHorizontalAlignment.ALIGN_CENTER);
-//                     permTable.getFlexCellFormatter().setColSpan(i, 1, 2);
-//                     permTable.getFlexCellFormatter().setHorizontalAlignment(i, 2, HasHorizontalAlignment.ALIGN_CENTER);
-//                     permTable.getFlexCellFormatter().setHorizontalAlignment(i, 3, HasHorizontalAlignment.ALIGN_CENTER);
-//                     i++;
-//             }
-//             for (; i < permTable.getRowCount(); i++)
-//                     permTable.removeRow(i);
-//     }
-//
-//     void restoreVersion(final FileResource version) {
-////           FileResource selectedFile = (FileResource) app.getCurrentSelection();
-////           PostCommand ep = new PostCommand(app, selectedFile.getUri()+"?restoreVersion="+version.getVersion(),"",200){
-////
-////
-////                   @Override
-////                   public void onComplete() {
-////                           container.hide();
-////                app.getTreeView().refreshCurrentNode(false);
-////                   }
-////
-////                   @Override
-////                   public void onError(Throwable t) {
-////                           GWT.log("", t);
-////                           if(t instanceof RestException)
-////                                   app.displayError("Unable to restore version:"+((RestException)t).getHttpStatusText());
-////                           else
-////                                   app.displayError("System error restoring version:"+t.getMessage());
-////                   }
-////
-////           };
-////           DeferredCommand.addCommand(ep);
-//     }
-//
-//     private String formatDate(Date date){
-//             DateTimeFormat format = DateTimeFormat.getFormat("dd/MM/yyyy : HH:mm");
-//             return format.format(date);
-//     }
-//
-//     /**
-//      * Copies the input List to a new List
-//      * @param input
-//      */
-//     private void copyListAndContinue(List<FileResource> input){
-//             List<FileResource> copiedInput = new ArrayList<FileResource>();
-//             for(FileResource 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.
-//      *
-//      * @param input
-//      */
-//     private void handleFullNames(List<FileResource> input){
-//             if(input.isEmpty()){
-//                     showVersionsTable();
-//                     return;
-//             }
-//
-//             if(app.findUserFullName(input.get(0).getOwner()) == null){
-//                     findFullNameAndUpdate(input);
-//                     return;
-//             }
-//
-//             if(input.size() >= 1){
-//                     input.remove(input.get(0));
-//                     if(input.isEmpty()){
-//                             showVersionsTable();
-//                     }else{
-//                             handleFullNames(input);
-//                     }
-//             }
-//     }
-//
-//     /**
-//      * Makes a request to search for full name from a given username
-//      * and continues checking the next element of the List.
-//      *
-//      * @param input
-//      */
-//
-//     private void findFullNameAndUpdate(final List<FileResource> input){
-////           final String aUserName = input.get(0).getOwner();
-////           String path = app.getApiPath() + "users/" + aUserName;
-////
-////           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(input.size() >= 1){
-////                                           input.remove(input.get(0));
-////                                           if(input.isEmpty()){
-////                                                   showVersionsTable();
-////                                                   return;
-////                                           }
-////                                           handleFullNames(input);
-////                                   }
-////                           }
-////                   }
-////                   @Override
-////                   public void onError(Throwable t) {
-////                           app.displayError("Unable to fetch user's full name from the given username " + aUserName);
-////                           if(input.size() >= 1){
-////                                   input.remove(input.get(0));
-////                                   handleFullNames(input);
-////                           }
-////                   }
-////           };
-////           DeferredCommand.addCommand(gg);
-//
-//     }
-//
+    Pithos app;
+
+    File file;
+    
+    private List<Version> versions = null;
+    
+    private Images images;
+    
+    private VerticalPanel permPanel = new VerticalPanel();
+    
+    private FlexTable permTable = new FlexTable();
+
+       FilePropertiesDialog container;
+
+       public VersionsList(Pithos _app, FilePropertiesDialog aContainer, final Images theImages, File _file, List<Version> theVersions) {
+        app = _app;
+               images = theImages;
+               container = aContainer;
+               file = _file;
+               versions = theVersions;
+               permTable.setText(0, 0, "Version");
+               permTable.setText(0, 1, "Date");
+               permTable.setText(0, 2, "");
+               permTable.setText(0, 3, "");
+               permTable.getFlexCellFormatter().setStyleName(0, 0, "props-toplabels");
+               permTable.getFlexCellFormatter().setStyleName(0, 1, "props-toplabels");
+               permTable.getFlexCellFormatter().setColSpan(0, 1, 2);
+               permTable.getFlexCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER);
+               permTable.getFlexCellFormatter().setHorizontalAlignment(0, 1, HasHorizontalAlignment.ALIGN_CENTER);
+               permPanel.add(permTable);
+               permPanel.addStyleName("pithos-TabPanelBottom");
+               permTable.addStyleName("pithos-permList");
+               initWidget(permPanel);
+               showVersionsTable();
+       }
+
+       public void showVersionsTable(){
+               DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
+               int i = 1;
+               for (final Version v : versions) {
+                       HTML restoreVersion = new HTML("<a href='#' class='hidden-link info'><span>" + AbstractImagePrototype.create(images.restore()).getHTML() + "</span><div>Restore this Version</div></a>");
+                       restoreVersion.addClickHandler(new ClickHandler() {
+                               @Override
+                               public void onClick(ClickEvent event) {
+                                       restoreVersion(v.getVersion());
+                               }
+                       });
+
+                       permTable.setHTML(i, 0, "<span>" + v.getVersion() + "</span>");
+                       permTable.setHTML(i, 1, "<span>" + formatter.format(v.getDate()) + "</span>");
+                       HTML downloadHtml = new HTML("<a class='hidden-link info' href='#'><span>" + AbstractImagePrototype.create(images.download()).getHTML()+"</span><div>View this Version</div></a>");
+                       downloadHtml.addClickHandler(new ClickHandler() {
+                               @Override
+                               public void onClick(ClickEvent event) {
+                                       String fileUrl = app.getApiPath() + app.getUsername() + file.getUri() + "?X-Auth-Token=" + app.getToken() + "&version=" + v.getVersion();
+                                       Window.open(fileUrl, "_BLANK", "");
+                               }
+                       });
+                       permTable.setWidget(i, 2, downloadHtml);
+                       permTable.setWidget(i, 3, restoreVersion);
+                       permTable.getFlexCellFormatter().setStyleName(i, 0, "props-labels");
+                       permTable.getFlexCellFormatter().setHorizontalAlignment(i, 0, HasHorizontalAlignment.ALIGN_CENTER);
+                       permTable.getFlexCellFormatter().setHorizontalAlignment(i, 1, HasHorizontalAlignment.ALIGN_CENTER);
+                       permTable.getFlexCellFormatter().setColSpan(i, 1, 2);
+                       i++;
+               }
+       }
+
+       void restoreVersion(int version) {
+               String path = file.getUri() + "?update=";
+               PostRequest restoreVersion = new PostRequest(app.getApiPath(), file.getOwner(), path) {
+                       
+                       @Override
+                       public void onSuccess(Resource result) {
+                               container.hide();
+                       }
+                       
+                       @Override
+                       public void onError(Throwable t) {
+                if (t instanceof RestException) {
+                       if (((RestException) t).getHttpStatusCode() == Response.SC_NO_CONTENT)
+                               onSuccess(null);
+                       else
+                               app.displayError("Unable to restore version: " + ((RestException) t).getHttpStatusText());
+                }
+                else
+                    app.displayError("System error unable to restore versions: "+t.getMessage());
+                       }
+               };
+               restoreVersion.setHeader("X-Auth-Token", app.getToken());
+               restoreVersion.setHeader("X-Source-Object", file.getUri());
+               restoreVersion.setHeader("X-Source-Version", String.valueOf(version));
+               restoreVersion.setHeader("Content-Range", "bytes 0-/*");
+               Scheduler.get().scheduleDeferred(restoreVersion);
+       }
 }
diff --git a/web_client/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java b/web_client/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java
new file mode 100644 (file)
index 0000000..3f1e58c
--- /dev/null
@@ -0,0 +1,44 @@
+package gr.grnet.pithos.web.client.foldertree;
+
+import gr.grnet.pithos.web.client.SharingUsers;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.google.gwt.http.client.Response;
+import com.google.gwt.json.client.JSONArray;
+import com.google.gwt.json.client.JSONObject;
+import com.google.gwt.json.client.JSONParser;
+import com.google.gwt.json.client.JSONValue;
+
+public class FileVersions extends Resource {
+       private List<Version> versions;
+       
+       public List<Version> getVersions() {
+               return versions;
+       }
+
+       public static FileVersions createFromResponse(Response response) {
+               FileVersions res =  new FileVersions();
+               res.populate(response);
+               return res;
+       }
+
+       private void populate(Response response) {
+               versions = new ArrayList<Version>();
+        JSONValue json = JSONParser.parseStrict(response.getText());
+        JSONArray array = json.isObject().get("versions").isArray();
+        if (array != null) {
+            for (int i=0; i<array.size(); i++) {
+                JSONArray o = array.get(i).isArray();
+                if (o != null) {
+                       int num = (int) o.get(0).isNumber().doubleValue();
+                       Date date = new Date((long) o.get(1).isNumber().doubleValue());
+                       Version v = new Version(num, date);
+                       versions.add(v);
+                }
+            }
+        }
+       }
+}
index 745833a..8846bf2 100644 (file)
@@ -107,6 +107,9 @@ public class Resource {
         else if (aClass.equals(SharingUsers.class)) {
                result1 = (T) SharingUsers.createFromResponse(response, (SharingUsers) result);
         }
+        else if (aClass.equals(FileVersions.class)) {
+               result1 = (T) FileVersions.createFromResponse(response);
+        }
         return result1;
     }
 }
diff --git a/web_client/src/gr/grnet/pithos/web/client/foldertree/Version.java b/web_client/src/gr/grnet/pithos/web/client/foldertree/Version.java
new file mode 100644 (file)
index 0000000..5de719a
--- /dev/null
@@ -0,0 +1,22 @@
+package gr.grnet.pithos.web.client.foldertree;
+
+import java.util.Date;
+
+public class Version {
+       private int version;
+       
+       private Date date;
+       
+       public Version(int v, Date d) {
+               version = v;
+               date = d;
+       }
+
+       public int getVersion() {
+               return version;
+       }
+
+       public Date getDate() {
+               return date;
+       }
+}