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);
86 public class CloudDownloadAction:CloudAction
88 public CloudDownloadAction(AccountInfo accountInfo, ObjectInfo cloudFile)
89 :base(accountInfo,CloudActionType.DownloadUnconditional)
91 if (String.IsNullOrWhiteSpace(cloudFile.Container))
92 throw new ArgumentException("CloudFile.Container","cloudFile");
93 Contract.EndContractBlock();
95 CloudFile = cloudFile;
98 [ContractInvariantMethod]
99 private void Invariants()
101 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
104 public override string ToString()
106 return String.Format("{0}: _ <- {1}", this.Action, this.CloudFile.Name);
110 public class CloudDeleteAction:CloudAction
112 public CloudDeleteAction(AccountInfo accountInfo,FileSystemInfo fileInfo, FileState fileState)
113 : this(accountInfo,fileInfo,new ObjectInfo(accountInfo.AccountPath,accountInfo.UserName,fileInfo),fileState)
117 public CloudDeleteAction(AccountInfo accountInfo, FileSystemInfo fileInfo,ObjectInfo cloudFile, FileState fileState)
118 : base(accountInfo,CloudActionType.DeleteCloud)
120 CloudFile = cloudFile;
121 LocalFile = fileInfo;
122 FileState = fileState;
125 public CloudDeleteAction(CloudAction action)
126 : this(action.AccountInfo,action.LocalFile,action.CloudFile,action.FileState)
129 [ContractInvariantMethod]
130 private void Invariants()
132 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
135 public override string ToString()
137 return String.Format("{0}: _ ->{1}", this.Action, this.CloudFile.Name);
142 public class CloudUploadAction:CloudAction
144 public CloudUploadAction(AccountInfo accountInfo, FileSystemInfo fileInfo, FileState state, int blockSize, string algorithm)
145 : base(accountInfo, CloudActionType.UploadUnconditional, fileInfo,
146 new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName,fileInfo), state, blockSize, algorithm)
150 [ContractInvariantMethod]
151 private void Invariants()
153 Contract.Invariant(!String.IsNullOrWhiteSpace(CloudFile.Container));
158 public class CloudMoveAction:CloudAction
160 public ObjectInfo OldCloudFile { get; set; }
162 public FileSystemInfo OldLocalFile { get; set; }
164 public CloudMoveAction(AccountInfo accountInfo, CloudActionType action, FileSystemInfo oldFile, FileSystemInfo newFile)
165 :base(accountInfo,action)
168 CloudFile = new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, newFile);
170 OldLocalFile = oldFile;
171 OldCloudFile = new ObjectInfo(accountInfo.AccountPath, accountInfo.UserName, oldFile);
173 //This is a rename operation, a hash will not be used
174 LocalHash = new Lazy<string>(() => String.Empty, LazyThreadSafetyMode.ExecutionAndPublication);
177 public override string ToString()
179 return String.Format("{0}:{1}->{2}", this.Action, OldCloudFile.Name, CloudFile.Name);