Statistics
| Branch: | Revision:

root / trunk / Pithos.Interfaces / ObjectInfo.cs @ 6bcdd8e2

History | View | Annotate | Download (11.3 kB)

1 255f5f86 Panagiotis Kanavos
#region
2 255f5f86 Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 255f5f86 Panagiotis Kanavos
 * <copyright file="ObjectInfo.cs" company="GRNet">
4 255f5f86 Panagiotis Kanavos
 * 
5 255f5f86 Panagiotis Kanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 255f5f86 Panagiotis Kanavos
 *
7 255f5f86 Panagiotis Kanavos
 * Redistribution and use in source and binary forms, with or
8 255f5f86 Panagiotis Kanavos
 * without modification, are permitted provided that the following
9 255f5f86 Panagiotis Kanavos
 * conditions are met:
10 255f5f86 Panagiotis Kanavos
 *
11 255f5f86 Panagiotis Kanavos
 *   1. Redistributions of source code must retain the above
12 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
13 255f5f86 Panagiotis Kanavos
 *      disclaimer.
14 255f5f86 Panagiotis Kanavos
 *
15 255f5f86 Panagiotis Kanavos
 *   2. Redistributions in binary form must reproduce the above
16 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
17 255f5f86 Panagiotis Kanavos
 *      disclaimer in the documentation and/or other materials
18 255f5f86 Panagiotis Kanavos
 *      provided with the distribution.
19 255f5f86 Panagiotis Kanavos
 *
20 255f5f86 Panagiotis Kanavos
 *
21 255f5f86 Panagiotis Kanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 255f5f86 Panagiotis Kanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 255f5f86 Panagiotis Kanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 255f5f86 Panagiotis Kanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 255f5f86 Panagiotis Kanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 255f5f86 Panagiotis Kanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 255f5f86 Panagiotis Kanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 255f5f86 Panagiotis Kanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 255f5f86 Panagiotis Kanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 255f5f86 Panagiotis Kanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 255f5f86 Panagiotis Kanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 255f5f86 Panagiotis Kanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 255f5f86 Panagiotis Kanavos
 *
34 255f5f86 Panagiotis Kanavos
 * The views and conclusions contained in the software and
35 255f5f86 Panagiotis Kanavos
 * documentation are those of the authors and should not be
36 255f5f86 Panagiotis Kanavos
 * interpreted as representing official policies, either expressed
37 255f5f86 Panagiotis Kanavos
 * or implied, of GRNET S.A.
38 255f5f86 Panagiotis Kanavos
 * </copyright>
39 255f5f86 Panagiotis Kanavos
 * -----------------------------------------------------------------------
40 255f5f86 Panagiotis Kanavos
 */
