2 using System.Diagnostics.Contracts;
4 using System.Threading;
5 using Pithos.Interfaces;
8 namespace Pithos.Core.Agents
10 public enum CloudActionType
14 DownloadUnconditional,
20 public class CloudAction
22 public AccountInfo AccountInfo { get; set; }
23 public CloudActionType Action { get; set; }
24 public FileSystemInfo LocalFile { get; set; }
25 public ObjectInfo CloudFile { get; set; }
26 public FileState FileState { get; set; }
27 public string Container { get; set; }
29 public readonly DateTime Created = DateTime.Now;
32 public Lazy<string> LocalHash { get; protected set; }
33 private Lazy<string> _topHash;
34 public Lazy<string> TopHash
36 get { return _topHash; }
37 set { _topHash = value; }
41 [ContractInvariantMethod]
42 private void Invariants()
44 Contract.Invariant(AccountInfo!=null);
47 protected CloudAction(AccountInfo accountInfo,CloudActionType action)
49 if (accountInfo==null)
50 throw new ArgumentNullException("accountInfo");
51 Contract.EndContractBlock();
54 AccountInfo = accountInfo;
57 public CloudAction(AccountInfo accountInfo, CloudActionType action, FileSystemInfo localFile, ObjectInfo cloudFile, FileState state, int blockSize, string algorithm)
58 : this(accountInfo,action)
60 LocalFile = localFile.WithProperCapitalization();
61 CloudFile = cloudFile;
63 if (LocalFile != null)
66 LocalHash = new Lazy<string>(() => LocalFile.CalculateHash(blockSize,algorithm),
67 LazyThreadSafetyMode.ExecutionAndPublication);
71 //Calculate the download path for the cloud file
72 public string GetDownloadPath()
74 if (CloudFile == null)
76 var filePath = CloudFile.RelativeUrlToFilePath(AccountInfo.UserName);
77 return Path.Combine(AccountInfo.AccountPath, filePath);
80 public override string ToString()
82 return String.Format("{0}:{1}->{2}", this.Action, this.LocalFile.FullName, this.CloudFile.Name);
85 protected static ObjectInfo CreateObjectInfoFor(AccountInfo accountInfo, FileSystemInfo fileInfo)
87 Contract.Requires(accountInfo!=null);
88 Contract.Requires(fileInfo!=null);
89 Contract.Ensures(Contract.Result<ObjectInfo>()!=null);
91 var capitalizedFileInfo = fileInfo.WithProperCapitalization();
92 var fullLocalName = capitalizedFileInfo.FullName;
93 var othersPath = Path.Combine(accountInfo.AccountPath, FolderConstants.OthersFolder);
95 var isShared = fullLocalName.StartsWith(othersPath, StringComparison.InvariantCultureIgnoreCase);
98 var pathRelativeToOther = fullLocalName.Substring(othersPath.Length + 1);
99 var otherParts = pathRelativeToOther.Split('\\');
100 var otherName = otherParts[0];
101 var otherContainer = otherParts[1];
102 return new ObjectInfo
105 Container = otherContainer,
106 Name = String.Join("/", otherParts.Splice(2))
109 return new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, fileInfo);
113 public class CloudDownloadAction:CloudAction
115 public CloudDownloadAction(AccountInfo accountInfo, ObjectInfo cloudFile)
116 :base(accountInfo,CloudActionType.DownloadUnconditional)
118 if (String.IsNullOrWhiteSpace(cloudFile.Container))
119 throw new ArgumentException("CloudFile.Container","cloudFile");
120 Contract.EndContractBlock();
122 CloudFile = cloudFile;
125 [ContractInvariantMethod]
126 private void Invariants()
128 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
131 public override string ToString()
133 return String.Format("{0}: _ <- {1}", this.Action, this.CloudFile.Name);
137 public class CloudDeleteAction:CloudAction
139 public CloudDeleteAction(AccountInfo accountInfo,FileSystemInfo fileInfo, FileState fileState)
140 : this(accountInfo,fileInfo,CreateObjectInfoFor(accountInfo, fileInfo),fileState)
144 public CloudDeleteAction(AccountInfo accountInfo, FileSystemInfo fileInfo,ObjectInfo cloudFile, FileState fileState)
145 : base(accountInfo,CloudActionType.DeleteCloud)
147 CloudFile = cloudFile;
148 LocalFile = fileInfo;
149 FileState = fileState;
152 public CloudDeleteAction(CloudAction action)
153 : this(action.AccountInfo,action.LocalFile,action.CloudFile,action.FileState)
156 [ContractInvariantMethod]
157 private void Invariants()
159 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
162 public override string ToString()
164 return String.Format("{0}: _ ->{1}", this.Action, this.CloudFile.Name);
169 public class CloudUploadAction:CloudAction
171 public CloudUploadAction(AccountInfo accountInfo, FileSystemInfo fileInfo, FileState state, int blockSize, string algorithm)
172 : base(accountInfo, CloudActionType.UploadUnconditional,fileInfo,CreateObjectInfoFor(accountInfo,fileInfo),state,blockSize,algorithm)
176 [ContractInvariantMethod]
177 private void Invariants()
179 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
184 public class CloudMoveAction:CloudAction
186 public ObjectInfo OldCloudFile { get; set; }
188 public FileSystemInfo OldLocalFile { get; set; }
190 public CloudMoveAction(AccountInfo accountInfo, CloudActionType action, FileSystemInfo oldFile, FileSystemInfo newFile)
191 :base(accountInfo,action)
194 CloudFile = CreateObjectInfoFor(accountInfo, newFile);
196 OldLocalFile = oldFile;
197 OldCloudFile = CreateObjectInfoFor(accountInfo, oldFile);
199 //This is a rename operation, a hash will not be used
200 LocalHash = new Lazy<string>(() => String.Empty, LazyThreadSafetyMode.ExecutionAndPublication);
203 public override string ToString()
205 return String.Format("{0}:{1}->{2}", this.Action, OldCloudFile.Name, CloudFile.Name);