コード例 #1
0
ファイル: ALMIntegration.cs プロジェクト: svendster/Ginger
        internal ObservableList <ExternalItemFieldBase> GetUpdatedFields(ObservableList <ExternalItemFieldBase> mItemsFields, bool online, BackgroundWorker bw = null)
        {
            ObservableList <ExternalItemFieldBase> updatedFields = new ObservableList <ExternalItemFieldBase>();

            if (AlmCore.AlmItemFields != null)
            {
                foreach (ExternalItemFieldBase defaultField in AlmCore.AlmItemFields)
                {
                    ExternalItemFieldBase currentField = mItemsFields.Where(x => x.ID == defaultField.ID && x.ItemType == defaultField.ItemType).FirstOrDefault();
                    if (currentField != null)
                    {
                        currentField.ToUpdate = false;
                        if (string.IsNullOrEmpty(currentField.SelectedValue) == false)
                        {
                            if ((defaultField.PossibleValues.Count == 0 && currentField.SelectedValue != defaultField.SelectedValue) || (defaultField.PossibleValues.Count > 0 && defaultField.PossibleValues.Contains(currentField.SelectedValue) && currentField.SelectedValue != defaultField.PossibleValues[0]))
                            {
                                currentField.ToUpdate = true;
                                updatedFields.Add(currentField);
                            }
                            else
                            {
                                currentField.SelectedValue = defaultField.SelectedValue;
                                currentField.ToUpdate      = false;
                            }
                        }
                        else
                        {
                            currentField.SelectedValue = defaultField.SelectedValue;
                            currentField.ToUpdate      = false;
                        }
                    }
                }
            }
            return(updatedFields);
        }
コード例 #2
0
 private void RefreshgrdDefectsFieldsHandler(object sender, RoutedEventArgs e)
 {
     ALMDefectProfile AlmDefectProfile = (ALMDefectProfile)grdDefectsProfiles.CurrentItem;
     {
         mALMDefectProfileFields = FetchDefectFields(AlmDefectProfile.AlmType);
         mALMDefectProfileFields.Where(z => z.Mandatory).ToList().ForEach(x => x.SelectedValue = string.Empty);
         mALMDefectProfileFieldsExisted = new ObservableList <ExternalItemFieldBase>();
         foreach (ExternalItemFieldBase aLMDefectProfileField in mALMDefectProfileFields)
         {
             ExternalItemFieldBase aLMDefectProfileFieldExisted = (ExternalItemFieldBase)aLMDefectProfileField.CreateCopy();
             if (!string.IsNullOrEmpty(aLMDefectProfileField.ExternalID))
             {
                 aLMDefectProfileFieldExisted.ExternalID = string.Copy(aLMDefectProfileField.ExternalID);
             }
             ExternalItemFieldBase field = AlmDefectProfile.ALMDefectProfileFields.Where(x => x.ID == aLMDefectProfileField.ID).FirstOrDefault();
             if (field != null)
             {
                 aLMDefectProfileFieldExisted.SelectedValue = field.SelectedValue;
             }
             aLMDefectProfileFieldExisted.PossibleValues = aLMDefectProfileField.PossibleValues;
             mALMDefectProfileFieldsExisted.Add(aLMDefectProfileFieldExisted);
         }
         AlmDefectProfile.ALMDefectProfileFields = mALMDefectProfileFieldsExisted;
     }
 }
コード例 #3
0
        private ObservableList <ExternalItemFieldBase> AddFieldsValues(List <QTestApiModel.FieldResource> testSetfieldsCollection, string testSetfieldInRestSyntax)
        {
            //TODO: need to handle duplicate fields
            ObservableList <ExternalItemFieldBase> fields = new ObservableList <ExternalItemFieldBase>();

            if ((testSetfieldsCollection != null) && (testSetfieldsCollection.Count > 0))
            {
                foreach (QTestApiModel.FieldResource field in testSetfieldsCollection)
                {
                    if (string.IsNullOrEmpty(field.Label))
                    {
                        continue;
                    }
                    ExternalItemFieldBase itemfield = new ExternalItemFieldBase();
                    itemfield.ID         = field.Id.ToString();
                    itemfield.ExternalID = field.OriginalName;  // Temp ??? Check if ExternalID has other use in this case
                    itemfield.Name       = field.Label;
                    bool isMandatory;
                    bool.TryParse(field.Required.ToString(), out isMandatory);
                    itemfield.Mandatory = isMandatory;
                    bool isSystemField;
                    bool.TryParse(field.SystemField.ToString(), out isSystemField);
                    itemfield.SystemFieled = isSystemField;
                    if (itemfield.Mandatory)
                    {
                        itemfield.ToUpdate = true;
                    }
                    itemfield.ItemType = testSetfieldInRestSyntax;
                    itemfield.Type     = field.DataType;

                    if (field.AllowedValues != null)
                    {
                        foreach (QTestApiModel.AllowedValueResource value in field.AllowedValues)
                        {
                            itemfield.PossibleValues.Add(value.Label);
                        }
                    }

                    if (itemfield.PossibleValues.Count > 0)
                    {
                        if (field.DefaultValue != null)
                        {
                            itemfield.SelectedValue = field.DefaultValue;
                        }
                        else
                        {
                            itemfield.SelectedValue = itemfield.PossibleValues[0];
                        }
                    }
                    else
                    {
                        itemfield.SelectedValue = "Unassigned";
                    }

                    fields.Add(itemfield);
                }
            }

            return(fields);
        }
