Skip to content

Commit eee2f48

Browse files
cody-simms-sonarsourcesonartech
authored andcommitted
SONAR-26927 Replace SecurityReportHelper with compliance module
1 parent 3144c54 commit eee2f48

File tree

11 files changed

+44
-56
lines changed

11 files changed

+44
-56
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ version=26.2
66
# No change required for patch versions
77
versionEOL=2026-06-08
88
pdfreportVersion=3.0.0.114
9-
complianceReportsVersion=1.0.1.296
9+
complianceReportsVersion=1.0.1.383
1010
pluginApiVersion=13.4.3.4290
1111
description=Open source platform for continuous inspection of code quality
1212
projectTitle=SonarQube

server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueStatsByRuleKeyDaoImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,15 @@ public void deleteAndInsertIssueStats(String aggregationId, AggregationType aggr
6161
}
6262
}
6363

64+
@Override
6465
public void deleteByAggregationAndRuleKey(String aggregationId, AggregationType aggregationType, String ruleKey) {
6566
try (DbSession dbSession = dbClient.openSession(false)) {
6667
mapper(dbSession).deleteIssueStatsForAggregationAndRuleKey(aggregationId, aggregationType.toString(), ruleKey);
6768
dbSession.commit();
6869
}
6970
}
7071

