protected override void ReadData(
            Endpoint endpoint,
            PipelineStep pipelineStep,
            PipelineContext pipelineContext)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException("endpoint");
            }
            if (pipelineStep == null)
            {
                throw new ArgumentNullException("pipelinestep");
            }
            if (pipelineContext == null)
            {
                throw new ArgumentNullException("pipelineContext");
            }
            var logger = pipelineContext.PipelineBatchContext.Logger;
            //
            //get the file path from the plugin on the endpoint
            var settings = endpoint.GetDatabaseSettings();

            if (settings == null)
            {
                return;
            }
            if (string.IsNullOrWhiteSpace(settings.ConnectionString))
            {
                logger.Error(
                    "No connection string is specified on the endpoint. " +
                    "(pipeline step: {0}, endpoint: {1})",
                    pipelineStep.Name, endpoint.Name);
                return;
            }

            var querySettings = pipelineStep.GetPlugin <QuerySettings>();

            if (string.IsNullOrWhiteSpace(querySettings.Query))
            {
                logger.Error(
                    "No query has been configured" +
                    "(pipeline step: {0}, endpoint: {1})",
                    pipelineStep.Name, endpoint.Name);
                return;
            }

            SynchronizationSettings     synchronizationSettings = pipelineContext.GetSynchronizationSettings();
            Dictionary <string, string> source = null;

            if (synchronizationSettings != null)
            {
                source = synchronizationSettings.Source as Dictionary <string, string>;
            }


            ////add the data that was read from the file to a plugin
            var dataSettings = new IterableDataSettings(GetEnumerable(settings.ConnectionType, settings.ConnectionString, querySettings.Query, source, logger));

            pipelineContext.Plugins.Add(dataSettings);
        }
 /// <summary>
 /// Realize the synchronization operation..
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <param name="progressChanged">The progress changed.</param>
 public static void Go(SynchronizationSettings settings, ProgressChangedEventHandler progressChanged)
 {
     using (Entities _spedc = new Entities(settings.SiteURL))
     {
         using (IPRDEV _sqledc = IPRDEV.Connect2SQL(settings.ConnectionString, progressChanged))
         {
             _spedc.RowLimit = settings.RowLimit;
             Synchronize(_sqledc.JSOXLibrary, _spedc.JSOXLibrary, progressChanged, JSOXLib.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.BalanceBatch, _spedc.BalanceBatch, progressChanged, Linq.BalanceBatch.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADDocumentLibrary, _spedc.SADDocumentLibrary, progressChanged, Linq.SADDocumentLib.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADDocument, _spedc.SADDocument, progressChanged, Linq.SADDocumentType.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADGood, _spedc.SADGood, progressChanged, Linq.SADGood.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADConsignment, _spedc.SADConsignment, progressChanged, Linq.SADConsignment.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Clearence, _spedc.Clearence, progressChanged, Linq.Clearence.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Consent, _spedc.Consent, progressChanged, Linq.Consent.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.PCNCode, _spedc.PCNCode, progressChanged, Linq.PCNCode.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.IPRLibrary, _spedc.IPRLibrary, progressChanged, Linq.IPRLib.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.IPR, _spedc.IPR, progressChanged, Linq.IPR.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.BalanceIPR, _spedc.BalanceIPR, progressChanged, Linq.BalanceIPR.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.BatchLibrary, _spedc.BatchLibrary, progressChanged, Linq.BatchLib.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SPFormat, _spedc.Format, progressChanged, Linq.Format.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SKULibrary, _spedc.SKULibrary, progressChanged, Linq.Document.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SKU, _spedc.SKU, progressChanged, Linq.SKUCommonPart.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Batch, _spedc.Batch, progressChanged, Linq.Batch.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.CustomsUnion, _spedc.CustomsUnion, progressChanged, Linq.CustomsUnion.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.CutfillerCoefficient, _spedc.CutfillerCoefficient, progressChanged, Linq.CutfillerCoefficient.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.InvoiceLibrary, _spedc.InvoiceLibrary, progressChanged, Linq.InvoiceLib.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.InvoiceContent, _spedc.InvoiceContent, progressChanged, Linq.InvoiceContent.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Material, _spedc.Material, progressChanged, Linq.Material.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.JSOXCustomsSummary, _spedc.JSOXCustomsSummary, progressChanged, Linq.JSOXCustomsSummary.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Disposal, _spedc.Disposal, progressChanged, Linq.Disposal.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Dust, _spedc.Dust, progressChanged, Linq.Dust.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADDuties, _spedc.SADDuties, progressChanged, Linq.SADDuties.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADPackage, _spedc.SADPackage, progressChanged, Linq.SADPackage.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADQuantity, _spedc.SADQuantity, progressChanged, Linq.SADQuantity.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SADRequiredDocuments, _spedc.SADRequiredDocuments, progressChanged, Linq.SADRequiredDocuments.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Settings, _spedc.Settings, progressChanged, Linq.Settings.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.SHMenthol, _spedc.SHMenthol, progressChanged, Linq.SHMenthol.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.StockLibrary, _spedc.StockLibrary, progressChanged, Linq.StockLib.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.StockEntry, _spedc.StockEntry, progressChanged, Linq.StockEntry.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Usage, _spedc.Usage, progressChanged, Linq.Usage.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Warehouse, _spedc.Warehouse, progressChanged, Linq.Warehouse.GetMappings(), settings.Port2Rel210);
             Synchronize(_sqledc.Waste, _spedc.Waste, progressChanged, Linq.Waste.GetMappings(), settings.Port2Rel210);
         }
         using (IPRDEV _sqledc = IPRDEV.Connect2SQL(settings.ConnectionString, progressChanged))
         {
             Synchronize(_sqledc.ActivityLog, _spedc.ActivityLog, progressChanged, Linq.ActivityLogCT.GetMappings(), settings.Port2Rel210);
         }
     }
     if (settings.Port2Rel210)
     {
         Linq.Settings.SaveCurrentContentVersion(settings.SiteURL, progressChanged);
     }
     using (IPRDEV _sqledc = IPRDEV.Connect2SQL(settings.ConnectionString, progressChanged))
         Linq2SQL.ArchivingOperationLogs.UpdateActivitiesLogs(_sqledc, Linq2SQL.ArchivingOperationLogs.OperationName.Synchronization, progressChanged);
     progressChanged(1, new ProgressChangedEventArgs(1, "SynchronizationContent has been finished"));
 }
