diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStep.java index a64e45b36789..32a76daf6ae1 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStep.java @@ -19,7 +19,6 @@ */ package org.sonar.ce.task.projectanalysis.step; -import com.google.common.base.Optional; import javax.annotation.CheckForNull; import org.sonar.api.config.Configuration; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; @@ -36,7 +35,6 @@ import org.sonar.ce.task.step.ComputationStep; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; /** * Populates the {@link PeriodHolder} @@ -48,23 +46,27 @@ */ public class LoadPeriodsStep implements ComputationStep { + private final AnalysisMetadataHolder analysisMetadataHolder; private final DbClient dbClient; private final ConfigurationRepository configRepository; private final TreeRootHolder treeRootHolder; - private final AnalysisMetadataHolder analysisMetadataHolder; private final PeriodHolderImpl periodsHolder; - public LoadPeriodsStep(DbClient dbClient, ConfigurationRepository settingsRepository, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder, - PeriodHolderImpl periodsHolder) { + public LoadPeriodsStep(AnalysisMetadataHolder analysisMetadataHolder, DbClient dbClient, + ConfigurationRepository configurationRepository, TreeRootHolder treeRootHolder, PeriodHolderImpl periodsHolder) { + this.analysisMetadataHolder = analysisMetadataHolder; this.dbClient = dbClient; - this.configRepository = settingsRepository; + this.configRepository = configurationRepository; this.treeRootHolder = treeRootHolder; - this.analysisMetadataHolder = analysisMetadataHolder; this.periodsHolder = periodsHolder; } @Override public void execute(ComputationStep.Context context) { + if (analysisMetadataHolder.isFirstAnalysis()) { + return; + } + new DepthTraversalTypeAwareCrawler( new TypeAwareVisitorAdapter(CrawlerDepthLimit.PROJECT, ComponentVisitor.Order.PRE_ORDER) { @Override @@ -82,14 +84,8 @@ public void execute(Component projectOrView) { @CheckForNull private Period buildPeriod(Component projectOrView, DbSession session) { - Optional projectDto = dbClient.componentDao().selectByKey(session, projectOrView.getKey()); - // No project on first analysis, no period - if (!projectDto.isPresent()) { - return null; - } - boolean isReportType = projectOrView.getType().isReportType(); - PeriodResolver periodResolver = new PeriodResolver(dbClient, session, projectDto.get().uuid(), analysisMetadataHolder.getAnalysisDate(), + PeriodResolver periodResolver = new PeriodResolver(dbClient, session, projectOrView.getUuid(), analysisMetadataHolder.getAnalysisDate(), isReportType ? projectOrView.getReportAttributes().getVersion() : null); Configuration config = configRepository.getConfiguration(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStepTest.java index 70284f87c7fd..4efb2491c4c0 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStepTest.java @@ -21,6 +21,7 @@ import com.tngtech.java.junit.dataprovider.DataProviderRunner; import java.text.SimpleDateFormat; +import org.apache.commons.lang.RandomStringUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -30,10 +31,13 @@ import org.sonar.api.utils.System2; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; +import org.sonar.ce.task.projectanalysis.analysis.Analysis; +import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder; import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.ConfigurationRepository; import org.sonar.ce.task.projectanalysis.component.ReportComponent; +import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; import org.sonar.ce.task.projectanalysis.period.Period; import org.sonar.ce.task.projectanalysis.period.PeriodHolderImpl; @@ -47,6 +51,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import static org.sonar.core.config.CorePropertyDefinitions.LEAK_PERIOD_MODE_DATE; import static org.sonar.core.config.CorePropertyDefinitions.LEAK_PERIOD_MODE_DAYS; @@ -77,7 +83,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { private MapSettings settings = new MapSettings(); private ConfigurationRepository settingsRepository = mock(ConfigurationRepository.class); - private LoadPeriodsStep underTest = new LoadPeriodsStep(dbClient, settingsRepository, treeRootHolder, analysisMetadataHolder, periodsHolder); + private LoadPeriodsStep underTest = new LoadPeriodsStep(analysisMetadataHolder, dbClient, settingsRepository, treeRootHolder, periodsHolder); @Override protected ComputationStep step() { @@ -87,16 +93,24 @@ protected ComputationStep step() { @Before public void setUp() throws Exception { analysisMetadataHolder.setAnalysisDate(DATE_FORMAT.parse("2008-11-30").getTime()); + analysisMetadataHolder.setBaseAnalysis(new Analysis.Builder().setUuid(RandomStringUtils.randomAlphabetic(15)).setId(888).setCreatedAt(5_666_777_888L).build()); } @Test public void no_period_on_first_analysis() { - treeRootHolder.setRoot(ReportComponent.builder(Component.Type.PROJECT, 1).setKey("ROOT_KEY").setVersion("1.1").build()); + DbClient dbClientMock = mock(DbClient.class); + ConfigurationRepository configurationRepositoryMock = mock(ConfigurationRepository.class); + TreeRootHolder treeRootHolderMock = mock(TreeRootHolder.class); + PeriodHolderImpl periodHolderMock = mock(PeriodHolderImpl.class); + AnalysisMetadataHolder analysisMetadataHolderMock = mock(AnalysisMetadataHolder.class); + when(analysisMetadataHolderMock.isFirstAnalysis()).thenReturn(true); + + LoadPeriodsStep underTest = new LoadPeriodsStep(analysisMetadataHolderMock, dbClientMock, configurationRepositoryMock, treeRootHolderMock, periodHolderMock); - // No project, no snapshot underTest.execute(new TestComputationStepContext()); - assertThat(periodsHolder.hasPeriod()).isFalse(); + verify(analysisMetadataHolderMock).isFirstAnalysis(); + verifyZeroInteractions(dbClientMock, configurationRepositoryMock, treeRootHolderMock, periodHolderMock); } @Test