コード例 #4
0
ファイル: ALMIntegration.cs プロジェクト: ShohamWeiss/Ginger
        public void RefreshALMItemFields(ObservableList <ExternalItemFieldBase> exitingFields, bool online, BackgroundWorker bw = null)
        {
            if (ALMIntegration.Instance.AutoALMProjectConnect())
            {
                //Get latestALMFields from ALMCore with Online flag
                ObservableList <ExternalItemFieldBase> latestALMFields = AlmCore.GetALMItemFields(bw, online);

                //Merging Latest with exiting
                if (exitingFields == null)
                {
                    exitingFields = new ObservableList <ExternalItemFieldBase>();
                }

                foreach (ExternalItemFieldBase latestField in latestALMFields)
                {
                    ExternalItemFieldBase existingField = exitingFields.Where(x => x.ID == latestField.ID).FirstOrDefault();
                    if (existingField != null)
                    {
                        existingField.Name       = latestField.Name;
                        existingField.ItemType   = latestField.ItemType;
                        existingField.Mandatory  = latestField.Mandatory;
                        existingField.ExternalID = latestField.ExternalID;

                        if (latestField.Mandatory == true)
                        {
                            existingField.ToUpdate = true;
                        }

                        existingField.PossibleValues = latestField.PossibleValues;
                        if (string.IsNullOrEmpty(existingField.SelectedValue) == false)
                        {
                            if (!latestField.PossibleValues.Contains(existingField.SelectedValue))
                            {
                                existingField.SelectedValue = latestField.SelectedValue;
                            }
                        }
                        else
                        {
                            existingField.SelectedValue = latestField.SelectedValue;
                        }
                    }
                    else
                    {
                        exitingFields.Add(latestField);
                    }
                }

                //Sorting the list
                ObservableList <ExternalItemFieldBase> sortedFields = new ObservableList <ExternalItemFieldBase>(from i in exitingFields orderby i.ItemType select i);
                exitingFields.ClearAll();
                exitingFields.Append(sortedFields);
            }
        }
コード例 #5
0
        public void RefreshALMItemFields(ObservableList <ExternalItemFieldBase> exitingFields, bool online, BackgroundWorker bw = null)
        {
            ObservableList <ExternalItemFieldBase> mergedFields = new ObservableList <ExternalItemFieldBase>();

            if (ALMIntegration.Instance.AutoALMProjectConnect())
            {
                //Get latestALMFields from ALMCore with Online flag
                ObservableList <ExternalItemFieldBase> latestALMFields = AlmCore.GetALMItemFields(bw, online);

                foreach (ExternalItemFieldBase latestField in latestALMFields)
                {
                    ExternalItemFieldBase currentField = exitingFields.Where(x => x.ID == latestField.ID && x.ItemType == latestField.ItemType).FirstOrDefault();
                    if (currentField != null)
                    {
                        currentField.Name           = latestField.Name;
                        currentField.ItemType       = latestField.ItemType;
                        currentField.Mandatory      = latestField.Mandatory;
                        currentField.ExternalID     = latestField.ExternalID;
                        currentField.PossibleValues = latestField.PossibleValues;
                        currentField.ToUpdate       = false;
                        if (string.IsNullOrEmpty(currentField.SelectedValue) == false)
                        {
                            if ((latestField.PossibleValues.Count == 0 && currentField.SelectedValue != latestField.SelectedValue) || (latestField.PossibleValues.Count > 0 && latestField.PossibleValues.Contains(currentField.SelectedValue) && currentField.SelectedValue != latestField.PossibleValues[0]))
                            {
                                currentField.ToUpdate = true;
                            }
                            else
                            {
                                currentField.SelectedValue = latestField.SelectedValue;
                                currentField.ToUpdate      = false;
                            }
                        }
                        else
                        {
                            currentField.SelectedValue = latestField.SelectedValue;
                            currentField.ToUpdate      = false;
                        }
                        mergedFields.Add(currentField);
                    }
                    else
                    {
                        mergedFields.Add(latestField);
                    }
                }

                exitingFields.ClearAll();
                exitingFields.Append(mergedFields);
            }
        }
