From f5023f133625340cd4a47896265211379d45b811 Mon Sep 17 00:00:00 2001 From: Christos Stathis Date: Fri, 23 Sep 2011 18:13:01 +0300 Subject: [PATCH] Fix url encoding in requests. Fix for avoiding the browser 's cache --- src/gr/grnet/pithos/web/client/Pithos.java | 15 ++--- src/gr/grnet/pithos/web/client/SharingUsers.java | 6 ++ .../web/client/foldertree/AccountResource.java | 3 +- .../grnet/pithos/web/client/foldertree/File.java | 3 +- .../pithos/web/client/foldertree/FileVersions.java | 5 ++ .../grnet/pithos/web/client/foldertree/Folder.java | 3 +- .../web/client/foldertree/FolderTreeViewModel.java | 69 +++++++++----------- .../pithos/web/client/foldertree/Resource.java | 4 +- .../web/client/grouptree/GroupTreeViewModel.java | 3 +- .../client/mysharedtree/MysharedTreeViewModel.java | 5 +- .../othersharedtree/OtherSharedTreeViewModel.java | 5 +- .../pithos/web/client/rest/DeleteRequest.java | 2 + .../grnet/pithos/web/client/rest/GetRequest.java | 16 +++-- .../grnet/pithos/web/client/rest/HeadRequest.java | 6 +- .../grnet/pithos/web/client/rest/PostRequest.java | 2 + .../grnet/pithos/web/client/rest/PutRequest.java | 2 + src/gr/grnet/pithos/web/client/tagtree/Tag.java | 6 ++ 17 files changed, 92 insertions(+), 63 deletions(-) diff --git a/src/gr/grnet/pithos/web/client/Pithos.java b/src/gr/grnet/pithos/web/client/Pithos.java index 9efece0..5231d63 100644 --- a/src/gr/grnet/pithos/web/client/Pithos.java +++ b/src/gr/grnet/pithos/web/client/Pithos.java @@ -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 getFolder = new GetRequest(Folder.class, getApiPath(), f.getOwner(), "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix(), f) { + GetRequest getFolder = new GetRequest(Folder.class, getApiPath(), f.getOwner(), "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix()), f) { @Override public void onSuccess(final Folder _f) { diff --git a/src/gr/grnet/pithos/web/client/SharingUsers.java b/src/gr/grnet/pithos/web/client/SharingUsers.java index da63a04..cf85793 100644 --- a/src/gr/grnet/pithos/web/client/SharingUsers.java +++ b/src/gr/grnet/pithos/web/client/SharingUsers.java @@ -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 getUsers() { return users; } + + @Override + public Date getLastModified() { + return null; + } } diff --git a/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java b/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java index b746028..bf4a7bf 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java +++ b/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java @@ -100,7 +100,8 @@ public class AccountResource extends Resource { this.lastLogin = lastLogin; } - public Date getLastModified() { + @Override + public Date getLastModified() { return lastModified; } diff --git a/src/gr/grnet/pithos/web/client/foldertree/File.java b/src/gr/grnet/pithos/web/client/foldertree/File.java index 3a630d6..438ba0f 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/File.java +++ b/src/gr/grnet/pithos/web/client/foldertree/File.java @@ -89,7 +89,8 @@ public class File extends Resource { return hash; } - public Date getLastModified() { + @Override + public Date getLastModified() { return lastModified; } diff --git a/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java b/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java index 4d6e983..9e81139 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java +++ b/src/gr/grnet/pithos/web/client/foldertree/FileVersions.java @@ -38,4 +38,9 @@ public class FileVersions extends Resource { } } } + + @Override + public Date getLastModified() { + return null; + } } diff --git a/src/gr/grnet/pithos/web/client/foldertree/Folder.java b/src/gr/grnet/pithos/web/client/foldertree/Folder.java index 96d16d6..7709033 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/Folder.java +++ b/src/gr/grnet/pithos/web/client/foldertree/Folder.java @@ -96,7 +96,8 @@ public class Folder extends Resource { return name; } - public Date getLastModified() { + @Override + public Date getLastModified() { return lastModified; } diff --git a/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java b/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java index c43adcb..1c865f7 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/foldertree/FolderTreeViewModel.java @@ -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 getFolder = new GetRequest(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 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 getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), path, f) { @Override - public void execute() { - String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix(); - GetRequest getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), path, f) { - @Override - public void onSuccess(final Folder _result) { - if (showfiles) - app.showFiles(_result); - Iterator 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 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); } } diff --git a/src/gr/grnet/pithos/web/client/foldertree/Resource.java b/src/gr/grnet/pithos/web/client/foldertree/Resource.java index b8c230d..4800517 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/Resource.java +++ b/src/gr/grnet/pithos/web/client/foldertree/Resource.java @@ -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(); } diff --git a/src/gr/grnet/pithos/web/client/grouptree/GroupTreeViewModel.java b/src/gr/grnet/pithos/web/client/grouptree/GroupTreeViewModel.java index c5a1a60..b127c89 100644 --- a/src/gr/grnet/pithos/web/client/grouptree/GroupTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/grouptree/GroupTreeViewModel.java @@ -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 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 valueUpdater) { GroupTreeViewModel.this.rootSelectionModel.setSelected(s, true); if (event.getType().equals(ContextMenuEvent.getType().getName())) { GroupContextMenu menu = new GroupContextMenu(app, GroupTreeView.images, null); diff --git a/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java b/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java index 3ac3384..5f8ef68 100644 --- a/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java @@ -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 getFolder = new GetRequest(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 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 getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), path, f) { @Override public void onSuccess(final Folder _result) { diff --git a/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java b/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java index af34210..aa11a69 100644 --- a/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java @@ -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 getFolder = new GetRequest(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 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 getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), path, f) { @Override public void onSuccess(final Folder _result) { diff --git a/src/gr/grnet/pithos/web/client/rest/DeleteRequest.java b/src/gr/grnet/pithos/web/client/rest/DeleteRequest.java index 1e70647..168ca5b 100644 --- a/src/gr/grnet/pithos/web/client/rest/DeleteRequest.java +++ b/src/gr/grnet/pithos/web/client/rest/DeleteRequest.java @@ -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; diff --git a/src/gr/grnet/pithos/web/client/rest/GetRequest.java b/src/gr/grnet/pithos/web/client/rest/GetRequest.java index 253b4b4..990d781 100644 --- a/src/gr/grnet/pithos/web/client/rest/GetRequest.java +++ b/src/gr/grnet/pithos/web/client/rest/GetRequest.java @@ -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 implements ScheduledCommand { @@ -59,8 +62,6 @@ public abstract class GetRequest implements ScheduledCommand private int okCode; - protected T cached; - protected T result; private Map headers = new HashMap(); @@ -88,8 +89,11 @@ public abstract class GetRequest 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 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; } } diff --git a/src/gr/grnet/pithos/web/client/rest/HeadRequest.java b/src/gr/grnet/pithos/web/client/rest/HeadRequest.java index b26f450..0a04cf7 100644 --- a/src/gr/grnet/pithos/web/client/rest/HeadRequest.java +++ b/src/gr/grnet/pithos/web/client/rest/HeadRequest.java @@ -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 implements ScheduledCommand { @@ -88,8 +89,11 @@ public abstract class HeadRequest 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)); } diff --git a/src/gr/grnet/pithos/web/client/rest/PostRequest.java b/src/gr/grnet/pithos/web/client/rest/PostRequest.java index 50e2a90..2b0682f 100644 --- a/src/gr/grnet/pithos/web/client/rest/PostRequest.java +++ b/src/gr/grnet/pithos/web/client/rest/PostRequest.java @@ -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; diff --git a/src/gr/grnet/pithos/web/client/rest/PutRequest.java b/src/gr/grnet/pithos/web/client/rest/PutRequest.java index 966ca86..79924c5 100644 --- a/src/gr/grnet/pithos/web/client/rest/PutRequest.java +++ b/src/gr/grnet/pithos/web/client/rest/PutRequest.java @@ -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; diff --git a/src/gr/grnet/pithos/web/client/tagtree/Tag.java b/src/gr/grnet/pithos/web/client/tagtree/Tag.java index 857dfb4..55f066b 100644 --- a/src/gr/grnet/pithos/web/client/tagtree/Tag.java +++ b/src/gr/grnet/pithos/web/client/tagtree/Tag.java @@ -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 getFiles() { return files; } + + @Override + public Date getLastModified() { + return null; + } } -- 1.7.10.4