41 255f5f86 Panagiotis Kanavos
#endregion
42 3c43ec9b Panagiotis Kanavos
using System;
43 3c43ec9b Panagiotis Kanavos
using System.Collections.Generic;
44 a0dcfcc9 Panagiotis Kanavos
using System.Diagnostics;
45 cfed7823 Panagiotis Kanavos
using System.Diagnostics.Contracts;
46 9aa8abad Panagiotis Kanavos
using System.Dynamic;
47 9c4346c9 Panagiotis Kanavos
using System.Globalization;
48 3c43ec9b Panagiotis Kanavos
using System.IO;
49 aba9e6d9 Panagiotis Kanavos
using System.Linq;
50 aba9e6d9 Panagiotis Kanavos
using System.Text;
51 9aa8abad Panagiotis Kanavos
using Newtonsoft.Json;
52 3c43ec9b Panagiotis Kanavos
53 3c43ec9b Panagiotis Kanavos
namespace Pithos.Interfaces
54 3c43ec9b Panagiotis Kanavos
{
55 a0dcfcc9 Panagiotis Kanavos
    [DebuggerDisplay("Name {Name}")]
56 31c97141 Panagiotis Kanavos
    public class ObjectInfo//:DynamicObject 
57 3c43ec9b Panagiotis Kanavos
    {
58 9aa8abad Panagiotis Kanavos
        private readonly List<string> _knownContainers= new List<string>{"trash"};
59 3c43ec9b Panagiotis Kanavos
        public string Name { get; set; }
60 06f11e8b Panagiotis Kanavos
        
61 06f11e8b Panagiotis Kanavos
        
62 3c43ec9b Panagiotis Kanavos
        public string Hash { get; set; }
63 06f11e8b Panagiotis Kanavos
64 06f11e8b Panagiotis Kanavos
        public string X_Object_Hash { get { return Hash; } set { Hash = value; } }
65 06f11e8b Panagiotis Kanavos
66 06f11e8b Panagiotis Kanavos
        [JsonProperty("x_object_uuid")]
67 06f11e8b Panagiotis Kanavos
        public string UUID { get; set; }
68 06f11e8b Panagiotis Kanavos
69 3c43ec9b Panagiotis Kanavos
        public long Bytes { get; set; }
70 3c43ec9b Panagiotis Kanavos
        public string Content_Type { get; set; }
71 3c43ec9b Panagiotis Kanavos
        public DateTime Last_Modified { get; set; }
72 3c43ec9b Panagiotis Kanavos
73 3c43ec9b Panagiotis Kanavos
        private Dictionary<string, string> _tags=new Dictionary<string, string>();
74 3c43ec9b Panagiotis Kanavos
        public Dictionary<string, string> Tags
75 3c43ec9b Panagiotis Kanavos
        {
76 3c43ec9b Panagiotis Kanavos
            get { return _tags; }
77 3c43ec9b Panagiotis Kanavos
            set { _tags = value; }
78 3c43ec9b Panagiotis Kanavos
        }
79 3c43ec9b Panagiotis Kanavos
80 3c43ec9b Panagiotis Kanavos
        private Dictionary<string, string> _extensions=new Dictionary<string, string>();
81 3c43ec9b Panagiotis Kanavos
        public Dictionary<string, string> Extensions
82 3c43ec9b Panagiotis Kanavos
        {
83 3c43ec9b Panagiotis Kanavos
            get { return _extensions; }
84 9c4346c9 Panagiotis Kanavos
            set
85 9c4346c9 Panagiotis Kanavos
            {
86 9c4346c9 Panagiotis Kanavos
                _extensions = value;
87 9c4346c9 Panagiotis Kanavos
                ExtractKnownExtensions();
88 9c4346c9 Panagiotis Kanavos
            }
89 3c43ec9b Panagiotis Kanavos
        }
90 bfc13ed8 Panagiotis Kanavos
        
91 9aa8abad Panagiotis Kanavos
        
92 9aa8abad Panagiotis Kanavos
        private Dictionary<string, string> _permissions=new Dictionary<string, string>();
93 9aa8abad Panagiotis Kanavos
        [JsonProperty("x_object_sharing")]
94 9aa8abad Panagiotis Kanavos
        [JsonConverter(typeof(PermissionConverter))]
95 9aa8abad Panagiotis Kanavos
        public Dictionary<string, string> Permissions
96 bfc13ed8 Panagiotis Kanavos
        {
97 9aa8abad Panagiotis Kanavos
            get { return _permissions; }
98 9aa8abad Panagiotis Kanavos
            set
99 9aa8abad Panagiotis Kanavos
            {
100 9aa8abad Panagiotis Kanavos
                _permissions = value;                
101 9aa8abad Panagiotis Kanavos
            }
102 bfc13ed8 Panagiotis Kanavos
        }
103 cfed7823 Panagiotis Kanavos
104 9aa8abad Panagiotis Kanavos
        /// <summary>
105 9aa8abad Panagiotis Kanavos
        /// Version number
106 9aa8abad Panagiotis Kanavos
        /// </summary>
107 9aa8abad Panagiotis Kanavos
        [JsonProperty("x_object_version")]
108 9aa8abad Panagiotis Kanavos
        public long? Version { get; set; }
109 cfed7823 Panagiotis Kanavos
110 cfed7823 Panagiotis Kanavos
111 9aa8abad Panagiotis Kanavos
        /// <summary>
112 9aa8abad Panagiotis Kanavos
        /// Shared object permissions can be Read or Write
113 9aa8abad Panagiotis Kanavos
        /// </summary>
114 9aa8abad Panagiotis Kanavos
        [JsonProperty("x_object_allowed_to")]
115 9aa8abad Panagiotis Kanavos
        public string AllowedTo { get; set; }
116 cfed7823 Panagiotis Kanavos
117 bfc13ed8 Panagiotis Kanavos
118 9aa8abad Panagiotis Kanavos
        /// <summary>
119 9aa8abad Panagiotis Kanavos
        /// Version timestamp
120 9aa8abad Panagiotis Kanavos
        /// </summary>
121 9aa8abad Panagiotis Kanavos
        [JsonProperty("X_Object_Version_Timestamp"), JsonConverter(typeof(PithosDateTimeConverter))]
122 9aa8abad Panagiotis Kanavos
        public DateTime? VersionTimestamp { get; set; }
123 bfc13ed8 Panagiotis Kanavos
124 9aa8abad Panagiotis Kanavos
        [JsonProperty("X_Object_Modified_By")]
125 9aa8abad Panagiotis Kanavos
        public string ModifiedBy { get; set; }
126 bfc13ed8 Panagiotis Kanavos
127 3c43ec9b Panagiotis Kanavos
128 3c43ec9b Panagiotis Kanavos
        public Stream Stream { get; set; }
129 3c43ec9b Panagiotis Kanavos
130 759bd3c4 Panagiotis Kanavos
131 759bd3c4 Panagiotis Kanavos
        public Uri StorageUri { get; set; }
132 759bd3c4 Panagiotis Kanavos
133 cfed7823 Panagiotis Kanavos
        public string Account { get; set; }
134 cfed7823 Panagiotis Kanavos
135 cfed7823 Panagiotis Kanavos
        public string Container { get; set; }
136 cfed7823 Panagiotis Kanavos
137 759bd3c4 Panagiotis Kanavos
        public Uri Uri
138 759bd3c4 Panagiotis Kanavos
        {
139 759bd3c4 Panagiotis Kanavos
            get
140 759bd3c4 Panagiotis Kanavos
            {
141 759bd3c4 Panagiotis Kanavos
                var relativeUrl=String.Format("{0}/{1}/{2}",Account, Container,Name);
142 6bcdd8e2 Panagiotis Kanavos
                return StorageUri==null 
143 6bcdd8e2 Panagiotis Kanavos
                    ? new Uri(relativeUrl,UriKind.Relative) 
144 6bcdd8e2 Panagiotis Kanavos
                    : new Uri(StorageUri, relativeUrl);
145 759bd3c4 Panagiotis Kanavos
            }
146 759bd3c4 Panagiotis Kanavos
        }
147 759bd3c4 Panagiotis Kanavos
148 aba9e6d9 Panagiotis Kanavos
        public string ContendDisposition { get; set; }
149 aba9e6d9 Panagiotis Kanavos
150 aba9e6d9 Panagiotis Kanavos
        public string ContentEncoding { get; set; }
151 aba9e6d9 Panagiotis Kanavos
152 aba9e6d9 Panagiotis Kanavos
        public string Manifest { get; set; }
153 06f11e8b Panagiotis Kanavos
        
154 aba9e6d9 Panagiotis Kanavos
        public bool IsPublic
155 aba9e6d9 Panagiotis Kanavos
        {
156 aba9e6d9 Panagiotis Kanavos
            get { return !String.IsNullOrWhiteSpace(PublicUrl); }
157 aba9e6d9 Panagiotis Kanavos
            set
158 aba9e6d9 Panagiotis Kanavos
            {
159 aba9e6d9 Panagiotis Kanavos
                if (!value)
160 f0947233 Panagiotis Kanavos
                    PublicUrl = null;
161 aba9e6d9 Panagiotis Kanavos
                else if (String.IsNullOrWhiteSpace(PublicUrl))
162 aba9e6d9 Panagiotis Kanavos
                    PublicUrl="true";                
163 aba9e6d9 Panagiotis Kanavos
            }
164 aba9e6d9 Panagiotis Kanavos
        }
165 aba9e6d9 Panagiotis Kanavos
166 06f11e8b Panagiotis Kanavos
        [JsonProperty("X_Object_Public")]
167 aba9e6d9 Panagiotis Kanavos
        public string PublicUrl { get; set; }
168 aba9e6d9 Panagiotis Kanavos
169 64171b56 Panagiotis Kanavos
        public string PreviousHash { get; set; }
170 64171b56 Panagiotis Kanavos
171 27361404 Panagiotis Kanavos
        public ObjectInfo()
172 27361404 Panagiotis Kanavos
        {}
173 27361404 Panagiotis Kanavos
174 4f6d51d4 Panagiotis Kanavos
        public ObjectInfo(string accountPath,string accountName,FileSystemInfo fileInfo)
175 27361404 Panagiotis Kanavos
        {
176 5e31048f Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(accountPath))
177 5e31048f Panagiotis Kanavos
                throw new ArgumentNullException("accountPath");
178 5e31048f Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(accountName))
179 5e31048f Panagiotis Kanavos
                throw new ArgumentNullException("accountName");
180 5e31048f Panagiotis Kanavos
            if (fileInfo == null)
181 5e31048f Panagiotis Kanavos
                throw new ArgumentNullException("fileInfo");
182 5e31048f Panagiotis Kanavos
            Contract.EndContractBlock();
183 5e31048f Panagiotis Kanavos
184 3c76f045 Panagiotis Kanavos
            var relativeUrl = fileInfo.WithProperCapitalization().AsRelativeUrlTo(accountPath);
185 27361404 Panagiotis Kanavos
            //The first part of the URL is the container
186 27361404 Panagiotis Kanavos
            var slashIndex = relativeUrl.IndexOf('/');
187 27361404 Panagiotis Kanavos
            var container = relativeUrl.Substring(0, slashIndex);
188 27361404 Panagiotis Kanavos
            //The second is the file's url relative to the container
189 27361404 Panagiotis Kanavos
            var fileUrl = relativeUrl.Substring(slashIndex + 1);
190 27361404 Panagiotis Kanavos
191 27361404 Panagiotis Kanavos
            Account = accountName;
192 27361404 Panagiotis Kanavos
            Container = container;
193 27361404 Panagiotis Kanavos
            Name = fileUrl; 
194 27361404 Panagiotis Kanavos
        }
