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 FileInfo LocalFile { get; set; }
25 public ObjectInfo CloudFile { get; set; }
26 public FileState FileState { get; set; }
27 public string Container { get; set; }
30 public Lazy<string> LocalHash { get; protected set; }
31 private Lazy<string> _topHash;
32 public Lazy<string> TopHash
34 get { return _topHash; }
35 set { _topHash = value; }
39 [ContractInvariantMethod]
40 private void Invariants()
42 Contract.Invariant(AccountInfo!=null);
45 protected CloudAction(AccountInfo accountInfo,CloudActionType action)
47 if (accountInfo==null)
48 throw new ArgumentNullException("accountInfo");
49 Contract.EndContractBlock();
52 AccountInfo = accountInfo;
55 public CloudAction(AccountInfo accountInfo, CloudActionType action, FileInfo localFile, ObjectInfo cloudFile, FileState state, int blockSize, string algorithm)
56 : this(accountInfo,action)
58 LocalFile = localFile;
59 CloudFile = cloudFile;
61 if (LocalFile != null)
63 LocalHash = new Lazy<string>(() => LocalFile.CalculateHash(blockSize,algorithm),
64 LazyThreadSafetyMode.ExecutionAndPublication);
68 //Calculate the download path for the cloud file
69 public string GetDownloadPath()
71 if (CloudFile == null)
73 var filePath = CloudFile.RelativeUrlToFilePath(AccountInfo.UserName);
74 return Path.Combine(AccountInfo.AccountPath, filePath);
77 public override string ToString()
79 return String.Format("{0}:{1}->{2}", this.Action, this.LocalFile.FullName, this.CloudFile.Name);
83 public class CloudDownloadAction:CloudAction
85 public CloudDownloadAction(AccountInfo accountInfo, ObjectInfo cloudFile)
86 :base(accountInfo,CloudActionType.DownloadUnconditional)
88 if (String.IsNullOrWhiteSpace(cloudFile.Container))
89 throw new ArgumentException("CloudFile.Container","cloudFile");
90 Contract.EndContractBlock();
92 CloudFile = cloudFile;
95 [ContractInvariantMethod]
96 private void Invariants()
98 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
101 public override string ToString()
103 return String.Format("{0}: _ <- {1}", this.Action, this.CloudFile.Name);
107 public class CloudDeleteAction:CloudAction
109 public CloudDeleteAction(AccountInfo accountInfo,FileInfo fileInfo, FileState fileState)
110 : this(accountInfo,new ObjectInfo(accountInfo.AccountPath,accountInfo.UserName,fileInfo),fileState)
114 public CloudDeleteAction(AccountInfo accountInfo, ObjectInfo cloudFile, FileState fileState)
115 : base(accountInfo,CloudActionType.DeleteCloud)
117 CloudFile = cloudFile;
118 FileState = fileState;
121 public CloudDeleteAction(CloudAction action)
122 : this(action.AccountInfo,action.CloudFile,action.FileState)
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);
138 public class CloudUploadAction:CloudAction
140 public CloudUploadAction(AccountInfo accountInfo, FileInfo fileInfo, FileState state, int blockSize, string algorithm)
141 : base(accountInfo, CloudActionType.UploadUnconditional, fileInfo,
142 new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName,fileInfo), state, blockSize, algorithm)
146 [ContractInvariantMethod]
147 private void Invariants()
149 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
154 public class CloudMoveAction:CloudAction
156 public ObjectInfo OldCloudFile { get; set; }
158 public FileInfo OldLocalFile { get; set; }
160 public CloudMoveAction(AccountInfo accountInfo, CloudActionType action, FileInfo oldFile, FileInfo newFile)
161 :base(accountInfo,action)
164 CloudFile = new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, newFile);
166 OldLocalFile = oldFile;
167 OldCloudFile = new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, oldFile);
169 //This is a rename operation, a hash will not be used
170 LocalHash = new Lazy<string>(() => String.Empty, LazyThreadSafetyMode.ExecutionAndPublication);
173 public override string ToString()
175 return String.Format("{0}:{1}->{2}", this.Action, OldCloudFile.Name, CloudFile.Name);