Esempio n. 1
0
        /// <summary>
        /// Creates instance of <see cref="IFileFsClient"/>.
        /// </summary>
        /// <param name="fileFsStoragePath">Path to FileFS storage file.</param>
        /// <param name="options">Options for FileFS client.</param>
        /// <param name="logger">Logger instance.</param>
        /// <returns>Instance of <see cref="IFileFsClient"/>.</returns>
        public static IFileFsClient Create(string fileFsStoragePath, FileFsClientOptions options, ILogger logger)
        {
            ITransactionWrapper CreateTransactionWrapper(bool enableTransactions) =>
            enableTransactions
                    ? (ITransactionWrapper) new TransactionWrapper(fileFsStoragePath, logger)
                    : (ITransactionWrapper) new NullTransactionWrapper();

            FileFsClientOptionsValidator.Validate(options);

            var storageStreamProvider = new StorageStreamProvider(fileFsStoragePath, logger);
            var connection            = new StorageConnection(storageStreamProvider, options.ByteBufferSize, logger);

            var filesystemDescriptorSerializer = new FilesystemDescriptorSerializer(logger);
            var filesystemDescriptorAccessor   = new FilesystemDescriptorAccessor(connection, filesystemDescriptorSerializer, logger);

            var entryDescriptorSerializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger);
            var entryDescriptorRepository = new EntryDescriptorRepository(connection, filesystemDescriptorAccessor, entryDescriptorSerializer, logger);

            var operationLocker = new StorageOperationLocker();
            var optimizer       = new StorageOptimizer(connection, entryDescriptorRepository, filesystemDescriptorAccessor, operationLocker, logger);
            var extender        = new StorageExtender(connection, filesystemDescriptorAccessor, operationLocker, logger);
            var allocator       = new FileAllocator(connection, filesystemDescriptorAccessor, entryDescriptorRepository, optimizer, extender, operationLocker, logger);

            var entryRepository     = new EntryRepository(filesystemDescriptorAccessor, entryDescriptorRepository, logger);
            var fileRepository      = new FileRepository(connection, allocator, filesystemDescriptorAccessor, entryDescriptorRepository, logger);
            var directoryRepository = new DirectoryRepository(filesystemDescriptorAccessor, entryDescriptorRepository, logger);

            var externalFileManager = new ExternalFileManager(logger);
            var transactionWrapper  = CreateTransactionWrapper(options.EnableTransactions);

            var client = new FileFsClient(fileRepository, directoryRepository, entryRepository, externalFileManager, optimizer, transactionWrapper, operationLocker);

            return(client);
        }
        /// <summary>
        /// Creates instance of <see cref="IStorageInitializer"/>.
        /// </summary>
        /// <param name="fileFsStoragePath">Path to FileFS storage file.</param>
        /// <param name="logger">Logger instance.</param>
        /// <returns>Instance of <see cref="IStorageInitializer"/>.</returns>
        public static IStorageInitializer Create(string fileFsStoragePath, ILogger logger)
        {
            var storageStreamProvider          = new StorageStreamProvider(fileFsStoragePath, logger);
            var connection                     = new StorageConnection(storageStreamProvider, 4096, logger);
            var filesystemDescriptorSerializer = new FilesystemDescriptorSerializer(logger);
            var filesystemDescriptorAccessor   = new FilesystemDescriptorAccessor(connection, filesystemDescriptorSerializer, logger);
            var entryDescriptorSerializer      = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger);
            var entryDescriptorRepository      = new EntryDescriptorRepository(connection, filesystemDescriptorAccessor, entryDescriptorSerializer, logger);
            var operationLocker                = new StorageOperationLocker();
            var storageInitializer             =
                new StorageInitializer(connection, operationLocker, filesystemDescriptorAccessor, entryDescriptorRepository, logger);

            return(storageInitializer);
        }