195 27361404 Panagiotis Kanavos
196 9c4346c9 Panagiotis Kanavos
197 9c4346c9 Panagiotis Kanavos
        private void ExtractKnownExtensions()
198 9c4346c9 Panagiotis Kanavos
        {
199 bfc13ed8 Panagiotis Kanavos
            Version=GetLong(KnownExtensions.X_Object_Version);
200 bfc13ed8 Panagiotis Kanavos
            VersionTimestamp = GetTimestamp(KnownExtensions.X_Object_Version_Timestamp);
201 bfc13ed8 Panagiotis Kanavos
            ModifiedBy = GetString(KnownExtensions.X_Object_Modified_By);
202 bfc13ed8 Panagiotis Kanavos
        }
203 bfc13ed8 Panagiotis Kanavos
204 bfc13ed8 Panagiotis Kanavos
        private string GetString(string name)
205 bfc13ed8 Panagiotis Kanavos
        {            
206 3ddbb7b8 Panagiotis Kanavos
            string value;
207 bfc13ed8 Panagiotis Kanavos
            _extensions.TryGetValue(name, out value);
208 bfc13ed8 Panagiotis Kanavos
            return value ;                        
209 9c4346c9 Panagiotis Kanavos
        }
210 a0dcfcc9 Panagiotis Kanavos
        
