diff options
author | Steve Marion <steve.marion@sonarsource.com> | 2025-02-28 23:10:40 +0100 |
---|---|---|
committer | Matteo Mara <matteo.mara@sonarsource.com> | 2025-03-17 22:23:55 +0100 |
commit | 8dda5ad3e9824137ae6c273c69e7db70459fef16 (patch) | |
tree | 20fbc28d351b375fd4454dfd1ca3c9aa5373cb2d | |
parent | 390b8eddbe3cda5aa4e11866ed5865a4befa51f7 (diff) | |
download | sonarqube-8dda5ad3e9824137ae6c273c69e7db70459fef16.tar.gz sonarqube-8dda5ad3e9824137ae6c273c69e7db70459fef16.zip |
SONAR-24514 Add CE processing of architecture graphs in analysis reports.
9 files changed, 65 insertions, 45 deletions
diff --git a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/scanner/ScannerReportReader.java b/server/sonar-ce-common/src/main/java/org/sonar/ce/common/scanner/ScannerReportReader.java index e69c297182f..459ba57009a 100644 --- a/server/sonar-ce-common/src/main/java/org/sonar/ce/common/scanner/ScannerReportReader.java +++ b/server/sonar-ce-common/src/main/java/org/sonar/ce/common/scanner/ScannerReportReader.java @@ -75,4 +75,6 @@ public interface ScannerReportReader { CloseableIterator<ScannerReport.TelemetryEntry> readTelemetryEntries(); File readDependencyFilesZip(); + + CloseableIterator<ScannerReport.AnalysisData> readAnalysisData(); } diff --git a/server/sonar-ce-common/src/testFixtures/java/org/sonar/ce/common/scanner/ScannerReportReaderRule.java b/server/sonar-ce-common/src/testFixtures/java/org/sonar/ce/common/scanner/ScannerReportReaderRule.java index fa472ff4981..29e718bfe96 100644 --- a/server/sonar-ce-common/src/testFixtures/java/org/sonar/ce/common/scanner/ScannerReportReaderRule.java +++ b/server/sonar-ce-common/src/testFixtures/java/org/sonar/ce/common/scanner/ScannerReportReaderRule.java @@ -65,6 +65,7 @@ public class ScannerReportReaderRule implements TestRule, ScannerReportReader, A private byte[] analysisCache; private List<ScannerReport.TelemetryEntry> telemetryEntries = new ArrayList<>(); private File dependencyFilesZip; + private List<ScannerReport.AnalysisData> analysisData = new ArrayList<>(); @Override public Statement apply(final Statement statement, Description description) { @@ -341,6 +342,11 @@ public class ScannerReportReaderRule implements TestRule, ScannerReportReader, A } @Override + public CloseableIterator<ScannerReport.AnalysisData> readAnalysisData() { + return CloseableIterator.from(analysisData.iterator()); + } + + @Override public File readDependencyFilesZip() { if (dependencyFilesZip == null) { return null; diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationCheck.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationCheck.java index 8daa288eb49..210c1e5ff76 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationCheck.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationCheck.java @@ -22,6 +22,7 @@ package org.sonar.ce.task.projectanalysis.measure; import org.sonar.api.ExtensionPoint; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; +import org.sonar.ce.task.projectanalysis.analysis.Branch; import org.sonar.ce.task.projectanalysis.component.Component; /** @@ -50,6 +51,8 @@ public interface PostMeasuresComputationCheck { */ String getProjectUuid(); + Branch getBranch(); + /** * Return the ncloc computed for the current analysis */ diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java index a5a998b685c..92e9d3a170e 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStep.java @@ -23,12 +23,12 @@ import java.util.Optional; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.measures.CoreMetrics; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; +import org.sonar.ce.task.projectanalysis.analysis.Branch; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; import org.sonar.ce.task.projectanalysis.metric.Metric; import org.sonar.ce.task.projectanalysis.metric.MetricRepository; import org.sonar.ce.task.step.ComputationStep; -import org.springframework.beans.factory.annotation.Autowired; /** * Execute {@link PostMeasuresComputationCheck} instances in no specific order. @@ -44,7 +44,6 @@ public class PostMeasuresComputationChecksStep implements ComputationStep { private final AnalysisMetadataHolder analysisMetadataHolder; private final PostMeasuresComputationCheck[] extensions; - @Autowired(required = false) public PostMeasuresComputationChecksStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, AnalysisMetadataHolder analysisMetadataHolder, PostMeasuresComputationCheck[] extensions) { this.treeRootHolder = treeRootHolder; @@ -54,15 +53,6 @@ public class PostMeasuresComputationChecksStep implements ComputationStep { this.extensions = extensions; } - /** - * Used when zero {@link PostMeasuresComputationCheck} are registered into container. - */ - @Autowired(required = false) - public PostMeasuresComputationChecksStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, - AnalysisMetadataHolder analysisMetadataHolder) { - this(treeRootHolder, metricRepository, measureRepository, analysisMetadataHolder, new PostMeasuresComputationCheck[0]); - } - @Override public void execute(ComputationStep.Context context) { PostMeasuresComputationCheck.Context extensionContext = new ContextImpl(); @@ -84,6 +74,11 @@ public class PostMeasuresComputationChecksStep implements ComputationStep { } @Override + public Branch getBranch() { + return analysisMetadataHolder.getBranch(); + } + + @Override public int getNcloc() { Metric nclocMetric = metricRepository.getByKey(CoreMetrics.NCLOC_KEY); Optional<Measure> nclocMeasure = measureRepository.getRawMeasure(treeRootHolder.getRoot(), nclocMetric); diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationCheck.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationCheck.java index 68e1f8e56a4..d72421f7037 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationCheck.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationCheck.java @@ -22,8 +22,10 @@ package org.sonar.ce.task.projectanalysis.measure; import org.sonar.api.ExtensionPoint; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.config.Configuration; +import org.sonar.ce.common.scanner.ScannerReportReader; import org.sonar.ce.task.projectanalysis.analysis.Branch; + /** * Extension point that is called during processing of a task * by {@link PreMeasuresComputationChecksStep}. @@ -49,6 +51,8 @@ public interface PreMeasuresComputationCheck { Branch getBranch(); Configuration getConfiguration(); + + ScannerReportReader getReportReader(); } class PreMeasuresComputationCheckException extends RuntimeException { diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStep.java index b59dcd63cba..1ea17875a8f 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStep.java @@ -19,8 +19,11 @@ */ package org.sonar.ce.task.projectanalysis.measure; +import static org.sonar.ce.task.projectanalysis.measure.PreMeasuresComputationCheck.PreMeasuresComputationCheckException; + import org.sonar.api.config.Configuration; import org.sonar.api.utils.System2; +import org.sonar.ce.common.scanner.ScannerReportReader; import org.sonar.ce.task.log.CeTaskMessages; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.analysis.Branch; @@ -28,8 +31,6 @@ import org.sonar.ce.task.projectanalysis.component.ConfigurationRepository; import org.sonar.ce.task.step.ComputationStep; import org.sonar.db.dismissmessage.MessageType; -import static org.sonar.ce.task.projectanalysis.measure.PreMeasuresComputationCheck.PreMeasuresComputationCheckException; - /** * Execute {@link PreMeasuresComputationCheck} instances in no specific order. * If an extension fails (throws an exception), consecutive extensions @@ -41,15 +42,17 @@ public class PreMeasuresComputationChecksStep implements ComputationStep { private final PreMeasuresComputationCheck[] extensions; private final CeTaskMessages ceTaskMessages; private final ConfigurationRepository configurationRepository; + private final ScannerReportReader reportReader; public PreMeasuresComputationChecksStep( AnalysisMetadataHolder analysisMetadataHolder, CeTaskMessages ceTaskMessages, - ConfigurationRepository configurationRepository, PreMeasuresComputationCheck... extensions) { + ConfigurationRepository configurationRepository, ScannerReportReader reportReader, PreMeasuresComputationCheck... extensions) { this.analysisMetadataHolder = analysisMetadataHolder; this.ceTaskMessages = ceTaskMessages; this.configurationRepository = configurationRepository; this.extensions = extensions; + this.reportReader = reportReader; } @Override @@ -86,5 +89,10 @@ public class PreMeasuresComputationChecksStep implements ComputationStep { return configurationRepository.getConfiguration(); } + @Override + public ScannerReportReader getReportReader() { + return reportReader; + } + } } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scanner/ScannerReportReaderImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scanner/ScannerReportReaderImpl.java index ed966607bce..5f2627c31a0 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scanner/ScannerReportReaderImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/scanner/ScannerReportReaderImpl.java @@ -19,6 +19,8 @@ */ package org.sonar.ce.task.projectanalysis.scanner; +import static java.nio.charset.StandardCharsets.UTF_8; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -36,8 +38,6 @@ import org.sonar.scanner.protocol.output.FileStructure; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.LineSgnificantCode; -import static java.nio.charset.StandardCharsets.UTF_8; - public class ScannerReportReaderImpl implements ScannerReportReader { private final ScannerReportDirectoryHolder scannerReportDirectoryHolder; @@ -239,4 +239,10 @@ public class ScannerReportReaderImpl implements ScannerReportReader { ensureInitialized(); return delegate.readDependencyFilesZip(); } + + @Override + public CloseableIterator<ScannerReport.AnalysisData> readAnalysisData() { + ensureInitialized(); + return delegate.readAnalysisData(); + } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStepTest.java index 7f2e8a8a929..701ec610b66 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PostMeasuresComputationChecksStepTest.java @@ -19,18 +19,6 @@ */ package org.sonar.ce.task.projectanalysis.measure; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.InOrder; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule; -import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; -import org.sonar.ce.task.projectanalysis.measure.PostMeasuresComputationCheck.Context; -import org.sonar.ce.task.projectanalysis.metric.MetricRepositoryRule; -import org.sonar.ce.task.step.TestComputationStepContext; -import org.sonar.server.project.Project; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; @@ -43,6 +31,18 @@ import static org.sonar.api.measures.CoreMetrics.NCLOC; import static org.sonar.ce.task.projectanalysis.component.ReportComponent.DUMB_PROJECT; import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; +import org.sonar.api.measures.CoreMetrics; +import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule; +import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; +import org.sonar.ce.task.projectanalysis.measure.PostMeasuresComputationCheck.Context; +import org.sonar.ce.task.projectanalysis.metric.MetricRepositoryRule; +import org.sonar.ce.task.step.TestComputationStepContext; +import org.sonar.server.project.Project; + public class PostMeasuresComputationChecksStepTest { @Rule @@ -131,9 +131,6 @@ public class PostMeasuresComputationChecksStepTest { } private PostMeasuresComputationChecksStep newStep(PostMeasuresComputationCheck... postMeasuresComputationChecks) { - if (postMeasuresComputationChecks.length == 0) { - return new PostMeasuresComputationChecksStep(treeRootHolder, metricRepository, measureRepository, analysisMetadataHolder); - } return new PostMeasuresComputationChecksStep(treeRootHolder, metricRepository, measureRepository, analysisMetadataHolder, postMeasuresComputationChecks); } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStepTest.java index c0840838bb2..b894be71e53 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/measure/PreMeasuresComputationChecksStepTest.java @@ -19,10 +19,21 @@ */ package org.sonar.ce.task.projectanalysis.measure; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.sonar.ce.task.projectanalysis.measure.PreMeasuresComputationCheck.PreMeasuresComputationCheckException; +import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; + import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; +import org.sonar.ce.common.scanner.ScannerReportReader; import org.sonar.ce.task.log.CeTaskMessages; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule; import org.sonar.ce.task.projectanalysis.analysis.Branch; @@ -32,20 +43,11 @@ import org.sonar.ce.task.step.TestComputationStepContext; import org.sonar.db.component.BranchType; import org.sonar.server.project.Project; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.sonar.ce.task.projectanalysis.measure.PreMeasuresComputationCheck.PreMeasuresComputationCheckException; -import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; - public class PreMeasuresComputationChecksStepTest { public AnalysisMetadataHolderRule analysisMetadataHolder = mock(); public CeTaskMessages ceTaskMessages = mock(); + public ScannerReportReader reportReader = mock(); public ConfigurationRepository configurationRepository = mock(); @Before @@ -121,10 +123,7 @@ public class PreMeasuresComputationChecksStepTest { } private PreMeasuresComputationChecksStep newStep(PreMeasuresComputationCheck... preMeasuresComputationChecks) { - if (preMeasuresComputationChecks.length == 0) { - return new PreMeasuresComputationChecksStep(analysisMetadataHolder, ceTaskMessages, configurationRepository); - } - return new PreMeasuresComputationChecksStep(analysisMetadataHolder, ceTaskMessages, configurationRepository, preMeasuresComputationChecks); + return new PreMeasuresComputationChecksStep(analysisMetadataHolder, ceTaskMessages, configurationRepository, reportReader, preMeasuresComputationChecks); } private void mockBranch(String branchName) { |