public WITEditEditConflictTypeDetails GetConflictDetails(MigrationConflict conflict)
        {
            if (!conflict.ConflictType.ReferenceName.Equals(this.ReferenceName))
            {
                throw new InvalidOperationException();
            }

            if (string.IsNullOrEmpty(conflict.ConflictDetails))
            {
                throw new ArgumentNullException("conflict.ConflictDetails");
            }

            WITEditEditConflictTypeDetails details;

            string[] splits = conflict.ConflictDetails.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries);
            switch (splits.Length)
            {
            case 3:
                // backward compatible: we used to have 'source_item_id::source_item_version::target_item_id'
                details = new WITEditEditConflictTypeDetails(splits[0], splits[1], splits[2]);
                break;

            case 4:
                details = new WITEditEditConflictTypeDetails(splits[0], splits[1], splits[2], splits[3]);
                break;

            case 6:
                details = new WITEditEditConflictTypeDetails(splits[0], splits[1], splits[2], splits[3], splits[4], splits[5]);
                break;

            default:
                throw new ArgumentException(string.Format(
                                                MigrationToolkitResources.InvalidWitEditEditConflictDetailsString, conflict.ConflictDetails));
            }
            return(details);
        }
        private bool updateConversionHistory(MigrationConflict conflict, ConflictResolutionRule rule)
        {
            if (!rule.DataFieldDictionary.ContainsKey(VCContentConflictUserMergeChangeAction.MigrationInstructionChangeId) ||
                !rule.DataFieldDictionary.ContainsKey(VCContentConflictUserMergeChangeAction.DeltaTableChangeId))
            {
                return(false);
            }
            string migrationInstructionName = rule.DataFieldDictionary[VCContentConflictUserMergeChangeAction.MigrationInstructionChangeId];
            string deltaTableName           = rule.DataFieldDictionary[VCContentConflictUserMergeChangeAction.DeltaTableChangeId];

            using (RuntimeEntityModel context = RuntimeEntityModel.CreateInstance())
            {
                ChangeGroup conflictChangeGroup = conflict.ConflictedChangeAction.ChangeGroup;
                Guid        deltaSideSourceId;

                // Mark all delta table entry as DeltaComplete
                var deltaTableEntries =
                    from d in context.RTChangeGroupSet
                    where d.SessionUniqueId == conflictChangeGroup.SessionId &&
                    d.Status == (int)ChangeStatus.DeltaPending
                    select d;
                foreach (RTChangeGroup deltaTableEntry in deltaTableEntries)
                {
                    deltaTableEntry.Status = (int)ChangeStatus.DeltaComplete;
                    deltaTableEntry.ContainsBackloggedAction = false;
                }

                // Mark all migration instruction entry as Complete
                var migrationInstructionEntries =
                    from d in context.RTChangeGroupSet
                    where d.SessionUniqueId == conflictChangeGroup.SessionId &&
                    (d.Status == (int)ChangeStatus.Pending || d.Status == (int)ChangeStatus.InProgress || d.Status == (int)ChangeStatus.PendingConflictDetection)
                    select d;
                foreach (RTChangeGroup migrationInstructionEntry in migrationInstructionEntries)
                {
                    migrationInstructionEntry.Status = (int)ChangeStatus.Complete;
                    migrationInstructionEntry.ContainsBackloggedAction = false;
                }

                // Mark the source side highwatermark
                var sourceSideHighWaterMark =
                    (from hwm in context.RTHighWaterMarkSet
                     where hwm.SessionUniqueId == conflictChangeGroup.SessionId &&
                     hwm.SourceUniqueId != conflictChangeGroup.SourceId &&
                     hwm.Name == Constants.HwmDelta
                     select hwm).First();
                Debug.Assert(sourceSideHighWaterMark != null, "Can't find the source side HWM");

                sourceSideHighWaterMark.Value = deltaTableName;
                deltaSideSourceId             = sourceSideHighWaterMark.SourceUniqueId;

                // Mark the target side highwatermark
                var targetHighWaterMark =
                    (from hwm in context.RTHighWaterMarkSet
                     where hwm.SessionUniqueId == conflictChangeGroup.SessionId &&
                     hwm.SourceUniqueId == conflictChangeGroup.SourceId &&
                     hwm.Name == Constants.HwmDelta
                     select hwm).First();
                Debug.Assert(targetHighWaterMark != null, "Can't find the target side HWM");

                targetHighWaterMark.Value = migrationInstructionName;

                // Create the conversion history entry
                RTConversionHistory conversionHistory = RTConversionHistory.CreateRTConversionHistory(
                    DateTime.UtcNow,
                    -1,
                    true);
                conversionHistory.Comment = rule.RuleDescription;

                var session =
                    (from s in context.RTSessionConfigSet
                     where s.SessionUniqueId == conflictChangeGroup.SessionId
                     select s).First();

                Debug.Assert(session != null, "Cannot find session in DB");

                RTSessionRun sessionRun =
                    (from sr in context.RTSessionRunSet
                     where sr.Id == session.Id
                     select sr).First();
                Debug.Assert(sessionRun != null, "Cannot find session run in DB");

                conversionHistory.SessionRun = sessionRun;

                RTMigrationSource migrationSource =
                    (from ms in context.RTMigrationSourceSet
                     where ms.UniqueId.Equals(conflictChangeGroup.SourceId)
                     select ms).First();
                Debug.Assert(migrationSource != null, "Cannot find the migration source to persist conversion history");

                RTMigrationSource deltaSideMigrationSource =
                    (from ms in context.RTMigrationSourceSet
                     where ms.UniqueId.Equals(deltaSideSourceId)
                     select ms).First();
                Debug.Assert(deltaSideMigrationSource != null, "Cannot find the migration source to persist conversion history");

                conversionHistory.SourceMigrationSource = migrationSource;

                context.AddToRTConversionHistorySet(conversionHistory);

                RTMigrationItem sourceItem = RTMigrationItem.CreateRTMigrationItem(0, deltaTableName, Constants.ChangeGroupGenericVersionNumber);
                sourceItem.MigrationSource = migrationSource;
                RTMigrationItem targetItem = RTMigrationItem.CreateRTMigrationItem(0, migrationInstructionName, Constants.ChangeGroupGenericVersionNumber);
                targetItem.MigrationSource = deltaSideMigrationSource;


                RTItemRevisionPair pair = RTItemRevisionPair.CreateRTItemRevisionPair(
                    sourceItem.Id, targetItem.Id);
                pair.LeftMigrationItem  = sourceItem;
                pair.RightMigrationItem = targetItem;
                pair.ConversionHistory  = conversionHistory;



                // Create a new HistoryNotFoundConflict Resolution Rule
                context.TrySaveChanges();
            }
            return(true);
        }
 public MigrationUnresolvedConflictException(MigrationConflict conflict)
     : base(conflict.Description)
 {
     m_conflict = conflict;
 }
 public bool CanResolve(MigrationConflict conflict, ConflictResolutionRule rule)
 {
     return(ConflictTypeHandled.ScopeInterpreter.IsInScope(conflict.ScopeHint, rule.ApplicabilityScope));
 }
示例#5
0
 public static ConflictResolutionResult TryResolve(ConflictResolutionRule rule, MigrationConflict conflict)
 {
     throw new NotImplementedException();
 }
 public ConflictResolutionResult Resolve(IServiceContainer serviceContainer, MigrationConflict conflict, ConflictResolutionRule rule, out List <MigrationAction> actions)
 {
     actions = null;
     return(new ConflictResolutionResult(true, ConflictResolutionType.Other));
 }
 public bool CanResolve(MigrationConflict conflict, ConflictResolutionRule rule)
 {
     return(true);
 }