211 9c4346c9 Panagiotis Kanavos
        private long? GetLong(string name)
212 9c4346c9 Panagiotis Kanavos
        {
213 9c4346c9 Panagiotis Kanavos
            string version;
214 9c4346c9 Panagiotis Kanavos
            long value;
215 bfc13ed8 Panagiotis Kanavos
            return _extensions.TryGetValue(name, out version) && long.TryParse(version, out value)
216 bfc13ed8 Panagiotis Kanavos
                       ? (long?) value
217 bfc13ed8 Panagiotis Kanavos
                       : null;
218 9c4346c9 Panagiotis Kanavos
        }
219 9c4346c9 Panagiotis Kanavos
220 9c4346c9 Panagiotis Kanavos
        private DateTime? GetTimestamp(string name)
221 9c4346c9 Panagiotis Kanavos
        {
222 9c4346c9 Panagiotis Kanavos
            string version;
223 9c4346c9 Panagiotis Kanavos
            DateTime value;
224 9c4346c9 Panagiotis Kanavos
            if (_extensions.TryGetValue(name, out version) && 
225 9c4346c9 Panagiotis Kanavos
                DateTime.TryParse(version,CultureInfo.InvariantCulture,DateTimeStyles.AdjustToUniversal, out value))
226 9c4346c9 Panagiotis Kanavos
            {
227 9c4346c9 Panagiotis Kanavos
                return value;
228 9c4346c9 Panagiotis Kanavos
            }
229 9c4346c9 Panagiotis Kanavos
            return null;
230 9c4346c9 Panagiotis Kanavos
        }
231 9c4346c9 Panagiotis Kanavos
232 9c4346c9 Panagiotis Kanavos
233 9c4346c9 Panagiotis Kanavos
        public static ObjectInfo Empty = new ObjectInfo