Example #3
0
 public SynchronizationService(
     IServiceProvider services,
     ILogger <SynchronizationService> logger,
     IOptions <SynchronizationSettings> settings)
 {
     _logger   = logger;
     _services = services;
     _settings = settings.Value;
 }
        private ItemModel GetTargetObjectAsItemModel(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            SynchronizationSettings synchronizationSettings = pipelineContext.GetPlugin <SynchronizationSettings>();

            if (synchronizationSettings == null)
            {
                return((ItemModel)null);
            }
            if (synchronizationSettings.Target == null)
            {
                return((ItemModel)null);
            }
            return(synchronizationSettings.Target as ItemModel);
        }
        protected virtual SynchronizationSettings ResolveSynchronizationSettingsAndSetElement(PipelineStep pipelineStep, PipelineContext pipelineContext, object element)
        {
            DataLocationSettings    locationSettings        = pipelineStep.GetDataLocationSettings();
            SynchronizationSettings synchronizationSettings = new SynchronizationSettings();

            if (locationSettings.DataLocation == "Pipeline Context Source")
            {
                synchronizationSettings.Source = element;
            }
            if (locationSettings.DataLocation == "Pipeline Context Target")
            {
                synchronizationSettings.Target = element;
            }
            return(synchronizationSettings);
        }
        private ItemModel GetSourceObjectAsItemModel(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            SynchronizationSettings synchronizationSettings = pipelineContext.GetPlugin <SynchronizationSettings>();

            if (synchronizationSettings == null)
            {
                return((ItemModel)null);
            }
            if (synchronizationSettings.Source == null)
            {
                return((ItemModel)null);
            }

            return(ItemModelHelpers.ConvertToItemModel(synchronizationSettings.Source));
        }
        private Contact GetTargetObjectAsContact(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            if (!pipelineContext.HasSynchronizationSettings())
            {
                return((Contact)null);
            }
            SynchronizationSettings synchronizationSettings = pipelineContext.GetSynchronizationSettings();

            if (synchronizationSettings == null)
            {
                return((Contact)null);
            }
            if (synchronizationSettings.Target == null)
            {
                return((Contact)null);
            }
            return(synchronizationSettings.Target as Contact);
        }
