protected virtual async Task <IList <ImageChange> > GetChangeFiles(ThumbnailTask task, DateTime?changedSince, ICancellationToken token) { var options = await GetOptionsCollection(); var cacheKey = CacheKey.With(GetType(), "GetChangeFiles", task.WorkPath, string.Join(":", options.Select(x => x.FileSuffix))); return(await _platformMemoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { cacheEntry.AddExpirationToken(ThumbnailCacheRegion.CreateChangeToken()); cacheEntry.SetAbsoluteExpiration(TimeSpan.FromMinutes(5)); var allBlobInfos = await ReadBlobFolderAsync(task.WorkPath, token); var orignalBlobInfos = GetOriginalItems(allBlobInfos, options.Select(x => x.FileSuffix).ToList()); var result = new List <ImageChange>(); foreach (var blobInfo in orignalBlobInfos) { token?.ThrowIfCancellationRequested(); var imageChange = new ImageChange { Name = blobInfo.Name, Url = blobInfo.Url, ModifiedDate = blobInfo.ModifiedDate, ChangeState = !changedSince.HasValue ? EntryState.Added : GetItemState(blobInfo, changedSince, task.ThumbnailOptions) }; result.Add(imageChange); } return result.Where(x => x.ChangeState != EntryState.Unchanged).ToList(); })); }
public virtual ThumbnailTaskEntity FromModel(ThumbnailTask task, PrimaryKeyResolvingMap pkMap) { if (task == null) { throw new ArgumentNullException(nameof(task)); } pkMap.AddPair(task, this); Id = task.Id; Name = task.Name; LastRun = task.LastRun; WorkPath = task.WorkPath; CreatedBy = task.CreatedBy; CreatedDate = task.CreatedDate; ModifiedBy = task.ModifiedBy; ModifiedDate = task.ModifiedDate; if (task.ThumbnailOptions != null) { ThumbnailTaskOptions = new ObservableCollection <ThumbnailTaskOptionEntity>(task.ThumbnailOptions.Select(x => FromModel(x, task))); } return(this); }
protected virtual async Task <IList <ImageChange> > GetChangeFiles(ThumbnailTask task, DateTime?changedSince, ICancellationToken token) { var options = await GetOptionsCollection(); var allBlobInfos = await ReadBlobFolderAsync(task.WorkPath, token); var orignalBlobInfos = GetOriginalItems(allBlobInfos, options.Select(x => x.FileSuffix).ToList()); var result = new List <ImageChange>(); foreach (var blobInfo in orignalBlobInfos) { token?.ThrowIfCancellationRequested(); var imageChange = new ImageChange { Name = blobInfo.Name, Url = blobInfo.Url, ModifiedDate = blobInfo.ModifiedDate, ChangeState = !changedSince.HasValue ? EntryState.Added : GetItemState(blobInfo, changedSince, task.ThumbnailOptions) }; result.Add(imageChange); } return(result.Where(x => x.ChangeState != EntryState.Unchanged).ToList()); }
public long GetTotalChangesCount(ThumbnailTask task, DateTime?changedSince, ICancellationToken token) { if (_changeBlobs == null) { _changeBlobs = GetChangeFiles(task, changedSince, token); } return(_changeBlobs.Count); }
public virtual ThumbnailTaskOptionEntity FromModel(ThumbnailOption option, ThumbnailTask task) { var result = new ThumbnailTaskOptionEntity(); result.ThumbnailTaskId = task.Id; result.ThumbnailOptionId = option.Id; return(result); }
public async Task GetNextChangesBatch_TasksWithOneWorkPathAndOptions_CacheIsWorking() { // Arrange var blobContents = new List <BlobEntry>() { new BlobInfo() { Name = "Blob1.png", Url = "testPath/Blob1.png", }, }; var changesProvider = GetBlobImagesChangesProvider(blobContents); var thumbnailOption = new ThumbnailOption() { FileSuffix = OptionSuffix }; var workPath = "testPath"; var task1 = new ThumbnailTask() { Id = Guid.NewGuid().ToString(), LastRun = null, WorkPath = workPath, ThumbnailOptions = new List <ThumbnailOption>() { thumbnailOption }, }; var task2 = new ThumbnailTask() { Id = Guid.NewGuid().ToString(), LastRun = null, WorkPath = workPath, ThumbnailOptions = new List <ThumbnailOption>() { thumbnailOption }, }; var cancellationToken = new CancellationTokenWrapper(new CancellationToken()); // Act var changes1 = await changesProvider.GetNextChangesBatch(task1, null, 0, 10, cancellationToken); var changes2 = await changesProvider.GetNextChangesBatch(task2, null, 0, 10, cancellationToken); //Assert StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Once); Assert.Single(changes1); Assert.Single(changes2); for (var i = 0; i < changes1.Length; i++) { Assert.Same(changes1[i], changes2[i]); } }
public async Task GetNextChangesBatch_TasksWithDifferentWorkPathAndOptions_UseDifferentValues() { // Arrange var blobContents = new List <BlobEntry>() { new BlobInfo() { Name = "Blob1.png", Url = "testPath1/Blob1.png", }, new BlobInfo() { Name = "Blob2.png", Url = "testPath2/Blob2.png", }, }; var changesProvider = GetBlobImagesChangesProvider(blobContents); var thumbnailOption = new ThumbnailOption() { FileSuffix = OptionSuffix }; var task1 = new ThumbnailTask() { Id = Guid.NewGuid().ToString(), LastRun = null, WorkPath = "testPath1", ThumbnailOptions = new List <ThumbnailOption>() { thumbnailOption }, }; var task2 = new ThumbnailTask() { Id = Guid.NewGuid().ToString(), LastRun = null, WorkPath = "testPath2", ThumbnailOptions = new List <ThumbnailOption>() { thumbnailOption }, }; var cancellationToken = new CancellationTokenWrapper(new CancellationToken()); // Act var changes1 = await changesProvider.GetNextChangesBatch(task1, null, 0, 10, cancellationToken); var changes2 = await changesProvider.GetNextChangesBatch(task2, null, 0, 10, cancellationToken); //Assert StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Exactly(2)); Assert.Collection(changes1, x => Assert.Equal("Blob1.png", x.Name)); Assert.Collection(changes2, x => Assert.Equal("Blob2.png", x.Name)); }
public static IChangeToken CreateChangeToken(ThumbnailTask task, DateTime?changedSince) { if (task == null) { throw new ArgumentNullException(nameof(task)); } var regionTokenKey = GetRegionTokenKey(task, changedSince); var cancellationTokenSource = _regionTokenLookup.GetOrAdd(regionTokenKey, new CancellationTokenSource()); return(new CompositeChangeToken(new[] { CreateChangeToken(), new CancellationChangeToken(cancellationTokenSource.Token) })); }
public ImageChange[] GetNextChangesBatch(ThumbnailTask task, DateTime?changedSince, long?skip, long?take, ICancellationToken token) { var changedBlobs = GetChangedBlobs(task, changedSince, token); var count = changedBlobs.Count; if (skip >= count) { return(Array.Empty <ImageChange>()); } return(changedBlobs.Skip((int)skip).Take((int)take).ToArray()); }
public static void ExpireTaskRun(ThumbnailTask task, DateTime?changesSince) { if (task == null) { throw new ArgumentNullException(nameof(task)); } var regionTokenKey = GetRegionTokenKey(task, changesSince); if (_regionTokenLookup.TryRemove(regionTokenKey, out var token)) { token.Cancel(); } }
public async Task <ImageChange[]> GetNextChangesBatch(ThumbnailTask task, DateTime?changedSince, long?skip, long?take, ICancellationToken token) { var changedFiles = await GetChangeFiles(task, changedSince, token); var count = changedFiles.Count; if (skip >= count) { return(Array.Empty <ImageChange>()); } return(changedFiles.Skip((int)(skip ?? 0)).Take((int)(take ?? 0)).ToArray()); }
public ImageChange[] GetNextChangesBatch(ThumbnailTask task, DateTime?changedSince, long?skip, long?take, ICancellationToken token) { if (_changeBlobs == null) { _changeBlobs = GetChangeFiles(task, changedSince, token); } var count = _changeBlobs.Count; if (skip >= count) { return(new ImageChange[] {}); } return(_changeBlobs.Skip((int)skip).Take((int)take).ToArray()); }
public virtual ThumbnailTask ToModel(ThumbnailTask task) { if (task == null) { throw new ArgumentNullException(nameof(task)); } task.Id = Id; task.CreatedBy = CreatedBy; task.CreatedDate = CreatedDate; task.LastRun = LastRun; task.ModifiedBy = ModifiedBy; task.ModifiedDate = ModifiedDate; task.Name = Name; task.WorkPath = WorkPath; task.ThumbnailOptions = ThumbnailTaskOptions.Select(o => o.ThumbnailOption.ToModel(AbstractTypeFactory <ThumbnailOption> .TryCreateInstance())).ToArray(); return(task); }
public async Task ProcessTasksAsync_BlobChangesProviderCache_ExpiredAfterExecution() { // Arrange var blobContents = new List <BlobEntry>() { new BlobInfo() { Name = "Blob1.png", Url = "testPath/Blob1.png", }, }; var imageChangesProvider = GetBlobImagesChangesProvider(blobContents); var thumbnailGenerationProcessor = new ThumbnailGenerationProcessor(_generator.Object, _settingsManager.Object, imageChangesProvider); var thumbnailOption = new ThumbnailOption() { FileSuffix = OptionSuffix }; var workPath = "testPath"; var task1 = new ThumbnailTask() { Id = Guid.NewGuid().ToString(), LastRun = null, WorkPath = workPath, ThumbnailOptions = new List <ThumbnailOption>() { thumbnailOption }, }; var cancellationToken = new CancellationTokenWrapper(new CancellationToken()); // Act await thumbnailGenerationProcessor.ProcessTasksAsync(new[] { task1 }, false, x => { }, cancellationToken); await thumbnailGenerationProcessor.ProcessTasksAsync(new[] { task1 }, false, x => { }, cancellationToken); //Assert StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Exactly(2)); }
public async Task GetNextChangesBatch_TasksWithOneWorkPathAndOptions_CacheIsWorkingWithGetTotalChangesCount() { // Arrange var blobContents = new List <BlobEntry>() { new BlobInfo() { Name = "Blob1.png", Url = "testPath/Blob1.png", }, }; var changesProvider = GetBlobImagesChangesProvider(blobContents); var thumbnailOption = new ThumbnailOption() { FileSuffix = OptionSuffix }; var workPath = "testPath"; var task = new ThumbnailTask() { Id = Guid.NewGuid().ToString(), LastRun = null, WorkPath = workPath, ThumbnailOptions = new List <ThumbnailOption>() { thumbnailOption }, }; var cancellationToken = new CancellationTokenWrapper(new CancellationToken()); // Act var changes = await changesProvider.GetNextChangesBatch(task, null, 0, 10, cancellationToken); var count = await changesProvider.GetTotalChangesCount(task, null, cancellationToken); //Assert StorageProviderMock.Verify(x => x.SearchAsync(It.IsAny <string>(), It.IsAny <string>()), Times.Once); Assert.Collection(changes, x => Assert.Equal("Blob1.png", x.Name)); Assert.Equal(1, count); }
public long GetTotalChangesCount(ThumbnailTask task, DateTime?changedSince, ICancellationToken token) { var changedBlobs = GetChangedBlobs(task, changedSince, token); return(changedBlobs.Count); }
public async Task <ActionResult> UpdateAsync([FromBody] ThumbnailTask tasks) { await _thumbnailTaskService.SaveChangesAsync(new[] { tasks }); return(Ok()); }
private void ClearCache(ThumbnailTask task, bool regenerate) { BlobChangesCacheRegion.ExpireTaskRun(task, GetChangesSinceDate(task, regenerate)); }
private static DateTime?GetChangesSinceDate(ThumbnailTask task, bool regenerate) { return(regenerate ? null : task.LastRun); }
public IHttpActionResult Update(ThumbnailTask tasks) { _thumbnailTaskService.SaveOrUpdate(new[] { tasks }); return(StatusCode(HttpStatusCode.NoContent)); }
public async Task <IActionResult> CreateAsync([FromBody] ThumbnailTask task) { await _thumbnailTaskService.SaveChangesAsync(new[] { task }); return(Ok(task)); }
public IHttpActionResult Create(ThumbnailTask task) { _thumbnailTaskService.SaveOrUpdate(new[] { task }); return(Ok(task)); }
private static string GetRegionTokenKey(ThumbnailTask task, DateTime?changedSince) { return(CacheKey.With(task.WorkPath, changedSince?.ToString())); }