Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / Agents / CloudTransferAction.cs @ b666b39a

History | View | Annotate | Download (9 kB)

1 255f5f86 Panagiotis Kanavos
#region
2 255f5f86 Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 255f5f86 Panagiotis Kanavos
 * <copyright file="CloudTransferAction.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 1caef52e Panagiotis Kanavos
using System;
43 c53aa229 Panagiotis Kanavos
using System.Diagnostics.Contracts;
44 1caef52e Panagiotis Kanavos
using System.IO;
45 1caef52e Panagiotis Kanavos
using System.Threading;
46 1caef52e Panagiotis Kanavos
using Pithos.Interfaces;
47 1caef52e Panagiotis Kanavos
using Pithos.Network;
48 1caef52e Panagiotis Kanavos
49 1caef52e Panagiotis Kanavos
namespace Pithos.Core.Agents
50 1caef52e Panagiotis Kanavos
{
51 1caef52e Panagiotis Kanavos
    public enum CloudActionType
52 1caef52e Panagiotis Kanavos
    {
53 1caef52e Panagiotis Kanavos
        MustSynch,
54 1caef52e Panagiotis Kanavos
        UploadUnconditional,
55 1caef52e Panagiotis Kanavos
        DownloadUnconditional,
56 1caef52e Panagiotis Kanavos
        DeleteLocal,
57 1caef52e Panagiotis Kanavos
        DeleteCloud,
58 b666b39a Panagiotis Kanavos
        RenameCloud,
59 b666b39a Panagiotis Kanavos
        RenameLocal
60 1caef52e Panagiotis Kanavos
    }
61 1caef52e Panagiotis Kanavos
62 1caef52e Panagiotis Kanavos
    public class CloudAction
63 1caef52e Panagiotis Kanavos
    {
64 c53aa229 Panagiotis Kanavos
        public AccountInfo AccountInfo { get; set; }
65 1caef52e Panagiotis Kanavos
        public CloudActionType Action { get; set; }
66 4f6d51d4 Panagiotis Kanavos
        public FileSystemInfo LocalFile { get; set; }
67 1caef52e Panagiotis Kanavos
        public ObjectInfo CloudFile { get; set; }
68 bfc13ed8 Panagiotis Kanavos
        public FileState FileState { get; set; }
69 cfed7823 Panagiotis Kanavos
        public string Container { get; set; }
70 1caef52e Panagiotis Kanavos
71 039a89e5 Panagiotis Kanavos
        public readonly DateTime Created = DateTime.Now;
72 039a89e5 Panagiotis Kanavos
73 1caef52e Panagiotis Kanavos
74 cfed7823 Panagiotis Kanavos
        public Lazy<string> LocalHash { get; protected set; }
75 cfed7823 Panagiotis Kanavos
        private Lazy<string> _topHash;
76 cfed7823 Panagiotis Kanavos
        public Lazy<string> TopHash
77 cfed7823 Panagiotis Kanavos
        {
78 cfed7823 Panagiotis Kanavos
            get { return _topHash; }
79 cfed7823 Panagiotis Kanavos
            set { _topHash = value; }
80 cfed7823 Panagiotis Kanavos
        }
81 1caef52e Panagiotis Kanavos
82 bfc13ed8 Panagiotis Kanavos
83 c53aa229 Panagiotis Kanavos
        [ContractInvariantMethod]
84 c53aa229 Panagiotis Kanavos
        private void Invariants()
85 1caef52e Panagiotis Kanavos
        {
86 c53aa229 Panagiotis Kanavos
            Contract.Invariant(AccountInfo!=null);
87 c53aa229 Panagiotis Kanavos
        }
88 c53aa229 Panagiotis Kanavos
89 2edb4807 Panagiotis Kanavos
        public bool IsShared
90 2edb4807 Panagiotis Kanavos
        {
91 2edb4807 Panagiotis Kanavos
            get { return  CloudFile!=null && AccountInfo.UserName != CloudFile.Account; }
92 2edb4807 Panagiotis Kanavos
        }
93 2edb4807 Panagiotis Kanavos
94 c53aa229 Panagiotis Kanavos
        protected CloudAction(AccountInfo accountInfo,CloudActionType action)
95 c53aa229 Panagiotis Kanavos
        {
96 c53aa229 Panagiotis Kanavos
            if (accountInfo==null)
97 c53aa229 Panagiotis Kanavos
                throw new ArgumentNullException("accountInfo");
98 c53aa229 Panagiotis Kanavos
            Contract.EndContractBlock();
99 c53aa229 Panagiotis Kanavos
100 1caef52e Panagiotis Kanavos
            Action = action;
101 c53aa229 Panagiotis Kanavos
            AccountInfo = accountInfo;
102 1caef52e Panagiotis Kanavos
        }
103 1caef52e Panagiotis Kanavos
104 4f6d51d4 Panagiotis Kanavos
        public CloudAction(AccountInfo accountInfo, CloudActionType action, FileSystemInfo localFile, ObjectInfo cloudFile, FileState state, int blockSize, string algorithm)
105 c53aa229 Panagiotis Kanavos
            : this(accountInfo,action)
106 1caef52e Panagiotis Kanavos
        {
107 f3d080df Panagiotis Kanavos
            LocalFile = localFile.WithProperCapitalization();
108 1caef52e Panagiotis Kanavos
            CloudFile = cloudFile;
109 bfc13ed8 Panagiotis Kanavos
            FileState = state;
110 1caef52e Panagiotis Kanavos
            if (LocalFile != null)
111 bfc13ed8 Panagiotis Kanavos
            {
112 4f6d51d4 Panagiotis Kanavos
113 0af3141d Panagiotis Kanavos
                LocalHash = new Lazy<string>(() => LocalFile.CalculateHash(blockSize,algorithm),
114 bfc13ed8 Panagiotis Kanavos
                                             LazyThreadSafetyMode.ExecutionAndPublication);
115 bfc13ed8 Panagiotis Kanavos
            }
116 bfc13ed8 Panagiotis Kanavos
        }
117 bfc13ed8 Panagiotis Kanavos
118 1bfc38f1 Panagiotis Kanavos
        //Calculate the download path for the cloud file
119 1bfc38f1 Panagiotis Kanavos
        public string GetDownloadPath()
120 1bfc38f1 Panagiotis Kanavos
        {
121 1bfc38f1 Panagiotis Kanavos
            if (CloudFile == null)
122 1bfc38f1 Panagiotis Kanavos
                return String.Empty;
123 1bfc38f1 Panagiotis Kanavos
            var filePath = CloudFile.RelativeUrlToFilePath(AccountInfo.UserName);
124 1bfc38f1 Panagiotis Kanavos
            return Path.Combine(AccountInfo.AccountPath, filePath);
125 1bfc38f1 Panagiotis Kanavos
        }
126 27361404 Panagiotis Kanavos
127 27361404 Panagiotis Kanavos
        public override string ToString()
128 27361404 Panagiotis Kanavos
        {
129 27361404 Panagiotis Kanavos
            return String.Format("{0}:{1}->{2}", this.Action, this.LocalFile.FullName, this.CloudFile.Name);
130 27361404 Panagiotis Kanavos
        }
131 70f12b36 Panagiotis Kanavos
132 70f12b36 Panagiotis Kanavos
        protected static ObjectInfo CreateObjectInfoFor(AccountInfo accountInfo, FileSystemInfo fileInfo)
133 70f12b36 Panagiotis Kanavos
        {
134 70f12b36 Panagiotis Kanavos
            Contract.Requires(accountInfo!=null);
135 70f12b36 Panagiotis Kanavos
            Contract.Requires(fileInfo!=null);
136 70f12b36 Panagiotis Kanavos
            Contract.Ensures(Contract.Result<ObjectInfo>()!=null);
137 70f12b36 Panagiotis Kanavos
138 70f12b36 Panagiotis Kanavos
            var capitalizedFileInfo = fileInfo.WithProperCapitalization();
139 70f12b36 Panagiotis Kanavos
            var fullLocalName = capitalizedFileInfo.FullName;
140 70f12b36 Panagiotis Kanavos
            var othersPath = Path.Combine(accountInfo.AccountPath, FolderConstants.OthersFolder);
141 70f12b36 Panagiotis Kanavos
            
142 70f12b36 Panagiotis Kanavos
            var isShared = fullLocalName.StartsWith(othersPath, StringComparison.InvariantCultureIgnoreCase);
143 70f12b36 Panagiotis Kanavos
            if (isShared)
144 70f12b36 Panagiotis Kanavos
            {                
145 70f12b36 Panagiotis Kanavos
                var pathRelativeToOther = fullLocalName.Substring(othersPath.Length + 1);
146 70f12b36 Panagiotis Kanavos
                var otherParts = pathRelativeToOther.Split('\\');
147 70f12b36 Panagiotis Kanavos
                var otherName = otherParts[0];
148 70f12b36 Panagiotis Kanavos
                var otherContainer = otherParts[1];
149 70f12b36 Panagiotis Kanavos
                return new ObjectInfo
150 70f12b36 Panagiotis Kanavos
                           {
151 70f12b36 Panagiotis Kanavos
                               Account = otherName, 
152 70f12b36 Panagiotis Kanavos
                               Container = otherContainer, 
153 70f12b36 Panagiotis Kanavos
                               Name = String.Join("/", otherParts.Splice(2))
154 70f12b36 Panagiotis Kanavos
                           };
155 70f12b36 Panagiotis Kanavos
            }
156 70f12b36 Panagiotis Kanavos
            return new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, fileInfo);
157 70f12b36 Panagiotis Kanavos
        }
158 5120f3cb Panagiotis Kanavos
    }    