Example #8
0
        protected override DropBoxFile ResolveObject(string identifierValue, Endpoint endpoint, PipelineStep pipelineStep,
                                                     PipelineContext pipelineContext)
        {
            if (!this.CanProcess(pipelineStep, pipelineContext))
            {
                return(null);
            }

            SynchronizationSettings synchronizationSettings =
                Sitecore.DataExchange.Extensions.PipelineContextExtensions.GetSynchronizationSettings(pipelineContext);


            var settings = pipelineStep.GetPlugin <DropboxSettings>();

            var itemModel = synchronizationSettings.Source as ItemModel;

            var itemId = itemModel[ItemModel.ItemID];

            var dropboxRepository = new DropBoxRepository();
            var file = new DropBoxFile(new Metadata(), settings);
            DataAccessContext context = new DataAccessContext();

            var resolveSettings = pipelineStep.GetPlugin <ResolveDropboxFileSettings>();

            file.FileName = (string)resolveSettings.ItemNameValueAccessor.ValueReader.Read(synchronizationSettings.Source, context).ReadValue;

            var metaData = dropboxRepository.GetMetadata(file);

            if (metaData == null)
            {
                var customItemRepository = new CustomItemRepository();
                file.FileStream = customItemRepository.GetMediaItemFileStream(itemModel);

                var result = dropboxRepository.Update(file).Result;
                return(file);
            }
            return(null);
        }
        public override void Process(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            ILogger logger = pipelineContext.PipelineBatchContext.Logger;

            if (!this.CanProcess(pipelineStep, pipelineContext))
            {
                logger.Error("Pipeline step processing will abort because the pipeline step cannot be processed. (pipeline step: {0})", (object)pipelineStep.Name);
            }
            else
            {
                PipelinesSettings pipelinesSettings = pipelineStep.GetPipelinesSettings();
                if (pipelinesSettings == null || !pipelinesSettings.Pipelines.Any <Pipeline>())
                {
                    logger.Error("Pipeline step processing will abort because the pipeline step has no sub-pipelines assigned. (pipeline step: {0})", (object)pipelineStep.Name);
                }
                else
                {
                    IterableDataSettings iterableDataSettings = pipelineContext.GetIterableDataSettings();
                    if (iterableDataSettings == null || iterableDataSettings.Data == null)
                    {
                        return;
                    }

                    int num = 0;

                    try
                    {
                        var childRecordSettings = new ChildRecordSettings();

                        foreach (object element in iterableDataSettings.Data)
                        {
                            if (!pipelineContext.PipelineBatchContext.Stopped)
                            {
                                PipelineContext         pipelineContext1        = new PipelineContext(pipelineContext.PipelineBatchContext);
                                SynchronizationSettings synchronizationSettings = this.ResolveSynchronizationSettingsAndSetElement(pipelineStep, pipelineContext, element);
                                //instatiate Target for filling.
                                synchronizationSettings.Target = new Dictionary <string, string>();

                                pipelineContext1.Plugins.Add((IPlugin)synchronizationSettings);
                                ParentPipelineContextSettings pipelineContextSettings = new ParentPipelineContextSettings()
                                {
                                    ParentPipelineContext = pipelineContext
                                };
                                pipelineContext1.Plugins.Add((IPlugin)pipelineContextSettings);
                                this.ProcessPipelines(pipelineStep, pipelinesSettings.Pipelines, pipelineContext1);

                                //Now Let's get the results
                                var record = pipelineContext1.GetPlugin <SynchronizationSettings>().Target as Dictionary <string, string>;
                                if (record != null)
                                {
                                    childRecordSettings.Records.Add(record);
                                }
                            }

                            num++;
                        }

                        //Add to the context so we can do something with this collection
                        pipelineContext.Plugins.Add(childRecordSettings);

                        logger.Info("{0} elements were iterated. (pipeline: {1}, pipeline step: {2})", (object)num, (object)pipelineContext.CurrentPipeline.Name, (object)pipelineContext.CurrentPipelineStep.Name, (object)pipelineContext);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                        logger.Error(ex.StackTrace);
                        pipelineContext.CriticalError = true;
                    }
                }
            }
        }
