using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; using System.Linq; using System.Text; namespace Pithos.Interfaces { [ContractClass(typeof(ICloudClientContract))] public interface ICloudClient { string ApiKey { get; set; } string UserName { get; set; } string StorageUrl { get; set; } string Token { get; set; } void Authenticate(string userName,string apiKey); IList ListContainers(); IList ListObjects(string container); bool ContainerExists(string container); ContainerInfo GetContainerInfo(string container); void CreateContainer(string container); Stream GetObject(string container, string objectName); void PutObject(string container, string objectName, Stream file,long fileSize); void DeleteObject(string container, string objectName); void MoveObject(string container, string oldObjectName, string newObjectName); bool ObjectExists(string container,string objectName); ObjectInfo GetObjectInfo(string container, string objectName); } [ContractClassFor(typeof(ICloudClient))] public abstract class ICloudClientContract:ICloudClient { public string ApiKey { get; set; } public string UserName { get; set; } public string StorageUrl { get; set; } public string Token { get; set; } public void Authenticate(string userName, string apiKey) { Contract.Requires(!String.IsNullOrWhiteSpace(apiKey), "ApiKey must be filled before calling Authenticate"); Contract.Requires(!String.IsNullOrWhiteSpace(userName), "UserName must be filled before calling Authenticate"); Contract.Ensures(apiKey==ApiKey); Contract.Ensures(userName==UserName); Contract.Ensures(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Ensures(!String.IsNullOrWhiteSpace(Token)); } public IList ListContainers() { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); return default(IList); } public IList ListObjects(string container) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); return default(IList); } public bool ContainerExists(string container) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); return default(bool); } public ContainerInfo GetContainerInfo(string container) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); return default(ContainerInfo); } public void CreateContainer(string container) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); } public Stream GetObject(string container, string objectName) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); Contract.Requires(!String.IsNullOrWhiteSpace(objectName)); return default(Stream); } public void PutObject(string container, string objectName, Stream file,long fileSize) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); Contract.Requires(file!=null); Contract.Requires(file.CanRead); Contract.Requires(fileSize>=0); Contract.Requires(!String.IsNullOrWhiteSpace(objectName)); } public void DeleteObject(string container, string objectName) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); Contract.Requires(!String.IsNullOrWhiteSpace(objectName)); } public void MoveObject(string container, string oldObjectName, string newObjectName) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); Contract.Requires(!String.IsNullOrWhiteSpace(oldObjectName)); Contract.Requires(!String.IsNullOrWhiteSpace(newObjectName)); } public bool ObjectExists(string container,string objectName) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); Contract.Requires(!String.IsNullOrWhiteSpace(objectName)); return default(bool); } public ObjectInfo GetObjectInfo(string container,string objectName) { Contract.Requires(!String.IsNullOrWhiteSpace(Token)); Contract.Requires(!String.IsNullOrWhiteSpace(StorageUrl)); Contract.Requires(!String.IsNullOrWhiteSpace(container)); Contract.Requires(!String.IsNullOrWhiteSpace(objectName)); return default(ObjectInfo); } } public class ContainerInfo { public string Name { get; set; } public long Count { get; set; } public long Bytes { get; set; } public static ContainerInfo Empty=new ContainerInfo(); } public class ObjectInfo { public string Name { get; set; } public string Hash { get; set; } public long Bytes { get; set; } public string Content_Type { get; set; } public DateTime Last_Modified { get; set; } public static ObjectInfo Empty=new ObjectInfo {Name=String.Empty,Hash=String.Empty,Bytes=0,Content_Type=String.Empty,Last_Modified=DateTime.MinValue}; } }