Skip to content

Commit 33b9359

Browse files
Merge pull request #49 from PublicisSapient/develop
Develop
2 parents 4ad5507 + d1c4308 commit 33b9359

File tree

11 files changed

+499
-60
lines changed

11 files changed

+499
-60
lines changed

rally/src/main/java/com/publicissapient/kpidashboard/rally/config/RallyProcessorConfig.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,6 @@ public class RallyProcessorConfig {
7373
@Value("${kafka.mailtopic}")
7474
private String kafkaMailTopic;
7575

76-
public List<String> getDomainNames() {
77-
return domainNames;
78-
}
79-
80-
public void setDomainNames(List<String> domainNames) {
81-
this.domainNames = domainNames;
82-
}
76+
@Value("${rally.userstory.baseurl}")
77+
private String rallyUserStoryBaseUrl;
8378
}

rally/src/main/java/com/publicissapient/kpidashboard/rally/listener/JobListenerScrum.java

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,21 @@
1818
package com.publicissapient.kpidashboard.rally.listener;
1919

2020
import com.publicissapient.kpidashboard.common.constant.CommonConstant;
21+
import com.publicissapient.kpidashboard.common.model.ProcessorExecutionTraceLog;
2122
import com.publicissapient.kpidashboard.common.model.application.FieldMapping;
2223
import com.publicissapient.kpidashboard.common.model.application.ProjectBasicConfig;
2324
import com.publicissapient.kpidashboard.common.repository.application.FieldMappingRepository;
2425
import com.publicissapient.kpidashboard.common.repository.application.ProjectBasicConfigRepository;
2526
import com.publicissapient.kpidashboard.common.repository.tracelog.ProcessorExecutionTraceLogRepository;
2627
import com.publicissapient.kpidashboard.rally.cache.RallyProcessorCacheEvictor;
27-
import com.publicissapient.kpidashboard.rally.config.FetchProjectConfiguration;
28-
import com.publicissapient.kpidashboard.rally.config.RallyProcessorConfig;
2928
import com.publicissapient.kpidashboard.rally.constant.RallyConstants;
3029
import com.publicissapient.kpidashboard.rally.service.NotificationHandler;
3130
import com.publicissapient.kpidashboard.rally.service.OngoingExecutionsService;
3231
import com.publicissapient.kpidashboard.rally.service.ProjectHierarchySyncService;
3332
import com.publicissapient.kpidashboard.rally.service.RallyCommonService;
33+
import lombok.Getter;
3434
import lombok.extern.slf4j.Slf4j;
35+
import org.apache.commons.collections4.CollectionUtils;
3536
import org.bson.types.ObjectId;
3637
import org.springframework.batch.core.BatchStatus;
3738
import org.springframework.batch.core.JobExecution;
@@ -43,6 +44,9 @@
4344
import org.springframework.stereotype.Component;
4445

4546
import java.net.UnknownHostException;
47+
import java.util.Collections;
48+
import java.util.List;
49+
import java.util.Map;
4650

4751
import static com.publicissapient.kpidashboard.rally.helper.RallyHelper.convertDateToCustomFormat;
4852
import static com.publicissapient.kpidashboard.rally.util.RallyProcessorUtil.generateLogMessage;
@@ -55,6 +59,14 @@
5559
@JobScope
5660
public class JobListenerScrum implements JobExecutionListener {
5761

62+
/**
63+
* Enum to represent the execution status of a job
64+
*/
65+
private enum ExecutionStatus {
66+
SUCCESS,
67+
FAILURE
68+
}
69+
5870
@Autowired
5971
private NotificationHandler handler;
6072

@@ -79,8 +91,12 @@ public class JobListenerScrum implements JobExecutionListener {
7991

8092

8193
@Autowired
94+
@Getter
8295
private ProjectHierarchySyncService projectHierarchySyncService;
8396

97+
@Autowired
98+
private ProcessorExecutionTraceLogRepository processorExecutionTraceLogRepo;
99+
84100

85101
@Override
86102
public void beforeJob(JobExecution jobExecution) {
@@ -118,9 +134,12 @@ public void afterJob(JobExecution jobExecution) {
118134
break;
119135
}
120136
}
137+
setExecutionInfoInTraceLog(ExecutionStatus.FAILURE, stepFaliureException);
121138
final String failureReasonMsg = generateLogMessage(stepFaliureException);
122139
sendNotification(failureReasonMsg, RallyConstants.ERROR_NOTIFICATION_SUBJECT_KEY,
123140
RallyConstants.ERROR_MAIL_TEMPLATE_KEY);
141+
} else {
142+
setExecutionInfoInTraceLog(ExecutionStatus.SUCCESS, null);
124143
}
125144
} catch (Exception e) {
126145
log.error("An Exception has occured in scrum jobListener", e);
@@ -150,4 +169,21 @@ private static String getProjectName(ProjectBasicConfig projectBasicConfig) {
150169
return projectBasicConfig == null ? "" : projectBasicConfig.getProjectName();
151170
}
152171

172+
private void setExecutionInfoInTraceLog(ExecutionStatus executionStatus, Throwable stepFailureException) {
173+
List<ProcessorExecutionTraceLog> procExecTraceLogs = processorExecutionTraceLogRepo
174+
.findByProcessorNameAndBasicProjectConfigIdIn(RallyConstants.RALLY, Collections.singletonList(projectId));
175+
if (CollectionUtils.isNotEmpty(procExecTraceLogs)) {
176+
for (ProcessorExecutionTraceLog processorExecutionTraceLog : procExecTraceLogs) {
177+
processorExecutionTraceLog.setExecutionEndedAt(System.currentTimeMillis());
178+
processorExecutionTraceLog.setExecutionSuccess(executionStatus == ExecutionStatus.SUCCESS);
179+
if (stepFailureException != null && processorExecutionTraceLog.isProgressStats()) {
180+
processorExecutionTraceLog.setErrorMessage(generateLogMessage(stepFailureException));
181+
processorExecutionTraceLog.setFailureLog(stepFailureException.getMessage());
182+
}
183+
}
184+
processorExecutionTraceLogRepo.saveAll(procExecTraceLogs);
185+
}
186+
}
187+
188+
153189
}