Example #10
0
        public override void Process(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            ILogger logger = pipelineContext.PipelineBatchContext.Logger;

            if (!this.CanProcess(pipelineStep, pipelineContext))
            {
                logger.Error("Pipeline step processing will abort because the pipeline step cannot be processed. (pipeline step: {0})", (object)pipelineStep.Name);
            }
            else
            {
                PipelinesSettings pipelinesSettings = pipelineStep.GetPipelinesSettings();
                if (pipelinesSettings == null || !pipelinesSettings.Pipelines.Any <Pipeline>())
                {
                    logger.Error("Pipeline step processing will abort because the pipeline step has no sub-pipelines assigned. (pipeline step: {0})", (object)pipelineStep.Name);
                }
                else
                {
                    IterableDataSettings iterableDataSettings = pipelineContext.GetIterableDataSettings();
                    if (iterableDataSettings == null || iterableDataSettings.Data == null)
                    {
                        return;
                    }

                    int num = 0;

                    try
                    {
                        int maxThreads = 2;
                        int.TryParse(Sitecore.Configuration.Settings.GetSetting("SF.DEF.General.MaxThreads"), out maxThreads);

                        //only set min threads if it's configured in the envrionment.
                        int minThreads = 2;
                        if (int.TryParse(Sitecore.Configuration.Settings.GetSetting("SF.DEF.General.MionThreads"), out minThreads))
                        {
                            System.Threading.ThreadPool.SetMinThreads(minThreads, minThreads);
                        }

                        logger.Info("Starting Async Processor with {0} threads", maxThreads);

                        Parallel.ForEach(iterableDataSettings.Data.Cast <object>(), new ParallelOptions {
                            MaxDegreeOfParallelism = maxThreads
                        }, (element) => {
                            if (!pipelineContext.PipelineBatchContext.Stopped)
                            {
                                PipelineContext pipelineContext1 = new PipelineContext(pipelineContext.PipelineBatchContext);
                                SynchronizationSettings synchronizationSettings = this.ResolveSynchronizationSettingsAndSetElement(pipelineStep, pipelineContext, element);
                                pipelineContext1.Plugins.Add((IPlugin)synchronizationSettings);
                                ParentPipelineContextSettings pipelineContextSettings = new ParentPipelineContextSettings()
                                {
                                    ParentPipelineContext = pipelineContext
                                };
                                pipelineContext1.Plugins.Add((IPlugin)pipelineContextSettings);
                                this.ProcessPipelines(pipelineStep, pipelinesSettings.Pipelines, pipelineContext1);
                            }
                            num++;
                        });

                        logger.Info("{0} elements were iterated. (pipeline: {1}, pipeline step: {2})", (object)num, (object)pipelineContext.CurrentPipeline.Name, (object)pipelineContext.CurrentPipelineStep.Name, (object)pipelineContext);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                        logger.Error(ex.StackTrace);
                        pipelineContext.CriticalError = true;
                    }
                }
            }
        }
