Example #1
0
        public NonEmptyDiskBlockEnumerator(
            IVirtualDisk disk,
            DataStreamDefinition dataStreamDefinition,
            AddressingSystemParameters addressingSystemParameters,
            IFileSystemNodeStorage fileSystemNodeStorage,
            Node streamOwningNode,
            EnumeratorAddressable <int> doubleIndirectListEnumerator)
        {
            if (disk == null)
            {
                throw new ArgumentNullException("disk");
            }
            if (dataStreamDefinition == null)
            {
                throw new ArgumentNullException("dataStreamDefinition");
            }
            if (addressingSystemParameters == null)
            {
                throw new ArgumentNullException("addressingSystemParameters");
            }
            if (fileSystemNodeStorage == null)
            {
                throw new ArgumentNullException("fileSystemNodeStorage");
            }
            if (streamOwningNode == null)
            {
                throw new ArgumentNullException("streamOwningNode");
            }
            if (doubleIndirectListEnumerator == null)
            {
                throw new ArgumentNullException("doubleIndirectListEnumerator");
            }

            _disk = disk;
            _dataStreamDefinition         = dataStreamDefinition;
            _addressingSystemParameters   = addressingSystemParameters;
            _fileSystemNodeStorage        = fileSystemNodeStorage;
            _streamOwningNode             = streamOwningNode;
            _doubleIndirectListEnumerator = doubleIndirectListEnumerator;

            if (doubleIndirectListEnumerator.Count == 0)
            {
                throw new ArgumentException("doubleIndirectListEnumerator");
            }

            _numberOfBlocks =
                SpaceRequirementsCalculator.GetNumberOfChunksNeededToStoreData(_dataStreamDefinition.StreamLengthInBytes, _disk.BlockSizeInBytes);

            _blockSizesCalculator = new AddressingBlockSizesCalculator(addressingSystemParameters.IndirectBlockReferencesCountInDoubleIndirectBlock,
                                                                       addressingSystemParameters.DataBlockReferencesCountInSingleIndirectBlock);

            _addressingSystemSizesOfLastBlocks = _blockSizesCalculator.GetSizesOfAddressingBlocksSufficientToStoreItems(_numberOfBlocks);

            this.SetFirstSingleIndirectBlock();

            _current = new NullDiskBlock();

            _position = PositionBeforeFirstElement;
        }
