Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,20 @@
package com.publicissapient.kpidashboard.rally.listener;

import com.publicissapient.kpidashboard.common.constant.CommonConstant;
import com.publicissapient.kpidashboard.common.model.ProcessorExecutionTraceLog;
import com.publicissapient.kpidashboard.common.model.application.FieldMapping;
import com.publicissapient.kpidashboard.common.model.application.ProjectBasicConfig;
import com.publicissapient.kpidashboard.common.repository.application.FieldMappingRepository;
import com.publicissapient.kpidashboard.common.repository.application.ProjectBasicConfigRepository;
import com.publicissapient.kpidashboard.common.repository.tracelog.ProcessorExecutionTraceLogRepository;
import com.publicissapient.kpidashboard.rally.cache.RallyProcessorCacheEvictor;
import com.publicissapient.kpidashboard.rally.config.FetchProjectConfiguration;
import com.publicissapient.kpidashboard.rally.config.RallyProcessorConfig;
import com.publicissapient.kpidashboard.rally.constant.RallyConstants;
import com.publicissapient.kpidashboard.rally.service.NotificationHandler;
import com.publicissapient.kpidashboard.rally.service.OngoingExecutionsService;
import com.publicissapient.kpidashboard.rally.service.ProjectHierarchySyncService;
import com.publicissapient.kpidashboard.rally.service.RallyCommonService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.bson.types.ObjectId;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
Expand All @@ -43,6 +43,9 @@
import org.springframework.stereotype.Component;

