385936662711b282c0ba62e38f47a8146dade450
[pithos-web-client] / src / gr / grnet / pithos / web / client / foldertree / File.java
1 /*
2  * Copyright 2011 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35
36 package gr.grnet.pithos.web.client.foldertree;
37
38 import java.util.Date;
39 import java.util.HashMap;
40 import java.util.HashSet;
41 import java.util.Map;
42 import java.util.Set;
43
44 import com.google.gwt.http.client.Header;
45 import com.google.gwt.http.client.Response;
46 import com.google.gwt.http.client.URL;
47 import com.google.gwt.i18n.client.NumberFormat;
48 import com.google.gwt.json.client.JSONObject;
49 import com.google.gwt.json.client.JSONValue;
50
51 public class File extends Resource {
52     private String name;
53
54     private String hash;
55
56     private int version;
57
58     private long bytes;
59
60     private String contentType;
61
62     private Date lastModified;
63
64     private String modifiedBy;
65
66     private Date versionTimestamp;
67
68     private String path;
69
70     private String owner;
71
72     private String container;
73
74     private Folder parent;
75
76     private Map<String, String> meta = new HashMap<String, String>();
77
78     private boolean published;
79
80     private String publicUri;
81
82     private Map<String, Boolean[]> permissions = new HashMap<String, Boolean[]>();
83
84     private String inheritedPermissionsFrom;
85
86     public String getContentType() {
87         return contentType;
88     }
89
90     public String getHash() {
91         return hash;
92     }
93
94     @Override
95         public Date getLastModified() {
96         return lastModified;
97     }
98
99     public String getModifiedBy() {
100         return modifiedBy;
101     }
102
103     public String getName() {
104         return name;
105     }
106
107     public int getVersion() {
108         return version;
109     }
110
111     public Date getVersionTimestamp() {
112         return versionTimestamp;
113     }
114
115     public String getUri() {
116         return "/" + container + "/" + path;
117     }
118
119     public String getOwner() {
120         return owner;
121     }
122
123     public String getPath() {
124         return path;
125     }
126
127     public long getBytes() {
128         return bytes;
129     }
130
131     public String getSizeAsString() {
132         NumberFormat nf = NumberFormat.getFormat("######.#");
133         if (bytes < 1024)
134             return String.valueOf(bytes) + " B";
135         else if (bytes < 1024 * 1024)
136             return nf.format(Double.valueOf(bytes)/(1024)) + " KB";
137         else if (bytes < 1024 * 1024 * 1024)
138             return nf.format(Double.valueOf(bytes)/(1024 * 1024)) + " MB";
139         return nf.format(Double.valueOf(bytes)/(1024 * 1024 * 1024)) + " GB";
140     }
141
142     public boolean isShared() {
143         return !permissions.isEmpty() || published;
144     }
145
146     public void populate(Folder _parent, JSONObject o, String _owner, String _container) {
147         this.parent = _parent;
148         path = unmarshallString(o, "name");
149         if (path.contains("/"))
150             name = path.substring(path.lastIndexOf("/") + 1, path.length()); //strip the prefix
151         else
152             name = path;
153         this.owner = _owner;
154         hash = unmarshallString(o, "hash");
155         bytes = unmarshallLong(o, "bytes");
156         version = unmarshallInt(o, "version");
157         contentType = unmarshallString(o, "content_type");
158         lastModified = unmarshallDate(o, "last_modified");
159         modifiedBy = unmarshallString(o, "modified_by");
160         versionTimestamp = unmarshallDate(o, "version_timestamp");
161         published = o.containsKey("x_object_public") ? true : false;
162         publicUri = unmarshallString(o, "x_object_public");
163         this.container = _container;
164
165         inheritedPermissionsFrom = unmarshallString(o, "x_object_shared_by");
166         String rawPermissions = unmarshallString(o, "x_object_sharing");
167         if (rawPermissions != null)
168             parsePermissions(rawPermissions);
169
170         JSONValue metaValue = o.get("x_object_meta");
171         if (metaValue != null) {
172                 JSONObject metaObj = metaValue.isObject();
173                 if (metaObj != null) {
174                         for (String key: metaObj.keySet()) {
175                     meta.put(key, unmarshallString(metaObj, key));
176                         }
177                 }
178         }
179     }
180
181     private void parsePermissions(String rawPermissions) {
182         String[] readwrite = rawPermissions.split(";");
183         for (String s : readwrite) {
184             String[] part = s.split("=");
185             String perm = part[0].trim();
186             String[] users = part[1].split(",");
187             for (String u : users) {
188                 String user = u.trim();
189                 Boolean[] userPerm = permissions.get(u);
190                 if (userPerm == null) {
191                     userPerm = new Boolean[2];
192                     permissions.put(user, userPerm);
193                 }
194                 if (perm.equals("read")) {
195                     userPerm[0] = Boolean.TRUE;
196                 }
197                 else if (perm.equals("write")) {
198                     userPerm[1] = Boolean.TRUE;
199                 }
200             }
201         }
202     }
203
204     @Override
205         public boolean equals(Object other) {
206         if (other instanceof File) {
207             File o = (File) other;
208             return name.equals(o.getName());
209         }
210         return false;
211     }
212
213     @Override
214         public int hashCode() {
215         return name.hashCode();
216     }
217
218     public String getContainer() {
219         return container;
220     }
221
222     public static File createFromResponse(String owner, Response response, File result) {
223         result.populate(owner, response);
224         return result;
225     }
226
227     private void populate(String _owner, Response response) {
228         this.owner = _owner;
229         for (Header h : response.getHeaders()) {
230             String header = h.getName();
231             if (header.startsWith("X-Object-Meta-"))
232                 meta.put(URL.decodePathSegment(header.substring("X-Object-Meta-".length())), URL.decodePathSegment(h.getValue()));
233             else if (header.equals("X-Object-Sharing")) {
234                 String rawPermissions = h.getValue();
235                 parsePermissions(URL.decodePathSegment(rawPermissions));
236             }
237             else if (header.equals("X-Object-Shared-By")) {
238                 inheritedPermissionsFrom = URL.decodePathSegment(h.getValue());
239             }
240         }
241     }
242
243     public Folder getParent() {
244         return parent;
245     }
246
247     public Map<String, String> getMeta() {
248         return meta;
249     }
250
251     public boolean isPublished() {
252         return published;
253     }
254
255     public String getPublicUri() {
256         return publicUri;
257     }
258
259     public Map<String, Boolean[]> getPermissions() {
260         return permissions;
261     }
262
263     public String getInheritedPermissionsFrom() {
264         return inheritedPermissionsFrom;
265     }
266 }