root / trunk / Pithos.Interfaces / ObjectInfo.cs @ 5e31048f
History | View | Annotate | Download (8.1 kB)
1 | 3c43ec9b | Panagiotis Kanavos | using System; |
---|---|---|---|
2 | 3c43ec9b | Panagiotis Kanavos | using System.Collections.Generic; |
3 | cfed7823 | Panagiotis Kanavos | using System.Diagnostics.Contracts; |
4 | 9aa8abad | Panagiotis Kanavos | using System.Dynamic; |
5 | 9c4346c9 | Panagiotis Kanavos | using System.Globalization; |
6 | 3c43ec9b | Panagiotis Kanavos | using System.IO; |
7 | aba9e6d9 | Panagiotis Kanavos | using System.Linq; |
8 | aba9e6d9 | Panagiotis Kanavos | using System.Text; |
9 | 9aa8abad | Panagiotis Kanavos | using Newtonsoft.Json; |
10 | 3c43ec9b | Panagiotis Kanavos | |
11 | 3c43ec9b | Panagiotis Kanavos | namespace Pithos.Interfaces |
12 | 3c43ec9b | Panagiotis Kanavos | { |
13 | 9aa8abad | Panagiotis Kanavos | public class ObjectInfo:DynamicObject |
14 | 3c43ec9b | Panagiotis Kanavos | { |
15 | 9aa8abad | Panagiotis Kanavos | private readonly List<string> _knownContainers= new List<string>{"trash"}; |
16 | 3c43ec9b | Panagiotis Kanavos | public string Name { get; set; } |
17 | 06f11e8b | Panagiotis Kanavos | |
18 | 06f11e8b | Panagiotis Kanavos | |
19 | 3c43ec9b | Panagiotis Kanavos | public string Hash { get; set; } |
20 | 06f11e8b | Panagiotis Kanavos | |
21 | 06f11e8b | Panagiotis Kanavos | public string X_Object_Hash { get { return Hash; } set { Hash = value; } } |
22 | 06f11e8b | Panagiotis Kanavos | |
23 | 06f11e8b | Panagiotis Kanavos | [JsonProperty("x_object_uuid")] |
24 | 06f11e8b | Panagiotis Kanavos | public string UUID { get; set; } |
25 | 06f11e8b | Panagiotis Kanavos | |
26 | 3c43ec9b | Panagiotis Kanavos | public long Bytes { get; set; } |
27 | 3c43ec9b | Panagiotis Kanavos | public string Content_Type { get; set; } |
28 | 3c43ec9b | Panagiotis Kanavos | public DateTime Last_Modified { get; set; } |
29 | 3c43ec9b | Panagiotis Kanavos | |
30 | 3c43ec9b | Panagiotis Kanavos | private Dictionary<string, string> _tags=new Dictionary<string, string>(); |
31 | 3c43ec9b | Panagiotis Kanavos | public Dictionary<string, string> Tags |
32 | 3c43ec9b | Panagiotis Kanavos | { |
33 | 3c43ec9b | Panagiotis Kanavos | get { return _tags; } |
34 | 3c43ec9b | Panagiotis Kanavos | set { _tags = value; } |
35 | 3c43ec9b | Panagiotis Kanavos | } |
36 | 3c43ec9b | Panagiotis Kanavos | |
37 | 3c43ec9b | Panagiotis Kanavos | private Dictionary<string, string> _extensions=new Dictionary<string, string>(); |
38 | 3c43ec9b | Panagiotis Kanavos | public Dictionary<string, string> Extensions |
39 | 3c43ec9b | Panagiotis Kanavos | { |
40 | 3c43ec9b | Panagiotis Kanavos | get { return _extensions; } |
41 | 9c4346c9 | Panagiotis Kanavos | set |
42 | 9c4346c9 | Panagiotis Kanavos | { |
43 | 9c4346c9 | Panagiotis Kanavos | _extensions = value; |
44 | 9c4346c9 | Panagiotis Kanavos | ExtractKnownExtensions(); |
45 | 9c4346c9 | Panagiotis Kanavos | } |
46 | 3c43ec9b | Panagiotis Kanavos | } |
47 | bfc13ed8 | Panagiotis Kanavos | |
48 | 9aa8abad | Panagiotis Kanavos | |
49 | 9aa8abad | Panagiotis Kanavos | private Dictionary<string, string> _permissions=new Dictionary<string, string>(); |
50 | 9aa8abad | Panagiotis Kanavos | [JsonProperty("x_object_sharing")] |
51 | 9aa8abad | Panagiotis Kanavos | [JsonConverter(typeof(PermissionConverter))] |
52 | 9aa8abad | Panagiotis Kanavos | public Dictionary<string, string> Permissions |
53 | bfc13ed8 | Panagiotis Kanavos | { |
54 | 9aa8abad | Panagiotis Kanavos | get { return _permissions; } |
55 | 9aa8abad | Panagiotis Kanavos | set |
56 | 9aa8abad | Panagiotis Kanavos | { |
57 | 9aa8abad | Panagiotis Kanavos | _permissions = value; |
58 | 9aa8abad | Panagiotis Kanavos | } |
59 | bfc13ed8 | Panagiotis Kanavos | } |
60 | cfed7823 | Panagiotis Kanavos | |
61 | 9aa8abad | Panagiotis Kanavos | /// <summary> |
62 | 9aa8abad | Panagiotis Kanavos | /// Version number |
63 | 9aa8abad | Panagiotis Kanavos | /// </summary> |
64 | 9aa8abad | Panagiotis Kanavos | [JsonProperty("x_object_version")] |
65 | 9aa8abad | Panagiotis Kanavos | public long? Version { get; set; } |
66 | cfed7823 | Panagiotis Kanavos | |
67 | cfed7823 | Panagiotis Kanavos | |
68 | 9aa8abad | Panagiotis Kanavos | /// <summary> |
69 | 9aa8abad | Panagiotis Kanavos | /// Shared object permissions can be Read or Write |
70 | 9aa8abad | Panagiotis Kanavos | /// </summary> |
71 | 9aa8abad | Panagiotis Kanavos | [JsonProperty("x_object_allowed_to")] |
72 | 9aa8abad | Panagiotis Kanavos | public string AllowedTo { get; set; } |
73 | cfed7823 | Panagiotis Kanavos | |
74 | bfc13ed8 | Panagiotis Kanavos | |
75 | 9aa8abad | Panagiotis Kanavos | /// <summary> |
76 | 9aa8abad | Panagiotis Kanavos | /// Version timestamp |
77 | 9aa8abad | Panagiotis Kanavos | /// </summary> |
78 | 9aa8abad | Panagiotis Kanavos | [JsonProperty("X_Object_Version_Timestamp"), JsonConverter(typeof(PithosDateTimeConverter))] |
79 | 9aa8abad | Panagiotis Kanavos | public DateTime? VersionTimestamp { get; set; } |
80 | bfc13ed8 | Panagiotis Kanavos | |
81 | 9aa8abad | Panagiotis Kanavos | [JsonProperty("X_Object_Modified_By")] |
82 | 9aa8abad | Panagiotis Kanavos | public string ModifiedBy { get; set; } |
83 | bfc13ed8 | Panagiotis Kanavos | |
84 | 3c43ec9b | Panagiotis Kanavos | |
85 | 3c43ec9b | Panagiotis Kanavos | public Stream Stream { get; set; } |
86 | 3c43ec9b | Panagiotis Kanavos | |
87 | cfed7823 | Panagiotis Kanavos | public string Account { get; set; } |
88 | cfed7823 | Panagiotis Kanavos | |
89 | cfed7823 | Panagiotis Kanavos | public string Container { get; set; } |
90 | cfed7823 | Panagiotis Kanavos | |
91 | aba9e6d9 | Panagiotis Kanavos | public string ContendDisposition { get; set; } |
92 | aba9e6d9 | Panagiotis Kanavos | |
93 | aba9e6d9 | Panagiotis Kanavos | public string ContentEncoding { get; set; } |
94 | aba9e6d9 | Panagiotis Kanavos | |
95 | aba9e6d9 | Panagiotis Kanavos | public string Manifest { get; set; } |
96 | 06f11e8b | Panagiotis Kanavos | |
97 | aba9e6d9 | Panagiotis Kanavos | public bool IsPublic |
98 | aba9e6d9 | Panagiotis Kanavos | { |
99 | aba9e6d9 | Panagiotis Kanavos | get { return !String.IsNullOrWhiteSpace(PublicUrl); } |
100 | aba9e6d9 | Panagiotis Kanavos | set |
101 | aba9e6d9 | Panagiotis Kanavos | { |
102 | aba9e6d9 | Panagiotis Kanavos | if (!value) |
103 | f0947233 | Panagiotis Kanavos | PublicUrl = null; |
104 | aba9e6d9 | Panagiotis Kanavos | else if (String.IsNullOrWhiteSpace(PublicUrl)) |
105 | aba9e6d9 | Panagiotis Kanavos | PublicUrl="true"; |
106 | aba9e6d9 | Panagiotis Kanavos | } |
107 | aba9e6d9 | Panagiotis Kanavos | } |
108 | aba9e6d9 | Panagiotis Kanavos | |
109 | 06f11e8b | Panagiotis Kanavos | [JsonProperty("X_Object_Public")] |
110 | aba9e6d9 | Panagiotis Kanavos | public string PublicUrl { get; set; } |
111 | aba9e6d9 | Panagiotis Kanavos | |
112 | 27361404 | Panagiotis Kanavos | public ObjectInfo() |
113 | 27361404 | Panagiotis Kanavos | {} |
114 | 27361404 | Panagiotis Kanavos | |
115 | 27361404 | Panagiotis Kanavos | public ObjectInfo(string accountPath,string accountName,FileInfo fileInfo) |
116 | 27361404 | Panagiotis Kanavos | { |
117 | 5e31048f | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(accountPath)) |
118 | 5e31048f | Panagiotis Kanavos | throw new ArgumentNullException("accountPath"); |
119 | 5e31048f | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(accountName)) |
120 | 5e31048f | Panagiotis Kanavos | throw new ArgumentNullException("accountName"); |
121 | 5e31048f | Panagiotis Kanavos | if (fileInfo == null) |
122 | 5e31048f | Panagiotis Kanavos | throw new ArgumentNullException("fileInfo"); |
123 | 5e31048f | Panagiotis Kanavos | Contract.EndContractBlock(); |
124 | 5e31048f | Panagiotis Kanavos | |
125 | 27361404 | Panagiotis Kanavos | var relativeUrl = fileInfo.AsRelativeUrlTo(accountPath); |
126 | 27361404 | Panagiotis Kanavos | //The first part of the URL is the container |
127 | 27361404 | Panagiotis Kanavos | var slashIndex = relativeUrl.IndexOf('/'); |
128 | 27361404 | Panagiotis Kanavos | var container = relativeUrl.Substring(0, slashIndex); |
129 | 27361404 | Panagiotis Kanavos | //The second is the file's url relative to the container |
130 | 27361404 | Panagiotis Kanavos | var fileUrl = relativeUrl.Substring(slashIndex + 1); |
131 | 27361404 | Panagiotis Kanavos | |
132 | 27361404 | Panagiotis Kanavos | Account = accountName; |
133 | 27361404 | Panagiotis Kanavos | Container = container; |
134 | 27361404 | Panagiotis Kanavos | Name = fileUrl; |
135 | 27361404 | Panagiotis Kanavos | } |
136 | 27361404 | Panagiotis Kanavos | |
137 | 9c4346c9 | Panagiotis Kanavos | |
138 | 9c4346c9 | Panagiotis Kanavos | private void ExtractKnownExtensions() |
139 | 9c4346c9 | Panagiotis Kanavos | { |
140 | bfc13ed8 | Panagiotis Kanavos | Version=GetLong(KnownExtensions.X_Object_Version); |
141 | bfc13ed8 | Panagiotis Kanavos | VersionTimestamp = GetTimestamp(KnownExtensions.X_Object_Version_Timestamp); |
142 | bfc13ed8 | Panagiotis Kanavos | ModifiedBy = GetString(KnownExtensions.X_Object_Modified_By); |
143 | bfc13ed8 | Panagiotis Kanavos | } |
144 | bfc13ed8 | Panagiotis Kanavos | |
145 | bfc13ed8 | Panagiotis Kanavos | private string GetString(string name) |
146 | bfc13ed8 | Panagiotis Kanavos | { |
147 | 3ddbb7b8 | Panagiotis Kanavos | string value; |
148 | bfc13ed8 | Panagiotis Kanavos | _extensions.TryGetValue(name, out value); |
149 | bfc13ed8 | Panagiotis Kanavos | return value ; |
150 | 9c4346c9 | Panagiotis Kanavos | } |
151 | 9c4346c9 | Panagiotis Kanavos | |
152 | 9c4346c9 | Panagiotis Kanavos | private long? GetLong(string name) |
153 | 9c4346c9 | Panagiotis Kanavos | { |
154 | 9c4346c9 | Panagiotis Kanavos | string version; |
155 | 9c4346c9 | Panagiotis Kanavos | long value; |
156 | bfc13ed8 | Panagiotis Kanavos | return _extensions.TryGetValue(name, out version) && long.TryParse(version, out value) |
157 | bfc13ed8 | Panagiotis Kanavos | ? (long?) value |
158 | bfc13ed8 | Panagiotis Kanavos | : null; |
159 | 9c4346c9 | Panagiotis Kanavos | } |
160 | 9c4346c9 | Panagiotis Kanavos | |
161 | 9c4346c9 | Panagiotis Kanavos | private DateTime? GetTimestamp(string name) |
162 | 9c4346c9 | Panagiotis Kanavos | { |
163 | 9c4346c9 | Panagiotis Kanavos | string version; |
164 | 9c4346c9 | Panagiotis Kanavos | DateTime value; |
165 | 9c4346c9 | Panagiotis Kanavos | if (_extensions.TryGetValue(name, out version) && |
166 | 9c4346c9 | Panagiotis Kanavos | DateTime.TryParse(version,CultureInfo.InvariantCulture,DateTimeStyles.AdjustToUniversal, out value)) |
167 | 9c4346c9 | Panagiotis Kanavos | { |
168 | 9c4346c9 | Panagiotis Kanavos | return value; |
169 | 9c4346c9 | Panagiotis Kanavos | } |
170 | 9c4346c9 | Panagiotis Kanavos | return null; |
171 | 9c4346c9 | Panagiotis Kanavos | } |
172 | 9c4346c9 | Panagiotis Kanavos | |
173 | 9c4346c9 | Panagiotis Kanavos | |
174 | 9c4346c9 | Panagiotis Kanavos | public static ObjectInfo Empty = new ObjectInfo |
175 | 9c4346c9 | Panagiotis Kanavos | { |
176 | 9c4346c9 | Panagiotis Kanavos | Name = String.Empty, |
177 | 9c4346c9 | Panagiotis Kanavos | Hash = String.Empty, |
178 | 9c4346c9 | Panagiotis Kanavos | Bytes = 0, |
179 | 9c4346c9 | Panagiotis Kanavos | Content_Type = String.Empty, |
180 | 9c4346c9 | Panagiotis Kanavos | Last_Modified = DateTime.MinValue |
181 | 9c4346c9 | Panagiotis Kanavos | }; |
182 | bfc13ed8 | Panagiotis Kanavos | |
183 | cfed7823 | Panagiotis Kanavos | public string RelativeUrlToFilePath(string currentAccount) |
184 | cfed7823 | Panagiotis Kanavos | { |
185 | 9aa8abad | Panagiotis Kanavos | if (Name==null) |
186 | cfed7823 | Panagiotis Kanavos | throw new InvalidOperationException("Name can't be null"); |
187 | cfed7823 | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(currentAccount)) |
188 | cfed7823 | Panagiotis Kanavos | throw new ArgumentNullException("currentAccount"); |
189 | cfed7823 | Panagiotis Kanavos | Contract.EndContractBlock(); |
190 | cfed7823 | Panagiotis Kanavos | |
191 | cfed7823 | Panagiotis Kanavos | if (this == Empty) |
192 | cfed7823 | Panagiotis Kanavos | return String.Empty; |
193 | cfed7823 | Panagiotis Kanavos | |
194 | 9aa8abad | Panagiotis Kanavos | var unescaped = Uri.UnescapeDataString(Name); |
195 | cfed7823 | Panagiotis Kanavos | var path = unescaped.Replace("/", "\\"); |
196 | cfed7823 | Panagiotis Kanavos | var pathParts=new Stack<string>(); |
197 | cfed7823 | Panagiotis Kanavos | pathParts.Push(path); |
198 | cfed7823 | Panagiotis Kanavos | if (!String.IsNullOrWhiteSpace(Container) && !_knownContainers.Contains(Container)) |
199 | cfed7823 | Panagiotis Kanavos | pathParts.Push(Container); |
200 | cfed7823 | Panagiotis Kanavos | if (!currentAccount.Equals(Account, StringComparison.InvariantCultureIgnoreCase)) |
201 | cfed7823 | Panagiotis Kanavos | { |
202 | cfed7823 | Panagiotis Kanavos | if (Account != null) |
203 | cfed7823 | Panagiotis Kanavos | { |
204 | cfed7823 | Panagiotis Kanavos | pathParts.Push(Account); |
205 | cfed7823 | Panagiotis Kanavos | pathParts.Push("others"); |
206 | cfed7823 | Panagiotis Kanavos | } |
207 | cfed7823 | Panagiotis Kanavos | } |
208 | cfed7823 | Panagiotis Kanavos | var finalPath=Path.Combine(pathParts.ToArray()); |
209 | cfed7823 | Panagiotis Kanavos | return finalPath; |
210 | cfed7823 | Panagiotis Kanavos | } |
211 | cfed7823 | Panagiotis Kanavos | |
212 | 9aa8abad | Panagiotis Kanavos | public override bool TrySetMember(SetMemberBinder binder, object value) |
213 | 9aa8abad | Panagiotis Kanavos | { |
214 | 9aa8abad | Panagiotis Kanavos | if (binder.Name.StartsWith("x_object_meta")) |
215 | 9aa8abad | Panagiotis Kanavos | { |
216 | 9aa8abad | Panagiotis Kanavos | Tags[binder.Name] = value.ToString(); |
217 | 9aa8abad | Panagiotis Kanavos | } |
218 | 9aa8abad | Panagiotis Kanavos | return false; |
219 | 9aa8abad | Panagiotis Kanavos | } |
220 | 9aa8abad | Panagiotis Kanavos | |
221 | aba9e6d9 | Panagiotis Kanavos | public string GetPermissionString() |
222 | aba9e6d9 | Panagiotis Kanavos | { |
223 | 3ddbb7b8 | Panagiotis Kanavos | if (Permissions==null) |
224 | 3ddbb7b8 | Panagiotis Kanavos | throw new InvalidOperationException(); |
225 | 3ddbb7b8 | Panagiotis Kanavos | Contract.EndContractBlock(); |
226 | 3ddbb7b8 | Panagiotis Kanavos | |
227 | aba9e6d9 | Panagiotis Kanavos | var permissionBuilder = new StringBuilder(); |
228 | f0947233 | Panagiotis Kanavos | var groupings = Permissions.GroupBy(pair => pair.Value, pair => pair.Key); |
229 | aba9e6d9 | Panagiotis Kanavos | foreach (var grouping in groupings) |
230 | aba9e6d9 | Panagiotis Kanavos | { |
231 | f0947233 | Panagiotis Kanavos | permissionBuilder.AppendFormat("{0}={1};", grouping.Key, String.Join(",", grouping)); |
232 | aba9e6d9 | Panagiotis Kanavos | } |
233 | f0947233 | Panagiotis Kanavos | var permissions = permissionBuilder.ToString().Trim(';'); |
234 | aba9e6d9 | Panagiotis Kanavos | return permissions; |
235 | aba9e6d9 | Panagiotis Kanavos | } |
236 | f0947233 | Panagiotis Kanavos | |
237 | f0947233 | Panagiotis Kanavos | public void SetPermissions(string permissions) |
238 | f0947233 | Panagiotis Kanavos | { |
239 | c92e02f3 | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(permissions)) |
240 | c92e02f3 | Panagiotis Kanavos | return; |
241 | c92e02f3 | Panagiotis Kanavos | |
242 | f0947233 | Panagiotis Kanavos | var permDict=new Dictionary<string, string>(); |
243 | f0947233 | Panagiotis Kanavos | var perms=permissions.Split(';'); |
244 | f0947233 | Panagiotis Kanavos | foreach (var perm in perms) |
245 | f0947233 | Panagiotis Kanavos | { |
246 | f0947233 | Panagiotis Kanavos | var permPairs=perm.Split('='); |
247 | f0947233 | Panagiotis Kanavos | var right = permPairs[0]; |
248 | f0947233 | Panagiotis Kanavos | var users= permPairs[1].Split(new[]{','},StringSplitOptions.RemoveEmptyEntries); |
249 | f0947233 | Panagiotis Kanavos | foreach (var user in users) |
250 | f0947233 | Panagiotis Kanavos | { |
251 | f0947233 | Panagiotis Kanavos | permDict[user] = right; |
252 | f0947233 | Panagiotis Kanavos | } |
253 | f0947233 | Panagiotis Kanavos | } |
254 | f0947233 | Panagiotis Kanavos | Permissions = permDict; |
255 | f0947233 | Panagiotis Kanavos | } |
256 | 3c43ec9b | Panagiotis Kanavos | } |
257 | 3c43ec9b | Panagiotis Kanavos | } |