Example #2
0
        public DataStreamStructureBuilderImmutable(IVirtualDisk disk, DataStreamDefinition dataStreamDefinition, AddressingSystemParameters addressingSystemParameters, IFileSystemNodeStorage fileSystemNodeStorage, Node governingNode)
        {
            if (disk == null)
            {
                throw new ArgumentNullException("disk");
            }
            if (dataStreamDefinition == null)
            {
                throw new ArgumentNullException("dataStreamDefinition");
            }
            if (addressingSystemParameters == null)
            {
                throw new ArgumentNullException("addressingSystemParameters");
            }
            if (fileSystemNodeStorage == null)
            {
                throw new ArgumentNullException("fileSystemNodeStorage");
            }
            if (governingNode == null)
            {
                throw new ArgumentNullException("governingNode");
            }

            _disk                       = disk;
            _governingNode              = governingNode;
            _fileSystemNodeStorage      = fileSystemNodeStorage;
            _addressingSystemParameters = addressingSystemParameters;
            _dataStreamDefinition       = dataStreamDefinition;

            int numberOfBlocks =
                SpaceRequirementsCalculator.GetNumberOfChunksNeededToStoreData(
                    dataStreamDefinition.StreamLengthInBytes, addressingSystemParameters.BlockSize);

            _addressingBlockSizesCalculator = new AddressingBlockSizesCalculator(addressingSystemParameters.IndirectBlockReferencesCountInDoubleIndirectBlock,
                                                                                 addressingSystemParameters.DataBlockReferencesCountInSingleIndirectBlock);

            _sizesOfLastAddressingBlocks = AddressingBlockSizesCalculator.GetSizesOfAddressingBlocksSufficientToStoreItems(numberOfBlocks);

            int doubleIndirectBlockSize = _sizesOfLastAddressingBlocks.DoubleIndirectBlockSize;

            _doubleIndirectBlocks = new IntegerListConstrained(disk.ReadAllBytesFromBlock(dataStreamDefinition.ContentsBlockIndex), doubleIndirectBlockSize, _addressingSystemParameters.IndirectBlockReferencesCountInDoubleIndirectBlock);

            CalculateAndSetMaximumSize(addressingSystemParameters);
        }
        public DataStreamNodeUpdating(DataStreamReadableWritable dataStream, Node streamOwningNode, IFileSystemNodeStorage fileSystemNodeStorage)
        {
            if (dataStream == null)
            {
                throw new ArgumentNullException("dataStream");
            }
            if (streamOwningNode == null)
            {
                throw new ArgumentNullException("streamOwningNode");
            }
            if (fileSystemNodeStorage == null)
            {
                throw new ArgumentNullException("fileSystemNodeStorage");
            }

            _dataStream            = dataStream;
            _streamOwningNode      = streamOwningNode;
            _fileSystemNodeStorage = fileSystemNodeStorage;
        }
        public AllCollaborators(IVirtualDisk disk, IFileSystemNodeStorage diskStructuresManager, IFileSystemArtifactNamesValidator nameValidator, IPathValidator pathValidator, NodeResolver nodeResolver, VirtualFileSystem virtualFileSystem, FileInfo fileNodeFake, Stream stream)
        {
            if (disk == null)
            {
                throw new ArgumentNullException("disk");
            }
            if (diskStructuresManager == null)
            {
                throw new ArgumentNullException("diskStructuresManager");
            }
            if (nameValidator == null)
            {
                throw new ArgumentNullException("nameValidator");
            }
            if (pathValidator == null)
            {
                throw new ArgumentNullException("pathValidator");
            }
            if (nodeResolver == null)
            {
                throw new ArgumentNullException("nodeResolver");
            }
            if (virtualFileSystem == null)
            {
                throw new ArgumentNullException("virtualFileSystem");
            }
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            Disk = disk;
            DiskStructuresManager = diskStructuresManager;
            NameValidator         = nameValidator;
            PathValidator         = pathValidator;
            NodeResolver          = nodeResolver;
            VirtualFileSystem     = virtualFileSystem;
            FileNodeFake          = fileNodeFake;
            Stream = stream;
        }
        public DiskBlockNodeUpdating(IDiskBlock diskBlockWrapped, DataStreamDefinition owningStreamDefinition, Node blockOwningNode, IFileSystemNodeStorage fileSystemNodeStorage)
        {
            if (diskBlockWrapped == null)
            {
                throw new ArgumentNullException("diskBlockWrapped");
            }
            if (owningStreamDefinition == null)
            {
                throw new ArgumentNullException("owningStreamDefinition");
            }
            if (blockOwningNode == null)
            {
                throw new ArgumentNullException("blockOwningNode");
            }
            if (fileSystemNodeStorage == null)
            {
                throw new ArgumentNullException("fileSystemNodeStorage");
            }

            _diskBlockWrapped       = diskBlockWrapped;
            _owningStreamDefinition = owningStreamDefinition;
            _blockOwningNode        = blockOwningNode;
            _fileSystemNodeStorage  = fileSystemNodeStorage;
        }
        public DataStreamTestCollaboratorSet(IVirtualDisk disk, IFileSystemNodeStorage fileSystemNodeStorage, FileInfo fileInfo, VirtualFileSystem virtualFileSystem)
        {
            if (disk == null)
            {
                throw new ArgumentNullException("disk");
            }
            if (fileSystemNodeStorage == null)
            {
                throw new ArgumentNullException("fileSystemNodeStorage");
            }
            if (fileInfo == null)
            {
                throw new ArgumentNullException("fileInfo");
            }
            if (virtualFileSystem == null)
            {
                throw new ArgumentNullException("virtualFileSystem");
            }

            Disk = disk;
            FileSystemNodeStorage = fileSystemNodeStorage;
            FileInfo          = fileInfo;
            VirtualFileSystem = virtualFileSystem;
        }
