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();
            }));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 6
0
        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]);
            }
        }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
        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) }));
        }
Ejemplo n.º 9
0
        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());
        }
Ejemplo n.º 10
0
        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();
            }
        }
Ejemplo n.º 11
0
        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());
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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));
        }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        public long GetTotalChangesCount(ThumbnailTask task, DateTime?changedSince, ICancellationToken token)
        {
            var changedBlobs = GetChangedBlobs(task, changedSince, token);

            return(changedBlobs.Count);
        }
Ejemplo n.º 17
0
        public async Task <ActionResult> UpdateAsync([FromBody] ThumbnailTask tasks)
        {
            await _thumbnailTaskService.SaveChangesAsync(new[] { tasks });

            return(Ok());
        }
Ejemplo n.º 18
0
 private void ClearCache(ThumbnailTask task, bool regenerate)
 {
     BlobChangesCacheRegion.ExpireTaskRun(task, GetChangesSinceDate(task, regenerate));
 }
Ejemplo n.º 19
0
 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));
 }
Ejemplo n.º 21
0
        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));
 }
Ejemplo n.º 23
0
 private static string GetRegionTokenKey(ThumbnailTask task, DateTime?changedSince)
 {
     return(CacheKey.With(task.WorkPath, changedSince?.ToString()));
 }