/// <summary> /// Executes the upgrade. /// </summary> /// <param name="context">The context of the upgrade</param> public void Execute(ISchemaUpgradeContext context) { Guard.NotNull(() => context, context); tracer.Info(ShellResources.PatternModelSchemaUpgradeManager_TraceExecute, context.SchemaFilePath); TraceSourceExtensions.Shield(tracer, () => { if (context.UpgradeProcessors != null && context.UpgradeProcessors.Any()) { // Order processors by declared 'Order' field var upgradeProcessors = context.UpgradeProcessors.ToList() .OrderBy(proc => proc.Metadata.Order); // Trace all processors found upgradeProcessors .ForEach(proc => { tracer.Verbose( ShellResources.PatternModelSchemaUpgradeManager_TraceFoundUpgradeRule, proc.Value.GetType(), proc.Metadata.TargetVersion, proc.Metadata.Order); }); // Determine schema versions var previousVersion = context.SchemaVersion; var currentVersion = context.RuntimeVersion; if (previousVersion < currentVersion) { // Query Processors var processorsToExecute = new List <IPatternModelSchemaUpgradeProcessor>(); upgradeProcessors .ForEach(proc => { // Is this processor required to execute for this version of schema? Version procVersion; if (Version.TryParse(proc.Metadata.TargetVersion, out procVersion)) { if (procVersion == previousVersion) { processorsToExecute.Add(proc.Value); } } }); if (processorsToExecute.Any()) { tracer.Verbose( ShellResources.PatternModelSchemaUpgradeManager_TraceExecuteUpgradeProcessors, previousVersion, currentVersion); // Initialize document var document = context.OpenSchema(); // Backup original schema context.BackupSchema(); // Execute processors processorsToExecute.ForEach(proc => { try { tracer.Info(ShellResources.PatternModelSchemaUpgradeManager_TraceExecuteUpgradeRule, proc.GetType(), previousVersion); proc.ProcessSchema(document); } catch (Exception ex) { tracer.Error(ShellResources.PatternModelSchemaUpgradeManager_ErrorUpgradeRuleFailed, proc.GetType(), ex.Message); throw; } }); } // Update and save if ((previousVersion < currentVersion) || context.UpgradeProcessors.Any(mp => mp.Value.IsModified)) { // Upgrade schema version context.SchemaVersion = currentVersion; // Save migrated document context.SaveSchema(); } } } }, ShellResources.PatternModelSchemaUpgradeManager_ErrorUpgradeRulesFailed); }
/// <summary> /// Executes the upgrade. /// </summary> /// <param name="context">The context of the upgrade</param> public void Execute(ISchemaUpgradeContext context) { Guard.NotNull(() => context, context); tracer.Info(ShellResources.PatternModelSchemaUpgradeManager_TraceExecute, context.SchemaFilePath); TraceSourceExtensions.Shield(tracer, () => { if (context.UpgradeProcessors != null && context.UpgradeProcessors.Any()) { // Order processors by declared 'Order' field var upgradeProcessors = context.UpgradeProcessors.ToList() .OrderBy(proc => proc.Metadata.Order); // Trace all processors found upgradeProcessors .ForEach(proc => { tracer.Verbose( ShellResources.PatternModelSchemaUpgradeManager_TraceFoundUpgradeRule, proc.Value.GetType(), proc.Metadata.TargetVersion, proc.Metadata.Order); }); // Determine schema versions var previousVersion = context.SchemaVersion; var currentVersion = context.RuntimeVersion; if (previousVersion < currentVersion) { // Query Processors var processorsToExecute = new List<IPatternModelSchemaUpgradeProcessor>(); upgradeProcessors .ForEach(proc => { // Is this processor required to execute for this version of schema? Version procVersion; if (Version.TryParse(proc.Metadata.TargetVersion, out procVersion)) { if (procVersion == previousVersion) { processorsToExecute.Add(proc.Value); } } }); if (processorsToExecute.Any()) { tracer.Verbose( ShellResources.PatternModelSchemaUpgradeManager_TraceExecuteUpgradeProcessors, previousVersion, currentVersion); // Initialize document var document = context.OpenSchema(); // Backup original schema context.BackupSchema(); // Execute processors processorsToExecute.ForEach(proc => { try { tracer.Info(ShellResources.PatternModelSchemaUpgradeManager_TraceExecuteUpgradeRule, proc.GetType(), previousVersion); proc.ProcessSchema(document); } catch (Exception ex) { tracer.Error(ShellResources.PatternModelSchemaUpgradeManager_ErrorUpgradeRuleFailed, proc.GetType(), ex.Message); throw; } }); } // Update and save if ((previousVersion < currentVersion) || context.UpgradeProcessors.Any(mp => mp.Value.IsModified)) { // Upgrade schema version context.SchemaVersion = currentVersion; // Save migrated document context.SaveSchema(); } } } }, ShellResources.PatternModelSchemaUpgradeManager_ErrorUpgradeRulesFailed); }