Example #7
0
        public void MakeSureStructureBuilderAllocatesExactlyTheNumberOfBlocksNeededToStoreTheData()
        {
            var testCollaborators = TestCollaboratorsFactory.CreateCollaboratorsForTestingDataStreamStructureBuilder();

            MockRepository mocks = new MockRepository();

            IFreeBlockManager freeBlockManager = mocks.DynamicMock <IFreeBlockManager>();

            IFileSystemNodeStorage nodeStorageStub = mocks.Stub <IFileSystemNodeStorage>();

            int freeBlockCounter            = 25;
            int numberOfFreeBlocksAllocated = 0;

            using (mocks.Unordered())
            {
                Expect.Call(freeBlockManager.AcquireFreeBlocks(1)).IgnoreArguments().Do(
                    new Func <int, ReadOnlyCollection <int> >(delegate(int i)
                {
                    var blocks = new List <int>();

                    for (int j = 0; j < i; j++)
                    {
                        blocks.Add(freeBlockCounter);
                        freeBlockCounter++;
                    }

                    numberOfFreeBlocksAllocated += i;

                    return(blocks.AsReadOnly());
                }));

                Expect.Call(freeBlockManager.AcquireFreeBlock()).IgnoreArguments().Do(
                    new Func <int>(delegate
                {
                    freeBlockCounter++;
                    numberOfFreeBlocksAllocated++;
                    return(freeBlockCounter);
                }));
            }

            mocks.ReplayAll();

            var dataStreamStructureBuilder =
                new TestDataStreamStructureBuilder(
                    testCollaborators.FileNode.ResolvedNode.FileContentsStreamDefinition,
                    testCollaborators.Disk,
                    freeBlockManager,
                    nodeStorageStub,
                    testCollaborators.FileNode.ResolvedNode,
                    AddressingSystemParameters.Default);

            Assert.AreEqual(0, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(1000);

            Assert.AreEqual(1000, dataStreamStructureBuilder.CurrentSize);

            var diskStructureEnumerator = dataStreamStructureBuilder.CreateEnumerator();

            Assert.AreEqual(2, numberOfFreeBlocksAllocated);   // один для данных, другой - под single indirect block

            Assert.AreEqual(1, diskStructureEnumerator.Count); // количество дисковых блоков = 1
            Assert.AreEqual(1, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(1500);
            Assert.AreEqual(1500, dataStreamStructureBuilder.CurrentSize);

            dataStreamStructureBuilder.SetSize(2000);

            Assert.AreEqual(2000, dataStreamStructureBuilder.CurrentSize);

            diskStructureEnumerator = dataStreamStructureBuilder.CreateEnumerator();

            Assert.AreEqual(2, numberOfFreeBlocksAllocated);

            Assert.AreEqual(1, diskStructureEnumerator.Count); // количество дисковых блоков = 1
            Assert.AreEqual(1, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(2048);
            Assert.AreEqual(2048, dataStreamStructureBuilder.CurrentSize);

            diskStructureEnumerator = dataStreamStructureBuilder.CreateEnumerator();

            Assert.AreEqual(2, numberOfFreeBlocksAllocated);   // оверхед системы адресации - еще один блок.

            Assert.AreEqual(1, diskStructureEnumerator.Count); // количество дисковых блоков = 2
            Assert.AreEqual(1, dataStreamStructureBuilder.DoubleIndirectBlocks.Count);

            dataStreamStructureBuilder.SetSize(testCollaborators.Disk.BlockSizeInBytes * (testCollaborators.Disk.BlockSizeInBytes / 4) * 3);

            Assert.AreEqual((testCollaborators.Disk.BlockSizeInBytes / 4) * 3 + 3, numberOfFreeBlocksAllocated);

            dataStreamStructureBuilder.SetSize(testCollaborators.Disk.BlockSizeInBytes * (testCollaborators.Disk.BlockSizeInBytes / 4) * 5);
        }
Example #8
0
 public TestDataStreamStructureBuilder(DataStreamDefinition dataStreamDefinition, IVirtualDisk disk, IFreeBlockManager freeBlockManager, IFileSystemNodeStorage fileSystemNodeStorage, Node governingNode, AddressingSystemParameters addressingSystemParameters)
     : base(dataStreamDefinition, disk, freeBlockManager, fileSystemNodeStorage, governingNode, addressingSystemParameters)
 {
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="dataStreamDefinition"></param>
        /// <param name="disk"></param>
        /// <param name="freeBlockManager"></param>
        /// <param name="fileSystemNodeStorage"></param>
        /// <param name="governingNode"></param>
        /// <param name="addressingSystemParameters"></param>
        /// <exception cref="ArgumentNullException"></exception>
        public DataStreamStructureBuilder(DataStreamDefinition dataStreamDefinition, IVirtualDisk disk, IFreeBlockManager freeBlockManager, IFileSystemNodeStorage fileSystemNodeStorage, Node governingNode, AddressingSystemParameters addressingSystemParameters)
            : base(disk, dataStreamDefinition, addressingSystemParameters, fileSystemNodeStorage, governingNode)
        {
            if (freeBlockManager == null)
            {
                throw new ArgumentNullException("freeBlockManager");
            }

            _freeBlockManager = freeBlockManager;
        }