2 using System.Collections.Generic;
3 using System.Diagnostics.Contracts;
5 using System.Globalization;
9 using System.Text.RegularExpressions;
10 using Newtonsoft.Json;
12 namespace Pithos.Interfaces
14 public class ObjectInfo:DynamicObject
16 private readonly List<string> _knownContainers= new List<string>{"trash"};
17 public string Name { get; set; }
18 public string Hash { get; set; }
19 public long Bytes { get; set; }
20 public string Content_Type { get; set; }
21 public DateTime Last_Modified { get; set; }
23 private Dictionary<string, string> _tags=new Dictionary<string, string>();
24 public Dictionary<string, string> Tags
27 set { _tags = value; }
30 private Dictionary<string, string> _extensions=new Dictionary<string, string>();
31 public Dictionary<string, string> Extensions
33 get { return _extensions; }
37 ExtractKnownExtensions();
42 private Dictionary<string, string> _permissions=new Dictionary<string, string>();
43 [JsonProperty("x_object_sharing")]
44 [JsonConverter(typeof(PermissionConverter))]
45 public Dictionary<string, string> Permissions
47 get { return _permissions; }
57 [JsonProperty("x_object_version")]
58 public long? Version { get; set; }
62 /// Shared object permissions can be Read or Write
64 [JsonProperty("x_object_allowed_to")]
65 public string AllowedTo { get; set; }
71 [JsonProperty("X_Object_Version_Timestamp"), JsonConverter(typeof(PithosDateTimeConverter))]
72 public DateTime? VersionTimestamp { get; set; }
74 [JsonProperty("X_Object_Modified_By")]
75 public string ModifiedBy { get; set; }
78 public Stream Stream { get; set; }
80 public string Account { get; set; }
82 public string Container { get; set; }
84 public string ContendDisposition { get; set; }
86 public string ContentEncoding { get; set; }
88 public string Manifest { get; set; }
90 private bool _isPublic;
93 get { return !String.IsNullOrWhiteSpace(PublicUrl); }
98 else if (String.IsNullOrWhiteSpace(PublicUrl))
103 public string PublicUrl { get; set; }
108 public ObjectInfo(string accountPath,string accountName,FileInfo fileInfo)
110 var relativeUrl = fileInfo.AsRelativeUrlTo(accountPath);
111 //The first part of the URL is the container
112 var slashIndex = relativeUrl.IndexOf('/');
113 var container = relativeUrl.Substring(0, slashIndex);
114 //The second is the file's url relative to the container
115 var fileUrl = relativeUrl.Substring(slashIndex + 1);
117 Account = accountName;
118 Container = container;
123 private void ExtractKnownExtensions()
125 Version=GetLong(KnownExtensions.X_Object_Version);
126 VersionTimestamp = GetTimestamp(KnownExtensions.X_Object_Version_Timestamp);
127 ModifiedBy = GetString(KnownExtensions.X_Object_Modified_By);
130 private string GetString(string name)
132 var value=String.Empty;
133 _extensions.TryGetValue(name, out value);
137 private long? GetLong(string name)
141 return _extensions.TryGetValue(name, out version) && long.TryParse(version, out value)
146 private DateTime? GetTimestamp(string name)
150 if (_extensions.TryGetValue(name, out version) &&
151 DateTime.TryParse(version,CultureInfo.InvariantCulture,DateTimeStyles.AdjustToUniversal, out value))
159 public static ObjectInfo Empty = new ObjectInfo
164 Content_Type = String.Empty,
165 Last_Modified = DateTime.MinValue
168 public string RelativeUrlToFilePath(string currentAccount)
171 throw new InvalidOperationException("Name can't be null");
172 if (String.IsNullOrWhiteSpace(currentAccount))
173 throw new ArgumentNullException("currentAccount");
174 Contract.EndContractBlock();
179 var unescaped = Uri.UnescapeDataString(Name);
180 var path = unescaped.Replace("/", "\\");
181 var pathParts=new Stack<string>();
182 pathParts.Push(path);
183 if (!String.IsNullOrWhiteSpace(Container) && !_knownContainers.Contains(Container))
184 pathParts.Push(Container);
185 if (!currentAccount.Equals(Account, StringComparison.InvariantCultureIgnoreCase))
189 pathParts.Push(Account);
190 pathParts.Push("others");
193 var finalPath=Path.Combine(pathParts.ToArray());
197 public override bool TrySetMember(SetMemberBinder binder, object value)
199 if (binder.Name.StartsWith("x_object_meta"))
201 Tags[binder.Name] = value.ToString();
206 public string GetPermissionString()
208 var permissionBuilder = new StringBuilder();
209 var groupings = Permissions.GroupBy(pair => pair.Value, pair => pair.Key);
210 foreach (var grouping in groupings)
212 permissionBuilder.AppendFormat("{0}={1};", grouping.Key, String.Join(",", grouping));
214 var permissions = permissionBuilder.ToString().Trim(';');
218 public void SetPermissions(string permissions)
220 var permDict=new Dictionary<string, string>();
221 var perms=permissions.Split(';');
222 foreach (var perm in perms)
224 var permPairs=perm.Split('=');
225 var right = permPairs[0];
226 var users= permPairs[1].Split(new[]{','},StringSplitOptions.RemoveEmptyEntries);
227 foreach (var user in users)
229 permDict[user] = right;
232 Permissions = permDict;