rally/src/main/java/com/publicissapient/kpidashboard/rally/listener/RallyIssueRqlWriterListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private void processProject(Map.Entry<String, List<JiraIssue>> entry, StepContex
9292
List<ProcessorExecutionTraceLog> processorExecutionToSave) {
9393
String basicProjectConfigId = entry.getKey();
9494
List<ProcessorExecutionTraceLog> procTraceLogList = processorExecutionTraceLogRepo
95-
.findByProcessorNameAndBasicProjectConfigIdIn(ProcessorConstants.JIRA,
95+
.findByProcessorNameAndBasicProjectConfigIdIn(ProcessorConstants.RALLY,
9696
Collections.singletonList(basicProjectConfigId));
9797
ProcessorExecutionTraceLog progressStatsTraceLog = procTraceLogList.stream()
9898
.filter(ProcessorExecutionTraceLog::isProgressStats).findFirst().orElse(new ProcessorExecutionTraceLog());

rally/src/main/java/com/publicissapient/kpidashboard/rally/processor/RallyIssueHistoryProcessorImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
******************************************************************************/
1818
package com.publicissapient.kpidashboard.rally.processor;
1919

20-
import com.atlassian.jira.rest.client.api.domain.Issue;
2120
import com.publicissapient.kpidashboard.common.model.jira.JiraHistoryChangeLog;
2221
import com.publicissapient.kpidashboard.common.util.DateUtil;
2322
import com.publicissapient.kpidashboard.rally.constant.RallyConstants;

rally/src/main/java/com/publicissapient/kpidashboard/rally/processor/RallyIssueProcessorImpl.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.publicissapient.kpidashboard.common.model.application.FieldMapping;
2323
import com.publicissapient.kpidashboard.common.model.jira.JiraIssue;
2424
import com.publicissapient.kpidashboard.common.repository.jira.JiraIssueRepository;
25+
import com.publicissapient.kpidashboard.rally.config.RallyProcessorConfig;
2526
import com.publicissapient.kpidashboard.rally.constant.RallyConstants;
2627
import com.publicissapient.kpidashboard.rally.model.HierarchicalRequirement;
2728
import com.publicissapient.kpidashboard.rally.model.ProjectConfFieldMapping;
@@ -51,6 +52,8 @@ public class RallyIssueProcessorImpl implements RallyIssueProcessor {
5152
@Autowired
5253
private JiraIssueRepository jiraIssueRepository;
5354

55+
@Autowired
56+
private RallyProcessorConfig rallyProcessorConfig;
5457

5558
private JiraIssue getJiraIssue(ProjectConfFieldMapping projectConfig, String issueId) {
5659
String basicProjectConfigId = projectConfig.getBasicProjectConfigId().toString();
@@ -116,7 +119,7 @@ public JiraIssue convertToJiraIssue(HierarchicalRequirement hierarchicalRequirem
116119
jiraIssue.setProcessorId(processorId);
117120
jiraIssue.setJiraStatus(hierarchicalRequirement.getScheduleState());
118121
jiraIssue.setTypeId(hierarchicalRequirement.getObjectID());
119-
jiraIssue.setIssueId(hierarchicalRequirement.getFormattedID());
122+
jiraIssue.setIssueId(hierarchicalRequirement.getObjectID());
120123
if (hierarchicalRequirement.getType().equalsIgnoreCase("HierarchicalRequirement"))
121124
jiraIssue.setTypeName(NormalizedJira.USER_STORY_TYPE.getValue());
122125
else
@@ -135,10 +138,21 @@ public JiraIssue convertToJiraIssue(HierarchicalRequirement hierarchicalRequirem
135138
+ projectConfig.getProjectBasicConfig().getProjectNodeId());
136139
jiraIssue.setSprintAssetState(hierarchicalRequirement.getIteration().getState());
137140
}
141+
setURL(hierarchicalRequirement.getObjectID(), jiraIssue);
138142
jiraIssue.setBoardId(boardId);
139143
return jiraIssue;
140144
}
141145

146+
private void setURL(String ticketNumber, JiraIssue jiraIssue) {
147+
String baseUrl = rallyProcessorConfig.getRallyUserStoryBaseUrl();
148+
if (baseUrl != null) {
149+
jiraIssue.setUrl(baseUrl + ticketNumber);
150+
} else {
151+
// Set a default URL or just the ticket number if base URL is not available
152+
jiraIssue.setUrl("https://rally.example.com/" + ticketNumber);
153+
}
154+
}
155+
142156

143157
/**
144158
* Sets the story links for defects in the JiraIssue

rally/src/main/java/com/publicissapient/kpidashboard/rally/processor/SprintDataProcessorImpl.java

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -97,38 +97,43 @@ private Set<SprintDetails> createSprintDetails(Iteration iteration, ProjectConfF
9797
}
9898

9999
private static void initializeSprintDetails(List<JiraIssue> jiraIssueList,
100-
List<JiraIssueCustomHistory> jiraIssueCustomHistoryList, List<SprintDetails> sprintDetailsList) {
100+
List<JiraIssueCustomHistory> jiraIssueCustomHistoryList, List<SprintDetails> sprintDetailsList) {
101101

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

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

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

112-
Set<SprintIssue> totalIssues = convertToSprintIssues(
113-
issuesBySprintName.getOrDefault(sprintName, new HashSet<>()));
114+
for (SprintDetails sprintDetails : sprintDetailsList) {
115+
String sprintName = sprintDetails.getSprintName();
114116

115-
Pair<Set<SprintIssue>, Set<SprintIssue>> addedAndRemovedIssues = processSprintHistory(
116-
jiraIssueCustomHistoryList, jiraIssueMap, sprintName);
117+
Set<SprintIssue> totalIssues = convertToSprintIssues(
118+
issuesBySprintName.getOrDefault(sprintName, new HashSet<>()));
117119

118-
Set<SprintIssue> addedIssues = addedAndRemovedIssues.getLeft();
119-
Set<SprintIssue> removedIssues = addedAndRemovedIssues.getRight();
120+
Pair<Set<SprintIssue>, Set<SprintIssue>> addedAndRemovedIssues = processSprintHistory(
121+
jiraIssueCustomHistoryList, jiraIssueMap, sprintName);
120122

121-
setTotalIssues(sprintDetails, totalIssues);
123+
Set<SprintIssue> addedIssues = addedAndRemovedIssues.getLeft();
124+
Set<SprintIssue> removedIssues = addedAndRemovedIssues.getRight();
122125

123-
setAddedAndRemovedIssues(sprintDetails,
124-
addedIssues.stream().map(SprintIssue::getNumber).collect(Collectors.toSet()), removedIssues);
126+
setTotalIssues(sprintDetails, totalIssues);
125127

126-
addedIssues.removeAll(removedIssues);
127-
totalIssues.addAll(addedIssues);
128-
setTotalIssues(sprintDetails, totalIssues);
128+
setAddedAndRemovedIssues(sprintDetails,
129+
addedIssues.stream().map(SprintIssue::getNumber).collect(Collectors.toSet()), removedIssues);
129130

130-
separateAndSetIssuesByCompletionStatus(sprintDetails, totalIssues);
131-
}
131+
addedIssues.removeAll(removedIssues);
132+
totalIssues.addAll(addedIssues);
133+
setTotalIssues(sprintDetails, totalIssues);
134+
135+
separateAndSetIssuesByCompletionStatus(sprintDetails, totalIssues);
136+
}
132137
}
133138

134139
private static void setBasicSprintDetails(Iteration iteration, ProjectConfFieldMapping projectConfig,

rally/src/main/java/com/publicissapient/kpidashboard/rally/service/RallyCommonService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ public List<HierarchicalRequirement> getHierarchicalRequirements(int pageStart)
413413

414414

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

rally/src/main/resources/application.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,5 @@ togglz.console.use-management-port=false
117117
togglz.console.enabled=true
118118
togglz.console.path=/togglz-console
119119
togglz.console.secured=false
120-
rally.test.connection=project
120+
rally.test.connection=project
121+
rally.userstory.baseurl=https://rally1.rallydev.com/#/detail/userstory/

0 commit comments

Comments
 (0)