コード例 #6
0
        public ALMDefectsProfilesPage()
        {
            Mouse.OverrideCursor = Cursors.Wait;
            InitializeComponent();

            mALMDefectProfiles      = WorkSpace.Instance.SolutionRepository.GetAllRepositoryItems <ALMDefectProfile>();
            mALMDefectProfileFields = ALMIntegration.Instance.GetALMItemFieldsREST(true, ALM_Common.DataContracts.ResourceType.DEFECT, null);
            mALMDefectProfileFields.Where(z => z.Mandatory != true).ToList().ForEach(x => x.SelectedValue = string.Empty);

            // populated values list (the not saved), validate selected values/fields current existing in QC
            foreach (ALMDefectProfile aLMDefectProfile in mALMDefectProfiles)
            {
                mALMDefectProfileFieldsExisted = new ObservableList <ExternalItemFieldBase>();
                foreach (ExternalItemFieldBase aLMDefectProfileField in mALMDefectProfileFields)
                {
                    ExternalItemFieldBase aLMDefectProfileFieldExisted = (ExternalItemFieldBase)aLMDefectProfileField.CreateCopy();
                    if (!string.IsNullOrEmpty(aLMDefectProfileField.ExternalID))
                    {
                        aLMDefectProfileFieldExisted.ExternalID = string.Copy(aLMDefectProfileField.ExternalID);
                    }
                    ExternalItemFieldBase field = aLMDefectProfile.ALMDefectProfileFields.Where(x => x.ID == aLMDefectProfileField.ID).FirstOrDefault();
                    if (field != null)
                    {
                        aLMDefectProfileFieldExisted.SelectedValue = field.SelectedValue;
                    }
                    aLMDefectProfileFieldExisted.PossibleValues = aLMDefectProfileField.PossibleValues;
                    mALMDefectProfileFieldsExisted.Add(aLMDefectProfileFieldExisted);
                }
                aLMDefectProfile.ALMDefectProfileFields = mALMDefectProfileFieldsExisted;
            }

            grdDefectsProfiles.DataSourceList = mALMDefectProfiles;
            if (mALMDefectProfiles != null)
            {
                if (grdDefectsProfiles.CurrentItem != null)
                {
                    grdDefectsFields.DataSourceList = ((ALMDefectProfile)grdDefectsProfiles.CurrentItem).ALMDefectProfileFields;
                }
            }

            SetFieldsGrid();
            Mouse.OverrideCursor = null;
            _manualCheckedEvent  = true;
        }
コード例 #7
0
        public static ObservableList <ExternalItemFieldBase> RefreshItemFields(eRQMItemType itemType, ObservableList <ExternalItemFieldBase> exitingFields, BackgroundWorker bw)
        {
            ObservableList <ExternalItemFieldBase> updatedFields   = GetItemFields(itemType, bw);
            ObservableList <ExternalItemFieldBase> refreshedFields = new ObservableList <ExternalItemFieldBase>();


            foreach (ExternalItemFieldBase field in updatedFields)
            {
                if (exitingFields != null)
                {
                    ExternalItemFieldBase existingField = exitingFields.Where(x => x.ItemType == itemType.ToString() && x.ID == field.ID).FirstOrDefault();
                    if (existingField != null)
                    {
                        if (field.Mandatory == false)
                        {
                            field.ToUpdate = existingField.ToUpdate;
                        }

                        if (string.IsNullOrEmpty(existingField.SelectedValue) == false)
                        {
                            if (field.PossibleValues.Count > 0)
                            {
                                if (field.PossibleValues.Contains(existingField.SelectedValue))
                                {
                                    field.SelectedValue = existingField.SelectedValue;
                                }
                            }
                            else
                            {
                                field.SelectedValue = existingField.SelectedValue;
                            }
                        }
                    }
                }

                refreshedFields.Add(field);
            }

            //TODO: sort the fields by ItemType before returning
            ObservableList <ExternalItemFieldBase> sortedFields = refreshedFields;

            refreshedFields = new ObservableList <ExternalItemFieldBase>(from i in sortedFields orderby i.ItemType select i);
            return(refreshedFields);
        }
コード例 #8
0
ファイル: ALMCore.cs プロジェクト: Ginger-Automation/Ginger
        public ObservableList <ExternalItemFieldBase> RefreshALMItemFields(ObservableList <ExternalItemFieldBase> exitingFields, ObservableList <ExternalItemFieldBase> latestALMFields)
        {
            ObservableList <ExternalItemFieldBase> mergedFields = new ObservableList <ExternalItemFieldBase>();

            foreach (ExternalItemFieldBase latestField in latestALMFields)
            {
                ExternalItemFieldBase currentField = exitingFields.Where(x => x.ID == latestField.ID && x.ItemType == latestField.ItemType).FirstOrDefault();
                if (currentField != null)
                {
                    currentField.Name           = latestField.Name;
                    currentField.ItemType       = latestField.ItemType;
                    currentField.Mandatory      = latestField.Mandatory;
                    currentField.ExternalID     = latestField.ExternalID;
                    currentField.PossibleValues = latestField.PossibleValues;
                    currentField.ToUpdate       = false;
                    if (string.IsNullOrEmpty(currentField.SelectedValue) == false)
                    {
                        if ((latestField.PossibleValues.Count == 0 && currentField.SelectedValue != latestField.SelectedValue) || (latestField.PossibleValues.Count > 0 && latestField.PossibleValues.Contains(currentField.SelectedValue) && currentField.SelectedValue != latestField.PossibleValues[0]))
                        {
                            currentField.ToUpdate = true;
                        }
                        else
                        {
                            currentField.SelectedValue = latestField.SelectedValue;
                            currentField.ToUpdate      = false;
                        }
                    }
                    else
                    {
                        currentField.SelectedValue = latestField.SelectedValue;
                        currentField.ToUpdate      = false;
                    }
                    mergedFields.Add(currentField);
                }
                else
                {
                    mergedFields.Add(latestField);
                }
            }
            exitingFields.ClearAll();
            exitingFields.Append(mergedFields);

            return(mergedFields);
        }
