public void setFiles(final List<File> _files) {
files = new ArrayList<File>();
for (File fres : _files)
- if (!fres.isInTrash())
- files.add(fres);
+ files.add(fres);
Collections.sort(files, new Comparator<File>() {
@Override
protected File getFileForName(String name){
for (File f : folder.getFiles())
- if (!f.isInTrash() && f.getName().equals(name))
+ if (f.getName().equals(name))
return f;
return null;
}
public class Pithos implements EntryPoint, ResizeHandler {
public static final String HOME_CONTAINER = "pithos";
+
+ public static final String TRASH_CONTAINER = "trash";
/**
* Instantiate an application-level image bundle. This object will provide
@Override
public void onSuccess(AccountResource _result) {
account = _result;
- if (account.getContainers().isEmpty())
- createHomeContainers();
+ if (!account.hasHomeContainer())
+ createHomeContainer(account);
+ else if (!account.hasTrashContainer())
+ createTrashContainer();
else {
folderTreeViewModel.initialize(account);
}
Scheduler.get().scheduleDeferred(getAccount);
}
- protected void createHomeContainers() {
- String path = "/pithos";
+ protected void createHomeContainer(final AccountResource account) {
+ String path = "/" + Pithos.HOME_CONTAINER;
PutRequest createPithos = new PutRequest(getApiPath(), getUsername(), path) {
@Override
public void onSuccess(@SuppressWarnings("unused") Resource result) {
- fetchAccount();
+ if (!account.hasTrashContainer())
+ createTrashContainer();
+ else
+ fetchAccount();
}
@Override
Scheduler.get().scheduleDeferred(createPithos);
}
- /**
+ protected void createTrashContainer() {
+ String path = "/" + Pithos.TRASH_CONTAINER;
+ PutRequest createPithos = new PutRequest(getApiPath(), getUsername(), path) {
+ @Override
+ public void onSuccess(@SuppressWarnings("unused") Resource result) {
+ fetchAccount();
+ }
+
+ @Override
+ public void onError(Throwable t) {
+ GWT.log("Error creating pithos", t);
+ if (t instanceof RestException)
+ displayError("Error creating pithos: " + ((RestException) t).getHttpStatusText());
+ else
+ displayError("System error Error creating pithos: " + t.getMessage());
+ }
+ };
+ createPithos.setHeader("X-Auth-Token", getToken());
+ Scheduler.get().scheduleDeferred(createPithos);
+ }
+
+ /**
* Creates an HTML fragment that places an image & caption together, for use
* in a group header.
*
public void onError(Throwable t) {
GWT.log("", t);
if (t instanceof RestException) {
- displayError("Unable to delete folder: "+((RestException) t).getHttpStatusText());
+ if (((RestException) t).getHttpStatusCode() != Response.SC_NOT_FOUND)
+ displayError("Unable to delete folder: "+((RestException) t).getHttpStatusText());
+ else
+ onSuccess(null);
}
else
displayError("System error unable to delete folder: " + t.getMessage());
import gr.grnet.pithos.web.client.foldertree.Folder;
import gr.grnet.pithos.web.client.foldertree.Resource;
import gr.grnet.pithos.web.client.rest.PostRequest;
+import gr.grnet.pithos.web.client.rest.PutRequest;
import gr.grnet.pithos.web.client.rest.RestException;
import java.util.Iterator;
}
private void trashFolder(final Folder f, final Command callback) {
- String path = f.getUri() + "?update=";
- PostRequest trashFolder = new PostRequest(app.getApiPath(), app.getUsername(), path) {
+ String path = "/" + Pithos.TRASH_CONTAINER + "/" + f.getPrefix() + "/" + f.getName();
+ PutRequest createFolder = new PutRequest(app.getApiPath(), app.getUsername(), path) {
@Override
public void onSuccess(@SuppressWarnings("unused") Resource result) {
Iterator<File> iter = f.getFiles().iterator();
@Override
public void execute() {
Iterator<Folder> iterf = f.getSubfolders().iterator();
- trashSubfolders(iterf, new Command() {
- @Override
- public void execute() {
- callback.execute();
- }
- });
+ trashSubfolders(iterf, callback);
}
});
}
app.displayError("System error creating folder:" + t.getMessage());
}
};
- trashFolder.setHeader("X-Auth-Token", app.getToken());
- trashFolder.setHeader("X-Object-Meta-Trash", "true");
- Scheduler.get().scheduleDeferred(trashFolder);
+ createFolder.setHeader("X-Auth-Token", app.getToken());
+ createFolder.setHeader("Accept", "*/*");
+ createFolder.setHeader("Content-Length", "0");
+ createFolder.setHeader("Content-Type", "application/folder");
+ Scheduler.get().scheduleDeferred(createFolder);
}
protected void trashFiles(final Iterator<File> iter, final Command callback) {
if (iter.hasNext()) {
File file = iter.next();
- String path = file.getUri() + "?update=";
- PostRequest trashFile = new PostRequest(app.getApiPath(), app.getUsername(), path) {
+ String path = "/" + Pithos.TRASH_CONTAINER + "/" + file.getPath();
+ PutRequest trashFile = new PutRequest(app.getApiPath(), app.getUsername(), path) {
@Override
public void onSuccess(@SuppressWarnings("unused") Resource result) {
trashFiles(iter, callback);
}
};
trashFile.setHeader("X-Auth-Token", app.getToken());
- trashFile.setHeader("X-Object-Meta-Trash", "true");
+ trashFile.setHeader("X-Move-From", file.getUri());
Scheduler.get().scheduleDeferred(trashFile);
}
- else if (callback != null) {
+ else if (callback != null) {
callback.execute();
}
}
package gr.grnet.pithos.web.client.foldertree;
+import gr.grnet.pithos.web.client.Pithos;
+
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public List<Group> getGroups() {
return groups;
}
+
+ public boolean hasHomeContainer() {
+ for (Folder f : containers)
+ if (f.getName().equals(Pithos.HOME_CONTAINER))
+ return true;
+ return false;
+ }
+
+ public boolean hasTrashContainer() {
+ for (Folder f : containers)
+ if (f.getName().equals(Pithos.TRASH_CONTAINER))
+ return true;
+ return false;
+ }
}
import com.google.gwt.http.client.Response;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.json.client.JSONObject;
+
+import gr.grnet.pithos.web.client.Pithos;
+
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
private String owner;
- private boolean inTrash;
-
private String container;
private Folder parent;
return !permissions.isEmpty();
}
- public boolean isInTrash() {
- return inTrash;
- }
-
public void populate(Folder _parent, JSONObject o, String _owner, String _container) {
this.parent = _parent;
path = unmarshallString(o, "name");
parsePermissions(rawPermissions);
for (String key : o.keySet())
- if (key.startsWith("x_object_meta_") && !key.equals("x_object_meta_trash"))
+ if (key.startsWith("x_object_meta_"))
tags.add(key.substring("x_object_meta_".length()).trim().toLowerCase());
this.owner = _owner;
for (Header h : response.getHeaders()) {
String header = h.getName();
- if (header.startsWith("X-Object-Meta-") && !header.equals("X-Object-Meta-Trash"))
+ if (header.startsWith("X-Object-Meta-"))
tags.add(header.substring("X-Object-Meta-".length()).trim().toLowerCase());
else if (header.equals("X-Object-Sharing")) {
String rawPermissions = h.getValue();
inheritedPermissionsFrom = h.getValue().trim();
}
}
- String header = response.getHeader("X-Object-Meta-Trash");
- if (header != null)
- inTrash = Boolean.valueOf(header);
- else
- inTrash = false;
}
public Folder getParent() {
package gr.grnet.pithos.web.client.foldertree;
+import gr.grnet.pithos.web.client.Pithos;
+
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
private Set<File> files = new LinkedHashSet<File>();
- private boolean inTrash = false;
-
- /*
- * Flag that indicates that this folder is the Trash
- */
- private boolean trash = false;
-
private Set<String> tags = new LinkedHashSet<String>();
private String owner;
if (header != null)
bytesUsed = Long.valueOf(header);
- header = response.getHeader("X-Object-Meta-Trash");
- if (header != null && header.equals("true"))
- inTrash = true;
-
header = response.getHeader("X-Container-Object-Meta");
if (header != null && header.length() > 0) {
for (String t : header.split(",")) {
f.populate(this, o, _owner, container);
subfolders.add(f);
}
- else if (!(o.containsKey("x_object_meta_trash") && o.get("x_object_meta_trash").isString().stringValue().equals("true"))) {
+ else {
File file = new File();
file.populate(this, o, _owner, container);
files.add(file);
}
}
}
- //This step is necessary to remove the trashed folders. Trashed folders are added initially because we need to
- //avoid having in the list the virtual folders of the form {"subdir":"folder1"} which have no indication of thrash
- Iterator<Folder> iter = subfolders.iterator();
- while (iter.hasNext()) {
- Folder f = iter.next();
- if (f.isInTrash())
- iter.remove();
- }
}
}
prefix = "";
}
this.owner = _owner;
- if (o.containsKey("x_object_meta_trash") && o.get("x_object_meta_trash").isString().stringValue().equals("true"))
- inTrash = true;
inheritedPermissionsFrom = unmarshallString(o, "x_object_shared_by");
String rawPermissions = unmarshallString(o, "x_object_sharing");
return "/" + container + (prefix.length() == 0 ? "" : "/" + prefix);
}
- public boolean isInTrash() {
- return inTrash;
- }
-
public boolean isContainer() {
return parent == null;
}
- public boolean isTrash() {
- return trash;
- }
-
- public void setTrash(boolean trash) {
- this.trash = trash;
- }
-
public void setContainer(String container) {
this.container = container;
}
public boolean isShared() {
return !permissions.isEmpty();
}
+
+ public boolean isTrash() {
+ return isContainer() && name.equals(Pithos.TRASH_CONTAINER);
+ }
+
+ public boolean isHome() {
+ return isContainer() && name.equals(Pithos.HOME_CONTAINER);
+ }
}
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.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
@Override
public void render(@SuppressWarnings("unused") Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
String html;
- if (folder.isTrash())
- html = AbstractImagePrototype.create(FolderTreeView.images.trash()).getHTML();
- else
- html = AbstractImagePrototype.create(FolderTreeView.images.folderYellow()).getHTML();
+ SafeHtml name;
+ if (folder.isHome()) {
+ html = AbstractImagePrototype.create(FolderTreeView.images.home()).getHTML();
+ name = Templates.INSTANCE.nameSpan("Home");
+ }
+ else if (folder.isTrash()) {
+ html = AbstractImagePrototype.create(FolderTreeView.images.trash()).getHTML();
+ name = Templates.INSTANCE.nameSpan("Trash");
+ }
+ else {
+ html = AbstractImagePrototype.create(FolderTreeView.images.folderYellow()).getHTML();
+ name = Templates.INSTANCE.nameSpan(folder.getName());
+ }
safeHtmlBuilder.appendHtmlConstant(html);
- safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName()));
+ safeHtmlBuilder.append(name);
}
@Override
rootDataProvider.getList().clear();
rootDataProvider.getList().addAll(account.getContainers());
selectionModel.setSelected(rootDataProvider.getList().get(0), true);
- Folder f = new Folder("Trash");
- f.setTrash(true);
- f.setContainer("trash");
- rootDataProvider.getList().add(f);
- app.updateTags();
}
});
}
@Source("gr/grnet/pithos/resources/folder_user.png")
ImageResource sharedFolder();
-
- @Source("gr/grnet/pithos/resources/trash.png")
- ImageResource trash();
}
static Images images = GWT.create(Images.class);
@Source("gr/grnet/pithos/resources/folder_user.png")
ImageResource sharedFolder();
- @Source("gr/grnet/pithos/resources/trash.png")
- ImageResource trash();
-
@Source("gr/grnet/pithos/resources/edit_user.png")
ImageResource user();
}
// if (header != null)
// bytesUsed = Long.valueOf(header);
//
-// header = response.getHeader("X-Object-Meta-Trash");
-// if (header != null && header.equals("true"))
-// inTrash = true;
-//
// subfolders.clear(); //This is necessary in case we update a pre-existing Tag so that stale subfolders won't show up
// files.clear();
// JSONValue json = JSONParser.parseStrict(response.getText());
// f.populate(this, o, container);
// subfolders.add(f);
// }
-// else if (!(o.containsKey("x_object_meta_trash") && o.get("x_object_meta_trash").isString().stringValue().equals("true"))) {
+// else {
// File file = new File();
// file.populate(this, o, container);
// files.add(file);
// }
// }
// }
-// //This step is necessary to remove the trashed folders. Trashed folders are added initially because we need to
-// //avoid having in the list the virtual folders of the form {"subdir":"folder1"} which have no indication of thrash
-// Iterator<Tag> iter = subfolders.iterator();
-// while (iter.hasNext()) {
-// Tag f = iter.next();
-// if (f.isInTrash())
-// iter.remove();
-// }
// }
// }
//
// container = name;
// prefix = "";
// }
-// if (o.containsKey("x_object_meta_trash") && o.get("x_object_meta_trash").isString().stringValue().equals("true"))
-// inTrash = true;
// }
//
// public static Tag createFromResponse(Response response, Tag result) {