2020package org .sonarsource .sonarlint .core .issue ;
2121
2222import jakarta .annotation .PostConstruct ;
23- import java .nio .file .Path ;
2423import java .util .ArrayList ;
2524import java .util .Collections ;
2625import java .util .EnumMap ;
4443import org .sonarsource .sonarlint .core .commons .Transition ;
4544import org .sonarsource .sonarlint .core .commons .Version ;
4645import org .sonarsource .sonarlint .core .commons .log .SonarLintLogger ;
47- import org .sonarsource .sonarlint .core .commons .monitoring .DogfoodEnvironmentDetectionService ;
4846import org .sonarsource .sonarlint .core .commons .progress .SonarLintCancelMonitor ;
49- import org .sonarsource .sonarlint .core .commons . storage . repository .LocalOnlyIssuesRepository ;
47+ import org .sonarsource .sonarlint .core .serverconnection . issues .LocalOnlyIssuesRepository ;
5048import org .sonarsource .sonarlint .core .event .LocalOnlyIssueStatusChangedEvent ;
5149import org .sonarsource .sonarlint .core .event .ServerIssueStatusChangedEvent ;
5250import org .sonarsource .sonarlint .core .event .SonarServerEventReceivedEvent ;
53- import org .sonarsource .sonarlint .core .local .only .LocalOnlyIssueStorageService ;
51+ import org .sonarsource .sonarlint .core .local .only .XodusLocalOnlyIssueStorageService ;
5452import org .sonarsource .sonarlint .core .mode .SeverityModeService ;
5553import org .sonarsource .sonarlint .core .newcode .NewCodeService ;
5654import org .sonarsource .sonarlint .core .remediation .aicodefix .AiCodeFixService ;
7775import org .sonarsource .sonarlint .core .serverapi .push .IssueChangedEvent ;
7876import org .sonarsource .sonarlint .core .serverconnection .ServerInfoSynchronizer ;
7977import org .sonarsource .sonarlint .core .serverconnection .storage .ProjectServerIssueStore ;
80- import org .sonarsource .sonarlint .core .storage .SonarLintDatabaseService ;
8178import org .sonarsource .sonarlint .core .storage .StorageService ;
8279import org .sonarsource .sonarlint .core .tracking .LocalOnlyIssueRepository ;
8380import org .sonarsource .sonarlint .core .tracking .TaintVulnerabilityTrackingService ;
@@ -105,7 +102,7 @@ public class IssueService {
105102 private final ConfigurationRepository configurationRepository ;
106103 private final SonarQubeClientManager sonarQubeClientManager ;
107104 private final StorageService storageService ;
108- private final LocalOnlyIssueStorageService localOnlyIssueStorageService ;
105+ private final XodusLocalOnlyIssueStorageService localOnlyIssueStorageService ;
109106 private final LocalOnlyIssueRepository localOnlyIssueRepository ;
110107 private final ApplicationEventPublisher eventPublisher ;
111108 private final FindingReportingService findingReportingService ;
@@ -114,14 +111,12 @@ public class IssueService {
114111 private final ActiveRulesService activeRulesService ;
115112 private final TaintVulnerabilityTrackingService taintVulnerabilityTrackingService ;
116113 private final AiCodeFixService aiCodeFixService ;
117- private final DogfoodEnvironmentDetectionService dogfoodEnvironmentDetectionService ;
118- private final SonarLintDatabaseService databaseService ;
114+ private final LocalOnlyIssuesRepository localOnlyIssuesRepository ;
119115
120116 public IssueService (ConfigurationRepository configurationRepository , SonarQubeClientManager sonarQubeClientManager , StorageService storageService ,
121- LocalOnlyIssueStorageService localOnlyIssueStorageService , LocalOnlyIssueRepository localOnlyIssueRepository ,
122- ApplicationEventPublisher eventPublisher , FindingReportingService findingReportingService , SeverityModeService severityModeService ,
123- NewCodeService newCodeService , ActiveRulesService activeRulesService , TaintVulnerabilityTrackingService taintVulnerabilityTrackingService , AiCodeFixService aiCodeFixService ,
124- DogfoodEnvironmentDetectionService dogfoodEnvironmentDetectionService , SonarLintDatabaseService databaseService ) {
117+ XodusLocalOnlyIssueStorageService localOnlyIssueStorageService , LocalOnlyIssueRepository localOnlyIssueRepository , ApplicationEventPublisher eventPublisher ,
118+ FindingReportingService findingReportingService , SeverityModeService severityModeService , NewCodeService newCodeService , ActiveRulesService activeRulesService ,
119+ TaintVulnerabilityTrackingService taintVulnerabilityTrackingService , AiCodeFixService aiCodeFixService , LocalOnlyIssuesRepository localOnlyIssuesRepository ) {
125120 this .configurationRepository = configurationRepository ;
126121 this .sonarQubeClientManager = sonarQubeClientManager ;
127122 this .storageService = storageService ;
@@ -134,29 +129,25 @@ public IssueService(ConfigurationRepository configurationRepository, SonarQubeCl
134129 this .activeRulesService = activeRulesService ;
135130 this .taintVulnerabilityTrackingService = taintVulnerabilityTrackingService ;
136131 this .aiCodeFixService = aiCodeFixService ;
137- this .dogfoodEnvironmentDetectionService = dogfoodEnvironmentDetectionService ;
138- this .databaseService = databaseService ;
132+ this .localOnlyIssuesRepository = localOnlyIssuesRepository ;
139133 }
140134
141135 @ PostConstruct
142136 public void migrateData () {
143- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
144- if (localOnlyIssueStorageService .exists ()) {
145- try {
146- LOG .info ("Migrating the Xodus local-only issues to H2" );
147- var migrationStart = System .currentTimeMillis ();
148- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
149- var xodusLocalOnlyIssueStore = localOnlyIssueStorageService .get ();
150- var issuesPerConfigScope = xodusLocalOnlyIssueStore .loadAll ();
151- repository .storeIssues (issuesPerConfigScope );
152- LOG .info ("Migrated Xodus local-only issues to H2, took {}ms" , System .currentTimeMillis () - migrationStart );
153- } catch (Exception e ) {
154- LOG .error ("Unable to migrate local-only findings, will use fresh DB" , e );
155- }
137+ if (localOnlyIssueStorageService .exists ()) {
138+ try {
139+ LOG .info ("Migrating the Xodus local-only issues to H2" );
140+ var migrationStart = System .currentTimeMillis ();
141+ var xodusLocalOnlyIssueStore = localOnlyIssueStorageService .get ();
142+ var issuesPerConfigScope = xodusLocalOnlyIssueStore .loadAll ();
143+ localOnlyIssuesRepository .storeIssues (issuesPerConfigScope );
144+ LOG .info ("Migrated Xodus local-only issues to H2, took {}ms" , System .currentTimeMillis () - migrationStart );
145+ } catch (Exception e ) {
146+ LOG .error ("Unable to migrate local-only findings, will use fresh DB" , e );
156147 }
157- // always call to remove lingering temporary files
158- localOnlyIssueStorageService .delete ();
159148 }
149+ // always call to remove lingering temporary files
150+ localOnlyIssueStorageService .delete ();
160151 }
161152
162153 public void changeStatus (String configurationScopeId , String issueKey , ResolutionStatus newStatus , boolean isTaintIssue , SonarLintCancelMonitor cancelMonitor ) {
@@ -184,10 +175,10 @@ public void changeStatus(String configurationScopeId, String issueKey, Resolutio
184175 var coreStatus = org .sonarsource .sonarlint .core .commons .IssueStatus .valueOf (newStatus .name ());
185176 var issue = localIssueOpt .get ();
186177 issue .resolve (coreStatus );
187- var allIssues = loadAllLocalOnlyIssues (configurationScopeId );
178+ var allIssues = localOnlyIssuesRepository . loadAll (configurationScopeId );
188179 serverConnection .withClientApi (serverApi -> serverApi .issue ()
189180 .anticipatedTransitions (binding .sonarProjectKey (), concat (allIssues , issue ), cancelMonitor ));
190- storeLocalOnlyIssue (configurationScopeId , issue );
181+ localOnlyIssuesRepository . storeLocalOnlyIssue (configurationScopeId , issue );
191182 eventPublisher .publishEvent (new LocalOnlyIssueStatusChangedEvent (issue ));
192183 }
193184 }
@@ -317,40 +308,36 @@ public boolean reopenIssue(String configurationScopeId, String issueId, boolean
317308 public boolean reopenAllIssuesForFile (ReopenAllIssuesForFileParams params , SonarLintCancelMonitor cancelMonitor ) {
318309 var configurationScopeId = params .getConfigurationScopeId ();
319310 var ideRelativePath = params .getIdeRelativePath ();
320- removeAllIssuesForFile (configurationScopeId , ideRelativePath , cancelMonitor );
321- return removeAllIssuesForFileFromStore (configurationScopeId , ideRelativePath );
322- }
323-
324- private void removeAllIssuesForFile (String configurationScopeId , Path filePath , SonarLintCancelMonitor cancelMonitor ) {
325- var allIssues = loadAllLocalOnlyIssues (configurationScopeId );
326- var issuesForFile = loadLocalOnlyIssuesForFile (configurationScopeId , filePath );
311+ var allIssues = localOnlyIssuesRepository .loadAll (configurationScopeId );
312+ var issuesForFile = localOnlyIssuesRepository .loadForFile (configurationScopeId , ideRelativePath );
327313 var issuesToSync = subtract (allIssues , issuesForFile );
328314 var binding = configurationRepository .getEffectiveBindingOrThrow (configurationScopeId );
329315 sonarQubeClientManager .getClientOrThrow (binding .connectionId ())
330316 .withClientApi (serverApi -> serverApi .issue ().anticipatedTransitions (binding .sonarProjectKey (), issuesToSync , cancelMonitor ));
317+ return localOnlyIssuesRepository .removeAllIssuesForFile (configurationScopeId , ideRelativePath );
331318 }
332319
333320 private void removeIssueOnServer (String configurationScopeId , UUID issueId , SonarLintCancelMonitor cancelMonitor ) {
334- var allIssues = loadAllLocalOnlyIssues (configurationScopeId );
321+ var allIssues = localOnlyIssuesRepository . loadAll (configurationScopeId );
335322 var issuesToSync = allIssues .stream ().filter (it -> !it .getId ().equals (issueId )).toList ();
336323 var binding = configurationRepository .getEffectiveBindingOrThrow (configurationScopeId );
337324 sonarQubeClientManager .getClientOrThrow (binding .connectionId ())
338325 .withClientApi (serverApi -> serverApi .issue ().anticipatedTransitions (binding .sonarProjectKey (), issuesToSync , cancelMonitor ));
339326 }
340327
341328 private void setCommentOnLocalOnlyIssue (String configurationScopeId , UUID issueId , String comment , SonarLintCancelMonitor cancelMonitor ) {
342- var optionalLocalOnlyIssue = findLocalOnlyIssue (issueId );
329+ var optionalLocalOnlyIssue = localOnlyIssuesRepository . find (issueId );
343330 if (optionalLocalOnlyIssue .isPresent ()) {
344331 var commentedIssue = optionalLocalOnlyIssue .get ();
345332 var resolution = commentedIssue .getResolution ();
346333 if (resolution != null ) {
347334 resolution .setComment (comment );
348- var issuesToSync = new ArrayList <>(loadAllLocalOnlyIssues (configurationScopeId ));
335+ var issuesToSync = new ArrayList <>(localOnlyIssuesRepository . loadAll (configurationScopeId ));
349336 issuesToSync .replaceAll (issue -> issue .getId ().equals (issueId ) ? commentedIssue : issue );
350337 var binding = configurationRepository .getEffectiveBindingOrThrow (configurationScopeId );
351338 sonarQubeClientManager .getClientOrThrow (binding .connectionId ())
352339 .withClientApi (serverApi -> serverApi .issue ().anticipatedTransitions (binding .sonarProjectKey (), issuesToSync , cancelMonitor ));
353- storeLocalOnlyIssue (configurationScopeId , commentedIssue );
340+ localOnlyIssuesRepository . storeLocalOnlyIssue (configurationScopeId , commentedIssue );
354341 }
355342 } else {
356343 throw issueNotFoundException (issueId .toString ());
@@ -383,7 +370,7 @@ private boolean reopenLocalIssue(String issueId, String configurationScopeId, So
383370 }
384371 var issueUuid = issueUuidOptional .get ();
385372 removeIssueOnServer (configurationScopeId , issueUuid , cancelMonitor );
386- return removeLocalOnlyIssue (issueUuid );
373+ return localOnlyIssuesRepository . removeIssue (issueUuid );
387374 }
388375
389376 public EffectiveIssueDetailsDto getEffectiveIssueDetails (String configurationScopeId , UUID findingId , SonarLintCancelMonitor cancelMonitor )
@@ -561,59 +548,4 @@ private static Optional<UUID> asUUID(String key) {
561548 return Optional .empty ();
562549 }
563550 }
564-
565- // Helper methods to abstract between Xodus and H2 storage
566- public List <LocalOnlyIssue > loadAllLocalOnlyIssues (String configurationScopeId ) {
567- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
568- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
569- return repository .loadAll (configurationScopeId );
570- } else {
571- return localOnlyIssueStorageService .get ().loadAll (configurationScopeId );
572- }
573- }
574-
575- private List <LocalOnlyIssue > loadLocalOnlyIssuesForFile (String configurationScopeId , Path filePath ) {
576- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
577- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
578- return repository .loadForFile (configurationScopeId , filePath );
579- } else {
580- return localOnlyIssueStorageService .get ().loadForFile (configurationScopeId , filePath );
581- }
582- }
583-
584- private Optional <LocalOnlyIssue > findLocalOnlyIssue (UUID issueId ) {
585- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
586- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
587- return repository .find (issueId );
588- } else {
589- return localOnlyIssueStorageService .get ().find (issueId );
590- }
591- }
592-
593- private void storeLocalOnlyIssue (String configurationScopeId , LocalOnlyIssue issue ) {
594- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
595- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
596- repository .storeLocalOnlyIssue (configurationScopeId , issue );
597- } else {
598- localOnlyIssueStorageService .get ().storeLocalOnlyIssue (configurationScopeId , issue );
599- }
600- }
601-
602- private boolean removeLocalOnlyIssue (UUID issueId ) {
603- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
604- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
605- return repository .removeIssue (issueId );
606- } else {
607- return localOnlyIssueStorageService .get ().removeIssue (issueId );
608- }
609- }
610-
611- private boolean removeAllIssuesForFileFromStore (String configurationScopeId , Path filePath ) {
612- if (dogfoodEnvironmentDetectionService .isDogfoodEnvironment ()) {
613- var repository = new LocalOnlyIssuesRepository (databaseService .getDatabase ());
614- return repository .removeAllIssuesForFile (configurationScopeId , filePath );
615- } else {
616- return localOnlyIssueStorageService .get ().removeAllIssuesForFile (configurationScopeId , filePath );
617- }
618- }
619551}
0 commit comments