X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/7c818c14d7a7ecd4d04ff484098304ec60063d23..bac098d0411b73027dae4a52ef823ef527fe2a2f:/src/gr/grnet/pithos/web/client/foldertree/Folder.java diff --git a/src/gr/grnet/pithos/web/client/foldertree/Folder.java b/src/gr/grnet/pithos/web/client/foldertree/Folder.java index 73224e2..81bb4b7 100644 --- a/src/gr/grnet/pithos/web/client/foldertree/Folder.java +++ b/src/gr/grnet/pithos/web/client/foldertree/Folder.java @@ -1,9 +1,48 @@ /* - * Copyright (c) 2011 Greek Research and Technology Network + * 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.foldertree; +import gr.grnet.pithos.web.client.Pithos; + +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + import com.google.gwt.http.client.Response; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; @@ -11,9 +50,6 @@ 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; -import java.util.Date; -import java.util.LinkedHashSet; -import java.util.Set; public class Folder extends Resource { /* @@ -26,6 +62,8 @@ public class Folder extends Resource { private long bytesUsed = 0; + private Folder parent = null; + private Set subfolders = new LinkedHashSet(); /* * The name of the container that this folder belongs to. If this folder is container, this field equals name @@ -38,6 +76,16 @@ public class Folder extends Resource { */ private String prefix = ""; + private Set files = new LinkedHashSet(); + + private Set tags = new LinkedHashSet(); + + private String owner; + + private Map permissions = new HashMap(); + + private String inheritedPermissionsFrom; + public Folder() {}; public Folder(String name) { @@ -48,7 +96,8 @@ public class Folder extends Resource { return name; } - public Date getLastModified() { + @Override + public Date getLastModified() { return lastModified; } @@ -80,7 +129,31 @@ public class Folder extends Resource { this.prefix = prefix; } - public void populate(Response response) { + private void parsePermissions(String rawPermissions) { + String[] readwrite = rawPermissions.split(";"); + for (String s : readwrite) { + String[] part = s.split("="); + String perm = part[0].trim(); + String[] users = part[1].split(","); + for (String u : users) { + String user = u.trim(); + Boolean[] userPerm = permissions.get(u); + if (userPerm == null) { + userPerm = new Boolean[2]; + permissions.put(user, userPerm); + } + if (perm.equals("read")) { + userPerm[0] = Boolean.TRUE; + } + else if (perm.equals("write")) { + userPerm[1] = Boolean.TRUE; + } + } + } + } + + public void populate(String _owner, Response response) { + this.owner = _owner; String header = response.getHeader("Last-Modified"); if (header != null) lastModified = DateTimeFormat.getFormat(PredefinedFormat.RFC_2822).parse(header); @@ -89,6 +162,15 @@ public class Folder extends Resource { if (header != null) bytesUsed = Long.valueOf(header); + header = response.getHeader("X-Container-Object-Meta"); + if (header != null && header.length() > 0) { + for (String t : header.split(",")) { + tags.add(t.toLowerCase().trim()); + } + } + + subfolders.clear(); //This is necessary in case we update a pre-existing Folder so that stale subfolders won't show up + files.clear(); JSONValue json = JSONParser.parseStrict(response.getText()); JSONArray array = json.isArray(); if (array != null) { @@ -96,20 +178,23 @@ public class Folder extends Resource { JSONObject o = array.get(i).isObject(); if (o != null) { String contentType = unmarshallString(o, "content_type"); - if (o.containsKey("subdir") || (contentType != null && contentType.startsWith("application/directory"))) { + if (o.containsKey("subdir") || (contentType != null && (contentType.startsWith("application/directory") || contentType.startsWith("application/folder")))) { Folder f = new Folder(); - f.populate(o, container); + f.populate(this, o, _owner, container); subfolders.add(f); } else { - // add file + File file = new File(); + file.populate(this, o, _owner, container); + files.add(file); } } } } } - public void populate(JSONObject o, String aContainer) { + public void populate(Folder _parent, JSONObject o, String _owner, String aContainer) { + this.parent = _parent; String path = null; if (o.containsKey("subdir")) { path = unmarshallString(o, "subdir"); @@ -132,21 +217,22 @@ public class Folder extends Resource { container = name; prefix = ""; } - } + this.owner = _owner; - @Override - public String getLastModifiedSince() { - return null; //To change body of implemented methods use File | Settings | File Templates. + inheritedPermissionsFrom = unmarshallString(o, "x_object_shared_by"); + String rawPermissions = unmarshallString(o, "x_object_sharing"); + if (rawPermissions != null) + parsePermissions(rawPermissions); } - public static Folder createFromResponse(Response response, Folder result) { + public static Folder createFromResponse(String owner, Response response, Folder result) { Folder f = null; if (result == null) f = new Folder(); else f = result; - f.populate(response); + f.populate(owner, response); return f; } @@ -154,16 +240,93 @@ public class Folder extends Resource { 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 getUri().equals(o.getUri()); } return false; } @Override public int hashCode() { - return prefix.hashCode() + name.hashCode(); + return getUri().hashCode(); } + + public Set getFiles() { + return files; + } + + public Folder getParent() { + return parent; + } + + public String getUri() { + return "/" + container + (prefix.length() == 0 ? "" : "/" + prefix); + } + + public boolean isContainer() { + return parent == null; + } + + public void setContainer(String container) { + this.container = container; + } + + public Set getTags() { + return tags; + } + + public String getInheritedPermissionsFrom() { + return inheritedPermissionsFrom; + } + + public Map getPermissions() { + return permissions; + } + + public String getOwner() { + return owner; + } + + public boolean existChildrenPermissions() { + for (File f : files) + if (!f.getPermissions().isEmpty() && f.getInheritedPermissionsFrom() == null) + return true; + + for (Folder fo : subfolders) + if ((!fo.getPermissions().isEmpty() && fo.getInheritedPermissionsFrom() == null) || fo.existChildrenPermissions()) + return true; + return false; + } + + public boolean isShared() { + return !permissions.isEmpty(); + } + + /** + * I am THE trash + * + * @return + */ + public boolean isTrash() { + return isContainer() && name.equals(Pithos.TRASH_CONTAINER); + } + + /** + * I am IN THE trash + * + * @return + */ + public boolean isInTrash() { + return container.equals(Pithos.TRASH_CONTAINER); + } + + public boolean isHome() { + return isContainer() && name.equals(Pithos.HOME_CONTAINER); + } + + public boolean contains(Folder folder) { + for (Folder f : subfolders) + if (f.equals(folder) || f.contains(folder)) + return true; + return false; + } }