コード例 #9
0
        private void Save(object sender, RoutedEventArgs e)
        {
            if (mALMDefectProfiles.Where(x => x.IsDefault == true).ToList().Count == 0)
            {
                Reporter.ToUser(eUserMsgKeys.NoDefaultDefectProfileSelected);
                return;
            }

            foreach (ALMDefectProfile _ALMDefectProfile in mALMDefectProfiles.Where(x => x.ToUpdate == true).ToList())
            {
                ExternalItemFieldBase notPopulatedMandatoryField = _ALMDefectProfile.ALMDefectProfileFields.Where(x => x.Mandatory == true && x.ExternalID != "description" &&
                                                                                                                  x.ExternalID != "name" &&
                                                                                                                  x.ExternalID != "Summary" && (x.SelectedValue == null || x.SelectedValue == string.Empty)).FirstOrDefault();
                if (notPopulatedMandatoryField != null)
                {
                    Reporter.ToUser(eUserMsgKeys.MissedMandatotryFields, notPopulatedMandatoryField.Name, _ALMDefectProfile.Name);
                    return;
                }

                ExternalItemFieldBase wrongSelectedField = _ALMDefectProfile.ALMDefectProfileFields.Where(x => x.SelectedValue != null && x.SelectedValue != string.Empty && x.PossibleValues.Count > 0 && (!x.PossibleValues.Contains(x.SelectedValue))).FirstOrDefault();
                if (wrongSelectedField != null)
                {
                    Reporter.ToUser(eUserMsgKeys.WrongValueSelectedFromTheList, wrongSelectedField.Name, _ALMDefectProfile.Name);
                    return;
                }
            }

            foreach (ALMDefectProfile _ALMDefectProfile in mALMDefectProfiles.Where(x => x.ToUpdate == true).ToList())
            {
                Reporter.ToGingerHelper(eGingerHelperMsgKey.SaveItem, null, _ALMDefectProfile.GetNameForFileName(), "item");
                if ((_ALMDefectProfile.ContainingFolder == null) || (_ALMDefectProfile.ContainingFolder == string.Empty))
                {
                    _ALMDefectProfile.ContainingFolder = App.UserProfile.Solution.Folder + _ALMDefectProfile.ObjFolderName;
                    _ALMDefectProfile.FilePath         = _ALMDefectProfile.ContainingFolder + @"\" + _ALMDefectProfile.FilePath;
                }
                WorkSpace.Instance.SolutionRepository.SaveRepositoryItem(_ALMDefectProfile);
                Reporter.CloseGingerHelper();
            }

            genWin.Close();
        }
コード例 #10
0
        private void AddDefectsProfile(object sender, RoutedEventArgs e)
        {
            Mouse.OverrideCursor = Cursors.Wait;
            ALMDefectProfile newALMDefectProfile = new ALMDefectProfile();

            newALMDefectProfile.ToUpdate = true;
            if (mALMDefectProfiles.Count == 0)
            {
                newALMDefectProfile.IsDefault = true;
                newALMDefectProfile.ID        = 1;
            }
            else
            {
                newALMDefectProfile.ID        = mALMDefectProfiles.Select(x => x.ID).Max() + 1;
                newALMDefectProfile.IsDefault = false;
            }
            newALMDefectProfile.Name        = "Some Name " + (newALMDefectProfile.ID + 1).ToString();
            newALMDefectProfile.Description = "Some Description " + (newALMDefectProfile.ID + 1).ToString();
            mALMDefectProfiles.Add(newALMDefectProfile);

            // mALMDefectProfileFields.ToList().ForEach(x => newALMDefectProfile.ALMDefectProfileFields.Add((ExternalItemFieldBase)x.CreateCopy()));

            mALMDefectProfileFieldsExisted = new ObservableList <ExternalItemFieldBase>();
            foreach (ExternalItemFieldBase aLMDefectProfileField in mALMDefectProfileFields)
            {
                ExternalItemFieldBase aLMDefectProfileFieldExisted = (ExternalItemFieldBase)aLMDefectProfileField.CreateCopy();
                if (!string.IsNullOrEmpty(aLMDefectProfileField.ExternalID))
                {
                    aLMDefectProfileFieldExisted.ExternalID = string.Copy(aLMDefectProfileField.ExternalID);
                }
                aLMDefectProfileFieldExisted.PossibleValues = aLMDefectProfileField.PossibleValues;
                mALMDefectProfileFieldsExisted.Add(aLMDefectProfileFieldExisted);
            }
            newALMDefectProfile.ALMDefectProfileFields = mALMDefectProfileFieldsExisted;

            grdDefectsProfiles.DataSourceList = mALMDefectProfiles;
            grdDefectsFields.DataSourceList   = newALMDefectProfile.ALMDefectProfileFields;
            Mouse.OverrideCursor = null;
        }
