public void TestThatConstructorInitializeEventArgs()
        {
            var fixture = new Fixture();

            fixture.Customize <IDataSource>(e => e.FromFactory(() => MockRepository.GenerateMock <IDataSource>()));
            fixture.Customize <ITable>(e => e.FromFactory(() => MockRepository.GenerateMock <ITable>()));

            var dataSourceMock  = fixture.CreateAnonymous <IDataSource>();
            var targetTableMock = fixture.CreateAnonymous <ITable>();
            var dataBlock       = fixture.CreateAnonymous <int>();
            var eventArgs       = new GetDataForTargetTableEventArgs(dataSourceMock, targetTableMock, dataBlock);

            Assert.That(eventArgs, Is.Not.Null);
            Assert.That(eventArgs.DataSource, Is.Not.Null);
            Assert.That(eventArgs.DataSource, Is.EqualTo(dataSourceMock));
            Assert.That(eventArgs.TargetTable, Is.Not.Null);
            Assert.That(eventArgs.TargetTable, Is.EqualTo(targetTableMock));
            Assert.That(eventArgs.DataBlock, Is.EqualTo(dataBlock));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Event handler for handling a given target table asynchronous.
        /// </summary>
        /// <param name="sender">Object which raises the event.</param>
        /// <param name="eventArgs">Arguments to the event.</param>
        private void HandleTargetTableDoWork(object sender, DoWorkEventArgs eventArgs)
        {
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (eventArgs == null)
            {
                throw new ArgumentNullException("eventArgs");
            }
            var tableWorker = (BackgroundWorker)sender;
            var tuple       = (Tuple <ITable, IDataSource, IDeliveryEngineExecuteCommand>)eventArgs.Argument;
            var table       = tuple.Item1;
            var dataSource  = tuple.Item2;
            var command     = tuple.Item3;

            lock (_syncRoot)
            {
                _tableDataBlock.Add(table, 0);
                _tableInformations.Add(table, new Tuple <IDataSource, IDeliveryEngineExecuteCommand, BackgroundWorker>(dataSource, command, tableWorker));
            }
            try
            {
                IGetDataForTargetTableEventArgs getDataForTargetTableEventArgs;
                lock (_syncRoot)
                {
                    _tableDataBlock[table]        += 1;
                    getDataForTargetTableEventArgs = new GetDataForTargetTableEventArgs(dataSource, table, _tableDataBlock[table]);
                }
                // Gets data for the target table.
                RaiseEvent(BeforeGetDataForTargetTable, getDataForTargetTableEventArgs);
                DataRepository.DataGetForTargetTable(table.NameTarget, dataSource);
            }
            catch (ThreadInterruptedException)
            {
                eventArgs.Cancel = true;
            }
            catch (DeliveryEngineAlreadyHandledException)
            {
                eventArgs.Cancel = false;
                throw;
            }
            catch (Exception ex)
            {
                var threadInterruptedException = ex.InnerException as ThreadInterruptedException;
                if (threadInterruptedException != null)
                {
                    eventArgs.Cancel = true;
                    return;
                }
                var deliveryEngineAlreadyHandledException = ex.InnerException as DeliveryEngineAlreadyHandledException;
                if (deliveryEngineAlreadyHandledException != null)
                {
                    eventArgs.Cancel = false;
                    throw deliveryEngineAlreadyHandledException;
                }
                lock (_syncRoot)
                {
                    eventArgs.Cancel = false;
                    ExceptionHandler.HandleException(ex);
                    throw new DeliveryEngineAlreadyHandledException(ex.Message, ex);
                }
            }
        }
Ejemplo n.º 3
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);
        }