*/\r
package gr.grnet.pithos.web.client;\r
\r
+import com.google.gwt.core.client.Scheduler;\r
import com.google.gwt.event.dom.client.KeyDownEvent;\r
import com.google.gwt.user.client.Event;\r
import gr.grnet.pithos.web.client.foldertree.Folder;\r
+import gr.grnet.pithos.web.client.foldertree.Resource;\r
import gr.grnet.pithos.web.client.rest.PostCommand;\r
+import gr.grnet.pithos.web.client.rest.PutRequest;\r
import gr.grnet.pithos.web.client.rest.RestException;\r
import gr.grnet.pithos.web.client.rest.resource.RestResourceWrapper;\r
\r
*/\r
public class FolderPropertiesDialog extends DialogBox {\r
\r
+ private GSS app;\r
+\r
private CheckBox readForAll;\r
\r
/**\r
\r
/**\r
* The widget's constructor.\r
- *\r
- * @param _create true if the dialog is displayed for creating a new\r
- * sub-folder of the selected folder, false if it is displayed\r
- * for modifying the selected folder\r
*/\r
- public FolderPropertiesDialog(boolean _create, Folder selected) {\r
+ public FolderPropertiesDialog(GSS app, boolean _create, Folder selected) {\r
+ this.app = app;\r
setAnimationEnabled(true);\r
\r
// Enable IE selection for the dialog (must disable it upon closing it)\r
- GSS.enableIESelection();\r
+ app.enableIESelection();\r
\r
create = _create;\r
\r
* (we disable the prevention on creation of the dialog)\r
*/\r
public void closeDialog() {\r
- GSS.preventIESelection();\r
+ app.preventIESelection();\r
hide();\r
}\r
\r
*/\r
private void createFolder() {\r
String name = folderName.getText();\r
-\r
-// PostCommand ep = new PostCommand(folder.getUri() + "?new=" +\r
-// URL.encodeComponent(name), "", 201) {\r
-//\r
-// @Override\r
-// public void onComplete() {\r
-// //TODO:CELLTREE\r
-// if(folder.getUri().equals(GSS.get().getTreeView().getMyFolders().getUri())){\r
-// GSS.get().getTreeView().updateRootNode();\r
-// }\r
-// else\r
-// GSS.get().getTreeView().updateNodeChildren((RestResourceWrapper) GSS.get().getTreeView().getSelection());\r
-// //GSS.get().getFolders().updateFolder((DnDTreeItem) GSS.get().getFolders().getCurrent());\r
-// }\r
-//\r
-// @Override\r
-// public void onError(Throwable t) {\r
-// GWT.log("", t);\r
-// if(t instanceof RestException){\r
-// int statusCode = ((RestException)t).getHttpStatusCode();\r
-// if(statusCode == 405)\r
-// GSS.get().displayError("You don't have the necessary" +\r
-// " permissions or a folder with same name " +\r
-// "already exists");\r
-// else if(statusCode == 404)\r
-// GSS.get().displayError("Resource not found");\r
-// else\r
-// GSS.get().displayError("Unable to create folder:" +\r
-// ((RestException)t).getHttpStatusText());\r
-// }\r
-// else\r
-// GSS.get().displayError("System error creating folder:" +\r
-// t.getMessage());\r
-// }\r
-// };\r
-// DeferredCommand.addCommand(ep);\r
-\r
+ String prefix = folder.getPrefix();\r
+ String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + "/" + (prefix.length() == 0 ? "" : prefix + "/") + name;\r
+ PutRequest createFolder = new PutRequest(path) {\r
+ @Override\r
+ public void onSuccess(Resource result) {\r
+ app.updateFolder(folder);\r
+ }\r
+\r
+ @Override\r
+ public void onError(Throwable t) {\r
+ GWT.log("", t);\r
+ if (t instanceof RestException) {\r
+ app.displayError("Unable to create folder:" + ((RestException) t).getHttpStatusText());\r
+ }\r
+ else\r
+ app.displayError("System error creating folder:" + t.getMessage());\r
+ }\r
+ };\r
+ createFolder.setHeader("X-Auth-Token", "0000");\r
+ createFolder.setHeader("Accept", "*/*");\r
+ createFolder.setHeader("Content-Length", "0");\r
+ createFolder.setHeader("Content-Type", "application/folder");\r
+ Scheduler.get().scheduleDeferred(createFolder);\r
}\r
\r
/**\r
// json.put("name", new JSONString(folderName.getText()));\r
// //only update the read for all perm if the user is the owner\r
// if (readForAll.getValue() != folder.isReadForAll())\r
-// if (folder.getOwner().equals(GSS.get().getCurrentUserResource().getUsername()))\r
+// if (folder.getOwner().equals(app.getCurrentUserResource().getUsername()))\r
// json.put("readForAll", JSONBoolean.getInstance(readForAll.getValue()));\r
// if (permList.hasChanges()) {\r
// JSONArray perma = new JSONArray();\r
// if(getPostBody() != null && !"".equals(getPostBody().trim())){\r
//\r
//\r
-// FolderResource fres = ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource();\r
+// FolderResource fres = ((RestResourceWrapper) app.getTreeView().getSelection()).getResource();\r
// String initialPath = fres.getUri();\r
// String newPath = getPostBody().trim();\r
// fres.setUri(newPath);\r
-// ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource().setUri(newPath);\r
-// ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).setUri(newPath);\r
-// GSS.get().getTreeView().updateNodeChildren(fres.getParentURI());\r
+// ((RestResourceWrapper) app.getTreeView().getSelection()).getResource().setUri(newPath);\r
+// ((RestResourceWrapper) app.getTreeView().getSelection()).setUri(newPath);\r
+// app.getTreeView().updateNodeChildren(fres.getParentURI());\r
// if (permList.hasChanges()) {\r
-// GSS.get().getTreeView().updateMySharedNode();\r
+// app.getTreeView().updateMySharedNode();\r
// }\r
// /*\r
// if(folderItem.getParentItem() != null && ((DnDTreeItem)folderItem.getParentItem()).getFolderResource() != null){\r
// ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().getSubfolderPaths().add(newPath);\r
// }*/\r
// }\r
-// //GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent());\r
+// //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent());\r
//\r
-// GSS.get().showFileList(true);\r
+// app.get().showFileList(true);\r
// }\r
//\r
// @Override\r
// if(t instanceof RestException){\r
// int statusCode = ((RestException)t).getHttpStatusCode();\r
// if(statusCode == 405)\r
-// GSS.get().displayError("You don't have the necessary permissions or" +\r
+// app.displayError("You don't have the necessary permissions or" +\r
// " a folder with same name already exists");\r
// else if(statusCode == 404)\r
-// GSS.get().displayError("Resource not found, or user specified in sharing does not exist");\r
+// app.displayError("Resource not found, or user specified in sharing does not exist");\r
// else\r
-// GSS.get().displayError("Unable to update folder: "+((RestException)t).getHttpStatusText());\r
+// app.displayError("Unable to update folder: "+((RestException)t).getHttpStatusText());\r
// }\r
// else\r
-// GSS.get().displayError("System error moifying file: "+t.getMessage());\r
+// app.displayError("System error moifying file: "+t.getMessage());\r
// //TODO:CELLTREE\r
-// //GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent());\r
+// //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent());\r
// }\r
// };\r
// DeferredCommand.addCommand(ep);\r
public void selectTab(int _tab) {\r
inner.selectTab(_tab);\r
}\r
-\r
}\r
return account;
}
+ public void updateFolder(Folder f) {
+ folderTreeView.updateFolder(f);
+ }
+
/**
* An aggregate image bundle that pulls together all the images for this
* application into a single bundle.
void displayNewFolderDialog() {
if (folder != null) {
- FolderPropertiesDialog dlg = new FolderPropertiesDialog(true, folder);
+ FolderPropertiesDialog dlg = new FolderPropertiesDialog(GSS.get(), true, folder);
dlg.center();
}
}
public boolean equals(Object other) {
if (other instanceof Folder) {
Folder o = (Folder) other;
- if (container != null)
- return prefix.equals(o.getPrefix()) && container.equals(o.getContainer());
- else
- return o.getContainer() == null && name.equals(o.getName());
+ return (container + prefix).equals(o.getContainer() + o.getPrefix());
}
return false;
}
@Override
public int hashCode() {
- return prefix.hashCode() + name.hashCode();
+ return (container + prefix).hashCode();
}
public Set<File> getFiles() {
public Folder getSelection() {
return model.getSelection();
}
+
+ public void updateFolder(Folder folder) {
+ model.updateFolder(folder);
+ }
}
import gr.grnet.pithos.web.client.foldertree.FolderTreeView.Templates;
import gr.grnet.pithos.web.client.rest.GetRequest;
import gr.grnet.pithos.web.client.rest.RestException;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
public class FolderTreeViewModel implements TreeViewModel {
@Override
public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<Folder> valueUpdater) {
if (event.getType().equals(ContextMenuEvent.getType().getName())) {
- Folder target = (Folder) context.getKey();
- FolderTreeViewModel.this.selectionModel.setSelected(target, true);
- FolderContextMenu menu = new FolderContextMenu(FolderTreeView.images, target);
+ FolderTreeViewModel.this.selectionModel.setSelected(folder, true);
+ FolderContextMenu menu = new FolderContextMenu(FolderTreeView.images, folder);
menu.setPopupPosition(event.getClientX(), event.getClientY());
menu.show();
}
private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
+ private Map<Folder, ListDataProvider<Folder>> dataProviderMap = new HashMap<Folder, ListDataProvider<Folder>>();
+
private SingleSelectionModel<Folder> selectionModel;
public FolderTreeViewModel(SingleSelectionModel<Folder> selectionModel) {
}
else {
final Folder f = (Folder) value;
- final ListDataProvider<Folder> dataProvider = new ListDataProvider<Folder>();
- dataProvider.flush();
- Scheduler.get().scheduleDeferred(new ScheduledCommand() {
- @Override
- public void execute() {
- final GSS app = GSS.get();
- String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
- @Override
- public void onSuccess(Folder result) {
- Iterator<Folder> iter = result.getSubfolders().iterator();
- fetchFolder(iter, dataProvider, result.getSubfolders());
- }
-
- @Override
- public void onError(Throwable t) {
- GWT.log("Error getting folder", t);
- if (t instanceof RestException)
- GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
- else
- GSS.get().displayError("System error fetching folder: " + t.getMessage());
- }
- };
- getFolder.setHeader("X-Auth-Token", app.getToken());
- Scheduler.get().scheduleDeferred(getFolder);
- }
- });
+ if (dataProviderMap.get(f) == null) {
+ dataProviderMap.put(f, new ListDataProvider<Folder>());
+ }
+ final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
+ fetchFolder(f, dataProvider);
return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
}
}
public Folder getSelection() {
return selectionModel.getSelectedObject();
}
+
+ public void updateFolder(Folder folder) {
+ if (dataProviderMap.get(folder) == null) {
+ dataProviderMap.put(folder, new ListDataProvider<Folder>());
+ }
+ final ListDataProvider<Folder> dataProvider = dataProviderMap.get(folder);
+ fetchFolder(folder, dataProvider);
+ }
+
+ public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider) {
+ dataProvider.flush();
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ final GSS app = GSS.get();
+ String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
+ @Override
+ public void onSuccess(Folder result) {
+ Iterator<Folder> iter = result.getSubfolders().iterator();
+ fetchFolder(iter, dataProvider, result.getSubfolders());
+ }
+
+ @Override
+ public void onError(Throwable t) {
+ GWT.log("Error getting folder", t);
+ if (t instanceof RestException)
+ GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
+ else
+ GSS.get().displayError("System error fetching folder: " + t.getMessage());
+ }
+ };
+ getFolder.setHeader("X-Auth-Token", app.getToken());
+ Scheduler.get().scheduleDeferred(getFolder);
+ }
+ });
+ }
}
private int okCode;
- private String username;
-
private T cached;
private T result;
@Override
public void execute() {
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, path);
+ builder.setHeader("If-Modified-Since", "0");
for (String header : headers.keySet()) {
- builder.setHeader("If-Modified-Since", "0");
builder.setHeader(header, headers.get(header));
}
try {
--- /dev/null
+/*
+ * Copyright 2011 GRNET S.A. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and
+ * documentation are those of the authors and should not be
+ * interpreted as representing official policies, either expressed
+ * or implied, of GRNET S.A.
+ */
+
+/*
+ * Copyright 2011 GRNET S.A. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and
+ * documentation are those of the authors and should not be
+ * interpreted as representing official policies, either expressed
+ * or implied, of GRNET S.A.
+ */
+
+package gr.grnet.pithos.web.client.rest;
+
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import gr.grnet.pithos.web.client.foldertree.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class PutRequest implements ScheduledCommand {
+
+ private String path;
+
+ private String username;
+
+ private Map<String, String> headers = new HashMap<String, String>();
+
+ public abstract void onSuccess(Resource result);
+
+ public abstract void onError(Throwable t);
+
+ public PutRequest(String path) {
+ this.path = path;
+ }
+
+ @Override
+ public void execute() {
+ RequestBuilder builder = new RequestBuilder(RequestBuilder.PUT, path);
+ for (String header : headers.keySet()) {
+ builder.setHeader(header, headers.get(header));
+ }
+ try {
+ builder.sendRequest("", new RestRequestCallback(path, Response.SC_CREATED) {
+ @Override
+ public void onSuccess(Resource object) {
+ PutRequest.this.onSuccess(object);
+ }
+
+ @Override
+ public Resource deserialize(Response response) {
+ return Resource.createFromResponse(Resource.class, response, null);
+ }
+
+ @Override
+ public void onError(Request request, Throwable throwable) {
+ PutRequest.this.onError(throwable);
+ }
+ });
+ }
+ catch (RequestException e) {
+ }
+ }
+
+ public void setHeader(String header, String value) {
+ headers.put(header, value);
+ }
+}