From 9bc77e5b117af186e37aff6e22a0ed6da96d5ae5 Mon Sep 17 00:00:00 2001 From: Benjamin Campomenosi Date: Tue, 30 May 2023 12:07:04 +0200 Subject: SONAR-19407 Fix ComponentUuidFactory to load uuid for portfolio from `portfolio` table --- .../component/ComponentUuidFactoryImplIT.java | 26 ++++++++++++++++++++++ .../component/ComponentUuidFactoryImpl.java | 14 ++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) (limited to 'server/sonar-ce-task-projectanalysis') diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImplIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImplIT.java index 6b3ee0a9d70..6da6104b038 100644 --- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImplIT.java +++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImplIT.java @@ -26,6 +26,8 @@ import org.sonar.ce.task.projectanalysis.analysis.Branch; import org.sonar.db.DbTester; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.ComponentTesting; +import org.sonar.db.portfolio.PortfolioDto; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -84,4 +86,28 @@ public class ComponentUuidFactoryImplIT { // uuid is kept in memory for further calls with same key assertThat(underTest.getOrCreateForKey("foo")).isEqualTo(generatedKey); } + + @Test + public void getOrCreateForKey_whenExistingComponentsInDbForPortfolioAndSubPortfolio_shouldLoadUuidsFromComponentTable() { + ComponentDto portfolioDto = db.components().insertPublicPortfolio("pft1", p -> p.setKey("root_portfolio")); + ComponentDto subView = db.components().insertSubView(portfolioDto, s -> s.setKey("sub_portfolio").setUuid("subPtf1")); + ComponentUuidFactory underTest = new ComponentUuidFactoryImpl(db.getDbClient(), db.getSession(), portfolioDto.getKey(), mockedBranch); + + assertThat(underTest.getOrCreateForKey("root_portfolio")).isEqualTo(portfolioDto.uuid()); + assertThat(underTest.getOrCreateForKey("sub_portfolio")).isEqualTo(subView.uuid()); + } + + @Test + public void getOrCreateForKey_whenNoExistingComponentsInDbForPortfolioAndSubPortfolio_shouldLoadUuidFromPortfolioTable() { + PortfolioDto portfolioDto = ComponentTesting.newPortfolioDto("uuid_ptf1", "ptf1", "Portfolio1", null); + db.getDbClient().portfolioDao().insert(db.getSession(), portfolioDto); + PortfolioDto subPortfolio = ComponentTesting.newPortfolioDto("subPtf1", "sub_ptf_1", "portfolio", portfolioDto); + db.getDbClient().portfolioDao().insert(db.getSession(), subPortfolio); + + ComponentUuidFactory underTest = new ComponentUuidFactoryImpl(db.getDbClient(), db.getSession(), portfolioDto.getKey()); + + assertThat(underTest.getOrCreateForKey("ptf1")).isEqualTo(portfolioDto.getUuid()); + assertThat(underTest.getOrCreateForKey("sub_ptf_1")).isEqualTo(subPortfolio.getUuid()); + } + } diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImpl.java index 9d3e6352744..c2bef0e1f0f 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImpl.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ComponentUuidFactoryImpl.java @@ -32,9 +32,19 @@ import org.sonar.db.component.KeyWithUuidDto; public class ComponentUuidFactoryImpl implements ComponentUuidFactory { private final Map uuidsByKey = new HashMap<>(); + /** For the sake of consistency it is important that sub-portfolios have the same uuid as the associated component. + * As sub-portfolio have no component associated with their creation, it is necessary to look search for their uuid. + * see SONAR-19407 for more info + * + * @param dbClient + * @param dbSession + * @param rootKey + */ public ComponentUuidFactoryImpl(DbClient dbClient, DbSession dbSession, String rootKey) { - List keys = dbClient.componentDao().selectUuidsByKeyFromProjectKey(dbSession, rootKey); - keys.forEach(dto -> uuidsByKey.put(dto.key(), dto.uuid())); + List projectKeys = dbClient.componentDao().selectUuidsByKeyFromProjectKey(dbSession, rootKey); + List portFolioKeys = dbClient.portfolioDao().selectUuidsByKey(dbSession, rootKey); + projectKeys.forEach(dto -> uuidsByKey.put(dto.key(), dto.uuid())); + portFolioKeys.forEach(dto -> uuidsByKey.putIfAbsent(dto.key(), dto.uuid())); } public ComponentUuidFactoryImpl(DbClient dbClient, DbSession dbSession, String rootKey, Branch branch) { -- cgit v1.2.3