import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import static com.publicissapient.kpidashboard.rally.helper.RallyHelper.convertDateToCustomFormat;
import static com.publicissapient.kpidashboard.rally.util.RallyProcessorUtil.generateLogMessage;
Expand Down Expand Up @@ -81,6 +84,9 @@ public class JobListenerScrum implements JobExecutionListener {
@Autowired
private ProjectHierarchySyncService projectHierarchySyncService;

@Autowired
private ProcessorExecutionTraceLogRepository processorExecutionTraceLogRepo;


@Override
public void beforeJob(JobExecution jobExecution) {
Expand Down Expand Up @@ -118,9 +124,12 @@ public void afterJob(JobExecution jobExecution) {
break;
}
}
setExecutionInfoInTraceLog(false, stepFaliureException);
final String failureReasonMsg = generateLogMessage(stepFaliureException);
sendNotification(failureReasonMsg, RallyConstants.ERROR_NOTIFICATION_SUBJECT_KEY,
RallyConstants.ERROR_MAIL_TEMPLATE_KEY);
} else {
setExecutionInfoInTraceLog(true, null);
}
} catch (Exception e) {
log.error("An Exception has occured in scrum jobListener", e);
Expand Down Expand Up @@ -150,4 +159,28 @@ private static String getProjectName(ProjectBasicConfig projectBasicConfig) {
return projectBasicConfig == null ? "" : projectBasicConfig.getProjectName();
}

private void setExecutionInfoInTraceLog(boolean status, Throwable stepFailureException) {
List<ProcessorExecutionTraceLog> procExecTraceLogs = processorExecutionTraceLogRepo
.findByProcessorNameAndBasicProjectConfigIdIn(RallyConstants.RALLY, Collections.singletonList(projectId));
if (CollectionUtils.isNotEmpty(procExecTraceLogs)) {
for (ProcessorExecutionTraceLog processorExecutionTraceLog : procExecTraceLogs) {
processorExecutionTraceLog.setExecutionEndedAt(System.currentTimeMillis());
processorExecutionTraceLog.setExecutionSuccess(status);
if (stepFailureException != null && processorExecutionTraceLog.isProgressStats()) {
processorExecutionTraceLog.setErrorMessage(generateLogMessage(stepFailureException));
processorExecutionTraceLog.setFailureLog(stepFailureException.getMessage());
}
}
processorExecutionTraceLogRepo.saveAll(procExecTraceLogs);
}
}

/**
* Getter for projectHierarchySyncService - added for testing purposes
*
* @return the projectHierarchySyncService
*/
public ProjectHierarchySyncService getProjectHierarchySyncService() {
return projectHierarchySyncService;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ private void processProject(Map.Entry<String, List<JiraIssue>> entry, StepContex
List<ProcessorExecutionTraceLog> processorExecutionToSave) {
String basicProjectConfigId = entry.getKey();
List<ProcessorExecutionTraceLog> procTraceLogList = processorExecutionTraceLogRepo
.findByProcessorNameAndBasicProjectConfigIdIn(ProcessorConstants.JIRA,
.findByProcessorNameAndBasicProjectConfigIdIn(ProcessorConstants.RALLY,
Collections.singletonList(basicProjectConfigId));
ProcessorExecutionTraceLog progressStatsTraceLog = procTraceLogList.stream()
.filter(ProcessorExecutionTraceLog::isProgressStats).findFirst().orElse(new ProcessorExecutionTraceLog());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
******************************************************************************/
package com.publicissapient.kpidashboard.rally.processor;

import com.atlassian.jira.rest.client.api.domain.Issue;
import com.publicissapient.kpidashboard.common.model.jira.JiraHistoryChangeLog;
import com.publicissapient.kpidashboard.common.util.DateUtil;
import com.publicissapient.kpidashboard.rally.constant.RallyConstants;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public JiraIssue convertToJiraIssue(HierarchicalRequirement hierarchicalRequirem
jiraIssue.setProcessorId(processorId);
jiraIssue.setJiraStatus(hierarchicalRequirement.getScheduleState());
jiraIssue.setTypeId(hierarchicalRequirement.getObjectID());
jiraIssue.setIssueId(hierarchicalRequirement.getFormattedID());
jiraIssue.setIssueId(hierarchicalRequirement.getObjectID());
if (hierarchicalRequirement.getType().equalsIgnoreCase("HierarchicalRequirement"))
jiraIssue.setTypeName(NormalizedJira.USER_STORY_TYPE.getValue());
else
Expand All @@ -135,10 +135,15 @@ public JiraIssue convertToJiraIssue(HierarchicalRequirement hierarchicalRequirem
+ projectConfig.getProjectBasicConfig().getProjectNodeId());
jiraIssue.setSprintAssetState(hierarchicalRequirement.getIteration().getState());
}
setURL(hierarchicalRequirement.getObjectID(), jiraIssue);
jiraIssue.setBoardId(boardId);
return jiraIssue;
}

private void setURL(String ticketNumber, JiraIssue jiraIssue) {
jiraIssue.setUrl("https://rally1.rallydev.com/#/detail/userstory/"+ticketNumber);
}


/**
* Sets the story links for defects in the JiraIssue
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,38 +97,43 @@ private Set<SprintDetails> createSprintDetails(Iteration iteration, ProjectConfF
}

private static void initializeSprintDetails(List<JiraIssue> jiraIssueList,
List<JiraIssueCustomHistory> jiraIssueCustomHistoryList, List<SprintDetails> sprintDetailsList) {
List<JiraIssueCustomHistory> jiraIssueCustomHistoryList, List<SprintDetails> sprintDetailsList) {

Map<String, JiraIssue> jiraIssueMap = jiraIssueList.stream()
.collect(Collectors.toMap(JiraIssue::getNumber, issue -> issue));

Map<String, Set<JiraIssue>> issuesBySprintName = jiraIssueList.stream()
.filter(issue -> issue.getSprintName() != null)
.collect(Collectors.groupingBy(JiraIssue::getSprintName, Collectors.toSet()));
Map<String, JiraIssue> jiraIssueMap = jiraIssueList.stream()
.collect(Collectors.toMap(
JiraIssue::getNumber,
issue -> issue,
(existing, replacement) -> existing // Keep the first occurrence when duplicates found
));

for (SprintDetails sprintDetails : sprintDetailsList) {
String sprintName = sprintDetails.getSprintName();
Map<String, Set<JiraIssue>> issuesBySprintName = jiraIssueList.stream()
.filter(issue -> issue.getSprintName() != null)
.collect(Collectors.groupingBy(JiraIssue::getSprintName, Collectors.toSet()));

Set<SprintIssue> totalIssues = convertToSprintIssues(
issuesBySprintName.getOrDefault(sprintName, new HashSet<>()));
for (SprintDetails sprintDetails : sprintDetailsList) {
String sprintName = sprintDetails.getSprintName();

Pair<Set<SprintIssue>, Set<SprintIssue>> addedAndRemovedIssues = processSprintHistory(
jiraIssueCustomHistoryList, jiraIssueMap, sprintName);
Set<SprintIssue> totalIssues = convertToSprintIssues(
issuesBySprintName.getOrDefault(sprintName, new HashSet<>()));

Set<SprintIssue> addedIssues = addedAndRemovedIssues.getLeft();
Set<SprintIssue> removedIssues = addedAndRemovedIssues.getRight();
Pair<Set<SprintIssue>, Set<SprintIssue>> addedAndRemovedIssues = processSprintHistory(
jiraIssueCustomHistoryList, jiraIssueMap, sprintName);

setTotalIssues(sprintDetails, totalIssues);
Set<SprintIssue> addedIssues = addedAndRemovedIssues.getLeft();
Set<SprintIssue> removedIssues = addedAndRemovedIssues.getRight();

setAddedAndRemovedIssues(sprintDetails,
addedIssues.stream().map(SprintIssue::getNumber).collect(Collectors.toSet()), removedIssues);
setTotalIssues(sprintDetails, totalIssues);

addedIssues.removeAll(removedIssues);
totalIssues.addAll(addedIssues);
setTotalIssues(sprintDetails, totalIssues);
setAddedAndRemovedIssues(sprintDetails,
addedIssues.stream().map(SprintIssue::getNumber).collect(Collectors.toSet()), removedIssues);

separateAndSetIssuesByCompletionStatus(sprintDetails, totalIssues);
}
addedIssues.removeAll(removedIssues);
totalIssues.addAll(addedIssues);
setTotalIssues(sprintDetails, totalIssues);

separateAndSetIssuesByCompletionStatus(sprintDetails, totalIssues);
}
}

private static void setBasicSprintDetails(Iteration iteration, ProjectConfFieldMapping projectConfig,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ public List<HierarchicalRequirement> getHierarchicalRequirements(int pageStart)


// Fetch fields for each artifact type, including Defects for hierarchical requirements
String fetchFields = "FormattedID,Name,Owner,PlanEstimate,ScheduleState,Iteration,CreationDate,LastUpdateDate,RevisionHistory";
String fetchFields = "FormattedID,Name,Owner,PlanEstimate,ScheduleState,Iteration,CreationDate,LastUpdateDate,RevisionHistory,ObjectID";
String hierarchicalRequirementFetchFields = fetchFields + ",Defects";
List<HierarchicalRequirement> allArtifacts = new ArrayList<>();
Map<String, Iteration> iterationMap = new HashMap<>();
Expand Down
Loading