234 9c4346c9 Panagiotis Kanavos
        {
235 9c4346c9 Panagiotis Kanavos
            Name = String.Empty,
236 9c4346c9 Panagiotis Kanavos
            Hash = String.Empty,
237 9c4346c9 Panagiotis Kanavos
            Bytes = 0,
238 9c4346c9 Panagiotis Kanavos
            Content_Type = String.Empty,
239 31c97141 Panagiotis Kanavos
            Last_Modified = DateTime.MinValue,
240 31c97141 Panagiotis Kanavos
            Exists=false
241 9c4346c9 Panagiotis Kanavos
        };
242 bfc13ed8 Panagiotis Kanavos
243 31c97141 Panagiotis Kanavos
        private bool _exists=true;
244 31c97141 Panagiotis Kanavos
245 31c97141 Panagiotis Kanavos
        public bool Exists
246 31c97141 Panagiotis Kanavos
        {
247 31c97141 Panagiotis Kanavos
            get {
248 31c97141 Panagiotis Kanavos
                return _exists;
249 31c97141 Panagiotis Kanavos
            }
250 31c97141 Panagiotis Kanavos
            set {
251 31c97141 Panagiotis Kanavos
                _exists = value;
252 31c97141 Panagiotis Kanavos
            }
253 31c97141 Panagiotis Kanavos
        }
254 31c97141 Panagiotis Kanavos
255 759bd3c4 Panagiotis Kanavos
256 cfed7823 Panagiotis Kanavos
        public string RelativeUrlToFilePath(string currentAccount)
257 cfed7823 Panagiotis Kanavos
        {
258 9aa8abad Panagiotis Kanavos
            if (Name==null)
259 cfed7823 Panagiotis Kanavos
                throw new InvalidOperationException("Name can't be null");
260 cfed7823 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(currentAccount))
261 cfed7823 Panagiotis Kanavos
                throw new ArgumentNullException("currentAccount");
262 cfed7823 Panagiotis Kanavos
            Contract.EndContractBlock();
263 cfed7823 Panagiotis Kanavos
264 cfed7823 Panagiotis Kanavos
            if (this == Empty)
265 cfed7823 Panagiotis Kanavos
                return String.Empty;
266 cfed7823 Panagiotis Kanavos
267 9aa8abad Panagiotis Kanavos
            var unescaped = Uri.UnescapeDataString(Name);
268 cfed7823 Panagiotis Kanavos
            var path = unescaped.Replace("/", "\\");
269 cfed7823 Panagiotis Kanavos
            var pathParts=new Stack<string>();
270 cfed7823 Panagiotis Kanavos
            pathParts.Push(path);
271 cfed7823 Panagiotis Kanavos
            if (!String.IsNullOrWhiteSpace(Container) && !_knownContainers.Contains(Container))
272 cfed7823 Panagiotis Kanavos
                pathParts.Push(Container);
273 cfed7823 Panagiotis Kanavos
            if (!currentAccount.Equals(Account, StringComparison.InvariantCultureIgnoreCase))
274 cfed7823 Panagiotis Kanavos
            {
275 cfed7823 Panagiotis Kanavos
                if (Account != null)
276 cfed7823 Panagiotis Kanavos
                {
277 cfed7823 Panagiotis Kanavos
                    pathParts.Push(Account);
278 d9b1cbeb Panagiotis Kanavos
                    pathParts.Push(FolderConstants.OthersFolder);
279 cfed7823 Panagiotis Kanavos
                }
280 cfed7823 Panagiotis Kanavos
            }
281 cfed7823 Panagiotis Kanavos
            var finalPath=Path.Combine(pathParts.ToArray());
282 cfed7823 Panagiotis Kanavos
            return finalPath;
283 cfed7823 Panagiotis Kanavos
        }
284 cfed7823 Panagiotis Kanavos
285 31c97141 Panagiotis Kanavos
/*
286 9aa8abad Panagiotis Kanavos
        public override bool TrySetMember(SetMemberBinder binder, object value)
287 9aa8abad Panagiotis Kanavos
        {
288 9aa8abad Panagiotis Kanavos
            if (binder.Name.StartsWith("x_object_meta"))
289 9aa8abad Panagiotis Kanavos
            {
290 9aa8abad Panagiotis Kanavos
                Tags[binder.Name] = value.ToString();
291 9aa8abad Panagiotis Kanavos
            }
292 9aa8abad Panagiotis Kanavos
            return false;
293 9aa8abad Panagiotis Kanavos
        }
294 31c97141 Panagiotis Kanavos
*/
295 9aa8abad Panagiotis Kanavos
296 aba9e6d9 Panagiotis Kanavos
        public string GetPermissionString()