72+
@Override
7173
public void upsert(String aggregationId, AggregationType aggregationType, IssueStats issueStats) {
7274
try (DbSession dbSession = dbClient.openSession(false)) {
7375
mapper(dbSession).deleteIssueStatsForAggregationAndRuleKey(aggregationId, aggregationType.toString(), issueStats.ruleKey());
@@ -76,6 +78,13 @@ public void upsert(String aggregationId, AggregationType aggregationType, IssueS
7678
}
7779
}
7880

81+
@Override
82+
public IssueStats aggregateIssueStatsForBranchUuidAndRuleKey(String aggregationId, String ruleKey) {
83+
try (DbSession dbSession = dbClient.openSession(false)) {
84+
return mapper(dbSession).getIssueStatsByAggregationIdAndRuleKey(aggregationId, ruleKey);
85+
}
86+
}
87+
7988
private static IssueStatsByRuleKeyMapper mapper(DbSession dbSession) {
8089
return dbSession.getMapper(IssueStatsByRuleKeyMapper.class);
8190
}

server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueStatsByRuleKeyMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ void insertIssueStats(@Param("aggregationId") String aggregationId,
3838
void deleteIssueStatsForAggregationAndRuleKey(@Param("aggregationId") String aggregationId,
3939
@Param("aggregationType") String aggregationType,
4040
@Param("ruleKey") String ruleKey);
41+
42+
IssueStats getIssueStatsByAggregationIdAndRuleKey(@Param("aggregationId") String aggregationId, @Param("ruleKey") String ruleKey);
4143
}

server/sonar-db-dao/src/main/resources/org/sonar/db/report/IssueStatsByRuleKeyMapper.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131
and aggregation_type = #{aggregationType}
3232
</select>
3333

34+
<select id="getIssueStatsByAggregationIdAndRuleKey" parameterType="map" resultType="org.sonarsource.compliancereports.dao.IssueStats">
35+
select
36+
<include refid="IssueStatsColumns"/>
37+
from issue_stats_by_rule_key
38+
where aggregation_id = #{aggregationId}
39+
and rule_key = #{ruleKey}
40+
</select>
41+
3442
<insert id="insertIssueStats">
3543
insert into issue_stats_by_rule_key (
3644
aggregation_id,

server/sonar-server-common/src/testFixtures/resources/metadata/TestMetadata2.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
report:
2-
key: test
2+
key: test2
33
versions:
44
- name: 2
55
key: V2

server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ChangeStatusActionIT.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.sonar.server.ws.WsActionTester;
6767
import org.sonarsource.compliancereports.dao.AggregationType;
6868
import org.sonarsource.compliancereports.dao.IssueStats;
69+
import org.sonarsource.compliancereports.ingestion.IssueIngestionService;
6970

7071
import static org.apache.commons.lang3.RandomStringUtils.secure;
7172
import static org.assertj.core.api.Assertions.assertThat;
@@ -105,8 +106,10 @@ class ChangeStatusActionIT {
105106
private System2 system2 = mock(System2.class);
106107
private IssueFieldsSetter issueFieldsSetter = mock(IssueFieldsSetter.class);
107108
private HotspotWsSupport hotspotWsSupport = new HotspotWsSupport(dbClient, userSessionRule, system2);
109+
private IssueStatsByRuleKeyDaoImpl issueStatsbyRuleKeyDaoImpl = new IssueStatsByRuleKeyDaoImpl(dbClient);
110+
private IssueIngestionService issueIngestionService = new IssueIngestionService(issueStatsbyRuleKeyDaoImpl);
108111
private ChangeStatusAction underTest = new ChangeStatusAction(dbClient, hotspotWsSupport, transitionService, issueFieldsSetter,
109-
issueUpdater, hotspotChangeEventService, new IssueStatsByRuleKeyDaoImpl(dbClient));
112+
issueUpdater, hotspotChangeEventService, issueIngestionService);
110113
private WsActionTester actionTester = new WsActionTester(underTest);
111114
private BranchDto branchDto = mock(BranchDto.class);
112115

server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DoTransitionActionIT.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.sonar.server.ws.WsActionTester;
7676
import org.sonarsource.compliancereports.dao.AggregationType;
7777
import org.sonarsource.compliancereports.dao.IssueStats;
78+
import org.sonarsource.compliancereports.ingestion.IssueIngestionService;
7879

7980
import static org.assertj.core.api.Assertions.assertThat;
8081
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -125,9 +126,10 @@ class DoTransitionActionIT {
125126
new WebIssueStorage(system2, dbClient, new DefaultRuleFinder(dbClient, mock(RuleDescriptionFormatter.class)), issueIndexer, new SequenceUuidFactory()),
126127
mock(NotificationManager.class), issueChangePostProcessor, issuesChangesSerializer);
127128
private ArgumentCaptor<SearchResponseData> preloadedSearchResponseDataCaptor = ArgumentCaptor.forClass(SearchResponseData.class);
129+
private IssueStatsByRuleKeyDaoImpl issueStatsByRuleKeyDaoImpl = new IssueStatsByRuleKeyDaoImpl(dbClient);
128130

129131
private WsAction underTest = new DoTransitionAction(dbClient, userSession, issueChangeEventService,
130-
new IssueFinder(dbClient, userSession), issueUpdater, transitionService, responseWriter, system2, new IssueStatsByRuleKeyDaoImpl(dbClient));
132+
new IssueFinder(dbClient, userSession), issueUpdater, transitionService, responseWriter, system2, new IssueIngestionService(issueStatsByRuleKeyDaoImpl));
131133
private WsActionTester tester = new WsActionTester(underTest);
132134

133135
@Test

server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/SearchActionIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,7 @@ void return_compliance_facets_with_filters() {
11331133

11341134
SearchResponse result = ws.newRequest()
11351135
.setParam(FACETS, FACET_COMPLIANCE_STANDARDS)
1136-
.setParam(PARAM_COMPLIANCE_STANDARDS, "test:V2=cat1&test:V1=category1")
1136+
.setParam(PARAM_COMPLIANCE_STANDARDS, "test2:V2=cat1&test:V1=category1")
11371137
.setParam(PARAM_SEVERITIES, "MINOR")
11381138
.executeProtobuf(SearchResponse.class);
11391139

server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ChangeStatusAction.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.sonar.server.pushapi.hotspots.HotspotChangedEvent;
4545
import org.sonarsource.compliancereports.dao.AggregationType;
4646
import org.sonarsource.compliancereports.dao.IssueStats;
47+
import org.sonarsource.compliancereports.ingestion.IssueIngestionService;
4748

4849
import static com.google.common.base.Preconditions.checkArgument;
4950
import static org.apache.commons.lang3.StringUtils.trimToNull;
@@ -70,18 +71,18 @@ public class ChangeStatusAction implements HotspotsWsAction {
7071
private final IssueFieldsSetter issueFieldsSetter;
7172
private final IssueUpdater issueUpdater;
7273
private final HotspotChangeEventService hotspotChangeEventService;
73-
private final IssueStatsByRuleKeyDaoImpl issueStatsByRuleKeyDao;
74+
private final IssueIngestionService issueIngestionService;
7475

7576
public ChangeStatusAction(DbClient dbClient, HotspotWsSupport hotspotWsSupport, TransitionService transitionService,
7677
IssueFieldsSetter issueFieldsSetter, IssueUpdater issueUpdater, HotspotChangeEventService hotspotChangeEventService,
77-
IssueStatsByRuleKeyDaoImpl issueStatsByRuleKeyDao) {
78+
IssueIngestionService issueIngestionService) {
7879
this.dbClient = dbClient;
7980
this.hotspotWsSupport = hotspotWsSupport;
8081
this.transitionService = transitionService;
8182
this.issueFieldsSetter = issueFieldsSetter;
8283
this.issueUpdater = issueUpdater;
8384
this.hotspotChangeEventService = hotspotChangeEventService;
84-
this.issueStatsByRuleKeyDao = issueStatsByRuleKeyDao;
85+
this.issueIngestionService = issueIngestionService;
8586
}
8687

8788
@Override
@@ -203,23 +204,8 @@ private static HotspotChangedEvent buildEventData(DefaultIssue defaultIssue, Iss
203204
}
204205

205206
private void updateIssueStatsByRuleKey(BranchDto branchDto, RuleKey ruleKey, String transitionKey) {
206-
var issueStats = issueStatsByRuleKeyDao.getIssueStats(branchDto.getUuid(), AggregationType.PROJECT).stream()
207-
.filter(i -> i.ruleKey().equals(ruleKey.toString()))
208-
.findFirst()
209-
.orElse(new IssueStats(ruleKey.toString(), 0, 1, 1, 0, 0));
210-
211-
var updatedIssueStats = updateIssueStatsWithTransition(issueStats, transitionKey);
212-
if (updatedIssueStats.issueCount() != 0 || updatedIssueStats.hotspotCount() != 0 || updatedIssueStats.hotspotsReviewed() != 0) {
213-
issueStatsByRuleKeyDao.upsert(branchDto.getUuid(), PROJECT, updatedIssueStats);
214-
} else {
215-
issueStatsByRuleKeyDao.deleteByAggregationAndRuleKey(branchDto.getUuid(), PROJECT, ruleKey.toString());
216-
}
217-
}
218-
219-
private static IssueStats updateIssueStatsWithTransition(IssueStats oldStats, String transitionKey) {
220207
int adjustment = transitionKey.equals(RESET_AS_TO_REVIEW.getKey()) ? 1 : -1;
221-
return new IssueStats(oldStats.ruleKey(), 0, oldStats.rating(), oldStats.mqrRating(), oldStats.hotspotCount() + adjustment,
222-
oldStats.hotspotsReviewed() - adjustment);
208+
issueIngestionService.adjustHotspotStats(branchDto.getUuid(), PROJECT, ruleKey.toString(), adjustment);
223209
}
224210

225211
}

server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/DoTransitionAction.java

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.sonar.server.pushapi.issues.IssueChangeEventService;
4949
import org.sonar.server.user.UserSession;
5050
import org.sonarsource.compliancereports.dao.IssueStats;
51+
import org.sonarsource.compliancereports.ingestion.IssueIngestionService;
5152

5253
import static java.lang.String.format;
5354
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
@@ -80,11 +81,11 @@ public class DoTransitionAction implements IssuesWsAction {
8081
private final TransitionService transitionService;
8182
private final OperationResponseWriter responseWriter;
8283
private final System2 system2;
83-
private final IssueStatsByRuleKeyDaoImpl issueStatsByRuleKeyDao;
84+
private final IssueIngestionService issueIngestionService;
8485

8586
public DoTransitionAction(DbClient dbClient, UserSession userSession, IssueChangeEventService issueChangeEventService,
8687
IssueFinder issueFinder, IssueUpdater issueUpdater, TransitionService transitionService,
87-
OperationResponseWriter responseWriter, System2 system2, IssueStatsByRuleKeyDaoImpl issueStatsByRuleKeyDao) {
88+
OperationResponseWriter responseWriter, System2 system2,IssueIngestionService issueIngestionService) {
8889
this.dbClient = dbClient;
8990
this.userSession = userSession;
9091
this.issueChangeEventService = issueChangeEventService;
@@ -93,7 +94,7 @@ public DoTransitionAction(DbClient dbClient, UserSession userSession, IssueChang
9394
this.transitionService = transitionService;
9495
this.responseWriter = responseWriter;
9596
this.system2 = system2;
96-
this.issueStatsByRuleKeyDao = issueStatsByRuleKeyDao;
97+
this.issueIngestionService = issueIngestionService;
9798
}
9899

99100
@Override
@@ -169,7 +170,7 @@ private SearchResponseData doTransition(DbSession session, IssueDto issueDto, St
169170
SearchResponseData response = issueUpdater.saveIssueAndPreloadSearchResponseData(session, issueDto, defaultIssue, context, branch);
170171

171172
if (!branch.getBranchType().equals(BranchType.PULL_REQUEST)) {
172-
updateIssueStatsByRuleKey(session, branch, issueDto.getRuleKey(), defaultIssue, transitionKey);
173+
updateIssueStatsByRuleKey(branch, issueDto.getRuleKey(), defaultIssue, transitionKey);
173174
}
174175

175176
if (branch.getBranchType().equals(BRANCH) && response.getComponentByUuid(defaultIssue.projectUuid()) != null) {
@@ -181,18 +182,9 @@ private SearchResponseData doTransition(DbSession session, IssueDto issueDto, St
181182
return new SearchResponseData(issueDto);
182183
}
183184

184-
private void updateIssueStatsByRuleKey(DbSession session, BranchDto branchDto, RuleKey ruleKey, DefaultIssue issue, String transitionKey) {
185-
var issueStats = issueStatsByRuleKeyDao.getIssueStats(branchDto.getUuid(), PROJECT).stream()
186-
.filter(i -> i.ruleKey().equals(ruleKey.toString()))
187-
.findFirst()
188-
.orElse(new IssueStats(ruleKey.toString(), 0, getRating(issue), getMqrRating(issue), 0, 0));
189-
190-
var updatedIssueStats = updateIssueStatsWithTransition(session, branchDto, issueStats, issue, transitionKey);
191-
if (updatedIssueStats.issueCount() != 0 || updatedIssueStats.hotspotCount() != 0 || updatedIssueStats.hotspotsReviewed() != 0) {
192-
issueStatsByRuleKeyDao.upsert(branchDto.getUuid(), PROJECT, updatedIssueStats);
193-
} else {
194-
issueStatsByRuleKeyDao.deleteByAggregationAndRuleKey(branchDto.getUuid(), PROJECT, ruleKey.toString());
195-
}
185+
private void updateIssueStatsByRuleKey(BranchDto branchDto, RuleKey ruleKey, DefaultIssue issue, String transitionKey) {
186+
int adjustment = REOPEN_TRANSITIONS.contains(transitionKey) ? 1 : -1;
187+
issueIngestionService.adjustIssueStats(branchDto.getUuid(), PROJECT, ruleKey.toString(), getRating(issue), getMqrRating(issue), adjustment);
196188
}
197189

198190
private static int getRating(DefaultIssue issue) {
@@ -205,20 +197,4 @@ private static int getMqrRating(DefaultIssue issue) {
205197
.map(impact -> impact.severity().ordinal() + 1)
206198
.orElse(1);
207199
}
208-
209-
private IssueStats updateIssueStatsWithTransition(DbSession session, BranchDto branch, IssueStats oldStats, DefaultIssue issue,
210-
String transitionKey) {
211-
int adjustment = REOPEN_TRANSITIONS.contains(transitionKey) ? 1 : -1;
212-
int newIssueCount = oldStats.issueCount() + adjustment;
213-
if (newIssueCount == 0) {
214-
return new IssueStats(oldStats.ruleKey(), newIssueCount, 1, 1, 0, 0);
215-
}
216-
217-
var newIssueStats = dbClient.issueDao().aggregateIssueStatsForBranchUuidAndRuleKey(session, branch.getUuid(),
218-
issue.ruleKey());
219-
int newRating = newIssueStats == null ? oldStats.rating() : newIssueStats.getRating();
220-
int newMqrRating = newIssueStats == null ? oldStats.mqrRating() : newIssueStats.getMqrRating();
221-
222-
return new IssueStats(oldStats.ruleKey(), newIssueCount, newRating, newMqrRating, 0, 0);
223-
}
224200
}

0 commit comments

Comments
 (0)