コード例 #11
0
        private void Save(object sender, RoutedEventArgs e)
        {
            if (mALMDefectProfiles.Where(x => x.IsDefault == true).ToList().Count == 0)
            {
                Reporter.ToUser(eUserMsgKey.NoDefaultDefectProfileSelected);
                return;
            }

            //
            // Validation section
            foreach (ALMDefectProfile _ALMDefectProfile in mALMDefectProfiles.Where(x => x.ToUpdate == true).ToList())
            {
                // Mandatory fields validation
                ExternalItemFieldBase notPopulatedMandatoryField = _ALMDefectProfile.ALMDefectProfileFields.Where(x => x.Mandatory == true && x.ExternalID != "description" &&
                                                                                                                  x.ExternalID != "name" &&
                                                                                                                  x.ExternalID != "Summary" && (x.SelectedValue == null || x.SelectedValue == string.Empty)).FirstOrDefault();
                if (notPopulatedMandatoryField != null)
                {
                    Reporter.ToUser(eUserMsgKey.MissedMandatotryFields, notPopulatedMandatoryField.Name, _ALMDefectProfile.Name);
                    return;
                }

                // Wrong list selection validation
                ExternalItemFieldBase wrongSelectedField = _ALMDefectProfile.ALMDefectProfileFields.Where(x => ((string.Equals(x.Type, "LookupList", StringComparison.OrdinalIgnoreCase) || string.Equals(x.Type, "UserList", StringComparison.OrdinalIgnoreCase))) &&
                                                                                                          x.SelectedValue != null && x.SelectedValue != string.Empty &&
                                                                                                          x.PossibleValues.Count > 0 && (!x.PossibleValues.Contains(x.SelectedValue))).FirstOrDefault();
                if (wrongSelectedField != null)
                {
                    Reporter.ToUser(eUserMsgKey.WrongValueSelectedFromTheList, wrongSelectedField.Name, _ALMDefectProfile.Name);
                    return;
                }

                // Numeric selection validation
                int numeric = 0;
                ExternalItemFieldBase wrongNonNumberValueField = _ALMDefectProfile.ALMDefectProfileFields.Where(x => (string.Equals(x.Type, "Number", StringComparison.OrdinalIgnoreCase)) &&
                                                                                                                x.SelectedValue != null && x.SelectedValue != string.Empty &&
                                                                                                                !(int.TryParse(x.SelectedValue, out numeric))).FirstOrDefault();
                if (wrongNonNumberValueField != null)
                {
                    Reporter.ToUser(eUserMsgKey.WrongNonNumberValueInserted, wrongNonNumberValueField.Name, _ALMDefectProfile.Name);
                    return;
                }

                // Date selection validation (QC receiving date in format yyyy-mm-dd)
                DateTime dt;
                ExternalItemFieldBase wrongDateValueField = _ALMDefectProfile.ALMDefectProfileFields.Where(x => (string.Equals(x.Type, "Date", StringComparison.OrdinalIgnoreCase)) &&
                                                                                                           x.SelectedValue != null && x.SelectedValue != string.Empty &&
                                                                                                           !(DateTime.TryParseExact(x.SelectedValue, "yyyy-mm-dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt))).FirstOrDefault();
                if (wrongDateValueField != null)
                {
                    Reporter.ToUser(eUserMsgKey.WrongDateValueInserted, wrongDateValueField.Name, _ALMDefectProfile.Name);
                    return;
                }
            }

            foreach (ALMDefectProfile _ALMDefectProfile in mALMDefectProfiles.Where(x => x.ToUpdate == true).ToList())
            {
                Reporter.ToStatus(eStatusMsgKey.SaveItem, null, _ALMDefectProfile.GetNameForFileName(), "item");
                if ((_ALMDefectProfile.ContainingFolder == null) || (_ALMDefectProfile.ContainingFolder == string.Empty))
                {
                    _ALMDefectProfile.ContainingFolder = System.IO.Path.Combine(WorkSpace.Instance.Solution.Folder, _ALMDefectProfile.ObjFolderName);
                    _ALMDefectProfile.FilePath         = _ALMDefectProfile.ContainingFolder + @"\" + _ALMDefectProfile.FilePath;
                }
                WorkSpace.Instance.SolutionRepository.SaveRepositoryItem(_ALMDefectProfile);
                Reporter.HideStatusMessage();
            }

            genWin.Close();
        }
コード例 #12
0
        public static ObservableList <ExternalItemFieldBase> GetItemFields(eRQMItemType itemType, BackgroundWorker bw)
        {
            ObservableList <ExternalItemFieldBase> fields = new ObservableList <ExternalItemFieldBase>();
            //TODO : receive as parameters:
            RqmRepository rqmRep = new RqmRepository();
            List <IProjectDefinitions> rqmProjectsDataList;
            //string rqmSserverUrl = loginData.Server.ToString() + "/";
            string   rqmSserverUrl = ALMCore.AlmConfig.ALMServerURL + "/";
            LoginDTO loginData     = new LoginDTO()
            {
                User = ALMCore.AlmConfig.ALMUserName, Password = ALMCore.AlmConfig.ALMPassword, Server = ALMCore.AlmConfig.ALMServerURL
            };
            IProjectData rqmProjectsData = rqmRep.GetVisibleProjects(loginData);

            rqmProjectsDataList = rqmProjectsData.IProjectDefinitions;
            IProjectDefinitions currentProj = rqmProjectsDataList.FirstOrDefault();
            string rqmDomain  = currentProj.Prefix;
            string rqmProject = currentProj.ProjectName;

            //------------------------------- Improved solution

            string baseUri_               = string.Empty;
            string selfLink_              = string.Empty;
            int    maxPageNumber_         = 0;
            int    totalCategoryTypeCount = 0;

            string categoryValue  = string.Empty; // --> itemfield.PossibleValues.Add(ccNode.Name);
            string categoryTypeID = string.Empty; //--> itemfield.ID

            //TODO: Populate list fields with CategoryTypes
            populatedValue = "Starting fields retrieve process... ";
            bw.ReportProgress(totalValues, populatedValue);
            RqmResponseData categoryType     = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(rqmSserverUrl + rqmDomain + "/service/com.ibm.rqm.integration.service.IIntegrationService/resources/" + rqmProject + "/categoryType"));
            XmlDocument     categoryTypeList = new XmlDocument();

            if (!string.IsNullOrEmpty(categoryType.responseText))
            {
                categoryTypeList.LoadXml(categoryType.responseText);
            }

            //TODO: Get 'next' and 'last links
            XmlNodeList linkList_ = categoryTypeList.GetElementsByTagName("link");

            if (linkList_.Count > 0)
            {
                XmlNode selfPage  = linkList_.Item(1);
                XmlNode lastPage_ = linkList_.Item(3);

                if (selfPage.Attributes["rel"].Value.ToString() == "self") //verify self link is present
                {
                    selfLink_ = selfPage.Attributes["href"].Value.ToString();
                    //baseUri_ = selfLink_.Substring(0, selfLink_.Length - 1);
                    baseUri_ = selfLink_;
                }

                if (lastPage_.Attributes["rel"].Value.ToString() == "last")    //verify there is more than one page
                {
                    if (selfPage.Attributes["rel"].Value.ToString() == "self") //verify self link is present
                    {
                        selfLink_ = selfPage.Attributes["href"].Value.ToString();
                        baseUri_  = selfLink_.Substring(0, selfLink_.Length - 1);
                    }

                    string tempString_ = lastPage_.Attributes["href"].Value.ToString();
                    maxPageNumber_ = System.Convert.ToInt32(tempString_.Substring(tempString_.LastIndexOf('=') + 1));
                }
                string        newUri_ = string.Empty;
                List <string> categoryTypeUriPages = new List <string>();
                //List<ExternalItemFieldBase> tempFieldList = new List<ExternalItemFieldBase>();
                ConcurrentBag <ExternalItemFieldBase> catTypeRsult = new ConcurrentBag <ExternalItemFieldBase>();

                for (int k = 0; k <= maxPageNumber_; k++)
                {
                    if (maxPageNumber_ > 0)
                    {
                        newUri_ = baseUri_ + k.ToString();
                        categoryTypeUriPages.Add(newUri_);
                    }
                    else
                    {
                        newUri_ = baseUri_;
                        categoryTypeUriPages.Add(newUri_);
                    }
                }

                //Parallel computing solution
                List <XmlNode> entryList = new List <XmlNode>();
                if (categoryTypeUriPages.Count > 1)
                {
                    Parallel.ForEach(categoryTypeUriPages.AsParallel(), categoryTypeUri =>
                    {
                        newUri_      = categoryTypeUri;
                        categoryType = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(newUri_));
                        if (!string.IsNullOrEmpty(categoryType.responseText))
                        {
                            categoryTypeList.LoadXml(categoryType.responseText);
                        }

                        //TODO: Get all ID links under entry:
                        XmlNodeList categoryTypeEntry_ = categoryTypeList.GetElementsByTagName("entry");

                        foreach (XmlNode entryNode in categoryTypeEntry_)
                        {
                            entryList.Add(entryNode);
                        }

                        ParallelLoopResult innerResult = Parallel.ForEach(entryList.AsParallel(), singleEntry =>
                        {
                            XmlNodeList innerNodes          = singleEntry.ChildNodes;
                            XmlNode linkNode                = innerNodes.Item(4);
                            ExternalItemFieldBase itemfield = new ExternalItemFieldBase();

                            string getIDlink = string.Empty;
                            getIDlink        = linkNode.Attributes["href"].Value.ToString(); // retrived CategoryType link


                            RqmResponseData categoryTypeDetail = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(getIDlink));
                            //System.Diagnostics.Debug.WriteLine("entered loop 2");

                            XmlDocument categoryTypeListing = new XmlDocument();
                            if (!string.IsNullOrEmpty(categoryTypeDetail.responseText))
                            {
                                categoryTypeListing.LoadXml(categoryTypeDetail.responseText);
                            }


                            string categoryTypeName      = string.Empty; // -->itemfield.Name
                            string categoryTypeItemType  = string.Empty; //-->itemfield.ItemType
                            string categoryTypeMandatory = string.Empty; // --> itemfield.Mandatory & initial value for : --> itemfield.ToUpdate

                            string typeIdentifier = categoryTypeListing.GetElementsByTagName("ns3:identifier").Item(0).InnerText;
                            categoryTypeID        = typeIdentifier.Substring(typeIdentifier.LastIndexOf(':') + 1);
                            categoryTypeName      = categoryTypeListing.GetElementsByTagName("ns3:title").Item(0).InnerText;
                            categoryTypeItemType  = categoryTypeListing.GetElementsByTagName("ns2:scope").Item(0).InnerText;
                            categoryTypeMandatory = categoryTypeListing.GetElementsByTagName("ns2:required").Item(0).InnerText;


                            itemfield.ItemType = categoryTypeItemType;
                            itemfield.ID       = categoryTypeID;
                            itemfield.Name     = categoryTypeName;
                            if (itemfield.SelectedValue == null)
                            {
                                itemfield.SelectedValue = "NA";
                            }

                            if (categoryTypeMandatory == "true")
                            {
                                itemfield.ToUpdate  = true;
                                itemfield.Mandatory = true;
                            }
                            else
                            {
                                itemfield.ToUpdate  = false;
                                itemfield.Mandatory = false;
                            }

                            catTypeRsult.Add(itemfield);
                            populatedValue = "Populating field :" + categoryTypeName + " \r\nNumber of fields populated :" + catTypeRsult.Count;
                            bw.ReportProgress(catTypeRsult.Count, populatedValue);
                        });
                    });
                }
                else
                {
                    populatedValue = string.Empty;
                    newUri_        = baseUri_;
                    categoryType   = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(newUri_));

                    if (!string.IsNullOrEmpty(categoryType.responseText))
                    {
                        categoryTypeList.LoadXml(categoryType.responseText);
                    }

                    //TODO: Get all ID links under entry:
                    XmlNodeList categoryTypeEntry_ = categoryTypeList.GetElementsByTagName("entry");

                    foreach (XmlNode entryNode in categoryTypeEntry_)
                    {
                        entryList.Add(entryNode);
                    }

                    ParallelLoopResult innerResult = Parallel.ForEach(entryList.AsParallel(), singleEntry =>
                    {
                        XmlNodeList innerNodes          = singleEntry.ChildNodes;
                        XmlNode linkNode                = innerNodes.Item(4);
                        ExternalItemFieldBase itemfield = new ExternalItemFieldBase();

                        string getIDlink = string.Empty;
                        getIDlink        = linkNode.Attributes["href"].Value.ToString(); // retrived CategoryType link

                        RqmResponseData categoryTypeDetail = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(getIDlink));

                        XmlDocument categoryTypeListing = new XmlDocument();

                        if (!string.IsNullOrEmpty(categoryTypeDetail.responseText))
                        {
                            categoryTypeListing.LoadXml(categoryTypeDetail.responseText);
                        }

                        string categoryTypeName      = string.Empty; // -->itemfield.Name
                        string categoryTypeItemType  = string.Empty; //-->itemfield.ItemType
                        string categoryTypeMandatory = string.Empty; // --> itemfield.Mandatory & initial value for : --> itemfield.ToUpdate

                        string typeIdentifier = categoryTypeListing.GetElementsByTagName("ns3:identifier").Item(0).InnerText;
                        categoryTypeID        = typeIdentifier.Substring(typeIdentifier.LastIndexOf(':') + 1);
                        categoryTypeName      = categoryTypeListing.GetElementsByTagName("ns3:title").Item(0).InnerText;
                        categoryTypeItemType  = categoryTypeListing.GetElementsByTagName("ns2:scope").Item(0).InnerText;
                        categoryTypeMandatory = categoryTypeListing.GetElementsByTagName("ns2:required").Item(0).InnerText;

                        itemfield.ItemType = categoryTypeItemType;
                        itemfield.ID       = categoryTypeID;
                        itemfield.Name     = categoryTypeName;
                        if (itemfield.SelectedValue == null)
                        {
                            itemfield.SelectedValue = "NA";
                        }

                        if (categoryTypeMandatory == "true")
                        {
                            itemfield.ToUpdate  = true;
                            itemfield.Mandatory = true;
                        }
                        else
                        {
                            itemfield.ToUpdate  = false;
                            itemfield.Mandatory = false;
                        }

                        catTypeRsult.Add(itemfield);
                        populatedValue = "Populating field :" + categoryTypeName + " \r\n Number of fields populated :" + catTypeRsult.Count;
                        bw.ReportProgress(catTypeRsult.Count, populatedValue);
                    });
                }

                foreach (ExternalItemFieldBase field in catTypeRsult)
                {
                    fields.Add(field);
                    totalCategoryTypeCount++;
                    System.Diagnostics.Debug.WriteLine("Number of retrieved fields:" + totalCategoryTypeCount);
                }

                //TODO: Add Values to CategoryTypes Parallel
                populatedValue = "Starting values retrieve process... ";
                bw.ReportProgress(totalValues, populatedValue);

                RqmResponseData category     = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(rqmSserverUrl + rqmDomain + "/service/com.ibm.rqm.integration.service.IIntegrationService/resources/" + rqmProject + "/category"));
                XmlDocument     CategoryList = new XmlDocument();
                CategoryList.LoadXml(category.responseText);
                totalValues    = 0;
                populatedValue = string.Empty;

                //TODO: Get 'next' and 'last links
                XmlNodeList linkList     = CategoryList.GetElementsByTagName("link");
                XmlNode     selfPageNode = linkList.Item(1);
                XmlNode     lastPageNode = linkList.Item(3);

                string selfLink = selfPageNode.Attributes["href"].Value.ToString();
                string baseUri  = selfLink.Substring(0, selfLink.Length - 1);

                string        tempString       = lastPageNode.Attributes["href"].Value.ToString();
                int           maxPageNumber    = System.Convert.ToInt32(tempString.Substring(tempString.LastIndexOf('=') + 1));
                string        newUri           = string.Empty;
                List <string> categoryUriPages = new List <string>();

                for (int i = 0; i <= maxPageNumber; i++)
                //for (int i = 0; i <= 25; i++) //scale testing
                {
                    if (maxPageNumber > 0)
                    {
                        newUri = baseUri + i.ToString();
                        categoryUriPages.Add(newUri);
                    }
                    else
                    {
                        newUri = baseUri;
                        categoryUriPages.Add(newUri);
                    }
                }

                List <ExternalItemFieldBase> valueFields = new List <ExternalItemFieldBase>();
                if (categoryUriPages.Count > 0)
                {
                    int iDCount = 0;

                    Parallel.ForEach(categoryUriPages.AsParallel(), singleUri =>
                    {
                        newUri = singleUri;

                        RqmResponseData category_ = new RqmResponseData();
                        category_ = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(newUri));

                        if (category_.ErrorCode == 401)
                        {
                            RQM.RQMConnect.Instance.RQMRep.ConnectToServer(loginData.Server.ToString(), loginData.User.ToString(), loginData.Password.ToString());
                            RQM.RQMConnect.Instance.RQMRep.ConnetProject(rqmDomain, rqmProject, loginData.User.ToString(), loginData.Password.ToString());
                            category_ = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(newUri));
                        }

                        XmlDocument CategoryList_ = new XmlDocument();
                        if (!string.IsNullOrEmpty(category_.responseText))
                        {
                            CategoryList_.LoadXml(category_.responseText);
                        }

                        XmlNodeList categoryIDs = CategoryList_.GetElementsByTagName("id");
                        iDCount += categoryIDs.Count;

                        if (categoryIDs.Count > 0)
                        {
                            List <string> idLinkList = new List <string>();
                            for (int n = 1; n < categoryIDs.Count; n++)
                            {
                                idLinkList.Add(categoryIDs.Item(n).InnerText);
                            }

                            Parallel.ForEach(idLinkList.AsParallel(), getIDlink =>
                            {
                                ExternalItemFieldBase valuesItemfield = new ExternalItemFieldBase();

                                if (!string.IsNullOrEmpty(getIDlink))
                                {
                                    RqmResponseData categoryValueDetails = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(getIDlink));   // retrieve category page
                                    XmlDocument categoryValueXML         = new XmlDocument();

                                    if (categoryValueDetails.ErrorCode == 401)
                                    {
                                        RQM.RQMConnect.Instance.RQMRep.ConnectToServer(loginData.Server.ToString(), loginData.User.ToString(), loginData.Password.ToString());
                                        RQM.RQMConnect.Instance.RQMRep.ConnetProject(rqmDomain, rqmProject, loginData.User.ToString(), loginData.Password.ToString());
                                        categoryValueDetails = RQM.RQMConnect.Instance.RQMRep.GetRqmResponse(loginData, new Uri(getIDlink));
                                    }

                                    if (!string.IsNullOrEmpty(categoryValueDetails.responseText))
                                    {
                                        categoryValueXML.LoadXml(categoryValueDetails.responseText);
                                    }

                                    //categoryValueXML.LoadXml(categoryValueDetails.responseText.ToString());
                                    XmlNode categoryTypeNode;
                                    string catTypeLink = string.Empty;

                                    if (!string.IsNullOrEmpty(categoryValueXML.InnerText.ToString()))
                                    {
                                        categoryTypeNode = categoryValueXML.GetElementsByTagName("ns2:categoryType").Item(0); //need to consider changes in tag i.e. ns3/ns4...
                                        catTypeLink      = categoryTypeNode.Attributes["href"].Value.ToString();

                                        categoryTypeID = catTypeLink.Substring(catTypeLink.LastIndexOf(':') + 1);
                                        categoryValue  = categoryValueXML.GetElementsByTagName("ns3:title").Item(0).InnerText;

                                        valuesItemfield.ID = categoryTypeID;
                                        valuesItemfield.PossibleValues.Add(categoryValue);
                                        totalValues++;

                                        valueFields.Add(valuesItemfield);


                                        System.Diagnostics.Debug.WriteLine("Total number of populated values is :" + totalValues + "/" + iDCount * (categoryUriPages.Count + 1)); //TODO pass this to a string to print in the UI
                                        populatedValue = "Populating value:" + categoryValue + " \r\n Total Values:" + totalValues;
                                        bw.ReportProgress(totalValues, populatedValue);
                                    }
                                }
                            });

                            System.Diagnostics.Debug.WriteLine("inner parallel -->finished");
                        }
                    });
                    System.Diagnostics.Debug.WriteLine("outer parallel -->finished");
                }

                //TODO: insert loop to add value to field
                if (fields.Count > 0)                      //category list has at least 1 entry
                {
                    for (int j = 0; j < fields.Count; j++) //run through list
                    {
                        foreach (ExternalItemFieldBase values in valueFields)
                        {
                            if ((fields[j].ID.ToString() == values.ID.ToString()))
                            {
                                ExternalItemFieldBase addValueField = fields[j];
                                foreach (string possibleValue in values.PossibleValues)
                                {
                                    addValueField.PossibleValues.Add(possibleValue);
                                }
                                fields[j] = addValueField;
                                fields[j].SelectedValue = fields[j].PossibleValues[0];
                            }
                        }
                    }
                }
            }
            return(fields);
        }