159 5120f3cb Panagiotis Kanavos
160 5120f3cb Panagiotis Kanavos
    public class CloudDownloadAction:CloudAction
161 5120f3cb Panagiotis Kanavos
    {
162 c53aa229 Panagiotis Kanavos
        public CloudDownloadAction(AccountInfo accountInfo, ObjectInfo cloudFile)
163 c53aa229 Panagiotis Kanavos
            :base(accountInfo,CloudActionType.DownloadUnconditional)
164 5120f3cb Panagiotis Kanavos
        {            
165 27361404 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(cloudFile.Container))
166 27361404 Panagiotis Kanavos
                throw new ArgumentException("CloudFile.Container","cloudFile");
167 27361404 Panagiotis Kanavos
            Contract.EndContractBlock();
168 27361404 Panagiotis Kanavos
169 5120f3cb Panagiotis Kanavos
            CloudFile = cloudFile;
170 5120f3cb Panagiotis Kanavos
        }
171 27361404 Panagiotis Kanavos
172 27361404 Panagiotis Kanavos
        [ContractInvariantMethod]
173 27361404 Panagiotis Kanavos
        private void Invariants()
174 27361404 Panagiotis Kanavos
        {
175 27361404 Panagiotis Kanavos
            Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
176 27361404 Panagiotis Kanavos
        }