Example #11
0
        public override void Process(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            ILogger logger = pipelineContext.PipelineBatchContext.Logger;

            if (!this.CanProcess(pipelineStep, pipelineContext))
            {
                logger.Error("Pipeline step processing will abort because the pipeline step cannot be processed. (pipeline step: {0})", (object)pipelineStep.Name);
            }
            else
            {
                PipelinesSettings pipelinesSettings = pipelineStep.GetPipelinesSettings();
                if (pipelinesSettings == null || !pipelinesSettings.Pipelines.Any <Pipeline>())
                {
                    logger.Error("Pipeline step processing will abort because the pipeline step has no sub-pipelines assigned. (pipeline step: {0})", (object)pipelineStep.Name);
                }
                else
                {
                    var iterateGroupedDataSettings = pipelineStep.GetPlugin <IterateThroughGroupedDataSettings>();
                    if (iterateGroupedDataSettings == null || string.IsNullOrEmpty(iterateGroupedDataSettings.GroupFieldKey))
                    {
                        logger.Error("No Iterated Group Settings was found with configured group field key");
                        return;
                    }

                    GroupedDataSettings groupedDataSettings = pipelineContext.GetPlugin <GroupedDataSettings>();
                    if (groupedDataSettings == null || groupedDataSettings.Data == null)
                    {
                        //let's try the parent context
                        var parentSettings = pipelineContext.GetPlugin <ParentPipelineContextSettings>();
                        if (parentSettings != null)
                        {
                            groupedDataSettings = parentSettings.ParentPipelineContext.GetPlugin <GroupedDataSettings>();
                        }

                        if (groupedDataSettings == null || groupedDataSettings.Data == null)
                        {
                            logger.Error("No Grouped Data Settings was found in the pipelineContext or parent Pipeline Context ");
                        }

                        return;
                    }

                    if (!groupedDataSettings.Data.ContainsKey(iterateGroupedDataSettings.GroupFieldKey))
                    {
                        logger.Warn("No Records Exists for Configured Key: {0}", iterateGroupedDataSettings.GroupFieldKey);
                        return;
                    }

                    int num = 0;

                    try
                    {
                        foreach (object element in groupedDataSettings.Data[iterateGroupedDataSettings.GroupFieldKey])
                        {
                            if (!pipelineContext.PipelineBatchContext.Stopped)
                            {
                                PipelineContext         pipelineContext1        = new PipelineContext(pipelineContext.PipelineBatchContext);
                                SynchronizationSettings synchronizationSettings = this.ResolveSynchronizationSettingsAndSetElement(pipelineStep, pipelineContext, element);
                                pipelineContext1.Plugins.Add((IPlugin)synchronizationSettings);
                                ParentPipelineContextSettings pipelineContextSettings = new ParentPipelineContextSettings()
                                {
                                    ParentPipelineContext = pipelineContext
                                };
                                pipelineContext1.Plugins.Add((IPlugin)pipelineContextSettings);
                                this.ProcessPipelines(pipelineStep, pipelinesSettings.Pipelines, pipelineContext1);
                            }

                            num++;
                        }


                        logger.Info("{0} elements were iterated. (pipeline: {1}, pipeline step: {2})", (object)num, (object)pipelineContext.CurrentPipeline.Name, (object)pipelineContext.CurrentPipelineStep.Name, (object)pipelineContext);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                        logger.Error(ex.StackTrace);
                        pipelineContext.CriticalError = true;
                    }
                }
            }
        }
        protected override void ReadData(
            Endpoint endpoint,
            PipelineStep pipelineStep,
            PipelineContext pipelineContext)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException("endpoint");
            }
            if (pipelineStep == null)
            {
                throw new ArgumentNullException("pipelinestep");
            }
            if (pipelineContext == null)
            {
                throw new ArgumentNullException("pipelineContext");
            }
            var logger = pipelineContext.PipelineBatchContext.Logger;
            //
            //get the file path from the plugin on the endpoint
            var settings = endpoint.GetExcelSettings();

            if (settings == null)
            {
                return;
            }
            if (string.IsNullOrWhiteSpace(settings.FileLocation))
            {
                logger.Error(
                    "No File Location is specified on the endpoint. " +
                    "(pipeline step: {0}, endpoint: {1})",
                    pipelineStep.Name, endpoint.Name);
                return;
            }

            var excelSettings = pipelineStep.GetPlugin <ReadExcelTabSettings>();

            if (string.IsNullOrWhiteSpace(excelSettings.Sheet))
            {
                logger.Error(
                    "No tab has been configured" +
                    "(pipeline step: {0}, endpoint: {1})",
                    pipelineStep.Name, endpoint.Name);
                return;
            }



            SynchronizationSettings     synchronizationSettings = pipelineContext.GetSynchronizationSettings();
            Dictionary <string, string> source = null;

            if (synchronizationSettings != null)
            {
                source = synchronizationSettings.Source as Dictionary <string, string>;
            }


            try
            {
                ////add the data that was read from the file to a plugin
                var dataSettings = new IterableDataSettings(GetEnumerable(settings.FileLocation, excelSettings.Sheet, excelSettings.FirstRowHasColumnNames, logger));

                pipelineContext.Plugins.Add(dataSettings);
            }
            catch (Exception ex)
            {
                Sitecore.Diagnostics.Log.Error($"ReadExcelTabStepProcessor: error occurred.pipelineStep: {pipelineStep.Name}, endpoint: {endpoint.Name}", ex);
                return;
            }
        }
        public ContentResult Index(SynchronizationSettings settings)
        {
            var leftPair  = ProviderPairFactory.CreateProviderPair(settings.LeftProviderPairName);
            var rightPair = ProviderPairFactory.CreateProviderPair(settings.RightProviderPairName);

            var leftValues  = leftPair.ValueManager.GetAllValuesQualified().ToDictionary(qv => qv.Qualifier);
            var rightValues = rightPair.ValueManager.GetAllValuesQualified().ToDictionary(qv => qv.Qualifier);

            var leftNotRight = leftValues.Where(lv => !rightValues.ContainsKey(lv.Key)).Select(lv => lv.Value).ToArray();
            var rightNotLeft = rightValues.Where(rv => !leftValues.ContainsKey(rv.Key)).Select(rv => rv.Value).ToArray();

            var valueDifferences = leftValues.Values
                                   .Join(rightValues.Values, v => v.Qualifier, v => v.Qualifier, (lv, rv) => new SynchronizationData.DoubleQualifiedValue(lv, rv))
                                   .Where(dv => !Equals(dv.Left.Value, dv.Right.Value))
                                   .ToArray();

            var leftAudits  = leftPair.ValueManager.GetAudits().ToDictionary(a => a.Qualifier);
            var rightAudits = rightPair.ValueManager.GetAudits().ToDictionary(a => a.Qualifier);

            var synchronizationResult = new SynchronizationResult();

            foreach (var missingRight in leftNotRight)
            {
                switch (settings.RightMissingStrategy)
                {
                case SynchronizationSettings.MissingResolutionStrategy.Audit:
                    if (!rightAudits.ContainsKey(missingRight.Qualifier))
                    {
                        Create(settings.Execute, rightPair, leftAudits, rightAudits, missingRight, synchronizationResult);
                        break;
                    }

                    var rightAudit = rightAudits[missingRight.Qualifier];
                    var leftAudit  = leftAudits[missingRight.Qualifier];
                    if (leftAudit.LatestValueHash == rightAudit.PreviousValueHash && leftAudit.PreviousValueHash == rightAudit.LatestValueHash)
                    {
                        if (leftAudit.LatestUpdate > rightAudit.LatestUpdate)
                        {
                            Create(settings.Execute, rightPair, leftAudits, rightAudits, missingRight, synchronizationResult);
                        }
                        else if (leftAudit.LatestUpdate < rightAudit.LatestUpdate)
                        {
                            Delete(settings.Execute, leftPair, rightAudits, leftAudits, missingRight, synchronizationResult);
                        }
                        else
                        {
                            synchronizationResult.Unresolved.Add(new Conflict(leftPair.Name, missingRight.Qualifier.ToString()));
                        }
                        break;
                    }
                    if (rightAudit.LatestValueHash == leftAudit.PreviousValueHash)
                    {
                        Create(settings.Execute, rightPair, leftAudits, rightAudits, missingRight, synchronizationResult);
                        break;
                    }
                    if (leftAudit.LatestValueHash == rightAudit.PreviousValueHash)
                    {
                        Delete(settings.Execute, leftPair, rightAudits, leftAudits, missingRight, synchronizationResult);
                        break;
                    }
                    synchronizationResult.Unresolved.Add(new Conflict(leftPair.Name, missingRight.Qualifier.ToString()));
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.CopyNew:
                    Create(settings.Execute, rightPair, leftAudits, rightAudits, missingRight, synchronizationResult);
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.DeleteExisting:
                    Delete(settings.Execute, leftPair, rightAudits, leftAudits, missingRight, synchronizationResult);
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.Ignore:
                    synchronizationResult.Ignored.Add(new Ignore(leftPair.Name, missingRight.Qualifier.ToString()));
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.ShowConflict:
                    synchronizationResult.Unresolved.Add(new Conflict(leftPair.Name, missingRight.Qualifier.ToString()));
                    break;
                }
            }

            foreach (var missingLeft in rightNotLeft)
            {
                switch (settings.LeftMissingStrategy)
                {
                case SynchronizationSettings.MissingResolutionStrategy.Audit:
                    if (!leftAudits.ContainsKey(missingLeft.Qualifier))
                    {
                        Create(settings.Execute, leftPair, rightAudits, leftAudits, missingLeft, synchronizationResult);
                        break;
                    }

                    var rightAudit = rightAudits[missingLeft.Qualifier];
                    var leftAudit  = leftAudits[missingLeft.Qualifier];
                    if (leftAudit.LatestValueHash == rightAudit.PreviousValueHash && leftAudit.PreviousValueHash == rightAudit.LatestValueHash)
                    {
                        if (leftAudit.LatestUpdate > rightAudit.LatestUpdate)
                        {
                            Delete(settings.Execute, rightPair, leftAudits, rightAudits, missingLeft, synchronizationResult);
                        }
                        else if (leftAudit.LatestUpdate < rightAudit.LatestUpdate)
                        {
                            Create(settings.Execute, leftPair, rightAudits, leftAudits, missingLeft, synchronizationResult);
                        }
                        else
                        {
                            synchronizationResult.Unresolved.Add(new Conflict(leftPair.Name, missingLeft.Qualifier.ToString()));
                        }
                        break;
                    }
                    if (leftAudit.LatestValueHash == rightAudit.PreviousValueHash)
                    {
                        Create(settings.Execute, leftPair, rightAudits, leftAudits, missingLeft, synchronizationResult);
                        break;
                    }
                    if (rightAudit.LatestValueHash == leftAudit.PreviousValueHash)
                    {
                        Delete(settings.Execute, rightPair, leftAudits, rightAudits, missingLeft, synchronizationResult);
                        break;
                    }
                    synchronizationResult.Unresolved.Add(new Conflict(leftPair.Name, missingLeft.Qualifier.ToString()));
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.CopyNew:
                    Create(settings.Execute, leftPair, rightAudits, leftAudits, missingLeft, synchronizationResult);
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.DeleteExisting:
                    Delete(settings.Execute, rightPair, leftAudits, rightAudits, missingLeft, synchronizationResult);
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.Ignore:
                    synchronizationResult.Ignored.Add(new Ignore(rightPair.Name, missingLeft.Qualifier.ToString()));
                    break;

                case SynchronizationSettings.MissingResolutionStrategy.ShowConflict:
                    synchronizationResult.Unresolved.Add(new Conflict(rightPair.Name, missingLeft.Qualifier.ToString()));
                    break;
                }
            }

            foreach (var difference in valueDifferences)
            {
                switch (settings.DifferingStrategy)
                {
                case SynchronizationSettings.DifferingResolutionStrategy.Audit:
                    var rightAudit = rightAudits[difference.Right.Qualifier];
                    var leftAudit  = leftAudits[difference.Left.Qualifier];
                    if (leftAudit.LatestValueHash == rightAudit.PreviousValueHash && leftAudit.PreviousValueHash == rightAudit.LatestValueHash)
                    {
                        if (leftAudit.LatestUpdate > rightAudit.LatestUpdate)
                        {
                            UpdateCreate(settings.Execute, rightPair, leftAudits, rightAudits, difference.Left, difference.Right.Value, synchronizationResult);
                        }
                        else if (leftAudit.LatestUpdate < rightAudit.LatestUpdate)
                        {
                            UpdateCreate(settings.Execute, leftPair, rightAudits, leftAudits, difference.Right, difference.Left.Value, synchronizationResult);
                        }
                        else
                        {
                            synchronizationResult.Unresolved.Add(new Conflict(rightPair.Name + " <> " + leftPair.Name, difference.Left.Qualifier.ToString()));
                        }
                        break;
                    }
                    if (leftAudit.LatestValueHash == rightAudit.PreviousValueHash)
                    {
                        UpdateCreate(settings.Execute, leftPair, rightAudits, leftAudits, difference.Right, difference.Left.Value, synchronizationResult);
                        break;
                    }
                    if (rightAudit.LatestValueHash == leftAudit.PreviousValueHash)
                    {
                        UpdateCreate(settings.Execute, rightPair, leftAudits, rightAudits, difference.Left, difference.Right.Value, synchronizationResult);
                        break;
                    }
                    synchronizationResult.Unresolved.Add(new Conflict(rightPair.Name + " <> " + leftPair.Name, difference.Left.Qualifier.ToString()));
                    break;

                case SynchronizationSettings.DifferingResolutionStrategy.UseLeft:
                    UpdateCreate(settings.Execute, rightPair, leftAudits, rightAudits, difference.Left, difference.Right.Value, synchronizationResult);
                    break;

                case SynchronizationSettings.DifferingResolutionStrategy.UseRight:
                    UpdateCreate(settings.Execute, leftPair, rightAudits, leftAudits, difference.Right, difference.Left.Value, synchronizationResult);
                    break;

                case SynchronizationSettings.DifferingResolutionStrategy.Ignore:
                    synchronizationResult.Ignored.Add(new Ignore(rightPair.Name + " <> " + leftPair.Name, difference.Left.Qualifier.ToString()));
                    break;

                case SynchronizationSettings.DifferingResolutionStrategy.ShowConflict:
                    synchronizationResult.Unresolved.Add(new Conflict(rightPair.Name + " <> " + leftPair.Name, difference.Left.Qualifier.ToString()));
                    break;
                }
            }

            if (settings.Execute)
            {
                foreach (var audit in leftAudits.Where(audit => !rightAudits.ContainsKey(audit.Key)))
                {
                    rightAudits.Add(audit.Key, audit.Value);
                }
                foreach (var audit in rightAudits.Where(audit => !leftAudits.ContainsKey(audit.Key)))
                {
                    leftAudits.Add(audit.Key, audit.Value);
                }

                leftPair.ValueManager.SetAudits(leftAudits.Values);
                rightPair.ValueManager.SetAudits(rightAudits.Values);
            }

            return(Content(JsonConvert.SerializeObject(synchronizationResult), "application/json", Encoding.UTF8));
        }
        public override void Process(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            ILogger logger = pipelineContext.PipelineBatchContext.Logger;

            if (!this.CanProcess(pipelineStep, pipelineContext))
            {
                logger.Error("Pipeline step processing will abort because the pipeline step cannot be processed. (pipeline step: {0})", (object)pipelineStep.Name);
            }
            else
            {
                PipelinesSettings pipelinesSettings = pipelineStep.GetPipelinesSettings();
                if (pipelinesSettings == null || !pipelinesSettings.Pipelines.Any <Pipeline>())
                {
                    logger.Error("Pipeline step processing will abort because the pipeline step has no sub-pipelines assigned. (pipeline step: {0})", (object)pipelineStep.Name);
                }
                else
                {
                    var iterateGroupedDataSettings = pipelineStep.GetPlugin <IterateThroughGroupedDataSettings>();
                    if (iterateGroupedDataSettings == null || string.IsNullOrEmpty(iterateGroupedDataSettings.GroupFieldKey))
                    {
                        logger.Error("No Iterated Group Settings was found with configured group field key");
                        return;
                    }

                    GroupedDataSettings groupedDataSettings = pipelineContext.GetPlugin <GroupedDataSettings>();
                    if (groupedDataSettings == null || groupedDataSettings.Data == null)
                    {
                        //let's try the parent context
                        var parentSettings = pipelineContext.GetPlugin <ParentPipelineContextSettings>();
                        if (parentSettings != null)
                        {
                            groupedDataSettings = parentSettings.ParentPipelineContext.GetPlugin <GroupedDataSettings>();
                        }

                        if (groupedDataSettings == null || groupedDataSettings.Data == null)
                        {
                            logger.Error("No Grouped Data Settings was found in the pipelineContext or parent Pipeline Context ");
                            return;
                        }
                    }

                    var parentSyncSettings = pipelineContext.GetPlugin <SynchronizationSettings>();
                    var source             = parentSyncSettings.Source as Dictionary <string, string>;
                    if (source == null || !source.ContainsKey(iterateGroupedDataSettings.GroupFieldKey))
                    {
                        logger.Warn("Group Field Key {0} doesn;t exist in source.", iterateGroupedDataSettings.GroupFieldKey);
                        return;
                    }

                    var groupValue = source[iterateGroupedDataSettings.GroupFieldKey];

                    int num = 0;

                    try
                    {
                        var childRecordSettings = new ChildRecordSettings();

                        foreach (object element in groupedDataSettings.Data[groupValue])
                        {
                            if (!pipelineContext.PipelineBatchContext.Stopped)
                            {
                                PipelineContext         pipelineContext1        = new PipelineContext(pipelineContext.PipelineBatchContext);
                                SynchronizationSettings synchronizationSettings = this.ResolveSynchronizationSettingsAndSetElement(pipelineStep, pipelineContext, element);

                                //instatiate Target for filling.
                                synchronizationSettings.Target = new Dictionary <string, string>();

                                pipelineContext1.Plugins.Add((IPlugin)synchronizationSettings);
                                ParentPipelineContextSettings pipelineContextSettings = new ParentPipelineContextSettings()
                                {
                                    ParentPipelineContext = pipelineContext
                                };
                                pipelineContext1.Plugins.Add((IPlugin)pipelineContextSettings);
                                this.ProcessPipelines(pipelineStep, pipelinesSettings.Pipelines, pipelineContext1);

                                var record = pipelineContext1.GetPlugin <SynchronizationSettings>().Target as Dictionary <string, string>;
                                if (record != null)
                                {
                                    childRecordSettings.Records.Add(record);
                                }
                            }

                            num++;
                        }

                        pipelineContext.Plugins.Add(childRecordSettings);

                        logger.Info("{0} elements were iterated. (pipeline: {1}, pipeline step: {2})", (object)num, (object)pipelineContext.CurrentPipeline.Name, (object)pipelineContext.CurrentPipelineStep.Name, (object)pipelineContext);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                        logger.Error(ex.StackTrace);
                        pipelineContext.CriticalError = true;
                    }
                }
            }
        }
        public override void Process(PipelineStep pipelineStep, PipelineContext pipelineContext)
        {
            ILogger logger = pipelineContext.PipelineBatchContext.Logger;

            if (!this.CanProcess(pipelineStep, pipelineContext))
            {
                logger.Error("Pipeline step processing will abort because the pipeline step cannot be processed. (pipeline step: {0})", (object)pipelineStep.Name);
            }
            else
            {
                PipelinesSettings pipelinesSettings = pipelineStep.GetPipelinesSettings();
                if (pipelinesSettings == null || !pipelinesSettings.Pipelines.Any <Pipeline>())
                {
                    logger.Error("Pipeline step processing will abort because the pipeline step has no sub-pipelines assigned. (pipeline step: {0})", (object)pipelineStep.Name);
                }
                else
                {
                    IterableDataSettings iterableDataSettings = pipelineContext.GetIterableDataSettings();
                    if (iterableDataSettings == null || iterableDataSettings.Data == null)
                    {
                        return;
                    }

                    int num = 0;

                    try
                    {
                        List <Task> tasks = new List <Task>();

                        foreach (object element in iterableDataSettings.Data)
                        {
                            Task task = Task.Factory.StartNew(() =>
                            {
                                if (!pipelineContext.PipelineBatchContext.Stopped)
                                {
                                    PipelineContext pipelineContext1 = new PipelineContext(pipelineContext.PipelineBatchContext);
                                    SynchronizationSettings synchronizationSettings = this.ResolveSynchronizationSettingsAndSetElement(pipelineStep, pipelineContext, element);
                                    pipelineContext1.Plugins.Add((IPlugin)synchronizationSettings);
                                    ParentPipelineContextSettings pipelineContextSettings = new ParentPipelineContextSettings()
                                    {
                                        ParentPipelineContext = pipelineContext
                                    };
                                    pipelineContext1.Plugins.Add((IPlugin)pipelineContextSettings);
                                    this.ProcessPipelines(pipelineStep, pipelinesSettings.Pipelines, pipelineContext1);
                                }
                            });
                            num++;
                        }

                        Task.WaitAll(tasks.ToArray());

                        logger.Info("{0} elements were iterated. (pipeline: {1}, pipeline step: {2})", (object)num, (object)pipelineContext.CurrentPipeline.Name, (object)pipelineContext.CurrentPipelineStep.Name, (object)pipelineContext);
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex.Message);
                        logger.Error(ex.StackTrace);
                        pipelineContext.CriticalError = true;
                    }
                }
            }
        }