DocSpace-client/thirdparty/AppLimit.CloudComputing.SharpBox/StorageProvider/CachedServiceWrapper.cs
2020-03-13 16:40:58 +03:00

167 lines
7.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using AppLimit.CloudComputing.SharpBox.Common.Cache;
using AppLimit.CloudComputing.SharpBox.StorageProvider.API;
namespace AppLimit.CloudComputing.SharpBox.StorageProvider
{
public class CachedServiceWrapper : IStorageProviderService
{
private static readonly CachedDictionary<ICloudFileSystemEntry> FsCache =
new CachedDictionary<ICloudFileSystemEntry>("sbox-fs", TimeSpan.FromSeconds(120), TimeSpan.Zero, x => x != null);
private readonly IStorageProviderService _service;
public CachedServiceWrapper(IStorageProviderService service)
{
if (service == null)
throw new ArgumentNullException("service");
_service = service;
}
public bool VerifyAccessTokenType(ICloudStorageAccessToken token)
{
return _service.VerifyAccessTokenType(token);
}
public IStorageProviderSession CreateSession(ICloudStorageAccessToken token, ICloudStorageConfiguration configuration)
{
return _service.CreateSession(token, configuration);
}
public void CloseSession(IStorageProviderSession session)
{
FsCache.Reset(GetSessionKey(session), string.Empty);
_service.CloseSession(session);
}
public CloudStorageLimits GetLimits(IStorageProviderSession session)
{
return _service.GetLimits(session);
}
public ICloudFileSystemEntry RequestResource(IStorageProviderSession session, string name, ICloudDirectoryEntry parent)
{
return FsCache.Get(GetSessionKey(session), GetCacheKey(session, name, parent), () => _service.RequestResource(session, name, parent));
}
private static string GetSessionKey(IStorageProviderSession session)
{
return session.GetType().Name + " " + session.SessionToken;
}
private string GetCacheKey(IStorageProviderSession session, string nameOrId, ICloudFileSystemEntry parent)
{
return GetResourceUrl(session, parent, nameOrId);
}
public void RefreshResource(IStorageProviderSession session, ICloudFileSystemEntry resource)
{
var cached = FsCache.Get(GetSessionKey(session), GetCacheKey(session, null, resource), null) as ICloudDirectoryEntry;
if (cached == null || cached.HasChildrens == nChildState.HasNotEvaluated)
{
_service.RefreshResource(session, resource);
FsCache.Add(GetSessionKey(session), GetCacheKey(session, null, resource), resource);
}
}
public ICloudFileSystemEntry CreateResource(IStorageProviderSession session, string name, ICloudDirectoryEntry parent)
{
return _service.CreateResource(session, name, parent);
}
public bool DeleteResource(IStorageProviderSession session, ICloudFileSystemEntry entry)
{
FsCache.Reset(GetSessionKey(session), string.Empty);
return _service.DeleteResource(session, entry);
}
public bool MoveResource(IStorageProviderSession session, ICloudFileSystemEntry fsentry, ICloudDirectoryEntry newParent)
{
FsCache.Reset(GetSessionKey(session), string.Empty);
return _service.MoveResource(session, fsentry, newParent);
}
public bool CopyResource(IStorageProviderSession session, ICloudFileSystemEntry fsentry, ICloudDirectoryEntry newParent)
{
FsCache.Reset(GetSessionKey(session), string.Empty);
return _service.CopyResource(session, fsentry, newParent);
}
public bool RenameResource(IStorageProviderSession session, ICloudFileSystemEntry fsentry, string newName)
{
FsCache.Reset(GetSessionKey(session), string.Empty);
return _service.RenameResource(session, fsentry, newName);
}
public void StoreToken(IStorageProviderSession session, Dictionary<string, string> tokendata, ICloudStorageAccessToken token)
{
_service.StoreToken(session, tokendata, token);
}
public ICloudStorageAccessToken LoadToken(Dictionary<string, string> tokendata)
{
return _service.LoadToken(tokendata);
}
public string GetResourceUrl(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry, string additionalPath)
{
return _service.GetResourceUrl(session, fileSystemEntry, additionalPath);
}
public void DownloadResourceContent(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry, Stream targetDataStream, FileOperationProgressChanged progressCallback, object progressContext)
{
_service.DownloadResourceContent(session, fileSystemEntry, targetDataStream, progressCallback, progressContext);
}
public Stream CreateDownloadStream(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry)
{
return _service.CreateDownloadStream(session, fileSystemEntry);
}
public void CommitStreamOperation(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry, nTransferDirection direction, Stream notDisposedStream)
{
_service.CommitStreamOperation(session, fileSystemEntry, direction, notDisposedStream);
}
public void UploadResourceContent(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry, Stream targetDataStream, FileOperationProgressChanged progressCallback, object progressContext)
{
_service.UploadResourceContent(session, fileSystemEntry, targetDataStream, progressCallback, progressContext);
}
public Stream CreateUploadStream(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry, long uploadSize)
{
return _service.CreateUploadStream(session, fileSystemEntry, uploadSize);
}
public bool SupportsDirectRetrieve
{
get { return _service.SupportsDirectRetrieve; }
}
public bool SupportsChunking
{
get { return _service.SupportsChunking; }
}
public IResumableUploadSession CreateUploadSession(IStorageProviderSession session, ICloudFileSystemEntry fileSystemEntry, long bytesToTransfer)
{
return _service.CreateUploadSession(session, fileSystemEntry, bytesToTransfer);
}
public void AbortUploadSession(IStorageProviderSession session, IResumableUploadSession uploadSession)
{
_service.AbortUploadSession(session, uploadSession);
}
public void UploadChunk(IStorageProviderSession session, IResumableUploadSession uploadSession, Stream stream, long chunkLength)
{
_service.UploadChunk(session, uploadSession, stream, chunkLength);
}
}
}