297 aba9e6d9 Panagiotis Kanavos
        {
298 3ddbb7b8 Panagiotis Kanavos
            if (Permissions==null)
299 3ddbb7b8 Panagiotis Kanavos
                throw new InvalidOperationException();
300 3ddbb7b8 Panagiotis Kanavos
            Contract.EndContractBlock();
301 3ddbb7b8 Panagiotis Kanavos
302 aba9e6d9 Panagiotis Kanavos
            var permissionBuilder = new StringBuilder();
303 f0947233 Panagiotis Kanavos
            var groupings = Permissions.GroupBy(pair => pair.Value, pair => pair.Key);
304 aba9e6d9 Panagiotis Kanavos
            foreach (var grouping in groupings)
305 aba9e6d9 Panagiotis Kanavos
            {
306 f0947233 Panagiotis Kanavos
                permissionBuilder.AppendFormat("{0}={1};", grouping.Key, String.Join(",", grouping));
307 aba9e6d9 Panagiotis Kanavos
            }
308 f0947233 Panagiotis Kanavos
            var permissions = permissionBuilder.ToString().Trim(';');
309 aba9e6d9 Panagiotis Kanavos
            return permissions;
310 aba9e6d9 Panagiotis Kanavos
        }
311 f0947233 Panagiotis Kanavos
312 f0947233 Panagiotis Kanavos
        public void SetPermissions(string permissions)
313 f0947233 Panagiotis Kanavos
        {
314 c92e02f3 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(permissions))
315 c92e02f3 Panagiotis Kanavos
                return;
316 c92e02f3 Panagiotis Kanavos
317 f0947233 Panagiotis Kanavos
            var permDict=new Dictionary<string, string>();
318 f0947233 Panagiotis Kanavos
            var perms=permissions.Split(';');
319 f0947233 Panagiotis Kanavos
            foreach (var perm in perms)
320 f0947233 Panagiotis Kanavos
            {
321 f0947233 Panagiotis Kanavos
                var permPairs=perm.Split('=');
322 f0947233 Panagiotis Kanavos
                var right = permPairs[0];
323 f0947233 Panagiotis Kanavos
                var users= permPairs[1].Split(new[]{','},StringSplitOptions.RemoveEmptyEntries);
324 f0947233 Panagiotis Kanavos
                foreach (var user in users)
325 f0947233 Panagiotis Kanavos
                {
326 f0947233 Panagiotis Kanavos
                    permDict[user] = right;
327 f0947233 Panagiotis Kanavos
                }
328 f0947233 Panagiotis Kanavos
            }
329 f0947233 Panagiotis Kanavos
            Permissions = permDict;
330 f0947233 Panagiotis Kanavos
        }
331 64171b56 Panagiotis Kanavos
332 64171b56 Panagiotis Kanavos
        //The previous values that correspond to a NoModification object
333 64171b56 Panagiotis Kanavos
        //have the same account, container and possibly the same folder
334 64171b56 Panagiotis Kanavos
        public bool CorrespondsTo(ObjectInfo other)
335 64171b56 Panagiotis Kanavos
        {
336 64171b56 Panagiotis Kanavos
            return other.Account == this.Account
337 64171b56 Panagiotis Kanavos
                   && other.Container == this.Container
338 64171b56 Panagiotis Kanavos
                   && (this.Name == null || other.Name.StartsWith(this.Name));
339 64171b56 Panagiotis Kanavos
        }
340 b666b39a Panagiotis Kanavos
341 b666b39a Panagiotis Kanavos
342 b666b39a Panagiotis Kanavos
        public ObjectInfo Previous { get; private set; }
343 b666b39a Panagiotis Kanavos
344 b666b39a Panagiotis Kanavos
        public ObjectInfo SetPrevious(ObjectInfo previous)
345 b666b39a Panagiotis Kanavos
        {            
346 b666b39a Panagiotis Kanavos
            Previous = previous;
347 b666b39a Panagiotis Kanavos
            PreviousHash = previous.Hash;
348 b666b39a Panagiotis Kanavos
            return this;
349 b666b39a Panagiotis Kanavos
        }
350 3c43ec9b Panagiotis Kanavos
    }
351 3c43ec9b Panagiotis Kanavos
}