177 27361404 Panagiotis Kanavos
178 27361404 Panagiotis Kanavos
        public override string ToString()
179 27361404 Panagiotis Kanavos
        {
180 27361404 Panagiotis Kanavos
            return String.Format("{0}: _ <- {1}", this.Action, this.CloudFile.Name);
181 27361404 Panagiotis Kanavos
        }
182 5120f3cb Panagiotis Kanavos
        
183 5120f3cb Panagiotis Kanavos
    }
184 5120f3cb Panagiotis Kanavos
    public class CloudDeleteAction:CloudAction
185 5120f3cb Panagiotis Kanavos
    {
186 4f6d51d4 Panagiotis Kanavos
        public CloudDeleteAction(AccountInfo accountInfo,FileSystemInfo fileInfo, FileState fileState)
187 70f12b36 Panagiotis Kanavos
            : this(accountInfo,fileInfo,CreateObjectInfoFor(accountInfo, fileInfo),fileState)
188 e81dd1f6 Panagiotis Kanavos
        {            
189 5120f3cb Panagiotis Kanavos
        }
190 5120f3cb Panagiotis Kanavos
191 e81dd1f6 Panagiotis Kanavos
        public CloudDeleteAction(AccountInfo accountInfo, FileSystemInfo fileInfo,ObjectInfo cloudFile, FileState fileState) 
192 c53aa229 Panagiotis Kanavos
            : base(accountInfo,CloudActionType.DeleteCloud)
193 bfc13ed8 Panagiotis Kanavos
        {
194 bfc13ed8 Panagiotis Kanavos
            CloudFile = cloudFile;
195 e81dd1f6 Panagiotis Kanavos
            LocalFile = fileInfo;
196 5120f3cb Panagiotis Kanavos
            FileState = fileState;
197 1caef52e Panagiotis Kanavos
        }
198 1bfc38f1 Panagiotis Kanavos
199 1bfc38f1 Panagiotis Kanavos
        public CloudDeleteAction(CloudAction action)
200 e81dd1f6 Panagiotis Kanavos
            : this(action.AccountInfo,action.LocalFile,action.CloudFile,action.FileState)
201 1bfc38f1 Panagiotis Kanavos
        {}
202 27361404 Panagiotis Kanavos
203 27361404 Panagiotis Kanavos
        [ContractInvariantMethod]
204 27361404 Panagiotis Kanavos
        private void Invariants()
205 27361404 Panagiotis Kanavos
        {
206 27361404 Panagiotis Kanavos
            Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
207 27361404 Panagiotis Kanavos
        }
208 27361404 Panagiotis Kanavos
209 27361404 Panagiotis Kanavos
        public override string ToString()
210 27361404 Panagiotis Kanavos
        {
211 27361404 Panagiotis Kanavos
            return String.Format("{0}: _ ->{1}", this.Action, this.CloudFile.Name);
212 27361404 Panagiotis Kanavos
        }
213 27361404 Panagiotis Kanavos
214 5120f3cb Panagiotis Kanavos
    }
