From: Julien HENRY Date: Thu, 26 Jul 2018 16:48:53 +0000 (+0200) Subject: SONAR-11037 Return linked projects in list_repositories for BBC X-Git-Tag: 7.5~628 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3b558f1c533095c82a773e3ead84c18d99ce5200;p=sonarqube.git SONAR-11037 Return linked projects in list_repositories for BBC --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java index e6faa27aff4..74a37144ac9 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java @@ -31,6 +31,7 @@ import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.session.TransactionIsolationLevel; import org.sonar.api.Startable; import org.sonar.db.alm.AlmAppInstallMapper; +import org.sonar.db.alm.AlmProjectMappingDto; import org.sonar.db.alm.AlmProjectMappingsMapper; import org.sonar.db.ce.CeActivityMapper; import org.sonar.db.ce.CeQueueMapper; @@ -151,6 +152,7 @@ public class MyBatis implements Startable { // DTO aliases, keep them sorted alphabetically confBuilder.loadAlias("ActiveRule", ActiveRuleDto.class); confBuilder.loadAlias("ActiveRuleParam", ActiveRuleParamDto.class); + confBuilder.loadAlias("AlmProjectMapping", AlmProjectMappingDto.class); confBuilder.loadAlias("CeTaskCharacteristic", CeTaskCharacteristicDto.class); confBuilder.loadAlias("Component", ComponentDto.class); confBuilder.loadAlias("ComponentWithSnapshot", ComponentDtoWithSnapshotId.class); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingDto.java new file mode 100644 index 00000000000..7c2fcf46798 --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingDto.java @@ -0,0 +1,83 @@ +/* + * SonarQube + * Copyright (C) 2009-2018 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.alm; + +public class AlmProjectMappingDto { + private String uuid; + private String almId; + private String repoId; + private String projectUuid; + private String githubSlug; + private String url; + + public String getAlmId() { + return almId; + } + + public AlmProjectMappingDto setAlmId(String almId) { + this.almId = almId; + return this; + } + + public String getRepoId() { + return repoId; + } + + public AlmProjectMappingDto setRepoId(String repoId) { + this.repoId = repoId; + return this; + } + + public String getProjectUuid() { + return projectUuid; + } + + public AlmProjectMappingDto setProjectUuid(String projectUuid) { + this.projectUuid = projectUuid; + return this; + } + + public String getGithubSlug() { + return githubSlug; + } + + public AlmProjectMappingDto setGithubSlug(String githubSlug) { + this.githubSlug = githubSlug; + return this; + } + + public String getUrl() { + return url; + } + + public AlmProjectMappingDto setUrl(String url) { + this.url = url; + return this; + } + + public String getUuid() { + return uuid; + } + + public AlmProjectMappingDto setUuid(String uuid) { + this.uuid = uuid; + return this; + } +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsDao.java index 992e8f1f2bf..6e7a3b2639c 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsDao.java @@ -19,6 +19,8 @@ */ package org.sonar.db.alm; +import java.util.Collection; +import java.util.List; import java.util.Objects; import javax.annotation.Nullable; import org.sonar.api.utils.System2; @@ -28,6 +30,7 @@ import org.sonar.db.DbSession; import static com.google.common.base.Preconditions.checkArgument; import static org.apache.commons.lang.StringUtils.isNotEmpty; +import static org.sonar.db.DatabaseUtils.executeLargeInputs; public class AlmProjectMappingsDao implements Dao { @@ -60,6 +63,15 @@ public class AlmProjectMappingsDao implements Dao { return getMapper(dbSession).mappingCount(alm.getId(), repoId) == 1; } + /** + * Gets a list or mappings by their repo_id. The result does NOT contain {@code null} values for mappings not found, so + * the size of result may be less than the number of ids. + *

Results may be in a different order as input ids.

+ */ + public List selectByRepoIds(final DbSession session, ALM alm, Collection repoIds) { + return executeLargeInputs(repoIds, partionnedIds -> getMapper(session).selectByRepoIds(alm.getId(), partionnedIds)); + } + private static void checkAlm(@Nullable ALM alm) { Objects.requireNonNull(alm, "alm can't be null"); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsMapper.java index 250f588ddae..5baeafc91e2 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsMapper.java @@ -19,6 +19,7 @@ */ package org.sonar.db.alm; +import java.util.List; import javax.annotation.Nullable; import org.apache.ibatis.annotations.Param; @@ -31,4 +32,6 @@ public interface AlmProjectMappingsMapper { int update(@Param("almId") String almId, @Param("repoId") String repoId, @Param("projectUuid") String projectUuid, @Nullable @Param("githubSlug") String githubSlug, @Param("url") String url, @Param("now") long now); + + List selectByRepoIds(@Param("almId") String almId, @Param("repoIds") List repoIds); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/AlmProjectMappingsMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/AlmProjectMappingsMapper.xml index 0f6be2489e6..6797a87ec56 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/AlmProjectMappingsMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/AlmProjectMappingsMapper.xml @@ -48,4 +48,21 @@ and repo_id = #{repoId, jdbcType=VARCHAR} + + diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/AlmProjectMappingsDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/AlmProjectMappingsDaoTest.java index 12c4616e662..e8fba5bc38a 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/AlmProjectMappingsDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/AlmProjectMappingsDaoTest.java @@ -19,6 +19,7 @@ */ package org.sonar.db.alm; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; @@ -33,8 +34,10 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.sonar.db.alm.ALM.BITBUCKETCLOUD; import static org.sonar.db.alm.ALM.GITHUB; public class AlmProjectMappingsDaoTest { @@ -204,6 +207,24 @@ public class AlmProjectMappingsDaoTest { assertThat(underTest.mappingExists(dbSession, GITHUB, A_REPO)).isTrue(); } + @Test + public void select_by_repo_ids() { + when(system2.now()).thenReturn(DATE); + when(uuidFactory.create()) + .thenReturn("uuid1") + .thenReturn("uuid2") + .thenReturn("uuid3"); + underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL); + underTest.insertOrUpdate(dbSession, GITHUB, ANOTHER_REPO, ANOTHER_UUID, null, ANOTHER_URL); + underTest.insertOrUpdate(dbSession, BITBUCKETCLOUD, ANOTHER_REPO, "foo", null, "http://foo"); + + assertThat(underTest.selectByRepoIds(dbSession, GITHUB, Arrays.asList(A_REPO, ANOTHER_REPO, "foo"))) + .extracting(AlmProjectMappingDto::getUuid, AlmProjectMappingDto::getAlmId, AlmProjectMappingDto::getRepoId, AlmProjectMappingDto::getProjectUuid, AlmProjectMappingDto::getUrl, AlmProjectMappingDto::getGithubSlug) + .containsExactlyInAnyOrder( + tuple("uuid1", GITHUB.getId(), A_REPO, A_UUID, A_URL, A_GITHUB_SLUG), + tuple("uuid2", GITHUB.getId(), ANOTHER_REPO, ANOTHER_UUID, ANOTHER_URL, null)); + } + private void expectAlmNPE() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("alm can't be null");