private void AddColumn( XmlElement cs, string workItemType, string fieldName, string fieldReferenceName, string stringVal) { FieldDefinition fd = TryGetFieldDefinition(workItemType, fieldReferenceName); if (fd == null) { throw new FieldNotExistException(); } if (fd.FieldType == FieldType.Html || fd.FieldType == FieldType.PlainText || fd.FieldType == FieldType.History) { // Large text are different AddLargeTextColumn(cs.ParentNode, fd, stringVal); } else { string typeName; if (fd.ReferenceName.Equals(CoreFieldReferenceNames.CreatedDate)) { typeName = "ServerDateTime"; stringVal = string.Empty; } else { switch (fd.FieldType) { case FieldType.Integer: typeName = "Number"; break; case FieldType.Double: typeName = "Double"; break; case FieldType.DateTime: typeName = "DateTime"; if (!string.IsNullOrEmpty(stringVal)) { stringVal = XmlConvert.ToString(Convert.ToDateTime(stringVal).ToUniversalTime(), XmlDateTimeSerializationMode.Unspecified); } break; default: Debug.Assert(fd.FieldType == FieldType.String, "Unsupported field type!"); typeName = null; break; } } XmlElement c = cs.OwnerDocument.CreateElement("Column"); c.SetAttribute("Column", fieldReferenceName); if (!string.IsNullOrEmpty(typeName)) { c.SetAttribute("Type", typeName); } XmlElement v = cs.OwnerDocument.CreateElement("Value"); v.InnerText = stringVal; c.AppendChild(v); cs.AppendChild(c); } ServerDataIntegrityChecker.RecordUpdatedField(fieldReferenceName); }
public virtual void AddFields( IMigrationAction action, string workItemType, string author, string changedTime, bool insertWorkItem) { ServerDataIntegrityChecker.InitializeForUpdateAnalysis(workItemType, author); bool hasArea = false; bool hasIteration = false; XmlDocument desc = action.MigrationActionDescription; XmlElement cs = UpdateDocument.CreateElement("Columns"); UpdateDocument.FirstChild.AppendChild(cs); XmlNodeList columns = desc.SelectNodes("/WorkItemChanges/Columns/Column"); if (null == columns) { throw new MigrationException(TfsWITAdapterResources.ErrorInvalidActionDescription, action.ActionId); } foreach (XmlNode columnData in columns) { string fieldName = columnData.Attributes["DisplayName"].Value; string fieldReferenceName = columnData.Attributes["ReferenceName"].Value; string stringVal = columnData.FirstChild.InnerText; string fieldType = columnData.Attributes["Type"].Value; if (fieldReferenceName.Equals(CoreFieldReferenceNames.AreaPath) || fieldReferenceName.Equals(CoreFieldReferenceNames.IterationPath)) { GetCSSNodeId(action, workItemType, ref fieldName, ref fieldReferenceName, ref stringVal, ref hasIteration, ref hasArea);; } while (true) { try { AddColumn(cs, workItemType, fieldName, fieldReferenceName, stringVal); break; } catch (FieldNotExistException) { string sourceItemId = TfsMigrationWorkItemStore.GetSourceWorkItemId(action); string sourceItemRevision = TfsMigrationWorkItemStore.GetSourceWorkItemRevision(action); WorkItemType wit = MigrationWorkItemStore.GetWorkItemType(workItemType); MigrationConflict conflict = new InvalidFieldConflictType().CreateConflict( InvalidFieldConflictType.CreateConflictDetails(sourceItemId, sourceItemRevision, fieldReferenceName, wit), InvalidFieldConflictType.CreateScopeHint(wit.Project.Name, wit.Name), action); var conflictMgrService = MigrationWorkItemStore.ServiceContainer.GetService(typeof(ConflictManager)) as ConflictManager; Debug.Assert(null != conflictMgrService, "cannot get conflict management service."); List <MigrationAction> actions; ConflictResolutionResult resolutionRslt = conflictMgrService.TryResolveNewConflict(conflictMgrService.SourceId, conflict, out actions); if (!resolutionRslt.Resolved) { throw new MigrationUnresolvedConflictException(); } if (resolutionRslt.ResolutionType == ConflictResolutionType.UpdatedConflictedChangeAction) { XmlDocument migrationDesc = conflict.ConflictedChangeAction.MigrationActionDescription; XmlNode column = migrationDesc.SelectSingleNode(string.Format( @"/WorkItemChanges/Columns/Column[@ReferenceName=""{0}""]", fieldReferenceName)); if (null == column) { // field has been dropped by the resolution rule break; } fieldReferenceName = column.Attributes["ReferenceName"].Value; fieldName = string.Empty; } else { // unrecognized resolution action was taken throw new MigrationUnresolvedConflictException(); } } } } if (insertWorkItem) { //if (!hasArea && !ByPassrules) if (!hasArea) { AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.AreaId, MigrationWorkItemStore.Core.DefaultAreaId.ToString()); } //if (!hasIteration && !ByPassrules) if (!hasIteration) { AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.IterationId, MigrationWorkItemStore.Core.DefaultIterationId.ToString()); } AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.WorkItemType, workItemType); AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.CreatedDate, string.Empty); AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.CreatedBy, author); AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.ChangedBy, author); foreach (string missingField in ServerDataIntegrityChecker.MissingFields) { AddColumn(cs, workItemType, string.Empty, missingField, ServerDataIntegrityChecker[missingField]); } } else { AddColumn(cs, workItemType, string.Empty, CoreFieldReferenceNames.ChangedBy, author); } }