215 1caef52e Panagiotis Kanavos
216 5120f3cb Panagiotis Kanavos
    public class CloudUploadAction:CloudAction
217 5120f3cb Panagiotis Kanavos
    {
218 4f6d51d4 Panagiotis Kanavos
        public CloudUploadAction(AccountInfo accountInfo, FileSystemInfo fileInfo, FileState state, int blockSize, string algorithm)
219 70f12b36 Panagiotis Kanavos
            : base(accountInfo, CloudActionType.UploadUnconditional,fileInfo,CreateObjectInfoFor(accountInfo,fileInfo),state,blockSize,algorithm)             
220 5120f3cb Panagiotis Kanavos
        {
221 27361404 Panagiotis Kanavos
        }
222 ec6f3895 Panagiotis Kanavos
223 27361404 Panagiotis Kanavos
        [ContractInvariantMethod]
224 27361404 Panagiotis Kanavos
        private void Invariants()
225 27361404 Panagiotis Kanavos
        {
226 27361404 Panagiotis Kanavos
            Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
227 5120f3cb Panagiotis Kanavos
        }
228 27361404 Panagiotis Kanavos
229 5120f3cb Panagiotis Kanavos
    }
230 cfed7823 Panagiotis Kanavos
231 cfed7823 Panagiotis Kanavos
    public class CloudMoveAction:CloudAction
232 cfed7823 Panagiotis Kanavos
    {
233 27361404 Panagiotis Kanavos
        public ObjectInfo OldCloudFile { get; set; }
234 27361404 Panagiotis Kanavos
235 4f6d51d4 Panagiotis Kanavos
        public FileSystemInfo OldLocalFile { get; set; }
236 cfed7823 Panagiotis Kanavos
237 4f6d51d4 Panagiotis Kanavos
        public CloudMoveAction(AccountInfo accountInfo, CloudActionType action, FileSystemInfo oldFile, FileSystemInfo newFile)
238 c53aa229 Panagiotis Kanavos
            :base(accountInfo,action)
239 cfed7823 Panagiotis Kanavos
        {
240 27361404 Panagiotis Kanavos
            LocalFile = newFile;
241 70f12b36 Panagiotis Kanavos
            CloudFile = CreateObjectInfoFor(accountInfo, newFile);
242 27361404 Panagiotis Kanavos
            
243 27361404 Panagiotis Kanavos
            OldLocalFile = oldFile;
244 70f12b36 Panagiotis Kanavos
            OldCloudFile = CreateObjectInfoFor(accountInfo, oldFile);
245 27361404 Panagiotis Kanavos
246 cfed7823 Panagiotis Kanavos
            //This is a rename operation, a hash will not be used
247 cfed7823 Panagiotis Kanavos
            LocalHash = new Lazy<string>(() => String.Empty, LazyThreadSafetyMode.ExecutionAndPublication);
248 cfed7823 Panagiotis Kanavos
        }
249 cfed7823 Panagiotis Kanavos
250 27361404 Panagiotis Kanavos
        public override string ToString()
251 27361404 Panagiotis Kanavos
        {
252 27361404 Panagiotis Kanavos
            return String.Format("{0}:{1}->{2}", this.Action, OldCloudFile.Name, CloudFile.Name);
253 27361404 Panagiotis Kanavos
        }
254 cfed7823 Panagiotis Kanavos
255 1caef52e Panagiotis Kanavos
    }
256 cfed7823 Panagiotis Kanavos
257 1caef52e Panagiotis Kanavos
}