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