Fix url encoding in requests. Fix for avoiding the browser 's cache
authorChristos Stathis <chstath@ebs.gr>
Fri, 23 Sep 2011 15:13:01 +0000 (18:13 +0300)
committerChristos Stathis <chstath@ebs.gr>
Fri, 23 Sep 2011 15:13:01 +0000 (18:13 +0300)
17 files changed:
web_client/src/gr/grnet/pithos/web/client/Pithos.java
web_client/src/gr/grnet/pithos/web/client/SharingUsers.java
web_client/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java
web_client/src/gr/grnet/pithos/web/client/foldertree/File.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java
web_client/src/gr/grnet/pithos/web/client/foldertree/Folder.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java
web_client/src/gr/grnet/pithos/web/client/foldertree/Resource.java
web_client/src/gr/grnet/pithos/web/client/grouptree/GroupTreeViewModel.java
web_client/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java
web_client/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java
web_client/src/gr/grnet/pithos/web/client/rest/DeleteRequest.java
web_client/src/gr/grnet/pithos/web/client/rest/GetRequest.java
web_client/src/gr/grnet/pithos/web/client/rest/HeadRequest.java
web_client/src/gr/grnet/pithos/web/client/rest/PostRequest.java
web_client/src/gr/grnet/pithos/web/client/rest/PutRequest.java
web_client/src/gr/grnet/pithos/web/client/tagtree/Tag.java

index 9efece0..5231d63 100644 (file)
@@ -76,6 +76,9 @@ import com.google.gwt.http.client.RequestBuilder;
 import com.google.gwt.http.client.RequestCallback;
 import com.google.gwt.http.client.RequestException;
 import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
+import com.google.gwt.i18n.client.DateTimeFormat;
+import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
 import com.google.gwt.json.client.JSONArray;
 import com.google.gwt.json.client.JSONObject;
 import com.google.gwt.json.client.JSONParser;
@@ -94,7 +97,6 @@ import com.google.gwt.user.client.ui.HasHorizontalAlignment;
 import com.google.gwt.user.client.ui.HasVerticalAlignment;
 import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.HorizontalSplitPanel;
-import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.view.client.SelectionChangeEvent;
@@ -175,9 +177,6 @@ public class Pithos implements EntryPoint, ResizeHandler {
                @Source("gr/grnet/pithos/resources/document.png")
                ImageResource folders();
 
-               @Source("gr/grnet/pithos/resources/edit_group_22.png")
-               ImageResource groups();
-
                @Source("gr/grnet/pithos/resources/advancedsettings.png")
                ImageResource tools();
        }
@@ -820,9 +819,8 @@ public class Pithos implements EntryPoint, ResizeHandler {
        }
 
     public void deleteFolder(final Folder folder) {
-        String path = getApiPath() + folder.getOwner() + "/" + folder.getContainer() + "?format=json&delimiter=/&prefix=" + folder.getPrefix();
+        String path = getApiPath() + folder.getOwner() + "/" + folder.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(folder.getPrefix()) + "&t=" + System.currentTimeMillis();
         RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, path);
