/// <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)); }