From ba41dbfdf353e6b1d50a9b2af75d57faa65eeb95 Mon Sep 17 00:00:00 2001 From: Jacek Date: Tue, 6 Aug 2019 13:21:21 +0200 Subject: [PATCH] SONAR-12364 - switch from manual baseline to New Code Period concept --- .../projectanalysis/step/LoadPeriodsStep.java | 7 +- .../step/LoadPeriodsStepTest.java | 10 +- .../org/sonar/db/component/BranchDao.java | 1 + .../org/sonar/db/component/BranchDto.java | 2 + .../db/newcodeperiod/NewCodePeriodDao.java | 18 +++- .../db/newcodeperiod/NewCodePeriodMapper.java | 2 + .../db/newcodeperiod/NewCodePeriodMapper.xml | 15 ++- .../newcodeperiod/NewCodePeriodDaoTest.java | 96 ++++++++++++++----- .../sonar/db/component/ComponentDbTester.java | 24 +++-- .../projectanalysis/ws/DeleteAction.java | 10 +- .../projectanalysis/ws/SearchAction.java | 4 +- .../projectanalysis/ws/SetBaselineAction.java | 15 ++- .../ws/UnsetBaselineAction.java | 5 +- .../projectanalysis/ws/DeleteActionTest.java | 11 ++- .../projectanalysis/ws/SearchActionTest.java | 12 ++- .../ws/SetBaselineActionTest.java | 20 ++-- 16 files changed, 187 insertions(+), 65 deletions(-) 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 5894c17a8ce..c153c31afe9 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 @@ -52,6 +52,7 @@ import org.sonar.db.component.BranchType; import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotQuery; import org.sonar.db.event.EventDto; +import org.sonar.db.newcodeperiod.NewCodePeriodDto; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; @@ -84,7 +85,7 @@ public class LoadPeriodsStep implements ComputationStep { private final ConfigurationRepository configRepository; public LoadPeriodsStep(AnalysisMetadataHolder analysisMetadataHolder, TreeRootHolder treeRootHolder, PeriodHolderImpl periodsHolder, - System2 system2, DbClient dbClient, ConfigurationRepository configRepository) { + System2 system2, DbClient dbClient, ConfigurationRepository configRepository) { this.analysisMetadataHolder = analysisMetadataHolder; this.treeRootHolder = treeRootHolder; this.periodsHolder = periodsHolder; @@ -134,7 +135,9 @@ public class LoadPeriodsStep implements ComputationStep { } private Period resolveByManualBaseline(DbSession dbSession, String projectUuid, BranchDto branchDto) { - String baselineAnalysisUuid = branchDto.getManualBaseline(); + String baselineAnalysisUuid = dbClient.newCodePeriodDao().selectByBranch(dbSession, projectUuid, branchDto.getUuid()) + .map(NewCodePeriodDto::getValue) + .orElse(null); if (baselineAnalysisUuid == null) { return null; } 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 c2b3b13c679..af4e9d16984 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 @@ -225,7 +225,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @DataProvider public static Object[][] branchTypesNotAllowedToHaveManualBaseline() { - return new Object[][] { + return new Object[][]{ {BranchType.SHORT}, {BranchType.PULL_REQUEST} }; @@ -337,7 +337,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @DataProvider public static Object[][] anyValidLeakPeriodSettingValue() { - return new Object[][] { + return new Object[][]{ // days {"100"}, // date @@ -416,7 +416,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @DataProvider public static Object[][] projectVersionNullOrNot() { - return new Object[][] { + return new Object[][]{ {null}, {randomAlphabetic(15)}, }; @@ -526,7 +526,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @DataProvider public static Object[][] zeroOrLess() { - return new Object[][] { + return new Object[][]{ {0}, {-1 - new Random().nextInt(30)} }; @@ -582,7 +582,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @DataProvider public static Object[][] stringConsideredAsVersions() { - return new Object[][] { + return new Object[][]{ {randomAlphabetic(5)}, {"1,3"}, {"1.3"}, diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java index 4b8a56bfbc7..c5c77e7fad0 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java @@ -72,6 +72,7 @@ public class BranchDao implements Dao { * * @return the number of rows that were updated */ + @Deprecated public int updateManualBaseline(DbSession dbSession, String uuid, @Nullable String analysisUuid) { long now = system2.now(); return mapper(dbSession).updateManualBaseline(uuid, analysisUuid == null || analysisUuid.isEmpty() ? null : analysisUuid, now); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDto.java index 564dba19135..624213856f8 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDto.java @@ -196,10 +196,12 @@ public class BranchDto { } @CheckForNull + @Deprecated public String getManualBaseline() { return manualBaseline; } + @Deprecated public BranchDto setManualBaseline(@Nullable String manualBaseline) { this.manualBaseline = manualBaseline == null || manualBaseline.isEmpty() ? null : manualBaseline; return this; diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodDao.java index 4ffc6cd4dd6..c4c535ed2e1 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodDao.java @@ -57,17 +57,26 @@ public class NewCodePeriodDao implements Dao { NewCodePeriodMapper mapper = mapper(dbSession); long currentTime = system2.now(); dto.setUpdatedAt(currentTime); - if (mapper.update(dto) == 0) { + if (updateInternal(dbSession, dto) == 0) { dto.setCreatedAt(currentTime); dto.setUuid(uuidFactory.create()); mapper.insert(dto); } } + public void update(DbSession dbSession, NewCodePeriodDto dto) { + requireNonNull(dto.getUuid(), "Uuid of NewCodePeriod must be specified."); + updateInternal(dbSession, dto); + } + + private int updateInternal(DbSession dbSession, NewCodePeriodDto dto) { + requireNonNull(dto.getType(), "Type of NewCodePeriod must be specified."); + return mapper(dbSession).update(dto.setUpdatedAt(system2.now())); + } + public Optional selectByProject(DbSession dbSession, String projectUuid) { requireNonNull(projectUuid, "Project uuid must be specified."); return Optional.ofNullable(mapper(dbSession).selectByProject(projectUuid)); - } public Optional selectByBranch(DbSession dbSession, String projectUuid, String branchUuid) { @@ -76,6 +85,11 @@ public class NewCodePeriodDao implements Dao { return Optional.ofNullable(mapper(dbSession).selectByBranch(projectUuid, branchUuid)); } + public void deleteByProjectUuidAndBranchUuid(DbSession dbSession, String projectUuid, String branchUuid) { + requireNonNull(projectUuid, "Project uuid must be specified."); + mapper(dbSession).deleteByProjectAndBranch(projectUuid, branchUuid); + } + private static NewCodePeriodMapper mapper(DbSession session) { return session.getMapper(NewCodePeriodMapper.class); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodMapper.java index f6381ca1433..c02e89ad973 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/newcodeperiod/NewCodePeriodMapper.java @@ -34,5 +34,7 @@ public interface NewCodePeriodMapper { NewCodePeriodDto selectByProject(String projectUuid); + void deleteByProjectAndBranch(@Param("projectUuid") String projectUuid, @Param("branchUuid") String branchUuid); + NewCodePeriodDto selectByBranch(@Param("projectUuid") String projectUuid, @Param("branchUuid") String branchUuid); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/newcodeperiod/NewCodePeriodMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/newcodeperiod/NewCodePeriodMapper.xml index 3f9ac7a01f8..74de5d5e48e 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/newcodeperiod/NewCodePeriodMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/newcodeperiod/NewCodePeriodMapper.xml @@ -45,12 +45,13 @@ - update new_code_periods - set + UPDATE new_code_periods + SET type=#{type, jdbcType=VARCHAR}, value=#{value, jdbcType=VARCHAR}, updated_at=#{updatedAt, jdbcType=TIMESTAMP} - where uuid=#{uuid} + WHERE + uuid=#{uuid, jdbcType=VARCHAR} + + DELETE + FROM new_code_periods + WHERE + project_uuid=#{projectUuid, jdbcType=VARCHAR} + AND branch_uuid=#{branchUuid, jdbcType=VARCHAR} + + diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/newcodeperiod/NewCodePeriodDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/newcodeperiod/NewCodePeriodDaoTest.java index f9d675c9e30..cfe74ad7093 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/newcodeperiod/NewCodePeriodDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/newcodeperiod/NewCodePeriodDaoTest.java @@ -44,102 +44,148 @@ public class NewCodePeriodDaoTest { private UuidFactory uuidFactory = mock(UuidFactory.class); private NewCodePeriodDao underTest = new NewCodePeriodDao(System2.INSTANCE, uuidFactory); + private static final String NEW_CODE_PERIOD_UUID = "ncp-uuid-1"; + @Test public void insert_new_code_period() { - when(uuidFactory.create()).thenReturn("uuid-1"); + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); underTest.insert(dbSession, new NewCodePeriodDto() .setProjectUuid("proj-uuid") .setBranchUuid("branch-uuid") .setType(NewCodePeriodType.NUMBER_OF_DAYS) .setValue("5")); - Optional resultOpt = underTest.selectByUuid(dbSession, "uuid-1"); + Optional resultOpt = underTest.selectByUuid(dbSession, NEW_CODE_PERIOD_UUID); assertThat(resultOpt).isNotNull(); assertThat(resultOpt).isNotEmpty(); NewCodePeriodDto result = resultOpt.get(); - assertThat(result.getUuid()).isEqualTo("uuid-1"); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); assertThat(result.getProjectUuid()).isEqualTo("proj-uuid"); assertThat(result.getBranchUuid()).isEqualTo("branch-uuid"); assertThat(result.getType()).isEqualTo(NewCodePeriodType.NUMBER_OF_DAYS); assertThat(result.getValue()).isEqualTo("5"); assertThat(result.getCreatedAt()).isNotEqualTo(0); assertThat(result.getUpdatedAt()).isNotEqualTo(0); + + db.commit(); + assertNewCodePeriodRowCount(1); + } + + @Test + public void update_new_code_period() { + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); + + underTest.insert(dbSession, new NewCodePeriodDto() + .setProjectUuid("proj-uuid") + .setBranchUuid("branch-uuid") + .setType(NewCodePeriodType.NUMBER_OF_DAYS) + .setValue("5")); + + underTest.update(dbSession, new NewCodePeriodDto() + .setUuid(NEW_CODE_PERIOD_UUID) + .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) + .setProjectUuid("proj-uuid") + .setBranchUuid("branch-uuid") + .setValue("analysis-uuid")); + + Optional resultOpt = underTest.selectByUuid(dbSession, NEW_CODE_PERIOD_UUID); + + assertThat(resultOpt).isNotNull(); + assertThat(resultOpt).isNotEmpty(); + + NewCodePeriodDto result = resultOpt.get(); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); + assertThat(result.getProjectUuid()).isEqualTo("proj-uuid"); + assertThat(result.getBranchUuid()).isEqualTo("branch-uuid"); + assertThat(result.getType()).isEqualTo(NewCodePeriodType.SPECIFIC_ANALYSIS); + assertThat(result.getValue()).isEqualTo("analysis-uuid"); + assertThat(result.getCreatedAt()).isNotEqualTo(0); + assertThat(result.getUpdatedAt()).isNotEqualTo(0); + + db.commit(); + assertNewCodePeriodRowCount(1); } @Test public void insert_with_upsert() { - when(uuidFactory.create()).thenReturn("uuid-1"); + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); underTest.upsert(dbSession, new NewCodePeriodDto() + .setUuid(NEW_CODE_PERIOD_UUID) .setProjectUuid("proj-uuid") .setBranchUuid("branch-uuid") .setType(NewCodePeriodType.NUMBER_OF_DAYS) .setValue("5")); - Optional resultOpt = underTest.selectByUuid(dbSession, "uuid-1"); + Optional resultOpt = underTest.selectByUuid(dbSession, NEW_CODE_PERIOD_UUID); assertThat(resultOpt).isNotNull(); assertThat(resultOpt).isNotEmpty(); NewCodePeriodDto result = resultOpt.get(); - assertThat(result.getUuid()).isEqualTo("uuid-1"); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); assertThat(result.getProjectUuid()).isEqualTo("proj-uuid"); assertThat(result.getBranchUuid()).isEqualTo("branch-uuid"); assertThat(result.getType()).isEqualTo(NewCodePeriodType.NUMBER_OF_DAYS); assertThat(result.getValue()).isEqualTo("5"); assertThat(result.getCreatedAt()).isNotEqualTo(0); assertThat(result.getUpdatedAt()).isNotEqualTo(0); + + db.commit(); + assertNewCodePeriodRowCount(1); } @Test public void update_with_upsert() { - when(uuidFactory.create()).thenReturn("uuid-1"); + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); - db.newCodePeriods().insert(new NewCodePeriodDto() + underTest.insert(dbSession, new NewCodePeriodDto() .setProjectUuid("proj-uuid") .setBranchUuid("branch-uuid") .setType(NewCodePeriodType.NUMBER_OF_DAYS) .setValue("5")); underTest.upsert(dbSession, new NewCodePeriodDto() + .setUuid(NEW_CODE_PERIOD_UUID) .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) - .setProjectUuid("proj-uuid") - .setBranchUuid("branch-uuid") .setValue("analysis-uuid")); - Optional resultOpt = underTest.selectByUuid(dbSession, "uuid-1"); + Optional resultOpt = underTest.selectByUuid(dbSession, NEW_CODE_PERIOD_UUID); assertThat(resultOpt).isNotNull(); assertThat(resultOpt).isNotEmpty(); NewCodePeriodDto result = resultOpt.get(); - assertThat(result.getUuid()).isEqualTo("uuid-1"); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); assertThat(result.getProjectUuid()).isEqualTo("proj-uuid"); assertThat(result.getBranchUuid()).isEqualTo("branch-uuid"); assertThat(result.getType()).isEqualTo(NewCodePeriodType.SPECIFIC_ANALYSIS); assertThat(result.getValue()).isEqualTo("analysis-uuid"); assertThat(result.getCreatedAt()).isNotEqualTo(0); assertThat(result.getUpdatedAt()).isNotEqualTo(0); + + db.commit(); + assertNewCodePeriodRowCount(1); } @Test public void select_by_project_and_branch_uuids() { - when(uuidFactory.create()).thenReturn("uuid-1"); + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); - NewCodePeriodDto dto = db.newCodePeriods().insert(new NewCodePeriodDto() + underTest.insert(dbSession, new NewCodePeriodDto() .setProjectUuid("proj-uuid") .setBranchUuid("branch-uuid") .setType(NewCodePeriodType.NUMBER_OF_DAYS) .setValue("5")); - Optional resultOpt = underTest.selectByBranch(dbSession, dto.getProjectUuid(), dto.getBranchUuid()); + Optional resultOpt = underTest.selectByBranch(dbSession, "proj-uuid", "branch-uuid"); assertThat(resultOpt).isNotNull(); assertThat(resultOpt).isNotEmpty(); NewCodePeriodDto result = resultOpt.get(); - assertThat(result.getUuid()).isEqualTo("1"); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); assertThat(result.getProjectUuid()).isEqualTo("proj-uuid"); assertThat(result.getBranchUuid()).isEqualTo("branch-uuid"); assertThat(result.getType()).isEqualTo(NewCodePeriodType.NUMBER_OF_DAYS); @@ -150,20 +196,20 @@ public class NewCodePeriodDaoTest { @Test public void select_by_project_uuid() { - when(uuidFactory.create()).thenReturn("uuid-1"); + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); - NewCodePeriodDto dto = db.newCodePeriods().insert(new NewCodePeriodDto() + underTest.insert(dbSession, new NewCodePeriodDto() .setProjectUuid("proj-uuid") .setBranchUuid(null) .setType(NewCodePeriodType.NUMBER_OF_DAYS) .setValue("5")); - Optional resultOpt = underTest.selectByProject(dbSession, dto.getProjectUuid()); + Optional resultOpt = underTest.selectByProject(dbSession, "proj-uuid"); assertThat(resultOpt).isNotNull(); assertThat(resultOpt).isNotEmpty(); NewCodePeriodDto result = resultOpt.get(); - assertThat(result.getUuid()).isEqualTo("1"); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); assertThat(result.getProjectUuid()).isEqualTo("proj-uuid"); assertThat(result.getBranchUuid()).isNull(); assertThat(result.getType()).isEqualTo(NewCodePeriodType.NUMBER_OF_DAYS); @@ -174,16 +220,16 @@ public class NewCodePeriodDaoTest { @Test public void select_global() { - when(uuidFactory.create()).thenReturn("uuid-1"); + when(uuidFactory.create()).thenReturn(NEW_CODE_PERIOD_UUID); - db.newCodePeriods().insert(new NewCodePeriodDto() + underTest.insert(dbSession, new NewCodePeriodDto() .setProjectUuid(null) .setBranchUuid(null) .setType(NewCodePeriodType.NUMBER_OF_DAYS) .setValue("30")); NewCodePeriodDto result = underTest.selectGlobal(dbSession); - assertThat(result.getUuid()).isEqualTo("1"); + assertThat(result.getUuid()).isEqualTo(NEW_CODE_PERIOD_UUID); assertThat(result.getProjectUuid()).isNull(); assertThat(result.getBranchUuid()).isNull(); assertThat(result.getType()).isEqualTo(NewCodePeriodType.NUMBER_OF_DAYS); @@ -213,4 +259,8 @@ public class NewCodePeriodDaoTest { underTest.selectByProject(dbSession, null); } + private void assertNewCodePeriodRowCount(int expected) { + assertThat(db.countRowsOfTable("new_code_periods")) + .isEqualTo(expected); + } } diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentDbTester.java index 472ea47c2f3..361ddc70835 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentDbTester.java @@ -25,6 +25,8 @@ import javax.annotation.Nullable; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.newcodeperiod.NewCodePeriodDto; +import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.db.organization.OrganizationDto; import static com.google.common.base.Preconditions.checkArgument; @@ -113,8 +115,8 @@ public class ComponentDbTester { } /** - * @deprecated since 6.6 * @see #insertPublicPortfolio(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ @Deprecated public ComponentDto insertView() { @@ -122,40 +124,40 @@ public class ComponentDbTester { } /** - * @deprecated since 6.6 * @see #insertPublicPortfolio(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ public ComponentDto insertView(Consumer dtoPopulator) { return insertComponentImpl(ComponentTesting.newView(db.getDefaultOrganization()), false, dtoPopulator); } /** - * @deprecated since 6.6 * @see #insertPublicPortfolio(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ public ComponentDto insertView(OrganizationDto organizationDto) { return insertComponentImpl(ComponentTesting.newView(organizationDto), false, noExtraConfiguration()); } /** - * @deprecated since 6.6 * @see #insertPublicPortfolio(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ public ComponentDto insertView(OrganizationDto organizationDto, Consumer dtoPopulator) { return insertComponentImpl(ComponentTesting.newView(organizationDto), false, dtoPopulator); } /** - * @deprecated since 6.6 * @see #insertPublicPortfolio(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ public ComponentDto insertView(String uuid) { return insertComponentImpl(ComponentTesting.newView(db.getDefaultOrganization(), uuid), false, noExtraConfiguration()); } /** - * @deprecated since 6.6 * @see #insertPublicPortfolio(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ public ComponentDto insertView(OrganizationDto organizationDto, String uuid) { return insertComponentImpl(ComponentTesting.newView(organizationDto, uuid), false, noExtraConfiguration()); @@ -182,8 +184,8 @@ public class ComponentDbTester { } /** - * @deprecated since 6.6 * @see #insertPublicApplication(OrganizationDto, Consumer[]) + * @deprecated since 6.6 */ @SafeVarargs public final ComponentDto insertApplication(OrganizationDto organizationDto, Consumer... dtoPopulators) { @@ -304,7 +306,11 @@ public class ComponentDbTester { BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(dbSession, longOrMainBranchOfProject.uuid()) .orElseThrow(() -> new IllegalArgumentException("BranchDto not found for component " + longOrMainBranchOfProject)); checkArgument(branchDto.getBranchType() == LONG, "must be a main or a Long Living branch"); - db.getDbClient().branchDao().updateManualBaseline(dbSession, longOrMainBranchOfProject.uuid(), analysis.getUuid()); + db.getDbClient().newCodePeriodDao().insert(dbSession, new NewCodePeriodDto() + .setProjectUuid(longOrMainBranchOfProject.uuid()) + .setBranchUuid(branchDto.getUuid()) + .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) + .setValue(analysis.getUuid())); db.commit(); } @@ -314,7 +320,7 @@ public class ComponentDbTester { BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(dbSession, longOrMainBranchOfProject.uuid()) .orElseThrow(() -> new IllegalArgumentException("BranchDto not found for component " + longOrMainBranchOfProject)); checkArgument(branchDto.getBranchType() == LONG, "must be a main or a Long Living branch"); - db.getDbClient().branchDao().updateManualBaseline(dbSession, longOrMainBranchOfProject.uuid(), null); + db.getDbClient().newCodePeriodDao().deleteByProjectUuidAndBranchUuid(dbSession, longOrMainBranchOfProject.uuid(), null); db.commit(); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java index 661b425c872..f1940d7c49a 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java @@ -88,11 +88,11 @@ public class DeleteAction implements ProjectAnalysesWsAction { private void checkNotBaseline(DbSession dbSession, SnapshotDto analysis) { dbClient.branchDao().selectByUuid(dbSession, analysis.getComponentUuid()) .ifPresent(branchDto -> { - String manualBaselineAnalysisUuid = branchDto.getManualBaseline(); - if (manualBaselineAnalysisUuid != null) { - checkArgument(!manualBaselineAnalysisUuid.equals(analysis.getUuid()), - "The analysis '%s' can not be deleted because it is set as a manual new code period baseline", analysis.getUuid()); - } + dbClient.newCodePeriodDao().selectByBranch(dbSession, branchDto.getProjectUuid(), branchDto.getUuid()) + .ifPresent(newCodePeriodDto -> + checkArgument(!newCodePeriodDto.getValue().equals(analysis.getUuid()), + "The analysis '%s' can not be deleted because it is set as a manual new code period baseline", analysis.getUuid()) + ); }); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java index 9a5f012f502..13a70ace836 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java @@ -155,7 +155,9 @@ public class SearchAction implements ProjectAnalysesWsAction { private void addManualBaseline(SearchData.Builder data) { dbClient.branchDao().selectByUuid(data.getDbSession(), data.getProject().uuid()) - .ifPresent(branchDto -> data.setManualBaseline(branchDto.getManualBaseline())); + .ifPresent(branchDto -> dbClient.newCodePeriodDao().selectByBranch( + data.getDbSession(), branchDto.getProjectUuid(), branchDto.getUuid()) + .ifPresent(newCodePeriodDto -> data.setManualBaseline(newCodePeriodDto.getValue()))); } private void addAnalyses(SearchData.Builder data) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SetBaselineAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SetBaselineAction.java index 981cf8659f0..db6c6062ada 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SetBaselineAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SetBaselineAction.java @@ -32,6 +32,8 @@ import org.sonar.db.component.BranchDto; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; +import org.sonar.db.newcodeperiod.NewCodePeriodDto; +import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; @@ -67,6 +69,7 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { "
  • 'Administer' rights on the specified project
  • " + "") .setSince("7.7") + .setDeprecatedSince("8.0") .setPost(true) .setHandler(this); @@ -99,7 +102,13 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { ComponentDto projectBranch = getProjectBranch(dbSession, projectKey, branchKey); SnapshotDto analysis = getAnalysis(dbSession, analysisUuid); checkRequest(dbSession, projectBranch, branchKey, analysis); - dbClient.branchDao().updateManualBaseline(dbSession, projectBranch.uuid(), analysis.getUuid()); + + dbClient.newCodePeriodDao().upsert(dbSession, new NewCodePeriodDto() + .setProjectUuid(projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid()) + .setBranchUuid(branchKey != null ? projectBranch.uuid() : null) + .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) + .setValue(analysisUuid) + ); dbSession.commit(); } } @@ -130,11 +139,11 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { boolean analysisMatchesProjectBranch = project != null && projectBranch.uuid().equals(project.uuid()); if (branchKey != null) { - checkArgument (analysisMatchesProjectBranch, + checkArgument(analysisMatchesProjectBranch, "Analysis '%s' does not belong to branch '%s' of project '%s'", analysis.getUuid(), branchKey, projectBranch.getKey()); } else { - checkArgument (analysisMatchesProjectBranch, + checkArgument(analysisMatchesProjectBranch, "Analysis '%s' does not belong to project '%s'", analysis.getUuid(), projectBranch.getKey()); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UnsetBaselineAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UnsetBaselineAction.java index 869f434f2bc..b8af1a56e94 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UnsetBaselineAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UnsetBaselineAction.java @@ -64,6 +64,7 @@ public class UnsetBaselineAction implements ProjectAnalysesWsAction { "") .setSince("7.7") .setPost(true) + .setDeprecatedSince("8.0") .setHandler(this); action.createParam(PARAM_PROJECT) @@ -89,7 +90,9 @@ public class UnsetBaselineAction implements ProjectAnalysesWsAction { ComponentDto projectBranch = getProjectBranch(dbSession, projectKey, branchKey); userSession.checkComponentPermission(UserRole.ADMIN, projectBranch); - dbClient.branchDao().updateManualBaseline(dbSession, projectBranch.uuid(), null); + String projectUuid = projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid(); + String branchUuid = branchKey != null ? projectBranch.uuid() : null; + dbClient.newCodePeriodDao().deleteByProjectUuidAndBranchUuid(dbSession, projectUuid, branchUuid); dbSession.commit(); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/DeleteActionTest.java index 69189ccfe64..e7d4302ed1b 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/DeleteActionTest.java @@ -28,8 +28,11 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; +import org.sonar.db.newcodeperiod.NewCodePeriodDto; +import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; @@ -98,7 +101,13 @@ public class DeleteActionTest { String analysisUuid = RandomStringUtils.randomAlphabetic(12); ComponentDto project = db.components().insertPrivateProject(); SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setUuid(analysisUuid).setLast(false)); - db.getDbClient().branchDao().insert(db.getSession(), newBranchDto(project, LONG).setManualBaseline(analysis.getUuid())); + BranchDto branch = newBranchDto(project, LONG); + db.getDbClient().branchDao().insert(db.getSession(), branch); + db.newCodePeriods().insert(new NewCodePeriodDto() + .setProjectUuid(project.uuid()) + .setBranchUuid(branch.getUuid()) + .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) + .setValue(analysis.getUuid())); db.commit(); logInAsProjectAdministrator(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java index 62b68fcc485..b5d6fbdd104 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java @@ -42,6 +42,7 @@ import org.sonar.core.util.UuidFactoryFast; import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.BranchDao; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; @@ -50,6 +51,8 @@ import org.sonar.db.event.EventComponentChangeDto; import org.sonar.db.event.EventComponentChangeDto.ChangeCategory; import org.sonar.db.event.EventDto; import org.sonar.db.event.EventPurgeData; +import org.sonar.db.newcodeperiod.NewCodePeriodDto; +import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.db.organization.OrganizationDto; import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; @@ -144,8 +147,13 @@ public class SearchActionTest { .setCreatedAt(parseDateTime("2015-11-11T10:00:00+0100").getTime()) .setProjectVersion("1.2") .setBuildString("1.2.0.321")); - db.getDbClient().branchDao().insert(db.getSession(), newBranchDto(project, LONG) - .setManualBaseline(a1.getUuid())); + BranchDto branchDto = newBranchDto(project, LONG); + db.getDbClient().branchDao().insert(db.getSession(), branchDto); + db.newCodePeriods().insert(new NewCodePeriodDto() + .setProjectUuid(project.uuid()) + .setBranchUuid(branchDto.getUuid()) + .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) + .setValue(a1.getUuid())); db.commit(); db.events().insertEvent(newEvent(a1).setUuid("E11") .setName("Quality Gate is Red (was Orange)") diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SetBaselineActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SetBaselineActionTest.java index 418d3121172..6af027736a7 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SetBaselineActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/SetBaselineActionTest.java @@ -42,6 +42,7 @@ import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.SnapshotDto; +import org.sonar.db.newcodeperiod.NewCodePeriodDto; import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; @@ -50,6 +51,7 @@ import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.WsActionTester; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.db.newcodeperiod.NewCodePeriodType.SPECIFIC_ANALYSIS; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_ANALYSIS; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_BRANCH; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_PROJECT; @@ -74,7 +76,7 @@ public class SetBaselineActionTest { @Test @UseDataProvider("nullOrEmpty") - public void set_baseline_on_main_branch(@Nullable String branchName) { + public void set_baseline_on_project(@Nullable String branchName) { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); BranchDto branch = new BranchDto() .setBranchType(BranchType.LONG) @@ -88,13 +90,14 @@ public class SetBaselineActionTest { call(project.getKey(), branchName, analysis.getUuid()); - BranchDto loaded = dbClient.branchDao().selectByUuid(dbSession, branch.getUuid()).get(); - assertThat(loaded.getManualBaseline()).isEqualTo(analysis.getUuid()); + NewCodePeriodDto loaded = dbClient.newCodePeriodDao().selectByProject(dbSession, project.uuid()).get(); + assertThat(loaded.getValue()).isEqualTo(analysis.getUuid()); + assertThat(loaded.getType()).isEqualTo(SPECIFIC_ANALYSIS); } @DataProvider public static Object[][] nullOrEmpty() { - return new Object[][] { + return new Object[][]{ {null}, {""}, {" "}, @@ -112,8 +115,9 @@ public class SetBaselineActionTest { call(project.getKey(), branch.getKey(), analysis.getUuid()); - BranchDto loaded = dbClient.branchDao().selectByUuid(dbSession, branch.getUuid()).get(); - assertThat(loaded.getManualBaseline()).isEqualTo(analysis.getUuid()); + NewCodePeriodDto loaded = dbClient.newCodePeriodDao().selectByBranch(dbSession, project.uuid(), branch.getUuid()).get(); + assertThat(loaded.getValue()).isEqualTo(analysis.getUuid()); + assertThat(loaded.getType()).isEqualTo(SPECIFIC_ANALYSIS); } @Test @@ -146,7 +150,7 @@ public class SetBaselineActionTest { .put(PARAM_BRANCH, "branch key") .put(PARAM_ANALYSIS, "analysis uuid"); - return new Object[][] { + return new Object[][]{ {builder.put(PARAM_PROJECT, null).map, "The 'project' parameter is missing"}, {builder.put(PARAM_PROJECT, "").map, "The 'project' parameter is missing"}, {builder.put(PARAM_ANALYSIS, null).map, "The 'analysis' parameter is missing"}, @@ -180,7 +184,7 @@ public class SetBaselineActionTest { public static Object[][] nonexistentParamsAndFailureMessage() { MapBuilder builder = new MapBuilder(); - return new Object[][] { + return new Object[][]{ {builder.put(PARAM_PROJECT, "nonexistent").map, "Component 'nonexistent' on branch .* not found"}, {builder.put(PARAM_BRANCH, "nonexistent").map, "Component .* on branch 'nonexistent' not found"}, {builder.put(PARAM_ANALYSIS, "nonexistent").map, "Analysis 'nonexistent' is not found"}, -- 2.39.5