-        builder.setHeader("If-Modified-Since", "0");
         builder.setHeader("X-Auth-Token", getToken());
         try {
             builder.sendRequest("", new RequestCallback() {
@@ -877,9 +875,8 @@ public class Pithos implements EntryPoint, ResizeHandler {
             else if (o != null) {
                 String subdir = o.get("subdir").isString().stringValue();
                 subdir = subdir.substring(0, subdir.length() - 1);
-                String path = getApiPath() + getUsername() + "/" + folder.getContainer() + "?format=json&delimiter=/&prefix=" + subdir;
+                String path = getApiPath() + getUsername() + "/" + folder.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(subdir) + "&t=" + System.currentTimeMillis();
                 RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, path);
-                builder.setHeader("If-Modified-Since", "0");
                 builder.setHeader("X-Auth-Token", getToken());
                 try {
                     builder.sendRequest("", new RequestCallback() {
@@ -1004,7 +1001,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
         PutRequest createFolder = new PutRequest(getApiPath(), targetUsername, path) {
             @Override
             public void onSuccess(@SuppressWarnings("unused") Resource result) {
-               GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, getApiPath(), f.getOwner(), "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix(), f) {
+               GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, getApiPath(), f.getOwner(), "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix()), f) {
 
                                        @Override
                                        public void onSuccess(final Folder _f) {
index da63a04..cf85793 100644 (file)
@@ -3,6 +3,7 @@ package gr.grnet.pithos.web.client;
 import gr.grnet.pithos.web.client.foldertree.Resource;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import com.google.gwt.http.client.Response;
@@ -41,4 +42,9 @@ public class SharingUsers extends Resource {
        public List<String> getUsers() {
                return users;
        }
+
+       @Override
+       public Date getLastModified() {
+               return null;
+       }
 }
index b746028..bf4a7bf 100644 (file)
@@ -100,7 +100,8 @@ public class AccountResource extends Resource {
         this.lastLogin = lastLogin;
     }
 
-    public Date getLastModified() {
+    @Override
+       public Date getLastModified() {
         return lastModified;
     }
 
index 3a630d6..438ba0f 100644 (file)
@@ -89,7 +89,8 @@ public class File extends Resource {
         return hash;
     }
 
-    public Date getLastModified() {
+    @Override
+       public Date getLastModified() {
         return lastModified;
     }
 
index 4d6e983..9e81139 100644 (file)
@@ -38,4 +38,9 @@ public class FileVersions extends Resource {
             }
         }
        }
+
+       @Override
+       public Date getLastModified() {
+               return null;
+       }
 }
index 96d16d6..7709033 100644 (file)
@@ -96,7 +96,8 @@ public class Folder extends Resource {
         return name;
     }
 
-    public Date getLastModified() {
+    @Override
+       public Date getLastModified() {
         return lastModified;
     }
 
index c43adcb..1c865f7 100644 (file)
@@ -49,9 +49,9 @@ import com.google.gwt.cell.client.AbstractCell;
 import com.google.gwt.cell.client.Cell;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
-import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.event.dom.client.ContextMenuEvent;
 import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.user.client.Command;
@@ -137,7 +137,7 @@ public class FolderTreeViewModel implements TreeViewModel {
         if (iter.hasNext()) {
             final Folder f = iter.next();
 
-            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
             GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
                 @Override
                 public void onSuccess(@SuppressWarnings("unused") Folder _result) {
@@ -190,45 +190,40 @@ public class FolderTreeViewModel implements TreeViewModel {
     }
 
     public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles, final Command callback) {
-        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
+        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
             @Override
-            public void execute() {
-                String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
-                GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
-                    @Override
-                    public void onSuccess(final Folder _result) {
-                        if (showfiles)
-                            app.showFiles(_result);
-                        Iterator<Folder> iter = _result.getSubfolders().iterator();
-                        fetchFolder(iter, new Command() {
-                            @Override
-                            public void execute() {
-                                dataProvider.getList().clear();
-                                dataProvider.getList().addAll(_result.getSubfolders());
-                                app.getFolderTreeView().updateChildren(f);
-                                if (callback != null)
-                                       callback.execute();
-                            }
-                        });
-                    }
-
+            public void onSuccess(final Folder _result) {
+                if (showfiles)
+                    app.showFiles(_result);
+                Iterator<Folder> iter = _result.getSubfolders().iterator();
+                fetchFolder(iter, new Command() {
                     @Override
-                    public void onError(Throwable t) {
-                        GWT.log("Error getting folder", t);
-                        if (t instanceof RestException)
-                            app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
-                        else
-                            app.displayError("System error fetching folder: " + t.getMessage());
+                    public void execute() {
+                        dataProvider.getList().clear();
+                        dataProvider.getList().addAll(_result.getSubfolders());
+                        app.getFolderTreeView().updateChildren(f);
+                        if (callback != null)
+                               callback.execute();
                     }
+                });
+            }
 
-                               @Override
-                               protected void onUnauthorized(Response response) {
-                                       app.sessionExpired();
-                               }
-                };
-                getFolder.setHeader("X-Auth-Token", app.getToken());
-                Scheduler.get().scheduleDeferred(getFolder);
+            @Override
+            public void onError(Throwable t) {
+                GWT.log("Error getting folder", t);
+                if (t instanceof RestException)
+                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
+                else
+                    app.displayError("System error fetching folder: " + t.getMessage());
             }
-        });
+
+                       @Override
+                       protected void onUnauthorized(Response response) {
+                               app.sessionExpired();
+                       }
+        };
+        getFolder.setHeader("X-Auth-Token", app.getToken());
+        Scheduler.get().scheduleDeferred(getFolder);
     }
 }
index b8c230d..4800517 100644 (file)
@@ -45,7 +45,7 @@ import gr.grnet.pithos.web.client.SharingUsers;
 
 import java.util.Date;
 
-public class Resource {
+public abstract class Resource {
 
     protected static String unmarshallString(JSONObject obj, String key){
         if(obj.get(key) != null) {
@@ -112,4 +112,6 @@ public class Resource {
         }
         return result1;
     }
+    
+    public abstract Date getLastModified();
 }
index c5a1a60..b127c89 100644 (file)
@@ -37,7 +37,6 @@ package gr.grnet.pithos.web.client.grouptree;
 
 import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.foldertree.File;
-import gr.grnet.pithos.web.client.foldertree.FolderTreeViewModel;
 import gr.grnet.pithos.web.client.grouptree.GroupTreeView.Templates;
 
 import java.util.HashMap;
@@ -71,7 +70,7 @@ public class GroupTreeViewModel implements TreeViewModel {
                }
                
         @Override
-        public void onBrowserEvent(@SuppressWarnings("unused") Cell.Context context, @SuppressWarnings("unused") com.google.gwt.dom.client.Element parent, @SuppressWarnings("unused") String s, com.google.gwt.dom.client.NativeEvent event, @SuppressWarnings("unused") com.google.gwt.cell.client.ValueUpdater<String> valueUpdater) {
+        public void onBrowserEvent(@SuppressWarnings("unused") Cell.Context context, @SuppressWarnings("unused") com.google.gwt.dom.client.Element parent, String s, com.google.gwt.dom.client.NativeEvent event, @SuppressWarnings("unused") com.google.gwt.cell.client.ValueUpdater<String> valueUpdater) {
             GroupTreeViewModel.this.rootSelectionModel.setSelected(s, true);
             if (event.getType().equals(ContextMenuEvent.getType().getName())) {
                 GroupContextMenu menu = new GroupContextMenu(app, GroupTreeView.images, null);
index 3ac3384..5f8ef68 100644 (file)
@@ -58,6 +58,7 @@ import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.dom.client.ContextMenuEvent;
 import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.text.shared.SafeHtmlRenderer;
@@ -197,7 +198,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
         if (iter.hasNext()) {
             final Folder f = iter.next();
 
-            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
             GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
                 @Override
                 public void onSuccess(Folder _result) {
@@ -255,7 +256,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
     }
 
     public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles) {
-        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
         GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
             @Override
             public void onSuccess(final Folder _result) {
index af34210..aa11a69 100644 (file)
@@ -59,6 +59,7 @@ import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.dom.client.ContextMenuEvent;
 import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.text.shared.SafeHtmlRenderer;
@@ -311,7 +312,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
         if (iter.hasNext()) {
             final Folder f = iter.next();
 
-            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
             GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), username, path, f) {
                 @Override
                 public void onSuccess(Folder _result) {
@@ -369,7 +370,7 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
     }
 
     public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles) {
-        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
         GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
             @Override
             public void onSuccess(final Folder _result) {
index 1e70647..168ca5b 100644 (file)
@@ -40,6 +40,8 @@ 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 com.google.gwt.http.client.URL;
+
 import gr.grnet.pithos.web.client.foldertree.Resource;
 import java.util.HashMap;
 import java.util.Map;
index 253b4b4..990d781 100644 (file)
@@ -46,6 +46,9 @@ 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 com.google.gwt.http.client.URL;
+import com.google.gwt.i18n.client.DateTimeFormat;
+import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
 
 public abstract class GetRequest<T extends Resource> implements ScheduledCommand {
 
@@ -59,8 +62,6 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
 
     private int okCode;
     
-    protected T cached;
-
     protected T result;
 
     private Map<String, String> headers = new HashMap<String, String>();
@@ -88,8 +89,11 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
 
     @Override
     public void execute() {
+       if (path.contains("?"))
+               path += "&t=" + System.currentTimeMillis();
+       else
+               path += "?t=" + System.currentTimeMillis();
         RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, api + owner + path);
-        builder.setHeader("If-Modified-Since", "0");
         for (String header : headers.keySet()) {
             builder.setHeader(header, headers.get(header));
         }
@@ -108,9 +112,9 @@ public abstract class GetRequest<T extends Resource> implements ScheduledCommand
                 @Override
                 public void onError(@SuppressWarnings("unused") Request request, Throwable throwable) {
                     if (throwable instanceof RestException) {
-                        if (((RestException) throwable).getHttpStatusCode() == 304 && cached != null){
-                            GWT.log("Using cache: " + cached.toString(), null);
-                            onSuccess(cached);
+                        if (((RestException) throwable).getHttpStatusCode() == 304 && result != null){
+                            GWT.log("Using cache: " + result.toString(), null);
+                            onSuccess(result);
                             return;
                         }
                     }
index b26f450..0a04cf7 100644 (file)
@@ -46,6 +46,7 @@ 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 com.google.gwt.http.client.URL;
 
 public abstract class HeadRequest<T extends Resource> implements ScheduledCommand {
 
@@ -88,8 +89,11 @@ public abstract class HeadRequest<T extends Resource> implements ScheduledComman
 
     @Override
     public void execute() {
+       if (path.contains("?"))
+               path += "&t=" + System.currentTimeMillis();
+       else
+               path += "?t=" + System.currentTimeMillis();
         RequestBuilder builder = new RequestBuilder(RequestBuilder.HEAD, api + owner + path);
-        builder.setHeader("If-Modified-Since", "0");
         for (String header : headers.keySet()) {
             builder.setHeader(header, headers.get(header));
         }
index 50e2a90..2b0682f 100644 (file)
@@ -40,6 +40,8 @@ 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 com.google.gwt.http.client.URL;
+
 import gr.grnet.pithos.web.client.foldertree.Resource;
 import java.util.HashMap;
 import java.util.Map;
index 966ca86..79924c5 100644 (file)
@@ -75,6 +75,8 @@ 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 com.google.gwt.http.client.URL;
+
 import gr.grnet.pithos.web.client.foldertree.Resource;
 import java.util.HashMap;
 import java.util.Map;
index 857dfb4..55f066b 100644 (file)
@@ -38,6 +38,7 @@ package gr.grnet.pithos.web.client.tagtree;
 import gr.grnet.pithos.web.client.foldertree.File;
 import gr.grnet.pithos.web.client.foldertree.Resource;
 
+import java.util.Date;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -146,4 +147,9 @@ public class Tag extends Resource {
     public Set<File> getFiles() {
         return files;
     }
+
+       @Override
+       public Date getLastModified() {
+               return null;
+       }
 }