Esempio n. 3
0
        public void ToBuffer_ShouldCreatedCorrectBufferWithData(int fileDescriptorLength, string fileName, long createdOn, long updatedOn, int dataOffset, int dataLength, EntryType type)
        {
            // Arrange
            var id                           = Guid.NewGuid();
            var parentId                     = Guid.NewGuid();
            var filesystemDescriptor         = new FilesystemDescriptor(0, 0, fileDescriptorLength);
            var fileDescriptor               = new EntryDescriptor(id, parentId, fileName, type, createdOn, updatedOn, dataOffset, dataLength);
            var logger                       = new LoggerConfiguration().CreateLogger();
            var filesystemDescriptorAccessor = CreateFilesystemDescriptorAccessor(filesystemDescriptor);
            var serializer                   = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger);

            // Act
            var buffer = serializer.ToBytes(fileDescriptor);

            // Assert
            using var memoryStream = new MemoryStream(buffer);
            using var reader       = new BinaryReader(memoryStream);

            var writtenIdBytes        = reader.ReadGuidBytes();
            var writtenId             = new Guid(writtenIdBytes);
            var writtenParentIdBytes  = reader.ReadGuidBytes();
            var writtenParentId       = new Guid(writtenParentIdBytes);
            var writtenStringLength   = reader.ReadInt32();
            var writtenEntryNameBytes = reader.ReadBytes(writtenStringLength);
            var writtenEntryName      = Encoding.UTF8.GetString(writtenEntryNameBytes);

            memoryStream.Seek(filesystemDescriptor.EntryDescriptorLength - writtenStringLength - EntryDescriptor.BytesWithoutFilename, SeekOrigin.Current);
            var writtenType       = (EntryType)reader.ReadByte();
            var writtenCreatedOn  = reader.ReadInt64();
            var writtenUpdatedOn  = reader.ReadInt64();
            var writtenDataOffset = reader.ReadInt32();
            var writtenDataLength = reader.ReadInt32();

            Assert.Equal(id, writtenId);
            Assert.Equal(parentId, writtenParentId);
            Assert.Equal(fileDescriptorLength, buffer.Length);
            Assert.Equal(fileName, writtenEntryName);
            Assert.Equal(type, writtenType);
            Assert.Equal(createdOn, writtenCreatedOn);
            Assert.Equal(updatedOn, writtenUpdatedOn);
            Assert.Equal(dataOffset, writtenDataOffset);
            Assert.Equal(dataLength, writtenDataLength);
        }
Esempio n. 4
0
        public void FromBuffer_ShouldCreatedCorrectModelFromBuffer(int fileDescriptorLength, string entryName, long createdOn, long updatedOn, int dataOffset, int dataLength, EntryType type)
        {
            // Arrange
            var filesystemDescriptor = new FilesystemDescriptor(0, 0, fileDescriptorLength);
            var logger = new LoggerConfiguration().CreateLogger();
            var filesystemDescriptorAccessor = CreateFilesystemDescriptorAccessor(filesystemDescriptor);
            var serializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger);
            var buffer     = new byte[fileDescriptorLength];
            var id         = Guid.NewGuid();
            var parentId   = Guid.NewGuid();

            using var memoryStream = new MemoryStream(buffer);
            using var writer       = new BinaryWriter(memoryStream);

            writer.Write(id.ToByteArray());
            writer.Write(parentId.ToByteArray());
            var entryNameBytes = Encoding.UTF8.GetBytes(entryName);

            writer.Write(entryName.Length);
            writer.Write(entryNameBytes);
            writer.Seek(filesystemDescriptor.EntryDescriptorLength - entryNameBytes.Length - EntryDescriptor.BytesWithoutFilename, SeekOrigin.Current);
            writer.Write((byte)type);
            writer.Write(createdOn);
            writer.Write(updatedOn);
            writer.Write(dataOffset);
            writer.Write(dataLength);

            // Act
            var entryDescriptor = serializer.FromBytes(buffer);

            // Assert
            Assert.Equal(id, entryDescriptor.Id);
            Assert.Equal(parentId, entryDescriptor.ParentId);
            Assert.Equal(entryNameBytes.Length, entryDescriptor.NameLength);
            Assert.Equal(entryNameBytes.Length, entryDescriptor.NameLength);
            Assert.Equal(entryName, entryDescriptor.Name);
            Assert.Equal(type, entryDescriptor.Type);
            Assert.Equal(createdOn, entryDescriptor.CreatedOn);
            Assert.Equal(updatedOn, entryDescriptor.UpdatedOn);
            Assert.Equal(dataOffset, entryDescriptor.DataOffset);
            Assert.Equal(dataLength, entryDescriptor.DataLength);
        }