private void InitializeUniqueValues()
        {
            FieldToUniqueValues = new Dictionary <string, IList <string> >();
            foreach (var sourceWorkItem in SourceWorkItems)
            {
                foreach (var kvp in sourceWorkItem.FieldValuePairs)
                {
                    string value = kvp.Value as string;
                    if (string.IsNullOrEmpty(value))
                    {
                        continue;
                    }

                    if (SourceNameToFieldMapping.ContainsKey(kvp.Key) &&
                        SourceNameToFieldMapping[kvp.Key].HasAllowedValues)
                    {
                        if (!FieldToUniqueValues.ContainsKey(kvp.Key))
                        {
                            FieldToUniqueValues.Add(kvp.Key, new List <string>());
                        }
                        if (!FieldToUniqueValues[kvp.Key].Contains(value))
                        {
                            FieldToUniqueValues[kvp.Key].Add(value);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Save TFS Workitem and return result workitem(passed,failed or warning) depending upon the result of migration.
        /// </summary>
        /// <param name="workItem"></param>
        /// <param name="sourceWorkItem"></param>
        /// <returns></returns>
        public ISourceWorkItem SaveWorkItem(IWorkItem workItem, ISourceWorkItem sourceWorkItem)
        {
            try
            {
                workItem.Save();
            }
            catch (WorkItemMigratorException te)
            {
                return(new FailedSourceWorkItem(sourceWorkItem, te.Args.Title));
            }

            ISourceWorkItem updatedSourceWorkItem = new SourceWorkItem(sourceWorkItem);

            updatedSourceWorkItem.FieldValuePairs.Clear();
            string warning = null;
            int    id      = -1;

            switch (WorkItemTypeToCategoryMapping[SelectedWorkItemTypeName])
            {
            case TestCaseCategory:
                id = ((ITestCase)(workItem.WorkItem)).Id;
                break;

            default:
                id = ((WorkItem)(workItem.WorkItem)).Id;
                break;
            }


            foreach (var kvp in sourceWorkItem.FieldValuePairs)
            {
                string previousValue = kvp.Value as string;
                if (!string.IsNullOrEmpty(previousValue))
                {
                    if (SourceNameToFieldMapping[kvp.Key].ValueMapping.ContainsKey(previousValue) &&
                        String.CompareOrdinal(SourceNameToFieldMapping[kvp.Key].ValueMapping[previousValue], Resources.IgnoreLabel) != 0)
                    {
                        previousValue = SourceNameToFieldMapping[kvp.Key].ValueMapping[previousValue];
                    }
                    string tfsFieldName = SourceNameToFieldMapping[kvp.Key].TfsName;
                    string newValue     = workItem.GetFieldValue(tfsFieldName).ToString();
                    if (String.CompareOrdinal(previousValue, newValue) != 0 &&
                        !SourceNameToFieldMapping[kvp.Key].IsHtmlField &&
                        !SourceNameToFieldMapping[kvp.Key].IsAreaPath &&
                        !SourceNameToFieldMapping[kvp.Key].IsIterationPath)
                    {
                        warning += String.Format(CultureInfo.CurrentCulture,
                                                 "Value of Field:{0} is modified from \n'{1}'\n to \n'{2}'",
                                                 kvp.Key,
                                                 previousValue,
                                                 newValue);
                    }
                    updatedSourceWorkItem.FieldValuePairs.Add(kvp.Key, newValue);
                }
                else
                {
                    string fieldName = kvp.Key;
                    if (SourceNameToFieldMapping.ContainsKey(kvp.Key))
                    {
                        fieldName = SourceNameToFieldMapping[kvp.Key].TfsName;
                    }

                    List <SourceTestStep> testSteps = kvp.Value as List <SourceTestStep>;
                    if (testSteps != null)
                    {
                        updatedSourceWorkItem.FieldValuePairs.Add(kvp.Key, testSteps);
                    }
                    else
                    {
                        updatedSourceWorkItem.FieldValuePairs.Add(kvp.Key, workItem.GetFieldValue(fieldName));
                    }
                }
            }
            if (string.IsNullOrEmpty(warning))
            {
                return(new PassedSourceWorkItem(updatedSourceWorkItem, id));
            }
            else
            {
                return(new WarningSourceWorkItem(updatedSourceWorkItem, id, warning));
            }
        }
        /// <summary>
        /// Creates Workitem from Source Workitem
        /// </summary>
        /// <param name="sourceWorkItem"></param>
        /// <returns></returns>
        public IWorkItem CreateWorkItem(ISourceWorkItem sourceWorkItem)
        {
            if (sourceWorkItem == null)
            {
                throw new ArgumentNullException("sourceWorkItem", "source work item");
            }

            // Initializing the variables
            IWorkItem workItem = null;

            // Initializing the Workitem
            switch (WorkItemTypeToCategoryMapping[SelectedWorkItemTypeName])
            {
            case TestCaseCategory:
                TestCase testCase = new TestCase(m_teamProject, SelectedWorkItemTypeName, IsTFS2012);
                workItem = testCase;
                break;

            default:
                workItem = new WorkItemBase(m_teamProject.WitProject, SelectedWorkItemTypeName);
                break;
            }

            workItem.Create();

            // iterating through each field-value pair
            foreach (KeyValuePair <string, object> kvp in sourceWorkItem.FieldValuePairs)
            {
                // Refernce Name of the field which is to be updated
                string fieldName = kvp.Key;

                // value of the field which has to assigned
                object fieldValue = kvp.Value;

                // Gets the correct field reference name
                if (SourceNameToFieldMapping.ContainsKey(kvp.Key))
                {
                    fieldName = SourceNameToFieldMapping[kvp.Key].TfsName;

                    if (CreateAreaIterationPath && SourceNameToFieldMapping[kvp.Key].IsAreaPath)
                    {
                        // Create area path if it does not already exist.
                        fieldValue = m_areaAndIterationPathCreator.Create(Node.TreeType.Area, fieldValue as string);
                        SourceNameToFieldMapping[kvp.Key].ValueMapping.Clear();
                    }

                    if (CreateAreaIterationPath && SourceNameToFieldMapping[kvp.Key].IsIterationPath)
                    {
                        // Create area path if it does not already exist.
                        fieldValue = m_areaAndIterationPathCreator.Create(Node.TreeType.Iteration, fieldValue as string);
                        SourceNameToFieldMapping[kvp.Key].ValueMapping.Clear();
                    }


                    // If it is autogenerated value then just ignore the assignment of value and continue to next iteration
                    if (SourceNameToFieldMapping[kvp.Key].IsAutoGenerated)
                    {
                        continue;
                    }
                }

                string value = kvp.Value as string;

                // value to assign is of type string and it is not null
                if (value != null)
                {
                    // If this value is dataMapped
                    if (SourceNameToFieldMapping.ContainsKey(kvp.Key) && SourceNameToFieldMapping[kvp.Key].ValueMapping.ContainsKey(value))
                    {
                        if (String.Compare(SourceNameToFieldMapping[kvp.Key].ValueMapping[value], Resources.IgnoreLabel, StringComparison.CurrentCulture) == 0)
                        {
                            continue;
                        }
                        else
                        {
                            // else sets the correct data value
                            fieldValue = SourceNameToFieldMapping[kvp.Key].ValueMapping[value];
                        }
                    }
                }

                // Update the workitem with field-value
                workItem.UpdateField(fieldName, fieldValue);
            }
            // return the workitem
            return(workItem);
        }