Statistics
| Branch: | Revision:

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
}