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); }
/// <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. ------- "); }