Пример #1
0
        /// <summary>
        /// Event handler for handling data on a given target table.
        /// </summary>
        /// <param name="sender">Object which raises the event.</param>
        /// <param name="eventArgs">Arguments to the event.</param>
        private void HandleDataForTargetTable(object sender, IHandleDataEventArgs eventArgs)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (eventArgs == null)
            {
                throw new ArgumentNullException("eventArgs");
            }
            var table     = eventArgs.Table;
            var tableData = new Dictionary <ITable, IEnumerable <IEnumerable <IDataObjectBase> > >
            {
                { table, eventArgs.Data }
            };
            var tuple       = _tableInformations[table];
            var dataSource  = tuple.Item1;
            var command     = tuple.Item2;
            var tableWorker = tuple.Item3;

            if (tableWorker.CancellationPending)
            {
                throw new ThreadInterruptedException();
            }

            // Validate received data for the target table.
            if (DataValidators.Any())
            {
                IValidateDataInTargetTableEventArgs validateDataInTargetTableEventArgs;
                lock (_syncRoot)
                {
                    validateDataInTargetTableEventArgs = new ValidateDataInTargetTableEventArgs(dataSource, table, _tableDataBlock[table], tableData.Select(m => m.Value).Sum(m => m.Count()));
                }
                RaiseEvent(BeforeValidateDataInTargetTable, validateDataInTargetTableEventArgs);
                var validationWorkers = new Collection <BackgroundWorker>();
                try
                {
                    foreach (var dataValidator in DataValidators)
                    {
                        if (tableWorker.CancellationPending)
                        {
                            throw new ThreadInterruptedException();
                        }
                        var validationWorker = new BackgroundWorker
                        {
                            WorkerReportsProgress      = false,
                            WorkerSupportsCancellation = true
                        };
                        validationWorker.DoWork             += ValidationDoWork;
                        validationWorker.RunWorkerCompleted += WorkerCompleted;
                        validationWorker.Disposed           += (s, e) => validationWorkers.Remove((BackgroundWorker)s);
                        validationWorkers.Add(validationWorker);
                        validationWorker.RunWorkerAsync(new Tuple <IDataValidator, ITable, IDictionary <ITable, IEnumerable <IEnumerable <IDataObjectBase> > >, bool, IDeliveryEngineExecuteCommand>(dataValidator, table, tableData, eventArgs.EndOfData, command));
                    }
                    while (validationWorkers.Any(m => m.IsBusy))
                    {
                        if (tableWorker.CancellationPending)
                        {
                            throw new ThreadInterruptedException();
                        }
                        Thread.Sleep(250);
                    }
                }
                finally
                {
                    foreach (var validationWorker in validationWorkers.Where(m => m.IsBusy))
                    {
                        validationWorker.CancelAsync();
                    }
                    while (validationWorkers.Any(m => m.IsBusy))
                    {
                        Thread.Sleep(250);
                    }
                    while (validationWorkers.Count > 0)
                    {
                        var validationWorker = validationWorkers.ElementAt(0);
                        validationWorker.Dispose();
                        validationWorkers.Remove(validationWorker);
                    }
                }
            }
            if (tableWorker.CancellationPending)
            {
                throw new ThreadInterruptedException();
            }

            // Archive the received data for the target table.
            if (command.ValidationOnly == false)
            {
                IArchiveDataForTargetTableEventArgs archiveDataForTargetTableEventArgs;
                lock (_syncRoot)
                {
                    archiveDataForTargetTableEventArgs = new ArchiveDataForTargetTableEventArgs(dataSource, table, _tableDataBlock[table], tableData.Select(m => m.Value).Sum(m => m.Count()));
                }
                RaiseEvent(BeforeArchiveDataForTargetTable, archiveDataForTargetTableEventArgs);
                ArchiveVersionRepository.ArchiveTableData(tableData, command.IncludeEmptyTables, _syncRoot);
            }
            if (tableWorker.CancellationPending)
            {
                throw new ThreadInterruptedException();
            }
            if (eventArgs.EndOfData)
            {
                return;
            }
            IGetDataForTargetTableEventArgs getDataForTargetTableEventArgs;

            lock (_syncRoot)
            {
                _tableDataBlock[table]        += 1;
                getDataForTargetTableEventArgs = new GetDataForTargetTableEventArgs(dataSource, table, _tableDataBlock[table]);
            }
            RaiseEvent(BeforeGetDataForTargetTable, getDataForTargetTableEventArgs);
        }
        private IDeliveryEngine CreateSut(bool useDataValidators, IExceptionHandler exceptionHandler)
        {
            if (exceptionHandler == null)
            {
                throw new ArgumentNullException(nameof(exceptionHandler));
            }

            IContainer containerMock = MockRepository.GenerateMock <IContainer>();

            IInformationLogger informationLoggerMock = MockRepository.GenerateMock <IInformationLogger>();

            informationLoggerMock.Expect(m => m.LogInformation(Arg <string> .Is.NotNull))
            .WhenCalled(e => Debug.WriteLine(e.Arguments.ElementAt(0)))
            .Repeat.Any();
            informationLoggerMock.Expect(m => m.LogWarning(Arg <string> .Is.NotNull))
            .WhenCalled(e => Debug.WriteLine(e.Arguments.ElementAt(0)))
            .Repeat.Any();

            IConfigurationRepository configurationRepositoryMock = MockRepository.GenerateMock <IConfigurationRepository>();
            IMetadataRepository      metadataRepository          = new OldToNewMetadataRepository(RepositoryTestHelper.GetSourcePathForOracleTest(), new ConfigurationValues());

            containerMock.Expect(m => m.Resolve <IMetadataRepository>())
            .Return(metadataRepository)
            .Repeat.Any();

            ICollection <IDataManipulator> dataManipulatorCollection;

            using (var windsorContainer = new WindsorContainer())
            {
                windsorContainer.Register(Component.For <IContainer>().Instance(containerMock).LifeStyle.Transient);
                windsorContainer.Register(Component.For <IInformationLogger>().Instance(informationLoggerMock).LifeStyle.Transient);
                windsorContainer.Register(Component.For <IMetadataRepository>().Instance(metadataRepository).LifeStyle.Transient);

                IConfigurationProvider dataManipulatorsConfigurationProvider = new DataManipulatorsConfigurationProvider();
                dataManipulatorsConfigurationProvider.AddConfiguration(windsorContainer);

                dataManipulatorCollection = windsorContainer.ResolveAll <IDataManipulator>();
                windsorContainer.Dispose();
            }
            containerMock.Expect(m => m.ResolveAll <IDataManipulator>())
            .Return(dataManipulatorCollection.ToArray())
            .Repeat.Any();
            IDataRepository dataRepository = new OracleDataRepository(new OracleClientFactory(), new DataManipulators(containerMock));

            containerMock.Expect(m => m.Resolve <IDataRepository>())
            .Return(dataRepository)
            .Repeat.Any();
            IDocumentRepository       documentRepositoryMock = MockRepository.GenerateMock <IDocumentRepository>();
            IArchiveVersionRepository archiveRepository      = new ArchiveVersionRepository(new DirectoryInfo(ConfigurationManager.AppSettings["ArchivePath"]));

            ICollection <IDataValidator> dataValidatorCollection = useDataValidators ? new Collection <IDataValidator> {
                new PrimaryKeyDataValidator(dataRepository), new ForeignKeysDataValidator(dataRepository), new MappingDataValidator()
            } : new Collection <IDataValidator>();

            containerMock.Expect(m => m.ResolveAll <IDataValidator>())
            .Return(dataValidatorCollection.ToArray())
            .Repeat.Any();
            IDataValidators dataValidators = new DataValidators(containerMock);

            return(new DeliveryEngine.BusinessLogic.DeliveryEngine(configurationRepositoryMock, metadataRepository, dataRepository, documentRepositoryMock, dataValidators, archiveRepository, exceptionHandler));
        }