コード例 #1
0
        private void SynchronizeItems(WorkitemsToUpdate itemsModifiedInJira, WorkitemStateChangeCollection itemsModifiedInVersionOne)
        {
            logger.Log(string.Format("There are {0} items modified in Jira", itemsModifiedInJira.workitemsForUpdate.Count));
            logger.Log(string.Format("There are {0} items modified in VersionOne", itemsModifiedInVersionOne.Count));

            WorkitemStateChangeCollection readyForSynchronisationToJira = new WorkitemStateChangeCollection();
            readyForSynchronisationToJira.copyFrom(itemsModifiedInVersionOne);

            List<Workitem> readyForSynchronizationToVersionOne = new List<Workitem>();

            foreach (Workitem jiraIssue in itemsModifiedInJira.workitemsForUpdate) {
                WorkitemStateChangeResult v1item = itemsModifiedInVersionOne.Find(x => x.ExternalId.Equals(jiraIssue.ExternalId)  );
                if (v1item == null) {
                    logger.Log(string.Format("Issue {0} modifie in JIRA ONLY and not modified in VersionOne", jiraIssue.ExternalId));
                    readyForSynchronizationToVersionOne.Add(jiraIssue);
                    continue;
                }

                if (jiraIssue.Updated.Value.CompareTo(v1item.ChangeDateUtc) > 0) {
                    logger.Log(string.Format("Issue {0} modified in JIRA on {1} and in VersionOne on {2} - JIRA update is newer", jiraIssue.ExternalId, jiraIssue.Updated.Value, v1item.ChangeDateUtc));
                    readyForSynchronizationToVersionOne.Add(jiraIssue);
                } else {
                    logger.Log(string.Format("Issue {0} modified in JIRA on {1} and in VersionOne on {2} - VersionOne update is newer", jiraIssue.ExternalId, jiraIssue.Updated, v1item.ChangeDateUtc));
                    readyForSynchronisationToJira.Add(v1item);
                }
            }

            foreach (var v1item in itemsModifiedInVersionOne) {
                if (itemsModifiedInJira.workitemsForUpdate.Exists(x => x.ExternalId.Equals(v1item.ExternalId)) == false) {
                    logger.Log(string.Format("Issue {0} modified in VersionOne ONLY and not modified in JIRA", v1item.ExternalId));
                    readyForSynchronisationToJira.Add(v1item);
                }
                else {
                    logger.Log(string.Format("Issue {0} modified in VersionOne and JIRA", v1item.ExternalId));
                    //poprzednia pętla mi załatwia ten warunek - nic nie trzeba juz tu dodawać
                }
            }

            SynchronizeItemsToJira(readyForSynchronisationToJira);
            SynchronizeItemsToVersionOne(readyForSynchronizationToVersionOne);
        }
コード例 #2
0
        /// <summary>
        /// Timer interval on which to poll JIRA. See app config file for time in milliseconds.
        /// </summary>
        /// <param name="pubobj">Not used</param>
        private void OnInterval(object pubobj)
        {
            for (int i = 0; i < 5; i++ )
                logger.Log(string.Empty);

            logger.Log(LogMessage.SeverityType.Info, "-------  Starting processing... -------\n\n");

            if (jiraConfig.UpdateWorkitemFilter.Enabled) {
                logger.Log(LogMessage.SeverityType.Info, "------- Synchronization -------");

                List<Workitem> workitemsForUpdate = new List<Workitem>();

                try {
                    logger.Log(LogMessage.SeverityType.Info, "Getting issues from JIRA.");

                    var lastQueryTime = profile.LastQueryForModifiedItems;
                    var issues = jiraProcessor.GetIssues<Defect>(jiraConfig.UpdateWorkitemFilter.Id);

                    if (issues.Count > 0) {
                        logger.Log(string.Format("Found {0} defects in JIRA that came from VersionOne. We will filter issues modified after {1}", issues.Count, lastQueryTime));
                    }

                    DateTime theNewestItem = lastQueryTime;
                    foreach (var issue in issues) {
                        var modificationTime = issue.Updated.Value;

                        if (modificationTime > lastQueryTime) {
                            logger.Log(LogMessage.SeverityType.Info, string.Format("\tissue {0} was modified on {1} and will be processed", issue.ExternalId, issue.Updated.Value));

                            issue.ExternalSystemName = sourceFieldValue;
                            workitemsForUpdate.Add(issue);

                            if (modificationTime > theNewestItem) {
                                logger.Log(LogMessage.SeverityType.Debug, string.Format("\tissue {0} is possibly the newsest one in this query", issue.ExternalId));
                                theNewestItem = modificationTime;
                            }
                        } else {
                            logger.Log(LogMessage.SeverityType.Debug, string.Format("\tskipping issue {0} since it was modified earlier than last query", issue.ExternalId));
                        }
                    }

                    if (theNewestItem > lastQueryTime) {
                        logger.Log(LogMessage.SeverityType.Debug, string.Format("Setting last query time to {0}", theNewestItem));
                        profile.LastQueryForModifiedItems = theNewestItem;
                    }

                    var itemsOpenInJira = new WorkitemsToUpdate(workitemsForUpdate, sourceFieldValue);
                    eventManager.Publish(itemsOpenInJira);
                } catch (Exception ex) {
                    logger.Log(LogMessage.SeverityType.Error, string.Format("Error getting Issues for update from JIRA: {0}", ex.Message));
                    return;
                }
            }

            logger.Log(LogMessage.SeverityType.Info, "------- Create New Workitems from Jira -------");

            IList<Workitem> workitems = new List<Workitem>();
            try {
                logger.Log(LogMessage.SeverityType.Info, "Getting issues from JIRA.");

                if (jiraConfig.OpenDefectFilter.Enabled) {
                    var bugs = jiraProcessor.GetIssues<Defect>(jiraConfig.OpenDefectFilter.Id);

                    if (bugs.Count > 0) {
                        logger.Log(string.Format("Found {0} defects in JIRA to create in VersionOne.", bugs.Count));
                    }

                    foreach (var bug in bugs) {
                        workitems.Add(bug);
                    }
                }

                if (jiraConfig.OpenStoryFilter.Enabled) {
                    var stories = jiraProcessor.GetIssues<Story>(jiraConfig.OpenStoryFilter.Id);

                    if (stories.Count > 0) {
                        logger.Log(string.Format("Found {0} stories in JIRA to create in VersionOne.", stories.Count));
                    }

                    foreach (var story in stories) {
                        workitems.Add(story);
                    }
                }

            } catch (Exception ex) {
                logger.Log(LogMessage.SeverityType.Error, string.Format("Error getting Issues from JIRA: {0}", ex.Message));
                return;
            }

            logger.Log(LogMessage.SeverityType.Info, "Checking JIRA issues for duplicates.");
            workitems = workitems.Distinct().ToList();

            foreach(var item in workitems) {
                item.ExternalSystemName = sourceFieldValue;
                eventManager.Publish(item);
            }

            logger.Log(LogMessage.SeverityType.Info, "------- Close JIRA bugs (that were closed in VersionOne) -------");
            var sourceClosed = new ClosedWorkitemsSource(sourceFieldValue);
            eventManager.Publish(sourceClosed);

            logger.Log(LogMessage.SeverityType.Info, "------- Push VersionOne defects to JIRA -------");
            var v1scopes = GetV1ScopesFromMappings();
            var sourceCreated = new CreatedWorkitemsSource(v1scopes);
            eventManager.Publish(sourceCreated);

            logger.Log(LogMessage.SeverityType.Info, "------- Processing finished. ------- ");
        }